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
192kKaren8TAK2,3,6
256kRAMBO12NIE2,3,5,6Niektóre kombinacje bitów się dublują.
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ą.
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.


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