Wykrycie VBXE
From Atariki
Wersja z dnia 22:25, 8 lut 2010 KMK (Dyskusja | wkład) (→Sposób użycia - ++) ← Previous diff |
Wersja z dnia 22:58, 8 lut 2010 KMK (Dyskusja | wkład) (++) Next diff → |
||
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 | ||
Linia 36: | Linia 36: | ||
</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 56: | Linia 59: | ||
* bit 7 = 1, emulacja rozszerzenia RAMBO. | * bit 7 = 1, emulacja rozszerzenia RAMBO. | ||
* bit 6-4, główny numer rewizji zapisany w kodzie BCD (cyfry od 0 do 9). | * bit 6-4, główny numer rewizji zapisany w kodzie BCD (cyfry od 0 do 9). | ||
- | * bit 3-0, pomocniczy numer rewizji zapisany w kodzie BCD, jak wyżej | + | * bit 0-3, pomocniczy numer rewizji zapisany w kodzie BCD, jak wyżej |
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. | 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. | ||
Linia 62: | Linia 65: | ||
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. | 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. | ||
- | == Działanie == | + | === Odczyt numeru rewizji rdzenia FX === |
- | 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. | + | |
+ | <pre> | ||
+ | ; | ||
+ | ; 2010 by KMK/DLT, based on FX Programmer's Manual (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 PORTB i MEMAC. | ||
+ | |||
+ | == Uwagi == | ||
+ | Test nie działa w przypadku rdzeni GTIA_emu, gdyż nie mają one mechanizmów bankowania pamięci zaimplementowanych w FX. Rdzeń GTIA 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]] |
Wersja z dnia 22:58, 8 lut 2010
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 jsr ?try bcc ?clr inc _vbxe_write+2 ?try ldx $4000 ldy #MEMAC_B_CTL lda #$80 jsr _vbxe_write cpx $4000 bne ?fnd jsr ?clr inx stx $4000 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 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.
Procedurę w powyższej postaci można wywołać tylko raz.
Numer rewizji rdzenia
Numer rewizji rdzenia FX ($xx41) ma następującą strukturę:
- bit 7 = 1, emulacja rozszerzenia RAMBO.
- bit 6-4, główny numer rewizji zapisany w kodzie BCD (cyfry od 0 do 9).
- bit 0-3, pomocniczy numer rewizji zapisany w kodzie BCD, jak wyżej
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 FX Programmer's Manual (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, gdyż nie mają one mechanizmów bankowania pamięci zaimplementowanych w FX. Rdzeń GTIA 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).