Programowanie: Detekcja stereo: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
Mono (dyskusja | edycje)
m →Metoda nr 1: formatowanie kodu
 
(Nie pokazano 12 wersji utworzonych przez 3 użytkowników)
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>


== Metoda nr 2 ==
== 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.
Zaproponowana przez [[KMK]] wykorzystuje fakt, że po wprowadzeniu układu POKEY w stan "reset" rejestr [[Rejestry POKEY-a#RANDOM|RANDOM]] osiąga w przeciągu kilku cykli wartość $FF i utrzymuje ją.


<pre>
<pre>
Linia 48: Linia 48:
       stx $d20f    ;halt pokey 0
       stx $d20f    ;halt pokey 0
       stx $d21f    ;halt pokey 1
       stx $d21f    ;halt pokey 1
       lda #$03
       ldy #$03
       sta $d21f    ;release pokey 1
       sty $d21f    ;release pokey 1


       lda $d20a    ;see if pokey 0 is halted ($d20a = $ff)
      sta $d40a    ;delay necessary for
?loop and $d20a
      sta $d40a    ;accelerator boards
 
       lda #$ff
?loop and $d20a    ;see if pokey 0 is halted ($d20a = $ff)
       inx
       inx
       bne ?loop
       bne ?loop


      ldy #$03
       sty $d20f
       sty $d20f


Linia 67: 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 z 3 mar 2023, 15:59

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