Sunday, December 8, 2013

XT Mánia 9. WiFi bigger box

WiFi Vonets krabička vyriešila problém osamoteného XTčka v pivnici. Lenže hore pri mojom stole mám na zemi okrem pracovného PC ešte aj druhé PC, a to XTčko v mini tower AT skrinke. Mám stôl obložený z každej strany :-)

A tu bola situácia podobná. Pracovné PC malo WiFi kartu v PCI slote. XT som mal pripojené cez kábel do pracovného PC, ktoré mu tak slúžilo ako gateway do internetu. Nie je to ideál, lebo ak chcem ísť na XT musím zapnúť aj pracovné PC. Inač by som bol bez internetu a teda aj služby aktuálneho času.

Včera sa mi podarilo rozbehnúť druhú variantu. Nie je celkom taká jednoduchá ako Vonets. Nedá sa vybaviť pár kliknutiami. Ale odmenou je, že mám na poschodí lokálnu sieť, ktorá je cez WiFi pripojená do už existujúcej domácej siete. Volá sa to client bridged. Čiže na poschodí mám počítače zosieťované cez kábel, a iba keď potrebujem ísť von z tejto lokálnej siete ide prenos cez WiFi. Je to vhodné napríklad aj na prenos veľkého množstva údajov. Kábel je rýchlejší. WiFi časť na hornom (na obrázku pravom) routri neslúži ako AP. V dome je stále iba jedna WiFi sieť. Router pracuje v pasívnom režime, svoju WiFi časť využíva ako náhradu za neexistujúci kábel medzi poschodiami. Existuje ešte aj Repeater Bridge režim. Je to isté ako Client Bridged, ale navyše pridáva ďalší AP, čo som ja nechcel.



http://www.dd-wrt.com/wiki/index.php/Client_Bridged

Základom je router, ktorý ma v sebe DD-WRT (alebo podobne funkčný) firmware. Ja konkrétne som skúsil TP-LINK TL-WR740N, ktorý sa dá v Alze kúpiť za 13,60- EUR bez DPH.



Podľa návodu na stránkach DD-WRT som mu preflashoval firmware. Tu nastal trochu zádrhel. Prestali blikať LEDky indikujúce konektivitu na LAN portoch. Myslel som si, že som v pr... že mám problémy. Ale WiFi stále blikalo, aj pripojiť sa dalo cez WiFi. Skrátim to, po nejakej dobe som zistil, že LEDky síce nesvietia ale konektivita tam stále je. Takže som to nakonfiguroval podľa návodu, a bum! Začalo to fungovať. Mám na pracovnom stole 5x lan prípojku a v každej z nich je internet.

Nakoniec sa mi podarilo vyriešiť aj zhasnuté LEDky pre indikáciu spojenia a aktivity na lan portoch. Google mi poradil firmware, ktorý nie je oficiálny. Je novší a LEDky s ním pekne svietia a poblikávajú.

Friday, November 22, 2013

XT Mánia 8. WiFi

Veľké, ťažké a hlučné desktop XTéčko Commodore PC10-II so zeleným monitorom mám v pivnici. Je to fakt opacha a nosiť po schodoch sa mi ju nechce. Navyše hore ani nemám voľný stôl kam by som ju položil. Lenže odkedy mám v XTéčkach sieťové karty a využívam ich, bol som obmedzený dosahom kábla. V dome mám síce WiFi ale XTčko som musel pripájať cez kábel. Už nemusím. Teraz sa v pohode pripojím z notebooku na XT bez jediného kábla.

Viem, že nie som prvý kto to riešil, tak moje riešenie možno niekomu pomôže. To riešenie sa volá Vonets VAP11G bridge. Predáva sa na eBay okolo 20,- USD. Používa sa na pripojenie IP kamier, inteligentných televízorov a podobne do WiFi siete. Funguje aj s XT a mTCP balíkom :-)



Vonets je malá modrá ľahučká krabička. Má jeden RJ45 kábel. Napájať sa dá cez redukciu z USB. (kde by XT vzalo USB ??) Alebo cez vlastný napájací kabel, alebo a tak to napájam ja, cez jack. Rozsah je vraj 5-15V. Ja mu dávam 9V.



Podporuje aj WPA-PSK šifrovanie. Pred prvým použitím, je ho nutné pripojiť k nejakému Windows PC. Dodávaná konfiguračná utilita, umožňuje vyhľadať WiFi, zvoliť si prípadne IP adresu, zadať heslo a je to. Nakonfigurovaný Vonets sa potom pripojí do ethernet portu v XT sieťovej karte. Privedie sa napájanie a za pár sekúnd sa pripojí na WiFi. Od tejto chvíle je XTčko v sieti. Je treba zvoliť zodpovedajúcu IP adresu, gateway a DNS. Funguje parádne.



