Tuesday, March 17, 2015

NCD85 1. Floppy radič

Vianočný čas som využil na návrh dvoch PCB. Jeden pre môj audio projekt a druhý pre NCB. Nazval som ho NCD85v2 a jedná sa o radič floppy diskiet a iné. Konkrétne jedna 8255 pre IDE rozhranie, jedna MUART 8256 pre experimenty (s interrupt systémom starej dobrej 8080) a I2C radič (plus I2C RTC, EEPROM a teplomer). A nakoniec stránkovaná 512kB SRAM zálohovaná batériou. Floppy radič PC8477BV-1 je v PLCC68 puzdre, s rozostupom pinov 2,54mm. Preto sa letuje rovnako ľahko ako DIP obvody. Ostatné obvody sú všetky DIP.

Nakoľko som to nechcel komplikovať a ťahať drôtiky je tu jeden kompromis. Použitie 512k SRAM si vyžaduje vytiahnutie 128kB SRAM na NCB doske zo soketu. Ja sám sa zatiaľ nechystám využívať 512k SRAM na novej doske. Ale keby niekto potreboval veľa RAM a navyše zálohovanej tak je k dispozícii. IC3, IC4, IC15 je potrebný len pre SRAM.

Ako vidno zatiaľ som osadil len časť pre radič diskiet. Na začiatku som osadil iba radič diskiet. Umožňuje na rozdiel od drátového modelu pripojiť až 4 kusy mechaník. Používajú sa obyčajné PC káble na disketové mechaniky. Na jeden kábel je možné pripojiť dve mechaniky. Doska v pohode funguje aj na 8MHz. Pri takomto minimalistickom osadení je potrebné mať iba IC1,IC2, IC16, IC6, RN2, Q3, C1, C2 a blokovacie kondenzátory. Ja som osadil aj blikátka: IC8 a súčiastky okolo.

Na obrázku je vidno pôvodný radič realizovaný na univerzálke a dvojicu NCB+NCD.

Fotky sú ešte mizernejšie ako zvyčajne (len z lacného telefónu), pretože môj kompakt HP zdá sa vydýchol naposledy.. Fotky (nie všetky) sú už lepšie.

NCB a NCD sú prepojené cez ribbon kábel. Má 40 žíl, ako kábel k IDE diskom. Dosky sú spojené pomocou dištančných stĺpikov.



Tu už sú osadené aj PIO 8255, MUART 8256, I2C controlér PCF8584 a I2C slaves DS1307, TMP275, AT24C256 a batéria CR2032. Neosadená zostáva iba časť pre stránkovanú 512kB SRAM. Na tú sa zatiaľ nechystám.



V doske sú pripravené otvory pre montáž 3.5" mechaniky. Čelo mechaniky trošku pretŕča takže by to celé šlo zabudovať do nejakej krabičky s otvorom pre mechaniku.



Sú použité 2 kusy GAL22V10D v DIP puzdre. Jeden (IC16) je potrebné osádzať vždy. Druhý (IC15) len pri použití 512k RAM. V schéme sú aj rovnice pre GAL. Pri čiastočom osadení (bez RAM) je potrebné vyradiť MR a MW signály. Čiže sú dve verzie "programu" pre IC16. Jedna pre 512k SRAM a druhá pre použitie bez SRAM. V schéme sú rovnice pre plnú paľbu aj s RAM. Zjednodušené a upravené rovnice pre použitie bez 512k SRAM pod názvom NCDexp_noram.equ sú tu:
https://drive.google.com/folderview?id=0B2TmWnRjWCj2fmlrZktnRENtMENiZDlPUXJYWWJjRmFqOTZla3pqbk1Td2xyQW1jMlRXeWM&usp=sharing

Na stiahnutie schéma tu:
https://drive.google.com/file/d/0B2TmWnRjWCj2clVuT1JrT1o3RWM/view?usp=sharing

Priebežne ako budem oživovať ďalšie časti, budem rozširovať aj popis. Pridám aj vysvetlenie ako funguje stránkovanie - pravdepodobne v samostatnom článku.

Aktualizácia:
Už mám osadenú aj 8255 a funguje. Teraz už len napísať ovládač pre IDE disk :-)
Ďalšia aktualizácia - už mám osadenú a otestovanú aj 8256.
Ďalšia aktualizácia - už mám osadený a otestovaný aj radič I2C PCF8584.
Ďalšia aktualizácia - ovládač pre IDE disk je napísaný a otestovaný.
Jedna chyba sa predsa len našla. Popiska pri JUM4 je naopak, v polohe RST7.5 je v skutočnosti INT a naopak.

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