1

Temat: IRQ podstawowe pytania

prosze o pomoc w debugowaniu, po uruchomieniu przerwan TIMER1 otrzymuje nieprawidlowe wyniki w zwiazku z tym musze zadac nawet podstawowe pytania:

1. czy IRQ ma priorytet nad NMI
2. co sie stanie gdy wystapi NMI podczas wykonywania IRQ
3. co sie stanie gdy wystapi IRQ podczas wykonywania NMI
4. czy przed ustawieniem przerwania TIMER1 trzeba resetowac POKEY
5. jesli chce uzyskac przerwanie z czestotliwoscia 200hz dla zegara bazowego 15khz ile musze wpisac do AUDF1 i czy wartosc zalezy od PAL/NTSC
6. czy AUDC1 musi byc = 0
7. czy po zapisie do STIMER i odliczaniu do zera przez TIMER trzeba kazdorazowo ustawiac AUDF1 
8. jesli w czasie obslugi przerwania irq zablokujemy przymowanie kolejnych rozkazem sei a takie przerwanie wystapi to po powrocie z obecnego przerwania to ktore wystapilo 'sie zgubi'? (czy znacznik I jest ustawiany automatycznie w moemencie obslugi przerwania)
9. czy bity w rejestrze IRQST sa typu 'zastrzask' - to sie wiaze z pytaniem 8.
10. czy zablokowanie przerwania w IRQEN nie pozwala sprzetowo skasowac bitu w IRQST.

Ostatnio edytowany przez xxl (2010-04-30 09:54:06)

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

2

Odp: IRQ podstawowe pytania

Ad 2. w 6502 jest błąd objawiający się tym, że jednoczesne wystąpienie przerwania NMI oraz IRQ powoduje, że to pierwsze zostane zignorowane.

Co do priorytetów: http://atariki.krap.pl/index.php/IRQ

Czy możecie wyjaśnić, Stirlitz, dlaczego wasz służbowy adres stirlitz@rsha.gov.de ma aliasa justas@gru.su?
Nie czytam PM. Proszę używać e-mail.

3

Odp: IRQ podstawowe pytania

nie wiem czy to jest blad, jesli p.1 jest prawda to wlasnie takiego zachowania bym oczekiwal (nie wykonanie sie NMI) chyba ze chodzi o niefortunna nazwe "niemaskowalne" ;-) np. 'kolejkowanie' irq jeszcze bym zrozumial (jesli tak jest - p.9) ale odpalenie nmi poniewczasie juz zupelnie nie.

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

4

Odp: IRQ podstawowe pytania

1. Tylko w tym znaczeniu, że jak wyskoczą w tym samym cyklu, to może pójść IRQ.
2. Wykona się NMI.
3. Rozumiem, że IRQ to TIMER1. IRQ będzie obsłużone po skasowaniu znacznika I (np. przez RTI).
4. Nie.
5. 15000/200-1. Ale jak chcesz dokładnie, to "15kHz" to w PAL 1773447/114 Hz, a co znaczy "200 Hz" to musisz sam określić. Jeśli chodzi Ci o 4x / ramkę, to w PAL wpisz 77 (312/4-1).
6. Nie musi, najwyżej będziesz słyszał dźwięk. Włączenie przerwań nie ma wpływu na dźwięk.
7. Nie. Nie ma też obowiązku zapisywać do STIMER.
8. IRQ nie powinny się zgubić, o ile ich nie zresetujesz zapisem do IRQEN. Znacznik I jest ustawiany przez procesor przy przyjęciu IRQ i NMI.
9. Sprecyzuj pytanie albo obejrzyj poniższy link.
10. Blokując przerwanie w IRQEN kasujesz status przerwań w IRQST, czyli ustawiasz bity.

Ogólnie polecam http://asap.sourceforge.net/pokeydoc.zip

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

5

Odp: IRQ podstawowe pytania

Na niektóre pytania odpowiedzi są w Resjestry POKEY-a oraz w dokumentacji
9. Wszystkie bity w IRQST poza 3. (XMTDONE) są zatrzaskowe. Tylko skasowanie danego bitu IRQEN powoduje zresetowanie odpowiedniego bitu w IRQST (poza bitem XMTDONE).
10. Tak, ale wyjątkiem znowu jest bit XMTDONE - nawet gdy przerwanie jest zablokowane, jego wartość może zostać przez POKEY zmieniona.