Hneď po štarte si stiahne aktuálny čas a dátum. Sťahovanie z internetu ide rýchlosťou cca 26kB/sec. Rovnakú závratnú rýchlosť dosahujem aj keď si presúvam obsah na disk XTčka z PC.

Monday, November 4, 2013

XT Mánia 7. CGA snow

Za starých časov, keď PP-06 bol môj jediný a prvý computer, som mal na jeho CGA kartu pripojený zelený monitor. A užíval si dnes už legendami opradený CGA snow - sneženie. Ale nie, neužíval. Vtedy som to za prvé ani nevnímal. A za druhé som to bral ako niečo čo tam má byť. Nie ako nepodarok, ktorý IBM nikdy nemalo pustiť do sveta.

Pred cca rokom som zohnal Commodore PC10-III s integrovanou CGA grafikou na mainboarde. Nedočkavo som kúpil zelený monitor a zapol to. Sláva zase som po dlhej dobe videl starý známy 8x8 font, ktorý som kedysi tak miloval. Ale nebolo to 100%.

Niečo tomu chýbalo. Trvalo mi dlhšie, kým som na to prišiel. A potom mi to doklaplo, veď tam nevidím sneženie !! CGA v PC10-III už je vylepšená, má odstránený snežiaci efekt. Podobne, aj mnohé CGA klony nesnežia. Týka sa to hlavne krátkych kariet.

Poznáte aké to je s fanatikmi. Nebol som spokojný. Nebol som spokojný až .. Dnes mi prišla na eBay kúpená dlhá karta. Presne zapasovala do druhého Commodora PC10-II. Pripojil som ju a výsledok môžete obdivovať na videu :-) Je to proste paráda !



NC som vybral preto, lebo tam je to sneženie ozaj výdatné :-)

Monday, August 12, 2013

XT Mánia 6. Ethernet

Keď som mal svoj prvý počítač, čiže slušovickú kópiu IBM PC/XT s označením PP-06, nikdy mi nechýbal internet. Všetko sa vtedy ešte prenášalo na disketách. A 5.25 palcová disketa bola celkom bežná. Na škole sme mali internet, ale nie ako dnes. Vtedy bola celá škola pripojená cez jednu linku - modem 33kbps. Netscape už tuším existoval, ale len vo verzii 1.0. A nikto ho nepoužíval. Na internet sme chodili ťahať. Či už texty piesní (lyrics) alebo nejaké softy. A na to sa používalo FTP. Dodnes si spomínam na učebňu plnú študákov, ako každý sedí za X terminálom a prezerá cez FTP kyberspace. Potom to už išlo rýchlo. Prišli Windows 3.11, netscape a WWW sa stalo normou.

Dnes je internet aj na XT :-) Je potreba software a hardware. Mike Brutman z vintage-computer napísal veľmi pekný balík mTCP. Minimálna konfigurácia je CPU 8088. mTCP obsahuje DHCP, Telnet, FTP, IRC, Ping, Netcat, SNTP a HTGet. Ďalej je treba sieťovú kartu. 8-bitové ISA karty nejaké existujú, ale nemajú RJ45 konektor. Väčšinou majú AUI a BNC konektory. Ja som zvolil 16-bitovú kartu s čipom Realtek a RJ45 konektorom. K tejto karte existuje aj PacketDriver. PacketDriver je nevyhnutný, pretože mTCP komunikuje s kartami práve cezeň. Realtek karty majú vždy možnosť konfigurácie cez DOS utilitu a niekedy sa dajú nastavovať aj jumprami. Moje karty som nastavil na IO adresu 320h, aby nekolidovali s XT-IDE kartou. IRQ som nastavil 5.

Po konfigurácii karty a úspešnom nahraní PacketDrivera už môžeme používať mTCP. mTCP potrebuje konfiguračný súbor s IP adresou, adresou gateway a DNS servera.

SNTP
A takto to vyzerá v praxi. Po boote si na PC/XT ktoré nemá RTC získam aktuálny čas cez službu SNTP.


FTP klient
FTP funguje ako zvyčajne. Akurát na ftp.funet.fi už žiadne lyrics nie sú. Ale server stále aj po toľkých rokoch žije.


FTP server
Veľmi užitočný je aj FTP server. Komfortne sa dá napríklad odzálohovať celý disk. Určite je to rýchlejšie ako prenos cez diskety :-) Na strane Windows používam TotalCommander.


