Użytkownik:Mono
From Atariki
Wersja z dnia 17:14, 3 paź 2011 Mono (Dyskusja | wkład) (zabezpieczenia atr) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (link do quadtari) |
||
Linia 2: | Linia 2: | ||
= Mój brudnopis = | = Mój brudnopis = | ||
+ | |||
+ | * [https://atarionline.pl/1214355197 Program graficzny "Graph8" by Kaz 2008-06-25 02:53:17] | ||
+ | * [https://atarionline.pl/1218154840 "Storm Swiv" na Atari? by Kaz 2008-08-08 02:20:40] | ||
+ | * [https://atarionline.pl/1313524795 Produkcje od Mono by Xeen 2011-08-16 21:59:55] | ||
+ | * [http://atarionline.pl/v01/index.php?subaction=showfull&id=1704572629&archive=&start_from=20&ucat=1&ct=nowinki Śmierć śmieciom!] | ||
+ | * [http://atarionline.pl/v01/index.php?subaction=showfull&id=1704212955&archive=&start_from=20&ucat=1&ct=nowinki Nowy program kopiujący "Microcop 61KB"] | ||
+ | * [http://atarionline.pl/v01/index.php?subaction=showfull&id=1671835573&archive=&start_from=100&ucat=1&ct=nowinki Wesołych Świąt 2022!] | ||
+ | * [http://atarionline.pl/v01/index.php?subaction=showfull&id=1641069057&archive=&start_from=200&ucat=1&ct=nowinki Światowa premiera gry "Smok"] | ||
+ | * [http://atarionline.pl/v01/index.php?subaction=showfull&id=1468443682&archive=&start_from=800&ucat=1,7&ct=nowinki Emulacja ZX Spectrum na VBXE] | ||
+ | * [http://atarionline.pl/v01/index.php?subaction=showfull&id=1419102579&archive=&start_from=960&ucat=1,7&ct=nowinki BMPVIEW] | ||
+ | * [http://atarionline.pl/v01/index.php?subaction=showfull&id=1313524795&archive=&start_from=1500&ucat=1&ct=nowinki Produkcje od Mono] | ||
+ | * [http://atarionline.pl/v01/index.php?subaction=showfull&id=1313151313&archive=&start_from=1500&ucat=1&ct=nowinki TMC player] | ||
+ | * [https://atarionline.pl/forum/comments.php?DiscussionID=7371&page=1 Bliźniak - pierwszy w 2024 program dla Atari] | ||
Z systemem QMEG instalowana jest nieco zmodyfikowana czcionka standardowa (międzynarodowa została usunięta): | Z systemem QMEG instalowana jest nieco zmodyfikowana czcionka standardowa (międzynarodowa została usunięta): | ||
[[Grafika:Atari-qmeg.png]] | [[Grafika:Atari-qmeg.png]] | ||
+ | |||
+ | Pożyteczna strona: http://raster.infos.cz/atari/chars.htm | ||
[[Grafika:Atari-capek.png]] | [[Grafika:Atari-capek.png]] | ||
+ | |||
+ | [[Grafika:Atari-tcheko.gif]] | ||
[[Grafika:Simdrv.gif]] | [[Grafika:Simdrv.gif]] | ||
- | == ATR == | + | http://members.chello.nl/taf.offenga/ATP16.htm |
- | == Zabezpieczenia == | + | = Przerwania POKEY-a = |
- | W wersji 4.05 SIO2PC wprowadzono możliwość symulowania zabezpieczeń dla sektorów na dysku. | + | 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. | ||
- | Jeśli bit 4 btFlags jest ustawiony, wtedy począwszy od sektora podanego w wBad występują sektory z zabezpieczeniami. | + | Każde z wymienionych przerwań jest ''maskowalne'', co oznacza że istnieje możliwość zablokowania jego obsługi. |
- | Sektor taki zawiera zamiast danych informacje o użytych zabezpieczeniach. | + | 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: | ||
+ | # VSERIN ($20A) - odczyt bajtu z szyny szeregowej, | ||
+ | # VPIRQ ($238) - komunikacja z nowym urządzeniem, | ||
+ | # VSEROR ($20C) - opróżnienie bufora nadawczego szyny szeregowej, | ||
+ | # VSEROC ($20E) - koniec transmisji szeregowej, | ||
+ | # VTIMR1 ($210) - wyzerowanie licznika 1, | ||
+ | # VTIMR2 ($212) - wyzerowanie licznika 2, | ||
+ | # VTIMR4 ($214) - wyzerowanie licznika 4, | ||
+ | # VKEY ($208) - wciśnięcie klawisza, | ||
+ | # VBRKKEY ($236) - wciśnięcie klawisza Break. | ||
+ | # VPRCED ($202) - stan niski linii PROCEED w złączu SIO, | ||
+ | # VINTER ($204) - stan niski linii INTERRUPT w złączu SIO, | ||
+ | # 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 == | ||
- | <table BORDER="1" cellpadding="5" WIDTH="100%" cellspacing="0"> | + | sei |
- | <tr> | + | ldx vec |
- | <th>Offset</th> | + | ldy vec+1 |
- | <TH>Typ</TH> | + | stx _store_ |
- | <TH>Nazwa</TH> | + | sty _store_+1 |
- | <TH>Opis</TH> | + | ldx #<_procedura_ |
- | </tr> | + | 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 [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ń = | ||
+ | |||
+ | 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 | ||
+ | * https://forums.atariage.com/topic/292845-nmi-irq-collision-detection/ | ||
+ | <pre> | ||
+ | ;NMI request | ||
+ | ;0 - mark NMIST flag | ||
+ | ;1 - ack nmi by cpu | ||
+ | ;2 - ack nmi by cpu | ||
+ | ;3 - start interrupt sequence | ||
+ | |||
+ | ;BIT NMIST | ||
+ | ;0 - decode opcode | ||
+ | ;1 - fetch LSB $0F | ||
+ | ;2 - fetch MSB $D4 | ||
+ | ;3 - read $D40F | ||
+ | |||
+ | ;- nmi | ||
+ | ;- ack nmi | ||
+ | ;- ack ack nmi | ||
+ | ;- seq ----------------------- interrupt | ||
+ | ;- ack ack nmi BIT NMIST | ||
+ | ;- ack ack nmi fetch $0F | ||
+ | ;- ack ack nmi fetch $D4 | ||
+ | ;- ack ack nmi read $D40F | ||
+ | ;- seq seq seq seq ------- interrupt | ||
+ | ;- ack ack BPL XX | ||
+ | ;- ack fetch XX | ||
+ | ;- seq seq interrupt | ||
+ | |||
+ | ; <IRQ seq> ;DLI VBI IRQ | ||
+ | ; cld ;2 | ||
+ | ; jmp (VIMIRQ) ;5 5 | ||
+ | |||
+ | irqint bit NMIST ;4 4 | ||
+ | bpl ?vbl ;2 3 | ||
+ | bit NMIST | ||
+ | bpl ?vbl | ||
+ | jmp (VDSLST) | ||
+ | |||
+ | ?vbl bvc ?irq ; 2 3 | ||
+ | bit NMIST ; 4 | ||
+ | bvc ?irq ; 2 | ||
+ | ; cld | ||
+ | pha | ||
+ | txa | ||
+ | pha | ||
+ | tya | ||
+ | pha | ||
+ | sta NMIRES | ||
+ | jmp (VVBLKI) | ||
+ | |||
+ | ?irq jmp <previrq> ; 3 | ||
+ | </pre> | ||
+ | Opóźnienie IRQ i połatanego NMI to 13 cykli. | ||
+ | |||
+ | = 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 (!). | ||
+ | |||
+ | |||
+ | Cytat za: https://atariage.com/forums/topic/295004-priority_0-explanation/ | ||
+ | <pre>Priority_0 gives OR(ings) on PMGs over certain PFs colours so works like this (using charmodes Antic4 and/or 5): | ||
+ | |||
+ | -> PM0 over BAK = PM0 colour; | ||
+ | |||
+ | " " PF0 = PM0 OR PF0 colour; | ||
+ | |||
+ | " " PF1 = PM1 OR PF1 colour; | ||
+ | |||
+ | -> PM1 over BAK = PM1 colour; | ||
+ | |||
+ | " " PF0 = PM1 OR PF0 colour; | ||
+ | |||
+ | " " PF1 = PM1 OR PF1 colour; | ||
+ | |||
+ | -> PM2 over BAK = PM2 colour; | ||
+ | |||
+ | " " PF2 = PM2 OR PF2 colour; | ||
+ | |||
+ | " " PF3 = PM2 OR PF3 colour; | ||
+ | |||
+ | -> PM3 over BAK = PM3 colour; | ||
+ | |||
+ | " " PF2 = PM3 OR PF2 colour; | ||
+ | |||
+ | " " PF3 = PM3 OR PF3 colour; | ||
+ | |||
+ | This way you can have this 12colours more the 5 (BAK/PF0/PF1/PF2/PF3) makes 17colours per scanline possible. | ||
+ | |||
+ | |||
+ | |||
+ | If you take of the M (Missiles off) and use only P (Players) is still the same but the mIssiles acts as the 'so called' 5th Player and take PF3 colour. This way the Missiles themselves doesn't OR anything but if P2 or P3 goes over them it'll OR them because they're be considered as PF3 colour. | ||
+ | |||
+ | |||
+ | |||
+ | On Mode D and E bitmap modes this same thing happens but you don't have PF3 but you can still OR it if you have the Missiles as 5th Player and P2/P3 OR them. | ||
+ | |||
+ | |||
+ | |||
+ | Also if you go to PMGs multicolour mode that is PM0 OR PM1 and PM2 OR PM3 to above you'll have to add: | ||
+ | |||
+ | -> PM0 OR PM1 over BAK: PM0 OR PM1 colour; | ||
+ | |||
+ | " " PF0: (PM0 OR PM1) OR PF0 colour; | ||
+ | |||
+ | " " PF1: (PM0 OR PM1) OR PF1 colour; | ||
+ | |||
+ | -> PM2 OR PM3 over BAK: PM2 OR PM3 colour; | ||
+ | |||
+ | " " PF2: (PM2 OR PM3) OR PF2 colour; | ||
+ | |||
+ | " " PF3: (PM2 OR PM3) OR PF3 colour; | ||
+ | |||
+ | This way to 17colours above we'll add more 6colours and that is why you may have read that A8 can display maximum of 23colours per scanline. | ||
+ | </pre> | ||
+ | |||
+ | Zmiana pozycji ducha tak, żeby przykrywał część siebie https://atariage.com/forums/topic/156160-quantizator/page/15/?tab=comments#comment-2522917 i opisa Foxa za http://atarionline.pl/forum/comments.php?DiscussionID=1914&page=17#Item_9 | ||
+ | Duszki są generowane z rejestrów przesuwnych, każdy duszek i pocisk ma swój. Zwykle rejestr jest wypełniony zerami, a po dojściu do kolumny HPOS następuje OR (a nie załadowanie) zawartością GRAFxx. W przypadku szerokości pojedynczej daje to efekt taki, że duszek na nowej pozycji nakłada się na dusza na starej pozycji. W szerokości podwójnej i poczwórnej dochodzi dodatkowo dzielnik przez 2 lub 4, który jest resetowany w kolumnie HPOS. Oznacza to skrócenie obecnie rysowanego piksela. | ||
+ | |||
+ | Sprajty o szerokości %10 http://www.atari.org.pl/forum/viewtopic.php?id=12061 | ||
+ | |||
+ | = Dźwięki = | ||
+ | |||
+ | http://www.atari.org.pl/forum/viewtopic.php?id=7284 | ||
+ | http://www.atari.org.pl/forum/viewtopic.php?id=11798 | ||
+ | |||
+ | click | ||
+ | <pre> | ||
+ | F983: A2 7E LDX #$7E | ||
+ | F985: 48 PHA | ||
+ | F986: 8E 1F D0 STX $D01F ;CONSOL | ||
+ | F989: AD 0B D4 LDA $D40B ;VCOUNT | ||
+ | F98C: CD 0B D4 CMP $D40B ;VCOUNT | ||
+ | F98F: F0 FB BEQ $F98C | ||
+ | F991: CA DEX | ||
+ | F992: CA DEX | ||
+ | F993: 10 F1 BPL $F986 | ||
+ | F995: 68 PLA | ||
+ | </pre> | ||
+ | |||
+ | bell | ||
+ | <pre> | ||
+ | F556: A0 20 LDY #$20 | ||
+ | F558: 20 83 F9 JSR $F983 | ||
+ | F55B: 88 DEY | ||
+ | F55C: 10 FA BPL $F558 | ||
+ | </pre> | ||
+ | |||
+ | tape | ||
+ | <pre> | ||
+ | FDFE: A5 14 LDA $14 ;RTCLOK+2 | ||
+ | FE00: 18 CLC | ||
+ | FE01: A6 62 LDX $62 ;PALNTS | ||
+ | FE03: 7D 95 FE ADC $FE95,X | ||
+ | FE06: AA TAX | ||
+ | FE07: A9 FF LDA #$FF | ||
+ | FE09: 8D 1F D0 STA $D01F ;CONSOL | ||
+ | FE0C: A9 00 LDA #$00 | ||
+ | FE0E: A0 F0 LDY #$F0 | ||
+ | FE10: 88 DEY | ||
+ | FE11: D0 FD BNE $FE10 | ||
+ | FE13: 8D 1F D0 STA $D01F ;CONSOL | ||
+ | FE16: A0 F0 LDY #$F0 | ||
+ | FE18: 88 DEY | ||
+ | FE19: D0 FD BNE $FE18 | ||
+ | FE1B: E4 14 CPX $14 ;RTCLOK+2 | ||
+ | FE1D: D0 E8 BNE $FE07 | ||
+ | |||
+ | FE95: 1E 19 | ||
+ | </pre> | ||
+ | |||
+ | = Klawiatura = | ||
+ | |||
+ | http://members.casema.nl/hhaydn/howel/logic/burched/b5_800xl_kbd.htm | ||
+ | |||
+ | [[Grafika:Atari800xl_kbd_matrix.gif]] | ||
+ | [[Grafika:Atari800xl_kbd_matrix_modified.png]] | ||
+ | |||
+ | 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. | ||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | |||
+ | 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> | ||
+ | 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> | ||
+ | |||
+ | Samą wywoływaną procedurę (w banku docelowym) definiuje się tak, jak każdą inną: | ||
+ | |||
+ | <pre> | ||
+ | ADDR: | ||
+ | ... | ||
+ | rts | ||
+ | </pre> | ||
+ | |||
+ | Przy skokach zawsze używamy już tylko zwykłego | ||
+ | <pre> | ||
+ | jsr callADDR | ||
+ | jmp jumpADDR | ||
+ | </pre> | ||
+ | |||
+ | = 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 | ||
+ | <pre> | ||
+ | 00: 02 f3 03 71 02 00 00 00 00 00 00 00 00 00 00 00 | ................ | ||
+ | 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 | ................ | ||
+ | </pre> | ||
+ | |||
+ | * $400 | ||
+ | <pre> | ||
+ | 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 | ................ | ||
+ | </pre> | ||
+ | |||
+ | == 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 | ||
+ | <pre> | ||
+ | 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 | ................ | ||
+ | </pre> | ||
+ | |||
+ | * $169 | ||
+ | <pre> | ||
+ | 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 | ||
+ | </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 = | ||
+ | |||
+ | DIN http://atarionline.pl/1293373279 | ||
+ | |||
+ | Super IRG 2 http://atarionline.pl/1292683380 | ||
+ | |||
+ | Super IRG http://atarionline.pl/1292663065 | ||
+ | |||
+ | Interlace Super 0 http://atarionline.pl/1292785942 | ||
+ | |||
+ | Mode 15 PAL blending http://atariage.com/forums/topic/197450-mode-15-pal-blending/#entry2609821 | ||
+ | |||
+ | JAG http://atariage.com/forums/topic/231181-move-along-folks-nothing-to-see-here/page-4 | ||
+ | |||
+ | DGF http://atarionline.pl/v01/index.php?subaction=showfull&id=1361631036&archive=&start_from=0&ucat=1&ct=nowinki DGF | ||
+ | |||
+ | ICE font editor http://atarionline.pl/forum/comments.php?DiscussionID=450 | ||
+ | |||
+ | ICE https://forums.atariage.com/topic/188370-doing-pictures-using-super-irg-2-and-other-ice-modes/page/2/#comment-2392742 | ||
+ | |||
+ | 256/AP2 https://atarionline.pl/forum/comments.php?DiscussionID=303 https://atarionline.pl/forum/comments.php?DiscussionID=746 | ||
+ | |||
+ | GTIA https://atarionline.pl/forum/comments.php?DiscussionID=1159 | ||
+ | |||
+ | Assembloids XE https://atarionline.pl/forum/comments.php?DiscussionID=5860 https://a8.fandal.cz/detail.php?files_id=6857 | ||
+ | |||
+ | SHIMC https://atarionline.pl/forum/comments.php?DiscussionID=264 | ||
+ | |||
+ | = 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> | ||
+ | |||
+ | = CMC = | ||
+ | |||
+ | Okno instrumentu: | ||
+ | <pre> | ||
+ | v AB - akcent | ||
+ | v CD - brzmienie | ||
+ | --------------- | ||
+ | v EF - odstrojenie | ||
+ | v GG - wybrzmiewanie | ||
+ | aaaaaaaaaaaaaaa | ||
+ | </pre> | ||
+ | * v - głośność obwiedni głównej | ||
+ | * a - akcent | ||
+ | * A - odstrojenie od podstawy w półtonach dla akcentu: 0..c, d=C-5, e=G-5, f=D-6 | ||
+ | * B - rodzaj brzmienia akcentu: 0=8, 1=A, 2=2, 3=4 | ||
+ | * C - rodzaj brzmienia w nomenklaturze Atari (najmłodszy bit slide down) | ||
+ | * D - rodzaj brzmienia (najstarszy bit slide-up): 0=standardowy, 1=wibrujący, 2=standardowy, 3=bas (stroi niżej), 4=dudniący, 5=syntetyczny, 6=filtrowany, 7=czysty (stroi wyżej) | ||
+ | * E - odstrojenie od podstawy w półtonach | ||
+ | * F - odstrojenie od podstawy w półtonach dla instrumentów wibrujących i dwukanałowych | ||
+ | * G - tempo wybrzmiewania (00-brak) | ||
+ | |||
+ | = 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 SECAM NTSC VBXE = | ||
+ | <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]] | ||
+ | |||
+ | Według https://atariage.com/forums/topic/78402-colors/ | ||
+ | |||
+ | [[Grafika:Pal_ntsc_colors.png]] | ||
+ | |||
+ | [https://atariage.com/forums/topic/217620-automatic-color-replacement-based-on-region/?do=findComment&comment=2846661 wątek o konwersji kolorów na aage] | ||
+ | |||
+ | SECAM z LCD TV LG Flatron M1917A: | ||
+ | [[Grafika:Secam_colors_lcd_tv2.png]] | ||
+ | |||
+ | [https://atariage.com/forums/topic/312154-ntsc-fixes-unicum-spiky-harold/?do=findComment&comment=4649047 palety PAL i NTSC wg Wrathchild] | ||
+ | PAL: | ||
+ | [[Grafika:Pal_Wrathchild.png]] | ||
+ | NTSC: | ||
+ | [[Grafika:Ntsc_Wrathchild.png]] | ||
+ | |||
+ | VBXE przesunięcie w pionie w NTSC https://forums.atariage.com/topic/360599-vbxe-vertical-alignment/ | ||
+ | |||
+ | Pixel Aspect Ratio: https://pineight.com/mw/page/Dot_clock_rates.xhtml | ||
+ | * NTSC 2600/7800 - 12:7 = 1.714285714 | ||
+ | * NTSC Atari 800 - 6:7 = 0.857142857 | ||
- | <tr> | + | https://forums.atariage.com/topic/189995-confusion-with-aspect-ratios/#entry2403136 |
- | <td>$00</td> | + | * NTSC - 6.136MHz / 7.15909MHz = 0.8571 |
- | <td width="10%" align="center"> | + | * PAL - 7.375MHz / 7.093788MHz = 1.039642 |
- | DWORD | + | |
- | </td> | + | |
- | <td width="10%" align="center"> | + | |
- | ? | + | |
- | </td> | + | |
- | <td> | + | |
- | Kolejno wartości: $C2, $1C, $3D i $1E (sygnatura sektora z zabezpieczeniami). | + | |
- | </td> | + | |
- | </tr> | + | |
- | <tr> | + | = Ilość linii TV = |
- | <td>$04</td> | + | |
- | <td width="10%" align="center"> | + | |
- | DWORD | + | |
- | </td> | + | |
- | <td width="10%" align="center"> | + | |
- | ? | + | |
- | </td> | + | |
- | <td> | + | |
- | 4 bajty zwracane przez komendę STATUS ("S" = $53) SIO (podane w odwrotnej kolejności), po próbie odczytu <b>BŁĘDNEGO</b> sektora. | + | |
- | </td> | + | |
- | </tr> | + | |
- | <tr> | + | <pre> |
- | <td>$08</td> | + | sync1 lda VCOUNT |
- | <td width="10%" align="center"> | + | sync2 cmp VCOUNT |
- | BYTE | + | beq sync2 |
- | </td> | + | cmp VCOUNT |
- | <td width="10%" align="center"> | + | bcc sync1 |
- | ? | + | </pre> |
- | </td> | + | 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ł co najmniej jedną ramkę za dużo (w przypadku Rapidusa nawet bez końca). Ten efekt opisał Simius http://www.atari.org.pl/forum/viewtopic.php?pid=101142#p101142 . |
- | <td> | + | |
- | Status zwracany po otrzymaniu komendy ("A" lub "N").[1] | + | |
- | </td> | + | |
- | </tr> | + | |
- | <tr> | + | Procedura może być też używana do synchronizowania z ramką choć prościej oczywiście: |
- | <td>$09</td> | + | <pre> |
- | <td width="10%" align="center"> | + | sync lda VCOUNT |
- | BYTE | + | bne sync |
- | </td> | + | </pre> |
- | <td width="10%" align="center"> | + | |
- | ? | + | |
- | </td> | + | |
- | <td> | + | |
- | Status zwracany po otrzymaniu bloku danych ("C" lub "A"/"E").[1] | + | |
- | </td> | + | |
- | </tr> | + | |
- | <tr> | + | Chyba najbezpieczniej: |
- | <td>$0A</td> | + | <pre> |
- | <td width="10%" align="center"> | + | sync1 ldx VCOUNT |
- | BYTE | + | bpl sync1 |
- | </td> | + | sync2 txa |
- | <td width="10%" align="center"> | + | ldx VCOUNT |
- | ? | + | bmi sync2 |
- | </td> | + | </pre> |
- | <td> | + | |
- | Informacja o sumie kontrolnej ("G" - poprawna, lub "B" - błędna).[1] | + | |
- | </td> | + | |
- | </tr> | + | |
- | <tr> | + | = Sampler = |
- | <td>$0B</td> | + | |
- | <td width="10%" align="center"> | + | |
- | BYTE | + | |
- | </td> | + | |
- | <td width="10%" align="center"> | + | |
- | ? | + | |
- | </td> | + | |
- | <td> | + | |
- | Czas, po którym ma zostać wysłana odpowiedź na odczyt ("R") bądź zapis ("P"/"W") <b>POPRAWNEGO</b> sektora.[2] | + | |
- | </td> | + | |
- | </tr> | + | |
- | <tr> | + | Crystal Sound |
- | <td>$0C</td> | + | * https://atarionline.pl/v01/index.php?subaction=showfull&id=1288528907&archive=&start_from=0&ucat=5&ct=wywiady |
- | <td width="10%" align="center"> | + | * http://www.atari.org.pl/forum/viewtopic.php?id=15906 |
- | BYTE | + | |
- | </td> | + | |
- | <td width="10%" align="center"> | + | |
- | ? | + | |
- | </td> | + | |
- | <td> | + | |
- | Czas, po którym ma zostać wysłana odpowiedź na odczyt ("R") <b>BŁĘDNEGO</b> sektora.[2] | + | |
- | </td> | + | |
- | </tr> | + | |
- | <tr> | + | Mirage A/D Converter |
- | <td>$0D</td> | + | * http://www.atari.org.pl/forum/viewtopic.php?id=13133 |
- | <td width="10%" align="center"> | + | * http://www.atari.org.pl/forum/viewtopic.php?id=7414 |
- | DWORD | + | |
- | </td> | + | |
- | <td width="10%" align="center"> | + | |
- | ? | + | |
- | </td> | + | |
- | <td> | + | |
- | 4 bajty zwracane przez komendę STATUS ("S" = $53) SIO (podane w odwrotnej kolejności), po próbie odczytu <b>POPRAWNEGO</b> sektora. | + | |
- | </td> | + | |
- | </tr> | + | |
- | </table> | + | = Joystick = |
- | # "_" oznacza, że zawartość bajtu nie ma znaczenia, "T" oznacza brak odpowiedzi (TIMEOUT u odbiorcy). | + | * SNES2JOY https://atariage.com/forums/topic/270062-next-hardware-project-snes2joy POTA (Select/Y/B) i POTB (X/A/Start) rezystory są dobrane tak, żeby mapowane były 3 bity https://github.com/ivop/snes2joy |
- | # Czas mierzony jest w 55 ms jednostkach (ang. "jiffy" - odwrotność 18.2 Hz). | + | * JOY2B+ https://atariage.com/forums/topic/278884-2-button-joystick https://github.com/ascrnet/Joy2Bplus POTx ($E4 pressed - można wykorzystać do detekcji przy wejściu do programu) |
+ | * Pajero http://www.atari.org.pl/forum/viewtopic.php?id=7842 | ||
+ | * Mq http://www.atari.org.pl/forum/viewtopic.php?id=14670 i https://atarionline.pl/forum/comments.php?DiscussionID=5671 | ||
+ | * Raster/CPU Multijoy (8 lub 16) https://atari8bit.net/projects/hardware/multijoy/ [[Multi Joy 8]] | ||
+ | * Multifire https://atari8bit.net/projects/hardware/multifire/ | ||
+ | * Krupkaj MXPad http://www.krupkaj.cz/sblog/article_detail.php?itmid=9000035 | ||
+ | * C64 joystick modifications http://wiki.icomp.de/wiki/DB9-Joystick#2.2F3_Button_modification | ||
+ | * C64 5+ buttons joystick https://github.com/crystalct/5plusbuttonsJoystick | ||
+ | * 7800 two buttons https://forums.atariage.com/topic/127162-question-about-joysticks-and-how-they-are-read/?do=findComment&comment=1537159 lub https://forums.atariage.com/topic/333116-7800-controller-resistor-values/ | ||
+ | * Co to jest "sluggish controls"? https://www.c64scene.pl/viewtopic.php?p=50967#p50967 I wideo od Borga https://www.youtube.com/watch?v=XV-TbSDoMQ8&t=308s | ||
+ | * 2600 QuadTari https://www.bitethechili.com/quadtari/ |
Aktualna wersja
Mój brudnopis
- Program graficzny "Graph8" by Kaz 2008-06-25 02:53:17
- "Storm Swiv" na Atari? by Kaz 2008-08-08 02:20:40
- Produkcje od Mono by Xeen 2011-08-16 21:59:55
- Śmierć śmieciom!
- Nowy program kopiujący "Microcop 61KB"
- Wesołych Świąt 2022!
- Światowa premiera gry "Smok"
- Emulacja ZX Spectrum na VBXE
- BMPVIEW
- Produkcje od Mono
- TMC player
- Bliźniak - pierwszy w 2024 program dla Atari
Z systemem QMEG instalowana jest nieco zmodyfikowana czcionka standardowa (międzynarodowa została usunięta):
Pożyteczna strona: http://raster.infos.cz/atari/chars.htm
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:
- VSERIN ($20A) - odczyt bajtu z szyny szeregowej,
- VPIRQ ($238) - komunikacja z nowym urządzeniem,
- VSEROR ($20C) - opróżnienie bufora nadawczego szyny szeregowej,
- VSEROC ($20E) - koniec transmisji szeregowej,
- VTIMR1 ($210) - wyzerowanie licznika 1,
- VTIMR2 ($212) - wyzerowanie licznika 2,
- VTIMR4 ($214) - wyzerowanie licznika 4,
- VKEY ($208) - wciśnięcie klawisza,
- VBRKKEY ($236) - wciśnięcie klawisza Break.
- VPRCED ($202) - stan niski linii PROCEED w złączu SIO,
- VINTER ($204) - stan niski linii INTERRUPT w złączu SIO,
- 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
- https://forums.atariage.com/topic/292845-nmi-irq-collision-detection/
;NMI request ;0 - mark NMIST flag ;1 - ack nmi by cpu ;2 - ack nmi by cpu ;3 - start interrupt sequence ;BIT NMIST ;0 - decode opcode ;1 - fetch LSB $0F ;2 - fetch MSB $D4 ;3 - read $D40F ;- nmi ;- ack nmi ;- ack ack nmi ;- seq ----------------------- interrupt ;- ack ack nmi BIT NMIST ;- ack ack nmi fetch $0F ;- ack ack nmi fetch $D4 ;- ack ack nmi read $D40F ;- seq seq seq seq ------- interrupt ;- ack ack BPL XX ;- ack fetch XX ;- seq seq interrupt ; <IRQ seq> ;DLI VBI IRQ ; cld ;2 ; jmp (VIMIRQ) ;5 5 irqint bit NMIST ;4 4 bpl ?vbl ;2 3 bit NMIST bpl ?vbl jmp (VDSLST) ?vbl bvc ?irq ; 2 3 bit NMIST ; 4 bvc ?irq ; 2 ; cld pha txa pha tya pha sta NMIRES jmp (VVBLKI) ?irq jmp <previrq> ; 3
Opóźnienie IRQ i połatanego NMI to 13 cykli.
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 (!).
Cytat za: https://atariage.com/forums/topic/295004-priority_0-explanation/
Priority_0 gives OR(ings) on PMGs over certain PFs colours so works like this (using charmodes Antic4 and/or 5): -> PM0 over BAK = PM0 colour; " " PF0 = PM0 OR PF0 colour; " " PF1 = PM1 OR PF1 colour; -> PM1 over BAK = PM1 colour; " " PF0 = PM1 OR PF0 colour; " " PF1 = PM1 OR PF1 colour; -> PM2 over BAK = PM2 colour; " " PF2 = PM2 OR PF2 colour; " " PF3 = PM2 OR PF3 colour; -> PM3 over BAK = PM3 colour; " " PF2 = PM3 OR PF2 colour; " " PF3 = PM3 OR PF3 colour; This way you can have this 12colours more the 5 (BAK/PF0/PF1/PF2/PF3) makes 17colours per scanline possible. If you take of the M (Missiles off) and use only P (Players) is still the same but the mIssiles acts as the 'so called' 5th Player and take PF3 colour. This way the Missiles themselves doesn't OR anything but if P2 or P3 goes over them it'll OR them because they're be considered as PF3 colour. On Mode D and E bitmap modes this same thing happens but you don't have PF3 but you can still OR it if you have the Missiles as 5th Player and P2/P3 OR them. Also if you go to PMGs multicolour mode that is PM0 OR PM1 and PM2 OR PM3 to above you'll have to add: -> PM0 OR PM1 over BAK: PM0 OR PM1 colour; " " PF0: (PM0 OR PM1) OR PF0 colour; " " PF1: (PM0 OR PM1) OR PF1 colour; -> PM2 OR PM3 over BAK: PM2 OR PM3 colour; " " PF2: (PM2 OR PM3) OR PF2 colour; " " PF3: (PM2 OR PM3) OR PF3 colour; This way to 17colours above we'll add more 6colours and that is why you may have read that A8 can display maximum of 23colours per scanline.
Zmiana pozycji ducha tak, żeby przykrywał część siebie https://atariage.com/forums/topic/156160-quantizator/page/15/?tab=comments#comment-2522917 i opisa Foxa za http://atarionline.pl/forum/comments.php?DiscussionID=1914&page=17#Item_9 Duszki są generowane z rejestrów przesuwnych, każdy duszek i pocisk ma swój. Zwykle rejestr jest wypełniony zerami, a po dojściu do kolumny HPOS następuje OR (a nie załadowanie) zawartością GRAFxx. W przypadku szerokości pojedynczej daje to efekt taki, że duszek na nowej pozycji nakłada się na dusza na starej pozycji. W szerokości podwójnej i poczwórnej dochodzi dodatkowo dzielnik przez 2 lub 4, który jest resetowany w kolumnie HPOS. Oznacza to skrócenie obecnie rysowanego piksela.
Sprajty o szerokości %10 http://www.atari.org.pl/forum/viewtopic.php?id=12061
Dźwięki
http://www.atari.org.pl/forum/viewtopic.php?id=7284 http://www.atari.org.pl/forum/viewtopic.php?id=11798
click
F983: A2 7E LDX #$7E F985: 48 PHA F986: 8E 1F D0 STX $D01F ;CONSOL F989: AD 0B D4 LDA $D40B ;VCOUNT F98C: CD 0B D4 CMP $D40B ;VCOUNT F98F: F0 FB BEQ $F98C F991: CA DEX F992: CA DEX F993: 10 F1 BPL $F986 F995: 68 PLA
bell
F556: A0 20 LDY #$20 F558: 20 83 F9 JSR $F983 F55B: 88 DEY F55C: 10 FA BPL $F558
tape
FDFE: A5 14 LDA $14 ;RTCLOK+2 FE00: 18 CLC FE01: A6 62 LDX $62 ;PALNTS FE03: 7D 95 FE ADC $FE95,X FE06: AA TAX FE07: A9 FF LDA #$FF FE09: 8D 1F D0 STA $D01F ;CONSOL FE0C: A9 00 LDA #$00 FE0E: A0 F0 LDY #$F0 FE10: 88 DEY FE11: D0 FD BNE $FE10 FE13: 8D 1F D0 STA $D01F ;CONSOL FE16: A0 F0 LDY #$F0 FE18: 88 DEY FE19: D0 FD BNE $FE18 FE1B: E4 14 CPX $14 ;RTCLOK+2 FE1D: D0 E8 BNE $FE07 FE95: 1E 19
Klawiatura
http://members.casema.nl/hhaydn/howel/logic/burched/b5_800xl_kbd.htm
http://www.atari.org.pl/forum/viewtopic.php?id=7837
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 | ................ 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 | ................
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
DIN http://atarionline.pl/1293373279
Super IRG 2 http://atarionline.pl/1292683380
Super IRG http://atarionline.pl/1292663065
Interlace Super 0 http://atarionline.pl/1292785942
Mode 15 PAL blending http://atariage.com/forums/topic/197450-mode-15-pal-blending/#entry2609821
JAG http://atariage.com/forums/topic/231181-move-along-folks-nothing-to-see-here/page-4
ICE font editor http://atarionline.pl/forum/comments.php?DiscussionID=450
256/AP2 https://atarionline.pl/forum/comments.php?DiscussionID=303 https://atarionline.pl/forum/comments.php?DiscussionID=746
GTIA https://atarionline.pl/forum/comments.php?DiscussionID=1159
Assembloids XE https://atarionline.pl/forum/comments.php?DiscussionID=5860 https://a8.fandal.cz/detail.php?files_id=6857
SHIMC https://atarionline.pl/forum/comments.php?DiscussionID=264
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
CMC
Okno instrumentu:
v AB - akcent v CD - brzmienie --------------- v EF - odstrojenie v GG - wybrzmiewanie aaaaaaaaaaaaaaa
- v - głośność obwiedni głównej
- a - akcent
- A - odstrojenie od podstawy w półtonach dla akcentu: 0..c, d=C-5, e=G-5, f=D-6
- B - rodzaj brzmienia akcentu: 0=8, 1=A, 2=2, 3=4
- C - rodzaj brzmienia w nomenklaturze Atari (najmłodszy bit slide down)
- D - rodzaj brzmienia (najstarszy bit slide-up): 0=standardowy, 1=wibrujący, 2=standardowy, 3=bas (stroi niżej), 4=dudniący, 5=syntetyczny, 6=filtrowany, 7=czysty (stroi wyżej)
- E - odstrojenie od podstawy w półtonach
- F - odstrojenie od podstawy w półtonach dla instrumentów wibrujących i dwukanałowych
- G - tempo wybrzmiewania (00-brak)
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 SECAM NTSC VBXE
;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
Według https://atariage.com/forums/topic/78402-colors/
wątek o konwersji kolorów na aage
SECAM z LCD TV LG Flatron M1917A:
palety PAL i NTSC wg Wrathchild PAL: NTSC:
VBXE przesunięcie w pionie w NTSC https://forums.atariage.com/topic/360599-vbxe-vertical-alignment/
Pixel Aspect Ratio: https://pineight.com/mw/page/Dot_clock_rates.xhtml
- NTSC 2600/7800 - 12:7 = 1.714285714
- NTSC Atari 800 - 6:7 = 0.857142857
https://forums.atariage.com/topic/189995-confusion-with-aspect-ratios/#entry2403136
- NTSC - 6.136MHz / 7.15909MHz = 0.8571
- PAL - 7.375MHz / 7.093788MHz = 1.039642
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ł co najmniej jedną ramkę za dużo (w przypadku Rapidusa nawet bez końca). Ten efekt opisał Simius http://www.atari.org.pl/forum/viewtopic.php?pid=101142#p101142 .
Procedura może być też używana do synchronizowania z ramką choć prościej oczywiście:
sync lda VCOUNT bne sync
Chyba najbezpieczniej:
sync1 ldx VCOUNT bpl sync1 sync2 txa ldx VCOUNT bmi sync2
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
Joystick
- SNES2JOY https://atariage.com/forums/topic/270062-next-hardware-project-snes2joy POTA (Select/Y/B) i POTB (X/A/Start) rezystory są dobrane tak, żeby mapowane były 3 bity https://github.com/ivop/snes2joy
- JOY2B+ https://atariage.com/forums/topic/278884-2-button-joystick https://github.com/ascrnet/Joy2Bplus POTx ($E4 pressed - można wykorzystać do detekcji przy wejściu do programu)
- Pajero http://www.atari.org.pl/forum/viewtopic.php?id=7842
- Mq http://www.atari.org.pl/forum/viewtopic.php?id=14670 i https://atarionline.pl/forum/comments.php?DiscussionID=5671
- Raster/CPU Multijoy (8 lub 16) https://atari8bit.net/projects/hardware/multijoy/ Multi Joy 8
- Multifire https://atari8bit.net/projects/hardware/multifire/
- Krupkaj MXPad http://www.krupkaj.cz/sblog/article_detail.php?itmid=9000035
- C64 joystick modifications http://wiki.icomp.de/wiki/DB9-Joystick#2.2F3_Button_modification
- C64 5+ buttons joystick https://github.com/crystalct/5plusbuttonsJoystick
- 7800 two buttons https://forums.atariage.com/topic/127162-question-about-joysticks-and-how-they-are-read/?do=findComment&comment=1537159 lub https://forums.atariage.com/topic/333116-7800-controller-resistor-values/
- Co to jest "sluggish controls"? https://www.c64scene.pl/viewtopic.php?p=50967#p50967 I wideo od Borga https://www.youtube.com/watch?v=XV-TbSDoMQ8&t=308s
- 2600 QuadTari https://www.bitethechili.com/quadtari/