RUNNER
Z PMD 85 Infoserver
D (Blog:Runner premiestnená na RUNNER: je to klasický sofwarový produkt a preto patrí na samostatnú wikistránku do sekcie Sofvér.) |
D (Opravený preklep.) |
||
| 8 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__ | ||
| - | [[ | + | '''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. |
| - | ''' | + | 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. | ||
| + | * {{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 | + | 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 | ||
| - | + | * každý riadok obsahuje jeden príkaz | |
| - | * každý riadok obsahuje jeden | + | |
* príkaz musí byť od parametrov oddelený aspoň jednou medzerou | * príkaz musí byť od parametrov oddelený aspoň jednou medzerou | ||
| - | * poradie príkazov | + | * 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. | ||
| - | {{ | + | {{CodeBig|NAME name}} |
| - | Príkaz | + | 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ý. |
| - | * | + | * {{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]}} | ||
| - | + | {{CodeBig|MONIT t[,X]}} | |
| - | + | ||
| - | + | ||
| + | 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]}} | ||
| - | + | {{CodeBig|PICTURE fn,t[,param]}}<br> | |
| - | + | {{CodeBig|SCREEN fn,t[,param]}} | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| + | 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}} | ||
| - | + | {{CodeBig|FILE fn,hexadr}}<br> | |
| - | + | {{CodeBig|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. | ||
| + | * {{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}} | ||
| - | + | {{CodeBig|CALL hexadr}} | |
| - | + | ||
| + | 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}} | ||
| - | + | {{CodeBig|JUMP hexadr}} | |
| - | + | ||
| + | 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}} | ||
| - | + | {{CodeBig|PAUSE time}} | |
| - | + | ||
| + | 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 ...]}} | ||
| - | + | {{CodeBig|POKE hexadr,hexval[,hexval ...]}} | |
| - | + | ||
| - | + | ||
| + | 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 | ||
| - | {{ | + | |
| + | {{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. | ||
| - | * | + | * {{Kbd|r}} je riadok od 0 do 27 |
| - | * | + | * {{Kbd|c}} je stĺpec od 0 do 47 |
| - | * | + | * {{Kbd|cl}} je farba od 0 do 3 normálne, od 4 do 7 invertovane |
| - | * | + | * {{Kbd|text}} je zobrazovaný text - musí byť v úvodzovkách |
| - | {{ | + | {{CodeBig|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. | |
| + | * {{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. | ||
| - | ''' | + | '''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 | + | * '''ERROR at line NN''' |
| - | kde, ERROR je jedno z nasledujúcich hlásení a | + | 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 | + | * '''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 | + | * '''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 | + | 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 | + | 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 156: | Riadok 202: | ||
------------------------------------------------------ | ------------------------------------------------------ | ||
9C00 | | | 9C00 | | | ||
| - | | RUNNER v | + | | RUNNER v 2.3 | |
| - | | | + | | premenné, buffre a zásobník RUNNERa | |
| - | | | + | | služby RUNNERa | |
| - | | | + | | vytvorenie zoznamu programov, interpret príkazov | |
ADFF | | | ADFF | | | ||
------------------------------------------------------ | ------------------------------------------------------ | ||
| Riadok 171: | Riadok 217: | ||
------------------------------------------------------ | ------------------------------------------------------ | ||
| - | + | === 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 | + | 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. |
| - | + | ||
| - | 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ť. | + | {{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 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: | * Vstup: | ||
** B=0 | ** B=0 | ||
** C=číslo BDOS služby (>=13) | ** C=číslo BDOS služby (>=13) | ||
| - | ** | + | ** 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 | ||
| + | |||
| + | |||
| + | {{CodeBig|1 - FCB ADDRESS}} | ||
| - | + | Služba vráti adresu interného FCB, ktorý je používaný službami 3, 4, 5 a 14. | |
| - | Služba vráti adresu | + | |
* Vstup: | * Vstup: | ||
** B=1 | ** B=1 | ||
* Výstup: | * Výstup: | ||
| - | ** HL=adresa | + | ** HL=adresa interného FCB |
| + | * Mení: | ||
| + | ** HL | ||
| - | + | ||
| - | Služba vráti adresu a veľkosť | + | {{CodeBig|2 - BUFFER ADDRESS AND SIZE}} |
| + | |||
| + | Služba vráti adresu a veľkosť voľnej pamäťovej oblasti za službami RUNNERa. | ||
* Vstup: | * Vstup: | ||
** B=2 | ** B=2 | ||
* Výstup: | * Výstup: | ||
| - | ** HL=adresa | + | ** HL=adresa |
| - | ** BC=veľkosť | + | ** BC=veľkosť |
| + | * Mení: | ||
| + | ** HL, BC | ||
| - | + | ||
| - | Služba spracuje reťazec, ktorý zodpovedá menu súboru v tvare filename.ext (8.3) | + | {{CodeBig|3 - PREPARE FILE NAME}} |
| - | a | + | |
| + | 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 | + | ** 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 | ||
| - | + | ||
| - | 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= | + | ** 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 222: | 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}} | ||
| - | + | 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 | + | |
* Vstup: | * Vstup: | ||
** B=5 | ** B=5 | ||
** [interné FCB]=pripravené meno súboru | ** [interné FCB]=pripravené meno súboru | ||
| - | ** HL= | + | ** HL=adresa |
** DE=dĺžka | ** DE=dĺžka | ||
* Výstup: | * Výstup: | ||
| Riadok 234: | 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 | + | ** A=číslo verzie RUNNERa. Súčasná verzia vráti 23h |
| + | * Mení: | ||
| + | ** A | ||
| - | == Spustenie RUNNERa == | ||
| - | RUNNER | + | 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. |
| - | + | ||
| - | + | ||
| - | + | 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. | ||
| - | + | {{CodeBig|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 | ||
| + | |||
| + | |||
| + | {{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: | + | [[Kategória:Systémové programy]] |
| + | [[Kategória:Softvér]] | ||
Aktuálna verzia
| 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
- CY=0, Z=1 - OK
- 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.