Thursday, February 28, 2013

SCC1. Úvod do SmallC

Bol socializmus. Hrávali sa dve hymny. Československá a sovietska. V televízii boli dva programy. Amatérske rádio prinášalo články o splnených úlohách a zjazdoch KSČ. Na viedni bežal KITT. Vrchol techniky boli sedemmelódiové digitálky. Potom prišli 8-bity. V tuzexe sa dal kúpit Sinclair Spectrum. V predajniach občas mali Atari 800XL. Na stanici mladých technikov dostali dve PMDéčka. Programy sa nahrávali na kazety. Prvý program, ktorý som naťukal bol v Basicu na PMD85. Dodnes si pamätám na neuveriteľný pocit z toho, že to čo píšem na klávesnici vidím na obrazovke.

Nadšene som hltal príručku k PMD85 a učil sa príkazy Basic. V tej dobe zároveň vychádzal v Elektróne hi-tech seriál o programovaní v assembleri 8080. Nejakým spôsobom sa mi dostal do rúk program DDT602. Bol to celobrazovkový assembler a disassembler pre PMD85. Potom sa mi dostala do rúk aj kópia Monitor PMD85. Zase som mal čo študovať. V tej dobe som už počul o jazyku Pascal. Ale na PMD85 nič také nebolo. Po prechode na výšku, som už kontakt s 8-bitmi stratil úplne. Prišla doba PC, diskiet a harddiskov. A tak som sa nejako nikdy nestretol s CP/M a ani som netušil, že na 8080 existovali aj C kompilery.

Prešlo veľa rokov. Vlastne ich bolo asi 20. Pri browsovaní na mňa na full HD LCD jedného dňa vyskočil mne neznámy pojem SmallC. Ostal som dosť prekvapený, pretože sa jednalo o C kompiler pre 8-bitový procesor z počítačového praveku Intel 8080. Vždy som chcel spoznať ako funguje kompiler. Assembler 8080 som si ešte matne pamätal. Neváhal som a stiahol som si zdrojáky. Vznikali niekedy v lete 1980 !!!

SmallC nie je plnohodnotný kompiler C. Keď ho Roin Cain napísal podporoval iba while cykly a z typov len char a int. Ďalej jednorozmerné polia a pointre. Napriek tomu to bol veľmi silný nástroj. Ron na motorke odniesol zdrojáky vytlačené na papieri do redakcie Dr'Dobbs časopisu. Vyšli v júli 1980 v čísle 45. Ron sa radšej nepochválil, že C kompiler ktorý práve napísal je len jeho druhý program v C. Prvý bol obligátny Hello World. Aj tak mu nechceli veriť, že na tom výstupe z tlačiarne je C kompiler, pretože .... tam videli C zdrojový kód. V tej dobe sa jednalo o nevídanú vec. Kompiler ktorý prekladá sám seba.

Ron dal kód k dispozícii verejnosti a rýchlo vznikali varianty a rozšírenia jeho kompileru. Mne sa zapáčila verzia, ktorá bola portovaná na UNIX. Napísal ju Chris Lewis a pridal rozšírenia oproti verzii 2.0. Po jemných úpravách sa dala preložiť aj s gcc. Pri spustení vygenerovala pekný core :/ Tak som pátral ďalej a po úprave spracovania args a argv začala fungovať.

Wednesday, February 27, 2013

SCC2. SmallC - deklarácie premenných

SmallC je jednopriechodový kompiler. Nežartujem. Číta C kód z textového súboru alebo konzoly. Nepoužíva lex/yacc. Ron si napísal vlastný parser, lexer a generátor kódu. Na výstupe generuje asm kód. Tento je spracovávaný asemblerom. Ja som upravil SmallC tak, aby produkoval kód pre 5-priechodový ASXXXX. Nežartujem, naozaj je 5-priechoddový ;) Výsledkom ASLINK linkera je Intel Hex súbor.