SLIP
Je možné mať internet aj bez sieťovej karty. Prenosy idú cez nullmodem kábel. Je treba použiť PacketDriver pre sériový kábel. Ale na druhej strane musí byť linuxový stroj. Bližší popis je v slip.txt v balíčku mTCP.

Thursday, May 23, 2013

SCC11. SmallC - PMI80

Neuveriteľné (pre mňa) sa stalo skutočnosťou. Na jednodoskáči s klávesnicou a sedemsegmentovým displayom beží program napísaný v C. Trocha to rozpíšem. Jedná sa o PMI80. Ten program v C sa samozrejme nezadáva cez klávesnicu a ani sa nekompiluje na PMI80. Program sa kompiluje pomocou SmallC na PC a napáli sa do EPROM. Je to o dosť zdĺhavejšie ako mať k dispozícii veľkú RAM a sériový bootloader. Práve preto som kedysi postavil NCB85.

Tu beží program v C
Istý Jakub si na aukro.cz kúpil toto PMI80 z obrázku. A nedalo mu to, skúsil na ňom C spôsobom ako som opísal. A nutno povedať, že s úspechom.


Data a Code segmenty
Pri preklade do RAM je vcelku jedno, kde sa nachádza program a kde premenné. Iné je to ale pri použití ROM. Program je v ROM, pretože jeho obsah je pevne daný a nemení sa. Ak teda zrovna nepoužívame samomodifikujúci sa kód. Ale premenné musia byť v RAM. Na toto majú assemblery možnosť definíce dátového a kódového segmentu alebo aj ďalších segmentov. Linker potom priradí každému segmentu adresu a vygeneruje správne skoky a návestia. Ja som nazval v SmallC dátový a programový segment takto:
Programový kód je umístěn do oblasti uvozené:
.area SMALLC_GENERATED (REL,CON,CSEG)
globální proměnné pak do:
.area SMALLC_GENERATED_DATA (REL,CON,DSEG)
Jakub poslal aj popis ako sú uložené dáta a program.
Lokální proměnné jsou jako obvykle umísťovány na stacku. Pro použití s PMI-80 je potřeba oblast SMALLC_GENERATED_DATA přesměrovat někam mezi adresy 0x1c00 a 0x1fff, kde je jediný 1KB RAM (přičemž je třeba mít na zřeteli, že od konce RAM směrem dolů roste stack). Já programová data umísťuji od adresy 0x0800 kde na mém upraveném PMI začíná třetí KB ROM a je to začátek druhého EPROM čipu. Programy do PMI dostávám pomocí mazačky a programátoru EPROM. Majitel neupraveného PMI bude muset linkovat na adresu 0x0400, nebo také do RAM (ale opravdu jí není mnoho). Já zatím do RAM program nelinkoval, protože stejně zatím nemám žádný loader, kterým bych ho bez použití naprogramované EPROM dostal na místo.
takto vyzerá výpis na display
update_disp(mpx,seg)
   unsigned char mpx;
   unsigned char seg;
   {
     mpx;
#asm
     mov b,l
#endasm
     seg;
#asm
     mov a,l
     out 0xF8
     mov a,b
     out 0xFA
#endasm
   }
a takto krátený hlavný program
for (a = 0; a < 37; a++) { //pres celou tabulku znaku v kodu monitoru
   disp_buff[0] = (a >> 4) & 0x0f;
   disp_buff[1] = (a ) & 0x0f;
   disp_buff[2] = PMI_CH_equal;
   bin2bcd(a, &disp_buff[3]);
   disp_buff[6] = PMI_CH_equal;
   disp_buff[7] = PMI_CH_equal;
   disp_buff[8] = a;

   for (c = 0; c < 100; c++) {
     for (b = 0; b < 9; b++) {
       update_disp(~b, seg_data[disp_buff[b]]);
       delay(10);
     }
   }
}
C na PMI80. Kto by si to bol kedy pomyslel ? Kto by mal záujem o podobné hrátky bude sa musieť spojiť s Jakubom. Ja PMI80 nevlastním ;-)

Saturday, May 11, 2013

SCC.10 printf

printf je užitočná a pomerne silná metóda, ktorá je prítomná v prekvapujúco veľa jazykoch. Okrem iných aj Fortran, Cobol, Java, PHP, Perl .. Mňa na nej vždy fascinovalo to, že má premenlivý počet parametrov. Napríklad:

printf("V zivote je %d dobrých vecí, hlavne %s stojí za to", my_number, her_name);

