RUNNER
Z PMD 85 Infoserver
V súčasnosti už existuje nový RUNNER 2, ktorý má oproti tejto verzii niekoľko vylepšení. |
RUNNER | |
Autor: | Roman Bórik |
---|---|
Vývojár: | RM-TEAM |
Verzia: | RUNNER, v1.2 (2009) (PMD 85-3 + PMD 32) |
Operačný systém: | CP/M |
Lokalizácia: | angličtina |
Download: | RUNNER.P32 - obraz disku s programom a zdrojovým kódom GAMES.P32 - obraz disku s prevedenými hrami, ktoré sa spúšťajú prostredníctvom RUNNERa (Postupne, podľa časových možností, prevedieme aj ďalšie hry i systémové programy. U systémových programov sa pokúsime doplniť aj diskové operácie, aby s nimi bola práca pohodlná.) |
Obsah |
RUNNER je program pre 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, 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ť.
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ť.
Formát súboru INF a základné požiadavky
- je to obyčajný textový súbor
- môže mať maximalne 1kB, zbytok súboru nad 1kB sa ignoruje
- každý riadok obsahuje jeden prikaz
- príkaz musí byť od parametrov oddelený aspoň jednou medzerou
- poradie príkazov (okrem JUMP) je ľubovoľné
- príkazy sú spracovávané sekvenčne po jednotlivých riadkoch
- riadky začínajúce znakom ';' sú ignorované
Príkazy RUNNERa
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ávani príkazov je ignorovaný.
- name môže mať maximálne 20 znakov
MONIT t[,X]
Príkaz MONIT 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 JUMP. Ak to nie je potlačené parametrom X, 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.
- 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[,speed]
Príkaz 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 uloží obrázok do VideoRAM, ale vynechá systémovú oblasť
- W - celá VideoRAM 16kB - RUNNER uloží obrázok do VideoRAM, vrátane systémovej oblasti (nedoporučované)
- D - čisté video data bez systémovej oblasti (12kB)
- C - komprimovaný obrázok programom GRED
- S - obrázok po štvorčekoch z programu GRED
- speed je hodnota určujúca rýchlosť zobrazovania obrázku po štvorčekoch, ak je obrazok typu S - hodnota 0 (pomaly) až 3 (rýchlo)
FILE fn,hexadr
Príkaz nahraje do pamäti uvedený súbor.
- fn je meno súboru, ktorý sa má nahrať do pamäti
- hexadr je hexadecimálna adresa, kam sa súbor nahraje
CALL hexadr
Zavolanie podprogramu.
- hexadr je hexadecimálna adresa podprogramu - podprogram 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 zavedený zvolený monitor a prevedená inicializácia systmových premenných (pokiaľ bol uvedený príkaz MONITOR a nebola inicializácia potlačená). Po skoku do programu na uvedenú adresu obsahuje register DE adresu 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ávesy.
- 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ávesy.
POKE hexadr,hexval[,hexval ...]
Príkaz pre modifikáciu obsahu pamäti.
- hexadr je hexadecimálna adresa, od ktorej sa začne zapisovať
- hexval sú hexadecimálne 8 bitové hodnoty, ukladané postupne od zadanej adresy
DISP 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 normalne, od 4 do 7 invertovane
- text je zobrazovaný text - musí byť v úvodzovkách
CLS
Zmazanie obrazovky.
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 XXX
kde, ERROR je jedno z nasledujúcich hlásení a XXX 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äti, 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
- 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
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 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ť.
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 disketovkou je nefunkčná. Preto je nutné "opatchovať" 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 patchuje tak, aby sa joystick čítal na porte PB (namiesto PA) a disketovka (aj keď nie je pre hru potrebná) zostala na porte PA.
Mapa pamäti
------------------------------------------------------ 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 1.2 | | premenné a zásobník RUNNERa | | buffer pre INF súbor | | buffer zálohovanej oblasti SPA CP/M | ADFF | | ------------------------------------------------------ AE00 | | | CP/M - BDOS a BIOS | BFFF | | ------------------------------------------------------ C000 | | | | Video RAM | zápisník | FFFF | | | ------------------------------------------------------
Po spustení konkrétneho programu už RUNNER buffer pre INF súbor a buffer zálohovanej 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.
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. Čí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 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.
- Vstup:
- B=0
- C=číslo BDOS služby (>=13)
- ostané parametre podľa danej BDOS služby
- Výstup:
- podľa danej BDOS služby
1 - FCB ADDRESS
Služba vráti adresu internej FCB, ktorá je používaná ďalšími službami.
- Vstup:
- B=1
- Výstup:
- HL=adresa interneho FCB
2 - BUFFER ADDRESS AND SIZE
Služba vráti adresu a veľkosť interného buffra.
- Vstup:
- B=2
- Výstup:
- HL=adresa interneho buffra
- BC=veľkosť interného buffra
3 - PREPARE FILE NAME
Služba spracuje reťazec, ktorý zodpovedá menu súboru v tvare filename.ext (8.3) a pripravi do internej FCB.
- Vstup:
- B=3
- HL=adresa vstupného textu s menom súboru ukončeného CR (0Dh)
- Výstup:
- CY=1 pri chybe
- CY=0, ak je meno súboru v poriadku, vyplnené interné FCB
4 - LOAD FILE
Služba pre načítanie súboru na požadovanú adresu a o maximálne povolenej dĺžke.
- Vstup:
- B=4
- [interné FCB]=pripravené meno súboru
- HL=DMA adresa kam sa súbor nahraje
- DE=maximálna dĺžka súboru
- Výstup:
- S=1 - disková chyba
- CY=1 - súbor je dlhý
- S=0, CY=0 - OK
5 - SAVE FILE
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:
- B=5
- [interné FCB]=pripravené meno súboru
- HL=DMA adresa
- DE=dĺžka
- Výstup:
- S=1 - disková chyba
- CY=1 - súbor je dlhý
- S=0, CY=0 - OK
6 - RUNNER VERSION
Vráti číslo verzie RUNNERa.
- Vstup:
- B=6
- Výstup:
- A=číslo verzie RUNNERa. Súčasná verzia vráti 12h
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ý 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í.
Druhý prípad slúži pre priame spustenie konkrétneho programu.