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

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.

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

2

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

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

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 Ostatnio edytowany przez Krótki (2010-04-30 12:14:07)

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.

A8CAS - narzędzie do 100% archiwizacji kaset Atari

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

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?

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

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

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.

A8CAS - narzędzie do 100% archiwizacji kaset Atari

8

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 Ostatnio edytowany przez xxl (2010-05-01 18:19:14)

taka wiedza moze sie przydac nie tylko mnie

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

10

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

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

11

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 Ostatnio edytowany przez mono (2014-02-11 19:46:44)

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

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

13

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

uwazam, ze zapis do NMIRES jest zbedny.

mam racje?

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

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

@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.

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

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

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).

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

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

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.

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

18

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 Ostatnio edytowany przez mono (2014-02-12 09:39:32)

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.

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

20

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 Ostatnio edytowany przez Fox (2014-02-12 12:04:34)

@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. :)

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

22

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

> 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

Ustawiony.

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

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

a takie cos zalatwi sprawe?

SEI
BRK
.byte cokolwiek
CLI

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

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