V tomto prípade má 3 parametre. Prvý je string obsahujúci formattery a nasledujú hodnoty pre formattery. Prvý je číslo ktorá sa zobrazí v decimálnom tvare a druhý parameter je string ktorý sa len prekopíruje na zodpovedajúcu pozíciu. Dlho som si lámal hlavu nad tým, ako len môže byť printf napísaný ... Veď čo ak by tie parametre boli štyri alebo povedzme sedem prípadne iba jeden ? Dosť záhadné :-)

Tajomstvo printf je jednoduché. C robí PUSH parametrov metódy na zásobník v opačnom poradí. Najskôr sa PUSHne posledný param a potom druhý od konca a tak ďalej. Až na koniec sa PUSHne prvý parameter. A to znamená, že sa nachádza hneď nad návratovou adresou, ktorú PUSHlo volanie našej metódy CALL printf

Preto stačí v implementácii printf získať obsah dvoch byte nad aktuálnym SP. To bude pointer na string obsahujúci formattery. A sme doma :-) Pretože z toho stringu už vieme zistiť koľko parametrov má naše volanie printf. A každý z nich sa nachádza zase o dva bytes vyššie.

Metóda printf nie je súčasťou SmallC, ale nie je problém ju napísať. Ja sa na to chystám už mesiac ;-) Sú tu ale dve veci. Dobrá a zlá. Zlá správa je, že v SmallC sa parametre volania ukladajú na stack v opačnom poradí ako je špecifikácia C. Čiže pascalovským spôsobom a tým pádom bude formátovací string najďalej od SP. Takže sa to nedá ? Ale dá, je tu aj dobrá správa. SmallC vie posielať do volanej metódy okrem parametrov (ktoré su PUSHnuté na stacku) aj počet parametrov. Posiela sa v ACC. Takže SmallC implementácia bude neštandardná. Počet parametrov si nezistí sama, ale bude sa spoliehať na číslo v ACC.

Aby to bolo úplne cool, bolo by fajn napísať to celé v ASM. Ak by to niekto chcel urobiť, môžem mu poslať nejaké podklady.

Saturday, April 13, 2013

XT Mánia 5. Real Time Clock

Počítače rady XT nemajú batériu, CMOS RAM a ani čip hodiniek a kalendára. To zase nie je až také zlé, pretože už som videl zopár zničených dosiek triedy 286/386 keď vytiekla kyselina z NiCd akumulátora. Letovať akumulátor na motherboard nebol dobrý nápad. Neskôr neviem od kedy, sa začali dávať batérie CR2032, ktoré už sú bezpečné. Takže som riešil problém ako dostať do mojeho XT hodinky a kalendár. Prišiel som na tri riešenia, ale určite ich je viacej. Jedno z riešení je dokonca použiteľné aj pre NCB85.

8-bitová ISA karta
Pôvodne som chcel kúpiť nejakú 8-bitovú ISA kartu s držiakom na CR2302 a CMOS kalendárovým čipom. Lenže na eBay som videl iba jednu a aj o tú sa strhla bitka a vyfúkli mi ju. Potom som sa popýtal na vintage-computer.com fórume a nikto žiadnu neponúkol.

dClock
Jeden člen z USA mi ponúkol nasledovnú vecičku. Volá sa to dClock a stálo to "len" 59.95 USD v roku 1985 ;-)

Mňa to vyšlo aj s poštovným na menej ako polovicu v dnešných USD. To sa dá. Jedná sa o takzvaný "no-slot clock chip". V tomto prípade je to v podstate ISA karta, ktorá ale nezaberá jeden slot. Namiesto toho je zapojená do socketu pre CPU. Tie čipy okolo sú v podstate ISA logika. Dostal som to originál zabalené a čo bolo dôležité, aj s návodom. Návod obsahuje printing dvoch programov v BASICu, ktoré treba ručne naťukať. Tu je pre ukážku jeden z nich.
10 FOR I%=1 TO 13
20 X=0
30 FOR K%=1 TO 10
40 READ J$
50 X=X+VAL("&H"+J$)
60 NEXT K%
70 PRINT X
80 NEXT I%
90 INPUT "IS DATA OK (Y/N)";ANS$
100 IF ANS$="Y" OR ANS$="Y" THEN RESTORE:GOTO 110
105 END
110 OPEN "READDCLK.COM" AS #1 LEN=1
120 FIELD #1,1 AS C$
130 FOR I%=1 TO 130
140 READ J$
150 LSET C$=CHR$(VAL("&H"+J$))
160 PUT #1, I%
170 NEXT I%
180 CLOSE #1
190 SYSTEM
200 DATA EB,02,90,0A,BC,F0,00,B7,0C,E8
210 DATA 3C,00,32,ED,80,F9,50,7D,03,80
220 DATA C1,64,81,C1,6C,07,51,E8,2A,00
230 DATA 51,E8,26,00,58,8A,D1,8A,F0,59
240 DATA B4,2B,CD,21,FE,CF,E8,17,00,80
250 DATA E9,50,8A,E9,E8,0F,00,51,E8,0B
260 DATA 00,8A,F1,32,D2,59,B4,2D,CD,21
270 DATA CD,20,B3,02,BA,C0,06,8A,E0,8A
280 DATA C7,0C,C0,EE,EB,01,90,24,4F,EE
290 DATA 90,B0,60,EE,32,C0,8A,C8,EC,24
300 DATA 0F,3A,C1,75,F7,FE,CF,FE,CB,75
310 DATA DB,32,C0,EE,8A,C4,32,E4,2E,F6
320 DATA 26,03,01,02,C8,C3,00,00,00,00
Tieto programy po spustení vyrobia na disku dva COM súbory. Jeden má dĺžku 120-bytes a druhý 130-bytes. Samozrejme v DATA sú strojové inštrukcie. Jeden program číta čas a dátum z čipu a zapíše ho do systémových premenných. Druhý program zapíše systémový čas a dátum do čipu.

