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ápis | Kam súbor pôjde |
|---|---|
--embed súbor@$C000 | pod ROM, od danej adresy |
--embed súbor@1:$4000 | do 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,s | vypíše text od adresy a v banke b až po bajt s hodnotou s (ten už nie) |
XPRINT #k,b,a,s | to isté do kanála k (súbor, tlačiareň) |
XBGET #k,b,a,n | prečíta n bajtov zo súboru do banky alebo pod ROM |
XBPUT #k,b,a,n | zapíše n bajtov z banky alebo spod ROM do súboru |
XBANK b | banka b ostane v okne natrvalo: PEEK a POKE na $4000–$7FFF siahajú do nej |
XANTIC b | obrazovka 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:
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 ROMAko to funguje
- Riadok 0:
rooms.datsa nahrá pod ROM od adresy$C000(49152). Program beží na každom XL a XE, banky nepotrebuje. - Riadok 50:
XPRINT 0,A,0vypíše text od adresyApo najbližší bajt 0. Dĺžku netreba vedieť a text nikdy neprejde cez hlavnú pamäť programu – môže byť ľubovoľne dlhý. Koniec riadkaXPRINTnepridáva, preto je za nímPRINT. - Riadky 80 a 90: program si nájde začiatok ďalšieho textu: preskočí znaky až po nulu a nulu samu.
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:
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 130xeBanks: 4
You are in a dark cellar.
You are in a dark cellar.- Riadok 70:
XBPUTzapíše 25 bajtov z banky 1 do súboru – akoBPUTv Turbo-BASICu XL (kapitola 34), ale zdroj je v banke. - Riadok 100:
XBGETich prečíta do banky 2. Takto sa do bánk nahráva, čo sa do programu pribaliť nedá alebo nechce: ďalšia úroveň hry, uložená pozícia.
Na stroji bez bánk:
Basic26 xbank.abas --sim --sim-mem 641 BANKS OF EXTENDED MEMORY NEEDEDXBANK: 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äť.
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.datBasic26 xbank.abas --code-only -o xbank.xexxbank.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 nich | 1 BANKS OF EXTENDED MEMORY NEEDED |
text pre XPRINT nemá ukončovací bajt | vypisuje sa ďalej, kým nenarazí na obvody alebo koniec pamäte: ERROR- 3 |
XBANK bez --reserve $4000-$7FFF | error B26056 |
XANTIC na stroji, ktorý to nevie | ERROR- 60 |
| súbor pre banku je dlhší než 16 KB | do okna sa nezmestí – chyba prekladu |
--data-only a --code-only s rôznymi voľbami | program dáta hľadá inde: THE DATA FILE IS NOT LOADED, alebo nezmysly |
Vyskúšaj si
- Pridaj do
rooms.datštvrtý text (v editore, ktorý vie vložiť bajt 0, alebo si súbor vyrob programom z kapitoly 24 cezPUT #1,0). - Uprav
xprint.abas: najprv prejdi texty a zapamätaj si ich začiatky v poli, potom ich vypíš v opačnom poradí. - Prelož
xbank.abass-va pozri, čo prekladač hovorí o bankách.
Zhrnutie
--embed súbor@$C000a--embed súbor@1:$4000nahrajú dáta pod ROM a do banky spolu s programom.XPRINT b,a,svypíše text rovno zo skrytej pamäte, po ukončovací bajt.XBGETaXBPUTpresúvajú dáta medzi súborom a skrytou pamäťou.XBANKdá banku do okna natrvalo (s--reserve $4000-$7FFF),XANTICz nej berie obraz.--data-onlya--code-onlyrozdelia hru na dáta a program.
Späť: 44. Skrytá pamäť · Ďalej: 46. Kompresia