z przerwaniem programu DLISTy (DLI) pewnie każdy się spotkał, pozwala zmieniać rejestry w kolejnych liniach obrazu, dodatkowo zawsze wcześniej należy użyć WSYNC ($D40A) aby zmiana zaszła od początku linii, czyli jeśli mamy obrazek o wysokości 200 linii, to 200x WSYNC oznacza że na wysokości 200 linii zmieniamy tylko rejestry i nic poza tym, nie mamy czasu CPU na nic innego
ostatnio na AtariAge natknąłem się na kilka wątków dotyczących wykorzystania IRQ zamiast tradycyjnych przerwań DLI
taki ProjectM (256 kolorowy potencjalny Wolfenstein korzysta z takiego sposobu zmian rejestrów GTIA co linię)
potencjalnym zakresem zastosowań są tryby interlace lub wszystko inne co zmienia kolory co ileś linii z jakimś ustalonym schematem, czyli APAC, XLPaint MAX itp.
zaletą IRQ jest możliwość określenia co ile linii ma zostać wywołane przerwanie (co 1 linię, dwie, trzy, osiem itd.)
wadą ograniczenie możliwości dźwiękowych POKEY-a, muzyka musi zostać napisana uwzględniając korzystanie z TIMERa
jeśli ktoś chciałby popełnić jakiś efekt w większej liczbie kolorów IRQ pozwoli odzyskać część straconych cykli CPU
jak dużo? przeszło 2000 cykli dla obrazka o wysokości 200 linii
w załączniku przykład wyświetlenia obrazka Vidola 'Monster', tryb XLPaint Max (albo MCP - McPainter)
z eksperymentów wyszło że najbardziej opłaca się wywoływać IRQ co 2 linie (AUDF=1), dla wywołań co 1 linię wychodzi czasowo podobnie jak poprzez DLI, chyba że dokona się optymalizacji przerwań IRQ i wtedy zaczyna się odzyskiwać cykle CPU
jednak najbardziej efektywne jest wywołanie co 2 linie
ku potomności, IRQ nie takie straszne, chcecie zawalczyć o wolne cykle CPU, pomyślcie o IRQ jako alternatywie
zarys działania programu
program startuje IRQ z poziomu przerwania DLI, czas trwania przerwania kontroluje zmienna LINE, zmniejszana z każdym wywołaniem IRQ
inicjowanie IRQ
mva #100 LINE ; zmienna zliczająca linie
mva #1 AUDCTL ; 0=POKEY 64KHz, 1=15KHz
mva #0 AUDC4 ; test - no polycounters + volume only
mva #1 AUDF4 ; co 2 linie
krótki program DLI, który wystartuje IRQ
pha
lda #4
sta stimer ; niby startuje liczniki TIMER-a
sta irqen ; to najważniejsze uruchamia IRQ
pla
rti
samo przerwanie IRQ
pha
lda #x0 reg0
lda #y0 reg1
lda #z0 reg2
mva #0 irqen ; zatrzymanie przerwania
mva #4 irqen ; kontynuacja
N pustych cykli aby dostać się do drugiej linii
dec LINE
beq IRQ_STOP
lda #x1 reg0
lda #y1 reg1
lda #z1 reg2
pla
rti
IRQ_STOP
mva #0 IRQEN ; zatrzymanie przerwania IRQ
pla
rti
w załączniku 3 pliki, DLI_MCP tradycyjna zmiana poprzez DLI, IRQ_MCP najszybsza zmiana poprzez IRQ co 2 linie, IRQ_MCP_2 wersja z IRQ co 1 linię, najmniej opłacalna
programy sprawdzane na prawdziwym sprzęcie, tylko DLI_MCP działa na wszystkich emulatorach, wersje IRQ tylko z ALTIRRą wyświetlane są prawidłowo
p.s.
próbowałem też "ożenić" IRQ z zaprezentowaną przez FOX-a metodą VSCROLL-a, tryb 9++, nie udało się, WSYNC ma niewątpliwą zaletę w tym względzie
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C