DS1216E
Tretia možnosť je čip DS1216E. Jedná sa tiež o "no-slot clock chip" ale neosádza sa do socketu pre CPU. Osádza sa do 28-pinového socketu pre ROM. A to je to zaujímavé, pretože tým pádom by pasoval aj pre ROM socket na NCB85.

Ako vidno na obrázku, jedná sa o priechodzí inteligentný socket zálohovaný Lion batériou. Podľa ohlasov má táto batéria životnosť minimálne 10 rokov. Cena je na prvý pohľad šialená. Farnell zaň pýta 30 EUR. Na eBay sú aj lacnejšie, ale sú z číny a pravdepodobne sa bude jednať o 10 a viac rokov staré čipy s batériou na konci životnosti. Ktovie, možno by sa dali tie sockety ešte zachrániť, niečo na spôsob záchrany clock čipov DS12887.

http://www.mcamafia.de/mcapage0/dsrework.htm

http://www.oocities.org/markuskauer/rtc.html

V každom prípade, DS1216E sa stále vyrába a nie je End of Life. A ako to funguje ? V normálnom režime je inteligentný socket pasívny. Všetky signály sú priechodzie a ROM je k dispozícii systému. Pritom ale socket stále dáva pozor čo sa deje na adresovej zbernici. Ak detektne určitú sekvenicu adries, vie že komunikujeme s ním. Vtedy odpojí zasunutú ROM a začne zapisovať alebo čítať z/do kalendároveho čipu. Že sa jedná o ROM socket a nemáme k dispozícii WRITE signál? To nevadí, tento socket interpretuje dianie na adresovej zbernici ako príkazy! Šanca na náhodnú aktiváciu inteligentného socketu je zanedbateľná. Konkrétne je to 1:2^64. Inicializačná sekvencia má dĺžku 64 adries.

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ě!

Saturday, March 2, 2013

XT mánia 4. XT-IDE BIOS a IDE karty

Počítače PC nikdy neboli predmetom lásky zberateľov a retro nálad. Dôvod bude asi v tom, že PC zatiaľ neumrelo a ani sa nechystá na odchod. Ale časy sa predsa len menia. Komunita začína brať na milosť triedu XT. Žeby to bolo, tým že je to s prižmurením obidvoch očí len 8-bit ? ;-)

XT-IDE BIOS

Ľudia okolo vintage-vomputer.com vytvorili hlavne v poslednom roku veľa úžasných vecí. Jedna z tých úžasných vecí je XT-IDE BIOS, aj keď ten zrovna už má asi tri roky. Neradno si ho zamieňať s XT-IDE kartou. Vzťah medzi nimi je taký, že XT-IDE karta potrebuje XT-IDE BIOS. Ale naopak to neplatí. Práve naopak, XT-IDE BIOS podporuje aj iné typy kariet.

XT-IDE BIOS má aj podporu bootovania cez UART. To je možné použiť ako poslednú záchranu ak na PC nefunguje už ani jedna disketová mechanika. Umožňuje emuláciu ktoréhokoľvek disku alebo diskety.