Všetky knižky o kompileroch venujú veľa priestoru teórii. To by až tak nevadilo, keby častokrát úplne nevypúšťali časť venujúcu sa generovaniu kódu. A práve pohľad na generovaný kód pomôže pochopiť ako funguje kompiler. 8080 je tak trochu už 16-bit procesor. Má tri registrové páry zložené z dvojíc registrov: BC, DE a HL. Tieto registrové páry umožňujú 16 bitové operácie ako add, sub, lhld, shld, lxi. SmallC používa takzvaný primary/secondary register koncept. Používa len dva registrové páry. Primárny je HL, secondary je DE. BC sa nepoužíva.

SmallC má jednu vynikajúcu vlastnosť. Umožňuje interaktívnu prácu. Človek napíše riadok C kódu, stlačí ENTER a hneď dostane výstupný asm kód. Je to perfektné pre zoznámenie sa s kompilerom. Poďme si to vyskúšať. Tu je preložená verzia pre Windows. scc8080. Záujemci o linux verziu si zdrojový kód https://github.com/ncb85/SmallC-85 iste bez problémov skompilujú sami.

Otvoríme si prompt a spustíme kompiler: scc8080 -t
Flag -t hovorí, že vstupné riadky budú kopírované do výsledného asm kódu ako komentáre. Nezadali sme názov file, takže vstup aj výstup bude na konzole. Mali by sme vidieť takéto niečo:
; Small C 8080
; Coder (2.4,84/11/27)
; Front End (2.7,84/11/28)
; Front End for ASXXXX (2.8,13/01/20)
;program area SMALLC_GENERATED is RELOCATABLE
.area SMALLC_GENERATED (REL,CON)
.module SMALLC_GENERATED
.list (err, loc, bin, eqt, cyc, lin, src, lst, md)
.nlist (pag)
.area SMALLC_GENERATED (REL,CON,CSEG)
napíšem: int a; a stlačím CTRL-Z a ENTER čím pošlem EOF znak. Na niektorých OS je treba poslať znak CTRL-D. SmallC vidí koniec file EOF a preto už nečaká na ďalší riadok ale skončí. Mal by vypísať toto:
.area SMALLC_GENERATED_DATA (REL,CON,DSEG)
.globl a
a:
.dw #0

;0 error(s) in compilation
; literal pool:0
; global pool:1
; Macro pool:45
; .end

Vo výstupnom asm je label s názvom našej deklarovanej premennej a má rezervované miesto 2 bytes (DB - Define Byte, 8 bits. DW - Define Word, 16 bits) čo je správne, pretože a je int. A nielen to, má aj východziu hodnotu. Tá je nastavená na 0. SmallC sa postará o to, aby globálne premenné mali garantovanú hodnotu. Vhodné sú ďalšie experimenty, deklarácia viacerých premenných, rôznych typov (int, char, unsigned int, unsigned char).

Tuesday, February 26, 2013

SCC3. SmallC - krátky program

V minulom článku sme skúsili interaktívny režim SmallC. Teraz skúsme kratučký program a pozrieme sa na vygenerovaný kód. Spustime kompiler príkazom scc8080 -t
Zadajme:
int gla, glb = 3;
char msg[]="hello world", glc, *glpc;

method_a () {
   gla = glb;
   glc = 'x';
   glpc = msg;
}
Dostaneme:
; gla = glb;
lhld glb
shld gla
do primárneho registrového páru sa načítala hodnota na adrese glb a uložila sa na adresu gla
; glc = 'x';
lxi h,#120
mov a,l
sta glc
do HL sa načítalo 'x' čo je ASCII 120, všimnime si, že aj typ char sa načítava do registrového páru. Následne sa už správne uložila len hodnota z L do A a v poslednom kroku sa uložil A na adresu glc
; glpc = msg;
lxi h,msg
shld glpc
do HL sa načítala adresa začiatku poľa msg. V C sú stringy interpretované ako char array. Adresa poľa msg sa uložila na adresu glpc.

