1 Ostatnio edytowany przez tebe (2015-06-08 11:13:24)

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

Post's attachments

irq.7z 18.93 kb, liczba pobrań: 14 (od 2015-06-08) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

2

nie sprawdzalem jeszcze na atarce, ale wydaje mi sie ze kolory w "trybach irq" troche sie roznia od zwyklego dli

3

tebe napisał/a:

IRQ pozwoli odzyskać część straconych cykli CPU

jak dużo? przeszło 2000 cykli dla obrazka o wysokości 200 linii

2000 to sporo. Z czego wynika ta oszczędność?

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

4 Ostatnio edytowany przez tebe (2015-06-08 09:55:57)

poprawiłem wartość wolnych cykli jaką zyskuje się dla IRQ, jest to przeszło 2000 cykli CPU

jak są liczone wolne cykle, program wykonuje pętle

loop jsr delay      ; 12 cykli
       inw time     ; 8 lub 12 cykli gdy zwiekszany jest starszy bajt
       jmp loop     ; 3 cykle
delay rts

na przerwaniu VBL przepisywany jest na inną stronę pamięci licznik TIME, następnie zerowany, co ramkę otrzymujemy informację ile razy udało się powtórzyć pętlę, która trwa najmniej 23 cykle, a dla przypadku w którym trzeba zwiększyć starszy bajt TIME 27 cykle

w sumie dla obrazka DLI mamy do dyspozycji 11573 wolnych cykli CPU, dla najszybszego IRQ 14084 cykli, ponad 2000 cykli zysku na korzyść IRQ

p.s.
Vidol biorąc pod uwagę komentarze dla obrazka BIASED_DECISION (Raven/Nuance) gdzie potworne błędy zmiany rastra zostały uznane jako zamierzony efekt wygładzenia 8) to jakiekolwiek przekłamania kolorów dla IRQ są przecudowne

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

5

Cyprian napisał/a:
tebe napisał/a:

IRQ pozwoli odzyskać część straconych cykli CPU

jak dużo? przeszło 2000 cykli dla obrazka o wysokości 200 linii

2000 to sporo. Z czego wynika ta oszczędność?

zysk pochodzi ze zmiany drugiej linii, którą zaczynamy zmieniać od razu po pierwszej linii

załączony przykład (MONSTER) dotyczy zmiany 3 rejestrów, dla trybów GTIA powinno być jeszcze szybciej

w załączniku przykład autora PROJECTM, rozbudowane IRQ (5 poziomów) zmieniające tylko rejestr GTICTRL

Post's attachments

gmode.7z 5.74 kb, liczba pobrań: 10 (od 2015-06-08) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

6 Ostatnio edytowany przez mono (2015-06-08 12:27:41)

Czy ja dobrze rozumiem, że ustawiasz stały interwał a zmienna LINE odlicza Ci linie w których wykona się kod rastra albo nie? Dlaczego tak?

Czy nie prościej i wydajniej zmieniać wartość AUDF co przerwanie? Mając oczywiście na względzie, że interwał z AUDF jest przepisywany do wewnętrznego TIMER:
- po przekręceniu TIMER,
- po zapisie do STIMER.
Tak więc zgrubsza:

lda intervals
sta AUDF
sta STIMER
lda intervals+1
sta AUDF
lda #2
sta index
...
...
irq:
index = *+1
  lda intervals
  sta AUDF
  rti

intervals .db 0,1,2,3,4,5,6,... i jakie tam interwały nas interesują

Edit: Można też oczywiście uzyskać granulację 1/4 skanlinii albo co do cyklu CPU. No i kod poza przerwaniami powinien być tak skonstruowany, żeby koniec rozkazu przypadał na moment rozpoczęcia obsługi przerwania (żeby sekwencja wejścia w przerwanie nie czekała zbyt długo). Niezależnie jednak od tego timing liczników będzie precyzyjny - jedyne wahania to oczekiwanie na zakończenie cyklu rozkazowego CPU przed rozpoczęciem obsługi IRQ, ale nawet synchronizacja przez WSYNC ma wahania 1, 2 cykle oidp.

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

7 Ostatnio edytowany przez tebe (2015-06-08 14:00:24)

DLI puszcza IRQ w ruch, co 2 linie ekranu IRQ zmienia po 2 linie obrazu, interwał zmian jest stały, program IRQ jest możliwie najkrótszy aby zostawić jak najwięcej wolnych cykli CPU

licznik LINE zlicza tylko kolejne wywołania IRQ i nie decyduje o linii w której ma nastąpić zmiana albo nie, o tym decyduje AUDF które zostaje ustawione tylko raz przed uruchomieniem całego programu, AUDCTL=1 (15Khz)

można też zakończyć "galop" IRQ poprzez drugie DLI na końcu programu DLISTy, jednak potrafiło to zawieść, stąd zdecydowałem się na licznik

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

8

gdy załadujecie przykładowy plik IRQ_MCP z poziomu ATR (dyskietki itp.) kolory będą popsute

