Użytkownik:Mono

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 17:11, 7 sty 2014
Mono (Dyskusja | wkład)
(bibodos)
← Previous diff
Wersja z dnia 15:46, 14 mar 2019
Mono (Dyskusja | wkład)

Next diff →
Linia 39: Linia 39:
* 1 - TIMER2 - przerwanie licznika 2, * 1 - TIMER2 - przerwanie licznika 2,
* 0 - TIMER1 - przerwanie licznika 1. * 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. 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.
Linia 90: Linia 88:
Przez większość czasu działania procesora B jest zapalone. B=0 tylko w momencie kiedy żąda się obsługi przerwania '''sprzętowego''' (np. od POKEYa) i taki stan jest podtrzymywany do końca sekwencji wejścia w przerwanie, po czym znowu jest zapalany. Z tego powodu testowanie czy wywołano rozkaz BRK odbywa się na wartości rejestru flagowego zostawionej na stosie przy wejściu w przerwanie, gdyż PHP+PLA pokaże B=1. Przez większość czasu działania procesora B jest zapalone. B=0 tylko w momencie kiedy żąda się obsługi przerwania '''sprzętowego''' (np. od POKEYa) i taki stan jest podtrzymywany do końca sekwencji wejścia w przerwanie, po czym znowu jest zapalany. Z tego powodu testowanie czy wywołano rozkaz BRK odbywa się na wartości rejestru flagowego zostawionej na stosie przy wejściu w przerwanie, gdyż PHP+PLA pokaże B=1.
-== Priorytety ==+http://www.atari.org.pl/forum/viewtopic.php?id=7800
 + 
 += Priorytety =
