Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

4. MOJ PRVI PROGRAM

====================

Č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.

4.1. RAZVOJNO OKOLJE DOCKER

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:

  • SDCC – navzkrižni prevajalnik za jezik C (Small Device C Compiler),
  • sdobjcopy – orodje za pretvorbo prevedene datoteke v format CP/M,
  • prilagojeno standardno knjižnico C in startni objekt za CP/M,
  • cpmdisk – orodje za ustvarjanje in upravljanje diskovnih slik, prilagojenih za sistem Partner.

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.

Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

4.2. PISANJE PROGRAMA

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.

Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

4.3. PREVAJANJE PROGRAMA

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.

Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

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.

4.4. USTVARJANJE DISKOVNE SLIKE

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.

Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

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.

4.5. ZAGON PROGRAMA V EMULATORJU

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!