A to nie je všetko. Umožňuje nabootovať z ktoréhokoľvek disku na ktorýkoľvek disk. Vysvetlíme na príklade. Majme dve disketovky A: a B: a dva disky C: a D:. Ak mám systémovú disketu napr. 5.25" do mechaniky B: tak nie je problém nabootvať z nej. Pri zobrazení XT-IDE menu, stlačím klávesu B. Bios si prehodí disketové mechaniky a z B sa stane A a naopak. A potom natiahne systém z mojej 5.25". Paráda. A dá sa ísť ešte ďalej. Potrebujem nastaviť aktívnu partition na disku D ? Že to nejde ? Aktívne partície sa dajú nastavovať len na prvom disku. Lenže ak stlačím klávesy D a B stane sa nasledovné. Disk D sa prehodí s diskom C. Disk B sa prehodí s diskom A. Nabootojem z B a ako prvý disk mám D. A môžem mu nastaviť aktívnu partíciu. Bez otvárania počítača a prehadzovania káblov alebo jumperov.

IDE karty

IDE karty neboli vôbec bežné na PC/XT. IDE disky sú 16-bitové čo nefunguje na 8-bitovej ISA zbernici. Preto je do XT treba kartu, ktorá vytvorí 16-bitové rozhranie k disku. S IDE rozhraním pracujú aj CF karty a CF Microdrives. Lenže tieto zariadanie podporujú aj 8-bitové prenosy. A to už začína byť zaujímavé.

XT-IDEv2 karta je karta do 8-bitového ISA slotu. Obsahuje potrebné obvody na 16-bitové IDE rozhranie a má on-board BIOS. On-board EEPROM môže byť naprogramovaná cez DOS program. Podporuje disky do veľkosti 137GB (DOS 6.22 vie robiť s najväčším diskom 8.4GB). Má konektor na IDE kábel, na ktorý sa dajú pripojiť dva disky. Umožňuje použitie CF kariet cez adaptér.

XT-CF-Lite je karta do 8-bitového ISA slotu. Obsahuje potrebné obvody na 16-bitové IDE rozhranie a má on-board BIOS. On-board FLASH ROM môže byť naprogrovaná cez DOS program. Je postavená SMD technológiou, čo nie je vhodné pre úplných začiatočníkov v letovaní. Umožňuje pripojiť len CF karty alebo microdrives. Sergey práve navrhol jej klon, používajúci len klasické nožičkové obvody. Ale CF konektor sa nevyrába inak len v SMD, takže stále je tu problém povrchového letovania.


16-bit Multi-IO karta

Nakoniec sa dajú použiť staré bežne dostupné 16-bit ISA karty z AT počítačov bez on-board BIOSu. Jedná sa o rôzne typy, používali čipy Winbond, Prime, RMC atď. Zväčša obsahujú aj FDD controlér a veľmi výhodné je aj osadenie dvoch sériových a jedného paraleleného portu. Po použití takejto karty obsadíme iba jeden 8-bit ISA slot plus druhý na kartu s prídavným BIOSom. Tá menšia, prídavná časť ISA, čo je horný byte, ostane vo vzduchu. Je treba dávať pozor aby nedošlo k skratu s inými súčiatkami na motherboarde. 16-bitové IDE rozhranie má teda nezapojenú hornú polovicu a tým by sa dalo, že bude nefunkčné. Ale nie je to tak. Stále sa dá použiť ale, len v 8-bitovom móde. Takže stačí adaptér a dajú sa pripojiť CF karty a microdrives. Paráda.

ROM karta

Ako miesto pre prídavný BIOS potrebujeme ROM priestor. Dá sa použiť napríklad aj stará sieťová karta s ROM socketom, kam dáme naprogramovanú EPROM. Kto nemá programátor EPROM bude skôr hľadať niečo čo sa dá naprogramovať softwarovo. Na to vznikla FLASH ROM 8-bitová ISA karta. Pri zmene programu netreba otvárať počítač, stačí flashnúť (prakticky neobmedzene veľa krát) ROMku cez jednoduchý programík.

Friday, March 1, 2013

XT Mánia 5. FDC BIOS a disketovky

PC/XT vedelo pracovať s (malo podporu v BIOSe) mini disketami DS/DD o rozmere 5.25 palca s kapacitou 360kB (double sided - DS ,40 stôp a 9 sektorov, double density - DD). Tie boli vtedy najnovší výdobytok techniky a predstavovali obrovské vylepšenie oproti pôvodne 90kB 5.25" disketám (jednostranové, single density). Pokrokom v technológii hláv sa zvýšila hustota záznamu dvojnásobne a využitie aj druhej strany diskety zoštvornásobilo pôvodnú kapacitu. Okrem nich sa objavovali aj mikrodiskety s kapacitou 720kB. Jednalo sa o 3.5" palcové diskety s 80 stopami a 9 sektormi na stopu. Keď tie veľké sa volali mini diskety a tie malé sa volali microdiskety, čo potom boli diskety ? Tak tie asi veľa ľudí nevidelo. Boli to 8 palcové diskety s rôznymi kapacitami. Používali sa v celej možnej rozmanitej škále počítačov, ako to bolo na trhu normálne pred príchodom PC, ktorý zvalcoval všetko. Ich vek sa skončil s nástupom PC. Ja som sa s nimi stretol na počítači SM50/50. Kapacitu mali cca 80kB.

