Programowanie: Detekcja stereo

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
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
Personal tools