Čas je za prvi pravi program. Napišemo ga v jeziku C, prevedemo na PC računalniku z Linuxom in zaženemo na sistemu Partner. Program bo ob zagonu izpisal pozdrav ŽIVJO, SVET! in se vrnil v operacijski sistem – klasičen uvodni primer, tokrat v slovenščini.
Pot od izvorne kode do delujočega programa vključuje štiri korake: pisanje kode, prevajanje, pripravo diskovne slike in zagon v emulatorju. Vsak korak je opisan v svojem razdelku.
Za razvoj v jeziku C potrebujemo navzkrižni prevajalnik – orodje, ki teče na PC računalniku z Linuxom, vendar prevede kodo za procesor Z80 pod operacijskim sistemom CP/M. Poleg prevajalnika potrebujemo še orodje za pripravo diskovnih slik.
Vse to je že pripravljeno v Docker sliki, ki jo najdete na Docker Hubu:
https://hub.docker.com/r/wischner/sdcc-z80-idp
Docker slika wischner/sdcc-z80-idp vsebuje:
Sliko prenesete na vaš računalnik z ukazom:
docker pull wischner/sdcc-z80-idp:latest
Po prenosu je razvojno okolje pripravljeno za delo. Ni potrebna nobena namestitev – Docker poskrbi za vse.
Ustvarite nov imenik za projekt in v njem datoteko z imenom imeprog.c. V datoteko vpišite naslednjo kodo:
#include <stdio.h>
int main(void) {
puts("ŽIVJO, SVET!");
return 0;
}
Program je kratek, a vsebuje vse, kar CP/M program potrebuje.
Direktiva #include <stdio.h> vključi standardno knjižnico za vhod in izhod. Ta knjižnica je v Docker sliki že prilagojena za delovanje pod CP/M – klici, kot je puts(), so prevedeni tako, da komunicirajo z operacijskim sistemom Partner.
Funkcija puts() izpiše niz znakov na zaslon in nato skoči v novo vrstico. Je najpreprostejši način za izpis besedila v jeziku C.
Vrednost return 0 ob koncu funkcije main() sporoči operacijskemu sistemu CP/M, da se je program zaključil brez napak.
Prevajanje poteka v dveh korakih. Najprej prevajalnik SDCC iz izvorne kode C ustvari datoteko v formatu Intel HEX (končnica .ihx). Nato orodje sdobjcopy to datoteko pretvori v izvršljivo datoteko CP/M s končnico .com.
Korak 1 – prevajanje z SDCC:
docker run --rm -it \
--user "$(id -u):$(id -g)" \
-v "$(pwd)":/work -w /work \
wischner/sdcc-z80-idp:latest \
sdcc -o imeprog.ihx imeprog.c
Ker boste ta ukaz pisali pogosto, si velja zapomniti, kaj pomeni vsak parameter:
docker run – zažene Docker vsebnik,--rm – vsebnik po koncu samodejno izbriše; ker nas trajnost vsebnika ne zanima, je to dobra navada,-it – vsebnik poveže z vašim terminalom; morebitna sporočila prevajalnika se prikažejo na zaslonu,--user "$(id -u):$(id -g)" – zažene vsebnik z vašim uporabniškim ID-jem, da ustvarjene datoteke ostanejo vaše in ne v lasti korenskega uporabnika,-v "$(pwd)":/work – vaš trenutni imenik priklopi v vsebnik kot /work; vse datoteke, ki jih ustvarite znotraj vsebnika, se shranijo v vaš imenik,-w /work – nastavi delovni imenik znotraj vsebnika na /work,wischner/sdcc-z80-idp:latest – ime Docker slike, ki jo uporabimo,sdcc -o imeprog.ihx imeprog.c – ukaz, ki se izvede znotraj vsebnika.Po uspešnem prevajanju boste v imeniku našli datoteko imeprog.ihx.
Korak 2 – pretvorba v format CP/M:
docker run --rm \
--user "$(id -u):$(id -g)" \
-v "$(pwd)":/work -w /work \
wischner/sdcc-z80-idp:latest \
sdobjcopy -I ihex -O binary imeprog.ihx imeprog.com
Orodje sdobjcopy prebere datoteko imeprog.ihx v formatu Intel HEX in jo zapiše kot neposredno binarno datoteko imeprog.com. Ta oblika je natanko tisto, kar operacijski sistem CP/M pričakuje, ko zaženemo program.
Po tem koraku imate v imeniku datoteko imeprog.com – program, ki je pripravljen za zagon na sistemu Partner.
Da bo program dostopen v emulatorju, ga moramo spraviti na diskovno sliko. Orodje cpmdisk v Docker sliki zna ustvariti diskovne slike v formatu, ki ga razume sistem Partner.
Korak 1 – ustvarite novo diskovno sliko:
docker run --rm \
--user "$(id -u):$(id -g)" \
-v "$(pwd)":/work -w /work \
wischner/sdcc-z80-idp:latest \
cpmdisk create program.img fdd --label PARTNER --datestamp
Format fdd je disketni format, ki ga sistem Partner pričakuje. Oznaka --label PARTNER nastavi ime diskete, --datestamp pa vključi podporo za časovne žige.
Korak 2 – dodajte program na diskovno sliko:
docker run --rm \
--user "$(id -u):$(id -g)" \
-v "$(pwd)":/work -w /work \
wischner/sdcc-z80-idp:latest \
cpmdisk add program.img -u 0 imeprog.com
Parameter -u 0 pomeni, da se datoteka shrani v uporabniško področje 0, ki je privzeto področje sistema CP/M.
Korak 3 – preverite vsebino diskovne slike:
docker run --rm \
--user "$(id -u):$(id -g)" \
-v "$(pwd)":/work -w /work \
wischner/sdcc-z80-idp:latest \
cpmdisk list program.img -u 0
V izpisu bi morali videti datoteko IMEPROG.COM v uporabniškem področju 0. Diskovna slika je zdaj pripravljena.
Zaženite emulator PartEm in priključite diskovno sliko program.img kot disk B:. Postopek je opisan v razdelku 3.3.
Ko se prikaže ukazni poziv sistema Partner, zaženite program z ukazom:
B:IMEPROG
Če je vse poteklo pravilno, bo zaslon izgledal takole:
B:IMEPROG
ŽIVJO, SVET!
B:
Čestitamo – vaš prvi program za Iskra Delta Partner deluje!