Lenže pokrok sa nedá zastaviť a veľmi skoro sa na už znormalizovanom PC trhu objavili High Density diskety. Využitím nového materiálu na magnetický záznam s vyššou koercivitou a teda aj vyššími prúdmi pri zápise sa mohla zase zvýšiť hustota záznamu. Zároveň sa zmenil dovtedy štandardný počet stôp u 5.25" mechaník zo 40 na 80. Tak vznikli dva nové formáty:
5.25" DS/HD mini diskety 1.2MB (80 stôp, 15 sektorov, double sided - DS, high density - DD)
3.5" DS/HD micro diskety 1.44MB (80 stôp, 18 sektorov, double sided - DS, high density - DD)


Diskety a mechaniky s kapacitou 1.2MB sa stali podľa môjho subjektívneho názoru najnepotrebnejším :-) vylepšením v dejinách PC. Spôsobovali problémy s čítaním na starších 360kB mechanikách, pretože sa nielen zvýšil počet stôp ale sa aj zúžila šírka hlavy na polovicu. Takže pri zápise na 360kB diskety sa neprepisovala celá stopa, ale len jej časť. Ak bola disketa naformátovaná na 360kB a potom sa zapísali údaje na 1.2MB mechanike tak to ešte šlo. Ale ak už obsahovala dáta zapísané na 360kB mechanike a potom sa niekto pokúšal zapísať dáta na 1.2MB mechanike, tak bolo zle. Došlo k tomu, že na pôvodnej širokej stope ostali aj pôvodné dáta (úzka hlava ich nemohla kompletne prepísať) a pribudli tam aj nové dáta zapísané na užšej hlave. Výsledok pri čítaní v mechanike 360kB bol ten, že sa človek musel veľa modliť ;-)

Občas sa dal vidieť aj ďalší hybridný formát, nazývaný quadruple density.
5.25" s kapacitou 720kB (80 stôp, 9 sektorov)

Jednalo sa o staré 360kB DD mini diskety, ale boli naformátované v high density HD mechanike s 80 stopami.

Diskety sa už prakticky nedajú kúpiť, v obchodoch len ak majú staré zásoby. Ale stále sa vyrábajú 3.5" floppy mechaniky. Dajú sa kúpiť dva druhy.
- externé USB mechaniky. Tieto ale v drvivej väčšine podporujú len 1.44MB formát
- interné mechaniky s integrovanou čítačkou kariet. Tieto podporujú aj DD diskety s kapacitou 720kB

A teraz späť k PC/XT. Kľúč k použitiu vysoko kapacitných disketoviek tkvie v addon BIOSe. Keď v základnom BIOSe tá podpora nie je, tak ju treba do PC/XT dodať. Robí sa to tak, že karta obsahuje okrem kontroléra aj BIOS.

Sergeyove FDC

Sergey Malinov je človek s vysokou produktivitou. Na vintage-forum sa vývoj nových kariet ťahá dlho. Robia sa testy a preprodukčné série. Nič pre netrpezlivých ľudí. Sergey si navrhne kartu a nechá vyrobiť PCB za pár dní. Jeho 8-bitová ISA FDC karta používa čip Intel 82077AA alebo National Semiconductor PC8477. Martin zistil, že varianta od National je oveľa lepšia, podporuje širšiu paletu rôznych formátov. Karta nemá veľa možností nastavovania a umožňuje pripojiť len dva mechanky.
Sergey tam navyše pridal jeden UART čo je vždy užitočné. Nastavovať sa dá I/O addresa v rozsahu: 3F8h, 2F8h, 3E8h, 2E8h. Nastaviť sa dá aj interrupt: IRQ3, IRQ4, IRQ5.

Silnou stránkou je BIOS. Sergey ho napísal tak, aby bol konfigurovateľný. Ako to dokázal na PC/XT bez CMOS RAM ? Jednoducho :-) Funguje to tak, že konfiguračné parametre sa ukladajú do EEPROM. Z toho dôvodu BIOS zaberá len rozsah 0000h-1DFFh. Od 1E00h vyššie ju časť určená pre konfiguračné dáta. Súčasťou BIOSu je aj konfigurátor s Menu a možnosťou uloženia konfigurácie do EEPROM. Vychádza z predpokladu, že sa používa EEPROM 2764. Na iných EPROM/EEPROM/FLASH čipoch nebude fungovať možnosť uloženia konfigurácie.