Na konci nasledujú deklarácie:
gla:
.dw #0
gla je int, má rezervované dva byte. Keďže nemá inicializačnú časť, bola mu defaultne daná hodnota 0
glb:
.dw #3
glb má hodnotu 3, presne ako má v inicializačnej časti
msg:
.db #104,#101,#108,#108,#111,#32,#119,#111,#114,#108
.db #100,#0
msg je pole bytov, inicializované na znaky hello world, ukončené 0.

Monday, February 25, 2013

SCC4. SmallC - funkcie

Jedna z najväčších výhod C jazyka sú lokálne premenné. Lokálne premenné nemajú miesto vo výslednej binárke, ale sa alokujú dynamicky. Počas behu programu, pri potrebe lokálnej premennej sa na zásobníku alokuje pamäť. Napríklad obyčajný PUSH posunie SP o dva byte. Na vzniknutom mieste môžeme ukladať hodnoty. Pri ukončení potreby lokálnej premennej sa urobí POP. Tým sa zásobník vráti do pôvodného stavu. Skúsme takýto kód
main() {
int la;
la = 5;
}
Začiatok metódy je označený labelom main:
;main() {
main:
Ďalej dostaneme:
;int a;
push b
;a=5;
lxi h,#0
dad sp
push h
lxi h,#5
pop d
call ccpint
Deklarácia premennej v metóde spôsobí okamžitý PUSH aby sa alokoval priestor. Ďalej nasleduje dvojica metód LXI a DAD ktoré nastavia do HL adresu premennej a.
Táto adresa je hneď uložená na stack. Toto je typické pre kód generovaný podľa primary/secondary register konceptu. Pretože nemáme viac registrov, každá hodnota sa musí hneď ukladať na stack aby sa uvoľnili jediné dva registre. Toto je na jednej strane jednoduchšie na implementáciu a aj výsledný asm kód je ľahko čitateľný. Na druhej strane je to veľmi neefektívne. Moderné procesory majú desiatky registrov a namiesto ukladania na stack sa alokujú ďalšie a ďalšie registre. Ale napísať túto časť kompileru (register alocation) patrí medzi najťažšie úlohy.
Ďalej nasleduje načítanie hodnoty 5 do HL a do DE sa popne adresa lokálnej premennej. A zavolá sa rutina z knižnice, ktorá uloží HL na adresu DE. Mimochodom tieto tri inštrukcie sa dajú nahradiť jedinou. Existuje aj nedokumentovaná inštrukcia 8085 s názvom SHLX. Prepínač -u v SmallC zapne generovanie kódu s nedokumentovanými inštrukciami. Pri zapnutí -u sa vo výpise obajví aj ďalšia nedokumentovaná inštruckia - LDSI.

Koniec metódy:
pop b
ret
Pop opraví SP a ret ukončí metódu.
Ako sa zmení kód ak budeme mať dve lokálne premenné ? Nechávam to na vlastné pokusy.

Sunday, February 24, 2013

SCC5. SmallC - príkazy

Príkazy sú prekvapivo jednoduché na implementáciu. Skúsme sa pozrieť na if. Zadajme:
main(){
    if (1) {
    } else {
    }
}
Dostaneme:
main:
;if (1) {
lxi h,#1
mov a,h
ora l
jz $2
;} else {
jmp $3
$2:
;}
$3:

A koniec mainu:
}
$1:
ret
Hmm je treba komentár ? Do primárneho registrového páru HL sa načítala hodnota výrazu a kombináciou mov a ora sa testuje na nulu. V C je všetko okrem nuly true. Medzi jz $2 a jmp $3 by išiel kód príkazov, ktoré sa majú vykonať pri splnenej podmienke. jmp $3 tam je kvôli tomu, aby sa nevykonal kód príkazov else vetve. Je zaujímavé pozrieť si, ako sa interpretujú ostatné príkazy ako case, while, for..

Saturday, February 23, 2013

SCC6. SmallC - pohľad do kódu

