76

to nie blad ale jak skompilowac takie cos:

org $2000
jmp *
opt h-
org $00,*
jmp *
opt h+

aby dostac prawidlowo zbudowany plik

chodzi o to, ze naglowek powinien obejmowac takze teggo drugiego jumpa :/

dostajemy:

FF FF   00 20   02 20   4C 00 20 4C 00 00

a powinno byc:

FF FF   00 20   05 20   4C 00 20 4C 00 00

http://atari.pl/hsc/ad.php?i=1.

77

Proponuję napisać prawidłowy kod źródłowy ;)

78

super, wlasnie to chce zrobic, mozesz mi pokazac jak napisac taki kod?

chce miec wewnatrz kodu kilka rozkazow skompilowanych tak jakby byly umieszczone w innym obszarze pamieci

http://atari.pl/hsc/ad.php?i=1.

79

Ewidentnie problemy powoduje opt h-. Dlaczego on jest konieczny? org $00,* działa sam z siebie. Już takie rzeczy robiłem i nie miałem tych problemów.

80

"bez" wynikowy bedzie taki:

FF FF   00 20   02 20   4C 00 20   03 20   05 20   4C 00 00

nie jestem przekonany czy sie rozumiemy...

http://atari.pl/hsc/ad.php?i=1.

81

A no tak. Ten przypadek to nie jest błąd, ale można chyba z czystym sumieniem stwierdzić, że niedociągnięcie madsa, bo generuje dwa bloki, które mógłby połączyć, ale nie łączy bo org jest "dziwny". Ja nawet tego nie zauważyłem, bo wynik madsa i tak wpada do mojego programu, w którym sobie go obrabiam jak chcę. Nie ma żadnych gotowców, które potrafią optymalizować takie rzeczy? xebin tego nie robi? Jak nie to napisanie tego to 15 minut roboty.

82

pewnie tak... ale jakby sie dalo pominac dodatkowe narzedzia...

http://atari.pl/hsc/ad.php?i=1.

83

mam dziwne wrazenie... ze to kiedys dzialalo...

przypominam sobie projekt w ktorym trzeba bylo wymusic tworzenie naglowkow i problemem bylo ze mads omijal:

org *

a tu prosze... tworzy...

Tebe cos pokombinowal albo mi sie przysnilo.

http://atari.pl/hsc/ad.php?i=1.

84

dobrze pamietalem :-)  wersja mads 1.9.6 potrafi:

org $2000
jmp *
org *  ----------- opusci naglowek
jmp *

ale juz nie potrafi
org $2000
jmp *
org $00,*   ----- wygeneruje
jmp *

Tebe... plizzzz

http://atari.pl/hsc/ad.php?i=1.

85 Ostatnio edytowany przez tebe (2022-01-21 22:08:32)

w pierwszym przykładzie ORG jest ten sam co aktualny wskaźnik programu, więc ORG i nowy nagłówek jest nadmiarowy

ale drugi przykład nie rozumiem dlaczego miałby opuszczać ORG-a i nie generować nagłówka

aha, 'org adres,*', czyli kod jest generowany dla innego adresu ale pod aktualnym wskaźnikiem programu

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

86

tebe napisał/a:

aha, 'org adres,*', czyli kod jest generowany dla innego adresu ale pod aktualnym wskaźnikiem programu


bump


:)

http://atari.pl/hsc/ad.php?i=1.

87 Ostatnio edytowany przez tebe (2022-01-23 00:30:32)

próbowałem to poprawić, jednak po poprawce główny nagłówek wskazuje błędnie koniec bloku

sugeruję użyć XASM, 'org r:adres'  to ekwiwalent dla 'org adres,*'

albo nie używać ORG-a, tylko .LOCAL wtedy MADS nie będzie generował dodatkowego bloku

 org $2000
 
 nop

.local nowy,$4000
 nop
.endl

 nop
     1                  org $2000
     2
     3 FFFF> 2000-2002> EA     nop
     4
     5 4000            .local nowy,$4000
     6 4000 EA             nop
     7                 .endl
     8
     9 2002 EA             nop
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

