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:
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 |
|---|---|
| 0 | hlavná pamäť; od adresy $C000 (49152) vyššie je to RAM pod ROM |
1 až XBANKS | banky rozšírenej pamäte; adresa musí byť v okne $4000–$7FFF (16384–32767) |
Pod ROM nie je voľné všetko:
| Adresy | Desiatkovo | Čo tam je |
|---|---|---|
$C000–$CFFF | 49152–53247 | voľné, 4 KB |
$D000–$D7FF | 53248–55295 | obvody počítača – nedá sa čítať ani písať |
$D800–$DFFF | 55296–57343 | voľné, 2 KB |
$E000–$E3FF | 57344–58367 | kópia znakovej sady – nezapisovať |
$E400–$FFF9 | 58368–65529 | voľné, 7 KB |
Koľko bánk stroj má, povie funkcia XBANKS:
| Stroj | XBANKS |
|---|---|
| 800XL, 65XE (64 KB) | 0 |
| 130XE | 4 |
| rozšírenia na 320 KB | 16 |
| rozšírenia na 1 MB | 64 |
Jedna banka má 16 kilobajtov.
Slová
| Zápis | Čo robí |
|---|---|
XBANKS | funkcia: 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,v | zapíše bajt |
XDPOKE b,a,v | zapíše dvojbajtové číslo |
XFILL b,a,n,v | vyplní n bajtov hodnotou v |
XMOVE sb,s,db,d,n | skopí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:
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 PRINTPreklad 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 64Banks of extended memory: 0
Under the ROM: 123
The ROM itself: 17
Two bytes: 12345
HELLO
HELLO***
This machine has no banksAko to funguje
- Riadky 40 až 60:
XPOKEzapíše 123 do RAM pod ROM na adrese 49152.XPEEKho odtiaľ prečíta. ObyčajnýPEEKna tej istej adrese vidí ROM – iný bajt, 17. Sú to dve rôzne pamäte na jednej adrese. - Riadky 70 a 80: dvojbajtové číslo, ako
DPOKEaDPEEKv Turbo-BASICu XL. - Riadok 100:
XPUTuloží text reťazca pod ROM – len znaky, bez dĺžky. - Riadok 110:
XGET$z nich spraví reťazec, ktorý sa dá vypísať, priradiť alebo porovnať. Dĺžku treba povedať. - Riadok 120: sto hviezdičiek (kód 42) od adresy 58368.
- Riadok 130:
XMOVEskopíruje päť bajtov spod ROM inde pod ROM. Zdroj a cieľ môžu byť v rôznych bankách, alebo jeden z nich v hlavnej pamäti – napríkladXMOVE 0,ADR(A$),1,16384,LEN(A$)skopíruje reťazec do banky 1. - Riadok 150: program, ktorý má bežať aj na stroji bez rozšírenia, sa najprv spýta. Slučka na riadku 160 by na 64 KB stroji prebehla raz (
FORv Atari BASICu vždy aspoň raz) a skončila chybou. - Riadky 160 a 170: do každej banky iné číslo na tú istú adresu 16384 – a z každej sa prečíta to svoje.
Nové chyby
| Číslo | Kedy |
|---|---|
| 60 | banka, ktorú stroj nemá |
| 3 | adresa mimo povoleného rozsahu: obvody, kópia znakovej sady, banka s adresou mimo okna |
| 2 | XGET$ dlhší, než je voľnej pamäte |
Dajú sa zachytiť cez TRAP ako každá iná.
Na čo si dať pozor
- RAM-disk. DOS na 130XE vie banky používať ako rýchlu „disketu“
D8:. Program o nej nevie a zápisom do banky jej súbory zničí. XGET$si miesto požičiava z voľnej pamäte, len na chvíľu. Dlhý reťazec potrebuje aspoň toľko voľného miesta (FRE(0)).- Strojový kód pod ROM. Ak pribalený strojový kód (kapitola 43) používa RAM pod ROM sám, pobije sa s tvojimi
XPOKEo miesto. Prekladač to nevidí. - Emulátor. Program, ktorý používa len RAM pod ROM, beží na každom XL a XE. Program s bankami potrebuje emulátor nastavený ako 130XE alebo stroj s rozšírením.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
chýba --xmem | error B26017 na prvom slove – berie sa ako meno premennej |
| banka 1 na stroji bez rozšírenia | ERROR- 60 AT LINE 160 |
zápis do obvodov alebo znakovej sady (XPOKE 0,53248,…, XPOKE 0,57344,…) | ERROR- 3 |
| hodnota nad 255 | ERROR- 3 |
| banka 0 a adresa pod 49152 | to isté ako PEEK a POKE – obyčajná hlavná pamäť |
| adresa v banke mimo 16384–32767 | banka sa overí, ale číta sa hlavná pamäť |
Vyskúšaj si
- Ulož pod ROM desať čísel (
XPOKEv slučke od adresy 49152) a prečítaj ich v opačnom poradí. - Spusti program so
--sim-mem rambo320. Koľko bánk hlási? - Ulož text do banky 1 cez
XPUT, do banky 2 iný, a vypíš oba cezXGET$. Skús to aj so--sim-mem 64a chybu 60 zachyť cezTRAP.
Zhrnutie
--xmemzapne slová pre RAM pod ROM a banky rozšírenej pamäte.- Banka 0 s adresou od 49152 je RAM pod ROM (14 KB voľných); banky 1 až
XBANKSmajú okno 16384–32767. XPEEK,XPOKE,XDPEEK,XDPOKEpre bajty a čísla;XFILL,XMOVEpre bloky;XPUT,XGET$pre texty.- Chyba 60 znamená banku, ktorá nie je.
- Simulátor skúša rôzne stroje cez
--sim-mem.
Späť: 43. Pribalené súbory · Ďalej: 45. Skrytá pamäť v praxi