Videli sme aký jednoduchý je kód pre príkazy. Ich implementácia v kompileri tiež patrí medzi jednoduchšie časti. Toto je zjednodušený listing. Ukazuje akým spôsobom kompiler vygeneroval postupnosť inštrukcií z predchádzajúceho článku.
flab1 = getlabel ();
test (flab1, FALSE);
statement (NO);
if (!amatch ("else", 4)) {
  generate_label (flab1);
  return;
}
gen_jump (flab2 = getlabel ());
generate_label (flab1);
statement (NO);
generate_label (flab2);
Na prvom riadku sa inkrementne počítadlo labelov. Potom funkcia test vyhodnotí výraz a vygeneruje trojicu inštrukcií mov a,h a ora l a jz flab1. Nasleduje volanie statement, čo je spracovanie nula alebo viacerých príkazov, ktoré sa majú vykonať ak je podmienka splnená. Kompiler hneď generuje zodpovedajúce inštrukcie ak nájde príkazy. Potom sa testuje, či je prítomná else vetva. Ak nie (podmienka je vtedy splnená) tak sa vygeneruje sa flab1 pre funkciu test, ktorá už generovala jump na tento label. Return už len skončí. Ak ale máme aj vetvu if, tak sa generuje jump flab2, ktorý obskakuje vetvu if. Za týmto jumpom sa až vygenruje flab1 pre test zo začiatku metódy. A logicky sa volá statement, aby sa vygeneroval kód pre všetky príkazy v else vetve. Potom už konečne ide label2 pre obskakovací jump. Jednoduché že ?

Friday, February 22, 2013

SCC7. SmallC - symbol table

Napísať kompiler nie je jednoduché, pretože je to komplexná úloha. Je treba porozumieť viacerým častiam, ako napr. parser, generátor kódu, vyhodnocovanie výrazov a dátové štruktúry. Keď to zase na druhej strane všetko do seba zapadne, tak to konečne začne dávať zmysel. Ústredná dátová štruktúra každého kompileru je symbol table.
Symbol table je dátová štruktúra, kde kompiler zhromažďuje informácie o premenných (prípadne metódach, triedach..).
struct symbol_table {
  char name[NAMESIZE]; // symbol name
  int identity; // variable, array, pointer, function
  int type; // char, int
  int storage; // public, auto, extern, static
  int offset; // offset
}
Názov premennej je jasný. Identity hovorí, o čo sa jedná. Či o premennú, pole, pointer alebo funkciu. Type je zase jednoduchý, SmallC má len int a char. Hmm ja už som pridal unsigned int, unsigned char a struct :$
Storage súvisí s tým kde deklarujeme premennú, prípadne aky modifier použijeme. V C platí pravidlo, že premenné definované mimo metód sú globálne a statické. Premenné vnútri metód su lokálne a dočasné. Zanikajú po návrate z metódy. Celé to ešte komplikujú slová extern a static. Posledná položka má viac významov. U polí označuje veľkosť. U lokálnych premenných relatívnu pozíciu na stacku.
Je potrebné mať dve takéto tabuľky. Jednu pre globálne informácie. Tá sa plní a používa počas prekladu celého programu. Druhá je pre lokálne premenné. Vyprázdni sa vždy pred spracovaním funkcie.
A ako to funguje ? Pri deklarácii napr. int a; mimo metódy sa uloží do globálnej table patričná informácia. Potom ak v nejakej metóde nájdeme napr. výraz a=3; tak kompiler si nájde "a". Najskôr hľadá v lokálnej symbol table. Ak tam "a" nenájde hľadá v globálnej symbol table. Tým je garantované zakrývanie globálnych premenných lokálnymi s rovnakým názvom. A v našom prípade napr. nájde "a" v global symbol table. Takže vie, že je to int a má svoje miesto v pamäti na labeli a:
A preto vygeneruje inštrukcie: lxi a, 2 shld a

Thursday, February 21, 2013

SCC8. SmallC - ukladanie premenných

