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 #$7f ;zapamietanie bajtow ext _p0 jsr setpb lda ext_b sta bsav,x dex bpl _p0 ldx #$7f ;wyzerowanie ich (w oddzielnej petli, bo nie wiadomo _p1 jsr setpb ;ktore kombinacje bitow PORTB wybieraja te same banki) lda #$00 sta ext_b dex bpl _p1 stx portb ;eliminacja pamieci podstawowej stx ext_b stx $00 ;niezbedne dla niektorych rozszerzen do 256k ldy #$00 ;petla zliczajaca banki ldx #$7f _p2 jsr setpb lda ext_b bne _n2 dec ext_b lda portb sta banks,y iny _n2 dex bpl _p2 ldx #$7f ;przywrocenie zawartosci ext _p3 jsr setpb lda bsav,x sta ext_b dex bpl _p3 pla sta portb rts ; podprogramy setpb txa sec ;wartosc licznika mnozymy przez 2 i dodajemy 1 rol ;w celu przesuniecia wszystkich bitow w lewo i ustawienia bitu sterujacego OS ROM sta portb rts ; zmienne banks .ds 64 bsav .ds 128
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). Wadą procedury jest to, że prawdopodobieństwo tego konfliktu jest różne dla różnych typów rozszerzeń (większe, gdy bit 1 PORTB steruje pamięcią RAM, jak w przypadku rozszerzeń do 576k i 1 MB). 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.