Programowanie: Detekcja stereo
From Atariki
(Różnice między wersjami)
Wersja z dnia 11:55, 30 kwi 2010 Mono (Dyskusja | wkład) (kategorie) ← Previous diff |
Wersja z dnia 21:24, 21 paź 2011 KMK (Dyskusja | wkład) Next diff → |
||
Linia 1: | Linia 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 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 37: | Linia 38: | ||
txa ; X to A | txa ; X to A | ||
rts ; exit | rts ; exit | ||
+ | </pre> | ||
+ | |||
+ | == Metoda nr 2 == | ||
+ | Zaproponowana przez [[KMK]] wykorzystuje fakt, że po wprowadzeniu układu POKEY w stan "reset" rejestr [[Rejestry POKEY-a#RANDOM|RANDOM]] ma wartość $FF. | ||
+ | |||
+ | <pre> | ||
+ | detect_stereo | ||
+ | ldx #$00 | ||
+ | stx $d20f ;halt pokey 0 | ||
+ | stx $d21f ;halt pokey 1 | ||
+ | lda #$03 | ||
+ | sta $d21f ;release pokey 1 | ||
+ | |||
+ | lda $d20a ;see if pokey 0 is halted ($d20a = $ff) | ||
+ | ?loop and $d20a | ||
+ | inx | ||
+ | bne ?loop | ||
+ | |||
+ | ldy #$03 | ||
+ | sty $d20f | ||
+ | |||
+ | cmp #$ff | ||
+ | bne ?mono | ||
+ | |||
+ | inx | ||
+ | |||
+ | ?mono ... ;Results: | ||
+ | ;X=0 - mono | ||
+ | ;X=1 - stereo | ||
</pre> | </pre> | ||
[[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] |
Wersja z dnia 21:24, 21 paź 2011
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 ma wartość $FF.
detect_stereo ldx #$00 stx $d20f ;halt pokey 0 stx $d21f ;halt pokey 1 lda #$03 sta $d21f ;release pokey 1 lda $d20a ;see if pokey 0 is halted ($d20a = $ff) ?loop and $d20a inx bne ?loop ldy #$03 sty $d20f cmp #$ff bne ?mono inx ?mono ... ;Results: ;X=0 - mono ;X=1 - stereo