Sunday, November 2, 2014

NCB85 11. CP/M bootstrapping

Po zapnutí napájania je obsah RAM nedefinovaný a procesor začne vykonávať inštrukcie od adresy 0000. Na konci vidíme prompt A> a CP/M čaká na príkazy. Pokúsim sa popísať ako sa od zapnutia dostaneme až k vytúženému cieľu.

Tradičné systémy fungovali tak, že v ROM bol len kratučký program, ktorý nahral z diskety obsah jedného alebo viac sektorov do RAM a ten spustil. Dokonca sa vyrábali radiče diskiet, ktoré nepotrebovali ani tú ROM. Po resete sami nahrali obsah prvého sektora na pevne danú adresu. Do jedného sektoru sa toho moc nevošlo, tak tam bol zase len kód ktorý nahral tých sektorov viac. Cieľom je aby boli v pamäti tieto časti. Vypísané od FFFF smerom nadol:

         _________________________  _
        |                         |  \
        |           BIOS          |  |
        |_________________________|  |
        |                         |  |
        |           BDOS          |  | cca 8kB
        |_________________________|  |
        |                         |  |
        |           CCP           |  |
        |_________________________| _/
        |                         |
        |           TPA           |
        |_________________________|

        |                         | <- 0100H
        |      System params      |
        |_________________________|
 


Typický BIOS mal okolo 1-4kB, BDOS má 3,5kB a CCP má 2kB. DRI dal k dispozícii vzorový BIOS vo forme zdrojových kódov. Každý si musí napasovať svoj BIOS podľa toho na akom hardware bude bežať. BIOS kompilujem na PC programom AS.

BDOS a CCP dával DRI k dispozícii len v binárnej forme. Adresované boli pre veľkosť RAM 20kB. Preadresovanie na cieľové miesto sa vykonalo utilitkou MOVCPM. Dnes už máme k dispozícii aj zdrojový kód. Preto som sa na starý spôsob s MOVCPM vypr... :-) Stiahol som cpm22.asm, upravil v hlavičke konštantu pre ORG a skompiloval programom ASM od DRI. Výsledkom je HEX obsahujúci CCP+BDOS skompilovaný presne na požadovanú adresu.

Takto som vytvoril komplet (BIOS+BDOS+CCP) runtime obraz CP/M. Další krok je voľba spôsobu ako dostať pri štarte do RAM potrebný kód. Prečo práve do RAM? Do EPROM sa uložiť nedá, pretože BIOS potrebuje zapisovať do svojich premenných. Navyše NCB85 má EPROM iba od 0000 do 2000H.

CPU začína beh od adresy 0000. Na tejto adrese má NCB85 po štarte pripojenú EPROM. Historicky sa BIOS+BDOS+CCP natiahli z rezervovaných stôp na diskete do RAM. RomBor vymyslel fintu, že BIOS umiestni nie na disk, ale priamo do EPROM. Na adrese 0000 je potom kratučký loader a za ním obraz BIOS. Loader prekopíruje obraz BIOS na určené miesto. Výhodu to má v tom, že je to rýchle pre vývoj. Mám emulátor EPROM. Na PC si skompilujem BIOS, pár kliknutiami ho nahrám do emulátora a stlačím reset na NCB85. A mám nový BIOS.

Kým som nemal EPROM emulátor Simulator-EPROM-64kByte ani ma takéto riešenie nenapadlo. Plánoval som mať v EPROM len loader, ktorý by ťahal aj BIOS z diskety. Každá zmena BIOS by znamenala kompiláciu a následný prenos na disketu.

Po tom čo loader presunie BIOS na cieľové miesto sa zavolá CBOOT vstupný bod BIOSu. BIOS inicializuje periférie a zavolá WBOOT. WBOOT natiahne do RAM zvyšok CP/M teda BDOS+CCP. Tieto som si vopred uložil do prvej stopy floppy diskety. Napísal som na to jednoúčelový programík. Kedže BDOS+CCP sa nemenia potrebujem ich ukladať len zriedkakedy :-) Po natiahnutí do RAM už nasleduje len skok na začiatok CCP. A CP/M sa ohlási promptom. Sme v cieľi.

Postup tu popísaný je len jedna z možností, každý si môže vymyslieť niečo iné. Niekto má na diskete uložený aj BIOS. Niekto pri volaní WBOOT nahráva len CCP. Keby sa dala použiť väčšia EPROM ako 8KB mohlo by byť všetko v EPROM a štart CP/M sakra rýchly. Fantázii sa medze nekladú ;-)

No comments:

Post a Comment