Obsługa standardowego rozszerzenia pamięci RAM

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 19:52, 5 maj 2017
KMK (Dyskusja | wkład)
(można to chyba tak prowizorycznie nazwać)
← Previous diff
Aktualna wersja
Mono (Dyskusja | wkład)
(Informacje ogólne - 576k rambo od tf_hh)
Linia 19: Linia 19:
<tr><td>320k</td><td>RAMBO</td><td>16</td><td>NIE</td><td>2,3,5,6</td><td> </td></tr> <tr><td>320k</td><td>RAMBO</td><td>16</td><td>NIE</td><td>2,3,5,6</td><td> </td></tr>
-<tr><td>320k</td><td>Compy Shop</td><td>16</td><td>TAK</td><td>2,3,6,7</td><td>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ą.</td></tr>+<tr><td>320k</td><td>Compy Shop</td><td>16</td><td>TAK</td><td>2,3,6,7</td><td>Bit 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ą.</td></tr>
 + 
 +<tr><td>576k</td><td>RAMBO (tf_hh)</td><td>32</td><td>NIE</td><td>2,3,5,6,7</td><td>Bit 7 wybiera banki przy skasowanym bicie 4, w przeciwnym wypadku [[SELF TEST]].</td></tr>
 + 
 +<tr><td>576k</td><td>RAMBO</td><td>32</td><td>NIE</td><td>1,2,3,5,6</td><td>Bit 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.</td></tr>
<tr><td>576k</td><td>Compy Shop</td><td>32</td><td>TAK</td><td>1,2,3,6,7</td><td>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.</td></tr> <tr><td>576k</td><td>Compy Shop</td><td>32</td><td>TAK</td><td>1,2,3,6,7</td><td>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.</td></tr>
Linia 33: Linia 37:
== Wykrycie rozszerzenia i obliczenie jego rozmiaru == == 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:+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) * liczba dodatkowych banków 16k w rejestrze Y (lub 0, gdy komputer ma tylko 64k RAM)
Linia 54: Linia 62:
pha pha
- ldx #$0f ;zapamiętanie bajtów ext (z 16 bloków po 64k)+ ldx #$0f ;zapamiętanie bajtów ext (z 16 bloków po 64k)
_p0 jsr setpb _p0 jsr setpb
lda ext_b lda ext_b
Linia 61: Linia 69:
bpl _p0 bpl _p0
- ldx #$0f ;wyzerowanie ich (w oddzielnej pętli, bo nie wiadomo+ ldx #$0f ;wyzerowanie ich (w oddzielnej pętli, bo nie wiadomo
-_p1 jsr setpb ;które kombinacje bitów PORTB wybierają te same banki)+_p1 jsr setpb ;które kombinacje bitów PORTB wybierają te same banki)
lda #$00 lda #$00
sta ext_b sta ext_b
Linia 68: Linia 76:
bpl _p1 bpl _p1
- stx portb ;eliminacja pamięci podstawowej+ stx portb ;eliminacja pamięci podstawowej (X=$FF)
stx ext_b stx ext_b
stx $00 ;niezbędne dla niektórych rozszerzeń do 256k stx $00 ;niezbędne dla niektórych rozszerzeń do 256k
Linia 122: Linia 130:
ror ror
adc #$01 ;ustawienie bitu nr 1 w zaleznosci od stanu C adc #$01 ;ustawienie bitu nr 1 w zaleznosci od stanu C
- ora #$01 ;ustawienie bitu sterującego OS ROM na wartosc domyslna+ ora #$01 ;ustawienie bitu sterującego OS ROM na wartosc domyslna [1]
sta portb sta portb
rts rts
Linia 139: Linia 147:
* 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 [http://sdx.atari8.info/index.php?show=en_docs tutaj]. * 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 [http://sdx.atari8.info/index.php?show=en_docs 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.
[[Kategoria:Programowanie Atari 8-bit]] [[Kategoria:Programowanie Atari 8-bit]]

Aktualna wersja

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ą.
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