Obsługa rozszerzenia pamięci RAM
From Atariki
(Różnice między wersjami)
												
			
			| 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.
