Obsługa standardowego rozszerzenia pamięci RAM

From Atariki

Jump to: navigation, search

Informacje ogólne

Rozszerzenie standardowe to takie, którym steruje się przez rejestr PORTB układu PIA. Ze względu na użycie tego rejestru (zajętego w 400/800) to rozszerzenie jest przeznaczone dla komputerów serii XL i XE. Kombinacje bitów rejestru PORTB 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
TypLiczba banków
dodatkowych
Separacja
CPU/ANTIC
Bity wyboru
banku
Uwagi
128kAtari4TAK2,3
192kCompy Shop (Karen)8TAK2,3,6 Opis rozszerzenia do 192 KB autorstwa Mariusza Geislera w Moje Atari nr 5/1991 str. 22
192kRAMBO8NIE2,3,6 Wymieniane przez Avery Lee w Altirra Hardware Reference Manual w sekcji "2.7. Extended Memory"
256kRAMBO (TOMS)12NIE2,3,5,6Niektóre kombinacje bitów się dublują.
256kRAMBO12NIE2,3,5,6Niektóre kombinacje bitów mapują bloki pamięci podstawowej RAM.
320kRAMBO16NIE2,3,5,6
320kCompy Shop16TAK2,3,6,7Bit 7 wybiera banki przy skasowanym bicie 4 lub 5 (lub obu), w przeciwnym razie wybiera SELF TEST. Takie zastosowanie bitu 7 nie jest zgodne z definicją Atari, ale w praktyce nie powoduje to godnych wzmianki kłopotów z kompatybilnością.
576kRAMBO (tf_hh)32NIE2,3,5,6,7Bit 7 wybiera banki przy skasowanym bicie 4, w przeciwnym wypadku SELF TEST.
576kRAMBO32NIE1,2,3,5,6Bit 1 wybiera banki przy skasowanym bicie 4, w przeciwnym wypadku Atari BASIC. Z tego powodu możliwe są kłopoty z kompatybilnością, ale występują tylko w bardzo specyficznych warunkach.
576kCompy Shop32TAK1,2,3,6,7Bity 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.
1088kRAMBO64NIE1,2,3,5,6,7Bity 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. Niemniej właśnie dlatego spotyka się - głównie w Niemczech - takie instalacje tego rozszerzenia, w których Atari BASIC jest trwale wyłączony i niedostępny.
2112kRAMBO128NIE0,1,2,3,5,6,7Bity 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.
4144kRAMBO256NIE0,1,2,3,4,5,6,7Wszystkie bity adresują numer banku pamięci, nie da się włączyć BASIC-a ani SELF-TEST-u, choć można opcjonalnie zostawić możliwość przełączania OS bitem 0 PORTB równocześnie z wyborem banku rozszerzenia. Znane jest tylko jedno takie rozszerzenie firmy Newell Industries.


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 z natury rzeczy być ulokowana w całości poza obszarem $4000-$7FFF oraz poza obszarem wewnętrznego BASIC-a ($A000-$BFFF).

Ponadto przyjęto założenie, że znajdzie się też poza obszarem RAM-u rezydującego "pod" ROM OS ($C000-$CFFF i $D800-$FFFF) - modyfikacja mająca na celu zniesienie tego ograniczenia jest na tyle łatwa, że opis zostanie pominięty.

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 (X=$FF)
       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 [1]
       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.
  • Procedura zakłada, że będzie działać przy włączonym ROM OS, zwraca też wartości PORTB z ustawionym bitem 0 (= ROM OS-u włączony). Gdyby było to niepożądane, rozkaz ORA #$01 w wierszu programu oznaczonym przez "[1]" należy wymienić na AND #$FE.
Personal tools