1 Ostatnio edytowany przez nosty (2011-01-30 21:02:43)

Probuję zrobic rzecz banalną: zmienic kolory na DLI. I mam problemy.

Pytanie:
kiedy DOKLADNIE zaczyna sie przerwanie DLI w trybie znakowym Antic 4 i ile taktow trwa od zakonczenia rysowania linii (sta WSYNC) do momentu powrotu plamki elektronowej (rozpoczęcia rysowania kolejnej).

Otóż zaprojektowalem sobie wszystko w G2F i potem chcialem recznie przeniesc zmiany kolorow do mojego programu.
Mam 24 linie tekstowe Antic 4. W kazdej zezwolone przerwanie.
Spodziewalem sie ze przerwanie wywolywane jest w czasie rysowania ostatniej linii pixelowej w danej linii tekstowej.
Czyli (jesli linie pixelowe numerujemy od 0), przerwanie bedzie wywolane przed zakonczeniem rysowania linii: 7, 15, 23, 31...

Ale z eksperymetow wychodzi mi ze kolory zmieniają sie dopiero w czasie rysowania kolejnej linii (8, 16, 24...) a czasami nie zdążą sie zmienic nawet do rozpoczecia rysowania jeszcze kolejnej!

Podejrzalem w pliku ASM generowanym przez G2F jak on to robi. Bardzo oszczednie.

Ale ja bede zmienial kolory bardziej dynamicznie, zaleznie od rozwoju akcji w grze, wiec potrzebuje bardziej uniwersalną metode zmiany kolorow.

Zbudowalem sobie tabele 24x8 bajtow. Z kazdych 8 bajtow pierwszych 5 wykorzystuje na wpisanie jakie kolory mają byc ustawione w przerwaniu danej linii znakowej. 3 kolejne bajty są niewykorzystane.

kolory_dli
       dta $98,$FE,$FC,$0E,$0C,$0,$0,$0 ;kolory ktore maja byc ustawione po 0 linii znakowej (od 8 pixelowej)
       dta $98,$22,$26,$1C,$00,$0,$0,$0 ;po 1
       dta $98,$22,$26,$1C,$00,$0,$0,$0 ;po 2
       ...

W zmiennej linia_dli przechowuję aktualny nr linii znakowej od 0 do 23 (zeby wiedziec w przerwaniu ktorej linii jestem). Zeruje ją w VBLI.

Przerwanie DLI ma u mnie taką postać, wydawalo mi sie, ze schludną i optymalną ;) Czy to mozliwe ze sie nie wyrabia?
Jesli tak, to zalamka :/ To tylko zmiana kolorow, a chcialem jeszcze zmieniac pozycje X duszkow...

;przerwanie DLI
set_col
   pha
   tya
   pha
   ;wait__line
   sta WSYNC    ;zapis czegokolwiek

   lda linia_dli
   asl @
   asl @
   asl @      ;teraz mamy w A numer linii pomnozony x8

   tay
   lda kolory_dli,y
   sta COLBAK
   iny
   lda kolory_dli,y
   sta COLPF0
   iny
   lda kolory_dli,y
   sta COLPF1
   iny
   lda kolory_dli,y
   sta COLPF2
   iny
   lda kolory_dli,y
   sta COLPF3

   inc linia_dli

   pla
   tay
   pla
   rti

2 Ostatnio edytowany przez tebe (2011-01-30 21:19:20)

ręce opadają jak widzi się taki "optymalny" kod dla DLI, widziałeś kod G2F i nie zastanowiło Cię czemu nie ma tam pla, pha, czemu są rozkazy ładowania LDA# a nie LDA ....,y

nawet kolejność rozkazów ma znaczenie, aby zmieścić się w czasie

maks dla wąskiego ekranu jesteś w stanie zmieścić 6 zmian które będą bezpośrednio widoczne na całej szerokości ekranu (zmiany rastrowe będą niekompletne, więc o takich nie piszę) pod warunkiem że będzie to kod, typu:

col0 lda #0
col1 ldx #0
col2 ldy #0
     sta wsync
reg0 sta $d01e
reg1 stx $d01e
reg2 sty $d01e

col3 lda #0
col4 ldx #0
col5 ldy #0
     sta wsync
reg3 sta $d01e
reg4 stx $d01e
reg5 sty $d01e

teraz pozostaje Ci modyfikacja etykiet col0+1, reg0+1 itd.

zamiast pha, pla, stosuje się zapisywanie wartości rejestrów na stronie zerowej, bo jest najszybciej

POCZYTAJ NOSTY ATARIKI, BO JEST TAM WIELE NA TEMAT OPTYMALIZACJI DLI

NAJPIERW CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ

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

3

tebe napisał/a:

ręce opadają jak widzi się taki "optymalny" kod dla DLI, widziałeś kod G2F i nie zastanowiło Cię czemu nie ma tam pla, pha, czemu są rozkazy ładowania LDA# a nie LDA ....,y

POCZYTAJ NOSTY ATARIKI, BO JEST TAM WIELE NA TEMAT OPTYMALIZACJI DLI

NAJPIERW CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ, CZYTAJ

