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:
- veľký program, ktorému pri
DIMdôjde pamäť (chyba 2), - dobový program, ktorý počíta s tým, ako pamäť vyzerala v interpreteri: na pevnú adresu si dáva znakovú sadu, číta vlastné riadky
REM, alebo má tempo postavené na pomalosti interpretera.
Ako pamäť vyzerá
Atari XL má 64 kilobajtov pamäte, ale program ich nemá všetky:
| Adresy | Čo tam je |
|---|---|
$0000–$06FF | pracovná pamäť operačného systému; šiesta stránka ($0600) je voľná pre krátky strojový kód |
$0700–$1FFF | DOS, 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–$BFFF | obrazovka (v textovom režime; grafika zaberie viac a siaha nižšie) |
$C000–$FFFF | operačný systém (ROM) a obvody |
Program na skúšanie
Súbor examples/place.abas:
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 --simFree for DIM: 37879
Top of memory: 49152
The screen is at 48192Prvé číslo sa bude s verziou prekladača trochu meniť; dôležité je, ako ho menia voľby:
| Voľby | Free for DIM |
|---|---|
| (žiadne) | 37 879 |
--rom-fp | 38 605 |
--origin $0700 | 44 279 |
--reserve $8000-$8FFF | 22 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í:
--rom-fp– asi o 1 700 bajtov menej, program počíta o niečo pomalšie.-O1– až o 500 bajtov menej.--origin $0700– program sa začne nižšie a získa 6 400 bajtov. Na adrese$0700vš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).--pack-text– texty zbalené na dve tretiny (kapitola 46).--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 --memoryBasic26: 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 bytesVidno 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 adresa | kde sa program začína (predvolene $2000) |
--ramtop adresa | kde končí pamäť stroja, pre ktorý prekladáš (predvolene $C000) |
--reserve A-B | pamäť od A po B nechaj voľnú – program ani jeho dáta tam nebudú; --memory ju počíta ako zabratú |
--memory | po preklade súhrn: koľko pamäte program zaberá a koľko zostáva |
--memory-map | každý kus pamäte s adresou: program, vyhradená, voľná, halda |
--mem-lo A, --mem-top A | odkiaľ a pokiaľ --memory počíta (predvolene od --origin po obrazovku) |
--basic-screen | obrazovka tam, kde ju mal program s interpreterom: $9C40 namiesto $BC40 |
--keep-rem | riadky REM ostanú v pamäti tak, ako ich držal interpreter |
--line-delay N | každý riadok programu chvíľu počká |
--exit-to-dos | po 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 itHlá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-9190Kaž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 programu | error 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 PowerShelli | PowerShell $9800 nahradí prázdnou premennou; prekladač dostane nezmysel |
--line-delay na celý program | spomalí sa všetko, aj to, čo malo byť rýchle |
zabudnuté --basic-screen pri programe pre cartridge | obraz je rozsypaný alebo program píše mimo obrazovky |
Vyskúšaj si
- Spusti
place.abass--origin '$0700'a s--rom-fpa porovnaj voľnú pamäť. - Pridaj do
place.abasriadok15 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. - Pridaj
--line-delay 2000k programufor.abasz kapitoly 10 a spusti ho v emulátore.
Zhrnutie
- Preložený program leží od
$2000, za ním je voľná pamäť preDIM. - Na chybu 2 pomáha
--rom-fp,-O1,--origin $0700a voľby pre texty. --reserve A-Bchráni pamäť, do ktorej program píše sám.--memorya--memory-mapukážu, koľko pamäte zostáva a kde.--basic-screen,--keep-rema--line-delaysú pre dobové programy, ktoré počítajú s interpreterom.
Späť: 41. Diskety a dobové programy · Ďalej: 43. Pribalené súbory