Obsługa standardowego rozszerzenia pamięci RAM
From Atariki
| Wersja z dnia 16:51, 20 lut 2016 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 17:25, 20 lut 2016 KMK (Dyskusja | wkład) (tabelka) Next diff → |
||
| Linia 6: | Linia 6: | ||
| Nie wszystkie rozszerzenia pamięci kontrolowane przez PORTB implementują działanie bitu 5 zgodnie ze 130XE. Robią tak przede wszystkim rozszerzenia tzw. [[Compy Shop (rozszerzenie RAM)|Compy Shop]]. W pozostałych (tzw. [[Rambo_XL|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). | Nie wszystkie rozszerzenia pamięci kontrolowane przez PORTB implementują działanie bitu 5 zgodnie ze 130XE. Robią tak przede wszystkim rozszerzenia tzw. [[Compy Shop (rozszerzenie RAM)|Compy Shop]]. W pozostałych (tzw. [[Rambo_XL|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). | ||
| - | Do wyboru numeru banków służą następujące zestawy bitów: | + | Podstawowe cechy rozszerzeń można ująć jak w tabeli poniżej: |
| + | |||
| + | <table border=1 cellpadding=5> | ||
| + | <tr><td><b>Łączny<br>rozmiar</b></td><td><b>Typ</b></td><td><b>Liczba banków<br>dodatkowych</b></td><td><b>Separacja<br>CPU/ANTIC</b></td><td><b>Bity</b></td><td><b>Uwagi</b></td></tr> | ||
| + | |||
| + | <tr><td>128k</td><td> </td><td>4</td><td>TAK</td><td>2,3</td><td> </td></tr> | ||
| + | |||
| + | <tr><td>192k</td><td> </td><td>8</td><td>TAK</td><td>2,3,6</td> <td></td></tr> | ||
| + | |||
| + | <tr><td>256k</td><td>RAMBO</td><td>12</td><td>NIE</td><td>2,3,5,6</td><td>Niektóre kombinacje bitów się dublują.</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>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>1088k</td><td>RAMBO</td><td>64</td><td>NIE</td><td>1,2,3,5,6,7</td><td>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.</td></tr> | ||
| + | |||
| + | <tr><td>2112k</td><td>RAMBO</td><td>128</td><td>NIE</td><td>0,1,2,3,5,6,7</td><td>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.</td></tr> | ||
| + | |||
| + | </table> | ||
| - | * 128k (4 banki dodatkowe, oddzielny dostęp dla CPU i ANTIC-a): bity 2,3 | ||
| - | * 192k (8 banków dodatkowych, oddzielny dostęp dla CPU i ANTIC-a): bity 2,3,6 | ||
| - | * 256k typu RAMBO (12 banków dodatkowych): bity 2,3,5,6 - niektóre kombinacje się dublują | ||
| - | * 320k typu RAMBO (16 banków dodatkowych): bity 2,3,5,6 | ||
| - | * 320k typu Compy Shop (16 banków dodatkowych, oddzielny dostęp dla CPU i ANTIC-a): bity 2,3,6,7 - bit 7 wybiera banki przy skasowanym bicie 4 lub 5 (lub obu), w przeciwnym razie wybiera SELF TEST. | ||
| - | * 576k typu Compy Shop (32 banki dodatkowe): bity 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 BASIC. Z tego ostatniego powodu możliwe są kłopoty z kompatybilnością, ale występują tylko w bardzo specyficznych warunkach. | ||
| - | * 1088k typu RAMBO (64 banki dodatkowe): bity 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. | ||
| - | * 2112k typu RAMBO (128 banków dodatkowych): bity 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. | 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. | ||
| Linia 122: | Linia 135: | ||
| * Procedura bierze pod uwagę osobliwość [[Newell Industries (rozszerzenie RAM)|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 bierze pod uwagę osobliwość [[Newell Industries (rozszerzenie RAM)|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 [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]. | ||
| [[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] | ||
Wersja z dnia 17:25, 20 lut 2016
Informacje ogólne
Rozszerzenie standardowe to takie, którym steruje się przez rejestr PORTB układu PIA. Kombinacje bitów tego rejestru 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 | Uwagi |
| 128k | 4 | TAK | 2,3 | ||
| 192k | 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. Take zastosowanie bitu 7 nie jest zgodne z definicją Atari, ale w praktyce nie powoduje to godnych wzmianki kłopotów z kompatybilnością. |
| 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. |
| 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 być ulokowana w całości poza obszarem $4000-$7FFF. 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
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
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.
