Obsługa standardowego rozszerzenia pamięci RAM
From Atariki
Wersja z dnia 18:26, 24 lip 2022 KMK (Dyskusja | wkład) (→Wykrycie rozszerzenia i obliczenie jego rozmiaru) ← 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 oraz poza obszarem wewnętrznego BASIC-a ($A000-$BFFF). 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 | Typ | Liczba banków dodatkowych | Separacja CPU/ANTIC | Bity wyboru banku | Uwagi |
---|---|---|---|---|---|
128k | Atari | 4 | TAK | 2,3 | |
192k | Karen | 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. Takie zastosowanie bitu 7 nie jest zgodne z definicją Atari, ale w praktyce nie powoduje to godnych wzmianki kłopotów z kompatybilnością. |
576k | RAMBO (tf_hh) | 32 | NIE | 2,3,5,6,7 | Bit 7 wybiera banki przy skasowanym bicie 4, w przeciwnym wypadku SELF TEST. |
576k | RAMBO | 32 | NIE | 1,2,3,5,6 | 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. |
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. 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. |
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 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.