Keď som už ukladanie hodnôt do premenných v minulých blogoch načal, tak dám aj jeden príklad. Pozrieme sa ako sa narába s rôznymi typmi premenných. Vždy keď je treba uložiť hodnotu do nejakej premennej je volaná táto metóda.
store(LVALUE *lval) {
   if (lval->indirect == 0)
     gen_put_memory (lval->symbol);
   else
     gen_put_indirect (lval->indirect);
}
Je tvorená jedným if, ktorý sa pozrie, či narábame s pointerom, alebo s premennou. Presnejšie povedané, môže ísť o pointer. Ale nie o premennú nepriamo referencovanú pointerom. Podľa toho zavolá ďalšiu metódu. Ak sa jedná o premennú, je to jednoduché.
void gen_put_memory(SYMBOL *sym) {
   if ((sym->identity != POINTER) && (sym->type & CCHAR)) {
     output_line ("mov \ta,l");
     output_with_tab ("sta \t");
   } else {
     output_with_tab ("shld\t");
   }
   output_string (sym->name);
   newline ();
}
Tu je zase len jeden if. Ten sa pozerá, či je veľkosť byte alebo int. Aj pointer má veľkosť ako int. Ak je to teda byte, tak sa vygeneruje STA. Ešte predtým sa vygeneruje inštrukcia na presun low byte z primary registra do akumulárora. Ak sa jedná o dva byty, tak sa vygeneruje SHLD. Nakoniec sa vygeneruje label, pre inštruckie STA/SHLD. Label je miesto, kde má premenná rezervované miesto pomocou DB, DW.

Teraz sa pozrime na premenné nepriamo referencované pointerom.
void gen_put_indirect(char typeobj) {
   gen_pop ();
   if (typeobj & CCHAR) {
     output_line("mov \ta,l");
     output_line("stax\td");
   } else {
     if (uflag) {
       output_line("shlx");
     } else {
       gen_call("ccpint");
     }
   }
}
Ako prvý máme POP DE. Prečo ? Pretože v primárnom registri máme hodnotu premennej a na stacku máme jej adresu. Ciže hodnotu kam ukazuje pointer. Je to takéto jednoduché, pretože používame koncept primárneho registra. Potom sa zase rozhodujeme podľa hodnoty zo symbol table, či ide o byte alebo o int. V prípade byte je to klasika, vygenerujeme inštrukciu STAX D.

V prípade, že sa jedná o int sa ešte rozhodujeme, či chceme používať nedokumentovanú inštrukciu CPU 8085. SHLX uloží hodnotu v HL na adresu v DE. Ak sa chceme držať dokumentácie, prípadne generujeme kód pre CPU 8080, je to komplikovanejšie. Musíme volať maličký podprogram, ktorý urobí to isté ako jediná inštrukcia v 8085. Vyzerá takto.
; store int from HL into (DE)
ccpint: mov a,l
stax d
inx d
mov a,h
stax d
ret

Wednesday, February 20, 2013

SCC9. SmallC - výrazy

Toto je najťažšia časť kompileru. Nedá sa popísať jednoducho, preto len jednoduchý popis. Každý operátor má nejakú prioritu a asociativitu. Operátory sú rozdelené podľa priorít. Každej priorite zodpovedá jedna metóda hier1 až hier9. Implementované sú v súbore expr.c a primary.c. Každá funkcia hier1 až hier9 okamžite volá nasledovnú funkciu s vyšším číslom a teda aj vyššou prioritou. Výraz sa začne vyhodnocovať v expr() a potom sa rekurzívne zostúpi cez hier1, hier2 .. hier9 až do primary. Tu sa zistí aký operand máme, vyhľadá sa v symbol tabuľke a nastaví sa jeho typ a ukazateľ na tabuľku. Zároveň sa vráti 0 ak už bol v primary vygenerovaný kód ktorý načítal hodnotu do primárneho reg.páru. Až pri stúpaní (return) cez rekurzívne volania sa porovnáva aktuálny operátor s príslušným operátorom funkcie. Ak sa nájde zhoda, vyhodnocovanie sa začne na tejto úrovni a ako prvé sa zase zavolajú všetky funkcie s vyššou prioritou. Prečo ? Preto aby sa zabezpečilo prednostné a tým aj správne vyhodnotenie operátorov s vyššou prioritou.

