Showing posts with label CP/M. Show all posts
Showing posts with label CP/M. Show all posts

Saturday, May 11, 2019

NCB85 18. Word Master

Originál textový editor pre CP/M je ED. Nie je to ten ED čo je v UNIXe. CP/Mkový riadkový editor ED od DRI je oveľa jednoduchší. Zopár batchových file (mimochodom doporučujem SUPERSUB program) som s ním editoval. Ale nebolo to ono. Tok editácie je len od začiatku smerom po koniec file. Vrátiť sa späť sa nedá, jedine zatvoriť a znova otvoriť file. Pri väčších file som to ani neskúšal, radšej som editoval file na PC a presúval ho pomocou XModemu na CP/M počítač.

Teraz sa situácia možno zmení. Marián Luprich tiež riešil dilemu editora a skúsil to s Word Masterom. Word Master je celoobrazovkový textový editor, ale má aj príkazový režim. Napísal ho Rob Barnaby pre MicroPro International. Používa známe shortcuty, pretože jeho nasledovník ich prevzal a používajú sa dodnes. Dnes sú známe pod názvom Word Star shortcuty. Boli použité aj v Borlandovských DOS programovacích prostrediach a napríklad v editore ktorý bol súčaťou Norton Commandera. Word Star je nasledovník Word Mastera a napísal ho rovnaký autor. Word Star už nie je iba čistý text editor ale vie aj formátovať text, čiže veci ako dnes MS Word a podobne.

Originál verzia Word Mastera je nakonfigurovaná pre TeleVideo 925/950 terminál, takže na pohyb kurzora sa používajú Televideo sequencie. Ale na webe sa nachádza návod ako patchnúť Word Master pre ANSI Terminál (Linux Console, X11, xterm, VT100, HyperTerminál, Geoff ASCII Terminál a pod.) Postup na webe používa na vytvorenie patchu ďalší CP/M program SID od DRI.
Marián si dal tú námahu, aplikoval patch a získal funkčnú ANSI verziu Word Masteru. Patchnutý Word Master pre ANSI Terminál je k dispozícii tu

Thursday, February 21, 2019

NCB85 17. Printer

Správny profi počítač má aj tlačiareň. Tak ju dostalo aj NCB85.



Zapojenie je priamočiare. Na data piny 2 až 8 konektora DB-25 sú privedené PA0 až PA7 z 8155. Na pin 1 so STROBE signálom je privedený PB0 z 8155 a na pin 11 s BUSY signálom je privedený PC0 z 8155.
https://en.wikipedia.org/wiki/Parallel_port#Pinouts

BIOS sa rozšíril o pár riadkov: ;----------------------------------------------------------------
; * LIST - Char out to paralel printer
; I: C=char to output
; O: -
; M: AF
LIST:   call LISTST
        mov a,c
        out RIOT_PA     ; data to PA
        mvi a,01h
        out RIOT_PB     ; set Strobe
W1:     call LISTST
        jnz W1          ; wait for end of printing
        mvi a,00h
        out RIOT_PB     ; reset Strobe
        ret
;----------------------------------------------------------------
; * LISTST - Paralel printer status
; I: -
; O: Z=0, A=255 - printer busy
; Z=1, A=0 - printer free
; M: AF
LISTST: in RIOT_PC      ; read Busy port
        ani 01h         ; PC0 mask
        rz              ; printer free
        mvi a,255       ; busy
        ret


Ďakujem Mariánovi za informácie a video.

Thursday, December 27, 2018

NCB85 16. BIOS V3

BIOS pre dosky NCB85V2 a V3 som zase trošku sprehľadnil, rozdelil do viacerých file. Pridal som druhú funkčnú implementáciu blocking algoritmu. A tiež pridal podporu pre tri disketové mechaniky. Do zoznamu zmien patrí aj oprava jednoho bugu, zmena v buildovaní a presunutie kódu pre obojstranné média do drivera pre floppy controller. V predchádzajucich verziách bol tento kód súčasťou blocking algoritmu. Ale teraz je na výber z dvoch algoritmov takže aj preto išiel do drivera.

Pridám ešte krátky pokec o BIOSe pre CP/M a disketových mechanikách. CP/M nepodporuje obojstranné média, takže druhá strana diskety je vec implementátora. Pre CP/M druhá strana diskety neexistuje. Najjednoduchšie preto je zadefinovať stopy dvojnásobne dlhé a v polovici stopy sa prepnúť na druhú stranu - samozrejme bez toho aby CP/M o niečom tušilo. Takto je to aj v BIOSe pre NCB85 implementované. Dala by sa použiť aj schéma, že stopy sú dlhé ako počet sektorov na jednej strane, a CP/M by sa pri definovanej kapacite média a zaplnenosti disku nad 50%, snažilo ísť na stopy 80-159, ktoré na diskete nie sú - vtedy by sa zase preplo na druhú stranu diskety. Táto schéma by riešila aj problém súčasného pripojenia 5.25" a 3.5" obojstranných médií. Ale je tu problém, že v polovici kapacity sa vraciame na začiatok diskety na druhú stranu.

Pre podporu rôznych typov mechaník sú určité prekážky. Ak diskety používajú rovnakú bitrate, tak rôzne geometrie(kapacity) sa dajú zadefinovať priamo v DPB blokoch pre každú mechaniku. V takomto prípade treba prepísať tabuľky DPH, DPB0 s parametrami v drive_params.asm a pridať ďalšiu tabuľku DPB1. Pre väčšie rozdiely medzi mechanikami vznikajú dalšie prekážky, ktoré by bolo treba vyriešiť a ktoré nie sú v BIOSe pre NCB85 vyriešené. Obojstranné média s rozdielnym počtom sektorov na stopu by museli správne prepínať na druhú stranu pre každú mechaniku zvlášť, alebo použiť schému s prepnutím na druhú stranu od stopy 80. Ak by mali mať mechaniky aj rôznu bitrate, tak je treba pri každej zmene mechaniky poslať do floppy kontroléra nové informácie o bitrate a steppingu.

BIOS pre NCB85 podporuje 2 disketové mechaniky rovnakého typu. Tretia mechanika je teraz povolená, ale asi málokto to využije. Pre tretiu mechaniku platia určité obmedzenia. Musí byť rovnakého typu ako prvé dve, alebo musí byť jednostranná, mať rovnakú bitrate a mať menší, alebo rovnaký počet sektorov ako prvé dve mechaniky. To preto, aby správne fungoval kód pre druhú stranu diskety.

Z toho vyplýva, že kombinácie 2x1.44MB 3.5" DS/HD + 1x500kB 8" SS/DD, alebo 2x1.2MB 5.25" DS/HD + 1x 500kB 8" SS/DD sú prípustné. Pretože na SS/DD 8" médiách sú bitrate dvojnásobné a sektorov majú 26 jednostranne. Kombinácia 1.44MB 3.5" a 1.2MB 5.25" mechaník prípustná nie je, pretože na disketách 3.5" je 32 sektorov na stopu obojstranne, ale na disketách 5.25" je iba 26" sektorov obojstranne.

Odstránil som aj jeden bug. Na stope 0 sa občas nezistila chyba pri čítaní sektora. Nová verzia V3 je na GitHube tu:
https://github.com/ncb85/NCB85V2-BIOS/tree/master/bios_fdc_30

Ten istý bug som odstránil aj vo verzii V2.2 (viď GitHub). Vo verzii V3 som odstránil aj podporu PMD32SD, takže kto ju potrebuje, siahne po V2.2.

No a už som to vykecal, mám aj NCB85 V3. Je to zase jednodoskáč s podporou floppy mechaník na jedinej doske. Plne kompatibilný s V1 a V2. Popis asi nikdy nebude, pretože platí všetko to čo pre predchádzajúce verzie. Ostala mi jediná doska.