xxl napisał/a:

nie wiem czy to jest blad

W 65C02 i następnych zostało to poprawione, zatem wg twórców był to błąd.

Ostatnio edytowany przez Krótki (2010-04-30 12:14:07)

A8CAS - narzędzie do 100% archiwizacji kaset Atari

6

Odp: IRQ podstawowe pytania

dzieki, sporo mi sie wyjasnilo... a w p.9 byl moj problem, pomoglo!

a poza tematem,
@Krotki, czyli w 6502 IRQ ma priorytet nad NMI a w 65c02 odwrotnie?

Ostatnio edytowany przez xxl (2010-04-30 14:37:43)

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

7

Odp: IRQ podstawowe pytania

Nie wiem, cytowałem Atariki.

Właściwie to jest ciekawa sprawa. W żadnej dostępnej literaturze nie ma informacji o tym, że w 6502 IRQ ma prioryter nad NMI - co więcej, źródła twierdzą coś wprost przeciwnego. Np. 6502.org:

Note also that if an NMI and an IRQ hit at the same time, the NMI has the higher priority and will get serviced first.

W dyskusji na AtariAge mówili, że nie jest to problem samego procesora, tylko specyficznej architektury Atari, i że nie występuje on w innych komputerach używających 6502. Być może powodem ignorowania NMI przez procesor jest fakt, że ANTIC umie zatrzymać zegar CPU.

Więc może informacje w Atariki są nieścisłe.

EDIT: A wystarczyło doczytać do końca :) Faktycznie chodzi o to, że jeśli CPU już zaczyna obsługiwać IRQ i w tym momencie na nóżkę NMI procesora przyjdzie sygnał, i jeśli dodatkowo sygnał ten jest krótszy niż 3 cykle, to przerwanie NMI zostanie zignorowane. Natomiast wszystko będzie dobrze jeśli sygnał NMI będzie dłuższy.

Tyle że w przypadku Atari, ANTIC ustawia linię NMI tylko na 2 cykle. Co więcej, podobno stara dokumentacja do 6502 mówi, że minimalny czas trwania sygnału NMI to właśnie 2 cykle. Można więc powiedzieć, że błąd jest nie tyle w procesorze, co w dokumentacji :)

A ponieważ 65C02 jest procesorem CMOS o zupełnie innej konstrukcji, to problem został w tym procku rozwiązany może nawet nieświadomie.

Ostatnio edytowany przez Krótki (2010-04-30 17:40:31)

A8CAS - narzędzie do 100% archiwizacji kaset Atari

8

Odp: IRQ podstawowe pytania

xxl: Nie wiem czy ci to potrzebne ale można w sposób programowy zapewnić, żeby żadne NMI się nie zgubiło. Ja stosuję to w IK+.

9

Odp: IRQ podstawowe pytania

taka wiedza moze sie przydac nie tylko mnie

Ostatnio edytowany przez xxl (2010-05-01 18:19:14)

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

10

Odp: IRQ podstawowe pytania

Zgaduję, że chodzi o sprawdzenie NMIST w obsłudze IRQ.

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

11

Odp: IRQ podstawowe pytania

Tak, dokładnie. Z tym, że cała sztuczka jest, powiedziałbym, nietrywialna i wymaga porządnego opisu, na który trzeba czasu. Kiedyś postaram się to zrobić. Póki co mogę podesłać kod, gdyby ktoś potrzebował pilnie.

12

Odp: IRQ podstawowe pytania

Czy paczowanie NMI na IRQ polega na:
1. Rozgałęzieniu

irqmain:
  bit NMIST
  spl
  jmp (VDLST)
  svs
  jmp (VIMIRQ)
  pha
  txa
  pha
  tya
  pha
  sta NMIRES
  jmp (VVBLKI)

2. Dodaniu na końcu kodu przerwania DLI resetowania stanu NMIST (zapis do NMIRES).

Czy są jeszcze jakieś inne szykany?

Edit: wyrzucone pha

Ostatnio edytowany przez mono (2014-02-11 19:46:44)

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

13

Odp: IRQ podstawowe pytania

Tak bym zrobił. Tylko tego pierwszego pha chyba nie powinno być. Jeśli DLI nie jest krytyczne czasowo, to od razu zrobiłbym STA NMIRES.

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

14

Odp: IRQ podstawowe pytania

