Czy to jest wykonalne?
Bo spotkalem sie z roznymi opiniami. Chodzi mi o to czy HPOSP0 (pozycja pozioma Player0 - $D000) jest odczytywany przez GTIA raz na linie (przy DLI) czy czesciej? A moze to jest cien a jest jakis rejestr sprzetowy odczytywany na biezaco, jak w przypadku rejestrow odpowiedzialnych za kolory ducha?
Zrobilem eksperyment. Duch ma postac dwoch "buziek" - jednej pod drugą.
Napisalem w Atalanie najprostszą mozliwą petle zmieniająca pozycje ducha z 90 na 100 i odwrotnie tak czesto jak sie da.
W asemblerze, po lekkich recznych korektach kod wyglada tak:
pozycja equ 130
player__x equ 53248
_lbl7:
;### int.atl(97) if pozycja = 100 then pozycja = 50
lda #100
cmp pozycja
jne _lbl5
lda #50
sta pozycja
;### int.atl(98) else pozycja = 90
jmp _lbl6
_lbl5:
lda #90
sta pozycja
_lbl6:
;### int.atl(99) player(0).x = pozycja
sta player__x
_lbl3:
jmp _lbl7
Zalaczam XEX i screen.
Sprawdzalem pod emulatorem robiac "stopklatke" i ani razu nie zaobserwowalem zeby ktorakolwiek z linii ducha byla narysowana podwojnie w pozycji 90 i 100 jednoczesnie.
Wynikaloby z tego ze multiplikacja przez zmiane rejestru HPOSP0 nie jest mozliwa.
Kod jest na tyle krotki ze moim zdaniem powinien wykonac sie z powodzeniem kilka razy w ciagu jednej linii (byc moze zreszta tak sie dzieje i dlatego przeplot nie jest dokladny tylko nieraz rysuja sie dwie kolejne linie w jednej pozycji bo pozycja zmienia sie z 90 na 100 i znow na 90 zanim rejestr zostanie odczytany).
Dziwi mnie troche zachowanie emulatora Atari (Atari800Win 4.0 beta 7). Odpalcie i poczekajcie okolo 10 sekund - mruganie duszkow nagle zwalnia do jednego przeskoku co pare sekund. O_o Ale to chyba jakis blad emulatora po prostu...