w przykładzie zabrakło instrukcji resetowania POKEY-a  (SKCTL = 3)

załadowanie pliku OBX/XEX z pominięciem transmisji przez POKEYA nie ujawni tego niedociągnięcia

Post's attachments

irq_proper.7z 10.78 kb, liczba pobrań: 10 (od 2015-06-10) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

9

na podstawie kodu obsługi IRQ Phaerona http://atariage.com/forums/topic/244946 … try4041309

można dowiedzieć się że jest trick dotyczący wyłączenia/włączenia IRQ (działa bodaj tylko z licznikem #4)

dotychczasowe

  mva #0 IRQEN
  mva #4 IRQEN

można zastąpić zwięzłym

 inc IRQEN

w załączniku najnowsza wersja wyświetlania grafiki MCP (przełączanie 3 rejestrów kolorów co linię trybu GRAPHICS 15, 160x200x16) z użyciem przerwania IRQ, co daje sporą przewagę względem klasycznego DLI, zostaje nam ~15226 wolnych cykli CPU

nie używamy 'STA WSYNC' co linię jak jest to w przypadku DLI

Post's attachments

MCP_IRQ.ZIP 27.11 kb, liczba pobrań: 7 (od 2018-06-13) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

10

nie znam sie wiec sie wypowiem ;-)

czy nie jest tak, ze numer z kasowaniem i ustawieniem przerwania instrukcja R-M-W zadziala tylko na prawdziwym atari gdzie instrukcja przykladowo INC zaladuje dane / zapisze dane (te same) / zmodyfuje i zapisze prawidlowa wartosc a taki procesor 65816: zaladuje, jeszcze raz zaladuje, zmodyfikuje i zapisze co w efekcie doprowadzi do tego ze efekt skasowania i ustawienia IRQ nie zadziala?

oczywiscie to moze byc plotka, bo czytalem to daaawno temu i nie weryfikowalem.

jak to jest?

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

11

inc NMIEN
dec NMIEN

z powodzeniem używam na Rapidusie (65816), działa, testowane na prawdziwym sprzęcie

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

12

a nie w odwrotnej kolejnosci, najpierw dec pozniej inc? to zadziala ale czy dziala z samym inc?

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

13 Ostatnio edytowany przez tebe (2018-06-13 15:10:55)

http://www.atari.org.pl/forum/viewtopic.php?id=12109

Seban:
"Tak samo przy wykorzystaniu faktu iż operacje typu INC, DEC są operacjami Read-Modify-Write, gdy chciałem zablokować przerwania NMI stosowałem INC $d40e, a gdy chciałem odblokować NMI to po prostu DEC $d40e"

Fox:
"Dla kompletu: LSR $d40e włącza samo VBLKI."

p.s.
nie słuchajcie piernika Electrona ;)

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

14 Ostatnio edytowany przez xxl (2018-06-13 15:59:47)

nie wiem czy robisz to specjalnie ;-) ale uzywanie rozkazow R-M-W na rejestrach sprzetowych w ogole a sygnalizowania obsluzenia irq i zezwolenia na kolejne jednym rozkazem... to dwa tematy

po prostu wykonaj jeden inc w sytuacji gdy obsluszysz irq i sprawdz czy dziala :-)

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

15

dokładniej zbadałem to na Rapidusie

dla 65816 INC IRQEN wywołane na przerwaniu IRQ w celu jego zakończenia/wystartowania działa inaczej, efekt jest taki jakby IRQ przejęło 100% mocy CPU, NMI działa, ale główny program już nie

tak XXL, masz rację :)

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

16 Ostatnio edytowany przez xxl (2018-06-24 13:50:28)

trzeba przekazac Pinowi aby akolici postatari dopisali to ograniczenie do swoich przykazan ;-)

---
juz wiem gdzie o tym czytalem: mikroprocesor 6502 i jego rodzina H.Kruszynski i K.Kulpa

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

17

tebe napisał/a:

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

IRQ powinno działać.

tebe napisał/a:

na podstawie kodu obsługi IRQ Phaerona http://atariage.com/forums/topic/244946 … try4041309

można dowiedzieć się że jest trick dotyczący wyłączenia/włączenia IRQ (działa bodaj tylko z licznikem #4)

dotychczasowe

  mva #0 IRQEN
  mva #4 IRQEN

można zastąpić zwięzłym

 inc IRQEN

Piękne. Ale czy wciskając klawisze nie generujesz dodatkowych IRQ?

https://www.youtube.com/watch?v=jofNR_WkoCE

18

udało się :), pełne synchro dla IRQ bez WSYNC dla trybu 9++, DMA dla PMG wyłączone

wywoływane co 4 linie, 78 cykli do wykorzystania w programie przerwania IRQ

p.s.
klawiatura nie generuje dodatkowych przerwań IRQ

Post's attachments