A to je koniec. Najlepší spôsob ako sa zoznámiť s kompilerom, je študovať kód a skúšať ho zmeniť. SmallC ešte stále nie je plnohodnotný C kompiler, pretože nemá podporu typov long a float. Ďalej nepodporuje viac ako jednorozmerné polia a viac ako jednu úroveň indirekcie. Hoci sú to málo používané vlastnosti, ich implementácia je veľmi pekná a zaujímavá úloha.
Zopár linkov: http://compilers.iecc.com/crenshaw/ http://www.orangetide.com/smallc/book/chaps/toc1.htm http://www.amazon.com/The-Small-Handbook-James-Hendrix/dp/0835970124

Tuesday, February 19, 2013

XT mánia 1. PP-06

Bolo to už dávno. Chodil som na výšku a v Bratislave práve rušili BEZku. Kamarát sa mi nezištne pochválil, že tam práve kúpil PC za 1300Kčs. Okamžite som poprosil mamu či by mi nedala na počítač :-)

Nebolo to až tak celkom ružové. V tej dobe sa predávali už 386ky. Stáli 40000Kčs, prípadne viac. Mali cca 4MB RAM a 80MB HDD. To bolo ale úplne mimo mojich možností a povedzme si to úprimne, ani chuť nebola vraziť také veľké peniaze do "hračky". PC v BEZ neboli 386ky. Neboli to ani 286ky. Boli to PC/XT kompatibilné stroje zo SlušovícZávodov výpočtovej techniky Banská Bystrica, alebo Tesla Bratislava (neviem čo je správne) s označením PP-06. A to nebolo všetko. Tá nízka cena bola preto, lebo boli nefunkčné. Síce fungl nové, ale nefunkčné. Takže som jedného dňa prišiel do BEZ a na dražbe som sa prihlásil, že mám záujem o jeden kus s HDD. Tie boli drahšie. Odvtedy sme sa asi do seba zamilovali. Dodnes na tú svoju PP-06 spomínam so slzou v oku. Dôvod bude najskôr v tom, že to bol môj prvý počítač. Už žiadne návštevy u kamarátov. Alebo poobedia v škole. Tento počítač bol môj vlastný. Ako už Jirko z nostalcomp vtipne poznamenal "moje první láska". Ale podobne ako aj u neho, skutočne prvý počítač na ktorom som mohol pracovať (a hrať sa) bolo PMD-85.

Moja PP-06 mala viac závad. Po zapnutí sa nič nedialo. Kamarát niekde zohnal schému zdroja. Tak som ju dva dni študoval, kým som pochopil ako funguje spínaný zdroj. Potom už to bolo na istotu. Výmena tranzistora a PP-06 sa rozsvietila. V BEZ som ešte vydražil aj terminál. To kvôli zelenej obrazovke. Terminál sa vykuchal až z neho ostala len obrazovková časť. ASCII logika išla preč. Ja som mal ten hnedý bratislavský vľavo. Mal špičkovú obrazovku so zeleným fosforom s dlhým dosvitom. Veľmi ergonomické. Blikanie obrazu som neriešil.



Po naladení obrazu som konečne videl RAM test ale čo to ? Niekde je vadný čip RAM. Našťastie sa to z toho výpisu dalo pomerne jednoducho identifikovať. Myslím, že ten správny čip som vyletoval na druhý pokus :-) A zrazu to fungovalo. PC za 1300Kčs nabootovalo do DOS5.0 Síce mal HDD Kalok z celkovej kapacity 20MB dohromady 6MB vadných blokov, ale to nevadilo. 14MB bola pre mňa obrovská kapacita. Veď taký Manic Miner mal iba 32kB :-)