Wednesday, January 11, 2017

NCD85 5. ATA interface

Vianočný čas som už tradične využil na bastlenie. Odladil som radič a jednoduchú testovaciu aplikáciu pre posledný doteraz neotestovaný konektor na NCD85v2. Má 40 pinov, určený je pre IDC konektor. Rozhranie má 16 dátových bitov, realizovaných portmi A a B. Ďalej má 2+3 adresové linky, plus linky na zápis a čítanie. Konkrétne sa jedná o IDE alebo Parallel ATA rozhranie realizované obvodom 8255 a zopár invertormi. Zapojenie je dnes už klasika v 8-bitovej retro technike.

Ako základ som vzal kód od Paula Stoffregena. Trochu som ho vylepšil, rozšíril ale hlavne prepísal do ASM pre 8085. Testovať som začal s CF kartami, a keď to už fungovalo tak som zapojil aj nejaké IDE disky. Mám zopár 16MB CF kariet a tie sa mi zdajú ideálne. Max veľkosť disku pre CP/M je cca 8MB, takže si viem predstaviť PCčkoidné CP/M, kde by boli dve disketové jednotky A: a B: a dva disky po cca 8MB C: a D: realizované jednou 16MB CF kartou.

Screenshoty z aplikácie
CF karta EMTEC 16MB

CF karta SILICON POWER 512MB

3.5" Disk 340MB, MAXTOR 7345AT bez LBA adresovania a bez 8-bitových prenosov


Sťahovať sa dá ako vždy na GitHub.

Tuesday, April 26, 2016

CP/M BIOS FDD + PMD32SD

CP/M na NCB85 funguje buď s PMD32SD, alebo s disketovými mechanikami, alebo s obidvomi. Osobne mám rád buď jedno alebo druhé. Driver pre každé zariadenie zaberá zbytočné miesto v RAM. Pre PMD32SD stačí nahrať na SD kartu správny obraz a CP/M nabootuje z SD karty. Pre samotné diskety je BIOS tak malý, že sa zmestí aj s CP/M do jednej EPROM a odtiaľ aj nabootuje. Problém je, že je potrebné mať pracovnú disketu CP/M.

Disketu si je možné naformátovať programom FDC.COM. To sa dá aj vtedy ak CP/M nabootuje z PMD32SD s BIOSom pre PMD32SD. Keď potom prejdeme na BIOS iba pre disketovky, tak CP/M nabehne z EPROM a prečíta obsah adresára na diskete. Funguje. CP/M je perfektne spokojné s čistučkou naformátovanou disketou. Ale je tu problém. Pretože disketa je prázdna. Okrem zabudovaných príkazov dir, type, ren, save by nič iné nebolo k dispozícii. Je potrebné dostať na disketu aspoň XMODEM. Pomocou XMODEM už je možné potom preniesť z PC na disketu čokoľvek. Aj CP/M programy ako ASM.COM, DDT.COM, PIP.COM, STAT.COM atď. A samozrejme aj vlastné programy, hry, compilátory, editory, WordStar, BASIC atď.

Lenže ako dostať na disketu ten XMODEM? Pripravil som "quick and dirty" BIOS pre rýchle odskúšanie floppy a prípravu naformátovaných disket. Bootuje z SD karty. Podporuje štyri typy diskiet. Pri boote vypíše menu.


Voľbou čísla sa nastaví typ disketovky. Tento BIOS je veľký. Moc sa mi nechcelo sa s tým hrať a preto obsahuje tabuľky pre všetky štyri typy. Napísal som ho ozaj len na nevyhnutné vytvorenie štartovacej diskety. Dalo by sa to ofajčiť placeholder tabuľkou pre jeden typ a dohratím správnych dát zvoleného typu z EPROM po voľbe.

Takže to zhrniem. Je treba nakopíropvať na SD kartu dodaný image. Potom pripojiť PMD32SD a aspoň jednu disketovú mechaniku. Nabootovať z PMD32SD, zvoliť správny typ diskety. Spustiť FDC. Naformátovať disketu, spustiť kontrolné čítanie. Ukončiť FDC. Prekopírovať na disketu XMODEM (XM5.COM a XM5V2.COM). XM5 používa sériový port 8251, XM5V2 sériový port 16552.

Vypnúť NCB85. Odpojiť PMD32SD. Dať pripravenú disketu do prvej mechaniky. Dať do NCB85 EPROM s BIOSom pre vybraný typ diskety. BIOS pre FDD je na github vo verzii 2.2

Potom sa už dá nabootovať bez PMD32SD z diskety a cez XMODEM dohrať zvyšné programy. Cez FDC si naformátovať ďalšie diskety. Prekopírovať na ne obsah už zaplnenej. Atď.

"quick and dirty" BIOS je na stiahnutie tu/tady aj s obrazom pre PMD32SD.

Typ 1 je pre 5.25" DD diskety 720kB v HD mechanike. Teda niečo čo v PC možné nebolo. V CP/M sa využije 80 tracks/stôp a tak budeme mať pekných 720kB kapacitu. Takto je možné využívať DD diskety (a dokonca výhodnejšie s dvojnásobnou kapacitou) aj vtedy ak sú k dispozícii iba HD mechaniky.

Na github je aj starší BIOS, ktorý podporuje naraz PMD32SD a jeden typ diskiet. Typ diskety sa musí voliť v kóde a skompilovať do HEX. Tento BIOS je úspornejší a nezaberá toľko miesta, pretože má iba tabuľku pre jeden typ diskiet.

Saturday, January 9, 2016

NCD85 2. I2C bus

A je to hotové :-) Vianočný čas už "tradične" využívam na bastlenie a hobby. Môj odhad na rozbehanie I2C controléra PCF8584 bol 3 dni. Nakoniec to trvalo viac ako dvojnásobok. Musel som sa uchýliť k mojej obľúbenej sofistikovanej debugovacej vedeckej metóde LED. Pripojil som LED na obidva vodiče SDA aj SCL a až vizuálne som odhalil kde sa to seká. (DS1307 sa rád zatne a zablokuje celú zbernicu).

Čo je I2C? Je to zbernica od Philips určená na komunikáciu čipov. Má dva vodiče, SCL a SDA a samozrejme zem. I2C umožňuje pripojiť veľké množstvo rôznych senzorov, pamätí, prevodníkov a displayov atď. Napríklad senzor tlaku, vlhkosti, teploty, kompas, senzor zrýchlenia, senzor ..? Alebo chceme pripojiť LCD (rozšírený je I2C backpack s PCF8574), rozšíriť počet vstupných a výstupných portov? Pripojiť jednu, dve, tri 256kB EEPROM? Nie je problém :-) A najlepšie na tom je, že všetky zariadenia sa pripojujú na tie isté dva vodiče. Nie je treba žiadne ďalšie vstupy/výstupy.

Na doske NCD85 je LM75 (alebo LM75A, TMP275), DS1307 a EEPROM rady AT24C. TMP275 je teplomer s rozlíšením až 0.0625°C a presnosťou 0.5°C v rozsahu od −20°C do 100°C. Je to lepšia alternatíva k "industry standard" LM75 od TI. Lepší ako LM75 je aj LM75A od NXP. DS1307 sú hodinky a kalendár a k tomu ešte 56 byte batériou zálohovanej RAM. Na držiak CR2032 batérie je na plošáku určená plocha na priletovanie. AT24Cxx sú EEPROM obvody s kapacitami od 128 byte po momentálne 256kB a za nejaký rok to bude zase viac. A to už by bolo použiteľné aj ako virtuálny disk. Majú garantovaný milión prepisov a udržanie dát na minimálne 100 rokov.

