Okazuje się, że to wcale nie takie proste jak się Atari pamięta głównie z czasów dziecinnych, a pozostała dokumentacja jest często rozrzucona i niekompletna.
Najpierw co to ten PORTB. W skrócie to rejestr pod adresem 54017. Ustawiając odpowiednie bity tego rejestru możemy skonfigurować dodatkową pamięć.
Znaczenie poszczególnych bitów w 130XE (wg. Atari Magazine):
Bit | Opis |
0 | 1: włącz OS ROM, brak dostępu do RAM w obszarze $C000-$FFFF (default) 0: wyłącz OS ROM włącz RAM w obszarze $C000-$FFFF |
1 | 0: włącz BASIC ROM od obszarze $A000-$BFFF (default) 1: wyłącz BASIC ROM, dostęp do RAM w obszarze $A000-$BFFF |
2 3 | 00: pierwszy 16K bank w obszarze $4000-$7FFF 01: drugi bank w obszarze $4000-$7FFF 10: trzeci bank w obszarze $4000-$7FFF 11: czwarty bank w obszarze $4000-$7FFF |
4 | 1: 6502 ma dostęp do pamięci podstawowej (default) 0: 6502 ma dostęp do pamięci rozszerzonej |
5 | 1: ANTIC ma dostęp do pamięci podstawowej (default) 0: ANTIC ma dostęp do pamięci rozszerzonej |
6 | Nie używane. Default = 1 |
7 | 1: wyłacz self-test, włącz RAM $5000-$57FF (default po włączeniu) 0: włącz self-test wyłącz RAM pomiędzy $5000-$57FF |
To w przypadku Atari 130XE, a co z innymi rozszerzeniami?
Znalazłem jedno sensowne wytłumaczenie tutaj (niestety serwer nie działa, ale od czego jest google cache):
PORT B – jest to grupa rozszerzeń opartych o rejestr sterujący $d301 (tzw. PORT B), przeznaczonych dla komputerów Atari 8-bit serii XL/XE. Rozszerzenia te opierają się na bankach 16kB RAM, przełączanych w obszarze adresowym $4000-$7fff, czyli w tym samym obszarze co rozszerzenie Axlon.
- 130XE – standardowo Atari 130XE posiadało 4 dodatkowe banki, które wybierało się bitami 2 i 3 rejestru PORT B. Bit 4 sterował dostępem 6502 do dodatkowej pamięci, natomiast bit 5 dostępem Antica do dodatkowej pamięci – wartość 1 danego bitu ustawiała dostęp danego procesora (6502 lub Antica) do pamięci podstawowej, wartość 0 do dodatkowej, dzięki czemu istniała możliwość niezależnego dostępu 6502 i Antica.
- 192kB – rozszerzenie analogiczne do 130XE, z tym, że do bitów 2 i 3 dochodził dodatkowo bit 6, dzięki czemu liczba kombinacji wzrosła do 8 banków dodatkowej pamięci (czyli +128kB dodatkowej pamięci)
- TOMS 256kB, 256kB/320kB RAMBO – rozszerzenia polegały na tym, że bit 4 decydował o dostępie zarówno Antica jak i 6502 do dodatkowej pamięci, natomiast bit 5 był dodatkowym bitem umożliwiającym wybór banku. Dawało to możliwość wyboru 16 banków (czyli +256kB RAM) za pomocą bitów 2,3,5,6, jednak w niektórych rozszerzeniach z racji specyfiki konstrukcyjnej wykorzystywano tylko 12 dodatkowych banków.
- 576kB RAMBO/320kB Compy Shop – rozszerzenia polegały na tym, że bit 7 portu B, który standardowo w Atari 8-bit odpowiadał za dostęp do pamięci ROM z Self Testem pełnił podwójną rolę. Przy bicie 4 = 1 pełnił swoją standardową rolę, natomiast w wypadku wartości 0 bit ten stanowił dodatkowy bit określający wybór banku. Zatem bity 2,3,6,7 pozwalały na zaadresowanie 16 banków. W wypadku rozszerzenia RAMBO 576kB wyboru banku dokonywał również bit 5 (wspólnie sterowany dostęp Antica i CPU przez bit 4), co dawało wybór 32 banków, natomiast w rozszerzeniu Compy Shop bit 5 decydował o niezależnym dostępie Antica.
- 1088kB RAMBO/576kB Compy Shop – rozszerzenia analogiczne do 576kB RAMBO/320kB Compy Shop, jednak dochodził tam dodatkowy bit sterujący: bit 1, który standardowo decyduje o włączeniu/wyłączeniu ROM-u z interpreterem Basica. W tym wypadku, gdy bit 4 miał wartość 1, bit 1 pełnił swoją rolę „po staremu”, jednak w wypadku bitu 4 równego 0, bit 1 wraz z bitami 7,6,2,3,5 dawał możliwość wyboru 64 banków (+1 MB) w rozszerzeniu 1088kB RAMBO lub 32 banków (+512kB) z rozszerzeniem 576kB Compy Shop.
To teoria, a teraz prosty przykład w Action! Program zapisuje 10 bajtów z numerem banku do 10-ciu kolejnych banków w Rambo 320K.
; 320K Rambo ; 7 6 5 4 3 2 1 0 bit no ; ; 1 0 0 0 0 0 1 1 : 131 ; 1 0 0 0 0 1 1 1 : 135 ; 1 0 0 0 1 0 1 1 : 139 ; 1 0 0 0 1 1 1 1 : 143 ; 1 0 1 0 0 0 1 1 : 163 ; 1 0 1 0 0 1 1 1 : 167 ; 1 0 1 0 1 0 1 1 : 171 ; 1 0 1 0 1 1 1 1 : 175 ; 1 1 0 0 0 0 1 1 : 195 ; 1 1 0 0 1 0 1 1 : 203 ; bits 2356 define bank no ; bit 4 allows CPU and ANTIC access include "H1:RUNTIME.ACT" proc main() byte array pb = [131 135 139 143 163 167 171 175 195 203] card portb=54017 int i,j byte pointer ptr for i=0 to 9 do portb=pb(i) ptr=$4000 for j=0 to 9 do ptr^=i ptr==+1 od od for i=0 to 9 do portb=pb(i) ptr=$4000 printf("Bank %I%E", i) for j=0 to 9 do printf("%I", ptr^) ptr==+1 od printe() od do od return
I jeszcze analogiczny przykład dla 576K Compy Shop (ten typ rozszerzenia pozwala na niezależne ustawienie dostępu dla CPU i ANTIC (w U1MB jest zarówno 320K RAMBO jak i 576K Compy Shop).
; 576K Compy shop ; ; 7 6 5 4 3 2 1 0 bit no ; ; 0 0 0 0 0 0 0 1 : 1 ; 0 0 0 0 0 0 1 1 : 3 ; 0 0 0 0 0 1 0 1 : 5 ; 0 0 0 0 0 1 1 1 : 7 ; 0 0 0 0 1 0 0 1 : 9 ; 0 0 0 0 1 0 1 1 : 11 ; 0 0 0 0 1 1 0 1 : 13 ; 0 0 0 0 1 1 1 1 : 15 ; 0 1 0 0 0 0 0 1 : 65 ; 0 1 0 0 0 0 1 1 : 67 ; 76321 define bank no, bits 4 and 5 control ; CPU's and ANTIC's independent access include "H1:RUNTIME.ACT" proc main() byte array pb = [1 3 5 7 9 11 13 15 65 67] card portb=54017 int i,j byte pointer ptr for i=0 to 9 do portb=pb(i) ptr=$4000 for j=0 to 9 do ptr^=i ptr==+1 od od for i=0 to 9 do portb=pb(i) ptr=$4000 printf("Bank %I%E", i) for j=0 to 9 do printf("%I", ptr^) ptr==+1 od printe() od do od return
A tutaj mój wątek na AtariAge. Może komuś angielskojęzycznemu się przyda.