42. Miesto v pamäti: --origin, --reserve, --memory, --basic-screen, --keep-rem, --line-delay

Na čo to je

Program, ktorý si napíšeš sám, sa do pamäte zmestí a o tom, kde v nej leží, nemusíš vedieť nič. Túto kapitolu budeš potrebovať v dvoch prípadoch:

Ako pamäť vyzerá

Atari XL má 64 kilobajtov pamäte, ale program ich nemá všetky:

AdresyČo tam je
$0000–$06FFpracovná pamäť operačného systému; šiesta stránka ($0600) je voľná pre krátky strojový kód
$0700–$1FFFDOS, keď je nahratý
$2000 …tvoj preložený program, za ním jeho texty a dáta
…voľná pamäť pre reťazce a polia (DIM) – to, čo vracia FRE(0)
$BC40–$BFFFobrazovka (v textovom režime; grafika zaberie viac a siaha nižšie)
$C000–$FFFFoperačný systém (ROM) a obvody

Program na skúšanie

Súbor examples/place.abas:

Atari BASIC
10 REM Where the program lies and how much is left
20 PRINT "Free for DIM: ";FRE(0)
30 PRINT "Top of memory: ";PEEK(106)*256
40 PRINT "The screen is at ";PEEK(88)+256*PEEK(89)
Basic26 place.abas --sim
Free for DIM: 37879
Top of memory: 49152
The screen is at 48192

Prvé číslo sa bude s verziou prekladača trochu meniť; dôležité je, ako ho menia voľby:

VoľbyFree for DIM
(žiadne)37 879
--rom-fp38 605
--origin $070044 279
--reserve $8000-$8FFF22 563

Keď dôjde pamäť

Program skončí s ERROR- 2 pri DIM, hoci v interpreteri bežal. Preložený program totiž nie je vždy menší než ten istý program v interpreteri – nesie si so sebou knižnicu. Čo skúsiť, v tomto poradí:

  1. --rom-fp – asi o 1 700 bajtov menej, program počíta o niečo pomalšie.
  2. -O1 – až o 500 bajtov menej.
  3. --origin $0700 – program sa začne nižšie a získa 6 400 bajtov. Na adrese $0700 však býva DOS, takže to ide len pre program, ktorý nepracuje s disketou a spúšťa sa bez DOS-u (z emulátora cez --run, alebo zo zavádzača hier).
  4. --pack-text – texty zbalené na dve tretiny (kapitola 46).
  5. --text-under-rom – texty v pamäti, ktorú inak nevyužiješ (kapitola 46).

Koľko pamäte zostáva: --memory a --memory-map

Netreba čakať, kým program spadne na DIM. Voľba --memory po preklade povie, koľko pamäte program zaberá a koľko jej zostáva:

Basic26 place.abas --memory
Basic26: memory [#-----------------------------] 5 % full
  used by the program:    2121 bytes
  still free:            37847 bytes
  of it for DIM:         37847 bytes  (the heap, which FRE(0) shows at the start)
  biggest free piece:    37847 bytes
  (counted between $2000 and $BC1F; --mem-lo and --mem-top change that, --memory-map lists every piece)

Riadok of it for DIM je pamäť pre reťazce a polia – približne to, čo program na začiatku uvidí vo FRE(0). Biggest free piece je najväčší súvislý kus: nové pole sa musí zmestiť do jedného.

--memory-map vypíše každý kus pamäte s adresami. Tu s pamäťou, ktorú si program necháva voľnú (--reserve, nižšie):

Basic26 place.abas --memory-map --reserve '$8000-$8FFF'
Basic26: memory $2000-$BC1F
Basic26:   program  $2000-$27DB   2012 bytes
Basic26:   free     $27DC-$7FFF  22564 bytes  (the heap: DIM and strings)
Basic26:   reserved $8000-$8FFF   4096 bytes
Basic26:   program  $9000-$9070    113 bytes
Basic26:   free     $9071-$BC1F  11183 bytes

Vidno z neho, prečo s --reserve klesne FRE(0) na 22 563: halda nepreskočí vyhradenú pamäť a nad ňou ostane 11 KB, na ktoré DIM nedosiahne. S oboma voľbami naraz príde najprv zoznam a za ním súhrn.

Počíta sa od začiatku programu (--origin) po obrazovku ($BC1F); inak to povedia --mem-lo a --mem-top. Číslo sa s verziou prekladača trochu mení. Voľby sú tie isté ako v prekladači jazyka Action! Action26.

Voľby

VoľbaČo robí
--origin adresakde sa program začína (predvolene $2000)
--ramtop adresakde končí pamäť stroja, pre ktorý prekladáš (predvolene $C000)
--reserve A-Bpamäť od A po B nechaj voľnú – program ani jeho dáta tam nebudú; --memory ju počíta ako zabratú
--memorypo preklade súhrn: koľko pamäte program zaberá a koľko zostáva
--memory-mapkaždý kus pamäte s adresou: program, vyhradená, voľná, halda
--mem-lo A, --mem-top Aodkiaľ a pokiaľ --memory počíta (predvolene od --origin po obrazovku)
--basic-screenobrazovka tam, kde ju mal program s interpreterom: $9C40 namiesto $BC40
--keep-remriadky REM ostanú v pamäti tak, ako ich držal interpreter
--line-delay Nkaždý riadok programu chvíľu počká
--exit-to-dospo skončení programu návrat do DOS-u (kapitola 41)

Adresy sa píšu šestnástkovo s dolárom ($9800) alebo desiatkovo (38912). V PowerShelli daj adresu s dolárom do apostrofov ('$9800'), inak si ju PowerShell vyloží po svojom; v hlavičke REM @COMPILE apostrofy netreba.

--reserve: pamäť, na ktorú program siaha sám

Dobová hra si cez POKE ukladá mapu na adresy $7530–$797C. V interpreteri tam bolo voľno; preložený program by tam mohol mať svoje dáta a hra by si ich prepísala.

Basic26 hra.abas --reserve '$7530-$797C'

Prekladač tú oblasť obíde. Kód programu sa však rozdeliť nedá: musí sa celý zmestiť pred rezervu, za ňu idú už len texty, dáta a voľná pamäť.

POKE 106: posunutý koniec pamäte

Najčastejší dobový trik: program zníži číslo na adrese 106 (koniec pamäte v stránkach), zavolá GRAPHICS a tým si nad obrazovkou vyhradí miesto na znakovú sadu alebo postavičky. Prekladač na to upozorní:

warning B26230: this program moves the top of memory (POKE 106); the compiled program reaches $2622, and whatever it reserves below that lands inside it

Hlásenie hovorí, pokiaľ preložený program siaha. Ak je vyhradená oblasť nad touto adresou, je všetko v poriadku. Ak nie, treba program zmenšiť voľbami vyššie.

--basic-screen: program písaný pre cartridge

S cartridge BASICu končila pamäť na $A000 a obrazovka ležala na $9C40. Program, ktorý tie adresy má napísané natvrdo (vlastný zoznam displeja na $9C20, POKE rovno do obrazovky), sa prekladá s --basic-screen. Pamäť $A000–$BFFF, kde bola cartridge, pritom preložený program ďalej využíva.

--keep-rem: program, ktorý číta sám seba

Niektoré programy majú v riadkoch REM schované dáta – znakovú sadu alebo strojový kód – a čítajú ich rovno z pamäte, kde mal interpreter text programu. Prekladač komentáre bežne zahadzuje. Keď v úvodných riadkoch REM nájde bajty, ktoré nie sú text, nechá ich sám a upozorní:

warning B26231: this REM line holds bytes rather than text, so the REM lines the program begins with (10 to 10) are kept in memory the way the interpreter holds them

--keep-rem nechá všetky riadky REM, --keep-rem=0-9,500 len vymenované, --keep-rem=none žiadne.

--line-delay: tempo interpretera

Melódia alebo animácia v dobovom programe je často načasovaná len tým, ako dlho interpreteru trvalo vykonať riadok. Preložená prebehne niekoľkokrát rýchlejšie. Lepšie je program opraviť – čakať podľa hodín (kapitola 18). Keď to nejde, dá sa spomaliť zvonka:

Basic26 hra.abas --line-delay 369@9165-9190

Každý vykonaný riadok s číslom 9165 až 9190 počká 369 × 100 cyklov procesora (asi päťdesiatinu sekundy). Bez rozsahu (--line-delay 50) čaká každý riadok programu. Voľba sa dá zopakovať pre rôzne časti programu. Správne číslo treba nájsť skúšaním proti originálu.

Časté chyby

Čo sa staloČo sa stane
--origin $0700 a program otvára D:DOS v pamäti nie je: ERROR- 130
--reserve uprostred kódu programuerror B26227: the code runs from $2000 to $27DC and would have to keep out of $2100-$2200, which it cannot – pomôže nižší --origin alebo menší program
adresa s $ bez apostrofov v PowerShelliPowerShell $9800 nahradí prázdnou premennou; prekladač dostane nezmysel
--line-delay na celý programspomalí sa všetko, aj to, čo malo byť rýchle
zabudnuté --basic-screen pri programe pre cartridgeobraz je rozsypaný alebo program píše mimo obrazovky

Vyskúšaj si

  1. Spusti place.abas s --origin '$0700' a s --rom-fp a porovnaj voľnú pamäť.
  2. Pridaj do place.abas riadok 15 DIM A(5000),B(1400) – dve polia, spolu vyše 38 kilobajtov – a zisti, s ktorými voľbami prejde a s ktorými skončí chybou 2.
  3. Pridaj --line-delay 2000 k programu for.abas z kapitoly 10 a spusti ho v emulátore.

Zhrnutie

Späť: 41. Diskety a dobové programy · Ďalej: 43. Pribalené súbory