1

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ę? :)

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

2 Ostatnio edytowany przez Bober (2012-08-22 19:10:18)

1. nie widzę, gdzie inicjujesz wektor SCBs_vec. potrzebujesz coś takiego: lda <SCBs ; sta SCBs_vec ; lda >SCBs ; sta SCBs_vec+1
2. mały hint - okolice .cs3 - lepiej coś takiego: ldy #$15 ; lda .. ; sta .. ; dey ; bpl .cs3
3. mały hint2 - ciupinke szybsze będzie zapamiętywanie rejestrów na stronie zerowej zamiast na stosie - czyli stx ; sty zamiast phx ; phy
4. takie pytanie kontrolne (na wszelki wypadek) - na jaki procesor piszesz?

[edit] widzę, że masz coś takiego "SCBs_vec    dw SCBs" i być może to inicjuje wektor (nie znam tego asma) - ale sprawdź pod monitorem, czy aby na pewno tam jest poprawna wartość.

3 Ostatnio edytowany przez syscall (2012-08-22 19:39:14)

[edit: doh]

"Was powinny uzbrojone służby wyciągać z domów do punktów szczepień, a potem zamykać do pi* za rozpowszechnianie zagrożenia epidemicznego" - Epi 2021
"Powinno się pałować tylko tych co tego nie rozumieją. No i nie szmatki i nie chirurgiczne tylko min FFP3, to by miało jakiś sens. U mnie we firmie, to jak przychodzi bezmaskowiec, to stoi w deszczu przed firmą" - Pin 2021

4

Dzięki za odpowiedź :)
ad 1. Tak, SCBs_vec jest inicjowane adresem SCBs ("dw" oznacza po prostu słowo). Chętnie sprawdziłbym to monitorem, ale problem w tym, że żaden z emulatorów Lynxa nie ma niestety takowego (mednafen ma debugger, ale nie dla Lynxa).
ad 2. i 3. Dzięki. Optymalizacja to będzie następny etap, jak już wszystko będzie działać prawidłowo - a do tego daleka droga (na razie napisałem może z 10% kodu).
ad 4. :D 65C02

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

5

Problem rozwiązany. Jak przypuszczałem, zawinił czynnik ludzki. Definiowałem explicite wartość wektora (teraz już wiem, że tak się nie robi), a potem w jednym miejscu programu czyściłem stronę zerową :D
Jedna uwaga: zamiast lda <SCBs powinno być oczywiście lda #<SCBs.
Dzięki, Bober!

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

6

a nie lepiej samomodyfikujacy sie kod, tj. zamiast zamiast modyfikowac wektor na zp, modyfikowac argumenty dla lda? tracisz 2 cykle na ustawienie wektora (w argumencie), ale po cykl szybciej na petle...

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

7

kod sie zmieniajacy powinien byc w ramie. tutaj sie domyslam, ze chodzi o lynxa, a wiec i odpalanie z carta...

8

moze to ramcart, albo przepisuje sie do ramu? ;)
w koncu lynx ma 64k ramu. czesc rzeczy majacych szybko dzialac mozna pewnie przerzucic do ramu ;)

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

9

Problem w tym, że ten wektor jest wykorzystywany w kilku różnych procedurach, bo każda kopia SCB musi być w kilku miejscach zmodyfikowana. W takim wypadku modyfikowanie argumentów dla lda przestaje się opłacać (chociaż, nie powiem, ciekawy pomysł - przypominają się Wojny Rdzeniowe :) ).

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

10

jesli mozesz do ramu przepisac procke - warto o tym pomyslec, o ile wykonuje sie dosc czesto/ma wiele obrotow.
tj. nie wszedzie musisz ten trik stosowac, ale wystarczy raz modyfikowac zp, a dodatkowo jeden (jesli np. wystarczy podac inny adres strony, a przepisujesz cos od jej poczatku) lub 2 bajty modyfikowac w tej przepisanej procce.

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep