Moi mili,
Natknąłem się na problem, który nieco przyhamował moją pracę przy pewnym ciekawym projekcie. Liczę na to, że problem wynika wyłącznie z mojej głupoty i łatwo uda się go kolektywnie rozwiązać :)
Mam taki kod:
...
NUM_OBJS set 2
BEGIN_ZP
SCBs_vec dw SCBs
END_ZP
BEGIN_MEM
ALIGN 4
screen0 ds SCREEN.LEN
irq_vec ds 16
SCBs ds 16*NUM_OBJS
END_MEM
...
copy_SCB:: phx
phy
ldx #NUM_OBJS
.cs1 beq .cs2
ldy #16
.cs3 dey
lda obj1_SCB,y
sta SCBs,y
cpy #0
bne .cs3
lda #19
jsr ptr_shift
dex
bra .cs1
.cs2 ply
plx
rts
ptr_shift:: phx
phy
pha
plx
.ps1 beq .ps3
ldy #5
lda SCBs,y
clc
adc #22
sta SCBs,y
bcc .ps2
iny
lda SCBs,y
inc
sta SCBs,y
.ps2 dex
bra .ps1
.ps3 ply
plx
rts
...
obj1_SCB dc.b $04, $90, $01
dc.w 0
obj1_ptr dc.w char_data
obj1_X dc.w 70
obj1_Y dc.w 70
dc.w $100
dc.w $100
dc.b $0a
...
Procedura copy_SCB ma docelowo kopiować dane z obj1_SCB w obszar SCBs NUM_OBJS razy, a ptr_shift modyfikować dwa bajty w każdej takiej kopii. W takiej postaci oczywiście procedura jest bezużyteczna, bo kopiuje, ale za każdym razem w to samo miejsce, nie zwiększając wskaźnika. Po to dodałem wektor SCBs_vec na stronie zerowej i próbowałem adresowania pośredniego, czyli (SCBs_vec),y zamiast SCBs,y. No i tu jest problem, bo próba zmiany adresowania (bez ruszania pozostałego kodu) wysypuje program.
Co może być nie tak? Wydawało mi się, że jeżeli SCBs_vec zawiera adres SCBs, to wywołanie (SCBs_vec),y powinno odpowiadać dokładnie SCBs,y. Mylę się? :)