Programowanie: Detekcja stereo
From Atariki
Wersja z dnia 09:44, 21 lut 2014 0xF (Dyskusja | wkład) (→Metoda nr 2 - Krócej o bajt i dwa cykle) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (→Metoda nr 1 - formatowanie kodu) |
||
Linia 1: | Linia 1: | ||
== Metoda nr 1 == | == Metoda nr 1 == | ||
- | Metoda zaproponowana w wątku [http://atariarea.krap.pl/forum/viewtopic.php?id=5350 Detekcja STEREO - tester] przez Sebana/SLIGHT polega na założeniu, że drugi POKEY podłączony w obszarze $D210..$D21F nie ma podłączonych przerwań IRQ. Próba uaktywnienia przerwania licznika 1 drugiego POKEYa nie powinna wygenerować przerwania IRQ. Jeśli przerwanie jednak wystąpiło, można założyć że rozszerzenie nie jest obecne i adresowanie jego obszaru zainicjalizowało w rzeczywistości przerwanie IRQ licznika 1 standardowego POKEYa znajdującego się w obszarze $D200..$D20F (jest to konsekwencją uproszczonej budowy dekodera adresów). | + | Metoda zaproponowana w wątku [http://atariarea.krap.pl/forum/viewtopic.php?id=5350 Detekcja STEREO - tester] przez [[Seban|Sebana/SLIGHT]] polega na założeniu, że drugi POKEY podłączony w obszarze $D210..$D21F nie ma podłączonych przerwań IRQ. Próba uaktywnienia przerwania licznika 1 drugiego POKEYa nie powinna wygenerować przerwania IRQ. Jeśli przerwanie jednak wystąpiło, można założyć że rozszerzenie nie jest obecne i adresowanie jego obszaru zainicjalizowało w rzeczywistości przerwanie IRQ licznika 1 standardowego POKEYa znajdującego się w obszarze $D200..$D20F (jest to konsekwencją uproszczonej budowy dekodera adresów). |
<pre> | <pre> | ||
* ----------------------------- | * ----------------------------- | ||
Linia 11: | Linia 11: | ||
* ----------------------------- | * ----------------------------- | ||
- | st sei ; disable IRQ | + | st sei ; disable IRQ |
inc $d40e ; disable NMI | inc $d40e ; disable NMI | ||
- | lda #$03 ; A reg=3 | + | lda #$03 ; A reg=3 |
sta $d21f ; init POKEY | sta $d21f ; init POKEY | ||
sta $d210 ; set freq of channel #1 (timer #1) | sta $d210 ; set freq of channel #1 (timer #1) | ||
- | ldx #$00 ; X reg=0 | + | ldx #$00 ; X reg=0 |
stx $d211 ; set volume of channel #1 to zero | stx $d211 ; set volume of channel #1 to zero | ||
- | inx ; X reg=1 | + | inx ; X reg=1 |
stx $d21e ; enable TIMER1 IRQ | stx $d21e ; enable TIMER1 IRQ | ||
ldx $d40b ; wait for scan line #0 | ldx $d40b ; wait for scan line #0 | ||
Linia 24: | Linia 24: | ||
stx $d219 ; start POKEY TIMERS | stx $d219 ; start POKEY TIMERS | ||
w ldx $d40b ; check current scan line | w ldx $d40b ; check current scan line | ||
- | bmi ext ; when >=128 and no IRQ is present second POKEY detected! EXIT! | + | bmi ext ; when >=128 and no IRQ is present second POKEY detected! EXIT! |
- | lda #$01 ; check POKEY TIMER1 IRQ status | + | lda #$01 ; check POKEY TIMER1 IRQ status |
bit $d20e | bit $d20e | ||
- | bne w ; when no IRQ is present... loopback! | + | bne w ; when no IRQ is present... loopback! |
- | ; if IRQ is present, it means no second pokey detected! | + | ; if IRQ is present, it means no second pokey detected! |
- | ; X reg have zero value | + | ; X reg have zero value |
- | ext lda $10 ; restore IRQ mask | + | ext lda $10 ; restore IRQ mask |
sta $d20e | sta $d20e | ||
dec $d40e ; enable NMI | dec $d40e ; enable NMI | ||
- | cli ; enable IRQ | + | cli ; enable IRQ |
- | txa ; X to A | + | txa ; X to A |
- | rts ; exit | + | rts ; exit |
</pre> | </pre> | ||
Linia 69: | Linia 69: | ||
;X=0 - mono | ;X=0 - mono | ||
;X=1 - stereo | ;X=1 - stereo | ||
+ | </pre> | ||
+ | |||
+ | == Metoda nr 3 == | ||
+ | Zaproponowana przez [[XI|XI/Satantronic]] w 2007 roku i wykorzystana w programie [http://atarionline.pl/v01/index.php?ct=utils&sub=F.%20Diagnostyczne&tg=Stereo%20upgrade%20tester#Stereo%20upgrade%20tester Stereo upgrade tester], a bazująca na tym że do drugiego POKEY-a nie jest podłączona klawiatura, w wyniku czego z [[Rejestry_POKEY-a#KBCODE|KBCODE]] będzie zawsze czytana wartość $00. Niestety również pierwszy POKEY zwróci tę samą wartość po resecie aż do chwili kiedy zostanie wciśnięty dowolny klawisz prócz L (który ma właśnie [[Kody klawiszy|kod $00]]), jak i po wciśnięciu klawisza L. | ||
+ | <pre> | ||
+ | detect_stereo: | ||
+ | lda KBCODE ;$D209 | ||
+ | cmp KBCODE+$10 ;$D209+$10 | ||
+ | rts ;Z=0 - stereo | ||
+ | ;Z=1 - mono | ||
</pre> | </pre> | ||
[[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] |
Aktualna wersja
Metoda nr 1
Metoda zaproponowana w wątku Detekcja STEREO - tester przez Sebana/SLIGHT polega na założeniu, że drugi POKEY podłączony w obszarze $D210..$D21F nie ma podłączonych przerwań IRQ. Próba uaktywnienia przerwania licznika 1 drugiego POKEYa nie powinna wygenerować przerwania IRQ. Jeśli przerwanie jednak wystąpiło, można założyć że rozszerzenie nie jest obecne i adresowanie jego obszaru zainicjalizowało w rzeczywistości przerwanie IRQ licznika 1 standardowego POKEYa znajdującego się w obszarze $D200..$D20F (jest to konsekwencją uproszczonej budowy dekodera adresów).
* ----------------------------- * |second POKEY detect routine| * | answer in A register: | * |$00 - absent $80 - present | * ----------------------------- * | code & idea: Seban/SLIGHT | * |-+* (c) 1995,96 Slight! *+-| * ----------------------------- st sei ; disable IRQ inc $d40e ; disable NMI lda #$03 ; A reg=3 sta $d21f ; init POKEY sta $d210 ; set freq of channel #1 (timer #1) ldx #$00 ; X reg=0 stx $d211 ; set volume of channel #1 to zero inx ; X reg=1 stx $d21e ; enable TIMER1 IRQ ldx $d40b ; wait for scan line #0 bne *-3 stx $d219 ; start POKEY TIMERS w ldx $d40b ; check current scan line bmi ext ; when >=128 and no IRQ is present second POKEY detected! EXIT! lda #$01 ; check POKEY TIMER1 IRQ status bit $d20e bne w ; when no IRQ is present... loopback! ; if IRQ is present, it means no second pokey detected! ; X reg have zero value ext lda $10 ; restore IRQ mask sta $d20e dec $d40e ; enable NMI cli ; enable IRQ txa ; X to A rts ; exit
Metoda nr 2
Zaproponowana przez KMK wykorzystuje fakt, że po wprowadzeniu układu POKEY w stan "reset" rejestr RANDOM osiąga w przeciągu kilku cykli wartość $FF i utrzymuje ją.
detect_stereo ldx #$00 stx $d20f ;halt pokey 0 stx $d21f ;halt pokey 1 ldy #$03 sty $d21f ;release pokey 1 sta $d40a ;delay necessary for sta $d40a ;accelerator boards lda #$ff ?loop and $d20a ;see if pokey 0 is halted ($d20a = $ff) inx bne ?loop sty $d20f cmp #$ff bne ?mono inx ?mono ... ;Results: ;X=0 - mono ;X=1 - stereo
Metoda nr 3
Zaproponowana przez XI/Satantronic w 2007 roku i wykorzystana w programie Stereo upgrade tester, a bazująca na tym że do drugiego POKEY-a nie jest podłączona klawiatura, w wyniku czego z KBCODE będzie zawsze czytana wartość $00. Niestety również pierwszy POKEY zwróci tę samą wartość po resecie aż do chwili kiedy zostanie wciśnięty dowolny klawisz prócz L (który ma właśnie kod $00), jak i po wciśnięciu klawisza L.
detect_stereo: lda KBCODE ;$D209 cmp KBCODE+$10 ;$D209+$10 rts ;Z=0 - stereo ;Z=1 - mono