PCF8584 podporuje rýchlosť 100kHz, čo je základná najnižšia rýchlosť. Novšie čipy fičia už aj na 400kHz a 1MHz. K zbernici je nutné pripojiť pull up odpory. Samotné zariadenia (sú open drain) len spínajú vodiče zbernice k zemi. Tým je zaručené, že pri konflikte nedôjde k zničeniu ani jedného zariadenia. Veľkosť odporov nie je kritická, ide len o to aby dostatočne rýchlo zdvíhali úroveň do 1. Prekonávať musia len parazitické kapacity na zbernici. 10, 20 kilo prípadne aj nejaká tá LED, všetko jedno ;-) 100kHz zase nie je nejaká super vysoká frekvencia.

Zdroják drivera a testovacej aplikácie je tu:
i2c fun

Takto to môže vyzerať po boote:

A to som mal otvorenú vetračku.

Saturday, February 14, 2015

NCB85 14. BIOS a FDC linky

Nejako zabúdam na zverejnenie kódu o ktorom tu píšem. Takže to chcem napraviť a ponúkam zopár linkov:

BIOS aktuálne nakonfigurovaný pre 2x360kB je tu
https://github.com/ncb85/NCB85V2-BIOS

Utility program (FDC.COM) na formátovanie diskiet a iné (viď blog o zlých sektoroch) je tu
https://github.com/ncb85/utilis-and-examples
Nachádzajú sa tam aj príklady ku SmallC.

SmallC executable pre Windows je tu
https://drive.google.com/file/d/0B2TmWnRjWCj2alRqZHM1VEgwNFE/view?usp=sharing

Mal som veľké oči a predstavoval si ako budem používať aj 360kB aj 1.2MB diskety a kde nič tu nič. Plexisklo sa nereže najľahšie a ani času moc nie je. Takže stále mám na stole iba 2x360kB. Dobrovoľníci sú vítaní, bolo by fajn keby niekto aktívne používal aj iné formáty diskiet. V súvislosti s chystanou rozširovacou doskou by bolo možné napísať podporu pre RAM disk a pre IDE disk. To by už bol super luxus, 8-bit CPU by si riadilo frčiaci disk s obrovskou kapacitou cca 40MB. Neuveriteľné ;-)

Thursday, February 12, 2015

NCB85 13. Bad sectors

Nedávno som pracoval s jednou disketou a zrazu niekde pri konci mi CP/M zahlásilo chybu pri čítaní sektora. Kedže to bolo na konci tretej stopy od konca diskety, tak to bolo cca 20kB od plnej kapacity. Tá disketa by sa dala používať ako napr.záloha, s tým že by som vždy nechal posledných 20kB prázdnych. Ale štvalo ma to. Prečo by som mal strážiť, aby som disketu nezapĺňal na viac ako 340kB? A čo keby sa zlý sektor vyskytol niekde na začiatku diskety?

Kedže CP/M nemá možnosť označiť zlé bloky je možné len jedno východisko. Vyrobiť file, ktorý bude mať alokované zlé sektory. Našťastie riešenie je naozaj jednoduché. Skúšal som to riešiť cez kombináciu DDT a BDOS volaní ale nedarilo sa mi. Tak som sa uchýlil k programu, ktorý som napísal ešte pri vývoji drivera pre radič disketoviek. Tento program vie okrem iného čítať a zapisovať individuálne sektory na diskete. Okrem toho samozrejme aj formátovať disketu čo bolo úplne prvé na ceste ... to už odbočujem.

Takže v programe FDC.COM som naformátoval disketu a následne spustil kontrolné čítanie všetkých sektorov. Program po chvíli vypísal:
Reading disk (18 sectors per track, 40 tracks)
current track:37
error reading sector(head):
37 11(1)st1 CRC error, alloc unit 170, position 1 of 0..7

Vadný sektor bol na stope č.37, na druhej strane (hlavička 1) a mal číslo 11. Keďže CP/M nealokuje priestor na disku na úrovni sektorov, ale po blokoch, je treba vediet o ktorý alokačný blok sa jedná. Hneď som upravil aj FDC.COM aby vypočítal, v ktorom alokačnom bloku leží vadný sektor. V tomto prípade to bol blok 170 a v rámci bloku išlo o druhý fyzický sektor. Bloky majú 2kB, čiže 16 logických 128-bytových sektorov, alebo 8 fyzických 256-bytových sektorov. Dané hodnoty platia pre mnou zvolený formát a parametre filesystému.

Keď už vieme číslo alokačného bloku, je potrebné ho vyradiť z voľných blokov. Preto som si vyrobil mini file. Napr. príkazom SAVE 1 BAD.CRC. Kedže disk bol po formáte prázdny, file dostal od CP/M hneď druhý alokačný blok s číslom 01. (Prvý alokačný blok zaberá adresár - pre diskety 360kB som zvolil kapacitu 64 súborov, na čo stačí jeden 2kB alokačný blok. 64 x 32-byte je 2kB.) Takže teraz máme v adresári zapísaný novučičký file BAD.CRC, ktorý ideme zneužiť. Tento file je zapísaný v adresári (v tomto prípade v prvom sektore na diskete) v prvých 32 bytoch.

Následne v FDC.COM načítame obsah prvého sektora (256 bytov) na diskete - začiatok adresára. V tej chvíli tam je len jeden file BAD.CRC. Zmenil som v pamäti obsah prvého byte na 0Fh - to je user 15, obsah prvého písmena prípony súboru na 'C'+80h = C3h - to preto aby súbor bol READ ONLY. A nakoniec som zmenil obsah byte 16 na 0AAh - to je tých 170 - číslo alokačného bloku obsahujúceho vadný sektor. Byte 15 určuje dĺžku súboru - v násobkoch 128-byte. Zvolil som 1. Ostatné 00 na druhom riadku sú potencionálne miesto pre ďalšie alokačné bloky. Max veľkosť pre jeden záznam je teda 16 blokov x 2kb - to je 32kB. Kedže na diskete je len jeden zlý sektor, potrebujeme označiť iba jeden alokčný blok ako použitý. Preto len tá jedna AA. A nakoniec som uložil obsah pamäti naspäť do prvého sektora.

0F4241442020202020C3524300000001 .BAD     .RC....
AA000000000000000000000000000000 ................

a takto to potom vyzerá v CP/M. Kapacita diskety je využiteľná až do konca a všetky súbory sa dajú prečítať bez chyby. Súbor je skrytý, vidí ho len používateľ 15 a ani on ho nemôže zmazať.
B>user 15
B>a:
A>b:stat *.*

RECS BYTES EXT ACC
1 2K 1 R/O A:BAD.CRC
BYTES REMAINING ON A: 0K

A>

A>user 0
A>dir
A: PIP COM : ASM COM : STAT COM : ED COM
A: LOAD COM : XM5V2 COM : XM5 COM : DDT COM
A: MBASIC COM : CPM22 ASM : DPB BAS : MLOAD TXT
A: MLOAD ASM : SINUS BAS : NUDE PIC : MLOAD COM
A: MOVCPM COM : FDC COM
A>stat usr:

ACTIVE USER : 0
ACTIVE FILES: 0 15
A>
A>user 15
A>era bad.crc
Bdos Err On A: File R/O

Sunday, November 23, 2014

NCB85 12. 2x360Kb

Dostal som sa o krok ďalej. Pripojil som k NCB85V2 dve disketové mechaniky. Najskôr 2x 1,44MB 3,5". Tie vďaka tomu aké sú miniatúrne som mal na stole viac menej len tak. Bez krabičky. Ale chcel som autentický zážitok, ako kedysi. S "veľkými" disketovkami. Síce CP/M začínalo na 8" mechanikách, ale 5,25" sa asi tiež ráta. Tiež majú značnú veľkosť. Len tak pohodiť na stôl sa nedajú. Zlepil som z plexiskla krabičku na dve 5,25" mechaniky. Osadil som 2x TEAC FD-55BR. Jedná sa o 360kB mechaniky, 40 stôp. BIOS som musel rozšíriť o podporu druhej mechaniky, logiku roztáčania a oneskoreného zastavovania dvoch motorov nezávisle na sebe. A šlape to :-)




