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