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é:Jakub poslal aj popis ako sú uložené dáta a program.
.area SMALLC_GENERATED (REL,CON,CSEG)
globální proměnné pak do:
.area SMALLC_GENERATED_DATA (REL,CON,DSEG)
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)a takto krátený hlavný program
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
}
for (a = 0; a < 37; a++) { //pres celou tabulku znaku v kodu monitoruC 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 ;-)
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);
}
}
}