Użytkownik:Mono

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 19:18, 7 lut 2013
Mono (Dyskusja | wkład)
(SEV)
← Previous diff
Wersja z dnia 19:19, 7 lut 2013
Mono (Dyskusja | wkład)
(SEV)
Next diff →
Linia 229: Linia 229:
ror ror
? rts ? rts
 +
 +rts zazwyczaj gdzieś w kodzie się znajdzie... Można zresztą użyć dowolnego opkodu >= $40 (rti).

Wersja z dnia 19:19, 7 lut 2013

Spis treści

Mój brudnopis

Z systemem QMEG instalowana jest nieco zmodyfikowana czcionka standardowa (międzynarodowa została usunięta):

Grafika:Atari-qmeg.png

Pożyteczna strona: http://raster.infos.cz/atari/chars.htm

Grafika:Atari-capek.png

Grafika:Atari-tcheko.gif

Grafika:Simdrv.gif

http://members.chello.nl/taf.offenga/ATP16.htm

Przerwania POKEY-a

Układ POKEY obsługuje kilka rodzajów przerwań IRQ:

  • przerwania komunikacji poprzez szynę szeregową,
  • przerwanie naciśnięcia dowolnego klawisza,
  • przerwanie naciśnięcia klawisza Break,
  • przerwania liczników 1, 2 i 4.

Każde z wymienionych przerwań jest maskowalne, co oznacza że istnieje możliwość zablokowania jego obsługi. Do obsługi przerwań przeznaczone są dwa rejestry:

  • IRQEN - rejestr zezwolenia na obsługę przerwania,
  • IRQST - rejestr znaczników wystąpienia przerwania.

Bity tych rejestrów przyporządkowane są odpowiednim przerwaniom:

  • 7 - BREAK - przerwanie naciśnięcia klawisza Break,
  • 6 - KEY - przerwanie naciśnięcia dowolnego klawisza prócz SHIFT, CONTROL, START, SELECT, OPTION, RESET,
  • 5 - SERIN - przerwanie odebrania bajtu z szyny szeregowej,
  • 4 - SEROUT - przerwanie opróżnienia bufora nadawczego szyny szeregowej,
  • 3 - XMTDONE - przerwanie zakończenia transmisji przez szynę szeregową,
  • 2 - TIMER4 - przerwanie licznika 4,
  • 1 - TIMER2 - przerwanie licznika 2,
  • 0 - TIMER1 - przerwanie licznika 1.

Zasada działania

Zapalenie odpowiedniego bitu w rejestrze IRQEN powoduje zezwolenie na obsługę danego przerwania. Jeśli zaistnieją warunki konieczne do wygenerowania przerwania (np. wciśnięty zostanie klawisz), to układ POKEY zasygnalizuje jego wystąpienie skasowaniem odpowiedniego bitu rejestru IRQST. Stan ten będzie się utrzymywał aż do momentu 'potwierdzenia obsługi przerwania' przez program użytkownika.

Skasowanie bitu w rejestrze IRQEN oznacza, że obsługa danego przerwania jest zabroniona i w rejestrze IRQST nie pojawi się żadna informacja o jego wystąpieniu, nawet jeśli zaistnieją ku temu niezbędne warunki.

Przerwania PIA

  • PACTL.7 - linia PROCEED SIO
  • PBCTL.7 - linia INTERRUPT SIO

Przerwanie wystąpiło gdy bity zapalone.

Inne przerwania

  • PDVREG - nowe urządzenie
  • Bit B rejestru stanu CPU - rozkaz BRK

Przerwanie wystąpiło gdy bity zapalone.

Priorytety

Wymienione przerwania są obsługiwane przez system operacyjny, który dla każdego z nich oferuje użytkownikowi osobny wektor.

Każde przerwanie ma przyporządkowany priorytet w związku z czym zawsze są one obsługiwane przez OS w następującej kolejności:

  1. VSERIN ($20A) - odczyt bajtu z szyny szeregowej,
  2. VPIRQ ($238) - komunikacja z nowym urządzeniem,
  3. VSEROR ($20C) - opróżnienie bufora nadawczego szyny szeregowej,
  4. VSEROC ($20E) - koniec transmisji szeregowej,
  5. VTIMR1 ($210) - wyzerowanie licznika 1,
  6. VTIMR2 ($212) - wyzerowanie licznika 2,
  7. VTIMR4 ($214) - wyzerowanie licznika 4,
  8. VKEY ($208) - wciśnięcie klawisza,
  9. VBRKKEY ($236) - wciśnięcie klawisza Break.
  10. VPRCED ($202) - stan niski linii PROCEED w złączu SIO,
  11. VINTER ($204) - stan niski linii INTERRUPT w złączu SIO,
  12. VBREAK ($206) - przerwanie rozkazu BRK procesora.

