Wykrycie VBXE
From Atariki
| Wersja z dnia 13:56, 22 kwi 2009 KMK (Dyskusja | wkład) (++) ← Previous diff  | 
				Aktualna wersja 0xF (Dyskusja | wkład) (równe -> C ustawiony)  | 
			||
| 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 == | + | == 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 ?clr | + | 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 | + | beq ?clr | 
| - | sec | + | clc | 
| - | .byte $24 | + | |
| - | ?fnd clc | + | |
| ?clr lda #$00 | ?clr lda #$00 | ||
| _vbxe_write | _vbxe_write | ||
| Linia 33: | Linia 38: | ||
| rts | rts | ||
| </pre> | </pre> | ||
| + | |||
| + | == 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 == | == 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 _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: | + | 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. | + | * $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 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. | + | 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ć tylko raz. | + | Procedurę w powyższej postaci można wywołać wielokrotnie. | 
| - | == Działanie == | + | == Numer rewizji rdzenia == | 
| - | Podprogram próbuje podłączyć bank 0 VRAM-u jako okno MEMAC A (pod $2000-$3FFF) i sprawdza, czy się coś zmieniło w odnośnym obszarze pamięci. | + | |
| + | 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]] | ||
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
        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).
