Blog:MIKROS na PMD 85
Z PMD 85 Infoserver
24. decembra 2020 - Bol mierne upravený BIOS: Bol pridaný riadiaci kód BELL pre CONOUT, implementovaná služba LISTST a pridaná definičná tabuľka PMD 32-SD pre programy, ktoré potrebujú priame volania ovládacích rutín ovládača PMD 32-SD. |
Obsah |
MIKROS 2.2 je čistokrvné CP/M 2.2, ktoré bolo "prekrstené" vo Výskumnom ústave výpočtovej techniky v Žiline (VÚVT Žilina). Pôvodná signatúra "COPYRIGHT (C) 1979, DIGITAL RESEARCH", umiestnená v editačnom buffri CCP, je nahradená textom "MIKROS V2.2, VUVT ZILINA, 12/1981". V prípade implementácie pre PMD 85 je naviac, z dôvodu zobrazenia iba 48 znakov na riadok, upravený príkaz DIR v CCP tak, že výpis súborov je iba v dvoch stĺpcoch, namiesto pôvodných štyroch.
Implementácia systému MIKROS pre PMD 85 bola podnietená vývojom posledného modelu PMD 85-3, ktorého koncepcia bola tomu prispôsobená. Má 64kB RAM a možnosť odpojenia ROM so základným Monitorom, ktorý bol presunutý na koniec pamäti od adresy 0E000h a prekrýva sa s VRAM. Základný Monitor je kompatibilný s predchádzajúcimi modelmi 2 a 2A, ale čo je v tomto prípade podstatné, obsahuje naviac (okrem iného aj) základ konzolových rutín BIOSu pre MIKROS a ovládač disketovej jednotky PMD 32, ktorú vyrábalo pre tento účel JZD Pokrok Otice.
Neskôr údajne existovala úprava a implementácia systému MIKROS aj pre PMD 85-2A, ktoré má tiež 64kB RAM, ale osobne som sa s touto implementáciou nestretol (viď. ale ďalej).
Okrem systému MIKROS existoval pre PMD 85 aj DOS PMD 32, čo je alternatívny systém vychádzajúci zo samotného MIKROSu, umožňujúci čítanie a zápis programov v BASICu.
Modifikácie systému
Pri stavbe PMD 32-SD sa okamžite rozhodlo, že sa musí využiť skutočnosť, že pôvodný ovládač PMD 32 v Monitore PMD 85-3 má rezervu a je možné zabezpečiť ovládanie až štyroch mechaník, namiesto pôvodných dvoch. Z pohľadu základného ovládača teda žiadna zmena potrebná nebola, ale pochopiteľne bolo potrebné modifikovať BIOS MIKROSu a doplniť potrebné tabuľky a kód.
Našťastie, pôvodná systémová disketa, dodávaná k disketovej jednotke PMD 32, obsahovala kompletné nástroje a zdroje pre vygenerovanie systému a tak vygenerovanie nového systému s modifikovaným BIOSom nečinil žiadny problém. Tak vznikla prvá verzia systému MIKROS pre PMD 85 pre 4 mechaniky.
Nedalo mi to však a rozhodol som sa, že zrealizujem svoju dávnu myšlienku, rozchodiť MIKROS aj na starších modeloch PMD 85. To si vyžadovalo vyriešiť niekoľko drobností:
- niekam umistniť kód konzolových operácií pre BIOS a ovládač PMD 32, ktorý je v prípade PMD 85-3 priamo v ROM Monitore
- upraviť kód BOOTu a BIOSu, aby sa využívali správne vstupné body pre volanie rutín konzolových operácií a ovládača PMD 32
- upraviť dávkový súbor GENER.SUB pre generovanie systému a vygenerovať nanovo 48kB MIKROS pre PMD 85-3 a PMD 85-2A a 32kB MIKROS pre PMD 85-2
Ovládač
V prvom prípade je najideálnejším miestom nevyužitá oblasť "vedľa" Videoram, ktorá je z časti využívaná Monitorom, prípadne aj BASICom, ako zápisníková oblasť (systémové premenné). Pre ovládač je však stále k dispozícii viac než 3,7 kB. Nepríjemnou vecou je iba skutočnosť, že táto oblasť je rozkúskovaná na 16 bytové bloky a tomu je treba prispôsobiť implementáciu samotného ovládača. Výhodou ale je, že dolná pamäť je voľná pre MIKROS a aplikácie.
Keďže som si to nechcel veľmi komplikovať, ovládač je napísaný podľa pôvodného kódu z PMD 85-3 s tým, že sú niektoré jeho časti optimalizované a opravené. Pochopiteľne sú príslušne zmenené adresy volania rutín Monitora. To má ale za následok, že toto riešenie je použiteľné iba pre PMD 85-2 a PMD 85-2A. PMD 85-1 má iný Monitor a nebolo by úplne priamočiare upraviť existujúce riešenie aj pre tento model. Celý ovládač zaberá 82 16-bytových blokov vedľa VRAM, teda 1312 bytov (0C470h až 0D8BFh).
Ovládač sa do pamäti dostane z ROM Modulu. Najprv som uvažoval, že sa ovládač zavedie do pamäti "klasicky" z BASICu príkazom ROM x
, ale nakoniec som sa rozhodol, že je to zbytočne "naokolo" a opatrím ovládač "boot" kódom, ktorý ovládač natiahne do pamäti ihneď po resete. Celý "Booter" vrátene ovládača má 1444 bytov a tak zaberie v ROM Module prvé dve pozície (dve 1kB EPROM). BASIC sa musí posunúť o dve pozície ďalej. V prípade 32k ROM Modulu je Booter v 2kB EPROM a BASIC sa posunie o 1 pozíciu.
Booter po zapnutí počítača alebo po resete zobrazí text B-BASIC M-MONIT P-PMD 32 a je možné zvoliť ďalšiu činnosť.
Pre úplnosť tu ešte uvediem adresy vstupných bodov dôležitých rutín v ovládači. Za normálnych okolností je väčšina uvedených rutín volaných z BIOSu a nie je účelné používať tieto rutiny priamo v aplikáciách. Výnimku tvoria programy, ktoré potrebujú pristupovať napr. k PMD 32 na najnižšej úrovni (napr. FORMAT.COM, či CD.COM).
Adresy vstupných bodov | |||
Názov | PMD 85-3 | PMD 85-2(A) | Popis |
---|---|---|---|
QBOOT | 0F91Fh | 0C470h | test pripojenia PMD 32, načítanie BOOT sektora z mechaniky A: na adresu 80h a skok na adresu 80h |
SELDSK | 0FF4Ch | 0C473h | výber aktívnej mechaniky |
CONIN | 0FF4Fh | 0C476h | vstup z konzoly |
CONOUT | 0FF52h | 0C479h | výstup na konzolu |
CONST | 0FF55h | 0C47Ch | zistenie stavu konzoly |
QREAD | 0FF58h | 0C4B0h | prečítanie sektora z disku |
QWRITE | 0FF5Bh | 0C4B3h | zápis sektora na disk |
SETSEC | 0FF5Eh | 0C4B6h | nastavenie čísla sektora pre QREAD a QWRITE |
SETTRK | 0FF61h | 0C4B9h | nastavenie čísla stopy pre QREAD a QWRITE |
SETDMA | 0FF64h | 0C4BCh | nastavenie adresy v pamäti pre QREAD a QWRITE |
LIST | 0FF67h | 0C4F0h | výstup znaku na tlačiareň |
LISTST | 0FF6Ah | 0C4F3h | test pripravenosti tlačiarne pre výstup znaku |
QLOAD | 0FF6Dh | 0C4F6h | čítanie skupiny sektorov zo systémovej oblasti disku |
ReadByte | 0F943h | 0C4F9h | prijatie bytu z PMD 32 |
SendCommand | 0F94Eh | 0C4FCh | odoslanie povelu do PMD 32 |
SendByte | 0F958h | 0C530h | odoslanie bytu do PMD 32 |
SndCrcRdAckErr | 0F9FDh | 0C533h | odoslanie CRC bytu do PMD 32 a prijatie ACK bytu a chybového kódu |
ReadAckErr | 0FA02h | 0C536h | prijatie ACK bytu a chybového kódu z PMD 32 |
WaitErrT15 | 0FA0Dh | 0C539h | čakanie na výsledok povelu - timeout 15 sekúnd |
WaitErrT | 0FA10h | 0C53Ch | čakanie na výsledok povelu - timeout voliteľný |
SndCrcRdAck | 0FA1Eh | 0C570h | odoslanie CRC bytu a prijatie ACK |
ReadCheckCrc | 0FA33h | 0C573h | prijatie CRC bytu a jeho kontrola |
Adresy premenných | |||
Drive | 0BFF8h | 0C47Fh | číslo aktuálnej mechaniky |
Sector | 0BFFCh | 0C4BFh | číslo sektora + číslo aktuálnej mechaniky |
Track | 0BFFEh | 0C4FFh | číslo stopy |
Dma | 0BFF6h | 0C5BEh | adresa v pamäti pre QREAD a QWRITE |
BOOT a BIOS
Aby pre PMD 85 MIKROS zbytočne neexistovalo niekoľko verzií BOOTu a BIOSu, prepísal, opravil a optimalizoval som existujúce zdrojáky tak, že sa automaticky podľa modelu počítača premodifikujú. To zároveň umožňuje vygenerovať systém MIKROS naraz pre všetky modely (PMD 85-2,2A,3) počítača. Nové zdrojové súbory sú pomenované BOOT4UNI.MAC a BIOS4UNI.MAC.
Vzhľadom na to, že pre kód a dáta BIOSu je pomerne málo miesta (asi 640 bytov), tak nie je vôbec implementovaný IOBYTE a ani služby READER a PUNCH. Služba READER vracia vždy EOF (1Ah). Služby LIST a LISTST implementované sú.
Vstup z konzoly (služby CONST a CONIN) na PMD 85, z pohľadu kontrolných klávesov, nie je vyriešený najšťastnejšie. Klávesnica PMD 85 neobsahuje obvyklý kláves CTRL a tak konzola vracia kódy kontrolných klávesov stlačením bežných kľúčových klávesov K0 až K11, prípadne riadiacich klávesov.
Síce bola úvaha zmeniť to na použitie klávesu STOP ako CTRL, ale keďže ten sa v PMD 85-3 používa na zadávanie znakov s diakritikou, čo je už pevne dané rutinami v ROM, bolo toto nešťastné riašenie ponechané.
Nasledujúca tabuľka ukazuje jednotlivé kombinácie pre dosiahnutie príslušných kontrolných kódov:
Rozloženie kontrolných kláves MIKROSu na klávesnici PMD 85 | |||
MIKROS | kód HEXA | PMD 85 | |
---|---|---|---|
CTRL-A | 01h | Shift + CLR | K0 |
CTRL-B | 02h | K1 | |
CTRL-C | 03h | END | K2 |
CTRL-D | 04h | K3 | |
CTRL-E | 05h | K4 | |
CTRL-F | 06h | Shift + C-D | K5 |
CTRL-G | 07h | Shift + WRK | K6 |
CTRL-H | 08h | <--- | K7 |
CTRL-I | 09h | Shift + --->| | K8 |
CTRL-J | 0Ah | Shift + |<--- | K9 |
CTRL-K | 0Bh | WRK | K10 |
CTRL-L | 0Ch | šikmá <--- | K11 |
CTRL-M | 0Dh | EOL | Shift + K0 |
CTRL-N | 0Eh | Shift + RCL | Shift + K1 |
CTRL-O | 0Fh | PTL | Shift + K2 |
CTRL-P | 10h | Shift + END | Shift + K3 |
CTRL-Q | 11h | Shift + ---> | Shift + K4 |
CTRL-R | 12h | Shift + DEL | Shift + K5 |
CTRL-S | 13h | Shift + <--- | Shift + K6 |
CTRL-T | 14h | Shift + K7 | |
CTRL-U | 15h | Shift + K8 | |
CTRL-V | 16h | Shift + K9 | |
CTRL-W | 17h | RCL | Shift + K10 |
CTRL-X | 18h | ---> | Shift + K11 |
CTRL-Y | 19h | --->| | |
CTRL-Z | 1Ah | |<--- | |
CTRL-[ | 1Bh | CLR | |
CTRL-\ | 1Ch | INS | |
CTRL-] | 1Dh | ||
CTRL-^ | 1Eh | C-D | |
CTRL-_ | 1Fh | Shift + šikmá <--- | |
DEL | 7Fh | DEL |
Výstup na konzolu (služba CONOUT) je umiestnený v ovládači a pozná riadiace kódy uvedené v nasledujúcej tabuľke. Výnimkou je iba kód BELL (07h) - pípnutie, ktorý už v pôvodnom ovládači z PMD 85-3 chýba a tak je obslúžený na úrovni BIOSu.
Riadiace kódy pre výstup na konzolu | ||
Názov | kód HEXA | Popis |
---|---|---|
ATTR0 | 01h | zobrazovanie farbou 0 |
ATTR1 | 02h | zobrazovanie farbou 1 |
ATTR2 | 03h | zobrazovanie farbou 2 |
ATTR3 | 04h | zobrazovanie farbou 3 |
BELL | 07h | pípnutie |
LEFT | 08h | posun kurzora doľava |
HTAB | 09h | horizontálny tabulátor - posun kurzora o 8 znakov doprava |
DOWN | 0Ah | kurzor dole (LF) |
CR | 0Dh | kurzor na začiatok riadku |
RIGHT | 0Eh | posun kurzora doprava |
UP | 0Fh | kurzor hore |
NORM | 1Ah | normálne zobrazovanie (neinverzne) |
ESC | 1Bh | nastavenie pozície kurzora, za tým - riadok + 32, stĺpec + 32 |
CLRL | 1Ch | zrušenie aktuálneho riadku (nasledujúce sa odrolujú hore) |
INV | 1Dh | inverzné zobrazovanie (pozor, funguje, ako prepínač) |
HOME | 1Eh | kurzor do ľavého horného rohu obrazovky |
CLS | 1Fh | zmazanie celej obrazovky + HOME |
Definičná tabuľka PMD 32-SD
Za skokovými vektormi na služby BIOSu je umiestnená definičná tabuľka pre PMD 32-SD pre priame volanie rutín ovládača PMD 32. Program, ktorý potrebuje priamo komunikovať s PMD 32-SD (napr. utilita CD), vyhľadá za skokovými vektormi túto tabuľku a tak získa informácie o podporovaných diskoch a adresách rutín.
DB "32" ; značka pre vyhľadanie tabuľky DB 4*16+0 ; 4 disky od A: DB 91 ; CRC = 256 - ("3" + "2" + (4 * 16 + 0)) DB "P32" ; predvolená prípona súboru DW 0 ; bez stránkovacej rutiny DW ReadByte ; 9 vektorov "služieb" ovládača PMD 32-SD DW SendCommand DW SendByte DW SndCrcRdAckErr DW ReadAckErr DW WaitErrT15 DW WaitErrT DW SndCrcRdAck DW ReadCheckCrc
Generovanie systému
Pre generovanie systému obsahovala pôvodná systémová disketa dodávaná k PMD 32 kompletné nástroje a zdroje pre skompilovanie a vygenerovanie systému MIKROS. V prvom rade:
- zdrojové súbory BOOT0.MAC, BOOT1.MAC, BIOS.MAC
- predkompilovaný systém MIKROS MIKSYS0.HEX od adresy 0000h a MIKSYS1.HEX od adresy 0100h
- základ relokátora systému MIKMOV.COM
- dávkový súbor GENER.SUB
plus tieto nástroje:
- SUBMIT.COM a XSUB.COM pre spracovanie dávky
- M80.COM a L80.COM pre kompiláciu a zlinkovanie BOOTu a BIOSu
- SLAP.COM debugger použitý pre spájanie potrebných častí dohromady v pamäti
- GENHEX.COM pre vytvorenie HEX súboru z COM
- PIP.COM kopírovací program použitý na spojenie HEX súborov
- GENMOD.COM pre vytvorenie relokovateľneho systému
- SYSGEN.COM pre kopírovanie a ukladanie systému
V našom prípade sú pôvodné zdrojové súbory MAC nahradené novými a dávkový súbor je upravený tak, že nie sú potrebné zdvojené zdrojové súbory pre kompiláciu BOOT kódu, plus ďalšie s tým súvisiace drobnosti.
Generovanie systému sa zaháji z disku A: príkazom
A>SUBMIT GENER
Po troch minútach je výsledkom súbor MOVOS.COM, ktorým sa následne pripraví systém pre danú pamäťovú konfiguráciu:
48kB systém A>MOVOS 48 * A>SYSGEN
32kB systém A>MOVOS 32 * A>SYSGEN
Odlišnosti sytému MIKROS na jednotlivých modeloch
Napriek tomu, že som "zuniverzálnil" BOOT a BIOS a systém bol vygenerovaný spoločne pre všetky tri (do úvahy prichádzajúce) modely, existujú nasledujúce odlišnosti:
- PMD 85-2 a PMD 85-2A neumožňujú, na rozdiel od PMD 85-3, zobrazovať znaky s diakritikou a nemajú ani možnosť z klávesnice zapnúť, či vypnúť CapsLock
- na PMD 85-2 je systém iba vo verzii 32kB, na rozdiel od PMD 85-2A a PMD 85-3, kde je systém vo verzii 48kB
- PMD 85-2 a PMD 85-2A vyžadujú mať v ROM module v prvých dvoch pozíciách booter, ktorý zavedie ovládač do VRAM a zabezpečí zavedenie systému z disku
Umistnenie jednotlivých vrstiev MIKROSu v pamäti | ||
Vrstva | PMD 85-2A a PMD 85-3 - 48kB MIKROS | PMD 85-2 - 32kB MIKROS |
---|---|---|
CCP | 0A600h | 6600h |
BDOS | 0AE00h | 6E00h |
BIOS | 0BC00h | 7C00h |
Čo je potrebné dokončiť
Vzhľadom na známe odlišnosti je potrebné niektoré programy, ktoré boli pôvodne písané iba pre PMD 85-3 drobne upraviť:
- program FORMAT.COM
- upraviť volania rutín ovládača podľa modelu počítača, podobne ako to robí BIOS
- doplniť možnosť formátovať diskety vo všetkých štyroch mechanikách A: až D:
- utilita CD.COM
- upraviť volania rutín ovládača aj pre PMD 85-2 a PMD 85-2A - úprava už bola urobená, viď. CD
- program RUNNER.COM
- upraviť pre PMD 85-2A - úprava už bola urobená, viď. RUNNER2
- tento program nemôže bežať na PMD 85-2, z dôvodu neexistencie RAM v oblasti 8000h až 0BFFFh!
Naviac by bolo vhodné ešte vytvoriť úpravu BASICu, možno podľa vzoru Zbrojováčka, ktorá bude umožňovať inteligentným spôsobom zapisovať a čítať programy v BASICu na disketu.
Na stiahnutie
- Booter PMD 32 - zdrojový text Bootera PMD 32 a hotové binárky pre napálenie do EPROM resp. pre použitie v emulátore
- Sysgen - obraz disku sysgen.p32 s kompletnými zdrojmi pre vygenerovanie systému; zdrojové súbory boot4uni.mac a bios4uni.mac nového BOOTu a BIOSu
- MIKROS - obrazy systémových diskov s novo vygenerovaným systémom a
- mikros48.p32 - MIKROS 48kB pre PMD 85-3 a PMD 85-2A; mikros48.bin - extrahovaný systém
- mikros32.p32 - MIKROS 32kB pre PMD 85-2; mikros32.bin - extrahovaný systém
- Ďalšie obrazy diskov sú na stránke downloadov