Je to krása. Jeden sen splnený. 8-bitové CPU 8085 si obsluhuje dve veľké mechaniky. Takto som o tom sníval v časoch PMD85. Lenže vtedy sme mali iba kazeťáky :-( Je to krásne divadlo pre oči aj uši, keď napríklad pri kompilácii tri minútky hlavičky behajú hore-dole.

A čo taký Manic Miner? Ten by sa nahral odhadom za 10 sekúnd. Z kazeťáčiku to trvalo 5 minút. A ako sme sa nedočkavo tešili:-)

Aby to bolo dokonalé, urobil som ešte jednu vec. Vyhádzal som z BIOSu čo sa dalo, aby som sa dostal na čo najmenšiu veľkosť. Dostal som sa na 980H. To už umožnilo umiestniť v jednej 8kB ROM nielen BIOS ale aj CP/M. Tým pádom nie je potrebná systémová stopa. A to celé má za následok príjemnú skutočnosť a síce, že CP/M má k dispozícii plnú kapacitu diskety.



V riadku s kapacitou svieti pekných 360kB a v poslednom riadku "RESERVED TRACKS" sympatická nula.

Nechcem sa chváliť. Ale na eBay sa objavili za slušnú cenu 8" mechaniky. A nie hocijaké. Úplne "novo staré" ešte nevybalené. Typ double sided a double density. To znamená, že sa vééééľmi podobajú na dobre známe 5,25" 1,2MB mechaniky na HD diskety. 15x 512 sektorov na stopu, 360 otáčok a 500kBps. Jediný rozdiel je, že nemajú 80 ale iba 77 stôp a teda nepatrne nižšiu kapacitu. (Ono to vlastne je naopak. 5,25" HD sú PC kompatibilná zmenšenina starých 8" DS/DD mechaník) A samozrejme papajú gigantické 8" DS/DD diskety. Jedna mechanika už je moja :-) BTW len tak sa po nich zaprášilo.

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ú ;-)

Saturday, November 1, 2014

NCB85 10. Blocking algoritmus

Po dlhej dobe som sa konečne dostal k NCB85 a dorobil jeden rest. Mal som síce napísaný driver ktorý vedel čítať a zapisovať na disketu, ale nemal som prístup na disketu ako filesystem z CP/M. K tomu aby CP/M vedelo pracovať s disketou je potrebné zaradiť do BIOSu patričné volania. A aby to nebolo také jednoduché, tak CP/M 2.2 podporuje iba 128-bytové sektory. Lenže žiadny MFM moderný radič nepodporuje 128-bytové sektory. Najmenší sektor aký PC8477B MFM kódovanie záznamu podporuje má 256-byte. Preto som si aj zvolil túto veľkosť.

Takže čo s tým? Je nevyhnutné použiť medzivrstvu. Každý jeden 256-byte fyzický sektor bude predstavovať dva 128-byte logické sektory. Samozrejme aby to malo aj nejaké výkonnostné parametre, je potrebné pozdržať fyzickú operáciu pri zapisovaní prvej polovice a zápis vykonať na jeden šup pre obidve polovice. Pri zápise iba jednej polovice je treba načítať celý 256-byte sektor, v RAM prepísať patričnú polovicu a celý sektor zapísať späť na disketu. Pri zápise do adresára je treba uskutočniť fyzickú operáciu bez pozdržania. Pri zápise do nealokovaného sektora sa sektor nemusí najskôr načítať do RAM, stačí prepísať starý obsah na diskete. Atď.. kombinácií je dosť.

Jednoduché nie? Našťastie DRI poskytol vzorový algoritmus. Dokonca univerzálny pre rôzne veľkosti sektorov. Jediný problém je, že verzia z knižky obsahuje BUG a verzia pribalená na OEM diskete bola opravená. Kedže som nemal chuť padnúť do pasce a stiahnuť si verziu s bugom, hľadal som na internete iný algoritmus. Našiel som verziu špecificky písanú pre 256-byte sektory. Preštudoval som, pochopil, upravil a .. padol som do pasce. Pretože keď som to konečne spojazdil, tak moja radosť trvala krátko. Začal som to riadne testovať a pri kopírovaní cca desiateho file mi CP/M vždy zahlásilo chybu.

Neostalo mi nič iné (lepšie povedané, zdalo sa mi to rozumné riešenie a rýchlejšie ako hľadať niekde bug), len skúsiť DRI algoritmus. Našiel som opravenú verziu, preštudoval, pochopil, upravil a .. bolo to pomalé. Už to síce nebolo buggy, ale pomalé ako fras. Každý zápis logického sektora vyvolal fyzickú operáciu. Čiže zápis jedného 256-sektora sa vykonal na dva krát. To sú dve otáčky diskety. A to už je dlhá doba. Chybu som našiel a už to fičí. Vážne fičí. Výkon na 3,5" diskete je veľmi slušný. Pri vhodnom interleave faktore sa stihne tých sektorov zapísať hneď niekoľko za jedinú otáčku. A to je teda rozdiel.

Friday, October 31, 2014

NCB85 9. CP/M Floppy drives

Na začiatok pár prekvapení. CP/M 2.2 nepozná adresáre. Všetko je v root adresári. Pre niekoho určite šokujúce, pre tých čo zažili napríklad nahrávanie z kaziet, prípadne SMEP počítače s FOBOS-om normálka.

CP/M 2.2 nemá prostriedky na označenie vadných blokov. MS-DOS si naformátoval disketu a vadné bloky zneprístupnil. Nielen že CP/M nemá definovaný štandard pre diskety, ale CP/M nemá ani len formátovací program :-) Niektorí vendori dodávali vlastný neštandardný formátovací program. Niektorí dokonca nútili ľudí kupovať si od nich naformátované diskety, a formátovací program nedodávali. Pochopiteľne z tohoto dôvodu vznikla spústa rôznych navzájom nekompatibilných formátov. Takže ako to bolo s tými vadným sektormi? Boli na to rôzne programy. Napríklad "reclaim.com" alebo "fbad.com" Tieto programíky vytvorili na disku file s názvom UNUSED.BAD, alebo CRCERR.BAD a podobne. Tento file mal priradené práve vadné sektory. Tento file potom už samozrejme nebolo vhodné zmazať:-) Aby nestrašil medzi ostatými files, bolo ešte možné ho priradiť userovi č.15 a tým ho zneviditeľniť. Väčšina ľudí pracovala pod user č.0.

CP/M teda nemá jednotný formát ani veľkosť sektorov. Každý vendor si zvolil čo mu vyhovovalo. CP-M začínalo na 8" jednostranných SD-single density disketách s 26 sektormi (po 128 byte) na track a 77 tracks. Na takomto formáte a médiu dodávalo DRI CP/M pre vendorov. Postupne sa prechádzalo na DD-double density diskety, veľkosť sa zmenšovala na 5,25" a začali sa používať väčšie veľkosti sektorov. Posledné verzie CP/M od niektorých vendorov už pracovali s 3,5" HD-high density disketami a sektormi veľkými až 1024 byte.

Pre porovnanie - v MS-DOS sú veľkosti sektorov vždy 512 byte. Povolené formáty su tri.

