Obsługa rozszerzenia pamięci RAM
From Atariki
Wykrycie rozszerzenia i obliczenie jego rozmiaru
Poniższa procedura przeprowadza test rozmiaru rozszerzenia pamięci RAM nie niszcząc zawartości tejże pamięci. Procedura musi być ulokowana w całości poza obszarem $4000-$7FFF. Dane wyjściowe:
- liczba dodatkowych banków 16k w rejestrze Y (lub 0, gdy komputer ma tylko 64k RAM)
- wartości PORTB w tablicy banks
; etykiety
ext_b = $4000
portb = $d301
; procedura
detect_ext
lda portb
pha
ldx #$0f ;zapamiętanie bajtów ext (z 16 bloków po 64k)
_p0 jsr setpb
lda ext_b
sta bsav,x
dex
bpl _p0
ldx #$0f ;wyzerowanie ich (w oddzielnej pętli, bo nie wiadomo
_p1 jsr setpb ;które kombinacje bitów PORTB wybierają te same banki)
lda #$00
sta ext_b
dex
bpl _p1
stx portb ;eliminacja pamięci podstawowej
stx ext_b
stx $00 ;niezbędne dla niektórych rozszerzeń do 256k
ldy #$00 ;pętla zliczająca bloki 64k
ldx #$0f
_p2 jsr setpb
lda ext_b ;jeśli ext_b jest różne od zera, blok 64k już zliczony
bne _n2
dec ext_b ;w przeciwnym wypadku zaznacz jako zliczony
lda portb ;wpisz wartość PORTB do tablicy dla banku 0
sta banks,y
eor #%00000100 ;uzupełnij wartości dla banków 1, 2, 3
sta banks+1,y
eor #%00001100
sta banks+2,y
eor #%00000100
sta banks+3,y
iny
iny
iny
iny
_n2 dex
bpl _p2
ldx #$0f ;przywrócenie zawartości ext
_p3 jsr setpb
lda bsav,x
sta ext_b
dex
bpl _p3
pla
sta portb
rts
; podprogramy
setpb txa
lsr ;zmiana kolejności bitów: %0000dcba -> %cba000d0
ror
ror
ror
bcc _j1
ora #%00000010
_j1 ora #%00001101 ;wybór pierwszego banku 16k w bloku 64k i ustawienie bitu sterującego OS ROM
sta portb
rts
; zmienne
banks .ds 64
bsav .ds 16
Zawartość tablicy banks jest uszeregowana tak, żeby przy zajmowaniu banków w kolejności od jej początku zmniejszyć prawdopodobieństwo konfliktu ze SpartaDOS X (który to DOS przydziela sobie pamięć rozszerzenia w generalnie odwrotnej kolejności). Całkowite uniknięcie konfliktu (w tym z ramdyskami itp.) wymaga użycia procedur zarządzania pamięcią SpartaDOS X, co zostało opisane w "Przewodniku programisty SpartaDOS X", dostępnym tutaj.
