Wykrycie VBXE: Różnice pomiędzy wersjami
Nie podano opisu zmian |
równe -> C ustawiony |
||
| (Nie pokazano 21 wersji utworzonych przez 5 użytkowników) | |||
| 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 ? | bcc ?ret | ||
inc _vbxe_write+2 | inc _vbxe_write+2 | ||
?try ldx $ | ?try ldx $4000 | ||
jsr ?chk | |||
bcc ?ret | |||
jsr | |||
inx | inx | ||
stx $ | stx $4000 | ||
lda #$80 | jsr ?chk | ||
dec $4000 | |||
?ret rts | |||
?chk lda #$80 | |||
jsr _vbxe_write | jsr _vbxe_write | ||
cpx $ | cpx $4000 | ||
beq ?clr | |||
clc | |||
?clr lda #$00 | ?clr lda #$00 | ||
_vbxe_write | _vbxe_write | ||
| Linia 33: | Linia 39: | ||
</pre> | </pre> | ||
Wywołanie <code>JSR VBXE_DETECT</code> wraca z ustawionym znacznikiem C, gdy VBXE | == 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>. | |||
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]] | ||
[[Kategoria:Peryferia 8-bit|VBXE, wykrywanie]] | [[Kategoria:Peryferia 8-bit|VBXE, wykrywanie]] | ||
[[Kategoria:Programowanie Atari 8-bit|VBXE, wykrywanie]] | [[Kategoria:Programowanie Atari 8-bit|VBXE, wykrywanie]] | ||
[[Kategoria:VBXE]] | |||
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).