88

dzieki!. sztuczka z .LOCAL name,adr zalatwia sprawe :-)

http://atari.pl/hsc/ad.php?i=1.

89

Potrzebuję przedefiniować sobie zmienną.

    opt o+ h- c- ?+

MEM_BASE = 0
MEM_OSLO = 1
MEM_OSHI = 2
MEM_EXT = 3

    org $2000

.local
MEM = MEM_OSLO
    .byte MEM
.endl

.local
MEM = MEM_OSHI
    .byte MEM
.endl

.local
MEM = MEM_EXT
    .byte MEM
.endl

.local
MEM = MEM_BASE
    .byte MEM
.endl

    end

Jak to zrobić bo to generuje mi błędy:

$ mads label.asx 
label.asx (13) WARNING: Infinite loop by label MEM
MEM = MEM_OSHI
label.asx (18) ERROR: Label MEM declared twice (BANK=0)
MEM = MEM_EXT
label.asx (23) ERROR: Label MEM declared twice (BANK=0)
MEM = MEM_BASE
label.asx (28) ERROR: Label MEM declared twice (BANK=0)
hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

90 Ostatnio edytowany przez tebe (2022-06-03 16:53:29)

SET
https://mads.atari8.info/pl/skladnia/#label-set-value

albo etykieta tymczasowa, czyli taka która zaczyna się znakiem '?'
https://mads.atari8.info/pl/skladnia/#tymczasowe

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

91

O to chodziło! Dzięki!

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

92 Ostatnio edytowany przez Pecus (2022-11-14 10:58:26)

Zacytuję Pirxa z AOLu:

ciekawy problemik z opcją OPT r+

kod:

  mva #4 ResultY
@
  mwa #lineClear LineAddress4x4
  jsr _sep_opty
  dec di
  bne @-

to zostaje skompilowane do

  lda #4
  sta ResultY
@
  sta LineAddress4x4
...

co by prawie działało, gdyby nie to, że pętla skacze do `sta`.
Chyba optymalizacja nie powinna działać na skraju etykiet...

Wyszło nam przy próbie rozwikłania jednego z dziwnych bugów w Scorchu (już poprawiony).

Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.

93

Jeśli podprogram nie zmienia Akumulatora, to kod będzie prawidłowy ;) Nigdy nie używałem "r+".

94

Trudno mi uwierzyć, że nikt nie zetknął się poniższym problemem, ale próba asemblacji:

    opt l+

w    =   31

    org $0600
    .byte -w-1 -w -w+1
    .byte 256-w-1 256-w 256-w+1
    .by   -w-1 -w -w+1
    .by   256-w-1 256-w 256-w+1
    .byte -w-1
    .byte 256-w-1
    .by   -w-1
    .by   256-w-1
    .byte 1 2 3 4
    .by   1 2 3 4
    .en

wypluwa błędy:

$ mads test.asm 
        .byte 256-w-1 256-w 256-w+1
test.asm (7) ERROR: Undeclared label W256 (BANK=0)
test.asm (7) ERROR: Value out of range (-1031 must be between 0 and 255)
        .byte 1 2 3 4
test.asm (14) ERROR: Value out of range (1234 must be between 0 and 255)
Writing listing file...

Listing:

mads 2.1.5
     1                     opt l+
     2
     3 = 001F            w    =   31
     4
     5                     org $0600
     6 FFFF> 0600-060F> A3        .byte -w-1 -w -w+1
     7 0601 F9                .byte 256-w-1 256-w 256-w+1
     8 0602 C1 C2            .by   -w-1 -w -w+1
     9 0604 E0 E1 E2            .by   256-w-1 256-w 256-w+1
    10 0607 E0                .byte -w-1
    11 0608 E0                .byte 256-w-1
    12 0609 E0                .by   -w-1
    13 060A E0                .by   256-w-1
    14 060B D2                .byte 1 2 3 4
    15 060C 01 02 03 04            .by   1 2 3 4
    16                     .en