CP/M pre NCB85 teda môže používať ľubovoľný formát diskiet. Ja som napísal programík, ktorý formátuje diskety s 256 bytovými sektormi. Podporuje 4 typy disket. Tri sú 5,25" a jeden 3,5". Že tri?! Áno. Zo sveta PC sú známe dva 5,25" typy. Jeden je 360kB, má 40 tracks a 9 sektorov na track, potrebuje DD diskety. Druhý je 1,2MB, má 80 tracks a 15 sektorov na track, potrebuje HD diskety. A ten tretí? Dostali sa mi do rúk netypické disketovky TEAC FD-55F. Majú kapacitu 720kB, 80 tracks ale pracujú iba s DD disketami, teda 9 sektorov na track. Štvrtý formát sú najrožšírenejšie 1,44MB 3,5" HD diskety. Majú 80 tracks a 18 sektorov na stopu.

Po voľbe veľkosti sektorov na 256 byte, je treba zvoliť ďalšie parametre pre file system. Koľko stôp sa vyčlení pre systém, veľkosť alokačného bloku, max počet záznamov v adresári atď.
BDOS čísluje sektory od 0. Radič PC8477B podporuje aj sektory s číslom 0, preto nie je na čísla sektorov potrebná prekladová tabuľka.


PMD32SD má definované 2MB virtuálne disky

; Tabulka diskovych parametrov:
; disketa o velkosti 2MB
; 256 stop(dve strany), 64 sektorov na stopu
; 1020 alokacnych blokov o velkosti 2kB
; 256 adresarovych poloziek
; 1 systemova stopa
DPB:
dw64; SPT - pocet logickych sektorov na stopu
db4; BSH - posun bloku
db15; BLM - maska bloku
db0; EXM - maska rozsirenia
dw1019; DSM - velkost disku-1
dw255; DRM - velkost adresara-1
db240; AL0 - alokacna maska adresara
db0; AL1
dw64; CKS - velkost pola kontrolnych suctov
dw1; OFF - pocet systemovych stop


Pre diskety som zvolil nasledovné parametre:


Diskety 5,25" DD

; Tabulka diskovych parametrov:
; 5,25" disketa o velkosti 360kB(DOS aj CP/M)
; 40 stop(dve strany), 18 (256 byte) sektorov na stopu, 1440 sektorov celkom
; 179 alokacnych blokov o velkosti 2kB (prva stopa je systemova)
; 64 adresarovych poloziek (1alok.blok x 16sec/blk x 4entry/sec) - adresar zabera 1 alokacny blok
; 0 systemových stôp
DPB:
dw72; SPT - pocet logickych sektorov na stopu
db4; BSH - posun bloku
db15; BLM - maska bloku
db1; EXM - maska rozsirenia, 32kB na extent
dw179; DSM - velkost disku-1
dw63; DRM - velkost adresara-1
db128; AL0 - alokacna maska adresara
db0; AL1
dw16; CKS - velkost pola kontrolnych suctov
dw0; OFF - pocet systemovych stop



Diskety 5,25" DD v 80 tracks mechanike (na PC sa nepoužívali)

; Tabulka diskovych parametrov:
; 5,25" disketa o velkosti 720kB(CP/M)
; 80 stop(dve strany), 18 (256 byte) sektorov na stopu, 2880 sektorov celkom
; 355 alokacnych blokov o velkosti 2kB (prva stopa je systemova)
; 128 adresarovych poloziek (2x16x4) - adresar zabera 2 alokacne bloky
; 1 systemova stopa
DPB:
dw72; SPT - pocet logickych sektorov na stopu
db4; BSH - posun bloku
db15; BLM - maska bloku
db0; EXM - maska rozsirenia
dw354; DSM - velkost disku-1
dw127; DRM - velkost adresara-1
db192; AL0 - alokacna maska adresara
db0; AL1
dw32; CKS - velkost pola kontrolnych suctov
dw1; OFF - pocet systemovych stop



Diskety 5,25" HD

; Tabulka diskovych parametrov:
; 5,25" disketa o velkosti 1.2MB(DOS)/1.04MB(CP/M)
; 80 stop(dve strany), 26 (256 byte) sektorov na stopu, 4160 sektorov celkom
; 513 alokacnych blokov o velkosti 2kB (prva stopa je systemova)
; 256 adresarovych poloziek (4x16x4) - adresar zabera 4 alokacne bloky
; 1 systemova stopa
DPB:
dw104; SPT - pocet logickych sektorov na stopu
db4; BSH - posun bloku
db15; BLM - maska bloku
db0; EXM - maska rozsirenia
dw512; DSM - velkost disku-1
dw255; DRM - velkost adresara-1
db240; AL0 - alokacna maska adresara
db0; AL1
dw64; CKS - velkost pola kontrolnych suctov
dw1; OFF - pocet systemovych stop



Diskety 3,5" HD

; Tabulka diskovych parametrov:
; 3.5" disketa o velkosti 1.44MB(DOS)/1.28MB(CP/M)
; 80 stop(dve strany), 32 (256 byte) sektorov na stopu, 5120 sektorov celkom
; 632 alokacnych blokov o velkosti 2kB (prva stopa je systemova)
; 256 adresarovych poloziek (4x16x4) - adresar zabera 4 alokacne bloky
; 1 systemova stopa
DPB:
dw128; SPT - pocet logickych sektorov na stopu
db4; BSH - posun bloku
db15; BLM - maska bloku
db0; EXM - maska rozsirenia
dw631; DSM - velkost disku-1
dw255; DRM - velkost adresara-1
db240; AL0 - alokacna maska adresara
db0; AL1
dw64; CKS - velkost pola kontrolnych suctov
dw1; OFF - pocet systemovych stop


Pre porovnanie v MS-DOS sú alokačné bloky 1024 byte pre diskety 360kB a 512 byte pre diskety 1,2MB a 1,44MB.

Friday, May 9, 2014

NCB85 8. Expansion board

Od polovice mesiaca marec som sa zaoberal rozšíriteľnou doskou pre NCB5v2. Pre mňa najdôležitejšie tam je mať rozhranie na pripojenie floppy disket. Ako prvé bolo treba vybrať konkrétny typ radiča. Rozhodnutie padlo na NSC PC8477B. Je to asi najlepší radič aký bol pre disketovky vyrábaný. Je softwarovo kompatibilný s NEC FDC765, Intel 82077AA a ďalšími. Pre hovorí aj jednoduchosť zapojenia. Stačí pridať kryštál, 2x 10p kondíky a jedno odporové pole 5x 1k. To je všetko. Proti hovorí to, že nie je dostupný v puzdre DIP40. Ale je dostupný v puzdre PLCC a to sa spájkuje rovnako ľahko.

Okrem toho som dal na rozširovaciu dosku buffer na oddelenie zberníc a jeden GAL, ktorý to riadi. Nechcel som robiť plošák bez overenia schémy. Celé som to spáchal na univerzálke.



Po oživení hardware prišiel rad na software. Po dlhšom boji mám funkčný driver pre floppy diskety. Video s ukážkou ako si NCB85v2 rozumie s touto fascinujúcou technikou je tu:



Ešte chcem overiť rýchlosť, zatiaľ beží CPU na vysokých 8MHz, ale mám pocit že ~5MHz by mohlo s odretými ušami stačiť aj na 1,2M / 1,44M diskety. Tak nakoniec sa moja predtucha potvrdila. Dokonca aj CPU s kryštálom 9,8304MHz (a teda beží na 4,9152MHz) v pohode stíha aj HD disketám s rýchlosťou 500kbps.

Vybral som si sektory o veľkosti 256 byte. Kompatibilita s PC ktoré používa sektory o veľkosti 512 byte je dnes už asi nepotrebná. Zatiaľ som otestoval nasledovné formáty/kapacity:
5,25", DD, 40 stôp, kapacita 360kB, 18 sektorov
5,25", HD, 80 stôp, kapacita 1040kB , 26 sektorov (v PC má táto disketa kapacitu 1,2MB, 15 sektorov x 512 byte)

