RUNNER

Z PMD 85 Infoserver

(Rozdiel medzi revíziami)
Rombor (Diskusia | príspevky)
(Dokončený článok)
Aktuálna verzia (23:54, 10. apríl 2026) (upraviť) (vrátiť)
Rombor (Diskusia | príspevky)
D (Opravený preklep.)
 
11 medziľahlých revízií nie je zobrazených.
Riadok 1: Riadok 1:
{{VelkyNadpis|RUNNER}}
{{VelkyNadpis|RUNNER}}
 +
 +
{{Infobox Software
 +
| name = RUNNER
 +
| screenshot = [[Obrázok:Runner23.png|center|288px]]
 +
| developer = '''[[RM-TEAM]]'''
 +
| author = Roman Bórik
 +
| version = {{Príkaz|RUNNER}}, v2.3 (2026)<br />''(PMD 85-2A/-3 + PMD 32)''
 +
| operating_system = CP/M (MIKROS)
 +
| language = angličtina
 +
| download = '''[[download:176|RUNNER.P32]]''' - obraz disku s programom a zdrojovým kódom<br />
 +
}}
__TOC__
__TOC__
-
[[Obrázok:runner.png|thumb|RUNNER - zoznam programov na diskete]]
+
'''RUNNER''' je program pre [[PMD 85#PMD 85-2A|PMD 85-2A]] alebo [[PMD 85#PMD 85-3|PMD 85-3]] v spojení s disketovou jednotkou [[PMD 32]] bežiaci pod operačným systémom [[MIKROS|Mikros]] (CP/M 2.2). Umožňuje spúšťať z diskety programy pôvodne napísané pre PMD 85 a poskytuje im aj možnosť prístupu k diskovým operáciám BDOSu.
-
'''RUNNER''' je program pre [[PMD 85#PMD 85-3|PMD 85-3]] v spojení s disketovou jednotkou [[PMD 32]] bežiaci pod operačným systémom Mikros (CP/M 2.2). Umožňuje spúšťať z diskety programy pôvodne napísané pre PMD 85 a poskytuje im aj možnosť prístupu k diskovým operáciám BDOSu.
+
Zdanlivou nevýhodou je skutočnosť, že pôvodný program je potrebné "preskúmať", pôvodne nahrávané bloky z kazety previesť do súborov na diskete a pripraviť tzv. informačný súbor s príponou '''INF''', ktorý popisuje, kam sa majú dané súbory nahrať a ako sa má program spustiť. Výsledkom je ale neporovnateľne rýchlejšie a pohodlnejšie spúšťanie programu. Ak daný program používal kazetové operácie, tie je pochopiteľne nutné pomerne prácnejšie upraviť na diskové, avšak samotný RUNNER poskytuje služby pre volanie pôvodných služieb BDOSu, takže sa pri úprave stačí zamerať iba na prácu so samotným súborom pod CP/M, čo by mala byť pre človeka, ktorý sa do toho pustí, všeobecne známa záležitosť.
-
Zdanlivou nevýhodou je skutočnosť, že pôvodný program je potrebné "preskúmať", pôvodne nahrávané bloky z kazety previesť do súborov na diskete a pripraviť tzv. informačný súbor, ktorý popisuje kam sa majú dané súbory nahrať a ako sa má program spustiť. Výsledkom je ale neporovnateľne rýchlejšie a pohodlnejšie spúšťanie programu. Ak daný program používal kazetové operácie, tie je pochopiteľne nutné pomerne pracnejšie upraviť na diskové, avšak samotný RUNNER poskytuje služby pre volanie pôvodných služieb BDOSu, takže pri úprave sa stačí zamerať iba na prácu so samotným súborom pod CP/M, čo by mala byť pre človeka, ktorý sa do toho pustí, všeobecne známa záležitosť.
+
== Spustenie RUNNERa ==
 +
 
 +
RUNNER možno spustiť dvoma spôsobmi.
 +
* {{Príkaz|RUN}}
 +
* {{Príkaz|RUN PROGRAM[.INF]}}
 +
 
 +
V prvom prípade RUNNER vyhľadá v adresári všetky INF súbory, prečíta z príkazu {{Príkaz|NAME}} dlhé názvy programov a zobrazí zotriedený (ak to nie je vypnuté) zoznam. Zoznam môže obsahovať maximálne 32 položiek. Ak je ich menej ako 17, zobrazí sa jeden stĺpec. Ak je ich viac ako 16, zobrazia sa dva stĺpce. Pred každým menom programu je písmeno alebo číslica, ktorým sa prevádza voľba. Stlačením príslušného klávesu sa zvolený program zavedie podľa obsahu INF súboru do pamäte a spustí.<br>
 +
Ak sa na disku nachádza súbor '''RUN.INF''' (viď. ďalej), prečíta sa z neho pomenovanie disku a voľba potlačenia triedenia súborov.
 +
 
 +
Druhý prípad slúži pre priame spustenie konkrétneho programu.
== Informačný súbor ==
== Informačný súbor ==
-
Ako bolo spomenuté vyššie, aby RUNNER vedel ako má program zaviesť do pamäti a spustiť, musí mať každý program vytvorený svoj informačný súbor s príponou INF. Súbor INF si možno predstaviť ako analógiu k programu v BASICu na ZX Spectre, ktorý sériou príkazov nahraje jednotlivé bloky programu a program spustí. K rovnakému účelu RUNNER poskytuje jednoduchý jazyk, pomocou ktorého sa v informačnom súbore "zadefinuje", čo sa má robiť.
+
Ako bolo spomenuté vyššie, aby RUNNER vedel, ako má program zaviesť do pamäte a spustiť, musí mať každý program vytvorený svoj informačný súbor s príponou '''INF'''. Súbor INF si možno predstaviť ako jednoduchý program, ktorý sériou príkazov nahrá jednotlivé bloky programu a program spustí. RUNNER teda poskytuje niekoľko jednoduchých príkazov, ktoré sú popísané v ďalšom texte.
=== Formát súboru INF a základné požiadavky ===
=== Formát súboru INF a základné požiadavky ===
* je to obyčajný textový súbor
* je to obyčajný textový súbor
-
* môže mať maximalne 1kB, zbytok súboru nad 1kB sa ignoruje
+
* každý riadok obsahuje jeden príkaz
-
* každý riadok obsahuje jeden prikaz
+
* príkaz musí byť od parametrov oddelený aspoň jednou medzerou
* príkaz musí byť od parametrov oddelený aspoň jednou medzerou
-
* poradie príkazov (okrem JUMP) je ľubovoľné
+
* poradie príkazov je ľubovoľné, jedine príkaz {{Príkaz|JUMP}} musí byť posledným príkazom
* príkazy sú spracovávané sekvenčne po jednotlivých riadkoch
* príkazy sú spracovávané sekvenčne po jednotlivých riadkoch
-
* riadky začínajúce znakom ';' sú ignorované
+
* riadky začínajúce znakom ';' (bodkočiarka) sú ignorované
=== Príkazy RUNNERa ===
=== Príkazy RUNNERa ===
 +
Názvy príkazov sa píšu vždy veľkými písmenami. Hexadecimálne čísla sa píšu bez prefixu a postfixu veľkými písmenami. Mená súborov, vypisované texty a texty v poznámke už môžu byť písané veľkými aj malými písmenami.
-
{{Príkaz|NAME name}}
+
{{CodeBig|NAME name}}
-
Príkaz <code>NAME</code> je povinný a je použitý iba pri vytváraní zoznamu programov na disku pre získanie dlhého mena programu, keďže na vhodné pomenovanie 8 znakov v názve súboru zvyčajne nepostačuje. Pri vykonávani príkazov je ignorovaný.
+
Príkaz {{Príkaz|NAME}} je povinný a je použitý iba pri vytváraní zoznamu programov na disku pre získanie dlhého mena programu, keďže na vhodné pomenovanie 8 znakov v názve súboru zvyčajne nepostačuje. Pri vykonávaní príkazov je ignorovaný.
-
* <code>name</code> môže mať maximálne 20 znakov
+
* {{Kbd|name}} môže mať maximálne 20 znakov
 +
Príkaz {{Príkaz|NAME}} má aj špeciálne použitie v súbore '''{{Kbd|RUN.INF}}''' pre pomenovanie diskety, viď, ďalej.
-
{{Príkaz|MONIT t[,X]}}
 
-
Príkaz <code>MONIT</code> určuje typ monitora, ktorý sa zavedie do pamäti od adresy 8000h pred spustením programu, teda skokom na adresu uvedenú v príkaze <code>JUMP</code>. Ak to nie je potlačené parametrom <code>X</code>, je prevedená štandardná inicializácia systémových premenných. Preto nie je doporučované meniť obsah súborov s ROM monitormi. Príkaz je nepovinný, ale ak je uvedený, mal by sa vyskytnúť iba raz.
+
{{CodeBig|MONIT t[,X]}}
-
* <code>t</code> je typ monitora - hodnota 1 pre MONIT1.ROM, hodnota 2 pre MONIT2.ROM. Tieto dva súbory sa musia nachádzať na diskete spolu so samotným RUNNERom.
+
-
* parameter <code>X</code> je voliteľný a potlačuje obvyklú inicializáciu systémových premenných
+
 +
Príkaz {{Príkaz|MONIT}} určuje typ monitora, ktorý sa zavedie do pamäte od adresy 8000h pred spustením programu, teda skokom na adresu uvedenú v príkaze {{Príkaz|JUMP}}. Ak to nie je potlačené parametrom {{Kbd|X}}, je prevedená štandardná inicializácia systémových premenných. Preto sa neodporúča meniť obsah súborov s ROM monitormi. Príkaz je nepovinný, ale ak je uvedený, mal by sa vyskytnúť iba raz.
 +
* {{Kbd|t}} je typ monitora - hodnota 1 pre MONIT1.ROM, hodnota 2 pre MONIT2.ROM. Tieto dva súbory sa musia nachádzať na diskete spolu so samotným RUNNERom.
 +
* parameter {{Kbd|X}} je voliteľný a potlačuje obvyklú inicializáciu systémových premenných
-
{{Príkaz|PICTURE fn,t[,speed]}}
 
-
Príkaz pre zobrazenie obrázku z uvedeného súboru. Obrázok môže byť rôzneho typu, čo určuje parameter <code>t</code>.
+
{{CodeBig|PICTURE fn,t[,param]}}<br>
-
* <code>fn</code> je meno súboru s obrázkom
+
{{CodeBig|SCREEN fn,t[,param]}}
-
* <code>t</code> určuje typ obrazových dát v súbore
+
-
** <code>V</code> - celá VideoRAM 16kB - RUNNER uloží obrázok do [[VideoRAM]], ale vynechá systémovú oblasť
+
-
** <code>W</code> - celá VideoRAM 16kB - RUNNER uloží obrázok do [[VideoRAM]], vrátane systémovej oblasti (nedoporučované)
+
-
** <code>D</code> - čisté video data bez systémovej oblasti (12kB)
+
-
** <code>C</code> - komprimovaný obrázok programom [[GRED]]
+
-
** <code>S</code> - obrázok po štvorčekoch z programu [[GRED]]
+
-
* <code>speed</code> je hodnota určujúca rýchlosť zobrazovania obrázku po štvorčekoch, ak je obrazok typu <code>S</code> - hodnota 0 (pomaly) až 3 (rýchlo)
+
 +
Príkaz {{Príkaz|PICTURE}}, resp. {{Príkaz|SCREEN}} slúži pre zobrazenie obrázku z uvedeného súboru. Obrázok môže byť rôzneho typu, čo určuje parameter {{Kbd|t}}.
 +
* {{Kbd|fn}} je meno súboru s obrázkom
 +
* {{Kbd|t}} určuje typ obrazových dát v súbore
 +
** {{Kbd|V}} - celá VideoRAM 16kB - RUNNER nahrá obrázok do [[VideoRAM]], ale vynechá systémovú oblasť
 +
** {{Kbd|W}} - celá VideoRAM 16kB - RUNNER nahrá obrázok do [[VideoRAM]] vrátane systémovej oblasti (neodporúčané)
 +
** {{Kbd|D}} - čisté video dáta bez systémovej oblasti (12kB)
 +
** {{Kbd|C}} - komprimovaný obrázok programom [[GRED]]
 +
** {{Kbd|S}} - obrázok po štvorčekoch z programu [[GRED]]; vyžaduje povinný číselný parameter {{Kbd|param}} určujúci rýchlosť zobrazovania obrázku po štvorčekoch - hodnota 0 (pomaly) až 3 (rýchlo)
 +
** {{Kbd|Q}} - obrázok spakovaný pomocou [[QuidoScr]] vrátane rutiny; vyžaduje povinný parameter {{Kbd|param}} určujúci hexadecimálnu adresu pamäte, kam sa súbor nahrá a odkiaľ sa spustí rozpakovanie
-
{{Príkaz|FILE fn,hexadr}}
 
-
Príkaz nahraje do pamäti uvedený súbor.
+
{{CodeBig|FILE fn,hexadr}}<br>
-
* <code>fn</code> je meno súboru, ktorý sa má nahrať do pamäti
+
{{CodeBig|LOAD fn,hexadr}}
-
* <code>hexadr</code> je hexadecimálna adresa, kam sa súbor nahraje
+
 +
Príkaz nahrá do pamäte uvedený súbor. RUNNER nijako nekontroluje kam sa má súbor nahrať a ani jeho dĺžku.
 +
* {{Kbd|fn}} je meno súboru, ktorý sa má nahrať do pamäte
 +
* {{Kbd|hexadr}} je hexadecimálna adresa, kam sa súbor nahrá
-
{{Príkaz|CALL hexadr}}
 
-
Zavolanie podprogramu.
+
{{CodeBig|CALL hexadr}}
-
* <code>hexadr</code> je hexadecimálna adresa podprogramu - podprogram nemusí zachovávať žiadne registre. Na zásobníku je voľných asi 50 bytov.
+
 +
Zavolanie rutiny.
 +
* {{Kbd|hexadr}} je hexadecimálna adresa rutiny - rutina nemusí zachovávať žiadne registre. Na zásobníku je voľných asi 50 bytov.
-
{{Príkaz|JUMP hexadr}}
 
-
Spustenie samotného programu. <code>JUMP</code> by mal byť posledným príkazom, pretože všetky riadky za príkazom <code>JUMP</code> sú ignorované. Pred spustením programu je zavedený zvolený monitor a prevedená inicializácia systmových premenných (pokiaľ bol uvedený príkaz <code>MONITOR</code> a nebola inicializácia potlačená). Po skoku do programu na uvedenú adresu obsahuje register <code>DE</code> adresu vstupného bodu pre volanie služieb RUNNERa.
+
{{CodeBig|JUMP hexadr}}
-
* <code>hexadr</code> je hexadecimálna adresa, na ktorú sa predá riadenie
+
 +
Spustenie samotného programu. {{Príkaz|JUMP}} by mal byť posledným príkazom, pretože všetky riadky za príkazom {{Príkaz|JUMP}} sú ignorované. Pred spustením programu je nastavený [[AllRAM|AllRAM režim]], do pamäte je zavedený zvolený Monitor a prevedená inicializácia systémových premenných (pokiaľ bol uvedený príkaz {{Príkaz|MONITOR}} a nebola inicializácia potlačená). Do registra {{Kbd|DE}} (od verzie 2.3 aj na adresu {{Kbd|#FFFE}}) je uložená adresa vstupného bodu pre volanie služieb RUNNERa.
 +
* {{Kbd|hexadr}} je hexadecimálna adresa, na ktorú sa predá riadenie
-
{{Príkaz|PAUSE time}}
 
-
Zdržanie, ktoré možno prerušiť stlačením klávesy.
+
{{CodeBig|PAUSE time}}
-
* <code>time</code> určuje čas v 1/10 sekundy, koľko sa má čakať (desiatková hodnota maximálne 65535). Ak je hodnotou 0, čaká sa na stlačenie klávesy.
+
 +
Zdržanie, ktoré možno prerušiť stlačením klávesu.
 +
* {{Kbd|time}} určuje čas v 1/10 sekundy, koľko sa má čakať (desiatková hodnota maximálne 65535). Ak je hodnotou 0, čaká sa na stlačenie klávesu.
-
{{Príkaz|POKE hexadr,hexval[,hexval ...]}}
 
-
Príkaz pre modifikáciu obsahu pamäti.
+
{{CodeBig|POKE hexadr,hexval[,hexval ...]}}
-
* <code>hexadr</code> je hexadecimálna adresa, od ktorej sa začne zapisovať
+
-
* <code>hexval</code> sú hexadecimálne 8 bitové hodnoty, ukladané postupne od zadanej adresy
+
 +
Príkaz pre modifikáciu obsahu pamäte.
 +
* {{Kbd|hexadr}} je hexadecimálna adresa, od ktorej sa začne zapisovať
 +
* {{Kbd|hexval}} sú hexadecimálne 8 bitové hodnoty, ukladané postupne od zadanej adresy
-
{{Príkaz|DISP r,c,cl,"text"}}
+
 
 +
{{CodeBig|CLS}}
 +
 
 +
Zmazanie obrazovky.
 +
 
 +
 
 +
{{CodeBig|DISP r,c,cl,"text"}}<br>
 +
{{CodeBig|PRINT r,c,cl,"text"}}
Zobrazenie textu na zvolenú pozíciu. Všetky parametre sú desiatkové čísla.
Zobrazenie textu na zvolenú pozíciu. Všetky parametre sú desiatkové čísla.
-
* <code>r</code> je riadok od 0 do 27
+
* {{Kbd|r}} je riadok od 0 do 27
-
* <code>c</code> je stĺpec od 0 do 47
+
* {{Kbd|c}} je stĺpec od 0 do 47
-
* <code>cl</code> je farba od 0 do 3 normalne, od 4 do 7 invertovane
+
* {{Kbd|cl}} je farba od 0 do 3 normálne, od 4 do 7 invertovane
-
* <code>text</code> je zobrazovaný text - musí byť v úvodzovkách
+
* {{Kbd|text}} je zobrazovaný text - musí byť v úvodzovkách
-
{{Príkaz|CLS}}
+
{{CodeBig|FRAME r,c,w,h,cl}}
-
Zmazanie obrazovky.
+
Vykreslenie rámčeka zo znakov '''-''' (pomlčka), '''|''' (vertikálna čiara) a '''+''' (plus). Vykresľuje sa iba samotný rámček, takže jeho vnútro zostane nezmenené. Všetky parametre sú desiatkové čísla.
 +
* {{Kbd|r}} je riadok od 0 do 27
 +
* {{Kbd|c}} je stĺpec od 0 do 47
 +
* {{Kbd|w}} je šírka (vrátane hrán rámčeka) od 3 do 48
 +
* {{Kbd|c}} je výška (vrátane hrán rámčeka) od 3 do 28
 +
* {{Kbd|cl}} je farba od 0 do 3 normálne, od 4 do 7 invertovane
 +
 
 +
 
 +
{{CodeBig|NOSORT}}
 +
 
 +
Príkaz {{Príkaz|NOSORT}} je určený pre súbor '''RUN.INF''' (viď. ďalej) a slúži pre potlačenie triedenia zoznamu súborov. Pre RUN.INF je nepovinný, pre klasické INF súbory nemá význam a je ignorovaný.
 +
 
 +
=== Špeciálny súbor RUN.INF ===
 +
Na disketu možno pridať špeciálny súbor '''RUN.INF''', ktorý umožňuje pomenovať disketu a potlačiť triedenie zoznamu programov. V tomto súbore má teda zmysel iba príkaz {{Príkaz|NAME}} a príkaz {{Príkaz|NOSORT}}, ostatné príkazy sú ignorované. Syntaktické chyby nie sú hlásené a prípadná chyba spôsobí iba ukončenie spracovávania súboru '''RUN.INF'''.
 +
 
 +
Príkaz {{Príkaz|NAME}} je opäť nepovinný a slúži pre "pomenovanie" diskety. Tento názov sa zobrazí v záhlaví obrazovky vpravo hore. Príkaz je v tomto prípade nepovinný. {{Kbd|name}} môže mať opäť maximálne 20 znakov.
-
'''Priklad:''' súbor BOULDER.INF
+
'''Príklad:''' súbor {{Príkaz|BOULDER.INF}}
; BOULDER DASH - VBG SOFTWARE (c) 1988
; BOULDER DASH - VBG SOFTWARE (c) 1988
NAME BOULDER DASH
NAME BOULDER DASH
Riadok 120: Riadok 165:
RUNNER kontroluje správnosť zadania príkazov a prípadné chyby hlási v tvare
RUNNER kontroluje správnosť zadania príkazov a prípadné chyby hlási v tvare
-
* ERROR at line XXX
+
* '''ERROR at line NN'''
-
kde, ERROR je jedno z nasledujúcich hlásení a XXX je číslo riadku, na ktorom došlo ku chybe.
+
kde, ERROR je jedno z nasledujúcich hlásení a NN je číslo riadku, na ktorom došlo ku chybe.
* '''Syntax error''' - všeobecná chyba syntaxe príkazu
* '''Syntax error''' - všeobecná chyba syntaxe príkazu
* '''Bad file name''' - meno súboru nezodpovedá konvencii CP/M
* '''Bad file name''' - meno súboru nezodpovedá konvencii CP/M
-
* '''Load ROM MONITOR error''' - došlo ku chybe pri nahrávaní súboru ROM Monitora do pamäti, alebo samotný súbor sa nenašiel
+
* '''Load ROM MONITOR error''' - došlo ku chybe pri nahrávaní súboru ROM Monitora do pamäte, alebo samotný súbor sa nenašiel
* '''Command JUMP missing''' - dosiahol sa koniec INF súboru a príkaz JUMP sa nenašiel
* '''Command JUMP missing''' - dosiahol sa koniec INF súboru a príkaz JUMP sa nenašiel
-
* '''Bad number''' - chybne zadané číslo
+
* '''Bad number''' - chybne zadané číslo (jeho povolený rozsah, desiatkové/šestnástkové podľa požiadavky príkazu)
* '''File loading error''' - chyba pri nahrávaní súboru, alebo súbor zadaného mena neexistuje
* '''File loading error''' - chyba pri nahrávaní súboru, alebo súbor zadaného mena neexistuje
-
* '''Program name missing''' - za príkazom <code>NAME</code> chýba meno programu
+
* '''Program name missing''' - za príkazom {{Kbd|NAME}} chýba meno programu
 +
* '''Error opening or reading from the INF file!''' - došlo ku chybe pri otváraní INF súboru alebo čítaní z neho
== Služby RUNNERa a rozloženie pamäti ==
== Služby RUNNERa a rozloženie pamäti ==
Riadok 136: Riadok 182:
Základnou požiadavkou pri tvorbe RUNNERa bola najprv iba jednoduchá možnosť spúšťať pôvodné programy z PMD 85. Neskôr sa ale ukázalo, že bude účelné sprístupniť diskové operácie CP/M a tak umožniť programom zápis a čítanie súborov z disku.
Základnou požiadavkou pri tvorbe RUNNERa bola najprv iba jednoduchá možnosť spúšťať pôvodné programy z PMD 85. Neskôr sa ale ukázalo, že bude účelné sprístupniť diskové operácie CP/M a tak umožniť programom zápis a čítanie súborov z disku.
-
Keďže takmer všetky programy na PMD 85 sa vošli (alebo museli vôjsť) do dolných 32 kB pamäti, horná časť RAM PMD 85-3 od 9000h je voľná (od 8000h je zvolený Monitor) a v našom prípade to znamená, že CP/M (BDOS a BIOS) zostávajú neporušené v pamäti, čo možno s výhodou využiť.
+
Keďže takmer všetky programy na PMD 85 sa vošli (alebo museli vojsť) do dolných 32 kB pamäte, horná časť RAM PMD 85-2A/-3 od 9000h je voľná (od 8000h je zvolený Monitor) a v našom prípade to znamená, že CP/M (BDOS a BIOS) zostávajú neporušené v pamäti, čo možno s výhodou využiť.
-
=== Mapa pamäti ===
+
Treba ešte spomenúť jednu nepríjemnosť. Mnohé programy si po štarte inicializujú GPIO (porty 4Ch až 4Fh) kvôli joysticku (hry) alebo napr. tlačiarni (textové/grafické editory). Tým sa ale zruší nastavenie portu PA v móde 2, ktorý potrebuje PMD 32. Následné volanie diskových služieb zlyhá, pretože komunikácia s disketovou jednotkou je nefunkčná. Preto je nutné upraviť daný program tak, aby ku nevhodnej inicializácií GPIO nedošlo. Port PA musí byť preto inicializovaný do módu 2 a porty PB a PCL podľa potreby samotného programu. Príkladom môže byť predošlá ukážka INF súboru pre hru Boulder Dash, kde sa hra upravuje priamo v INF súbore príkazom {{Príkaz|POKE}} tak, aby sa joystick čítal na porte PB (namiesto PA) a disketová jednotka (aj keď nie je v tomto prípade pre hru potrebná, ale je stále pripojená) zostala na porte PA.
 +
 
 +
=== Základná mapa pamäte ===
------------------------------------------------------
------------------------------------------------------
Riadok 154: Riadok 202:
------------------------------------------------------
------------------------------------------------------
9C00 | |
9C00 | |
-
| RUNNER v 1.2 |
+
| RUNNER v 2.3 |
-
| premenné a zásobník RUNNERa |
+
| premenné, buffre a zásobník RUNNERa |
-
| buffer pre INF súbor |
+
| služby RUNNERa |
-
| buffer zálohovanj oblasti SPA CP/M |
+
| vytvorenie zoznamu programov, interpret príkazov |
ADFF | |
ADFF | |
------------------------------------------------------
------------------------------------------------------
Riadok 169: Riadok 217:
------------------------------------------------------
------------------------------------------------------
-
Po spustení konkrétneho programu už RUNNER buffer pre INF súbor a buffer zálohovanj oblasti SPA CP/M nepotrebuje a tak je voľný pre program. Adresu tejto oblasti a jej veľkosť môže program získať zavolaním príslušnej služby. V súčasnej verzii je veľkosť tejto oblasti 1409 bytov.
+
=== Mapa pamäte RUNNERa ===
 +
 
 +
Nasledujúca tabuľka ukazuje umiestnenie jednotlivých častí aktuálnej verzie RUNNERa v pamäti po jeho spustení:
 +
 
 +
{| class="wikitable" width="100%"
 +
|-
 +
| colspan="3" align="center" | ''Mapa pamäti RUNNERa''
 +
|-
 +
! Adresa
 +
! Veľkosť
 +
! Význam
 +
|-
 +
| 9C00h
 +
| 3
 +
| JMP 9E10 - skok na vstupný bod služieb.<br />Pre volanie služieb je treba použiť adresu, ktorá je v registri {{Kbd|DE}} (od verzie 2.3 aj na adrese {{Kbd|#FFFE}}) po spustení konkrétneho programu! Nikdy nie priamo 9C00h! Prípadná ďalšia verzia môže mať vstupný bod pre volanie služieb riešený inak.
 +
|-
 +
| 9C03h
 +
| 64
 +
| zásobník RUNNERa
 +
|-
 +
| 9C43h
 +
| 36
 +
| interné FCB využívané službami 1, 3, 4, 5 a 14
 +
|-
 +
| 9C67h
 +
| 36
 +
| FCB zviazané s 1. deskriptorom
 +
|-
 +
| 9C8Bh
 +
| 36
 +
| FCB zviazané s 2. deskriptorom
 +
|-
 +
| 9CAFh
 +
| 128
 +
| sektorový buffer zviazaný s 1. deskriptorom
 +
|-
 +
| 9D2Fh
 +
| 128
 +
| sektorový buffer zviazaný s 2. deskriptorom
 +
|-
 +
| 9DAFh
 +
| 81
 +
| buffer pre jeden textový riadok
 +
|-
 +
| 9E00h
 +
| 8
 +
| 1. deskriptor - viď. služby 7 až 12
 +
|-
 +
| 9E08h
 +
| 8
 +
| 2. deskriptor - viď. služby 7 až 12
 +
|-
 +
| 9E10h
 +
| 1099
 +
| kód samotných služieb RUNNERa
 +
|-
 +
| 0A25Bh
 +
| 2588 (2981)
 +
| kód pre vytvorenie zoznamu programov a interpreter príkazov<br />Táto oblasť pamäte, plus nevyužitá časť až po začiatok BDOSu (0AE00h), je po spustení konkrétneho programu voľná a jej adresu a veľkosť možno získať pomocou služby 2.
 +
|}
 +
 
 +
Predošlá tabuľka slúži iba pre informáciu! Neodporúča sa využívať uvedené adresy priamo, keďže ďalšie verzie môžu mať rozloženie pamäte iné. Vždy je treba používať získanú adresu pre vstupný bod pre volanie služieb a adresy, ktoré už poskytujú samotné služby.
=== Služby RUNNERa ===
=== Služby RUNNERa ===
-
Po spustení zvoleného programu (skokom na adresu uvedenú v príkaze <code>JUMP</code>) obsahuje register <code>DE</code> adresu vstupného bodu pre volanie služieb RUNNERa. Číslo služby sa predáva v registri <code>B</code>, ostatné parametre podľa potreby v ďalších registroch.
+
Po spustení zvoleného programu (skokom na adresu uvedenú v príkaze {{Kbd|JUMP}}) obsahuje register {{Kbd|DE}} adresu vstupného bodu pre volanie služieb RUNNERa. Od verzie 2.3 je táto adresa aj na adrese {{Kbd|#FFFE}}. Číslo služby sa predáva v registri {{Kbd|B}}, ostatné parametre podľa potreby v ďalších registroch.
-
==== 0 - CALL BDOS ====
+
 
-
Volanie pôvodných služieb BDOSu. Originálny vstupný bod BDOSu na adrese 0005h sa nesmie použiť, pretože na tejto adrese vlastne ani skok do BDOSu nemusí existovať. Používať iba pre diskové sluzby s číslami 13 a viac. Konzolové služby sa nedoporučuje používať, pretože tie využívajú systémové premenné Monitora a tak by mohlo dôjsť ku "kolízii" so zobrazovaním pri volaní klasických rutín Monitora.
+
{{CodeBig|0 - CALL BDOS}}
 +
 
 +
Volanie pôvodných služieb BDOSu. Originálny vstupný bod BDOSu na adrese 0005h sa nesmie použiť, pretože na tejto adrese vlastne ani skok do BDOSu nemusí existovať. Možno použiť iba pre diskové služby BDOSu s číslami 13 a viac. Konzolové služby BDOSu nie je umožnené volať, pretože tie využívajú systémové premenné Monitora a tak by mohlo dôjsť ku "kolízii" so zobrazovaním pri volaní klasických rutín Monitora.
* Vstup:
* Vstup:
** B=0
** B=0
** C=číslo BDOS služby (>=13)
** C=číslo BDOS služby (>=13)
-
** ostané parametre podľa danej BDOS služby
+
** ostatné parametre podľa danej BDOS služby
* Výstup:
* Výstup:
** podľa danej BDOS služby
** podľa danej BDOS služby
 +
* Mení:
 +
** všetky registre
-
==== 1 - FCB ADDRESS ====
+
 
-
Služba vráti adresu internej FCB, ktorá je používaná ďalšími službami.
+
{{CodeBig|1 - FCB ADDRESS}}
 +
 
 +
Služba vráti adresu interného FCB, ktorý je používaný službami 3, 4, 5 a 14.
* Vstup:
* Vstup:
** B=1
** B=1
* Výstup:
* Výstup:
-
** HL=adresa interneho FCB
+
** HL=adresa interného FCB
 +
* Mení:
 +
** HL
 +
 
 +
 
 +
{{CodeBig|2 - BUFFER ADDRESS AND SIZE}}
-
==== 2 - BUFFER ADDRESS AND SIZE ====
+
Služba vráti adresu a veľkosť voľnej pamäťovej oblasti za službami RUNNERa.
-
Služba vráti adresu a veľkosť interného buffra.
+
* Vstup:
* Vstup:
** B=2
** B=2
* Výstup:
* Výstup:
-
** HL=adresa interneho buffra
+
** HL=adresa
-
** BC=veľkosť interného buffra
+
** BC=veľkosť
 +
* Mení:
 +
** HL, BC
-
==== 3 - PREPARE FILE NAME ====
+
 
-
Služba spracuje reťazec, ktorý zodpovedá menu súboru v tvare filename.ext (8.3)
+
{{CodeBig|3 - PREPARE FILE NAME}}
-
a pripravi do internej FCB.
+
 
 +
Služba spracuje reťazec, ktorý zodpovedá menu súboru v tvare [d:]filename[.ext] (1:8.3)
 +
a pripraví ho do interného FCB. Pokiaľ sa neuvedie disk, bude sa predpokladať aktuálny disk.
* Vstup:
* Vstup:
** B=3
** B=3
-
** HL=adresa vstupného textu s menom súboru ukončeného CR (0Dh)
+
** HL=adresa vstupného textu s menom súboru ukončeného nulou (00h)
 +
** C=1 - meno môže obsahovať Wildcards ('?' a '*')
 +
** C=0 - meno nesmie obsahovať Wildcards
* Výstup:
* Výstup:
** CY=1 pri chybe
** CY=1 pri chybe
** CY=0, ak je meno súboru v poriadku, vyplnené interné FCB
** CY=0, ak je meno súboru v poriadku, vyplnené interné FCB
 +
* Mení:
 +
** všetky registre
-
==== 4 - LOAD FILE ====
+
 
-
Služba pre načítanie súboru na požadovanú adresu a o maximálne povolenej dĺžke.
+
{{CodeBig|4 - LOAD FILE}}
 +
 
 +
Služba pre načítanie celého súboru na požadovanú adresu a o maximálne povolenej dĺžke. Meno súboru pripravené v internom FCB by malo byť jednoznačné (bez wildcards), inak sa načíta prvý súbor, ktorý zodpovedá danej maske. POZOR: Mení aktuálnu adresu DMA pre BDOS!
* Vstup:
* Vstup:
** B=4
** B=4
** [interné FCB]=pripravené meno súboru
** [interné FCB]=pripravené meno súboru
-
** HL=DMA adresa kam sa súbor nahraje
+
** HL=adresa kam sa súbor nahrá
** DE=maximálna dĺžka súboru
** DE=maximálna dĺžka súboru
* Výstup:
* Výstup:
Riadok 220: Riadok 349:
** CY=1 - súbor je dlhý
** CY=1 - súbor je dlhý
** S=0, CY=0 - OK
** S=0, CY=0 - OK
 +
* Mení:
 +
** všetky registre
 +
 +
 +
{{CodeBig|5 - SAVE FILE}}
-
==== 5 - SAVE FILE ====
+
Služba pre uloženie obsahu pamäti z požadovanej adresy a o požadovanej dĺžke do súboru. Dĺžka sa zarovná na násobok 128. Existujúci súbor daného mena sa najprv zmaže. Meno súboru pripravené v internom FCB musí byť jednoznačné (bez wildcards), inak mazanie súboru, ktoré je súčasťou služby, môže spôsobiť zmazanie skupiny súborov, ktorých mená zodpovedajú danej maske. POZOR: Mení aktuálnu adresu DMA pre BDOS!
-
Služba pre uloženie súboru z požadovanej adresy a o požadovanej dĺžke. Dĺžka sa zarovná na násobok 128.
+
* Vstup:
* Vstup:
** B=5
** B=5
** [interné FCB]=pripravené meno súboru
** [interné FCB]=pripravené meno súboru
-
** HL=DMA adresa
+
** HL=adresa
** DE=dĺžka
** DE=dĺžka
* Výstup:
* Výstup:
Riadok 232: Riadok 365:
** CY=1 - súbor je dlhý
** CY=1 - súbor je dlhý
** S=0, CY=0 - OK
** S=0, CY=0 - OK
 +
* Mení:
 +
** všetky registre
 +
 +
 +
{{CodeBig|6 - RUNNER VERSION}}
-
==== 6 - RUNNER VERSION ====
 
Vráti číslo verzie RUNNERa.
Vráti číslo verzie RUNNERa.
* Vstup:
* Vstup:
** B=6
** B=6
* Výstup:
* Výstup:
-
** A=číslo verzie RUNNERa. Súčasná verzia vráti 12h
+
** A=číslo verzie RUNNERa. Súčasná verzia vráti 23h
 +
* Mení:
 +
** A
-
== Spustenie RUNNERa ==
 
-
RUNNER možno spustiť dvoma spôsobmi.
+
Nasledujúce služby (7 až 12) umožňujú pracovať so súbormi sekvenčne po bajtoch. Po otvorení súboru sa v registri {{Kbd|HL}} vráti adresa deskriptora, ktorá sa potom používa pri volaní ďalších služieb. Deskriptor má veľkosť 8 bytov a udržiava sa v ňom aktuálny stav otvoreného súboru. S každým deskriptorom je zviazaný jeden FCB a buffer o veľkosti 128 bytov. RUNNER umožňuje mať otvorené súčasne dva súbory naraz. Súbor môže byť otvorený v móde pre čítanie alebo pre zápis. Ak je súbor otvorený pre čítanie, nie je možné doň zapisovať a naopak.
-
* <code>RUN</code>
+
-
* <code>RUN PROGRAM[.INF]</code>
+
-
V prvom prípade RUNNER vyhľadá v adresári všetky INF súbory, prečíta z príkazu <code>NAME</code> dlhé názvy programov a zobrazí zotriedený zoznam. Zoznam môže obsahovať maximálne 32 položiek. Ak je ich menej ako 17, zobrazí sa jeden stĺpec. Ak je ich viac ako 16, zobrazia sa dva stĺpce. Pred každým menom programu je písmeno alebo číslica, ktorým sa prevádza voľba. Stlačením príslušnej klávesy sa zvolený program zavedie podľa obsahu INF súboru do pamäti a spustí.
+
Do deskriptora nie je vhodné počas práce so súborom zasahovať, ale pre úplnosť tu uvedieme význam jednotlivých jeho položiek:
 +
{| class="wikitable"
 +
|-
 +
| colspan="3" align="center" | ''Deskriptor otvoreného súboru''
 +
|-
 +
! Offset
 +
! Veľkosť
 +
! Význam
 +
|-
 +
| 0
 +
| 1
 +
| RW flag - 0/1/2 = CLOSED/READ/WRITE
 +
|-
 +
| 1
 +
| 2
 +
| adresa FCB otvoreného súboru
 +
|-
 +
| 3
 +
| 1
 +
| počítadlo bytov v buffri
 +
|-
 +
| 4
 +
| 2
 +
| adresa sektorového buffra zviazaného s týmto deskriptorom
 +
|-
 +
| 6
 +
| 2
 +
| aktuálny ukazateľ do sektorového buffra
 +
|}
-
Druhý prípad slúži pre priame spustenie konkrétneho programu.
 
-
== Na stiahnutie ==
+
{{CodeBig|7 - OPEN FILE (1. možnosť)}}
-
* [[download:45|RUNNER.P32]] - obraz disku s programom a zdrojákom
+
Otvorí súbor pre sekvenčné čítanie alebo sekvenčný zápis po bytoch. Pri otváraní súboru pre zápis sa existujúci súbor daného mena najprv zmaže. Táto služba očakáva jednoznačné meno súboru v tvare ako je to v FCB.
-
* [[download:46|GAMES.P32]] - obraz disku s prevedenými hrami, ktoré sa spúšťajú prostredníctvom RUNNERa
+
* Vstup:
 +
** B=7
 +
** A=0 alebo 1 - číslo deskriptora
 +
** C=1-READ alebo 2-WRITE
 +
** HL=adresa predpripraveného mena súboru ako v FCB - DNNNNNNNNEEE
 +
* Výstup:
 +
** CY=1 pri chybe parametrov
 +
** S=1, ak sa súbor nepodarilo otvoriť
 +
** S=0, CY=0 - OK, HL=adresa deskriptora
 +
* Mení:
 +
** všetky registre
 +
 
 +
 
 +
{{CodeBig|8 - OPEN FILE (2. možnosť)}}
 +
 
 +
Otvorí súbor pre sekvenčné čítanie alebo sekvenčný zápis po bytoch. Pri otváraní súboru pre zápis sa existujúci súbor daného mena najprv zmaže. Táto služba očakáva jednoznačné meno súboru v rovnakom tvare ako služba 3.
 +
* Vstup:
 +
** B=8
 +
** A=0 alebo 1 - číslo deskriptora
 +
** C=1-READ alebo 2-WRITE
 +
** HL=adresa vstupného textu s menom súboru ukončeného nulou
 +
* Výstup:
 +
** CY=1 pri chybe parametrov
 +
** S=1, ak sa súbor nepodarilo otvoriť
 +
** S=0, CY=0 - OK, HL=adresa deskriptora
 +
* Mení:
 +
** všetky registre
 +
 
 +
 
 +
{{CodeBig|9 - READ BYTE}}
 +
 
 +
Prečíta byte zo súboru, ktorý bol otvorený na čítanie. POZOR: Mení aktuálnu adresu DMA pre BDOS!
 +
* Vstup:
 +
** B=9
 +
** HL=adresa deskriptora
 +
* Výstup:
 +
** CY=0, Z=1 - OK, A=prečítaný byte
 +
** CY=1 - chybný typ operácie v deskriptore
 +
** Z=0 - chyba pri čítaní zo súboru - koniec súboru
 +
** S=1 - disková chyba
 +
* Mení:
 +
** AF
 +
 
 +
 
 +
{{CodeBig|10 - WRITE BYTE}}
 +
 
 +
Zapíše byte do súboru, ktorý bol otvorený pre zápis. POZOR: Mení aktuálnu adresu DMA pre BDOS!
 +
* Vstup:
 +
** B=10
 +
** HL=adresa deskriptora
 +
** A=zapisovaný byte
 +
* Výstup:
 +
** CY=0, Z=1 - OK
 +
** CY=1 - chybný typ operácie v deskriptore
 +
** Z=0 - chyba pri zápise do súboru - plný disk
 +
** S=1 - disková chyba
 +
* Mení:
 +
** AF
 +
 
 +
 
 +
{{CodeBig|11 - CLOSE FILE}}
 +
 
 +
Uzatvorí otvorený súbor. Súbory otvorené pre čítanie nie je podľa špecifikácie CP/M nutné uzatvárať, ale z konvencie sa to odporúča. Pokiaľ bol súbor otvorený pre zápis a v buffri sú nezapísané dáta, prevedie sa najprv zápis posledného sektora a až tak sa súbor uzavrie. Uzatváranie súboru, ktorý bol otvorený pre zápis je teda nutné! POZOR: Mení aktuálnu adresu DMA pre BDOS!
 +
* Vstup:
 +
** B=11
 +
** HL=adresa deskriptora
 +
* Výstup:
 +
** CY=0, Z=1 - OK
 +
** CY=1 - chybný typ operácie v deskriptore
 +
** Z=0 - chyba pri zápise do súboru
 +
** S=1 - disková chyba
 +
* Mení:
 +
** všetky registre
 +
 
 +
 
 +
{{CodeBig|12 - READ LINE}}
 +
 
 +
Zo súboru prečíta jeden textový riadok ukončený znakmi CR a LF a uloží do cieľového buffra. Súbor musí byť otvorený službou 7 alebo 8 pre čítanie. Predpokladá sa, že vstupný súbor je obyčajný textový súbor a za koniec súboru (a prípadne aj posledného riadku) sa považuje znak EOF. Všetky riadiace znaky s kódmi menšími ako 32, s výnimkou CR, LF, TAB a EOF, sa ignorujú. Tabulátor je možné nechať voliteľne nahradzovať jednou medzerou. Za koniec riadku sa považuje iba LF! CR sa potichu preskočí.
 +
Cieľový buffer musí mať veľkosť minimálne podľa hodnoty registra C + 1, aby sa mohla zapísať ukončovacia nula. Pokiaľ sa buffer zaplní a nedosiahol sa CR a LF, je v B registri vrátená pôvodná hodnota +1. CR, LF a ani EOF sa do cieľového buffra nezapisujú! Iba ukončovacia nula. POZOR: Mení aktuálnu adresu DMA pre BDOS!
 +
* Vstup:
 +
** B=12
 +
** HL=adresa deskriptora
 +
** DE=adresa cieľového buffra
 +
** C=veľkosť cieľového buffra -1
 +
** CY=1 - tabulátor sa nahradí jednou medzerou
 +
** CY=0 - tabulátor sa ponechá
 +
* Výstup:
 +
** CY=0, Z=1 - OK
 +
*** B=počet znakov zapísaných do buffra
 +
*** DE=ukazuje za posledný zapísaný byte v buffri
 +
** CY=0, Z=0 - čítanie za fyzickým koncom súboru
 +
** CY=1 - chybný typ operácie v deskriptore
 +
** S=1 - disková chyba
 +
* Mení:
 +
** DE, BC, AF
 +
 
 +
 
 +
{{CodeBig|13 - RETURN TO CP/M}}
 +
 
 +
Prevedie sa návrat do CP/M.
 +
* Vstup:
 +
** B=13
 +
 
 +
 
 +
{{CodeBig|14 - GET CATALOGUE}}
 +
 
 +
Získanie katalógu súborov podľa zadanej masky. Zoznam nájdených súborov je uložený do buffra, ktorého veľkosť musí byť 1kB. Predpokladá sa, že adresár môže mať max. 64 súborov, ako je to v MIKROSe pre PMD 85. Preto je 64*14=896 bytov od začiatku buffra určených pre zoznam súborov a zostávajúcich 128 bytov slúži ako DMA buffer pre BDOS služby vyhľadávania. Pre každý záznam je teda vyhradených 14 bytov a záznam má tento tvar: UNNNNNNNNEEELL, kde prvých 12 bytov je kópia z FCB (user, name, ext) a LL je dĺžka súboru v kB. Hodnotou v registri C je možno zvoliť, či sa majú zisťovať aj dĺžky súborov. Zistenie dĺžok súborov je časovo náročnejšie. Ak sa dĺžky súborov nezisťujú, LL je rovné 0.
 +
* Vstup:
 +
** B=14
 +
** [interne FCB]=pripravená maska pre hľadanie súborov
 +
** HL=adresa buffra, kam sa uloží zoznam nájdených súborov
 +
** C=0 - nezisťujú sa dĺžky súborov
 +
** C=1 - dĺžky súborov sa budú zisťovať
 +
* Výstup:
 +
** Z=1 - ak sa nenašli žiadne súbory
 +
** Z=0 - súbory sa našli
 +
*** B=počet nájdených súborov
 +
*** HL=adresa buffra so zoznamom nájdených súborov
 +
* Mení:
 +
** AF, B, DE
 +
== Zoznam verzií RUNNERa ==
 +
* '''1.2''' (2008-2009)
 +
** Prvá publikovaná verzia.
 +
** Fungovala iba na PMD 85-3.
 +
** Súbor '''INF''' mohol mať maximálne 1 kB.
 +
** Podpora služieb 0 až 6.
 +
* '''1.3''' (2009)
 +
** Oprava triedenia súborov a zobrazovania súborov v dvoch stĺpcoch.
 +
** Oprava zobrazenia obrázku po štvorčekoch.
 +
* '''2.0''' (3/2011)
 +
** Prepracovanie celého programu.
 +
** Odteraz program funguje aj na PMD 85-2A.
 +
** Veľkosť súboru '''INF''' už nie je obmedzená na 1 kB.
 +
** Pridané služby 7 až 13. Modifikované služby 0 a 3.
 +
** Pridaná možnosť "pomenovať" disketu v súbore '''RUN.INF''' a potlačiť zoradenie súborov novým príkazom {{Príkaz|NOSORT}}.
 +
* '''2.1''' (8/2011)
 +
** Pri návrate do CP/M obnoví pôvodné hodnoty systémových bytov IOBYTE a CDISK.
 +
** Oprava straty adresy deskriptora pri uzatváraní súboru.
 +
* '''2.2''' (9/2011)
 +
** Pridaná nová služba č. 14 pre získanie katalógu disku.
 +
* '''2.3''' (4/2026)
 +
** Pridaný príkaz {{Príkaz|LOAD}} ako alternatívu k príkazu {{Príkaz|FILE}}.
 +
** Pridaný príkaz {{Príkaz|SCREEN}} ako alternatívu k príkazu {{Príkaz|PICTURE}}.
 +
** Pridaný príkaz {{Príkaz|PRINT}} ako alternatívu k príkazu {{Príkaz|DISP}}.
 +
** Do príkazu {{Príkaz|PICTURE/SCREEN}} pridaná podpora pre ďalší typ obrázku: '''Q''' - Obrázok spakovaný programom [[QuidoScr]].
 +
** Pridaný nový príkaz {{Príkaz|FRAME}} pre vykreslenie rámčeka.
 +
** Adresa vstupného bodu pre volanie služieb sa uloží aj na adresu {{Kbd|#FFFE}}.
-
[[Kategória:Blog| 006]]
+
[[Kategória:Systémové programy]]
 +
[[Kategória:Softvér]]

Aktuálna verzia

RUNNER


RUNNER
Autor:Roman Bórik
Vývojár:RM-TEAM
Verzia:RUNNER, v2.3 (2026)
(PMD 85-2A/-3 + PMD 32)
Operačný systém:CP/M (MIKROS)
Lokalizácia:angličtina
Download: RUNNER.P32 - obraz disku s programom a zdrojovým kódom

Obsah


RUNNER je program pre PMD 85-2A alebo PMD 85-3 v spojení s disketovou jednotkou PMD 32 bežiaci pod operačným systémom Mikros (CP/M 2.2). Umožňuje spúšťať z diskety programy pôvodne napísané pre PMD 85 a poskytuje im aj možnosť prístupu k diskovým operáciám BDOSu.

Zdanlivou nevýhodou je skutočnosť, že pôvodný program je potrebné "preskúmať", pôvodne nahrávané bloky z kazety previesť do súborov na diskete a pripraviť tzv. informačný súbor s príponou INF, ktorý popisuje, kam sa majú dané súbory nahrať a ako sa má program spustiť. Výsledkom je ale neporovnateľne rýchlejšie a pohodlnejšie spúšťanie programu. Ak daný program používal kazetové operácie, tie je pochopiteľne nutné pomerne prácnejšie upraviť na diskové, avšak samotný RUNNER poskytuje služby pre volanie pôvodných služieb BDOSu, takže sa pri úprave stačí zamerať iba na prácu so samotným súborom pod CP/M, čo by mala byť pre človeka, ktorý sa do toho pustí, všeobecne známa záležitosť.

Spustenie RUNNERa

RUNNER možno spustiť dvoma spôsobmi.

  • RUN
  • RUN PROGRAM[.INF]

V prvom prípade RUNNER vyhľadá v adresári všetky INF súbory, prečíta z príkazu NAME dlhé názvy programov a zobrazí zotriedený (ak to nie je vypnuté) zoznam. Zoznam môže obsahovať maximálne 32 položiek. Ak je ich menej ako 17, zobrazí sa jeden stĺpec. Ak je ich viac ako 16, zobrazia sa dva stĺpce. Pred každým menom programu je písmeno alebo číslica, ktorým sa prevádza voľba. Stlačením príslušného klávesu sa zvolený program zavedie podľa obsahu INF súboru do pamäte a spustí.
Ak sa na disku nachádza súbor RUN.INF (viď. ďalej), prečíta sa z neho pomenovanie disku a voľba potlačenia triedenia súborov.

Druhý prípad slúži pre priame spustenie konkrétneho programu.

Informačný súbor

Ako bolo spomenuté vyššie, aby RUNNER vedel, ako má program zaviesť do pamäte a spustiť, musí mať každý program vytvorený svoj informačný súbor s príponou INF. Súbor INF si možno predstaviť ako jednoduchý program, ktorý sériou príkazov nahrá jednotlivé bloky programu a program spustí. RUNNER teda poskytuje niekoľko jednoduchých príkazov, ktoré sú popísané v ďalšom texte.

Formát súboru INF a základné požiadavky

  • je to obyčajný textový súbor
  • každý riadok obsahuje jeden príkaz
  • príkaz musí byť od parametrov oddelený aspoň jednou medzerou
  • poradie príkazov je ľubovoľné, jedine príkaz JUMP musí byť posledným príkazom
  • príkazy sú spracovávané sekvenčne po jednotlivých riadkoch
  • riadky začínajúce znakom ';' (bodkočiarka) sú ignorované

Príkazy RUNNERa

Názvy príkazov sa píšu vždy veľkými písmenami. Hexadecimálne čísla sa píšu bez prefixu a postfixu veľkými písmenami. Mená súborov, vypisované texty a texty v poznámke už môžu byť písané veľkými aj malými písmenami.

NAME name

Príkaz NAME je povinný a je použitý iba pri vytváraní zoznamu programov na disku pre získanie dlhého mena programu, keďže na vhodné pomenovanie 8 znakov v názve súboru zvyčajne nepostačuje. Pri vykonávaní príkazov je ignorovaný.

  • name môže mať maximálne 20 znakov

Príkaz NAME má aj špeciálne použitie v súbore RUN.INF pre pomenovanie diskety, viď, ďalej.


MONIT t[,X]

Príkaz MONIT určuje typ monitora, ktorý sa zavedie do pamäte od adresy 8000h pred spustením programu, teda skokom na adresu uvedenú v príkaze JUMP. Ak to nie je potlačené parametrom X, je prevedená štandardná inicializácia systémových premenných. Preto sa neodporúča meniť obsah súborov s ROM monitormi. Príkaz je nepovinný, ale ak je uvedený, mal by sa vyskytnúť iba raz.

  • t je typ monitora - hodnota 1 pre MONIT1.ROM, hodnota 2 pre MONIT2.ROM. Tieto dva súbory sa musia nachádzať na diskete spolu so samotným RUNNERom.
  • parameter X je voliteľný a potlačuje obvyklú inicializáciu systémových premenných


PICTURE fn,t[,param]
SCREEN fn,t[,param]

Príkaz PICTURE, resp. SCREEN slúži pre zobrazenie obrázku z uvedeného súboru. Obrázok môže byť rôzneho typu, čo určuje parameter t.

  • fn je meno súboru s obrázkom
  • t určuje typ obrazových dát v súbore
    • V - celá VideoRAM 16kB - RUNNER nahrá obrázok do VideoRAM, ale vynechá systémovú oblasť
    • W - celá VideoRAM 16kB - RUNNER nahrá obrázok do VideoRAM vrátane systémovej oblasti (neodporúčané)
    • D - čisté video dáta bez systémovej oblasti (12kB)
    • C - komprimovaný obrázok programom GRED
    • S - obrázok po štvorčekoch z programu GRED; vyžaduje povinný číselný parameter param určujúci rýchlosť zobrazovania obrázku po štvorčekoch - hodnota 0 (pomaly) až 3 (rýchlo)
    • Q - obrázok spakovaný pomocou QuidoScr vrátane rutiny; vyžaduje povinný parameter param určujúci hexadecimálnu adresu pamäte, kam sa súbor nahrá a odkiaľ sa spustí rozpakovanie


FILE fn,hexadr
LOAD fn,hexadr

Príkaz nahrá do pamäte uvedený súbor. RUNNER nijako nekontroluje kam sa má súbor nahrať a ani jeho dĺžku.

  • fn je meno súboru, ktorý sa má nahrať do pamäte
  • hexadr je hexadecimálna adresa, kam sa súbor nahrá


CALL hexadr

Zavolanie rutiny.

  • hexadr je hexadecimálna adresa rutiny - rutina nemusí zachovávať žiadne registre. Na zásobníku je voľných asi 50 bytov.


JUMP hexadr

Spustenie samotného programu. JUMP by mal byť posledným príkazom, pretože všetky riadky za príkazom JUMP sú ignorované. Pred spustením programu je nastavený AllRAM režim, do pamäte je zavedený zvolený Monitor a prevedená inicializácia systémových premenných (pokiaľ bol uvedený príkaz MONITOR a nebola inicializácia potlačená). Do registra DE (od verzie 2.3 aj na adresu #FFFE) je uložená adresa vstupného bodu pre volanie služieb RUNNERa.

  • hexadr je hexadecimálna adresa, na ktorú sa predá riadenie


PAUSE time

Zdržanie, ktoré možno prerušiť stlačením klávesu.

  • time určuje čas v 1/10 sekundy, koľko sa má čakať (desiatková hodnota maximálne 65535). Ak je hodnotou 0, čaká sa na stlačenie klávesu.


POKE hexadr,hexval[,hexval ...]

Príkaz pre modifikáciu obsahu pamäte.

  • hexadr je hexadecimálna adresa, od ktorej sa začne zapisovať
  • hexval sú hexadecimálne 8 bitové hodnoty, ukladané postupne od zadanej adresy


CLS

Zmazanie obrazovky.


DISP r,c,cl,"text"
PRINT r,c,cl,"text"

Zobrazenie textu na zvolenú pozíciu. Všetky parametre sú desiatkové čísla.

  • r je riadok od 0 do 27
  • c je stĺpec od 0 do 47
  • cl je farba od 0 do 3 normálne, od 4 do 7 invertovane
  • text je zobrazovaný text - musí byť v úvodzovkách


FRAME r,c,w,h,cl

Vykreslenie rámčeka zo znakov - (pomlčka), | (vertikálna čiara) a + (plus). Vykresľuje sa iba samotný rámček, takže jeho vnútro zostane nezmenené. Všetky parametre sú desiatkové čísla.

  • r je riadok od 0 do 27
  • c je stĺpec od 0 do 47
  • w je šírka (vrátane hrán rámčeka) od 3 do 48
  • c je výška (vrátane hrán rámčeka) od 3 do 28
  • cl je farba od 0 do 3 normálne, od 4 do 7 invertovane


NOSORT

Príkaz NOSORT je určený pre súbor RUN.INF (viď. ďalej) a slúži pre potlačenie triedenia zoznamu súborov. Pre RUN.INF je nepovinný, pre klasické INF súbory nemá význam a je ignorovaný.

Špeciálny súbor RUN.INF

Na disketu možno pridať špeciálny súbor RUN.INF, ktorý umožňuje pomenovať disketu a potlačiť triedenie zoznamu programov. V tomto súbore má teda zmysel iba príkaz NAME a príkaz NOSORT, ostatné príkazy sú ignorované. Syntaktické chyby nie sú hlásené a prípadná chyba spôsobí iba ukončenie spracovávania súboru RUN.INF.

Príkaz NAME je opäť nepovinný a slúži pre "pomenovanie" diskety. Tento názov sa zobrazí v záhlaví obrazovky vpravo hore. Príkaz je v tomto prípade nepovinný. name môže mať opäť maximálne 20 znakov.


Príklad: súbor BOULDER.INF

; BOULDER DASH - VBG SOFTWARE (c) 1988
NAME BOULDER DASH
CLS
PICTURE BOULDER.PSC,C
FILE BOULDER.COD,0150
MONIT 2
; JOYSTICK NA GPIO1, PMD 32 NA GPIO0
POKE 09A1,C2
POKE 09A5,01
POKE 0A20,4D
JUMP 4002

Chybové hlásenia RUNNERa

Ak dôjde k akejkoľvek chybe, prevedie sa návrat do CP/M, ak je to možné.

Ak RUNNER pri spustení nenájde žiadne INF súbory, zobrazí nasledujúce chybové hlásenie:

  • No INF files found!

RUNNER kontroluje správnosť zadania príkazov a prípadné chyby hlási v tvare

  • ERROR at line NN

kde, ERROR je jedno z nasledujúcich hlásení a NN je číslo riadku, na ktorom došlo ku chybe.

  • Syntax error - všeobecná chyba syntaxe príkazu
  • Bad file name - meno súboru nezodpovedá konvencii CP/M
  • Load ROM MONITOR error - došlo ku chybe pri nahrávaní súboru ROM Monitora do pamäte, alebo samotný súbor sa nenašiel
  • Command JUMP missing - dosiahol sa koniec INF súboru a príkaz JUMP sa nenašiel
  • Bad number - chybne zadané číslo (jeho povolený rozsah, desiatkové/šestnástkové podľa požiadavky príkazu)
  • File loading error - chyba pri nahrávaní súboru, alebo súbor zadaného mena neexistuje
  • Program name missing - za príkazom NAME chýba meno programu
  • Error opening or reading from the INF file! - došlo ku chybe pri otváraní INF súboru alebo čítaní z neho

Služby RUNNERa a rozloženie pamäti

Základnou požiadavkou pri tvorbe RUNNERa bola najprv iba jednoduchá možnosť spúšťať pôvodné programy z PMD 85. Neskôr sa ale ukázalo, že bude účelné sprístupniť diskové operácie CP/M a tak umožniť programom zápis a čítanie súborov z disku.

Keďže takmer všetky programy na PMD 85 sa vošli (alebo museli vojsť) do dolných 32 kB pamäte, horná časť RAM PMD 85-2A/-3 od 9000h je voľná (od 8000h je zvolený Monitor) a v našom prípade to znamená, že CP/M (BDOS a BIOS) zostávajú neporušené v pamäti, čo možno s výhodou využiť.

Treba ešte spomenúť jednu nepríjemnosť. Mnohé programy si po štarte inicializujú GPIO (porty 4Ch až 4Fh) kvôli joysticku (hry) alebo napr. tlačiarni (textové/grafické editory). Tým sa ale zruší nastavenie portu PA v móde 2, ktorý potrebuje PMD 32. Následné volanie diskových služieb zlyhá, pretože komunikácia s disketovou jednotkou je nefunkčná. Preto je nutné upraviť daný program tak, aby ku nevhodnej inicializácií GPIO nedošlo. Port PA musí byť preto inicializovaný do módu 2 a porty PB a PCL podľa potreby samotného programu. Príkladom môže byť predošlá ukážka INF súboru pre hru Boulder Dash, kde sa hra upravuje priamo v INF súbore príkazom POKE tak, aby sa joystick čítal na porte PB (namiesto PA) a disketová jednotka (aj keď nie je v tomto prípade pre hru potrebná, ale je stále pripojená) zostala na porte PA.

Základná mapa pamäte

     ------------------------------------------------------
0000 |                                                    |
     |          RAM 32 kB pre nahrávaný program           |
7FFF |                                                    |
     ------------------------------------------------------
8000 |                                                    |
     |             zvolený Monitor 1 alebo 2              |
8FFF |                                                    |
     ------------------------------------------------------
9000 |                                                    |
     | voľné 3 kB pre prípadné diskové operácie programov |
9BFF |                                                    |
     ------------------------------------------------------
9C00 |                                                    |
     |                    RUNNER v 2.3                    |
     |        premenné, buffre a zásobník RUNNERa         |
     |                   služby RUNNERa                   |
     |  vytvorenie zoznamu programov, interpret príkazov  |
ADFF |                                                    |
     ------------------------------------------------------
AE00 |                                                    |
     |                 CP/M - BDOS a BIOS                 |
BFFF |                                                    |
     ------------------------------------------------------
C000 |                                         |          |
     |                 Video RAM               | zápisník |
FFFF |                                         |          |
     ------------------------------------------------------

Mapa pamäte RUNNERa

Nasledujúca tabuľka ukazuje umiestnenie jednotlivých častí aktuálnej verzie RUNNERa v pamäti po jeho spustení:

Mapa pamäti RUNNERa
Adresa Veľkosť Význam
9C00h 3 JMP 9E10 - skok na vstupný bod služieb.
Pre volanie služieb je treba použiť adresu, ktorá je v registri DE (od verzie 2.3 aj na adrese #FFFE) po spustení konkrétneho programu! Nikdy nie priamo 9C00h! Prípadná ďalšia verzia môže mať vstupný bod pre volanie služieb riešený inak.
9C03h 64 zásobník RUNNERa
9C43h 36 interné FCB využívané službami 1, 3, 4, 5 a 14
9C67h 36 FCB zviazané s 1. deskriptorom
9C8Bh 36 FCB zviazané s 2. deskriptorom
9CAFh 128 sektorový buffer zviazaný s 1. deskriptorom
9D2Fh 128 sektorový buffer zviazaný s 2. deskriptorom
9DAFh 81 buffer pre jeden textový riadok
9E00h 8 1. deskriptor - viď. služby 7 až 12
9E08h 8 2. deskriptor - viď. služby 7 až 12
9E10h 1099 kód samotných služieb RUNNERa
0A25Bh 2588 (2981) kód pre vytvorenie zoznamu programov a interpreter príkazov
Táto oblasť pamäte, plus nevyužitá časť až po začiatok BDOSu (0AE00h), je po spustení konkrétneho programu voľná a jej adresu a veľkosť možno získať pomocou služby 2.

Predošlá tabuľka slúži iba pre informáciu! Neodporúča sa využívať uvedené adresy priamo, keďže ďalšie verzie môžu mať rozloženie pamäte iné. Vždy je treba používať získanú adresu pre vstupný bod pre volanie služieb a adresy, ktoré už poskytujú samotné služby.

Služby RUNNERa

Po spustení zvoleného programu (skokom na adresu uvedenú v príkaze JUMP) obsahuje register DE adresu vstupného bodu pre volanie služieb RUNNERa. Od verzie 2.3 je táto adresa aj na adrese #FFFE. Číslo služby sa predáva v registri B, ostatné parametre podľa potreby v ďalších registroch.


0 - CALL BDOS

Volanie pôvodných služieb BDOSu. Originálny vstupný bod BDOSu na adrese 0005h sa nesmie použiť, pretože na tejto adrese vlastne ani skok do BDOSu už nemusí existovať. Možno použiť iba pre diskové služby BDOSu s číslami 13 a viac. Konzolové služby BDOSu nie je umožnené volať, pretože tie využívajú systémové premenné Monitora a tak by mohlo dôjsť ku "kolízii" so zobrazovaním pri volaní klasických rutín Monitora.

  • Vstup:
    • B=0
    • C=číslo BDOS služby (>=13)
    • ostatné parametre podľa danej BDOS služby
  • Výstup:
    • podľa danej BDOS služby
  • Mení:
    • všetky registre


1 - FCB ADDRESS

Služba vráti adresu interného FCB, ktorý je používaný službami 3, 4, 5 a 14.

  • Vstup:
    • B=1
  • Výstup:
    • HL=adresa interného FCB
  • Mení:
    • HL


2 - BUFFER ADDRESS AND SIZE

Služba vráti adresu a veľkosť voľnej pamäťovej oblasti za službami RUNNERa.

  • Vstup:
    • B=2
  • Výstup:
    • HL=adresa
    • BC=veľkosť
  • Mení:
    • HL, BC


3 - PREPARE FILE NAME

Služba spracuje reťazec, ktorý zodpovedá menu súboru v tvare [d:]filename[.ext] (1:8.3) a pripraví ho do interného FCB. Pokiaľ sa neuvedie disk, bude sa predpokladať aktuálny disk.

  • Vstup:
    • B=3
    • HL=adresa vstupného textu s menom súboru ukončeného nulou (00h)
    • C=1 - meno môže obsahovať Wildcards ('?' a '*')
    • C=0 - meno nesmie obsahovať Wildcards
  • Výstup:
    • CY=1 pri chybe
    • CY=0, ak je meno súboru v poriadku, vyplnené interné FCB
  • Mení:
    • všetky registre


4 - LOAD FILE

Služba pre načítanie celého súboru na požadovanú adresu a o maximálne povolenej dĺžke. Meno súboru pripravené v internom FCB by malo byť jednoznačné (bez wildcards), inak sa načíta prvý súbor, ktorý zodpovedá danej maske. POZOR: Mení aktuálnu adresu DMA pre BDOS!

  • Vstup:
    • B=4
    • [interné FCB]=pripravené meno súboru
    • HL=adresa kam sa súbor nahrá
    • DE=maximálna dĺžka súboru
  • Výstup:
    • S=1 - disková chyba
    • CY=1 - súbor je dlhý
    • S=0, CY=0 - OK
  • Mení:
    • všetky registre


5 - SAVE FILE

Služba pre uloženie obsahu pamäti z požadovanej adresy a o požadovanej dĺžke do súboru. Dĺžka sa zarovná na násobok 128. Existujúci súbor daného mena sa najprv zmaže. Meno súboru pripravené v internom FCB musí byť jednoznačné (bez wildcards), inak mazanie súboru, ktoré je súčasťou služby, môže spôsobiť zmazanie skupiny súborov, ktorých mená zodpovedajú danej maske. POZOR: Mení aktuálnu adresu DMA pre BDOS!

  • Vstup:
    • B=5
    • [interné FCB]=pripravené meno súboru
    • HL=adresa
    • DE=dĺžka
  • Výstup:
    • S=1 - disková chyba
    • CY=1 - súbor je dlhý
    • S=0, CY=0 - OK
  • Mení:
    • všetky registre


6 - RUNNER VERSION

Vráti číslo verzie RUNNERa.

  • Vstup:
    • B=6
  • Výstup:
    • A=číslo verzie RUNNERa. Súčasná verzia vráti 23h
  • Mení:
    • A


Nasledujúce služby (7 až 12) umožňujú pracovať so súbormi sekvenčne po bajtoch. Po otvorení súboru sa v registri HL vráti adresa deskriptora, ktorá sa potom používa pri volaní ďalších služieb. Deskriptor má veľkosť 8 bytov a udržiava sa v ňom aktuálny stav otvoreného súboru. S každým deskriptorom je zviazaný jeden FCB a buffer o veľkosti 128 bytov. RUNNER umožňuje mať otvorené súčasne dva súbory naraz. Súbor môže byť otvorený v móde pre čítanie alebo pre zápis. Ak je súbor otvorený pre čítanie, nie je možné doň zapisovať a naopak.

Do deskriptora nie je vhodné počas práce so súborom zasahovať, ale pre úplnosť tu uvedieme význam jednotlivých jeho položiek:

Deskriptor otvoreného súboru
Offset Veľkosť Význam
0 1 RW flag - 0/1/2 = CLOSED/READ/WRITE
1 2 adresa FCB otvoreného súboru
3 1 počítadlo bytov v buffri
4 2 adresa sektorového buffra zviazaného s týmto deskriptorom
6 2 aktuálny ukazateľ do sektorového buffra


7 - OPEN FILE (1. možnosť)

Otvorí súbor pre sekvenčné čítanie alebo sekvenčný zápis po bytoch. Pri otváraní súboru pre zápis sa existujúci súbor daného mena najprv zmaže. Táto služba očakáva jednoznačné meno súboru v tvare ako je to v FCB.

  • Vstup:
    • B=7
    • A=0 alebo 1 - číslo deskriptora
    • C=1-READ alebo 2-WRITE
    • HL=adresa predpripraveného mena súboru ako v FCB - DNNNNNNNNEEE
  • Výstup:
    • CY=1 pri chybe parametrov
    • S=1, ak sa súbor nepodarilo otvoriť
    • S=0, CY=0 - OK, HL=adresa deskriptora
  • Mení:
    • všetky registre


8 - OPEN FILE (2. možnosť)

Otvorí súbor pre sekvenčné čítanie alebo sekvenčný zápis po bytoch. Pri otváraní súboru pre zápis sa existujúci súbor daného mena najprv zmaže. Táto služba očakáva jednoznačné meno súboru v rovnakom tvare ako služba 3.

  • Vstup:
    • B=8
    • A=0 alebo 1 - číslo deskriptora
    • C=1-READ alebo 2-WRITE
    • HL=adresa vstupného textu s menom súboru ukončeného nulou
  • Výstup:
    • CY=1 pri chybe parametrov
    • S=1, ak sa súbor nepodarilo otvoriť
    • S=0, CY=0 - OK, HL=adresa deskriptora
  • Mení:
    • všetky registre


9 - READ BYTE

Prečíta byte zo súboru, ktorý bol otvorený na čítanie. POZOR: Mení aktuálnu adresu DMA pre BDOS!

  • Vstup:
    • B=9
    • HL=adresa deskriptora
  • Výstup:
    • CY=0, Z=1 - OK, A=prečítaný byte
    • CY=1 - chybný typ operácie v deskriptore
    • Z=0 - chyba pri čítaní zo súboru - koniec súboru
    • S=1 - disková chyba
  • Mení:
    • AF


10 - WRITE BYTE

Zapíše byte do súboru, ktorý bol otvorený pre zápis. POZOR: Mení aktuálnu adresu DMA pre BDOS!

  • Vstup:
    • B=10
    • HL=adresa deskriptora
    • A=zapisovaný byte
  • Výstup:
    • CY=0, Z=1 - OK
    • CY=1 - chybný typ operácie v deskriptore
    • Z=0 - chyba pri zápise do súboru - plný disk
    • S=1 - disková chyba
  • Mení:
    • AF


11 - CLOSE FILE

Uzatvorí otvorený súbor. Súbory otvorené pre čítanie nie je podľa špecifikácie CP/M nutné uzatvárať, ale z konvencie sa to odporúča. Pokiaľ bol súbor otvorený pre zápis a v buffri sú nezapísané dáta, prevedie sa najprv zápis posledného sektora a až tak sa súbor uzavrie. Uzatváranie súboru, ktorý bol otvorený pre zápis je teda nutné! POZOR: Mení aktuálnu adresu DMA pre BDOS!

  • Vstup:
    • B=11
    • HL=adresa deskriptora
  • Výstup:
    • CY=0, Z=1 - OK
    • CY=1 - chybný typ operácie v deskriptore
    • Z=0 - chyba pri zápise do súboru
    • S=1 - disková chyba
  • Mení:
    • všetky registre


12 - READ LINE

Zo súboru prečíta jeden textový riadok ukončený znakmi CR a LF a uloží do cieľového buffra. Súbor musí byť otvorený službou 7 alebo 8 pre čítanie. Predpokladá sa, že vstupný súbor je obyčajný textový súbor a za koniec súboru (a prípadne aj posledného riadku) sa považuje znak EOF. Všetky riadiace znaky s kódmi menšími ako 32, s výnimkou CR, LF, TAB a EOF, sa ignorujú. Tabulátor je možné nechať voliteľne nahradzovať jednou medzerou. Za koniec riadku sa považuje iba LF! CR sa potichu preskočí. Cieľový buffer musí mať veľkosť minimálne podľa hodnoty registra C + 1, aby sa mohla zapísať ukončovacia nula. Pokiaľ sa buffer zaplní a nedosiahol sa CR a LF, je v B registri vrátená pôvodná hodnota +1. CR, LF a ani EOF sa do cieľového buffra nezapisujú! Iba ukončovacia nula. POZOR: Mení aktuálnu adresu DMA pre BDOS!

  • Vstup:
    • B=12
    • HL=adresa deskriptora
    • DE=adresa cieľového buffra
    • C=veľkosť cieľového buffra -1
    • CY=1 - tabulátor sa nahradí jednou medzerou
    • CY=0 - tabulátor sa ponechá
  • Výstup:
    • CY=0, Z=1 - OK
      • B=počet znakov zapísaných do buffra
      • DE=ukazuje za posledný zapísaný byte v buffri
    • CY=0, Z=0 - čítanie za fyzickým koncom súboru
    • CY=1 - chybný typ operácie v deskriptore
    • S=1 - disková chyba
  • Mení:
    • DE, BC, AF


13 - RETURN TO CP/M

Prevedie sa návrat do CP/M.

  • Vstup:
    • B=13


14 - GET CATALOGUE

Získanie katalógu súborov podľa zadanej masky. Zoznam nájdených súborov je uložený do buffra, ktorého veľkosť musí byť 1kB. Predpokladá sa, že adresár môže mať max. 64 súborov, ako je to v MIKROSe pre PMD 85. Preto je 64*14=896 bytov od začiatku buffra určených pre zoznam súborov a zostávajúcich 128 bytov slúži ako DMA buffer pre BDOS služby vyhľadávania. Pre každý záznam je teda vyhradených 14 bytov a záznam má tento tvar: UNNNNNNNNEEELL, kde prvých 12 bytov je kópia z FCB (user, name, ext) a LL je dĺžka súboru v kB. Hodnotou v registri C je možno zvoliť, či sa majú zisťovať aj dĺžky súborov. Zistenie dĺžok súborov je časovo náročnejšie. Ak sa dĺžky súborov nezisťujú, LL je rovné 0.

  • Vstup:
    • B=14
    • [interne FCB]=pripravená maska pre hľadanie súborov
    • HL=adresa buffra, kam sa uloží zoznam nájdených súborov
    • C=0 - nezisťujú sa dĺžky súborov
    • C=1 - dĺžky súborov sa budú zisťovať
  • Výstup:
    • Z=1 - ak sa nenašli žiadne súbory
    • Z=0 - súbory sa našli
      • B=počet nájdených súborov
      • HL=adresa buffra so zoznamom nájdených súborov
  • Mení:
    • AF, B, DE

Zoznam verzií RUNNERa

  • 1.2 (2008-2009)
    • Prvá publikovaná verzia.
    • Fungovala iba na PMD 85-3.
    • Súbor INF mohol mať maximálne 1 kB.
    • Podpora služieb 0 až 6.
  • 1.3 (2009)
    • Oprava triedenia súborov a zobrazovania súborov v dvoch stĺpcoch.
    • Oprava zobrazenia obrázku po štvorčekoch.
  • 2.0 (3/2011)
    • Prepracovanie celého programu.
    • Odteraz program funguje aj na PMD 85-2A.
    • Veľkosť súboru INF už nie je obmedzená na 1 kB.
    • Pridané služby 7 až 13. Modifikované služby 0 a 3.
    • Pridaná možnosť "pomenovať" disketu v súbore RUN.INF a potlačiť zoradenie súborov novým príkazom NOSORT.
  • 2.1 (8/2011)
    • Pri návrate do CP/M obnoví pôvodné hodnoty systémových bytov IOBYTE a CDISK.
    • Oprava straty adresy deskriptora pri uzatváraní súboru.
  • 2.2 (9/2011)
    • Pridaná nová služba č. 14 pre získanie katalógu disku.
  • 2.3 (4/2026)
    • Pridaný príkaz LOAD ako alternatívu k príkazu FILE.
    • Pridaný príkaz SCREEN ako alternatívu k príkazu PICTURE.
    • Pridaný príkaz PRINT ako alternatívu k príkazu DISP.
    • Do príkazu PICTURE/SCREEN pridaná podpora pre ďalší typ obrázku: Q - Obrázok spakovaný programom QuidoScr.
    • Pridaný nový príkaz FRAME pre vykreslenie rámčeka.
    • Adresa vstupného bodu pre volanie služieb sa uloží aj na adresu #FFFE.