Obsługa standardowego rozszerzenia pamięci RAM
From Atariki
Informacje ogólne
Rozszerzenie standardowe to takie, którym steruje się przez rejestr PORTB układu PIA. Kombinacje bitów tego rejestru wybierają banki pamięci po 16k, pojawiające się w obszarze $4000-$7FFF.
Bit 4 rejestru PORTB, jeśli jest skasowany, powoduje podłączenie danego banku tak, żeby stał się widoczny dla CPU. Bit 5 działa podobnie: jego skasowanie powoduje, że wybrany bank pamięci stanie się widoczny dla układu ANTIC. W ten sposób realizuje się niezależny dostęp do pamięci bankowanej i podstawowej dla CPU i ANTIC-a. Tak działa dodatkowa pamięć w 130XE.
Nie wszystkie rozszerzenia pamięci kontrolowane przez PORTB implementują działanie bitu 5 zgodnie ze 130XE. Robią tak przede wszystkim rozszerzenia tzw. Compy Shop. W pozostałych (tzw. RAMBO) bit 5 jest jednym z bitów wybierających numer banku pamięci, a oddzielny dostęp CPU i ANTIC-a do pamięci bankowanej nie jest możliwy (oba układy "widzą" to samo).
Do wyboru numeru banków służą następujące zestawy bitów:
- 128k (4 banki dodatkowe, oddzielny dostęp dla CPU i ANTIC-a): bity 2,3
- 192k (8 banków dodatkowych, oddzielny dostęp dla CPU i ANTIC-a): bity 2,3,6
- 256k typu RAMBO (12 banków dodatkowych): bity 2,3,5,6 - niektóre kombinacje się dublują
- 320k typu RAMBO (16 banków dodatkowych): bity 2,3,5,6
- 320k typu Compy Shop (16 banków dodatkowych, oddzielny dostęp dla CPU i ANTIC-a): bity 2,3,6,7 - bit 7 wybiera banki przy skasowanym bicie 4 lub 5 (lub obu), w przeciwnym razie wybiera SELF TEST.
- 576k typu Compy Shop (32 banki dodatkowe): bity 1,2,3,6,7 - bity 7 i 1 wybierają banki przy skasowanym bicie 4 lub 5 (lub obu), w przeciwnym wypadku bit 7 wybiera SELF TEST, a bit 1 BASIC. Z tego ostatniego powodu możliwe są kłopoty z kompatybilnością, ale występują tylko w bardzo specyficznych warunkach.
- 1088k typu RAMBO (64 banki dodatkowe): bity 1,2,3,5,6,7 - bity 7 i 1 wybierają banki przy skasowanym bicie 4, w przeciwnym wypadku bit 7 wybiera SELF TEST, a bit 1 BASIC. Z tego ostatniego powodu możliwe są kłopoty z kompatybilnością, ale występują tylko w bardzo specyficznych warunkach.
- 2112k typu RAMBO (128 banków dodatkowych): bity 0,1,2,3,5,6,7 - bity 7 i 1 działają jak wyżej, dodatkowo działa tak samo bit 0, co powoduje problemy z kompatybilnością dużo łatwiej zauważalne niż w dwóch powyższych przypadkach. Z tego powodu takich rozszerzeń pamięci w praktyce się nie spotyka.
Rozszerzenia są kompatybilne "w dół", tzn. większe zawierają wszystkie banki mniejszych. Jedyna poważniejsza różnica to wspomniany oddzielny dostęp do pamięci dla CPU i ANTIC-a (lub jego brak), ale programów, które mają z tym problem, jest bardzo mało.
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
Uwagi
- Procedura zwraca listę banków widocznych dla CPU.
- Procedura bierze pod uwagę osobliwość rozszerzenia Newell Industries, w którym pewne kombinacje bitów rejestru PORTB wybierają ćwiartki pamięci podstawowej. Te wartości zostaną przez procedurę pominięte.
- 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.