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 J3J4 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: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 ANSIVT100, 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 VT100ANSI 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: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ť