Keďže základom NCB85 je mikroprocesor i8085, okamžite sa ponúka implementovať pre tento "jednodoskáč" operačný systém CP/M 2.2.
K tomu je ale potrebné splniť niekoľko vecí:
- umožniť pristránkovať do celého adresného priestoru RAM
- pripojiť diskový systém
- navrhnúť a vytvoriť CP/M BIOS
1. Stránkovanie RAM/ROM
NCB85 disponuje 64kB RAM a 2kB, 4kB alebo 8kB ROM. Veľkosť ROM sa určuje Jumpermi J3 a J4 na doske NCB85. ROM začína vždy na adrese 0000h
a za normálnych okolností prekrýva RAM. Keďže ale CP/M vyžaduje mať od adresy 0000h
RAM, je potrebné nejako vyriešiť odstránkovanie ROM.
Pôvodne som uvažoval nad zbytočne prešpekulovaným a komplikovaným riešením s GALom, ale nakoniec sa ukázalo, že v jednoduchosti je krása a stačilo použiť jediný drôtik. CPU i8085 má predsa vývod SOD
(Serial Output Data), čo je v podstate jednobitový výstupný port, ovládaný inštrukciou SIM
. NCB85 má SOD
vyvedený na konektor K6 a ten stačí prepojiť so stredným pinom Jumpera J4 (J4 zostane bez prepojky), čo je vstup do adresového dekodéra z hradiel 74LS32N. Na J3 musí byť Jumper v konfigurácii pre 8kB ROM (pozícia bližšie ku kraju DPS). Pri SOD=0
bude ROM pripojená, pri SOD=1
bude v celom adresnom priestore RAM. Po resete CPU i8085 je SOD
vynulované, takže bude zabezpečené, že bude pripojená ROM.
Toto riešenie je jednoduché a kedykoľvek odstrániteľné.
2. Diskový systém
CP/M bez nejakého diskového systému nemôže existovať. Stavať v súčasnej dobe nejaký radič pre floppy disky už zrejme nemá zmysel a tak som mal ako autor PMD 32-SD voľbu jednoznačnú. Jediný problém je, že PMD 32-SD potrebuje obojsmerný paralený kanál, ktorým NCB85 nedisponuje. Obvykle sa PMD 32-SD pripája k počítaču cez PIO i8255 a jeho porty PA a PCH v móde 2 - obojstranný strobovaný prenos. NCB85 má ale na doske RIOT i8155, ktorý umožňuje používať svoje dva 8 bitové porty PA a PB s pomocou signálov portu PC, ako strobovaný vstup alebo strobovaný výstup. Aby som vytvoril obojsmerný kanál, využil som oba porty, jeden pre vstup, druhý pre výstup a jednoduchý interfejs s dvoma trojstavovými budičmi 74LS241. Budiče vlastne "simulujú" obojsmerný kanál, tak ako je to v PIO i8255 v móde 2. Smer budičov určuje PMD 32-SD svojim signálom DIR
. Strobovacie signály z portu PC sú privedené do PMD 32-SD. Signál -OBF
musí byť invertovaný.
Interfejs mám postavený iba na univerzálnej doske s vyvedenými konektormi, ktoré sú zasunuté do pripravených konektorov na DPS NCB85. Z interfejsu je vyvedený konektor pre pripojenie samotnej PMD 32-SD.
3. CP/M BIOS
S návrhom BIOSu úzko súvisí aj rozhodnutie, ako bude vyzerať BOOT systému a aký bude formát disku a uloženie systému na ňom. Od začiatku som nechcel, aby sa moje NCB85 "navždy" stalo iba CP/M strojom a chcel som ponechať možnosť využívať Dunfieldov Monitor, o ktorého úprave som už písal.
Preto som sa rozhodol, že v prvých štyroch kB ROM ponechám Dunfieldov Monitor a za ním bude nasledovať BOOT a BIOS pre CP/M (bude teda potrebná 8kB EPROM, čomu zodpovedá aj nastavenie Jumperov). Aby sa ale pri zapnutí NCB85 spustil BOOT kód, v Monitore je na začiatku skok na inicializáciu Monitora nahradený skokom do BOOT kódu (viď. zdrojový kód BIOSu).
3.1 BOOT
BOOT kód zabezpečuje niekoľko funkcií:
- testuje, či je zapnuté stránkovanie - ak nie je, skočí sa rovno do Monitora (to znamená, že aj keď bude uvedená úprava odpojená, NCB85 bude možné používať s Monitorom bez nutnosti vymieňať ROM)
- zobrazí text
Press Esc for enter to MON85...
, a ak je kláves Esc stlačený do niekoľkých sekúnd, skočí sa do Monitora (aj keď bude interfejs pripojený, je možné Monitor používať) - prekopíruje z ROM kód BIOSu na adresu
0F600h
a skoči na studený štart systému CP/M
3.2 BIOS
BIOS zabezpečuje štart systému a poskytuje základné služby pre prístup na konzolu a k diskovému systému. Ako bolo uvedené, BIOS sa kopíruje na adresu 0F600h
z ROM a teda nesmie byť (vrátane rôznych buffrov a zásobníka) dlhší ako 2560 bytov. Súčasná verzia má dĺžku 2425 bytov.
3.2.1 Štart systému
Pri studenom štarte sa systém hlási textom:
NCB85 64kB CP/M v2.2, BIOS v1.1 Roman Borik/RM-TEAM 02/2013
Pri teplom štarte sa toto hlásenie nezobrazuje.
Prevedie sa test prítomnosti PMD 32-SD. Pokiaľ sa PMD 32-SD nehlási, zobrazí sa chybová správa:
PMD 32-SD not responding or is not connected!
a po stlačení akéhokoľvek klávesu sa prevedie skok do Monitora.
Ak sa PMD 32-SD nájde, zo systémovej oblasti disku A:
sa načíta do pamäte CCP a BDOS. Ak dôjde pri čítaní z disku ku nejakej chybe, vypíše sa hlásenie:
BOOT Error!
a čaká sa na stlačenie akéhokoľvek klávesu a pokus o načítanie systému z disku sa zopakuje.
Pri studenom štarte sa pred skokom do CCP vnúti vykonanie príkazu `CD *`
, ktorý zobrazí práve vložené obrazy diskov v jednotlivých mechanikách A:
až D:
.
Pre úplnosť, BDOS začína na adrese 0E800h
, CCP začína na adrese 0E000h
.
3.2.2 Vstupne body BIOSu
Vstupné body BIOSu sú obvykle volané iba BDOSom. Sú ale situácie, kedy je potrebné BDOS obísť. V nasledujúcej tabuľke je Offset voči vstupnému bodu WBOOT
, ktorého adresa je v skokovej inštrukcii na teplý štart na adrese 0000h
.
Vstupný bod | Adresa | Offset | |
---|---|---|---|
CBOOT | 0F600h | -3 | studený štart systému |
WBOOT | 0F603h | 0 | teplý štart systému |
CONST | 0F606h | +3 | zistenie stavu konzoly |
CONIN | 0F609h | +6 | vstup znaku z konzoly |
CONOUT | 0F60Ch | +9 | výstup znaku na konzolu |
LIST | 0F60Fh | +12 | výstup znaku na logické zariadenie tlače |
PUNCH | 0F612h | +15 | výstup na logické zariadenie znakového výstupu |
READER | 0F615h | +18 | čítanie z logického zariadenia znakového vstupu |
HOME | 0F618h | +21 | nastavenie hlavy vybranej jednotky na stopu 0 |
SELDSK | 0F61Bh | +24 | výber diskovej jednotky |
SETTRK | 0F61Eh | +27 | nastavenie stopy pre vybranú diskovú jednotku |
SETSEC | 0F621h | +30 | nastavenie sektora pre vybranú diskovú jednotku |
SETDMA | 0F624h | +33 | nastavenie adresy DMA |
READ | 0F627h | +36 | prečítanie sektora zo zvolenej diskovej jednotky, stopy a sektora |
WRITE | 0F62Ah | +39 | zápis sektora na zvolenú diskovú jednotku, stopu a sektor |
LISTST | 0F62Dh | +42 | test pripravenosti logického zariadenia tlače |
SECTRN | 0F630h | +45 | preklad logického čísla sektora na fyzické |
Nasledujúce vstupné body sa týkajú ovládača PMD 32-SD (používa ich napr. utilita CD ) | |||
ReadByte | 0F633h | +48 | prečítanie jedného bytu |
SendCommand | 0F636h | +51 | odoslanie povelu |
SendByte | 0F639h | +54 | odoslanie jedného bytu |
SndCrcRdAckErr | 0F63Ch | +57 | odoslanie CRC a prijatie kódov ACK a ERR |
ReadAckErr | 0F63Fh | +60 | prijatie kódov ACK a ERR |
WaitErrT15 | 0F642h | +63 | čakanie na chybový kód 15s |
WaitErrT | 0F645h | +66 | čakanie na chybový kód zvolený čas |
SndCrcRdAck | 0F648h | +69 | odoslanie CRC a prijatie ACK |
ReadCheckCrc | 0F64Bh | +72 | prijatie a kontrola CRC |
3.2.3 Konzolové služby BIOSu
Na komunikáciu s okolím má NCB85 okrem RIOT i8155 aj USART i8251. Ako konzolu používa obvykle nejaký terminálový program na PC. Nasledujúci popis sa bude vzťahovať k terminálom ANSI a VT100, ktoré emuluje Windows Hyper Terminal, ale je možné, že to bude platiť aj pre iné programy, ktoré tieto terminály emulujú.
V rámci BIOSu sa na príjem znaku zo sériovej linky využíva prerušenie RST5.5
(adresa 002Ch
) a prijímané znaky sa ukladajú do klávesnicového buffra (fronty) o dĺžke 96 bytov. Služba BIOSu (vstupný bod) CONST
(test stavu konzoly) iba testuje, či je vo fronte nejaký čakajúci znak. Služba CONIN
(čítanie znaku z konzoly) vyberá znaky z fronty, ale zároveň transformuje viacbytové Escape kódy na jednobytové.
V nasledujúcej tabuľke sú uvedené Escape kódy, klávesy, ktoré ich produkujú a transformované kódy. Rozdiely medzi ANSI a VT100 terminálom sú uvedené v tabuľke. Ďalším rozdielom je to, že ANSI terminál umožňuje zadávať aj národné znaky, čo u VT100 nie je možné.
Kláves | Scancode (hexa) | Kód (hexa) | |
---|---|---|---|
Up | 1B 5B 41 | 0B (Ctrl+K) | ESC [ A |
Down | 1B 5B 42 | 0C (Ctrl+L) | ESC [ B |
Right | 1B 5B 43 | 0E (Ctrl+N) | ESC [ C |
Left | 1B 5B 44 | 0F (Ctrl+O) | ESC [ D |
Home | 1B 5B 48 | 06 (Ctrl+F) | ESC [ H - iba ANSI |
End | 1B 5B 4B | 05 (Ctrl+E) | ESC [ K - iba ANSI |
Num Enter | 1B 5B 4D | 07 (Ctrl+G) | ESC [ M - VT100 application mode |
F1 | 1B 4F 50 | 01 (Ctrl+A) | ESC O P |
F2 | 1B 4F 51 | 02 (Ctrl+B) | ESC O Q |
F3 | 1B 4F 52 | 03 (Ctrl+C) | ESC O R |
F4 | 1B 4F 53 | 04 (Ctrl+D) | ESC O S |
Num + | 1B 5B 6C | 1C (Ctrl+\) | ESC [ l - VT100 application mode |
Num - | 1B 5B 6D | 1D (Ctrl+]) | ESC [ m - VT100 application mode |
Num . | 1B 5B 6E | 1E (Ctrl+^) | ESC [ n - VT100 application mode |
Num 0 | 1B 5B 70 | 10 (Ctrl+P) | ESC [ p - VT100 application mode |
Num 1 | 1B 5B 71 | 11 (Ctrl+Q) | ESC [ q - VT100 application mode |
Num 2 | 1B 5B 72 | 12 (Ctrl+R) | ESC [ r - VT100 application mode |
Num 3 | 1B 5B 73 | 13 (Ctrl+S) | ESC [ s - VT100 application mode |
Num 4 | 1B 5B 74 | 14 (Ctrl+T) | ESC [ t - VT100 application mode |
Num 5 | 1B 5B 75 | 15 (Ctrl+U) | ESC [ u - VT100 application mode |
Num 6 | 1B 5B 76 | 16 (Ctrl+V) | ESC [ v - VT100 application mode |
Num 7 | 1B 5B 77 | 17 (Ctrl+W) | ESC [ w - VT100 application mode |
Num 8 | 1B 5B 78 | 18 (Ctrl+X) | ESC [ x - VT100 application mode |
Num 9 | 1B 5B 79 | 19 (Ctrl+Y) | ESC [ y - VT100 application mode |
Pre úplnosť ešte tabuľka kódov ostatných riadiacich klávesov:
Kláves | Kód (hexa) |
---|---|
Backspace | 08 (Ctrl+H) |
Ctrl+Backspace | 7F |
Tab | 09 (Ctrl+I) |
Ctrl+Enter / Ctrl+Num Enter | 0A (Ctrl+J) |
Enter | 0D (Ctrl+M) |
Esc | 1B (Ctrl+[) |
Služba CONOUT
(výstup znaku na konzolu) posiela znaky na sériovú linku bez zmeny. Výstupné Escape kódy pre terminály VT100 a ANSI sú popísané napr. na tejto stránke. Často používané výstupné Escape kódy sú napr. tieto:
Význam | Escape sekvenica (hex) | |
---|---|---|
Nastavenie pozície kurzora | 1B 5B ascii-row 3B ascii-col 48 | ESC [ {row} ; {col} H |
Zmazanie obrazovky | 1B 5B 32 4A | ESC [ 2 J |
Skrytie kurzora | 1B 5B 3F 32 35 6C | ESC [ ? 2 5 l |
Zobrazenie kurzora | 1B 5B 3F 32 35 68 | ESC [ ? 2 5 h |
Bell | 07 |
3.2.4 Diskové služby BIOSu
Na základe vlastností PMD 32-SD systém podporuje 4 disky A:
až D:
, každý o maximálnej veľkosti 2MB - 256 stôp, 64 sektorov na stopu, 1020 alokačných blokov o veľkosti 2kB, 256 adresárových položiek, 1 systémová stopa. Systémová stopa obsahuje iba BDOS a CCP. BOOT a BIOS sú umiestnené v ROM.
Obrazy diskov majú príponu .ncb. Pre pohodlnú zmenu (obrazov) diskov v jednotlivých mechanikách slúži utilita CD.COM
, ktorá je na systémovom disku a je vhodné si ju, rovnako ako samotný systém, nakopírovať na každý disk. Pre pohodlnú správu obrazov diskov je k dispozícii PC utilita CP/M Image Manager.
Diskové služby pre čítanie a zápis sektora (READ
a WRITE
) sú opatrené kontrolou, či čítanie/zápis prebehli v poriadku. Ak dôjde ku chybe, BIOS sa pokúsi ešte maximálne 4 krát operácie zopakovať. Ak sa nepodarí operáciu vykonať bez chyby, zobrazí sa hlásenie:
Read Error! - D/T/S - [R]etry - [I]gnore - Re[B]ootalebo
Write Error! - D/T/S - [R]etry - [I]gnore - Re[B]oot
kde D je písmeno disku, T je číslo stopy a S je číslo sektora na stope.
Po stlačení R sa operácia znovu (maximálne 5 krát) zopakuje. Stlačením I sa chyba ignoruje a prevedie sa návrat do volajúceho BDOSu, akoby ku chybe nedošlo. Stlačenie B spôsobí teplý štart sytému. Iné klávesy spôsobia návrat do BDOSu s chybou.
Ostatné diskové služby HOME
, SELDSK
, SETSEC
, SETTRK
, SETDMA
a SECTRAN
vykonávajú obvyklú činnosť.
3.2.5 Ostatné služby BIOSu
Vzhľadom na plne využitý RIOT i8155, NCB85 úž nemá možnosť pripojiť tlačiareň. Preto vstupný bod LIST
neposiela znaky nikam a LISTST
vracia stav, akoby bola tlačiareň pripravená (aby sa systém "nezasekol" pri náhodnom stlačení CTRL+P
).
Podobne nie sú využité vstupné body PUNCH
a READER
. Vstupný bod READER
vždy vracia kód EOF (1Ah)
- koniec vstupu.
4. Nastavenie terminálu
Ako bolo spomenuté vyššie, ako terminál používam Windows Hyper Terminál. Nasledujúce obrázky ukazujú, ako ho nastaviť.
5. Download
- NCB85 CP/M BIOS - zdrojový kód a výsledný HEX súbor, ktorý treba napáliť do 8kB EPROM
- Obrazy NCB diskov
Bomba, super, diky moc. Uz se tesim, az to vyzkousim.
OdpovedaťOdstrániťV článku spomínam CP/M Image Manager pre správu obrazov diskov. Bol som ale upozornený na to, že v konfiguračnom súbore "cim.ini" chýba definícia pre obraz NCB. V ZIPe v downloadoch som konfiguračný súbor opravil, ale pokiaľ už to máte stiahnuté, tak stačí, ak si do súboru "cim.ini" pridáte nasledujúcu definíciu:
OdpovedaťOdstrániť; disk o velkosti 2MB, 256 stop, 64 sektorov na stopu,
; 1020 alokacnych blokov o velkosti 2kB, 256 poloziek adresara, 1 systemova stopa
[NCB]
SPT=64
XLT=0
BLS=2
EXM=0
DSM=1019
DRM=255
OFF=1
Otestováno a šlape perfektně. Díky moc!
OdpovedaťOdstrániťSuper! Som rád. :-)
OdstrániťĎalšie CP/M na NCB85 funguje :-) Díky obom !
OdpovedaťOdstrániť