Diskety 3,5" zatiaľ neriešim, jediný rozdiel by mal byť v polarite signálu DENSEL, takže neočakávam žiadne problémy.Už som vyskúšal aj 3,5" diskety. Formát som otestoval tento:
3,5", HD, 80 stôp, kapacita 1280kB , 32 sektorov (v PC má táto disketa kapacitu 1,44MB, 18 sektorov x 512 byte).
Všetko funguje bez chyby. Tieto mikro diskety majú tiež svoje čaro. Zaberajú menej miesta, stačí im napájanie +5V a robia menej rámusu :-)

Saturday, February 8, 2014

NCB85 7. nové NCB85v2

NCB85 bolo navrhnuté ako minimalistická doska s 8085 procesorom. Chcel som ho využívať na testovanie úprav na kompileri SmallC. Časom naviac oproti plánovanému jednoduchému bootloaderu pribudol MON85 a nakoniec aj CP/M. Toto podstatne zvýšilo využiteľnosť a atraktivitu NCBčka. Dokonca aj v mojich očiach :-)
Fantastický popis NCB85 je na stránkach: Nostalcomp a 8bity. Popis CP/M pre NCB85 je tu: Borik
Po takmer dvoch rokoch sa prvá séria dosiek minula, ale občasný záujem tu stále je. To bol dôvod prečo som sa rozhodol pre druhú verziu.

Popis

NCB85v2 obsahuje výlučne súčiastky, ktoré sa montujú klasicky do diery. Minimálny rozostup pinov je 2.54mm, čo je vzdialenosť dvoch pinov na DIP puzdre. Na osadenie postačuje aj pištolová letovačka. Tú samozrejme neodporúčam, pretože nemá reguláciu teploty a veľmi ľahko môže zničiť dosku prehriatím a odlepením medi z podkladu.
Rozmery dosky sú jemne väčšie ako u prvej verzie. Tentokrát je to štandardných 16x10 cm.



Opravy
Nové NCB85v2 opravuje chybu prepojenia výstupu časovača so vstupom RST6.5. Teraz tam je správne vradený invertor.
Naviac opravuje aj druhú chybu časovača - príliš krátky prerušovací impulz. Pôvodne mal pri auto-reload mode výstupný impulz z timera 8155 dĺžku iba 10 alebo 16 strojových cyklov. V prípadne kryštálu 6.144MHz a deličky 7490 to bolo 10. V prípade 9.8304 MHz kryštálu a deličky 7493 to bolo 16 strojových cyklov. Lenže viaceré inštrukcie 8080 potrebujú až 18 strojových cyklov. Kedže sa prerušovací vstup testuje jeden krát za dobu vykonávania inštrukcie, dochádzalo k nevyhnuteľnému. Niektoré impulzy na prerušovacom vstupe sa strácali.
Nové NCB85v2 má do časovača privedený signál nezávislý od rýchlosti CPU a už pri kryštáli 6.144Mhz bude dĺžka výstupného impulzu 20 strojových cyklov. Pri použití rýchlejších kryštálov to bude zodpovedajúco viac.
Tentokrát je možné použiť aj 2716 a 2732 EPROMky v DIP24 puzdre. Na pine 24 je privedené VCC. Pri použití 27128 bude A13 stále na VCC. V starom NCB85 by bolo na GND.

Kompatibilita
Nové NCB85v2 je spätne plne kompatibilné. Všetko čo fungovalo na starom NCB85 funguje aj na novom. Sú tu staré známe 8251A a 8155 spolu s 64k RAM a 2-8kB ROM.
Adresy IO ostali rovnaké:
8251A - 08H..09H
8155 - 00H..07H
MON85 aj CP/M aj skúšobné programy využívajúce 8155 fungujú ako predtým. CPU môže mať osadený akýkoľvek kryštál, ale z hľadiska výkonu bude rozumné minimum asi 6MHz.
CMOS obvody OKI vraj dokážu fungovať až s kryštálmi 24MHz. Osvedčené CPU Toshiba spoľahlivo fungujú s kryštálmi 9.8304MHz. Rýchly test ukázal funkčnosť dosky s CP/M s kryštálom 12.228MHz.16MHz!! Pri 20MHz ešte stále nabootuje CP/M, ale potom sa už občas nejaká chybička objaví.

Zmeny
Rýchlosť sériového prenosu cez 8251A je nezávislá od hodín CPU a je voliteľná hardwarovo. Jedným jumperom je možné zvoliť baud rate v rozsahu od 600 do 38400 baud.
Pribudol dvojitý UART 16552. V pomerne malom puzdre sa nachádzajú hneď ďalšie dva sériové porty. To navyšuje celkový počet sériových portov na 3.
Pribudli dva "klasické" obvody 8255 a 8253/8254. Prvý je pripojený do DSUB 15 pin konektoru, ktorý je zapojený rovnako ako rozhranie pre PMD32. Port B a polovica portu C sú vyvedené na klasické headre so zámkom.
8253 je vyvedený na headre s tým, že k RST6.5 je možné pripojiť jeho timer/counter 0 namiesto timeru/counteru z 8155.

Konfigurácie
NCB85v2 je možné osadiť v minimálnej konfigurácii s 8251A/8155 a neosádzať 16552, 8253 a 8255. CP/M s BIOS V1.2 funguje cez 8155. Generátor baud rate potrebuje kryštál 9.8304MHz.
Samozrejme je možné osadiť 8255 a ďalšie obvody a neosadiť 8155.Časom snáď pribudne Už máme aj CP/M BIOS V2.0 upravený na porty 8255. PMD32SD sa pripája priamo ku NCB85v2 cez DB15 konektor. CP/M ponúka okrem filesystému aj veľký výber interpretrov, prekladačov (BASIC, C, PL/M, Lisp ..) a ladiacich nástrojov (DDT, SID, MAC, ..). Takto je možné písať programy v plnohodnotnom operačnom systéme, ktorým ostane k dispozíci 34 IO-pinov, štyri timer/countery a dve sériové linky.

Rozšíriteľnosť
Na doske je rozširovací konektor IDC 40 pinov. Vyvedené sú dátová a adresová zbernica. Riadiace signály WR/M, RD/M, WR/IO, RD/IO, RESET, INTR, INTA, ALE a pár ďalších.
Počíta sa s rozširovacou doskou, ktorá bude obsahovať radič disketových mechaník, stránkovanú a zálohovanú RAM 512kB s možnosťou non volatile RAM disku. Ďalej radič I2C zbernice s nejakým I2C obvodmi priamo na doske (IO porty, real time clock / calendar, teplomer, EEPROM). Tieto obvody by malo byť možné využívať aj v prípade, že rozširovacia doska bude pripojená k inej doske, napríklad nejakej s CPU Z80. Iba pre CPU 8085 a teda dosku NCB85v2 tam ešte bude veľmi zaujímavý obvod 8256. Tento obvod kombinuje v jednom puzdre UART, IO, timer/countre a radič prerušení(8251+8255+8253+8259)!

Nové chyby :-(
Objavil som jednu popisku (na plošáku) pri JUM4, ktorá má správne byť pri JUM3. Hovorí, že treba vytiahnuť príslušný jumper ak sa zapojí JUM5 na aktiváciu ALL RAM (CP/M) módu.
Jedna malá chyba je v zapojení tretieho sériového portu. Pin 31 obvodu TL16552D mal ísť na VCC. Ale nie je to nič vážne, pri osadení JUM9 to bude fungovať. TL16552D je jediný obvod, ktorý som zatiaľ neosadil a neotestoval. Nemám ho, ale už som ho objednal z USA. funguje to aj bez JUM9. Obidva kanály UART 16552 sú funkčné a otestované :-)