Dzieki Tebe, ale oczywiscie ze najpierw szukalem. Nie pisze na forum od ręki kazdego pytania, ktore przyjdzie mi do glowy!
W Atariki znalazlem tyle :P
http://atariki.krap.pl/index.php/DLI

Wlasnie nigdzie nie moglem znalezc kluczowej informacji: ile taktow mam do dyspozycji.
Dlatego zapytalem na forum.

I jak pisalem, podejrzalem jak to robi G2F w ASM, ale powodow ze kod jest taki a nie inny mogla byc cala masa, z Twoją fantazja na czele ;) Poza tym to jest kod generowany automatycznie. Nie zawsze rozsądnie jest uczyc sie na takim.

Nie przypuszczalem po prostu, ze trzeba AZ TAK oszczedzac czas w DLI.

Tebe ja wiem, ze Tobie trudno jest zrozumiec, ze ktos moze nie znac takich podstaw, ale nie krzycz na mnie. Czytam gdzie sie da, ale diabel tkwi zwykle w szczegolach, ktore ciezko znalezc w ksiazkach.

4

tak, trzeba uwazac. Nosty raczej bedziesz musial wprowadzic powazne uproszczenia.

rejestry mozesz przechowywac tez tak: (szybkosc taka sama jak przy zachowaniu rej. na stronie zero)

sta _a+1
stx _x+1
sty _y+1
...
_a lda #$ff
_x ldx #$ff
_y ldy #$ff

i w oderwaniu:

lda kolory_dli,y
sta COLBAK
iny
lda kolory_dli,y
sta COLPF0

zauwaz, ze taki sam efekt dostaniesz nie zmieniajac rejestru indeksowego

lda kolory_dli,y
sta COLBAK
lda kolory_dli+1,y
sta COLPF0

i jeszcze jedna wazna informacja, wszystkie operacje jak np to:
lda linia_dli
asl @
asl @
asl @      ;teraz mamy w A numer linii pomnozony x8
tay
wykonuj PO zmianie rejestrow np.

_aaa ldy #$00
....

lda _aaa+1
clc
adc #$08
sta _aaa+1

oczywiscie to jest tak na marginesie a nie jako poprawa tej procki wyzej...

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

5 Ostatnio edytowany przez nosty (2011-01-30 23:48:54)

No i super. Dzieki Panowie, o to chodzilo.

Zoptymalizowalem procedure, sztuczka z przygotowaniem kolorow dla kolejnego przerwania przez _a lda #$ff / sta _a+1 zalatwila sprawe i wszystko ladnie sie wyrabia.*

* EDITED: wyrabiam sie (na Atari800Win) ze zmianą 4 kolorów. Z 5 sie nie da. Nie to zebym operował taka ferią barw że potrzebuje zmieniac 5 kolorow w jednym przerwaniu, ale chcialem miec procedure uniwersalną. Teraz wiem ze z odrobiny uniwersalnosci musze zrezygnowac.

6

Jeszcze jeden hint - Atari800Win daje troszeczkę więcej luzu, niż prawdziwe Atari - właśnie w trybie znakowym można wyprodukować takie DLI, które działa na A800Win a nie działa na prawdziwym sprzęcie.

Na Altirze jest OK.

http://www.5oft.pl/

7

Super Nosty, że robisz coś fajnego!

Będziesz musiał sobie chyba wywalić to "Zbieracz kartridży" :D

800XL  XC12  LDW 2000  Portfolio  1040 ST, STE  Falcon 030 (Deskpro)  Jaguar
... oraz inne grzyby i Amigi :-P

8

hehe, skad wiesz, ze cos fajnego? :)
Na razie glownie sie ucze i wkurwiam tebe'go :D

9

Warto przenieść różne obliczenia przed STx WSYNC.

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

10

W szczególności można już zmienić te kolory, które już nie są potrzebne. ;)

Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

11

a pochwalisz się procką, nosty?

PunBB bbcode test

12

Ale nie ma czym sie chwalic.
Początkowo zrobilem tak jak tebe radzil, a xxl uzupelnil. Czyli:

lab1
   lda #0
   sta wsync
   sta COLBAK
lab2
   lda #0
   sta COLPF0
lab3
   lda #0
   sta COLPF1
   ...

Przy czym na koncu procedury bylo pobranie z tabeli wartosci kolorow dla kolejnego wywolania przerwania i wpisanie ich wartosci do lab1+1, lab2+1, lab3+1. To przygotowanie kolejnego wywolania moglo byc juz robione "wolno", bo nie mialo wplywu na biezace wyswietlanie.

Dzialalo, ale potem ta metoda okazala sie to bez sensu bo jest nieuniwersalna: ja potrzebuje czasami zmieniac kolory, a czasami pozycje playerow PMG, a czasami podmienic zestaw fontow...

Wiec poszedlem na latwizne i skopiowalem metode z G2F: kazde kolejne przerwanie ma swoja osobną procedure z zapisami w trybie absolutnym, a na koncu procedury wektor przerwania zostaje ustawiony na kolejną. Ten zestaw procedur bede jeszcze musial zmieniac dla kazdego levelu (bo beda dosc rozne graficznie). Pamieci zajmuje to wiecej, ale moge sobie na to pozwolic.
W koncu tylko w paru liniach ekranu wykorzystuje przerwania DLI.