44. Skrytá pamäť: XBANKS, XPEEK, XPOKE, XDPEEK, XDPOKE, XMOVE, XFILL, XPUT, XGET$

Na čo to je

Atari XL má 64 kilobajtov pamäte, ale štvrtinu z nich zakrýva operačný systém: na adresách $C000–$FFFF procesor vidí ROM, a RAM, ktorá leží „pod ňou“, je bežne nedostupná. Atari 130XE a rôzne rozšírenia majú navyše desiatky až stovky kilobajtov v bankách – kusoch pamäte, z ktorých je naraz vidieť len jeden, cez okno na adresách $4000–$7FFF.

V interpreteri sa k tejto pamäti dalo dostať len strojovým kódom a s rizikom, že počítač zamrzne. Basic26 má na ňu vlastné slová, ktoré nepozná žiadny interpreter. Program cez ne číta a zapisuje skrytú pamäť tak jednoducho ako cez PEEK a POKE – obrazovka, zvuk aj klávesnica pritom bežia ďalej.

Na čo to je dobré: 14 kilobajtov pod ROM je miesto na texty hry, mapy, obrázky, uloženú pozíciu. Program v hlavnej pamäti tak môže byť väčší.

Zapnutie

Slová platia len s voľbou --xmem:

Turbo Basic XL
0 REM @COMPILE --xmem

Bez nej sú XPEEK, XBANKS a ostatné obyčajné mená premenných – tak, ako mohli byť v dobovom programe.

Banka a adresa

Každé slovo dostane dve čísla: banku a adresu.

BankaČo to je
0hlavná pamäť; od adresy $C000 (49152) vyššie je to RAM pod ROM
1 až XBANKSbanky rozšírenej pamäte; adresa musí byť v okne $4000–$7FFF (16384–32767)

Pod ROM nie je voľné všetko:

AdresyDesiatkovoČo tam je
$C000–$CFFF49152–53247voľné, 4 KB
$D000–$D7FF53248–55295obvody počítača – nedá sa čítať ani písať
$D800–$DFFF55296–57343voľné, 2 KB
$E000–$E3FF57344–58367kópia znakovej sady – nezapisovať
$E400–$FFF958368–65529voľné, 7 KB

Koľko bánk stroj má, povie funkcia XBANKS:

StrojXBANKS
800XL, 65XE (64 KB)0
130XE4
rozšírenia na 320 KB16
rozšírenia na 1 MB64

Jedna banka má 16 kilobajtov.

Slová

ZápisČo robí
XBANKSfunkcia: počet bánk rozšírenej pamäte
XPEEK(b,a)funkcia: bajt z banky b, adresy a
XDPEEK(b,a)funkcia: dvojbajtové číslo
XPOKE b,a,vzapíše bajt
XDPOKE b,a,vzapíše dvojbajtové číslo
XFILL b,a,n,vvyplní n bajtov hodnotou v
XMOVE sb,s,db,d,nskopíruje n bajtov z banky sb, adresy s do banky db, adresy d
XPUT b,a,A$zapíše znaky reťazca
XGET$(b,a,n)funkcia: reťazec z n bajtov

Celý program

Súbor examples/xmem.abas:

Atari BASIC
0 REM @COMPILE --xmem
10 REM Hidden memory: the RAM under the ROM and the banks
20 PRINT "Banks of extended memory: ";XBANKS
30 REM Bank 0 from 49152 on is the RAM under the operating system
40 XPOKE 0,49152,123
50 PRINT "Under the ROM: ";XPEEK(0,49152)
60 PRINT "The ROM itself: ";PEEK(49152)
70 XDPOKE 0,49154,12345
80 PRINT "Two bytes: ";XDPEEK(0,49154)
90 DIM A$(20):A$="HELLO, HIDDEN RAM"
100 XPUT 0,55296,A$
110 PRINT XGET$(0,55296,5)
120 XFILL 0,58368,100,42
130 XMOVE 0,55296,0,58368,5
140 PRINT XGET$(0,58368,8)
150 IF XBANKS=0 THEN PRINT "This machine has no banks":END
160 FOR B=1 TO XBANKS:XPOKE B,16384,B*10:NEXT B
170 FOR B=1 TO XBANKS:PRINT XPEEK(B,16384);" ";:NEXT B
180 PRINT

Preklad a spustenie

Simulátor vie byť rôznymi strojmi. Voľba --sim-mem hovorí ktorým:

Basic26 xmem.abas --sim --sim-mem 130xe

Čo uvidíš

Na Atari 130XE:

Banks of extended memory: 4
Under the ROM: 123
The ROM itself: 17
Two bytes: 12345
HELLO
HELLO***
10 20 30 40 

A na obyčajnom 800XL (--sim-mem 64):

Basic26 xmem.abas --sim --sim-mem 64
Banks of extended memory: 0
Under the ROM: 123
The ROM itself: 17
Two bytes: 12345
HELLO
HELLO***
This machine has no banks

Ako to funguje

Nové chyby

ČísloKedy
60banka, ktorú stroj nemá
3adresa mimo povoleného rozsahu: obvody, kópia znakovej sady, banka s adresou mimo okna
2XGET$ dlhší, než je voľnej pamäte

Dajú sa zachytiť cez TRAP ako každá iná.

Na čo si dať pozor

Časté chyby

Čo sa staloČo sa stane
chýba --xmemerror B26017 na prvom slove – berie sa ako meno premennej
banka 1 na stroji bez rozšíreniaERROR- 60 AT LINE 160
zápis do obvodov alebo znakovej sady (XPOKE 0,53248,…, XPOKE 0,57344,…)ERROR- 3
hodnota nad 255ERROR- 3
banka 0 a adresa pod 49152to isté ako PEEK a POKE – obyčajná hlavná pamäť
adresa v banke mimo 16384–32767banka sa overí, ale číta sa hlavná pamäť

Vyskúšaj si

  1. Ulož pod ROM desať čísel (XPOKE v slučke od adresy 49152) a prečítaj ich v opačnom poradí.
  2. Spusti program so --sim-mem rambo320. Koľko bánk hlási?
  3. Ulož text do banky 1 cez XPUT, do banky 2 iný, a vypíš oba cez XGET$. Skús to aj so --sim-mem 64 a chybu 60 zachyť cez TRAP.

Zhrnutie

Späť: 43. Pribalené súbory · Ďalej: 45. Skrytá pamäť v praxi