uwazam, ze zapis do NMIRES jest zbedny.

mam racje?

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

15

Odp: IRQ podstawowe pytania

@xxl: Niestety reset NMI jest konieczny przy paczowaniu IRQ.
Dlaczego?
Założenie projektantów OSa było (domyślam się) takie: DLI jest krytyczne czasowo, więc nie robimy tu niczego zbędnego - widać to po tym, że nie robią nawet PHA a przechodzą do DLI najszybciej jak się da. Ponieważ w XL/XE (nie wiem, jak to wygląda w 400/800) przerwania NMI są tylko 2, to nawet jak wystąpi DLI i status w NMIST po jego obsłudze zostanie w rejestrze, to nic się nie stanie, bo następnym przerwaniem NMI będzie i tak tylko kolejne DLI. Aż do momentu wystąpienia VBLK, bo najwyraźniej przy jego wystąpieniu NMIST.7 jest kasowany i dlatego systemowa procedura VBLK ma szansę się wykonać.
Jeśli natomiast po (albo równocześnie z) DLI wystąpi IRQ to bez skasowania NMIST obsługa przerwania IRQ zawsze przejdzie do obsługi DLI i nigdy nie wykona właściwego IRQ.
Dlaczego uważam, że powinien to robić user implementujący DLI? Ponieważ mamy jeden wektor VDLST, który używa NMI i IRQ a obsługa przerwania powinna być IMHO spójna. STx nie zmieniają znaczników więc można to robić tuż przed RTI po zakończeniu krytycznych czasowo rzeczy. Byłaby to więc dobra praktyka pozwalająca działać programowi zarówno w standardowym, jak i spaczowanym środowisku.

Edit: I tak takie DLI opóźnione jest o 7 cykli (CLD+JMP ind), chyba że podpinamy się pod wektor IRQVEC zamiast VIMIRQ, ale wtedy trzeba by zrobić jeszcze CLD przed SVS.

@0xf: Racja - poprawione.

Ostatnio edytowany przez mono (2014-02-11 19:47:30)

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

16

Odp: IRQ podstawowe pytania

Dla pewności przerobiłbym jeszcze procedurę NMI, bo ZTCP w XL/XE działa ona na zasadzie "jeśli nie DLI, to VBLKI". Natomiast istnieje możliwość odczytania NMIST z zapalonym statusem przerwania, zanim odpali się obsługa NMI. Edit: i tu widzę problem: co zrobić, żeby to samo NMI nie obsłużyło się dwa razy: raz na IRQ, drugi raz na NMI.

Edit 2:

  asl NMIST ; strobes NMIRES
  jcs (VDLST)
  jpl (VIMIRQ)

W 400/800 klawisz Reset jest podpięty pod NMI (bit 5 w NMIST, ZTCP NMIEN na niego nie działa).

Ostatnio edytowany przez Fox (2014-02-12 09:29:22)

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

17

Odp: IRQ podstawowe pytania

A nie wynika to z tego, że przerwanie jest przyjmowane po zakończeniu bieżącego cyklu rozkazowego więc mając np LDA NMIST i NMI, które wystąpi po prefetchu a przed 4 cyklem rozkazu w A dostaniemy info o NMI?

Ha! (za https://atariwiki.org/wiki/Wiki.jsp?pag … %20Listing ):

;
; NMI HANDLER
;
; DETERMINE CAUSE AND JUMP THRU VECTOR
;
PNMI:    BIT      NMIST
          BPL      PNMI1         ;SEE IF DISPLAY LIST
          JMP      (VDSLST)
PNMI1:  PHA
          LDA      NMIST
          AND      #$20          ;SEE IF RESET
          BEQ      *+5
          JMP      WARMSV        ;DO THRU WARM START JUMP
          TXA                      ;SAVE REGISTERS
          PHA
          TYA
          PHA
          STA      NMIRES        ;RESET INTERRUPT STATUS
          JMP      (VVBLKI)     ;JUMP THRU VECTOR

W XL/XE oczywiście dodano CLD  i usunięto test NMIST.5.

jmi/jvc - nie wiedziałem, że tak można :) Ale wygląda ładnie.

Ostatnio edytowany przez mono (2014-02-12 09:30:21)

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

18

Odp: IRQ podstawowe pytania

co z rozkazem CLD przed skokiem pod VIMIRQ?

