Programowanie: Detekcja stereo: Różnice pomiędzy wersjami
Przejdź do nawigacji
Przejdź do wyszukiwania
m kategorie |
Nie podano opisu zmian |
||
| 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 21 paź 2011, 23:24
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