Wymienione przerwania są obsługiwane przez system operacyjny, który dla każdego z nich oferuje użytkownikowi osobny wektor. Wymienione przerwania są obsługiwane przez system operacyjny, który dla każdego z nich oferuje użytkownikowi osobny wektor.
Linia 108: Linia 108:
# VBREAK ($206) - przerwanie rozkazu BRK procesora. # VBREAK ($206) - przerwanie rozkazu BRK procesora.
-== Obsługa przerwań POKEY-a ==+= Obsługa przerwań POKEY-a =
OS po wykryciu źródła przerwania potwierdza jego przyjęcie. OS po wykryciu źródła przerwania potwierdza jego przyjęcie.
Linia 123: Linia 123:
sta IRQEN ;przywrócenie obsługi przerwań sta IRQEN ;przywrócenie obsługi przerwań
-=== Polling ===+== Polling ==
Musi się odbywać przy zapalonym I, bo zablokowanie źródła przerwania powoduje że zgłoszenie nie pojawia się w IRQST. Musi się odbywać przy zapalonym I, bo zablokowanie źródła przerwania powoduje że zgłoszenie nie pojawia się w IRQST.
Linia 135: Linia 135:
sta IRQEN sta IRQEN
-=== Wektoryzowanie ===+== Wektoryzowanie ==
sei sei
Linia 163: Linia 163:
cli cli
-== Liczniki ==+= Liczniki =
STIMER do startowania odliczania STIMER do startowania odliczania
Linia 171: Linia 171:
Ilość cykli zgodna z opisem generatorów dźwięku. Ilość cykli zgodna z opisem generatorów dźwięku.
-== Komunikacja szeregowa ==+= Komunikacja szeregowa =
Jak wspomniano [http://www.atari.org.pl/forum/viewtopic.php?pid=109609#p109609 w tym wątku] XMTDON jest aktywny (zgaszony) kiedy nie trwa właśnie emisja bajtu danych przez szynę szeregową, wpp będzie ustawiany w stan nieaktywny (zapalony) a ponieważ nie ma możliwości zdezaktywowania tego bitu w IRQST, zezwolenie w IRQEN na jego obsługę będzie powodowało ciągłe zgłaszanie przerwania poza chwilami kiedy trwa transmisja bajtu. Między przerwaniami nie zostanie wykonany ani jeden cykl programu użytkownika. Jak wspomniano [http://www.atari.org.pl/forum/viewtopic.php?pid=109609#p109609 w tym wątku] XMTDON jest aktywny (zgaszony) kiedy nie trwa właśnie emisja bajtu danych przez szynę szeregową, wpp będzie ustawiany w stan nieaktywny (zapalony) a ponieważ nie ma możliwości zdezaktywowania tego bitu w IRQST, zezwolenie w IRQEN na jego obsługę będzie powodowało ciągłe zgłaszanie przerwania poza chwilami kiedy trwa transmisja bajtu. Między przerwaniami nie zostanie wykonany ani jeden cykl programu użytkownika.
-== IRQ rozszerzeń ==+= 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. 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.
-== Opóźnienia wywołania procedur obsługi przerwań IRQ ==+= Opóźnienia wywołania procedur obsługi przerwań IRQ =
Ilość cykli o jakie opóźniona jest obsługa przerwania IRQ: Ilość cykli o jakie opóźniona jest obsługa przerwania IRQ:
Linia 215: Linia 215:
Całkowity czas trwania procedury IRQ kiedy nie jest obsługiwane żadne przerwanie wynosi 250 (+5+18=273) cykli. Całkowity czas trwania procedury IRQ kiedy nie jest obsługiwane żadne przerwanie wynosi 250 (+5+18=273) cykli.
 +
 += Paczowanie przerwań IRQ na obsługę NMI =
 +
 +http://www.atari.org.pl/forum/viewtopic.php?id=7800
 +
 += IRQSTAT =
 +
 +Rejestr jest ustawiany przez OS:
 +
 +* $FF - RESET
 +* $00 - procedura obsługi przerwania klawisza BREAK
 +* $80 - procedury edytora po obsłudze wciśnięcia klawisza BREAK
 +* $88 - procedura odczytu z klawiatury po wciśnięciu CTRL+3
 +* $FF - procedura otwarcia C: po obsłudze wciśnięcia klawisza BREAK
 +* $FF - SIO po obsłudze wciśnięcia klawisza BREAK
= Zaokrąglenia = = Zaokrąglenia =
Linia 230: Linia 245:
ror ror
adc #0 adc #0
- rol 
w A jest wynik. w A jest wynik.
Linia 298: Linia 312:
@:eor #0 @:eor #0
-= BOOT ZPG =+= BOOT =
 + 
 +Rejestry, które należy bezwzględnie zachować aby OS mógł poprawnie pracować po RESET:
 + 
 +== ZPG ==
-Rejestry ZPG, które należy bezwzględnie zachować aby OS mógł poprawnie pracować po RESET: 
* 9 - BOOT? * 9 - BOOT?
* A,B - DOSVEC * A,B - DOSVEC
* C,D - DOSINI (2,3 - CASINI kiedy BOOT był z kasety) * C,D - DOSINI (2,3 - CASINI kiedy BOOT był z kasety)
 +
 +== Nie ZPG ==
 +
 +* $33D..$33F - PUPBT1,2,3 = $5C, $93, $25
 +* $3FA - GINTLK = TRIG3
 +* $244 - COLDST = $00
 +* $3EB - CARTCK = suma wartości $BFF0..$C0EF
 +* $3F8 - BASICF (powoduje włączenie/wyłączenie BASICa)
 +
Reszta zostanie podczas gorącego startu poprawnie zainicjalizowana. Reszta zostanie podczas gorącego startu poprawnie zainicjalizowana.
 +
 +== ZPG użytkownika ==
 +
 +Procedura RESET zaciera zawartość niektórych rejestrów ZPG w obszarze użytkownika:
 +
 +* $8B..$8C - CKSUM
 +* $9E..$A1 - TMPREG
= PMG = = PMG =
Linia 318: Linia 351:
Kiedy DMA dla ekranu jest włączone (ustawiony bit 5 DMACTL/DMACTLS) w trybie 2 ANTIC-a (GR.0) na sprajtach pojawiają się śmieci z szyny danych. Skasowanie bitów 0 i 1 w PMCNTL powoduje, że w takim przypadku sprajty wyświetlane są poprawnie (!). Kiedy DMA dla ekranu jest włączone (ustawiony bit 5 DMACTL/DMACTLS) w trybie 2 ANTIC-a (GR.0) na sprajtach pojawiają się śmieci z szyny danych. Skasowanie bitów 0 i 1 w PMCNTL powoduje, że w takim przypadku sprajty wyświetlane są poprawnie (!).
-= PIA sound =+= Dźwięki =
http://www.atari.org.pl/forum/viewtopic.php?id=7284 http://www.atari.org.pl/forum/viewtopic.php?id=7284
 +http://www.atari.org.pl/forum/viewtopic.php?id=11798
 +
 += Klawiatura =
 +
 +http://members.casema.nl/hhaydn/howel/logic/burched/b5_800xl_kbd.htm
 +
 +[[Grafika:Atari800xl_kbd_matrix.gif]]
 +
 +http://www.atari.org.pl/forum/viewtopic.php?id=7837
 +
 +[[Grafika:Atarixl layout.png]]
= Skoki przez banki = = Skoki przez banki =
Linia 336: Linia 380:
;switchBANK0: ;switchBANK0:
-; sta sel+B1+; sta sel+B0
; rts ; rts
Linia 351: Linia 395:
callADDRfromB0: callADDRfromB0:
- jsr jumpADDR+ jsr jumpADDRtoBx
- jmp switchB0+ jmp switchBANK0
callADDRfromB1: callADDRfromB1:
- jsr jumpADDR+ jsr jumpADDRtoBx
- jmp switchB1+ jmp switchBANK1
... ...
-jumpADDR:+jumpADDRtoBx:
- jsr switch_toADDRBANK+ jsr switchBANKn ;switchBANK0, switchBANK1, itp.
jmp ADDR jmp ADDR
</pre> </pre>
-W każdym banku definiuje się etykietę callADDR na inny adres dzięki czemu skok miedzybankowy będzie zawsze wracał do banku z którego go wywołano.+W każdym banku definiuje się etykietę callADDR na inny adres dzięki czemu call międzybankowy będzie zawsze wracał do banku z którego go wywołano. jumpADDR definiujemy tylko dla ujednolicenia skoków z dowolnego banku.
 +Np. w banku 0:
<pre> <pre>
callADDR = callADDRfromB0 callADDR = callADDRfromB0
-...+jumpADDR = jumpADDRtoBx
 +</pre>
 +w bank 1
 +<pre>
 +callADDR = callADDRfromB1
 +jumpADDR = jumpADDRtoBx
 +</pre>
 +itd.
 +a w banku, w którym znajduje się procedura po prostu:
 +<pre>
 +callADDR = ADDR
 +jumpADDR = ADDR
</pre> </pre>
-Samą wywoływaną procedurę definiuje się tak, jak każdą inną:+Samą wywoływaną procedurę (w banku docelowym) definiuje się tak, jak każdą inną:
<pre> <pre>
ADDR: ADDR:
- nop+ ...
rts rts
</pre> </pre>
-Przy skokach w ramach banku używamy zwykłego+Przy skokach zawsze używamy już tylko zwykłego
-<pre>+
-jsr ADDR+
-jmp ADDR+
-</pre>+
- +
-Przy skokach międzybankowych używamy zawsze +
<pre> <pre>
jsr callADDR jsr callADDR
Linia 427: Linia 477:
== Format XF551 (DSDD) == == Format XF551 (DSDD) ==
 +
 +Jak w My DOS, ale sektor $5A0 niedostępny stąd $593 w total sectors a nie $594, no i 128 wpisów w directory.
* $168 * $168
Linia 467: Linia 519:
f0: 42 01 00 3b 00 31 33 20 20 20 20 20 20 54 58 54 | B..;.13 TXT f0: 42 01 00 3b 00 31 33 20 20 20 20 20 20 54 58 54 | B..;.13 TXT
</pre> </pre>
 +
 += TopDOS =
 +
 +Sygnatura fsa we VTOC = 3. Linki w kadym sektorze, jak w MyDOSie.
 +
 +== SD i DD ==
 +
 +Identyczne z DOS2.
 +
 +== MD ==
 +
 +VTOC jest w $168 od $0A..$7F. totalsec = $3A3
 +
 +== QD (DSDD) ==
 +
 +Bity we VTOC są liczone, jako 2-sektorowe klastry, lecz same sektory są 256b. Długości plików w katalogu również są liczone w sektorach.
 +
 += MUL =
 +
 +<pre>
 +;result=A+X*Y
 +;IN:A=8-bit component, X,Y=8-bit factors
 +;OUT:result=16-bit result, C=0, X=0
 +
 + org $80
 +factora .ds 1
 +factorb .ds 1
 +result = factora
 +
 +umul8816:
 + stx factora
 + sty factorb
 + ldx #8
 + lsr factora
 +?loop:
 + bcc ?skip
 + clc
 + adc factorb
 +?skip:
 + ror
 + ror factora
 + dex
 + bne ?loop
 + sta factorb
 + rts
 +</pre>
 +
 += Tryby graficzne =
 +
 +http://atarionline.pl/v01/index.php?subaction=showfull&id=1292663065&archive=1352242719&start_from=0&ucat=1&ct=nowinki&amp%3Bsub=S+inurl%3Asubaction%3Dshowfull+site%3APL&amp%3Bhl=ru&amp%3Bnum=10&amp%3Bct=clnk&amp%3Bsa=U&amp%3Bei=GWxcUtjGBcyBhAeU9IGABg&amp%3Bved=0CIsCEBYwRThk&amp%3Busg=AFQjCNHN_sqcet5bKVqaKw1T2UG7lLwn9w%2F%2Fimages%2Fstories%2Fexplore.gif&task=plugin&plugin=imgmanager&file=imgmanager&version=1576&cid=20&PHPSESSID=96f202c0f6e4b38c7560aca25ff8f26b&PHPSESSID=96f202c0f6e4b38c7560aca25ff8f26b
 +
 +http://atarionline.pl/v01/index.php?subaction=showfull&id=1293373279&archive=1352242719&start_from=0&ucat=1&ct=nowinki
 +
 +http://atarionline.pl/v01/index.php?subaction=showfull&id=1292683380&archive=1352242719&start_from=0&ucat=1&%253Bsub=2.%2BGrafika&%253Btg=Leonardo&ct=nowinki
 +
 +http://atariage.com/forums/topic/197450-mode-15-pal-blending/#entry2609821
 +
 +http://atariage.com/forums/topic/231181-move-along-folks-nothing-to-see-here/page-4
 +
 += Kable =
 +
 +Połączenie VBXE w standardzie Electrona (DB9) do monitora Commodore 1084-P (DIN6 lin RGB)
 +<pre>
 +DB9 - sygnał VBXE - DIN6 - sygnał monitora
 +--------------------------------------------------
 +1 - Red - 4 - Red
 +2 - Blue - 5 - Blue
 +3 - Green - 1 - Green
 +4 - RGB ctrl
 +5 - CVBS (luma + CSYNC)
 +6 - CSYNC - 2 - HSYNC
 +7 - GND
 +8 - GND - 3 - GND
 +9 - Audio
 + - 6 - VSYNC
 +</pre>
 +
 +Połączenie VBXE w standardzie Electrona (DB9) do monitora Phillips CM8833/00G (SCART)
 +<pre>
 +DB9 - sygnał VBXE - SCART - sygnał monitora
 +---------------------------------------------------
 +1 - Red - 15 - Red
 +2 - Blue - 7 - Blue
 +3 - Green - 11 - Green
 +4 - RGB ctrl - 16 - Fast switching
 +5 - CVBS (luma + CSYNC)
 +6 - CSYNC - 20 - Composite video input/Sync input
 +7 - GND - 9 - Green ground
 +8 - GND - 17 - Composite video output ground/Sync output ground
 +9 - Audio - 6 - Audio input left
 + - 1 - Audio output right
 + - 2 - Audio input right
 + - 3 - Audio output left
 + - 4 - Audio ground
 + - 5 - Blue ground
 + - 8 - Function switching
 + - 10 - D2B input
 + - 12 - D2B output
 + - 13 - Red ground
 + - 14 - D2B ground
 + - 18 - Composite video input ground/Sync input ground
 + - 19 - Composite video output/Sync output
 + - 21 - Common ground
 +</pre>
 +
 += TMC2 =
 +
 +Okno instrumentu:
 +<pre>
 +m
 +m
 +--------------------------
 +m
 +m
 +a
 +a
 +--------------------------
 +a
 +a
 +
 +DDDDDDDDDDDDDDDDDDDDDDDDDD
 +EEEEEEEEEEEEEEEEEEEEEEEEEE
 +PPPPPPPPPPPPPPPPPPPPPPPPPP
 +pppppppppppppppppppppppppp
 +
 + +IIt LL ll FF AM AA
 + RM RA Tt Td FT AT
 + A0 A1 A2 A3 A4 A5 A6 A7
 +</pre>
 +* m - głośność obwiedni głównej
 +* a - głośność obwiedni dodatkowej
 +* D - zniekształcenie
 +* E - efekt
 +* Pp - parametr efektu
 +* +IIt - numer instrumentu, - pusty, + niepusty, E-obydwie obwiednie puste, M-mono, A-dodatkowa obwienia ustawiona, S-stereo
 +* LL - długość obwiedni
 +* ll - zapętlenie
 +* FF - barwa filtru (przy filtrowanych dźwiękach 2-kanałowych)
 +* AM - główny AUDCTL (P9 T1 T3 12 34 13 24 15)
 +* AA - dodatkowy AUDCTL
 +* RM - prędkość opadania obwiedni głównej
 +* RA - prędkość opadania obwiedni dodatkowej
 +* Tt - typ dźwięku + parametr
 +* Td - opóźnienie rozpoczęcia działania typu dźwięku
 +* FT - tablica częstotliwości (2 najstarsze bity) + prędkość działania typu dźwięku (6 bitów)
 +* AT - ilość dźwięków w tablicy arpeggio + prędkość ich zmiany
 +* An - wartości transpozycji dla arpeggio
 +
 += PAL NTSC =
 +<pre>
 + ;IN: A=[$00..$EF]
 + ;OUT: A=[$00..$0F, $20..$FF]
 + pal2ntsc
 + cmp #$10
 + scc
 + adc #$10-1
 +
 + ;IN: A=[$00..$0F, $20..$FF]
 + ;OUT: A=[$00..$EF]
 + ntsc2pal
 + cmp #$10
 + scc
 + sbc #$10
 +</pre>
 +[[Grafika:Atari_pal_ntsc_shift.png]]
 +
 += Ilość linii TV =
 +
 +<pre>
 +sync1 lda VCOUNT
 +sync2 cmp VCOUNT
 + beq sync2
 + cmp VCOUNT
 + bcc sync1
 +</pre>
 +W akumulatorze znajdzie się ostatni nr linii skanningowej podzielony przez 2 ($9B dla PAL). Drugi CMP przed BCC jest niezbędny, ponieważ ANTIC wystawia przez jeden cykl wartość $9C więc pierwszy CMP zwróci C=0, ale LDA załaduje do akumulatora już 0 i program się będzie pętlił bez końca. Ten efekt opisał Simius http://www.atari.org.pl/forum/viewtopic.php?pid=101142#p101142 .
 +
 += Sampler =
 +
 +Crystal Sound
 +* https://atarionline.pl/v01/index.php?subaction=showfull&id=1288528907&archive=&start_from=0&ucat=5&ct=wywiady
 +* http://www.atari.org.pl/forum/viewtopic.php?id=15906
 +
 +Mirage A/D Converter
 +* http://www.atari.org.pl/forum/viewtopic.php?id=13133
 +* http://www.atari.org.pl/forum/viewtopic.php?id=7414

Wersja z dnia 15:46, 14 mar 2019

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.

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.

Bity zezwolenia na przerwanie:

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

Przerwanie dozwolone gdy bity zapalone.

Potwierdzenie przyjęcia przerwania odbywa się przez:

  • odczyt PORTA
  • odczyt PORTB

http://www.atari.org.pl/forum/viewtopic.php?pid=128292#p128292

Inne przerwania

  • PDVREG - nowe urządzenie

Bit zapalony w rejestrze odblokowuje przerwanie IRQ. Przerwanie wystąpiło, gdy bit w rejestrze zapalony. Potwierdzenie przyjęcia przerwania odbywa się przez zapalenie bitu w rejestrze.

  • Bit B rejestru stanu CPU - rozkaz BRK

Gdy bit zapalony wiadomo, że wystąpiło przerwanie BRK.

Nie potwierdza się przyjęcia, bo nie ma możliwości programowego skasowania bitu B - sekwencja:

lda #0
pha
plp

pozostawi w rejestrze znaczników wartość $30 czyli zapalony bit B i *.

Bajt następujący zaraz za rozkazem BRK jest ignorowany - RTI z obsługi BRK wraca dopiero do 2 bajtu po BRK.

Przerwanie można wygenerować również kiedy I jest zapalone (!), dobrze by więc było, aby procedura obsługi IRQ byla reentrant (chyba, że świadomie zabraniamy używania BRK w procedurach obsługi przerwań).

Przez większość czasu działania procesora B jest zapalone. B=0 tylko w momencie kiedy żąda się obsługi przerwania sprzętowego (np. od POKEYa) i taki stan jest podtrzymywany do końca sekwencji wejścia w przerwanie, po czym znowu jest zapalany. Z tego powodu testowanie czy wywołano rozkaz BRK odbywa się na wartości rejestru flagowego zostawionej na stosie przy wejściu w przerwanie, gdyż PHP+PLA pokaże B=1.

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

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 zablokowanie źródła przerwania powoduje że zgłoszenie nie pojawia się w IRQST.

lda #%00000100
ldx #%11111011
bit IRQST
bne *-3
stx IRQEN
ora IRQENS
sta IRQEN

Wektoryzowanie

sei
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 _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.

Komunikacja szeregowa

Jak wspomniano w tym wątku XMTDON jest aktywny (zgaszony) kiedy nie trwa właśnie emisja bajtu danych przez szynę szeregową, wpp będzie ustawiany w stan nieaktywny (zapalony) a ponieważ nie ma możliwości zdezaktywowania tego bitu w IRQST, zezwolenie w IRQEN na jego obsługę będzie powodowało ciągłe zgłaszanie przerwania poza chwilami kiedy trwa transmisja bajtu. Między przerwaniami nie zostanie wykonany ani jeden cykl programu użytkownika.

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.

Opóźnienia wywołania procedur obsługi przerwań IRQ

Ilość cykli o jakie opóźniona jest obsługa przerwania IRQ:

IRQENS=$10
KEYDIS=$26d

1. VSERIN - 43

2. VPIRQ - 46

3. VSEROR - 111

4. VSEROC - 125

od tej pory +5 cykli kiedy wystąpiło VSEROC i IRQENS.VSEROC=0

5. VTIMR1 - 158

6. VTIMR2 - 178

7. VTIMR4 - 198

8. VKBDKEY - 218

9. VBRKKEY - 243

od tej pory +18 cykli kiedy wystąpiło BRKKEY i KEYDIS=1

10. VPRCED - 214

11. VINTER - 221

12. VBREAK - 244

Całkowity czas trwania procedury IRQ kiedy nie jest obsługiwane żadne przerwanie wynosi 250 (+5+18=273) cykli.

Paczowanie przerwań IRQ na obsługę NMI

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

IRQSTAT

Rejestr jest ustawiany przez OS:

  • $FF - RESET
  • $00 - procedura obsługi przerwania klawisza BREAK
  • $80 - procedury edytora po obsłudze wciśnięcia klawisza BREAK
  • $88 - procedura odczytu z klawiatury po wciśnięciu CTRL+3
  • $FF - procedura otwarcia C: po obsłudze wciśnięcia klawisza BREAK
  • $FF - SIO po obsłudze wciśnięcia klawisza BREAK

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

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

 ror
 bit *-1
 rol

lub szybciej

  bit @
@:eor #0

BOOT

Rejestry, które należy bezwzględnie zachować aby OS mógł poprawnie pracować po RESET:

ZPG

  • 9 - BOOT?
  • A,B - DOSVEC
  • C,D - DOSINI (2,3 - CASINI kiedy BOOT był z kasety)

Nie ZPG

  • $33D..$33F - PUPBT1,2,3 = $5C, $93, $25
  • $3FA - GINTLK = TRIG3
  • $244 - COLDST = $00
  • $3EB - CARTCK = suma wartości $BFF0..$C0EF
  • $3F8 - BASICF (powoduje włączenie/wyłączenie BASICa)

Reszta zostanie podczas gorącego startu poprawnie zainicjalizowana.

ZPG użytkownika

Procedura RESET zaciera zawartość niektórych rejestrów ZPG w obszarze użytkownika:

  • $8B..$8C - CKSUM
  • $9E..$A1 - TMPREG

PMG

Kiedy sprajty chcemy malować nie używając DMA, a modyfikując rejestry GRAFxx, wtedy ustawienie PMG powinno przebiegać tak:

1. Kasujemy bity 2 i 3 w DMACTLS/DMACTL.

2. Ustawiamy bity 0 i 1 w PMCNTL.

Niestety działa to tylko przy wyłączonym DMA dla ekranu (skasowany bit 5 DMACTL/DMACTLS).

Kiedy DMA dla ekranu jest włączone (ustawiony bit 5 DMACTL/DMACTLS) w trybie 2 ANTIC-a (GR.0) na sprajtach pojawiają się śmieci z szyny danych. Skasowanie bitów 0 i 1 w PMCNTL powoduje, że w takim przypadku sprajty wyświetlane są poprawnie (!).

Dźwięki

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

Klawiatura

http://members.casema.nl/hhaydn/howel/logic/burched/b5_800xl_kbd.htm

Grafika:Atari800xl_kbd_matrix.gif

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

Grafika:Atarixl layout.png

Skoki przez banki

W kadym banku definiujemy zawsze stały blok składający się z procedur przełączających banki oraz tablicy międzybankowych skoków i wywołań procedur. Ważne jest, żeby w każdym banku był on umieszczony pod tym samym adresem, wtedy przełączenie banków nie skoczy w maliny.

switchBANK0:
  php
  pha
  lda #B0
  sta sel
  pla
  plp
  rts

;switchBANK0:
;  sta sel+B0
;  rts

switchBANK1:
  php
  pha
  lda #B1
  sta sel
  pla
  plp
  rts

  ...

callADDRfromB0:
  jsr jumpADDRtoBx
  jmp switchBANK0

callADDRfromB1:
  jsr jumpADDRtoBx
  jmp switchBANK1

  ...

jumpADDRtoBx:
  jsr switchBANKn  ;switchBANK0, switchBANK1, itp.
  jmp ADDR

W każdym banku definiuje się etykietę callADDR na inny adres dzięki czemu call międzybankowy będzie zawsze wracał do banku z którego go wywołano. jumpADDR definiujemy tylko dla ujednolicenia skoków z dowolnego banku.

Np. w banku 0:

callADDR = callADDRfromB0
jumpADDR = jumpADDRtoBx

w bank 1

callADDR = callADDRfromB1
jumpADDR = jumpADDRtoBx

itd. a w banku, w którym znajduje się procedura po prostu:

callADDR = ADDR
jumpADDR = ADDR

Samą wywoływaną procedurę (w banku docelowym) definiuje się tak, jak każdą inną:

ADDR:
  ...
  rts

Przy skokach zawsze używamy już tylko zwykłego

jsr callADDR
jmp jumpADDR

BiboDOS

Format SD i DD

Identyczny z DOS 2

Format MD

Jak w DOS 2.5, ale sektor $2D0 wolny stąd $3F3 w total sectors a nie $3F2.

  • $168
00: 02 f3 03 71 02 00 00 00 00 00 00 00 00 00 00 00 | .�.q............
10: 00 00 00 00 03 ff ff ff ff ff ff ff ff ff ff ff | .....�����������
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
30: ff ff ff ff ff ff ff 00 7f ff ff ff ff ff ff ff | �������.�������
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
60: ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 | ����............
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
  • $400
00: 00 00 00 00 03 ff ff ff ff ff ff ff ff ff ff ff | .....�����������
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
20: ff ff ff ff ff ff ff 00 7f ff ff ff ff ff ff ff | �������.�������
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
70: ff ff ff ff ff ff ff ff ff ff 30 01 00 00 00 00 | ����������0.....

Format XF551 (DSDD)

Jak w My DOS, ale sektor $5A0 niedostępny stąd $593 w total sectors a nie $594, no i 128 wpisów w directory.

  • $168
00: 03 93 05 22 05 00 00 00 00 00 00 00 00 00 00 00 | .�."............
10: 00 00 00 00 00 00 00 00 07 ff ff ff ff ff ff ff | .........�������
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
30: ff ff ff ff ff ff ff 00 7f ff ff ff ff ff ff ff | �������.�������
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ����������������
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff 00 00 | ��������������..
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
  • $169
00: 42 13 00 04 00 58 44 4f 53 20 20 20 20 53 59 53 | B....XDOS    SYS
10: 42 17 00 17 00 58 44 55 50 20 20 20 20 53 59 53 | B....XDUP    SYS
20: 42 01 00 2e 00 30 20 20 20 20 20 20 20 54 58 54 | B....0       TXT
30: 42 01 00 2f 00 31 20 20 20 20 20 20 20 54 58 54 | B../.1       TXT
40: 42 01 00 30 00 32 20 20 20 20 20 20 20 54 58 54 | B..0.2       TXT
50: 42 01 00 31 00 33 20 20 20 20 20 20 20 54 58 54 | B..1.3       TXT
60: 42 01 00 32 00 34 20 20 20 20 20 20 20 54 58 54 | B..2.4       TXT
70: 42 01 00 33 00 35 20 20 20 20 20 20 20 54 58 54 | B..3.5       TXT
80: 42 01 00 34 00 36 20 20 20 20 20 20 20 54 58 54 | B..4.6       TXT
90: 42 01 00 35 00 37 20 20 20 20 20 20 20 54 58 54 | B..5.7       TXT
a0: 42 01 00 36 00 38 20 20 20 20 20 20 20 54 58 54 | B..6.8       TXT
b0: 42 01 00 37 00 39 20 20 20 20 20 20 20 54 58 54 | B..7.9       TXT
c0: 42 01 00 38 00 31 30 20 20 20 20 20 20 54 58 54 | B..8.10      TXT
d0: 42 01 00 39 00 31 31 20 20 20 20 20 20 54 58 54 | B..9.11      TXT
e0: 42 01 00 3a 00 31 32 20 20 20 20 20 20 54 58 54 | B..:.12      TXT
f0: 42 01 00 3b 00 31 33 20 20 20 20 20 20 54 58 54 | B..;.13      TXT

TopDOS

Sygnatura fsa we VTOC = 3. Linki w kadym sektorze, jak w MyDOSie.

SD i DD

Identyczne z DOS2.

MD

VTOC jest w $168 od $0A..$7F. totalsec = $3A3

QD (DSDD)

Bity we VTOC są liczone, jako 2-sektorowe klastry, lecz same sektory są 256b. Długości plików w katalogu również są liczone w sektorach.

MUL

;result=A+X*Y
;IN:A=8-bit component, X,Y=8-bit factors
;OUT:result=16-bit result, C=0, X=0

  org $80
factora .ds 1
factorb .ds 1
result = factora

umul8816:
  stx factora
  sty factorb
  ldx #8
  lsr factora
?loop:
  bcc ?skip
  clc
  adc factorb
?skip:
  ror
  ror factora
  dex
  bne ?loop
  sta factorb
  rts

Tryby graficzne

http://atarionline.pl/v01/index.php?subaction=showfull&id=1292663065&archive=1352242719&start_from=0&ucat=1&ct=nowinki&amp%3Bsub=S+inurl%3Asubaction%3Dshowfull+site%3APL&amp%3Bhl=ru&amp%3Bnum=10&amp%3Bct=clnk&amp%3Bsa=U&amp%3Bei=GWxcUtjGBcyBhAeU9IGABg&amp%3Bved=0CIsCEBYwRThk&amp%3Busg=AFQjCNHN_sqcet5bKVqaKw1T2UG7lLwn9w%2F%2Fimages%2Fstories%2Fexplore.gif&task=plugin&plugin=imgmanager&file=imgmanager&version=1576&cid=20&PHPSESSID=96f202c0f6e4b38c7560aca25ff8f26b&PHPSESSID=96f202c0f6e4b38c7560aca25ff8f26b

http://atarionline.pl/v01/index.php?subaction=showfull&id=1293373279&archive=1352242719&start_from=0&ucat=1&ct=nowinki

http://atarionline.pl/v01/index.php?subaction=showfull&id=1292683380&archive=1352242719&start_from=0&ucat=1&%253Bsub=2.%2BGrafika&%253Btg=Leonardo&ct=nowinki

http://atariage.com/forums/topic/197450-mode-15-pal-blending/#entry2609821

http://atariage.com/forums/topic/231181-move-along-folks-nothing-to-see-here/page-4

Kable

Połączenie VBXE w standardzie Electrona (DB9) do monitora Commodore 1084-P (DIN6 lin RGB)

DB9 - sygnał VBXE         - DIN6 - sygnał monitora
--------------------------------------------------
1   - Red                 - 4    - Red
2   - Blue                - 5    - Blue
3   - Green               - 1    - Green
4   - RGB ctrl
5   - CVBS (luma + CSYNC)
6   - CSYNC               - 2    - HSYNC
7   - GND
8   - GND                 - 3    - GND
9   - Audio
                          - 6    - VSYNC

Połączenie VBXE w standardzie Electrona (DB9) do monitora Phillips CM8833/00G (SCART)

DB9 - sygnał VBXE         - SCART - sygnał monitora
---------------------------------------------------                                  
1   - Red                 - 15    - Red
2   - Blue                - 7     - Blue
3   - Green               - 11    - Green
4   - RGB ctrl            - 16    - Fast switching
5   - CVBS (luma + CSYNC)
6   - CSYNC               - 20    - Composite video input/Sync input
7   - GND                 - 9     - Green ground
8   - GND                 - 17    - Composite video output ground/Sync output ground
9   - Audio               - 6     - Audio input left
                          - 1     - Audio output right
                          - 2     - Audio input right
                          - 3     - Audio output left
                          - 4     - Audio ground
                          - 5     - Blue ground
                          - 8     - Function switching
                          - 10    - D2B input
                          - 12    - D2B output
                          - 13    - Red ground
                          - 14    - D2B ground
                          - 18    - Composite video input ground/Sync input ground
                          - 19    - Composite video output/Sync output
                          - 21    - Common ground

TMC2

Okno instrumentu:

m
m
--------------------------
m
m
a
a
--------------------------
a
a

DDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEE
PPPPPPPPPPPPPPPPPPPPPPPPPP
pppppppppppppppppppppppppp

     +IIt   LL ll FF AM AA
         RM RA Tt Td FT AT
   A0 A1 A2 A3 A4 A5 A6 A7
  • m - głośność obwiedni głównej
  • a - głośność obwiedni dodatkowej
  • D - zniekształcenie
  • E - efekt
  • Pp - parametr efektu
  • +IIt - numer instrumentu, - pusty, + niepusty, E-obydwie obwiednie puste, M-mono, A-dodatkowa obwienia ustawiona, S-stereo
  • LL - długość obwiedni
  • ll - zapętlenie
  • FF - barwa filtru (przy filtrowanych dźwiękach 2-kanałowych)
  • AM - główny AUDCTL (P9 T1 T3 12 34 13 24 15)
  • AA - dodatkowy AUDCTL
  • RM - prędkość opadania obwiedni głównej
  • RA - prędkość opadania obwiedni dodatkowej
  • Tt - typ dźwięku + parametr
  • Td - opóźnienie rozpoczęcia działania typu dźwięku
  • FT - tablica częstotliwości (2 najstarsze bity) + prędkość działania typu dźwięku (6 bitów)
  • AT - ilość dźwięków w tablicy arpeggio + prędkość ich zmiany
  • An - wartości transpozycji dla arpeggio

PAL NTSC

 ;IN: A=[$00..$EF]
 ;OUT: A=[$00..$0F, $20..$FF]
 pal2ntsc
 	cmp #$10
 	scc
 	adc #$10-1

 ;IN: A=[$00..$0F, $20..$FF]
 ;OUT: A=[$00..$EF]
 ntsc2pal
 	cmp #$10
 	scc
 	sbc #$10

Grafika:Atari_pal_ntsc_shift.png

Ilość linii TV

sync1 lda VCOUNT
sync2 cmp VCOUNT
      beq sync2
      cmp VCOUNT
      bcc sync1

W akumulatorze znajdzie się ostatni nr linii skanningowej podzielony przez 2 ($9B dla PAL). Drugi CMP przed BCC jest niezbędny, ponieważ ANTIC wystawia przez jeden cykl wartość $9C więc pierwszy CMP zwróci C=0, ale LDA załaduje do akumulatora już 0 i program się będzie pętlił bez końca. Ten efekt opisał Simius http://www.atari.org.pl/forum/viewtopic.php?pid=101142#p101142 .

Sampler

Crystal Sound

Mirage A/D Converter

Personal tools