mode_9++_irq.zip 12.18 kb, liczba pobrań: 11 (od 2018-07-07) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

19 Ostatnio edytowany przez Fox (2018-07-08 07:48:53)

Rozwiązanie TeBe ma kilka wad:

  • strata 78 cykli co 4 linie to gorszy wynik niż rozwiązanie oparte na DLI co 8 linii

  • użycie instrukcji 7-cyklowych w programie głównym w trakcie wyświetlania obrazu kaszani tryb

  • POKEY musi być skonfigurowany na 15kHz, co ogranicza autora ewentualnej muzyki, który i tak jest ograniczony przez liczbę dostępnych kanałów (może się przydać stereo)

  • resetowanie POKEYa w DLI kaszani ewentualną muzykę

Oto moje rozwiązanie:

  • procedura co 8 linii bez traconych cykli

  • z opcjonalną obsługą instrukcji 7-cyklowych

  • z konfigurowalnym wykorzystaniem POKEYa: wybór kanału dla przerwania, 15kHz lub para kanałów (wtedy pozostałe dwa kanały mogą grać dowolnie)

  • z jednorazowym resetowaniem POKEYa w przypadku 15kHz i tylko jednym zapisem STIMER w przypadku pary kanałów

Mam pod ręką tylko Altirrę, proszę o sprawdzenie na Atari.

O co chodzi z instrukcjami 7-cyklowymi:

Jak pisałem, mamy ograniczone okienko czasowe na zapisanie 13 do VSCROL. Przerwanie nie przerywa instrukcji, musi się ona wykonać w całości. Jeśli procesor wykonuje instrukcję 7-cyklową w momencie zgłoszenia przerwania, nie będzie ono w stanie wstrzelić się w okienko czasowe.
Możemy:
a. unikać tych instrukcji w programie głównym: są to BRK i INC/DEC/ASL/LSR/ROL/ROR abcd,X, plus wiele instrukcji nielegalnych i 65816
b. odpalać przerwanie wcześniej i synchronizować się z WSYNC (opcja irq9pp_LONGOP), oczywiście w ten sposób tracimy trochę cykli
Instrukcje nielegalne i 65816 mogą mieć nawet więcej, niż 7 cykli. Nie testowałem dla nich mojego rozwiązania z WSYNC.

Post's attachments

irq9pp.zip 4.14 kb, liczba pobrań: 9 (od 2018-07-08) 

Tylko zalogowani mogą pobierać załączniki.
https://www.youtube.com/watch?v=jofNR_WkoCE

20

super, dzięki Fox :)

rzeczywiście jest więcej szczegółów na które nie zwróciłem uwagi

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

21

Druga wersja:

  • Zamiast blokować przerwanie na dole ekranu, przestawiam timer, aby tyknął dopiero w następnej ramce. Timer trzeba teraz też ustawiać w VBLKI.

  • Opcja wykrycia i obsługi NTSC

  • Brak błędów związanych z wyrównaniem kodu

  • Brak DLI na górze - tryb może zaczynać się na samej górze ekranu

  • Opcjonalne DLI na dole - oszczędza cykli IRQ

Post's attachments

irq9pp2.zip 4.45 kb, liczba pobrań: 8 (od 2018-07-08) 

Tylko zalogowani mogą pobierać załączniki.
https://www.youtube.com/watch?v=jofNR_WkoCE

22 Ostatnio edytowany przez Fox (2018-07-08 14:30:25)

tebe napisał/a:

klawiatura nie generuje dodatkowych przerwań IRQ

"inc IRQEN" włącza przerwanie klawiatury. Naciśnięcie klawisza powoduje zapętlenie przerwań, bo nie jest potwierdzane obsłużenie przerwania klawiatury. Rozwiązaniem jest wyłączenie skanowania klawiatury, ale bez resetu POKEYa, który zatrzymałby dzielniki 64kHz i 15kHz i generatory zniekształceń: SKCTL=1.

Post's attachments

irq9pp4.zip 4.64 kb, liczba pobrań: 8 (od 2018-07-08) 

Tylko zalogowani mogą pobierać załączniki.
https://www.youtube.com/watch?v=jofNR_WkoCE

23

HIP na IRQ:

    ert <*!=$20
irq_gr9
    pha
    lda #$41
    sta ^1b
    sta $fffe
    inc ^2e
    pla
    rti
:irq_gr9+$21-* nop
    lsr $fffe
    ror ^1b
    inc ^2e
    rti
https://www.youtube.com/watch?v=jofNR_WkoCE

24 Ostatnio edytowany przez qbahusak (2021-03-15 15:08:28)

Kurka. Chwilę mi zajęło zrozumienie, co ten kod robi. A obsługa przerwania bez aku - majstersztyk.

Proponuję też używanie terminu "instrukcje niepublikowane", bo Google (czy inne) AI niedługo nas zaszufladkuje jako przestępców (jeśli już nie zrobiło tego). Ale zdrugiej strony - popsuje to nieco jej szyki...