Rozszerzenia pamięci Atari, czyli jak działa PORTB.

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.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s