Obsługa rozszerzenia pamięci RAM

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 18:56, 10 lis 2011
KMK (Dyskusja | wkład)
(przeróbka na procedurę zliczającą banki 64k)
← Previous diff
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)
Next diff →
Linia 39: Linia 39:
lda ext_b ;jeśli ext_b jest różne od zera, blok 64k już zliczony lda ext_b ;jeśli ext_b jest różne od zera, blok 64k już zliczony
bne _n2 bne _n2
 +
dec ext_b ;w przeciwnym wypadku zaznacz jako zliczony 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 lda portb ;wpisz wartość PORTB do tablicy dla banku 0
sta banks,y sta banks,y
Linia 52: Linia 57:
iny iny
iny iny
 +
_n2 dex _n2 dex
bpl _p2 bpl _p2
Linia 67: Linia 73:
; podprogramy ; podprogramy
-setpb txa+setpb txa ;zmiana kolejności bitów: %0000dcba -> %cba000d0
- lsr ;zmiana kolejności bitów: %0000dcba -> %cba000d0+ lsr
ror ror
ror ror
ror ror
- bcc _j1+ adc #$01 ;ustawienie bitu nr 1 w zaleznosci od stanu C
- ora #%00000010+ ora #$01 ;ustawienie bitu sterującego OS ROM na wartosc domyslna
-_j1 ora #%00001101 ;wybór pierwszego banku 16k w bloku 64k i ustawienie bitu sterującego OS ROM+
sta portb sta portb
rts rts

Wersja z dnia 22:14, 18 lip 2013

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 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

       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