czy wyzej wymieniony sposob rozwiazuje kwestie wykonywania przerwania programowego BRK?

i rownie wazne... co to za rozkazy jmi i jvc?

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

19

Odp: IRQ podstawowe pytania

CLD sobie trzeba dodać przed obsługą IRQ, bo SIO liczy np. sumę kontrolną.

Z moich testów wynika, że nie ma jak wykryć wykonania BRK kiedy wraz z nim wystąpiło jakiekolwiek przerwanie sprzętowe (nie może być jak IRQ odroczone). Chciałbym się bardzo pomylić w tej kwestii, bo podoba mi się wołanie funkcji systemowych za pomocą BRK #fn.

Jump if MInus: bmi albo jeśli za daleko to spl + jmp; analogicznie Jump if V Clear.

Edit: No i BRK wykona się przy zapalonym I.

Ostatnio edytowany przez mono (2014-02-12 09:39:32)

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

20

Odp: IRQ podstawowe pytania

no wlasnie. czy moze wystapic problem ze przy ustawionym I po rozkazie BRK procedura przejdzie do wykonywania jakiegos zasygnalizowanego przerwania IRQ?

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

21

Odp: IRQ podstawowe pytania

@mono: zobacz "Edit 2" z posta 16.

mono napisał/a:

CLD sobie trzeba dodać przed obsługą IRQ, bo SIO liczy np. sumę kontrolną.

Rozwijając wypowiedź: przerwanie transmisji SIO aktualizuje sumę kontrolną używając ADC, więc D=1 robi kuku. Z drugiej strony, czy ktoś robi SED w czasie transmisji SIO?

Nie było mowy o tym, gdzie wpinamy poprawione IRQ. Być może pod wektor systemowy, więc OS zrobił już za nas CLD.
Nie pamiętam natomiast, gdzie powinno być CLD dla VBLKI.

Co do BRK, to nie jest czasem tak, że jak wykona się razem z IRQ lub NMI, to jednak znacznik B na stosie jest ustawiony i trzeba go sprawdzić na początku w przypadku IRQ oraz sprawdzić w ogóle w przypadku NMI.

mono napisał/a:

Jump if MInus: bmi albo jeśli za daleko to spl + jmp; analogicznie Jump if V Clear.

Rozwijając wypowiedź: to pseudorozkazy xasm (ale widziałem je też w innym asemblerze, chyba ca65), np.

 jmi target

to

 bpl skip
 jmp target
skip

Edit:

xxl napisał/a:

czy moze wystapic problem ze przy ustawionym I po rozkazie BRK procedura przejdzie do wykonywania jakiegos zasygnalizowanego przerwania IRQ?

Tak jest.

Nie używam BRK w produkcyjnym kodzie. :)

Ostatnio edytowany przez Fox (2014-02-12 12:04:34)

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

22

Odp: IRQ podstawowe pytania

ASL ładne, ale to i tak nie załatwia całkowicie sprawy - trzeba by poprawić w ROMie procedurę NMI, bo tam nie mamy już takiego fajnego wektora VIMNMI (z NMIVEC możemy wszystko). Inaczej problem będzie z pierwszym IRQ wykonywanym po NMI.
CLD w NMI robione jest tylko dla VBLK.

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

23

Odp: IRQ podstawowe pytania

> Rozwijając wypowiedź: przerwanie transmisji SIO aktualizuje sumę kontrolną używając ADC, więc D=1 robi kuku. Z drugiej strony, czy ktoś robi SED w czasie transmisji SIO?

ale mozna sobie wyobrazic procedure IRQ np. timera1 ktora bedzie uzywala przykladowo ADC - nie przypominam sobie, zeby jakakolwiek procedura obslugi przerwania IRQ usera miala rozkaz CLD


> Nie używam BRK w produkcyjnym kodzie.

w przypadku gdy jednoczesnie wystapi IRQ i BRK to bit B stanu procesora na stosie jest ustawiony czy skasowany?

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

24

Odp: IRQ podstawowe pytania

Ustawiony.

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

25

Odp: IRQ podstawowe pytania

a takie cos zalatwi sprawe?

SEI
BRK
.byte cokolwiek
CLI

? (pod warunkiem ze wlasna procka IRQ bedzie sprawdzac B wczesniej)

Ostatnio edytowany przez xxl (2014-02-12 12:43:15)

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