45. Skrytá pamäť v praxi: XPRINT, XBGET, XBPUT, XBANK, XANTIC

Na čo to je

Kapitola 44 ukázala, ako do skrytej pamäte zapísať bajt a prečítať ho. Táto ukazuje, ako ju naozaj využiť: dáta sa do nej nahrajú spolu s programom, texty sa vypisujú rovno z nej a obrazovka sa dá pripraviť v banke, kým sa díva iná.

Dáta nahraté s programom

Voľba --embed z kapitoly 43 vie súbor uložiť aj do skrytej pamäte:

ZápisKam súbor pôjde
--embed súbor@$C000pod ROM, od danej adresy
--embed súbor@1:$4000do banky 1 (číslo banky, dvojbodka, adresa v okne $4000–$7FFF)

Program, ktorý potrebuje banky, to pri štarte overí sám. Na stroji, ktorý ich nemá, vypíše napríklad 1 BANKS OF EXTENDED MEMORY NEEDED a skončí.

Slová

ZápisČo robí
XPRINT b,a,svypíše text od adresy a v banke b až po bajt s hodnotou s (ten už nie)
XPRINT #k,b,a,sto isté do kanála k (súbor, tlačiareň)
XBGET #k,b,a,nprečíta n bajtov zo súboru do banky alebo pod ROM
XBPUT #k,b,a,nzapíše n bajtov z banky alebo spod ROM do súboru
XBANK bbanka b ostane v okne natrvalo: PEEK a POKE na $4000–$7FFF siahajú do nej
XANTIC bobrazovka sa číta z banky b, procesor ostáva v hlavnej pamäti

Celý program: texty pod ROM

Textová hra má stovky viet. V hlavnej pamäti zaberajú miesto programu; pod ROM neprekážajú nikomu. Súbor examples/rooms.dat obsahuje tri texty za sebou, každý ukončený bajtom 0. Súbor examples/xprint.abas:

Atari BASIC
0 REM @COMPILE --xmem --embed rooms.dat@$C000
10 REM Texts kept under the ROM and printed from there
20 A=49152
30 FOR R=1 TO 3
40   PRINT R;": ";
50   XPRINT 0,A,0
60   PRINT
70   REM Step over the text and the nought that ends it
80   IF XPEEK(0,A)<>0 THEN A=A+1:GOTO 80
90   A=A+1
100 NEXT R
110 PRINT "The texts take ";A-49152;" bytes under the ROM"

Preklad a spustenie

Basic26 xprint.abas --sim --sim-mem 64

Čo uvidíš

1: You are in a dark cellar.
2: A narrow corridor leads north.
3: Daylight at last!
The texts take 75 bytes under the ROM

Ako to funguje

Skutočná hra by si začiatky textov nehľadala zakaždým, ale mala by ich v poli alebo v DATA: XPRINT 0,T(ROOM),0.

Tretie číslo je znak, ktorým text končí. Nula je zvyk; hodí sa aj 155 (koniec riadka) pre texty uložené po riadkoch.

Druhý program: banky a súbory

Súbor examples/xbank.abas má tie isté texty v banke 1 a ukazuje presun medzi bankou a súborom:

Atari BASIC
0 REM @COMPILE --xmem --embed rooms.dat@1:$4000
10 REM The same texts in a bank of extended memory
20 PRINT "Banks: ";XBANKS
30 XPRINT 1,16384,0
40 PRINT
50 REM A file into a bank and back out of it
60 OPEN #1,8,0,"D:COPY.DAT"
70 XBPUT #1,1,16384,25
80 CLOSE #1
90 OPEN #1,4,0,"D:COPY.DAT"
100 XBGET #1,2,16384,25
110 CLOSE #1
120 PRINT XGET$(2,16384,25)
Basic26 xbank.abas --sim --sim-mem 130xe
Banks: 4
You are in a dark cellar.
You are in a dark cellar.

Na stroji bez bánk:

Basic26 xbank.abas --sim --sim-mem 64
1 BANKS OF EXTENDED MEMORY NEEDED

XBANK: banka ako obyčajná pamäť

Po XBANK 1 je banka 1 v okne $4000–$7FFF stále. Obyčajné PEEK, POKE, MOVE aj strojový kód cez USR tam potom pracujú s bankou; XBANK 0 vráti hlavnú pamäť.

Turbo Basic XL
0 REM @COMPILE --xmem --reserve $4000-$7FFF
10 XBANK 1:POKE 16384,77:XBANK 0
20 PRINT PEEK(16384);" ";XPEEK(1,16384)

vypíše 0 77. Háčik je v hlavičke: XBANK smie len program preložený s --reserve $4000-$7FFF. Bez toho by v okne ležal sám program a banka by ho zakryla – prekladač to odmietne (error B26056). S rezervou musí kód programu skončiť pod $4000 a voľná pamäť pre DIM začína až na $8000.

XANTIC: obrazovka v banke

Atari 130XE vie niečo zvláštne: obvod, ktorý kreslí obraz (ANTIC), sa môže dívať do inej banky než procesor. XANTIC 1 povie: „obraz ber z banky 1“. Program tak môže mať v bankách pripravených niekoľko obrazoviek a prepínať medzi nimi okamžite, alebo novú obrazovku kresliť tam, kam sa práve nikto nedíva. XANTIC 0 to vráti.

Funguje to na 130XE a rozšíreniach, ktoré to tiež vedia; na ostatných (napríklad RAMBO) skončí chybou 60. Obrazovka v banke sa nedá vyskúšať v simulátore – ten obraz nekreslí.

Program a dáta zvlášť

Hra s veľa dátami v bankách sa dlho nahráva. Dá sa preložiť na dva súbory:

Basic26 xbank.abas --data-only -o xbank.dat
Basic26 xbank.abas --code-only -o xbank.xex

xbank.dat obsahuje len to, čo ide do bánk a pod ROM. xbank.xex je program bez dát. Na Atari sa nahrá najprv xbank.dat, potom xbank.xex. Program pri štarte skontroluje, či dáta na mieste sú; ak nie, vypíše THE DATA FILE IS NOT LOADED a skončí. Pri ladení potom stačí znova nahrať len krátky program. Oba súbory musia byť preložené s rovnakými voľbami.

Časté chyby

Čo sa staloČo sa stane
program s bankami na stroji bez nich1 BANKS OF EXTENDED MEMORY NEEDED
text pre XPRINT nemá ukončovací bajtvypisuje sa ďalej, kým nenarazí na obvody alebo koniec pamäte: ERROR- 3
XBANK bez --reserve $4000-$7FFFerror B26056
XANTIC na stroji, ktorý to nevieERROR- 60
súbor pre banku je dlhší než 16 KBdo okna sa nezmestí – chyba prekladu
--data-only a --code-only s rôznymi voľbamiprogram dáta hľadá inde: THE DATA FILE IS NOT LOADED, alebo nezmysly

Vyskúšaj si

  1. Pridaj do rooms.dat štvrtý text (v editore, ktorý vie vložiť bajt 0, alebo si súbor vyrob programom z kapitoly 24 cez PUT #1,0).
  2. Uprav xprint.abas: najprv prejdi texty a zapamätaj si ich začiatky v poli, potom ich vypíš v opačnom poradí.
  3. Prelož xbank.abas s -v a pozri, čo prekladač hovorí o bankách.

Zhrnutie

Späť: 44. Skrytá pamäť · Ďalej: 46. Kompresia