Dostupnosť
Ponúkam zopár dosiek a nasledovné súčiastky ako nekompletné kity: 8251A a 8254 aj so socketmi, 8085 CPU, 8155, kryštál 6.144MHz, 9.8304MHz a 16MHz. V prípade záujmu môžem ešte poskytnúť 7400, 7432, 74138, 74573, RAM, 8255, 8256 a naprogramované EPROMky.

Na stiahnutie
Schema

Tuesday, April 2, 2013

NCB85 6. CP/M 64k V2.2

Dnes ráno mi prišla doštička interface k NCB85 a PMD32SD od Martina. Kábel som už mal pripravený tak som rýchlo osadil súčiastky, naprogramoval EPROM a zapol hyperterminál. Po zapnutí som videl toto:



Keby to vždy išlo takto hladko :-) Odteraz sa budem snažiť testovať a ladiť na NCB85. ZetaSBC ale ostáva na stole, budem sa snažiť overovať programy na obidvoch CP/M strojoch.

Monday, March 25, 2013

NCB85 5. File I/O

Prvý program Hello World overil funkčnosť konzolového I/O a cross compilácie. Druhý program otestoval spracovanie vstupných parametrov z CP/M príkazového riadku. Ďalším krokom je test file systému. Pripravil som krátky program, ktorý vypíše na konzolu obsah súboru. Názov súboru sa zadáva ako parameter. Ak sa nezadá žiadny parameter, alebo viac ako jeden parameter, program vypíše usage. Ak sa nepodarí otvoriť súbor, tak vypíše chybové hlásenie.
/*
* File: main.c, march 2013
* file test on CP/M
*/
#include <stdio.h>

FILE *input;

/**
* main routine
* @return
*/
main(int argc, int argv[]) {
    char k;
    print("File test\r\n");

    if (argc == 2) {
       print("file:");
       print(argv[1]);
       print("\r\n");

       if ((input = fopen(argv[1], "r")) == NULL) {
          print("Open failure\n");
          exit(1);
       }

       while ((k = fgetc (input)) != EOF) {
          putchar(k);
       }

       fclose(input);
    } else {
       print("usage: fltst file.ext");
    }
}

print(char *str) {
    while (*str) {
       putchar(*str++);
    }
}

CRTSO sa zase trošku zmenilo. Pribudla inicializácia STDIO systému. Toto je asi aj finálna verzia. Už tam je všetko, čo je potrebné na prácu v CP/M.
    lxi h,0
    dad sp
    shld stksav ; save the stack pointer
    lhld 6 ; pick up core top
    lxi d,-10 ; decrease by 10 for safety
    dad d
    sphl ; set stack pointer
    call stdioinit ; initialize stdio
    lxi h,0x0080
    push h
    call Xarglist
    lhld Xargc
    push h
    lxi h,Xargv
    push h
    call main ; call main program
    jmp 0
stksav: .ds 2
crtsoend:
    .end

Do projektu pribudli ďalšie podporné súbory: io8080.c, bdos1.c a exit.c

Building project
scc8080 -t -a main.c
as8085 -l -o -s -p -g main.s
scc8080 -t -a bdos.c
as8085 -l -o -s -p -g bdos.s
scc8080 -t -a chio8080.c
as8085 -l -o -s -p -g chio8080.s
scc8080 -t -a arglist.c
as8085 -l -o -s -p -g arglist.s
scc8080 -t -a charclass.c
as8085 -l -o -s -p -g charclass.s
scc8080 -t -a io8080.c
as8085 -l -o -s -p -g io8080.s
scc8080 -t -a bdos1.c
as8085 -l -o -s -p -g bdos1.s
scc8080 -t -a exit.c
as8085 -l -o -s -p -g exit.s
as8085 -l -o -s -p -g cret.asm
as8085 -l -o -s -p -g crun8080lib.asm
aslink -n -i -u -o -m -b CRET=0x0100 -b LIB8080=crtsoend+0x0100 -b SMALLC_GENERATED=crun8080_end+crtsoend+0x0100 cmd cret.rel crun8080lib.rel main.rel bdos.rel chio8080.rel arglist.rel charclass.rel io8080.rel bdos1.rel exit.rel
sort -k1.8,1.9 -k1.4,1.7 cmd.ihx > cmd.hex
hex2bin -e com -c cmd.hex
hex2bin v1.0.1, Copyright (C) 1999 Jacques Pelletier
Lowest address = 00000100
Highest address = 00001DD3

Build finished


Výsledný COM sa nafúkol na cca 7.5kB. Z toho sú ale 2kB buffer pre čítanie sektorov z filesystému. To preto, lebo je dovolené mať otvorené naraz až 4 súbory. Odhadom ďalšie 0.5kB sú pomocné štruktúry ako 4x FCB atď.

NCB85 4. Command line params

Hello World bol prvý krok. Ďalší krok je otestovanie parametrov zadávaných v príkazovom riadku CP/M. CRTSO bude trošku zložitejšie.

; Run time start off for Small C.
.module CRET
.area CRET (REL,CON) ;program area CRTSO is RELOCATABLE
.list (err, loc, bin, eqt, cyc, lin, src, lst, md)
.nlist (pag)
.globl crtsoend

lxi h,0
dad sp
shld stksav ; save the stack pointer
lhld 6 ; pick up core top
lxi d,-10 ; decrease by 10 for safety
dad d
sphl ; set stack pointer
lxi h,0x0080
push h ; line buffer is at 0080H
call Xarglist
lhld Xargc
push h
lxi h,Xargv
push h
call main ; call main program
jmp 0 ; warm boot, reload CCP
stksav: .ds 2
crtsoend:
.end

Musel som upraviť dodaný CRTSO k SmallC pretože nefungoval. Pridal som riadok s LXI H,0080 a PUSH H. Následne volaná C rutina Xarglist totižto očakáva vstupný parameter char pointer na buffer s obsahom príkazového riadku. Rozparsuje buffer podľa medzier a naplní Xargc a Xargv globálne premenné. Pôvodný stack ukazoval na priestor v CCP, kde bolo miesto na 8 úrovní. Túto hodnotu síce ukladáme, ale po ukončení sa aj tak nepoužije. Jednoduchšie je zavolať warm boot, ktorý reloadne CCP.

C program

/*
* File: main.c, march 2013
* command line arguments testing on CP/M
*/

/**
* main routine
* @return
*/
main(int argc, int argv[]) {
    int i;
    print("Argument test\r\n");

    for (i=1; i < argc; i++) {
       print("arg:");
       putchar('0' + i);
       print(", value:");
       print(argv[i]);
       print("\r\n");
    }
}

print(char *str) {
    while (*str) {
       putchar(*str++);
    }
}

V main metóde sa zmenila hlavička. Už máme dva parametre. Prvý je počet parametrov argc. Ale čo ten druhý ? Malo by tam byť napr. char *argv[]. Čiže pole pointerov na char. Žial SmallC umožňuje iba jednu úroveň indirekcie. Využíva sa tu trik, že pointer je rovnako veľký ako int. Takže to pole integerov je vlastne to isté ako pole pointerov. Toto je ďalšia oblasť, kde by sa mohlo SmallC vylepšiť.

Spustenie programu na CP/M

A0>cmd a b -t
Argument test
arg:1, value:A
arg:2, value:B
arg:3, value:-T


To vyzerá dobre :-)

Build