Jak zapisać w jednym wierszu przy użyciu dyrektywy ".byte" lub ".by" liczby ujemne i dlaczego ".byte 1 2 3 4" łączy rozdzielone cyfry w jedną liczbę?

Zawsze mam rację, tylko nikt mnie nie słucha.

95

Może przecinkami?

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

96

Przecinki rozwiązują problem. Sprawdziłem to zanim napisałem. W dokumentacji stoi, że można używać spacji lub przecinków. Akurat przecinków nie lubię - łatwiej w spację trafić. Zmiana dokumentacji nie jest rozwiązanie. ;-)

Zawsze mam rację, tylko nikt mnie nie słucha.

97

w którym miejscu tak stoi ?

bo tylko w przypadku .BY jest taka możliwość
https://www.wudsn.com/tmp/projects/mads … ndor-ascii

w przypadku .BYTE jest
https://www.wudsn.com/tmp/projects/mads … long-dword

.BYTE jest odpowiednikiem DTA, a DTA nie ma możliwości nie używania znaku przecinka

ten sam błąd wystąpi jeśli zapiszesz
  dta 1 2 3 4 5

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

98

Dzięki za wyjaśnienie. Konieczność stosowania przecinka w przypadku .BYTE, podczas gdy .BY tego nie wymaga, jest dla mnie brakiem konsekwencji, bez której da się jednak żyć. :-)

Natomiast łączenie w jedną liczbę cyfr rozdzielonych spacją uważam za błąd. Dla przykładu:

    .BYTE 1 2 3, 12 3, 1 23"

powinno generować błąd składni, a nie blok bajtów: $7B $7B $7B.

Drugą rzeczą, którą poruszyłem na początku, jest pierwsza liczba ze znakiem za dyrektywą .BY, która modyfikuje pozostałe wartości. W dokumentacji mowa jest, że poprzedzenie tej liczby znakiem dodawania powoduje zwiększenie pozostałych o wskazana wartość. Rzecz w tym, że umieszczenie minusa powoduje adekwatnie zmniejszenie. W ten sposób, aby wprowadzić liczbę ujemną jak pierwszą trzeba uciekać się do akrobacji w rodzaju "256-b". Dla lepszego zobrazowania ".by -2 1" wygeneruje jeden bajt o wartości -1 ($FF), podczas gdy: ".by 256-2 1 - dwa bajty o wartościach: -2 ($FE), 1.

Proponuję zmodyfikować Madsa tak, aby wartości po dyrektywie .BY były modyfikowane tylko wtedy, gdy przed pierwszą liczbą jest znak plusa. Znak minus powinien określać tylko i wyłącznie znak liczby. Jeżeli zaszłaby potrzeba zmniejszania wartości, można to zrealizować tak, jak robi to MAE: ".BY +-n".

Zawsze mam rację, tylko nikt mnie nie słucha.

99

Skompilowałem "Mad Assembler 2.1.5 Latest" pod MacoOS i mam taką dziwną rzecz, której nie było w poprzedniej wersji.
Na zwykłe polecenie "mads" odpowiadał jaka wersja itp. Teraz wydawało mi się, że jest pusto. Ale jak zaznaczyłem całe okno do skopiowania to okazało się, że coś tam wyświetla, ale jest to CZARNE. A że mam czarne tło terminala to guzik widać.

Da się jakoś wyłączyć to kolorowanie tekstu, albo żeby MADS wiedział, żeby nie pisać czarnym fontem jak tło jest czarne?

100

wszystko jest czarne? przynajmniej jeden wiersz powinien być w kolorze białym

procedure Syntax;
(*----------------------------------------------------------------------------*)
(*  wyswietlamy informacje na temat przelacznikow, konfiguracji MADS'a        *)
(*----------------------------------------------------------------------------*)
var s: string;
begin
TextColor(WHITE);
Writeln(Tab2Space(load_mes(mads_version)));

TextColor(DARKGRAY);
Writeln(Tab2Space(load_mes(mads_version-2)));
NormVideo;

halt(3);
end;

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C