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).
Podstawowe cechy rozszerzeń można ująć jak w tabeli poniżej:
| Łączny rozmiar | Typ | Liczba banków dodatkowych | Separacja CPU/ANTIC | Bity wyboru banku | Uwagi |
|---|---|---|---|---|---|
| 128k | 4 | TAK | 2,3 | ||
| 192k | 8 | TAK | 2,3,6 | ||
| 256k | RAMBO | 12 | NIE | 2,3,5,6 | Niektóre kombinacje bitów się dublują. |
| 320k | RAMBO | 16 | NIE | 2,3,5,6 | |
| 320k | Compy Shop | 16 | TAK | 2,3,6,7 | Bit 7 wybiera banki przy skasowanym bicie 4 lub 5 (lub obu), w przeciwnym razie wybiera SELF TEST. Take zastosowanie bitu 7 nie jest zgodne z definicją Atari, ale w praktyce nie powoduje to godnych wzmianki kłopotów z kompatybilnością. |
| 576k | Compy Shop | 32 | TAK | 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 - Atari BASIC. Z tego ostatniego powodu możliwe są kłopoty z kompatybilnością, ale występują tylko w bardzo specyficznych warunkach. |
| 1088k | RAMBO | 64 | NIE | 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 | RAMBO | 128 | NIE | 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.
- Procedura obsługuje rozszerzenia o rozmiarach do 64 banków (1088k). Rozszerzenie do 2112k nie jest brane pod uwagę.
- 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.