XT-FDC

XT-FDC je 8-bitová ISA karta, ktorá používa National Semiconductor PC8477B alebo DP8473 kontroléry. Podporuje až štyri floppy disky. Má aj konektor pre externú mechaniku, na ktorú bude možné pripojiť dve emchaniky. Bude podporovať aj 8" mechaniky. Práve (je koniec februára 2013) sa chystá výroba prvej várky PCB. http://www.vintage-computer.com/vcforum/showwiki.php?title=XT-FDC+Rev1
BIOS pre XT-FDC je .. ten istý, čiže Sergeyov FDC BIOS. EPROM môže byť 28C64 alebo 28C256.

16-bitové Multi IO karty + BIOS Rom karta

Ďalšia možnosť je používať 16-bitové široko rozšírené Multi/IO karty, ktoré sa montovali do počítačov so 16-bitovou ISA zbernicou. Čiže tie dobre známe karty z rôznych 286/386/486 tiek. Tieto karty nemajú on-board BIOS. Dôvod je, že už základný PC/AT BIOS obsahoval podporu HD mechaník. PC/AT už mali aj CMOS RAM pre konfiguráciu. Pretože floppy rozhranie je 8-bitové, aj tieto 16-bitové karty v skutočnosti používajú len 8-bitovú časť ISA zbernice. Väčšinou mali na sebe aj radiče pre dva sériové a jeden paralelený port. Tieto tiež používajú len 8-bitovú časť ISA a preto aj v PC/XT fungujú. Jediná 16-bitová časť na týchto kartách bol radič pre IDE hard disky.

Nič nebráni tomu, dať do jedného slotu takúto kartu a do druhého slotu prídavný BIOS. Ako miesto pre prídavný BIOS sa dá použiť aj napríklad stará sieťová karta s ROM socketom. Alebo sa dá použiť 8-bitová ISA ROM karta.

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.

Sunday, January 27, 2013

NCB85

Keď som sa rozhodol hrať so SmallC bolo mi jasné, že budem potrebovať niečo, kde by som mohol overiť vygenerovaný kód. Nazrel som do šuflíku so skromnými zásobami súčiastok. Mal som jeden SAB8085, dve 8155, dve SRAM 128kB, asi 5 EPROM 27128, dve 74LS373, nejaké 8255, jednu 8253 a kopec 7400, 7490A a podobne. Hneď som začal kresliť schému. Cieľ bol jednodoskáč, ktorý by využil čo najviac súčiastok zo šuflíka. Mal vedieť načítať Intel HEX file a spustiť ho. Nechcel som niečo na univerzálke, pretože som uvažoval nad dvoma kusmi.

Ešte nikdy som nenavrhoval vlastné PCB. Pre istotu som sa radšej obrátil na Jirku http://www.nostalcomp.cz/ncb85.php. Odhovoril ma od dynamickej rekonfigurácie pamäte, za čo som mu veľmi vďačný. Výsledkom je jednoduchý dekodér adries vyskladaný zo 7432. V rámci šetrenia počtu čipov som uprednostnil 8155 oproti kombinácii 8255 s 8253.

Software pre NCB85 je bohatší ako som plánoval. Ako prvý som napísal zamýšľaný jednoduchý shell s LOAD, JUMP, DUMP, SET, MOVE, COPY príkazmi. V dnešnej dobe PC už nemá asi veľký zmysel používať tool chain priamo na 8-bite. Oveľa pohodlnejšie je robiť cross development. Preto je takýto jednoduchý shell dostačujúci. Program v assembleri alebo C sa napíše a preloží na PC a spustí na NCB85.

Lenže jedného dňa som natrafil na MON85 od Dave Dunfielda. Po prečítaní dokumentácie mi bolo jasné, že Dave myslel dopredu. Portácia na NCB85 spočíva v úprave pár riadkov. MON85 umožňuje debugovanie a trasovanie programu, nastavenie breakpointov, prezeranie a modifikáciu obsahu registrov a pamäte. Ďalej výpis pamäte v HEX alebo v disassemblovanom formáte. Ovládanie portov pomocou príkazov IN a OUT. A aby toho nebolo málo, Roman Bórik tento monitor ešte vylepšil http://blog.borik.net/2012/01/upraveny-monitor-pre-ncb85.html. Roman ale neostal len pri MON85. Ako skúsený CP/M guru, preportoval CP/M na NCB85.

Ďalšia stránka kde je NCB85 popísané je u Martina na 8-bity.cz http://www.8bity.cz/2011/ncb85-single-board-computer/