Obsługa przerwań POKEY-a

OS po wykryciu źródła przerwania potwierdza jego przyjęcie. Odbywa się to poprzez skasowanie oraz ponowne zapalenie bitu zezwolenia na obsługę przerwania w rejestrze IRQEN. Powoduje to ustawienie flagi zgłoszenia przerwania w rejestrze IRQST w stan nieaktywny (bit zapalony). Ponieważ rejestr IRQEN jest rejestrem tylko do zapisu, OS posiłkuje się rejestrem-cieniem IRQENS ($10) aby zapamiętać które przerwania mają być odblokowane. I tak sekwencja potwierdzenia obsługi przerwania wygląda następująco:

lda #%00000100  ;przykładowe przerwanie od TIMERa 4
bit IRQST
bne _nie_wystapilo_
eor #$ff
sta IRQEN       ;zgaszenie flagi wystąpienia przerwania
lda IRQENS
sta IRQEN       ;przywrócenie obsługi przerwań

Polling

Musi się odbywać przy zapalonym I, bo wykrywanie źródła przerwania nie jest maskowane z IRQENS (prócz XMTDONE).

lda #%100
bit IRQST
bne *-3
eor #$ff
sta IRQEN
eor #$ff
ora IRQENS
sta IRQEN

Wektoryzowanie

sei
ldx #5
sta WSYNC
dex
bne *-1
ldx vec
ldy vec+1
stx _store_
sty _store_+1
ldx #<_procedura_
ldy #>_procedura_
stx vec
sty vec+1
lda #%100
ora IRQENS
sta IRQENS
sta IRQEN
cli
sei
lda #%11111011
and IRQENS
sta IRQENS
sta IRQEN
ldx #5
sta WSYNC
dex
bne *-1
ldx _store_
ldy _store_+1
stx vec
sty vec+1
cli

Liczniki

STIMER do startowania odliczania

Przy łączeniu dzielników w 16-bit przerwanie ustawia się w starszym liczniku (2 lub 4)

Ilość cykli zgodna z opisem generatorów dźwięku.

IRQ rozszerzeń

Nie można dołączyć obsługi przerwań od rozszerzeń (np. SoundBoard) o priorytetach niższych, bo nie ma odpowiedniego wektora. Priorytety wyższe mozna obsługiwać przez VIMIRQ.

Zaokrąglenia

Reguła zaokrąglania arytmetycznego mówi, że do liczby należy dodać 0.5 i wziąć część całkowitą. Zależnie od formatu liczb FXP, które chcemy dodawać należy najpierw sprowadzić je do wspólnej postaci (kropka powinna być na tym samym miejscu w obydwu liczbach) po czym przeprowadzić działanie począwszy od najmłodszego bajtu (wynik na bajtach części ułamkowej można zignorować).

Dodawanie

W najprostszej postaci kiedy liczby są w formacie FXP7.1 wystarczy:

 clc
 lda CA
 adc CB
 ror
 adc #0
 rol

w A jest wynik.

Dla FXP8.8 nie trzeba niczego przesuwać:

 clc
 lda CA
 adc CB
 sta R
 lda CA+1
 adc CB+1
 asl R
 adc #0

Również i tu w A jest wynik.

Jeśli jedna z liczb jest całkowita, wtedy wystarczy przesunąć tylko jeden składnik np. dla CA(FXP8.0) i CB(FXP6.2):

 lda CB
 lsr
 lsr
 adc CA

Jeśli rozważana jest liczba ze znakiem należy przy przesuwaniu w prawo lub rozszerzaniu zadbać o kopiowanie znaku argumentu.

Odejmowanie

SA(FXP8.0) SB(FXP8.8)

 lda #$80
 cmp SB
 lda SA
 sbc SB+1

Kopiowanie znaku

Przy przesuwaniu w prawo:

 cmp #$80
 ror

Przy rozszerzaniu:

 asl
 lda #0
 adc #$ff
 eor #$ff

Obrót bitowy w prawo

Metoda dość hakerska:

 pha
 plp
 ror

SEV

  rol
  bit ?
  ror
? rts

rts zazwyczaj gdzieś w kodzie się znajdzie... Można zresztą użyć dowolnego opkodu >= $40 (rti).

Personal tools