Obsługa rozszerzenia pamięci RAM

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 22:14, 18 lip 2013
KMK (Dyskusja | wkład)
(Wykrycie rozszerzenia i obliczenie jego rozmiaru - zm. kolejnosci z FB73 na 37BF, plus drobiazgi)
← Previous diff
Wersja z dnia 17:15, 6 wrz 2015
KMK (Dyskusja | wkład)

Next diff →
Linia 8: Linia 8:
<pre> <pre>
; etykiety ; etykiety
-ext_b = $4000+ext_b = $4000 ;cokolwiek z zakresu $4000-$7FFF
portb = $d301 portb = $d301
Linia 14: Linia 14:
detect_ext detect_ext
lda portb lda portb
 + pha
 +
 + lda #$ff
 + sta portb
 +
 + lda ext_b
pha pha
Linia 67: Linia 73:
dex dex
bpl _p3 bpl _p3
 +
 + stx portb ;X=$FF
 +
 + pla
 + sta ext_b
pla pla

Wersja z dnia 17:15, 6 wrz 2015

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       ;cokolwiek z zakresu $4000-$7FFF
portb  = $d301

; procedura
detect_ext
       lda portb
       pha

       lda #$ff
       sta portb

       lda ext_b
       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 ext_b      ;sprawdz, czy sie zaznaczyl; jesli nie -> cos nie tak ze sprzetem
       bpl _n2

       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

       stx portb      ;X=$FF

       pla
       sta ext_b

       pla
       sta portb
       rts

; podprogramy
setpb  txa            ;zmiana kolejności bitów: %0000dcba -> %cba000d0
       lsr            
       ror
       ror
       ror
       adc #$01       ;ustawienie bitu nr 1 w zaleznosci od stanu C
       ora #$01       ;ustawienie bitu sterującego OS ROM na wartosc domyslna
       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.

Personal tools