PP-06 mala aj zopár socialistických vymožeností. Disketové mechaniky s kapacitou 360kB (40 stôp, 9 sektorov) boli maďarskej alebo poľskej výroby (RVHP). Častokrát nevedeli čítať ani sami po sebe. Ja som mal šťastie, na rozdiel od kamaráta sa mi ušli poľské mechaniky a jedna z nich vedela čítať aj z väčšiny 1.2MB mechaník (80 stôp, 15 sektorov) na 386kách. A samozrejme zbernica. Nebola to ISA ale slušovický neštandard. Karty z bežných PC sa dali použiť len cez adaptér na ISA. A ktorý počítač má dnes na zadnej strane normálnu elektrickú zásuvku určenú na montáž do steny ? Ktorý počítač má dnes v sebe ventilátor určený do digestorov v paneláku ? Na 220V s výkonom dimenzovaným na odsatie dymu z celej kuchyne. Keď sa zapol, mal som pocit, že už už to vzlietne do vzduchu. A ktorý počítač má dnes na zadnej strane laboratórny skrutkovací konektor na banánik, určený na pripojenie zemniaceho vodiča ? A taký drobučký páčkový vypínačík, asi do nejakej nočnej lampičky ? Takže tak, PP-06 je jedinečná :-)


Technické špecifikácie:
RAM 640kB
CPU 8088, 4.77Mhz
2x FDD 5.25" 360kB
HDD MFM 20MB
CGA 16kB, 80x25 znakov 16 farieb, 320x200 bodov 4 farby, 600x200 2 farby
1x sériový, 1x paralelný port


Pekné fotky a viac info sa dá nájsť na:
litildivil.cz
vcfed.org

Monday, February 18, 2013

XT mánia 2. TurboXT

PP-06 je "moje první láska" ale kto by už len dnes chcel mal na stole hučiacu, fučiacu, 20 kilogramovú obludu s rozlohou menšej autodráhy ? Priznávam sa, keby som bol skôr objavil PP-06 tak si ju asi znova kúpim. Ale osud to chcel inak. Na aukro som zbadal motherboard (mobo) z Mazovie 1016. Keď som ju pripojil na zdroj tak nešla. Ale prehliadkou som rýchlo zistil, že niekto vyletoval obidva kryštály a kapacitný trimmer. Dosť barbarské, zničiť mobo kvôli dvom kryštálom. Kúpil som ich, zaletoval, pripojil, zadržal dych a ... išla.

http://pl.wikipedia.org/wiki/Mazovia_1016

Čo je Mazovia 1016? Je to niečo ako poľské PP-06. Ale Poliaci išli na to inak. Namiesto vlastného vývoja nekompatibilnej zbernice a vlastných dosiek sa dohodli s Taiwanom. Taiwan investoval v 80tych rokov veľa peňazí do počítačového priemyslu. Výsledkom okrem iného boli vynikajúce Turbo XT mobo, ktoré sa vyrábali v mnohých variantách. Vyvinuli k nim aj vlastný ERSO BIOS.



Táto mobo je vo formáte AT. Je to ten formát, v akom sa vyrábali počítače až do časov Pentium II. Čiže sieťový vypínač vpredu na skrinke, niekedy 7-segmentový dvojmiestny LED display, ktorý ukazoval takt CPU. Ďalej Turbo tlačítko a Reset tlačítko. Zdroj je priamo pripojiteľný na mobo. Tri ledky: zelená power, žltá turbo, červená hdd. 8 slotov a DIN konektor na klávesnicu. Kedysi boli takýchto počítačov tony. Ja som mal jednu skrinku aj s fungujúcou 386. S ťažkým srdcom som 386 dosku vymontoval a namiesto nej dal do skrinky Mazoviu. Na displayi mi pekne svieti 5 alebo 8. Tá 5 nie je presná, ale 4.77 ten display skrátka nevie. Bodku tiež nemá. Takže som zaokrúhľoval :-)



