Wykrycie VBXE: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
+ rdzeń 1.20
0xF (dyskusja | edycje)
równe -> C ustawiony
 
(Nie pokazano 15 wersji utworzonych przez 4 użytkowników)
Linia 1: Linia 1:
Procedura wykrycia rdzenia FX [[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.09 i starszych ==
== Kod dla rdzeni 1.20 i nowszych ==
<pre>
<pre>
;
;
; 2009 by KMK/DLT
; 2009 by KMK/DLT
;
;
MEMAC_B_CTL = $4c
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 ?clr
         bcc ?ret


         inc _vbxe_write+2
         inc _vbxe_write+2


?try    ldx $4000
?try    ldx $4000
        ldy #MEMAC_B_CTL
         jsr ?chk
        lda #$80
         bcc ?ret
         jsr _vbxe_write
        cpx $4000
        bne ?fnd
         jsr ?clr
         inx
         inx
         stx $4000
         stx $4000
         lda #$80
         jsr ?chk
        dec $4000
?ret    rts
 
?chk    lda #$80
         jsr _vbxe_write
         jsr _vbxe_write
         cpx $4000
         cpx $4000
         bne ?fnd
         beq ?clr
         sec
         clc
        .byte $24
?fnd    clc
?clr    lda #$00
?clr    lda #$00
_vbxe_write
_vbxe_write
Linia 36: Linia 39:
</pre>
</pre>


== Kod dla rdzenia 1.20 ==
== Kod dla rdzenia < 1.20 ==


Dla rdzenia 1.20 kod jest identyczny z tym wyjątkiem, że należy przyjąć $5d jako wartość <code>MEMAC_B_CTL</code>.
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 ==
== Sposób użycia ==
Linia 44: Linia 50:


* $xx40 - "magiczna" wartość $10, oznaczająca rdzeń FX, wersja 1.
* $xx40 - "magiczna" wartość $10, oznaczająca rdzeń FX, wersja 1.
* $xx41 - numer rewizji rdzenia (np. $08 = rewizja 08) lub $FF (rewizja 07 lub starsza)
* $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.


Przyjmuje się, że twórcy rdzeni niezgodnych z FX v.1.0 zadbają o dobranie innej i unikalnej wartości magicznej, co pozwoli na łatwą identyfikację rdzeni i uniknięcie problemów z kompatybilnością oprogramowania.
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.


Procedurę w powyższej postaci można wywołać tylko raz.
=== Odczyt numeru rewizji rdzenia FX ===


== Działanie ==
<pre>
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.
;
; 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>.
 
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.
 
== 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 z 23 lip 2024, 07:49

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

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
        beq ?clr
        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).