Coś, co wygląda na błąd w madsie. Program przykładowy:
;
LINES = 20
org $80
dupa .ds 2
blk reloc main
start lda #<(LINES-1)*40
sta dupa
lda #>(LINES-1)*40
sta dupa+1
rts
Program powinien obliczyć wartość (LINES-1)*40 = 19*40 = 760, oraz umieścić ją jako młodszy i starszy bajt pod adresem "dupa" i "dupa+1".
Przy próbie asemblacji wyskakuje komunikat:
start lda #<(LINES-1)*40
dupa.s (10) ERROR: Value out of range
Tymczasem Value nie jest out of range, bo operatory '<' i '>' są (albo: powinny być) brane pod uwagę jako ostatnie. Powinno mu zatem wyjść $F8 z pierwszego wyrażenia i $02 z drugiego (mł. i starszy bajt wartości $02F8 = 760).
Ale to nie koniec.
Powyższy program poprawiamy tak, żeby się kompilował, tzn. w linii, gdzie wyskakuje błąd, dodajemy nawiasy:
;
LINES = 20
org $80
dupa .ds 2
blk reloc main
start lda #<((LINES-1)*40)
sta dupa
lda #>(LINES-1)*40
sta dupa+1
rts
Błąd nie wyskakuje, co dziwne, bo powinien się pojawić dokładnie taki sam dwie linijki niżej. Listing:
mads 1.9.4
1 ;
2 = 0014 LINES = 20
3
4 org $80
5
6 = 0080 dupa .ds 2
7
8 0082 FE FF 01 00 blk reloc main
9
10 0000,0009> A9 F8 start lda #<((LINES-1)*40)
11 0002 85 80 sta dupa
12 0004 A9 00 lda #>(LINES-1)*40
13 0006 85 81 sta dupa+1
14 0008 60 rts
Pierwsza linijka skompilowała się dobrze, jest LDA #$F8. Co do drugiej, co prawda komunikatu o błędzie nie ma, ale kod jest zły, bo zamiast LDA #$02 w kodzie wynikowym jest LDA #$00.
KMK
? HEX$(6670358)