Wykrycie VBXE

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 09:45, 11 kwi 2009
KMK (Dyskusja | wkład)

← Previous diff
Aktualna wersja
Jhusak (Dyskusja | wkład)
(Numer rewizji rdzenia)
Linia 1: Linia 1:
-Procedura wykrycia [[VBXE]] na stronie $D6 lub $D7:+Procedura wykrycia rdzenia FX [[VBXE]] na stronie $D6 lub $D7 w komputerach [[XL]] i [[XE]].
 +== Kod dla rdzeni 1.20 i nowszych ==
<pre> <pre>
; ;
; 2009 by KMK/DLT ; 2009 by KMK/DLT
; ;
 +MEMAC_B_CTL = $5d
 +
vbxe_detect vbxe_detect
 + lda #$d6
 + sta _vbxe_write+2
 + ldy #MEMAC_B_CTL
 + jsr ?clr
 +
jsr ?try jsr ?try
- bcc ?fnd+ bcc ?ret
inc _vbxe_write+2 inc _vbxe_write+2
-?try ldx $3fff+?try ldx $4000
- ldy #$4c+ jsr ?chk
- lda #$80+ bcc ?ret
- jsr _vbxe_write+
- cpx $3fff+
- bne ?fnd+
- jsr ?clr+
inx inx
- stx $3fff+ stx $4000
- lda #$80+ jsr ?chk
 + dec $4000
 +?ret rts
 + 
 +?chk lda #$80
jsr _vbxe_write jsr _vbxe_write
- cpx $3fff+ cpx $4000
bne ?fnd bne ?fnd
sec sec
Linia 33: Linia 41:
</pre> </pre>
-Wywołanie <code>JSR VBXE_DETECT</code> wraca z ustawionym znacznikiem C, gdy VBXE w komputerze nie ma, lub ze skasowanym znacznikiem C, gdy VBXE wykryto. W tej sytuacji pod adresem _vbxe_write+2 (1 bajt) jest numer strony, na której zdekodowana jest karta. Gdy VBXE nie ma, procedura wraca z ustawionym znacznikiem C.+== Kod dla rdzenia < 1.20 ==
 + 
 +Dla rdzeni starszych niż 1.20 kod jest identyczny z tym wyjątkiem, że należy przyjąć $4c jako wartość <code>MEMAC_B_CTL</code>.
 + 
 +== Działanie ==
 +Podprogram próbuje podłączyć bank 0 VRAM-u jako (charakterystyczne dla rdzenia FX) okno MEMAC B (pod $4000-$7FFF) i sprawdza, czy się coś zmieniło w odnośnym obszarze pamięci.
 + 
 +== Sposób użycia ==
 +Wywołanie <code>JSR VBXE_DETECT</code> wraca z ustawionym znacznikiem C, gdy VBXE nie wykryto lub ze skasowanym znacznikiem C, gdy wykryto. W tej ostatniej sytuacji pod adresem <code>_vbxe_write+2</code> (1 bajt) jest numer strony, na której zdekodowana jest karta, a pod adresem $xx40 i $xx41 (gdzie "xx" to odpowiedni nr strony, tj. D6 lub D7) znajduje się kolejno:
 + 
 +* $xx40 - "magiczna" wartość $10, oznaczająca rdzeń FX, wersja 1.
 +* $xx41 - numer rewizji rdzenia
 + 
 +Przyjmuje się, że twórcy rdzeni niezgodnych z FX zadbają o dobranie innej i unikalnej wartości magicznej, co pozwoli na łatwą identyfikację rdzeni i uniknięcie problemów z kompatybilnością oprogramowania.
 + 
 +Procedurę w powyższej postaci można wywołać wielokrotnie.
 + 
 +== Numer rewizji rdzenia ==
 + 
 +Numer rewizji rdzenia FX ($xx41) ma następującą strukturę:
 + 
 +* bit 7 = 1, emulacja rozszerzenia [[Rambo XL]].
 +* bit 4-6, główny numer rewizji zapisany w kodzie BCD (wartości 0 - 7).
 +* bit 0-3, pomocniczy numer rewizji zapisany w kodzie BCD, (wartości 0 - 9)
 + 
 +Różnica w pomocniczym numerze rewizji oznacza zmiany kompatybilne (np. poprawki błędów). Zmiana głównego numeru rewizji oznacza, że rdzeń jest niezgodny z poprzednimi.
 + 
 +Ten schemat obowiązuje od wersji rdzenia 1.21. Rdzeń 1.20 nie ma znacznika Rambo. Rdzenie wcześniejsze od 1.20 mogą być niekompatybilne ze sobą mimo tego samego głównego numeru rewizji (tzn. 0 - rdzeń FX 1.10 nie istnieje). Rdzenie wcześniejsze niż 1.08 w ogóle nie mają numeru rewizji rdzenia, pod tym adresem odczyta się $FF.
 + 
 +=== Odczyt numeru rewizji rdzenia FX ===
 + 
 +<pre>
 +;
 +; 2010 by KMK/DLT
 +;
 +; Based on:
 +; VBXE FX core 1.21 Programmer's Manual example code, (c) Electron
 +;
 +; run after jsr vbxe_detect
 +;
 +vb_rambo = $80
 +vb_rev = $81
 +vb_page = $82
 +;
 +get_fx_version
 + lda #$00
 + sta vb_rambo
 + sta vb_page
 + lda _vbxe_write+2
 + sta vb_page+1
 + 
 + ldy #$40
 + lda (vb_page),y ;get CORE_VERSION
 + cmp #$10
 + bne not_fx
 + 
 + iny
 + lda (vb_page),y ;get CORE_REVISION
 + cmp #$ff
 + beq not_fx
 + asl
 + ror vb_rambo
 + lsr
 + sta vb_rev
 + and #$70
 + cmp #$20 ;arbitrary revision number to be tested
 + bne not_fx
 + lda vb_rev
 + clc
 + rts
 + 
 +not_fx sec
 + rts
 +</pre>
 + 
 +Przykładowy program odczytuje numer wersji wykrytego (przez <code>jsr vbxe_detect</code>) rdzenia FX. Jeśli rdzeń nie jest zgodny z FX 1.20, następuje powrót z ustawionym znacznikiem C. Jeśli rdzeń jest zgodny z FX 1.20, powrót następuje ze skasowanym znacznikiem C i dokładnym numerem rewizji w akumulatorze oraz, w przypadku rdzenia RAMBO, z ustawionym bitem 7 komórki <code>vb_rambo</code>.
