RUNNER

Z PMD 85 Infoserver

RUNNER



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.