CGA síce akosi patrí k PC/XT, ale kto by chcel na stole veľký starý monitor ? Preto mám v Mazovii VGA kartu. V XT sú ako je vidno z obrázku iba 8-bitové ISA sloty. To je trošku problém. VGA kariet do 8-bitového slotu sa veľa nevyrábalo. Ale niektoré 16-bitové karty fungujú aj v 8-bitovom slote. Tá zadná menšia časť ISA konektora jednoducho trčí do prázdna, nie je zasunutá. VGA je pripojená do veľkého FullHD LCD, ktorý mi slúži na pracovnom PC. Vyzerá to zaujímavo :-)

Ďalší problém sú HDD. Do XT sa vyrábali MFM disky s 8-bitovými radičmi. Sem tam sa ešte stále dajú kúpiť. Lenže sú "trošku" hlučné. Asi takto:



Toto sa ozaj nedá počúvať dlhodobo a hlavne nie večer o desiatej keď je počuť aj špendlík padnúť na zem. Preto som si vyrobil XT-IDEv2 kartu. IDE do XT sa síce kedysi vraj v minimálnom množstve vyrábali, ale dnes sú prakticky nezohnatelné. Ale partii nadšencov z vintage-computer.com to nebránilo, vyvinúť a nekomerčne ponúkať nový design XT-IDE po najmenej 20 rokoch od skončenia výroby poslednej karty. Na jednom kanáli je HDD 800MB (menšie sa už fakt zle zháňajú) a na druhom CF karetka. CF je zasunutá vzadu v sockete do ISA slotu. Tým je aj jednoducho vyriešený prenos údajov medzi modernými PC. Prenášať 20MB cez diskety je už historický šport.

Ako posledné (zatiaľ) som riešil diskety. 5.25 palcové 360kB diskety sú nepraktické a vzácne. A zase sú tu nadšenci z vintage-computer. Vyrába sa aj Sergeyove FDC a pripravuje sa výroba XT-FDC. Podporuje bez problémov 3.5 palcové 1.44MB a 5.25 palcové 1.2MB mechaniky.

Ešte by som rád doplnil tretiu mechaniku 5.25" 360kB nech mám všetky formáty v jednom PC. A ako nesplnený sen zatiaľ vidím CGA kartu s výstupom na VGA LCD monitor.

Sunday, February 17, 2013

XT mánia 3. Commodore PC

V Nemecku kedysi vyrábané a v Nemecku veľmi populárne boli PC od firmy Commodore. Málokto o nich vie, pretože Commodore sa hlavne spája s najvyrábanejším počítačom všetkých čias s C64. Je to zaujímavé, ale práve PC ktoré mali grafické a zvukové možnosti o triedu horšie ako C64 zlomili Commodoru krk. Asi rozhodlo to, že 640kB RAM musí stačiť každému ;-)

http://en.wikipedia.org/wiki/Commodore_PC_compatible_systems
http://de.wikipedia.org/wiki/Commodore_PC-10_bis_PC-60

Ja mám dva. Prvý je Commodore PC10-II. Je to PC/XT klon, plne kompatibilný. Motherboad je z jedného kusu (na rozdiel od Commodore PC10 kde je delená na dve časti) a má voľných 5 ISA slotov. Má integrovaný floppy(360kB) a XTA (8-bitové IDE) controller.

Druhý je Commodore PC10-III. Je to PC/XT klon, plne kompatibilný. Má tri rýchlosti:
štandardnú - 4.77MHz
turbo - jeden a pol násobok 4.77Mhz
double - dvojnásobok 4.77MHz
Má integrovaný floppy(360kB) a XTA (8-bitové IDE) controller. Ďalej má integrovanú EGA/CGA kartu, Commodore Mouse port a jeden sériový a jeden paralelný port a real time clock. Má tri voľné ISA sloty.

Obdidva som vylepšil osadením VGA kariet, CF kariet namiesto hlučných MFM diskov a majú aj bootovateľnú 1.44MB mechaniku.