-Sposób działania: podprogram próbuje podłączyć bank 0 VRAM-u jako okno MEMAC A (w obszarze $2000-$3FFF) i sprawdza, czy się coś zmieniło w tym obszarze pamięci.+UWAGA: rdzeń FX o dokładnym numerze rewizji $20, tzn. 1.20, nie wykaże rozszerzenia RAMBO, gdyż użyty znacznik jest zdefiniowany dopiero od rdzenia 1.21; dla 1.20 trzeba przeprowadzić osobny test na tożsamość banków wybieranych przez [[Rejestry PIA#PORTB|PORTB]] i MEMAC.
-Procedurę w powyższej postaci można wywołać tylko raz.+== Uwagi ==
 +Test nie działa w przypadku rdzeni GTIA_emu (= tylko emulacja [[GTIA]]), gdyż nie mają one mechanizmów bankowania pamięci zaimplementowanych w FX. Rdzeń GTIA_emu ma tylko wartość magiczną CORE_VERSION ustawioną na $11, oraz zgodną z powyższym opisem wartość CORE_REVISION. Wykrycie takiego rdzenia polega więc na kolejnym odczycie $d640 i $d740, a jeśli odczytaną wartością jest $11, to przy odrobinie szczęścia mamy do czynienia z rdzeniem GTIA_emu wersja 1, i odpowiedniej rewizji (albo czymkolwiek innym, co akurat wykorzystuje strony d6-d7 i ustawi tam takie wartości).
[[Kategoria:Niezbędnik kodera]] [[Kategoria:Niezbędnik kodera]]

Aktualna wersja

Procedura wykrycia rdzenia FX VBXE na stronie $D6 lub $D7 w komputerach XL i XE.

Spis treści

Kod dla rdzeni 1.20 i nowszych

;
; 2009 by KMK/DLT
;
MEMAC_B_CTL = $5d

vbxe_detect
        lda #$d6
        sta _vbxe_write+2
        ldy #MEMAC_B_CTL
        jsr ?clr

        jsr ?try
        bcc ?ret

        inc _vbxe_write+2

?try    ldx $4000
        jsr ?chk
        bcc ?ret
        inx
        stx $4000
        jsr ?chk
        dec $4000
?ret    rts

?chk    lda #$80
        jsr _vbxe_write
        cpx $4000
        bne ?fnd
        sec
        .byte $24
?fnd    clc
?clr    lda #$00
_vbxe_write
        sta $d600,y
        rts

Kod dla rdzenia < 1.20

Dla rdzeni starszych niż 1.20 kod jest identyczny z tym wyjątkiem, że należy przyjąć $4c jako wartość MEMAC_B_CTL.

Działanie

Podprogram próbuje podłączyć bank 0 VRAM-u jako (charakterystyczne dla rdzenia FX) okno MEMAC B (pod $4000-$7FFF) i sprawdza, czy się coś zmieniło w odnośnym obszarze pamięci.

Sposób użycia

Wywołanie JSR VBXE_DETECT wraca z ustawionym znacznikiem C, gdy VBXE nie wykryto lub ze skasowanym znacznikiem C, gdy wykryto. W tej ostatniej sytuacji pod adresem _vbxe_write+2 (1 bajt) jest numer strony, na której zdekodowana jest karta, a pod adresem $xx40 i $xx41 (gdzie "xx" to odpowiedni nr strony, tj. D6 lub D7) znajduje się kolejno:

  • $xx40 - "magiczna" wartość $10, oznaczająca rdzeń FX, wersja 1.
  • $xx41 - numer rewizji rdzenia

Przyjmuje się, że twórcy rdzeni niezgodnych z FX zadbają o dobranie innej i unikalnej wartości magicznej, co pozwoli na łatwą identyfikację rdzeni i uniknięcie problemów z kompatybilnością oprogramowania.

Procedurę w powyższej postaci można wywołać wielokrotnie.

Numer rewizji rdzenia

Numer rewizji rdzenia FX ($xx41) ma następującą strukturę:

  • bit 7 = 1, emulacja rozszerzenia Rambo XL.
  • bit 4-6, główny numer rewizji zapisany w kodzie BCD (wartości 0 - 7).
  • bit 0-3, pomocniczy numer rewizji zapisany w kodzie BCD, (wartości 0 - 9)

Różnica w pomocniczym numerze rewizji oznacza zmiany kompatybilne (np. poprawki błędów). Zmiana głównego numeru rewizji oznacza, że rdzeń jest niezgodny z poprzednimi.

Ten schemat obowiązuje od wersji rdzenia 1.21. Rdzeń 1.20 nie ma znacznika Rambo. Rdzenie wcześniejsze od 1.20 mogą być niekompatybilne ze sobą mimo tego samego głównego numeru rewizji (tzn. 0 - rdzeń FX 1.10 nie istnieje). Rdzenie wcześniejsze niż 1.08 w ogóle nie mają numeru rewizji rdzenia, pod tym adresem odczyta się $FF.

Odczyt numeru rewizji rdzenia FX

;
; 2010 by KMK/DLT
;
; Based on:
; VBXE FX core 1.21 Programmer's Manual example code, (c) Electron
;
; run after jsr vbxe_detect
;
vb_rambo = $80
vb_rev   = $81
vb_page  = $82
;
get_fx_version
        lda #$00
        sta vb_rambo
        sta vb_page
        lda _vbxe_write+2
        sta vb_page+1

        ldy #$40
        lda (vb_page),y         ;get CORE_VERSION
        cmp #$10
        bne not_fx

        iny
        lda (vb_page),y         ;get CORE_REVISION
        cmp #$ff
        beq not_fx
        asl
        ror vb_rambo
        lsr
        sta vb_rev
        and #$70
        cmp #$20                ;arbitrary revision number to be tested
        bne not_fx
        lda vb_rev
        clc
        rts

not_fx  sec
        rts

Przykładowy program odczytuje numer wersji wykrytego (przez jsr vbxe_detect) rdzenia FX. Jeśli rdzeń nie jest zgodny z FX 1.20, następuje powrót z ustawionym znacznikiem C. Jeśli rdzeń jest zgodny z FX 1.20, powrót następuje ze skasowanym znacznikiem C i dokładnym numerem rewizji w akumulatorze oraz, w przypadku rdzenia RAMBO, z ustawionym bitem 7 komórki vb_rambo.

UWAGA: rdzeń FX o dokładnym numerze rewizji $20, tzn. 1.20, nie wykaże rozszerzenia RAMBO, gdyż użyty znacznik jest zdefiniowany dopiero od rdzenia 1.21; dla 1.20 trzeba przeprowadzić osobny test na tożsamość banków wybieranych przez PORTB i MEMAC.

Uwagi

Test nie działa w przypadku rdzeni GTIA_emu (= tylko emulacja GTIA), gdyż nie mają one mechanizmów bankowania pamięci zaimplementowanych w FX. Rdzeń GTIA_emu ma tylko wartość magiczną CORE_VERSION ustawioną na $11, oraz zgodną z powyższym opisem wartość CORE_REVISION. Wykrycie takiego rdzenia polega więc na kolejnym odczycie $d640 i $d740, a jeśli odczytaną wartością jest $11, to przy odrobinie szczęścia mamy do czynienia z rdzeniem GTIA_emu wersja 1, i odpowiedniej rewizji (albo czymkolwiek innym, co akurat wykorzystuje strony d6-d7 i ustawi tam takie wartości).

Personal tools