RUNNER2

Z PMD 85 Infoserver

RUNNER 2



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

Obsah


RUNNER 2.2 je nová verzia programu RUNNER. Nová verzia sa od predošlej verzie 1.2 líši v týchto bodoch:

  • môže byť spustená na PMD 85-3 a aj na PMD 85-2A
  • umožňuje "pomenovať" si disketu - toto meno sa zobrazuje v titulku zoznamu nájdených programov
  • je možné vypnúť triedenie zoznamu programov
  • poskytuje ďalších 8 služieb - 6 z nich slúži pre sekvenčný prístup k súborom po bytoch, čo dáva možnosť jednoduchšej náhrady pôvodného zápisu a čítania z magnetofónu v upravovaných programoch
  • niektoré služby z predošlého RUNNERa sa čiastočne zmenili

Pokiaľ to nebude nutné, v nasledujúcom budú uvedené iba rozdiely oproti predošlej verzii. Takže odporúčame prečítať si aj popis predošlej verzie.

Informačný súbor

Formát informačného súboru sa nijako nezmenil. Jediným rozdielom je to, že jeho dĺžka už nie je limitovaná na 1 kB. Je to preto, že sa k nemu pristupuje sekvenčne pomocou nových služieb.

Š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 nový 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.

NAME name

Príkaz NAME slúži pre "pomenovanie" diskety. Príkaz je v tomto prípade nepovinný. name môže mať maximálne 20 znakov.

NOSORT

Príkaz NOSORT potlačí triedenie zoznamu súborov. Pre RUN.INF je nepovinný, pre klasické INF súbory nemá význam a je ignorovaný.

Služby RUNNERa a rozloženie pamäti

Rozloženie pamäti sa v globále nezmenilo. Rozdiel nastal iba v tom, že sa zmenilo umiestnenie jednotlivých častí RUNNERa. Buffre a služby RUNNERa sú umiestnené na začiatku a interpretér príkazov spolu s kódom pre vytvorenie zoznamu programov je na konci. Po spustení zvoleného programu je celá časť pamäti za službami až po BDOS k dispozícii užívateľovi. Adresu tejto oblasti a jej veľkosť môže užívateľ získať pomocou služby 2.

Mapa pamäti 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 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 interpretér príkazov
Táto oblasť pamäti, 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äti 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. Číslo služby sa predáva v registri B, ostatné parametre podľa potreby v ďalších registroch.

Prvých 7 služieb zodpovedá službám, ktoré poskytoval predošlý RUNNER. Drobné zmeny však nastali v službách 0 a 3. Podrobnosti ďalej.


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é sluzby 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)
    • ostané 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 interneho 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 pripravi 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 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
  • 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 22h
  • 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. 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. 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ženy 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 prvych 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 - nezistujú 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