Programowanie: Detekcja stereo
From Atariki
| Wersja z dnia 13:58, 3 mar 2023 Mono (Dyskusja | wkład) (→Metoda nr 3) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (→Metoda nr 1 - formatowanie kodu) |
||
| 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> | ||
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
