Obsługa standardowego rozszerzenia pamięci RAM

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 23:15, 16 gru 2024
Mono (Dyskusja | wkład)
(link do opisu rozszerzenia 192KB mariusza geislera)
← Previous diff
Wersja z dnia 08:23, 17 gru 2024
Mono (Dyskusja | wkład)
(pharaonowe 192k)
Next diff →
Linia 13: Linia 13:
<tr><td>128k</td><td>Atari</td><td>4</td><td>TAK</td><td>2,3</td><td> </td></tr> <tr><td>128k</td><td>Atari</td><td>4</td><td>TAK</td><td>2,3</td><td> </td></tr>
-<tr><td>192k</td><td>Karen</td><td>8</td><td>TAK</td><td>2,3,6</td> <td>[http://atarionline.pl/biblioteka/czasopisma/Moje_Atari/Moje_Atari_1991_05.djvu Opis rozszerzenia do 192 KB autorstwa Mariusza Geislera w "Moje Atari" nr 5/1991 str. 22]</td></tr>+<tr><td>192k</td><td>Karen</td><td>8</td><td>TAK</td><td>2,3,6</td> <td>Opis rozszerzenia do 192 KB autorstwa Mariusza Geislera w [http://atarionline.pl/biblioteka/czasopisma/Moje_Atari/Moje_Atari_1991_05.djvu Moje Atari nr 5/1991] str. 22</td></tr>
 + 
 +<tr><td>192k</td><td>RAMBO</td><td>8</td><td>NIE</td><td>2,3,6</td> <td>Wymieniane przez Avery Lee w [https://www.virtualdub.org/downloads/Altirra%20Hardware%20Reference%20Manual.pdf Altirra Hardware Reference Manual] w sekcji "2.7. Extended Memory"</td></tr>
<tr><td>256k</td><td>RAMBO (TOMS)</td><td>12</td><td>NIE</td><td>2,3,5,6</td><td>Niektóre kombinacje bitów mapują w oknie bloki pamięci podstawowej RAM.</td></tr> <tr><td>256k</td><td>RAMBO (TOMS)</td><td>12</td><td>NIE</td><td>2,3,5,6</td><td>Niektóre kombinacje bitów mapują w oknie bloki pamięci podstawowej RAM.</td></tr>

Wersja z dnia 08:23, 17 gru 2024

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 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 mapują w oknie bloki pamięci podstawowej RAM.
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ą.
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.


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