46. Kompresia: --pack, XUNPACK, --pack-text, --text-under-rom, --text-in-banks
Na čo to je
Pamäte je na Atari málo a dáta sa často opakujú: obrazovka je z polovice prázdna, texty sa skladajú z tých istých slov. Kompresia (zbalenie) také dáta zapíše úspornejšie; pred použitím sa rozbalia naspäť.
Basic26 vie dve veci:
- zbaliť ľubovoľný súbor (obrázok, mapu, obrazovku) a v programe ho rozbaliť príkazom
XUNPACK, - zbaliť texty programu – bez jedinej zmeny v programe, len voľbou prekladača.
Zbalenie súboru: --pack
Basic26 súbor --pack -o zbalený
Basic26 zbalený --unpack -o pôvodnýS --pack prekladač nič neprekladá: vstup je hocijaký súbor a výstup ten istý súbor zbalený. --unpack robí opak (na kontrolu).
Súbor examples/title.scr je titulná obrazovka: 960 bajtov, presne toľko, koľko má textová obrazovka (40 × 24).
Basic26 title.scr --pack -o title.pak -vpacked title.scr: 960 -> 82 bytes (ZX02)Z 960 bajtov je 82. (Obrazovka plná medzier a hviezdičiek sa balí výborne; fotografia by dopadla horšie.) Metóda sa volá ZX02 – je to obľúbený formát malých počítačov, lebo rozbaľovací program je kratučký. Keď sa súbor zbaliť nedá, uloží sa tak, ako je, a XUNPACK si poradí aj s tým.
Rozbalenie v programe: XUNPACK
XUNPACK zdrojová banka,zdrojová adresa,cieľová banka,cieľová adresaBanka a adresa sú tie isté ako v kapitole 44: banka 0 je hlavná pamäť a od $C000 RAM pod ROM. Dĺžku si zbalené dáta nesú samy. XUNPACK je jedno zo slov rozšírenej pamäte, takže program potrebuje --xmem.
Celý program
Súbor examples/unpack.abas má zbalenú obrazovku pod ROM a rozbalí ju rovno do pamäte obrazovky:
0 REM @COMPILE --xmem --embed title.pak@$C000
10 REM A packed screen under the ROM, unpacked onto the screen
20 GRAPHICS 0:POKE 752,1
30 SCR=PEEK(88)+256*PEEK(89)
40 XUNPACK 0,49152,0,SCRPreklad a spustenie
Basic26 unpack.abas --runalebo v simulátore, ktorý na konci ukáže obrazovku:
Basic26 unpack.abas --sim --sim-mem 64 --sim-screenČo uvidíš
**************************************
* *
* *
* THE CELLAR *
* *
* A SMALL ADVENTURE *
* *
* PRESS START *
* *
**************************************
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .Ako to funguje
- Riadok 0: 82 bajtov zbalenej obrazovky sa nahrá pod ROM na adresu
$C000. V hlavnej pamäti nezaberajú nič. - Riadok 30: adresa pamäte obrazovky (kapitola 18).
- Riadok 40:
XUNPACKčíta zbalené dáta spod ROM (banka 0, adresa 49152) a rozbalených 960 bajtov píše do hlavnej pamäte od adresy obrazovky. Celá obrazovka sa objaví naraz – žiadnych 24 príkazovPRINT.
Zdroj aj cieľ môžu byť kdekoľvek: v hlavnej pamäti, pod ROM, v rôznych bankách. Obrázok sa dá rozbaliť z banky 1 na obrazovku, mapa spod ROM do reťazca (ADR(M$)).
Poznámka k súboru title.scr: sú v ňom kódy obrazovky, nie ATASCII. Obrazovka Atari si znaky ukladá pod inými číslami, než aké má CHR$ – medzera je 0, A je 33. Najjednoduchšie je nechať si obrazovku nakresliť programom a uložiť ju cez BPUT #1,DPEEK(88),960 (kapitola 34).
Texty programu
Textová hra je z veľkej časti text v príkazoch PRINT. Tri voľby s ním vedia naložiť úspornejšie – program sa pritom nemení:
| Voľba | Čo robí |
|---|---|
--pack-text | zbalí texty slovníkom častých dvojíc znakov; zaberú asi dve tretiny |
--text-under-rom | presunie texty do RAM pod ROM; hlavná pamäť ostane programu |
--text-in-banks | presunie texty do bánk rozšírenej pamäte (--text-in-banks=2 najviac do dvoch) |
Týkajú sa textov v úvodzovkách dlhých 8 až 255 znakov. Pri použití sa text na chvíľu skopíruje (a rozbalí) do voľnej pamäte, vypíše a miesto sa uvoľní.
Súbor examples/texts.abas má dvadsať viet:
10 REM A program with a lot of text
20 PRINT "You are standing in a dark cellar under the old house."
30 PRINT "The walls are wet and the air smells of earth and mould."
40 PRINT "A narrow corridor leads north, deeper under the house."
50 PRINT "Somewhere in the dark you can hear water dripping slowly."
60 PRINT "On the floor lies an old rusty key and a broken lantern."
70 PRINT "The stairs behind you have fallen in. There is no way back."
80 PRINT "The corridor turns east and ends at a heavy wooden door."
90 PRINT "The door is locked. Its keyhole is full of rust and dust."
100 PRINT "You are in a small round room with a well in the middle."
110 PRINT "The water in the well is black and you cannot see the bottom."
120 PRINT "A rope hangs down into the well. It looks old but strong."
130 PRINT "You climb down the rope into the dark and the cold."
140 PRINT "At the bottom of the well there is a low tunnel going west."
150 PRINT "The tunnel is so low that you have to go on your knees."
160 PRINT "You are in a large cave. Something is shining in the corner."
170 PRINT "In the corner of the cave stands an old chest bound with iron."
180 PRINT "The chest is open. It is full of old coins and broken glass."
190 PRINT "A cold wind is blowing from a crack in the wall of the cave."
200 PRINT "Behind the crack you can see daylight and hear the birds."
210 PRINT "You are out in the garden behind the old house. Well done!"Basic26 texts.abas --pack-text -vtexts packed: 20, 1145 -> 712 bytes with the dictionary
wrote texts.xex (2110 bytes, 6 segment(s), 2078 bytes of program)Dvadsať textov, 1 145 znakov, sa zmestilo do 712 bajtov vrátane slovníka. Bez voľby má program 2 289 bajtov, s ňou 2 110 – hoci pribudol rozbaľovač. Pri skutočnej hre s desiatkami kilobajtov textu sú to kilobajty.
Basic26 texts.abas --text-under-rom --pack-text -vtexts under the ROM: $E400-$E631 (562 bytes)
texts left in the program: 0 bytes
texts packed: 20, 1145 -> 712 bytes with the dictionaryTeraz texty neležia v hlavnej pamäti vôbec. Výstup programu je pri všetkých voľbách ten istý:
Basic26 texts.abas --text-under-rom --pack-text --sim --sim-mem 64Ktorú voľbu kedy
--pack-textsamotná: program je menší, beží na každom stroji a s ničím sa nebije. Dobrá prvá voľba. Program s pár riadkami textu sa nezbalí – slovník by stál viac, než by ušetril.--text-under-rom: uvoľní najviac hlavnej pamäte (až 13 KB). Nehodí sa, keď RAM pod ROM používa pribalený strojový kód.- obe naraz: pod ROM sa zmestí o polovicu viac textu.
--text-in-banks: pre naozaj veľké hry; program potom potrebuje stroj s bankami a inde sa nespustí.
Voľby patria do hlavičky programu:
0 REM @COMPILE --pack-text --text-under-rom
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
XUNPACK na dáta, ktoré nezbalil --pack | ERROR- 3 – neznámy formát |
| cieľ rozbalenia zasahuje do obvodov alebo znakovej sady pod ROM | ERROR- 3 |
| cieľ je menší než rozbalené dáta | prepíše sa, čo leží za ním |
XUNPACK bez --xmem | berie sa ako meno premennej: chyba prekladu |
--text-in-banks na 64 KB stroji | 1 BANKS OF EXTENDED MEMORY NEEDED |
--pack-text pri krátkom programe | nič sa nezbalí (texts packed: 0) a program sa nezmení |
Vyskúšaj si
- Zbaľ
rooms.datz kapitoly 45 a pozri, koľko sa ušetrilo. Prečo tak málo? - Prelož
texts.abasso všetkými štyrmi kombináciami volieb a s-v; porovnaj veľkosti. - Nakresli v programe vlastnú titulnú obrazovku, ulož ju cez
BPUTna disketu (v emulátore), zbaľ a ukáž ju cezXUNPACK.
Zhrnutie
--packzbalí ľubovoľný súbor,XUNPACK sb,s,db,dho v programe rozbalí – odkiaľkoľvek kamkoľvek.--pack-textzbalí texty programu asi na dve tretiny.--text-under-roma--text-in-bankstexty presunú zo hlavnej pamäte preč.- Program sa kvôli tomu nemení; stačí riadok
REM @COMPILE.
Späť: 45. Skrytá pamäť v praxi · Ďalej: 47. Program bez čísel riadkov