24. februára 2013

CP/M pre NCB85

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é.

Konektor s SOD Jumpery

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.

Schéma interfejsu
Obrázok interfejsu 1  Obrázok interfejsu 2
NCB85 s 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.

CP/M na NCB85

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ý bodAdresaOffset 
CBOOT0F600h-3studený štart systému
WBOOT0F603h0teplý štart systému
CONST0F606h+3zistenie stavu konzoly
CONIN0F609h+6vstup znaku z konzoly
CONOUT0F60Ch+9výstup znaku na konzolu
LIST0F60Fh+12výstup znaku na logické zariadenie tlače
PUNCH0F612h+15výstup na logické zariadenie znakového výstupu
READER0F615h+18čítanie z logického zariadenia znakového vstupu
HOME0F618h+21nastavenie hlavy vybranej jednotky na stopu 0
SELDSK0F61Bh+24výber diskovej jednotky
SETTRK0F61Eh+27nastavenie stopy pre vybranú diskovú jednotku
SETSEC0F621h+30nastavenie sektora pre vybranú diskovú jednotku
SETDMA0F624h+33nastavenie adresy DMA
READ0F627h+36prečítanie sektora zo zvolenej diskovej jednotky, stopy a sektora
WRITE0F62Ah+39zápis sektora na zvolenú diskovú jednotku, stopu a sektor
LISTST0F62Dh+42test pripravenosti logického zariadenia tlače
SECTRN0F630h+45preklad 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)
ReadByte0F633h+48prečítanie jedného bytu
SendCommand0F636h+51odoslanie povelu
SendByte0F639h+54odoslanie jedného bytu
SndCrcRdAckErr0F63Ch+57odoslanie CRC a prijatie kódov ACK a ERR
ReadAckErr0F63Fh+60prijatie kódov ACK a ERR
WaitErrT150F642h+63čakanie na chybový kód 15s
WaitErrT0F645h+66čakanie na chybový kód zvolený čas
SndCrcRdAck0F648h+69odoslanie CRC a prijatie ACK
ReadCheckCrc0F64Bh+72prijatie 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ávesScancode (hexa)Kód (hexa) 
Up1B 5B 410B (Ctrl+K)ESC [ A
Down1B 5B 420C (Ctrl+L)ESC [ B
Right1B 5B 430E (Ctrl+N)ESC [ C
Left1B 5B 440F (Ctrl+O)ESC [ D
Home1B 5B 4806 (Ctrl+F)ESC [ H - iba ANSI
End1B 5B 4B05 (Ctrl+E)ESC [ K - iba ANSI
Num Enter1B 5B 4D07 (Ctrl+G)ESC [ M - VT100 application mode
F11B 4F 5001 (Ctrl+A)ESC O P
F21B 4F 5102 (Ctrl+B)ESC O Q
F31B 4F 5203 (Ctrl+C)ESC O R
F41B 4F 5304 (Ctrl+D)ESC O S
Num +1B 5B 6C1C (Ctrl+\)ESC [ l - VT100 application mode
Num -1B 5B 6D1D (Ctrl+])ESC [ m - VT100 application mode
Num .1B 5B 6E1E (Ctrl+^)ESC [ n - VT100 application mode
Num 01B 5B 7010 (Ctrl+P)ESC [ p - VT100 application mode
Num 11B 5B 7111 (Ctrl+Q)ESC [ q - VT100 application mode
Num 21B 5B 7212 (Ctrl+R)ESC [ r - VT100 application mode
Num 31B 5B 7313 (Ctrl+S)ESC [ s - VT100 application mode
Num 41B 5B 7414 (Ctrl+T)ESC [ t - VT100 application mode
Num 51B 5B 7515 (Ctrl+U)ESC [ u - VT100 application mode
Num 61B 5B 7616 (Ctrl+V)ESC [ v - VT100 application mode
Num 71B 5B 7717 (Ctrl+W)ESC [ w - VT100 application mode
Num 81B 5B 7818 (Ctrl+X)ESC [ x - VT100 application mode
Num 91B 5B 7919 (Ctrl+Y)ESC [ y - VT100 application mode

Pre úplnosť ešte tabuľka kódov ostatných riadiacich klávesov:

KlávesKód (hexa)
Backspace08 (Ctrl+H)
Ctrl+Backspace7F
Tab09 (Ctrl+I)
Ctrl+Enter / Ctrl+Num Enter0A (Ctrl+J)
Enter0D (Ctrl+M)
Esc1B (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ýznamEscape sekvenica (hex) 
Nastavenie pozície kurzora1B 5B ascii-row 3B ascii-col 48ESC [ {row} ; {col} H
Zmazanie obrazovky1B 5B 32 4AESC [ 2 J
Skrytie kurzora1B 5B 3F 32 35 6CESC [ ? 2 5 l
Zobrazenie kurzora1B 5B 3F 32 35 68ESC [ ? 2 5 h
Bell07 


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]oot
alebo
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ť.


Nastavenie COM portu
Nastavenie terminálu
Nastavenie ASCII

5. Download

5 komentárov:

  1. Bomba, super, diky moc. Uz se tesim, az to vyzkousim.

    OdpovedaťOdstrániť
  2. 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:

    ; 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

    OdpovedaťOdstrániť
  3. Otestováno a šlape perfektně. Díky moc!

    OdpovedaťOdstrániť
  4. Ďalšie CP/M na NCB85 funguje :-) Díky obom !

    OdpovedaťOdstrániť