<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=Obs%C5%82uga_standardowego_rozszerzenia_pami%C4%99ci_RAM</id>
	<title>Obsługa standardowego rozszerzenia pamięci RAM - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=Obs%C5%82uga_standardowego_rozszerzenia_pami%C4%99ci_RAM"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Obs%C5%82uga_standardowego_rozszerzenia_pami%C4%99ci_RAM&amp;action=history"/>
	<updated>2026-10-02T17:34:06Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=Obs%C5%82uga_standardowego_rozszerzenia_pami%C4%99ci_RAM&amp;diff=3056&amp;oldid=prev</id>
		<title>imported&gt;Atariki recovery: Reconstructed from archived HTML; see provenance manifest</title>
		<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Obs%C5%82uga_standardowego_rozszerzenia_pami%C4%99ci_RAM&amp;diff=3056&amp;oldid=prev"/>
		<updated>2026-10-01T08:51:48Z</updated>

		<summary type="html">&lt;p&gt;Reconstructed from archived HTML; see provenance manifest&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Informacje ogólne ==&lt;br /&gt;
&lt;br /&gt;
Rozszerzenie standardowe to takie, którym steruje się przez rejestr [[Rejestry PIA#PORTB|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.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;widzą&amp;quot; to samo).&lt;br /&gt;
&lt;br /&gt;
Podstawowe cechy rozszerzeń można ująć jak w tabeli poniżej:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! Łączny&amp;lt;br /&amp;gt;rozmiar&lt;br /&gt;
! Typ&lt;br /&gt;
! Liczba banków&amp;lt;br /&amp;gt;dodatkowych&lt;br /&gt;
! Separacja&amp;lt;br /&amp;gt;CPU/ANTIC&lt;br /&gt;
! Bity wyboru&amp;lt;br /&amp;gt;banku&lt;br /&gt;
! Uwagi&lt;br /&gt;
|-&lt;br /&gt;
| 128k&lt;br /&gt;
| Atari&lt;br /&gt;
| 4&lt;br /&gt;
| TAK&lt;br /&gt;
| 2,3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 192k&lt;br /&gt;
| Karen&lt;br /&gt;
| 8&lt;br /&gt;
| TAK&lt;br /&gt;
| 2,3,6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 256k&lt;br /&gt;
| RAMBO&lt;br /&gt;
| 12&lt;br /&gt;
| NIE&lt;br /&gt;
| 2,3,5,6&lt;br /&gt;
| Niektóre kombinacje bitów się dublują.&lt;br /&gt;
|-&lt;br /&gt;
| 320k&lt;br /&gt;
| RAMBO&lt;br /&gt;
| 16&lt;br /&gt;
| NIE&lt;br /&gt;
| 2,3,5,6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 320k&lt;br /&gt;
| Compy Shop&lt;br /&gt;
| 16&lt;br /&gt;
| TAK&lt;br /&gt;
| 2,3,6,7&lt;br /&gt;
| 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ą.&lt;br /&gt;
|-&lt;br /&gt;
| 576k&lt;br /&gt;
| RAMBO (tf_hh)&lt;br /&gt;
| 32&lt;br /&gt;
| NIE&lt;br /&gt;
| 2,3,5,6,7&lt;br /&gt;
| Bit 7 wybiera banki przy skasowanym bicie 4, w przeciwnym wypadku [[SELF TEST]].&lt;br /&gt;
|-&lt;br /&gt;
| 576k&lt;br /&gt;
| RAMBO&lt;br /&gt;
| 32&lt;br /&gt;
| NIE&lt;br /&gt;
| 1,2,3,5,6&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| 576k&lt;br /&gt;
| Compy Shop&lt;br /&gt;
| 32&lt;br /&gt;
| TAK&lt;br /&gt;
| 1,2,3,6,7&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| 1088k&lt;br /&gt;
| RAMBO&lt;br /&gt;
| 64&lt;br /&gt;
| NIE&lt;br /&gt;
| 1,2,3,5,6,7&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| 2112k&lt;br /&gt;
| RAMBO&lt;br /&gt;
| 128&lt;br /&gt;
| NIE&lt;br /&gt;
| 0,1,2,3,5,6,7&lt;br /&gt;
| 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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Rozszerzenia są kompatybilne &amp;quot;w dół&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Wykrycie rozszerzenia i obliczenie jego rozmiaru ==&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Ponadto przyjęto założenie, że znajdzie się też poza obszarem RAM-u rezydującego &amp;quot;pod&amp;quot; ROM OS ($C000-$CFFF i $D800-$FFFF) - modyfikacja mająca na celu zniesienie tego ograniczenia jest na tyle łatwa, że opis zostanie pominięty.&lt;br /&gt;
&lt;br /&gt;
Dane wyjściowe:&lt;br /&gt;
&lt;br /&gt;
* liczba dodatkowych banków 16k w rejestrze Y (lub 0, gdy komputer ma tylko 64k RAM)&lt;br /&gt;
* wartości PORTB w tablicy &amp;#039;&amp;#039;banks&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; etykiety&lt;br /&gt;
ext_b  = $4000       ;cokolwiek z zakresu $4000-$7FFF&lt;br /&gt;
portb  = $d301&lt;br /&gt;
&lt;br /&gt;
; procedura&lt;br /&gt;
detect_ext&lt;br /&gt;
       lda portb&lt;br /&gt;
       pha&lt;br /&gt;
&lt;br /&gt;
       lda #$ff&lt;br /&gt;
       sta portb&lt;br /&gt;
&lt;br /&gt;
       lda ext_b&lt;br /&gt;
       pha&lt;br /&gt;
&lt;br /&gt;
       ldx #$0f       ;zapamiętanie bajtów ext (z 16 bloków po 64k)&lt;br /&gt;
_p0    jsr setpb&lt;br /&gt;
       lda ext_b&lt;br /&gt;
       sta bsav,x&lt;br /&gt;
       dex&lt;br /&gt;
       bpl _p0&lt;br /&gt;
&lt;br /&gt;
       ldx #$0f       ;wyzerowanie ich (w oddzielnej pętli, bo nie wiadomo&lt;br /&gt;
_p1    jsr setpb      ;które kombinacje bitów PORTB wybierają te same banki)&lt;br /&gt;
       lda #$00&lt;br /&gt;
       sta ext_b&lt;br /&gt;
       dex&lt;br /&gt;
       bpl _p1&lt;br /&gt;
&lt;br /&gt;
       stx portb      ;eliminacja pamięci podstawowej (X=$FF)&lt;br /&gt;
       stx ext_b&lt;br /&gt;
       stx $00        ;niezbędne dla niektórych rozszerzeń do 256k&lt;br /&gt;
&lt;br /&gt;
       ldy #$00       ;pętla zliczająca bloki 64k&lt;br /&gt;
       ldx #$0f&lt;br /&gt;
_p2    jsr setpb&lt;br /&gt;
       lda ext_b      ;jeśli ext_b jest różne od zera, blok 64k już zliczony&lt;br /&gt;
       bne _n2&lt;br /&gt;
&lt;br /&gt;
       dec ext_b      ;w przeciwnym wypadku zaznacz jako zliczony&lt;br /&gt;
&lt;br /&gt;
       lda ext_b      ;sprawdz, czy sie zaznaczyl; jesli nie -&amp;amp;gt; cos nie tak ze sprzetem&lt;br /&gt;
       bpl _n2&lt;br /&gt;
&lt;br /&gt;
       lda portb      ;wpisz wartość PORTB do tablicy dla banku 0&lt;br /&gt;
       sta banks,y&lt;br /&gt;
       eor #%00000100 ;uzupełnij wartości dla banków 1, 2, 3&lt;br /&gt;
       sta banks+1,y&lt;br /&gt;
       eor #%00001100&lt;br /&gt;
       sta banks+2,y&lt;br /&gt;
       eor #%00000100&lt;br /&gt;
       sta banks+3,y&lt;br /&gt;
       iny&lt;br /&gt;
       iny&lt;br /&gt;
       iny&lt;br /&gt;
       iny&lt;br /&gt;
&lt;br /&gt;
_n2    dex&lt;br /&gt;
       bpl _p2&lt;br /&gt;
&lt;br /&gt;
       ldx #$0f       ;przywrócenie zawartości ext&lt;br /&gt;
_p3    jsr setpb&lt;br /&gt;
       lda bsav,x&lt;br /&gt;
       sta ext_b&lt;br /&gt;
       dex&lt;br /&gt;
       bpl _p3&lt;br /&gt;
&lt;br /&gt;
       stx portb      ;X=$FF&lt;br /&gt;
&lt;br /&gt;
       pla&lt;br /&gt;
       sta ext_b&lt;br /&gt;
&lt;br /&gt;
       pla&lt;br /&gt;
       sta portb&lt;br /&gt;
       rts&lt;br /&gt;
&lt;br /&gt;
; podprogramy&lt;br /&gt;
setpb  txa            ;zmiana kolejności bitów: %0000dcba -&amp;amp;gt; %cba000d0&lt;br /&gt;
       lsr&lt;br /&gt;
       ror&lt;br /&gt;
       ror&lt;br /&gt;
       ror&lt;br /&gt;
       adc #$01       ;ustawienie bitu nr 1 w zaleznosci od stanu C&lt;br /&gt;
       ora #$01       ;ustawienie bitu sterującego OS ROM na wartosc domyslna [1]&lt;br /&gt;
       sta portb&lt;br /&gt;
       rts&lt;br /&gt;
&lt;br /&gt;
; zmienne&lt;br /&gt;
banks  .ds 64&lt;br /&gt;
bsav   .ds 16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uwagi ===&lt;br /&gt;
&lt;br /&gt;
* Procedura zwraca listę banków widocznych dla CPU.&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
* Procedura obsługuje rozszerzenia o rozmiarach do 64 banków (1088k). Rozszerzenie do 2112k nie jest brane pod uwagę.&lt;br /&gt;
&lt;br /&gt;
* Zawartość tablicy &amp;#039;&amp;#039;banks&amp;#039;&amp;#039; 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 &amp;quot;Przewodniku programisty SpartaDOS X&amp;quot;, dostępnym [http://sdx.atari8.info/index.php?show=en_docs tutaj].&lt;br /&gt;
&lt;br /&gt;
* Procedura zakłada, że będzie działać przy &amp;#039;&amp;#039;&amp;#039;włączonym&amp;#039;&amp;#039;&amp;#039; 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 &amp;quot;[1]&amp;quot; należy wymienić na AND #$FE.&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Programowanie Atari 8-bit]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>