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:

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 -v
packed 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

Turbo Basic XL
XUNPACK zdrojová banka,zdrojová adresa,cieľová banka,cieľová adresa

Banka 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:

Atari BASIC
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,SCR

Preklad a spustenie

Basic26 unpack.abas --run

alebo 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

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-textzbalí texty slovníkom častých dvojíc znakov; zaberú asi dve tretiny
--text-under-rompresunie texty do RAM pod ROM; hlavná pamäť ostane programu
--text-in-bankspresunie 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:

Atari BASIC
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 -v
texts 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 -v
texts under the ROM: $E400-$E631 (562 bytes)
texts left in the program: 0 bytes
texts packed: 20, 1145 -> 712 bytes with the dictionary

Teraz 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 64

Ktorú voľbu kedy

Voľby patria do hlavičky programu:

Turbo Basic XL
0 REM @COMPILE --pack-text --text-under-rom

Časté chyby

Čo sa staloČo sa stane
XUNPACK na dáta, ktoré nezbalil --packERROR- 3 – neznámy formát
cieľ rozbalenia zasahuje do obvodov alebo znakovej sady pod ROMERROR- 3
cieľ je menší než rozbalené dátaprepíše sa, čo leží za ním
XUNPACK bez --xmemberie sa ako meno premennej: chyba prekladu
--text-in-banks na 64 KB stroji1 BANKS OF EXTENDED MEMORY NEEDED
--pack-text pri krátkom programenič sa nezbalí (texts packed: 0) a program sa nezmení

Vyskúšaj si

  1. Zbaľ rooms.dat z kapitoly 45 a pozri, koľko sa ušetrilo. Prečo tak málo?
  2. Prelož texts.abas so všetkými štyrmi kombináciami volieb a s -v; porovnaj veľkosti.
  3. Nakresli v programe vlastnú titulnú obrazovku, ulož ju cez BPUT na disketu (v emulátore), zbaľ a ukáž ju cez XUNPACK.

Zhrnutie

Späť: 45. Skrytá pamäť v praxi · Ďalej: 47. Program bez čísel riadkov