K main.c, bdos.c a chio8080.c pribudli ďalšie dva súbory: arglist.c a charclass.c.
Building project
scc8080 -t -a main.c
as8085 -l -o -s -p -g main.s
scc8080 -t -a bdos.c
as8085 -l -o -s -p -g bdos.s
scc8080 -t -a chio8080.c
as8085 -l -o -s -p -g chio8080.s
scc8080 -t -a arglist.c
as8085 -l -o -s -p -g arglist.s
scc8080 -t -a charclass.c
as8085 -l -o -s -p -g charclass.s
as8085 -l -o -s -p -g cret.asm
as8085 -l -o -s -p -g crun8080lib.asm
aslink -n -i -u -o -m -b CRET=0x0100 -b LIB8080=crtsoend+0x0100 -b SMALLC_GENERATED=crun8080_end+crtsoend+0x0100 cmd cret.rel crun8080lib.rel main.rel bdos.rel chio8080.rel arglist.rel charclass.rel
sort -k1.8,1.9 -k1.4,1.7 cmd.ihx > cmd.hex
hex2bin -e com -c cmd.hex
hex2bin v1.0.1, Copyright (C) 1999 Jacques Pelletier
Lowest address = 00000100
Highest address = 00000827
Build finished
Výsledný COM už narástol na 727 bytov hexadecimálne.

Sunday, March 24, 2013

NCB85 3. Cross compiled Hello World

Používať moderné IDE na vývoj pre CP/M nie je žiadna prevratná myšlienka. Fakt ale je, že to skoro nikto nerobí. Snáď preto, že starí CP/M harcovníci majú odpor k Windows, alebo možno preto, že iba nepoznajú silu a výhody moderných IDE. Preto som sa do toho vrhol ja.

Každý C program začína metódou "main()". Lenže v CP/M sa programy spúšťajú od adresy 0x0100. Ako na to ? Písať k main niečo ako ORG 0x0100 by nebolo to pravé orechové. Robí sa to inač. Každý program v C má zavádzač. Nazýva sa C Run Time Start Off, skrátene CRTSO. Pre CP/M by mohol vyzerať takto nejako:
;   Run time start off for Small C.
;   cseg
    .module CRET
    .area CRET (REL,CON) ;program area CRTSO is RELOCATABLE
    .list (err, loc, bin, eqt, cyc, lin, src, lst, md)
    .nlist (pag)
    .globl crtsoend
    lxi h,0
    dad sp
    shld stksav
    lhld 6 ; pick up core top
    lxi d,-10 ; decrease by 10 for safety
    dad d
    sphl ; set stack pointer
    call main ; call main program
    lhld stksav ; restore stack pointer
    sphl
    ret ; go back to CCP
stksav: .ds 2
crtsoend:
    .end
Všimnime si volanie "call main". Áno to je ono. Tu nám zavádzač spúšťa našu main metódu. Tá bižutéria okolo, je už len presunutie zásobníka. Vlastnej tvorbe a fantázii sa medze nekladú. Musel som upraviť SmallC verziu pretože, neviem prečo ale bola zlá. Hneď na začiatku bolo SPHL. Nastavenie SP na hodnotu v HL. Ale to je asi blbosť. Veď CP/M nedáva v HL žiadnu hodnotu hovoriacu o zásobníku. Zase keby som nechal SP bez zmeny, tak by ukazoval niekam do CCP kde je priestor iba pre 8 úrovní. Preto som zvolil inú taktiku. Radšej si ho alokujem tam kde bolo CCP a miesta mám habadej.

C zdrojáky

SmallC nám všetky C zdrojáky preloží do ASM. Ďalší krok je spustiť assembler ktorý spracuje tieto vzniknuté ASM. Posledný krok je link. Linker nám musí zostaviť výsledný program, pozostávajúci z viacerých REL súborov. REL sú relokovateľné fragmenty. Je to výsledok volania assemblera. Linker ich zostaví do jedného celku, pričom na adrese 0x0100 bude ako prvý CRTSO. Ostatné fragmenty už môžu ísť v ľubovoľnom poradí za ním. Pri Hello World si vystačíme s tromi C súbormi.

/*
* File: main.c, march 2013
* hello world on CP/M
*/

/**
* main routine
* @return
*/
main() {
    print("Hello World!!");
}

/**
* prints zero terminated string
* @param str
* @return
*/
print(char *str) {
    while (*str) {
       putchar(*str++);
    }
}


Druhý súbor je z knižice SmallC. Je to chio8080.c
#define EOL 10
getchar() {
    return (bdos(1,1));
}

putchar (c) char c; {
    if (c == EOL) bdos(2,13);
    bdos(2,c);
    return c;
}


BDOS služba 1 je vstup jedného znaku z konzoly. BDOS služba 2 je výstup jedného znaku na konzolu. Posledný súbor je bdos.c ktorý už len zavolá CALL 5 volanie CP/M BDOS. Listing neuvádzam. Je to len CALL 5 a nejaké POP a PUSH.

COM file

Výstupom linkera je Intel HEX súbor. CP/M potrebuje spustiteľný COM file. Je možné nahrať na CP/M stroj HEX súbor a pomocou príkazu LOAD ho prekonvertovať na COM. Dá sa to ale aj priamo na Windows. Použijeme utilitu hex2bin, ktorá robí presne to isté. Naviac nám do build okna vypíše aj veľkosť výsledného COM.

Building project
scc8080 -t -a main.c
as8085 -l -o -s -p -g main.s
scc8080 -t -a bdos.c
as8085 -l -o -s -p -g bdos.s
scc8080 -t -a chio8080.c
as8085 -l -o -s -p -g chio8080.s
as8085 -l -o -s -p -g cret.asm
as8085 -l -o -s -p -g crun8080lib.asm
aslink -n -i -u -o -m -b CRET=0x0100 -b LIB8080=crtsoend+0x0100 -b SMALLC_GENERATED=crun8080_end+crtsoend+0x0100 hello cret.rel crun8080lib.rel main.rel bdos.rel chio8080.rel
sort -k1.8,1.9 -k1.4,1.7 hello.ihx > hello.hex
hex2bin -e com -c hello.hex
hex2bin v1.0.1, Copyright (C) 1999 Jacques Pelletier
Lowest address = 00000100
Highest address = 00000374
Build finished


Po nahratí na CP/M stroj a spustení COM súboru nám to naozaj vypíše Hello World!!
Niekomu by sa COM súbor zdal moc veľký. Je to spôsobené tým, že je tam prilinkovaná kompletná run-time knižnica crun8080lib. Táto obsahuje aj napríklad rutiny na násobenie, delenie, rotácie, switch príkazy a kopu ďalších, ktoré v Hello World nepoužívame.

Monday, March 18, 2013

NCB85 2. XMODEM

Dotaz na Rádio Jerevan: Je pravda, že každý návštěvník Rudého náměstí v Moskvě dostane auto?
Odpověď: V principu ano. Ovšem nejedná se o Rudé náměstí v Moskvě, ale o Náměstí Gorkého v Kijevě. Také se nejedná o auta, ale o kola. A nejsou rozdávána, ale kradena.

S nadpisom tohoto blogu je to tak trošku podobné. Nejedná sa o NCB85 ale o ZetaSBC. Prisahám, že to sú všetky rozdiely ;-)

Pripravil som kratučké video, ktoré ukazuje ako používať výbornú utilitku XMODEM na prenos file medzi CP/M a Windows. V tomto videu je použitá ZetaSBC a nie NCB85, nakoľko ešte nie je hotový PMD32SD a interface. Prenos je smerom z PC na Zetu. Samozrejme ide to aj opačne. Video je tu preto, lebo som zistil, že nie všetci CP/M používatelia o takejto možnosti vedia. A nie je celkom triviálne prísť ako na to. Dík Martine za asistenciu :-)



Celkom na záver si neodpustím ešte jeden krátky.

Dotaz na Rádio Jerevan: Kde vlastně sedí ten, co vymýšlí vtipy na Radio Jerevan?
Odpověď: To bohužel nevíme, ale sedí zcela určitě!