Teil 1 „Setting up the ZX81“

Der C-Kurs
Antworten
Benutzeravatar
Jens
User
Beiträge: 986
Registriert: 23.08.2005, 13:31
Wohnort: D-31582 Nienburg/Weser
Kontaktdaten:

Teil 1 „Setting up the ZX81“

Beitrag von Jens » 23.05.2008, 21:53

C für BASIC-Programmierer

Arbeiten mit dem z88dk Cross-Compiler


von Jens Sommerfeld und Bodo Wenzel


Teil 1


Das Treffen 2008 in Mahlerts hat einiges neues gebracht und war wie immer von wenig Schlaf und viel Kaffee gezeichnet. Neben der guten „Location“ mit WLan und dem gewohnt guten Service haben sich Jens und Bodo mit einigen Dingen beschäftigt. Darunter auch mit diesem Thema, welches wir ebenso in einem Thread auf dem ZX81-Forum von Thomas Lienhard auch zur Diskussion stellen möchten.

C ist, wenn man der „Bibel“ von Kernighan&Ritchie glauben darf, eine Programmiersprache für allgemeine Anwendungen. Sie ist eine relativ „maschinennahe“ Sprache. Wir wollen uns hier mit ANSI-C beschäftigen. Dieser Dialekt wird vom z88dk verstanden. Außerdem wird er (wer sich das Buch kaufen möchte) in der „Bibel“ beschrieben. Alle Links findet Ihr am Ende...


Im Großen und Ganzen soll es hier um die Möglichkeit gehen, Programme, die in der Sprache C geschrieben sind, für den ZX81 zu übersetzten. Dazu benutzen wir den z88dk-Cross-Compiler in der Version v2.57. Über den Compiler und seine Anwendung wurde schon vorher des Öfteren berichtet. Hier soll es aber sowohl um die Anwendung als auch um Programmierung gehen. Wir beginnen ganz von Vorne (der Installation), wobei ich (Jens) hier auch die Möglichkeit habe, ein wenig mehr über C und Compiler zu erfahren. Wir werden versuchen, uns an das BASIC-Handbuch von Steven Vickers halten, damit jeder ZX81-User die Schritte in BASIC und C nachvollziehen kann. Also: START...


Alles was wir benötigen ist ein Windows-System (ich arbeite unter XP, aber auch unter Win98 funktioniert der Compiler), einen Editor (ich arbeite mit „Notepad2“ und „PS-PAD“ - auch „Notepad+“ ist sehr geeignet) und natürlich den Compiler.


Zuerst laden wir uns die Datei „z88dk-1.8.0-setup.exe“ herunter. Anschließend starten wir die Installation. Nach dem akzeptieren der Lizenzvereinbarung installiert sich das Programm automatisch. Ich persönlich habe den Installationspfad von c:\programme\z88dk auf c:\z88dk geändert, da ich so schnelleren Zugriff über eine Eingabeaufforderung (DOS) habe – vielleicht möchte ich auch einfach nicht so viel tippen :-) .


Nun brauchen wir noch einen Editor und dann kann es mit dem ersten Programm (das berühmte „Hallo Welt“) auch schon losgehen.

Wir starten also unseren Editor und geben dort das folgende Programm ein:


#include <stdio.h>

int main(void)

{
printf("Hallo Welt!\n");
return 0;
}


Dieses Programm speichern wir als „hallo.c“ in unserem z88dk\bin – Verzeichnis ab.


Nun rufen wir uns über die Eingabeaufforderung unseren Compiler auf. Dazu gehen wir in das Verzeichnis “z88dk\bin“.

Nun rufen wir uns den Compiler einmal auf (einfach zcc eingeben):

Die Versionsnummer (v2.57) ist hier gut zu erkennen.

Wenn wir nun mit dem Befehl „DIR“ den Inhalt ansehen, sollten wir unsere Datei „hallo.c“ finden:

Nun kommt der erste spannende Moment. Wir lassen den Compiler dieses kleine C-Programm übersetzen. Hierfür rufen wir den Compiler mit diesem Befehl auf:

c:\z88dk\bin\zcc +zx81 hallo.c

Hier sehen wir die erste Besonderheit. Als erstes kommt der Compileraufruf mit zcc. Anschließend (Leerzeichen nicht vergessen) geben wir +zx81 ein. Damit geben wir dem Compiler den Hinweis, die Libary für den ZX81 zu verwenden. Würden wir dort +ace scheiben, wäre der Jupiter Ace (auch ein wunderbarer Rechner) gemeint. Danach brauchen wir nur noch unsere hallo.c-Datei anzugeben (wieder ein Leerzeichen). Wenn wir dann „Newline“ ;-) tippen, fängt der Compiler an zu arbeiten.


Auf den ersten Blick sieht das verwirrend aus. Der Compiler hat nun unsere Datei in eine Datei übersetzt, die er a.bin nennt. Dieses Format kann der ZX81 nicht verstehen (wir brauchen ja eine .p-Datei). Die a.bin ist eine Binärdatei, quasi ein Maschinensprache“roh“programm, welches für den ZX81 übersetzt wurde.

Jetzt müssen wir die a.bin in eine .p-Datei übersetzten. Das geht mit diesem Aufruf:

c:\z88dk\bin\bin2p a.bin hallo.p

Das Programm bin2p macht aus unserer Rohdatei (a.bin) eine .p-Datei, der wir einen Namen geben müssen (in unserem Fall hallo.p).

Nun haben wir eine Datei, die der ZX81 (oder ein Emulator) lesen kann.

In einem Emulator (wir empfehlen den „Eightyone“) wird unsere Datei mir RUN gestartet ohne Probleme ausgeführt.

Schauen wir uns das Programmlisting einmal an, in dem wir LIST eingeben.

In Zeile 1, der REM-Zeile, ist der Maschinencode versteckt. Wenn wir LIST 2 aufrufen, sehen wir folgende Zeile:

2 RAND USR VAL "16514"

Mit diesem Aufruf wird das Maschinenspracheprogramm gestartet.

Was hier gerade passiert ist noch einmal in Stichworten:

wir schreiben ein Programm in C und nennen es hallo.c
wir lassen das C-Programm vom Compiler übersetzten und erhalten eine bin-Datei (a.bin)
wir wandeln die bin-Datei mit dem Programm bin2p in ein .p-File um (hallo.p)
dieses Programm können wir im Emulator oder einem echten ZX81 laufen lassen


Im zweiten Teil wird Euch Bodo ein wenig mehr über C und den z88dk erzählen.


Jens Sommerfeld
Wenn du tot bist, dann merkst du das selber nicht. Es ist nur schwer für die anderen. Wenn du blöd bist, dann ist es genauso.
Und: uıɐbɐ ʎɐqǝ uo pɹɐoqʎǝʞ ɐ ʎnq ɹǝʌǝ ɹǝʌǝu ןןıʍ ı

Benutzeravatar
Jens
User
Beiträge: 986
Registriert: 23.08.2005, 13:31
Wohnort: D-31582 Nienburg/Weser
Kontaktdaten:

Die Linkliste

Beitrag von Jens » 23.05.2008, 21:58

Wenn du tot bist, dann merkst du das selber nicht. Es ist nur schwer für die anderen. Wenn du blöd bist, dann ist es genauso.
Und: uıɐbɐ ʎɐqǝ uo pɹɐoqʎǝʞ ɐ ʎnq ɹǝʌǝ ɹǝʌǝu ןןıʍ ı

t0m
Site Admin
Site Admin
Beiträge: 572
Registriert: 04.03.2004, 13:32
Wohnort: CH-5506 Mägenwil
Kontaktdaten:

Re: C für BASIC-Programmierer - der z88dk-Cross-Compiler

Beitrag von t0m » 23.05.2008, 22:01

Hallo zusammen,

nun geht's also los. Das Hallo Welt Programm habe ich auch schon hingekriegt, aber wie kann ich etwas einlesen? Also eine Art INPUT in C? Habe es mit gets() und scanf() probiert, aber der Zeddy crashed dabei immer. Ein Beispiel in C analog zu dem folgenden Basic-Programm wäre genial.

10 INPUT A
20 INPUT B$
30 PRINT A;B$
40 STOP
t0m

There are 10 types of people in this world: those who understand binary and those who don't.

Benutzeravatar
bodo
User
Beiträge: 288
Registriert: 14.02.2007, 17:21
Kontaktdaten:

Re: C für BASIC-Programmierer - der z88dk-Cross-Compiler

Beitrag von bodo » 25.05.2008, 13:20

Das Einlesen von Werten kommt eigentlich erst in Teil 9, entsprechend Vickers' BASIC-Handbuch. Aber für ganz Neugierige hier ein winziges Beispiel für Zahlen (nicht ausprobiert, aber es sollte kein Fehler darin sein):

Code: Alles auswählen

#include <stdio.h>

int main(void) {
    int variable;

    scanf("%d", &variable);
    printf("%d\n", variable);

    return 0;
}
Das Wichtige an der scanf-Zeile ist das "&" vor dem Variablennamen. Warum das so ist, kommt auch noch - in einem der späteren Teile; vorher verwirrt es mehr.

Zeichenketten gibt es übrigens in C nicht als Standard-Datentyp. Ihre Verwendung ist deshalb nicht so einfach wie in BASIC, aber auch nicht schwer. Damit werden sich die Teile 7 und 11, sowie mehr allgemein die Teile 21 und 22 beschäftigen.
B0D0: Real programmers do it in hex.

Benutzeravatar
siggi
User
Beiträge: 1784
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, Ranstadt-Dauernheim
Kontaktdaten:

Re: Der Artikel

Beitrag von siggi » 26.05.2008, 21:08

Jens hat geschrieben: Dazu benutzen wir den z88dk-Cross-Compiler in der Version v2.57.

(..)

Zuerst laden wir uns die Datei „z88dk-1.8.0-setup.exe“ herunter.
Hallo Jens und andere,
kleine Korrektur, damit keine Verwirrung aufkommt: die aktuelle C-Compilerversion ist "1.8.0" (deshalb heißt die Setup-Datei auch so). Das "Compiler-Frontend" ZCC mag die Version 2.57 haben, was aber nicht weiter relevant ist, da durch dieses Programm nur der eigentliche C-Compiler (oder Linker oder beides) der aktuellen 1.8.0-Version gestartet wird. Wer im Z88DK-Forum z. B. Bugs im C-Compiler melden will, der sollte dort also nur die Versionsnummer "1.8.0" angeben ..

Siggi

t0m
Site Admin
Site Admin
Beiträge: 572
Registriert: 04.03.2004, 13:32
Wohnort: CH-5506 Mägenwil
Kontaktdaten:

Re: C für BASIC-Programmierer - der z88dk-Cross-Compiler

Beitrag von t0m » 26.05.2008, 21:44

Hallo Bodo,

habe dein Programm mit scanf() ausprobiert und folgendes festgestellt:
1. Man hat während der Eingabe keinerlei Bildschirmausgabe, man tippt also quasi blind...
2. Wenn man vor dem RUN kein FAST eingibt, sieht man auch nach der Eingabe mit CR keine Bildschirmausgabe.

Wie kann man dies ändern? So dass man wie in einem Terminal arbeiten könnte (gleichzeitige Ein- und Ausgabe)...

Gruss
Thomas
t0m

There are 10 types of people in this world: those who understand binary and those who don't.

Benutzeravatar
siggi
User
Beiträge: 1784
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, Ranstadt-Dauernheim
Kontaktdaten:

Re: C für BASIC-Programmierer - der z88dk-Cross-Compiler

Beitrag von siggi » 26.05.2008, 23:37

Hallo Tom,
was noch nicht erzählt wurde: es gibt beim Compiler diverse"STARTUP"-Optionen, die bestimmen, ob der Zeddy SLOW oder FAST oder in HRG läuft. Damit klappt dann auch die Bildschirmausgabe, ohne daß man manuell mit SLOW/FAST rummacht. Es gibt da auch einen Modus (ZX81_ANSI), bei der der Zeddy ein ANSI-Terminal emuliert und die Steuerzeichen auswertet ...

Zum fehlenden "lokalen Echo" in "scanf": diesen Mangel hatte ich in der 1.70-Version des Compilers schon an die Z88DK-Entwickler gemeldet. Von Stefano (einem Admin dort) wurde mit ein Workround für den Zeddy genannt. Eventuell ist der auch noch in der 1.80 er Version notwendig. Hier ein Beispiel dazu aus einem XMODEM-Programm, das ich auf den Zeddy portiert habe:

char line[LEN];

SLOW();
printf(" ZX81 XModem\n\nenter start address:");
fgets(line, LEN, stdin);
sscanf(line, "%u\n", &start);

Zunächst wird ein Puffer "line" mit "fgets" von "stdin" (also Tastatur) mit Daten gefüllt. Dabei funktioniert das "lokale Echo" und man sieht, was man tippt. Danach wird der Puffer mit "sscanf" ausgewertet und die Variable "start" eingelesen (aus dem Puffer). Nachteil dieses Workarounds ist, daß man einen Puffer mit fester Länge (LEN) bereitstellen muß.
Aber dafür hat man was für's Auge ;-)

Aber das war vielleicht etwas viel für den Anfang ;-)

Siggi

Benutzeravatar
Jens
User
Beiträge: 986
Registriert: 23.08.2005, 13:31
Wohnort: D-31582 Nienburg/Weser
Kontaktdaten:

Re: Der Artikel

Beitrag von Jens » 27.05.2008, 22:05

siggi hat geschrieben: Hallo Jens und andere,
kleine Korrektur, damit keine Verwirrung aufkommt: die aktuelle C-Compilerversion ist "1.8.0" (deshalb heißt die Setup-Datei auch so). Das "Compiler-Frontend" ZCC mag die Version 2.57 haben, was aber nicht weiter relevant ist, da durch dieses Programm nur der eigentliche C-Compiler (oder Linker oder beides) der aktuellen 1.8.0-Version gestartet wird. Wer im Z88DK-Forum z. B. Bugs im C-Compiler melden will, der sollte dort also nur die Versionsnummer "1.8.0" angeben ..

Siggi
Hallo Siggi!

Du hast natürlich vollkommen Recht!

Gruß
Jens
Wenn du tot bist, dann merkst du das selber nicht. Es ist nur schwer für die anderen. Wenn du blöd bist, dann ist es genauso.
Und: uıɐbɐ ʎɐqǝ uo pɹɐoqʎǝʞ ɐ ʎnq ɹǝʌǝ ɹǝʌǝu ןןıʍ ı

Benutzeravatar
bodo
User
Beiträge: 288
Registriert: 14.02.2007, 17:21
Kontaktdaten:

Re: C für BASIC-Programmierer - der z88dk-Cross-Compiler

Beitrag von bodo » 28.05.2008, 19:53

t0m hat geschrieben:1. Man hat während der Eingabe keinerlei Bildschirmausgabe, man tippt also quasi blind...
2. Wenn man vor dem RUN kein FAST eingibt, sieht man auch nach der Eingabe mit CR keine Bildschirmausgabe.
Diese "Kleinigkeiten" werden wir wohl hier im Forum klären müssen. Bei mir läuft jedenfalls keine echte Maschine, sondern ich nehme den Emulator xz81 unter Linux. Der schaltet offenbar bei FAST den Bildschirm nicht ab. Das Name ist übrigens kein Tippfehler! :lol:

Wie bei vielen Programmen für Echte Männer(TM) lohnt sich das Studium der Dokumentation. Die Option, die Siggi meint, heißt "-startup=..." und nach dem Gleichheitszeichen wird eine Zahl eingegeben:

1 FAST mode, no video output while the program runs
2 SLOW mode, no high resolution
3 256×192 HRG, when program ends press SPACE to go back to text mode.
4 256×192 HRG, text mode is restored immediately when progam ends.
5 256×64 HRG (faster), when program ends press SPACE to go back to text mode.
6 256×64 HRG (faster), text mode is restored immediately when progam ends.
7 256×64 Grayscale HRG, (see the gray lib section), this trick has heavy limits.
B0D0: Real programmers do it in hex.

Benutzeravatar
PokeMon
User
Beiträge: 4131
Registriert: 31.08.2011, 23:41

Re: Teil 1 „Setting up the ZX81“

Beitrag von PokeMon » 17.04.2013, 22:54

Jens hat geschrieben: Jetzt müssen wir die a.bin in eine .p-Datei übersetzten. Das geht mit diesem Aufruf:

c:\z88dk\bin\bin2p a.bin hallo.p

Das Programm bin2p macht aus unserer Rohdatei (a.bin) eine .p-Datei, der wir einen Namen geben müssen (in unserem Fall hallo.p).

Nun haben wir eine Datei, die der ZX81 (oder ein Emulator) lesen kann.
Ja - schöne Geschichte wenn man das Programm bin2p hat.
Habe gerade das Z88DK downgeloaded - kompilieren geht, aber was mache ich jetzt mit dem binary ? :shock:
Wer seinen Computer ehrt, lebt nicht verkehrt.

t0m
Site Admin
Site Admin
Beiträge: 572
Registriert: 04.03.2004, 13:32
Wohnort: CH-5506 Mägenwil
Kontaktdaten:

Re: Teil 1 „Setting up the ZX81“

Beitrag von t0m » 18.04.2013, 05:56

Hallo PokeMon,

brauchst Du nicht (mehr)! Wenn Du beim zcc Aufruf den Parameter "-create-app" anhängst, macht der gleich ein .p File für dich!
t0m

There are 10 types of people in this world: those who understand binary and those who don't.

Benutzeravatar
dhucke
User
Beiträge: 695
Registriert: 21.03.2009, 14:50
Wohnort: D-51427 Bergisch Gladbach

Re: Teil 1 „Setting up the ZX81“

Beitrag von dhucke » 09.04.2015, 17:28

Hallo Leute,
hab Z88dk für den ZX spectrum ausprobiert, genial! Sogar für den SAM gibts mittlerweile Libraries.

Für den ZX Spectrum kompiliert man am besten mit:
(aus der doku, so hat es jedenfalls super funktioniert)

zcc +zx -O3 -vn hello.c -o hello.bin -create-app -lndos

Man erhält eine Datei hello.bin und hello.tap.
Die erzeugte Datei Hello.tap kann zB direkt mit dem Spectaculator in den Emulator geladen werden.

Ich weiss, das Topic hier ist ZX81, ein eigener Eintrag in "Spectrum" scheint mir nicht sinnvoll, denn der "Lehrgang" ist ja für beide Rechner geeignet.

Viele Grüße von Dieter
"Hardware nennt man die Teile eines Computers die man treten kann."
Jeff Pesis

Benutzeravatar
msch
User
Beiträge: 3085
Registriert: 05.02.2013, 15:42
Wohnort: Hessen, Rhein-Main-Gebiet

Re: Teil 1 „Setting up the ZX81“

Beitrag von msch » 09.04.2015, 19:49

Ja, feines Teil! Vor allem, wenn man sich ansieht, wie viele Zielplatformen unterstützt werden.

... und vor allem gibt es auch Binaries für OS X :)
manche meinen lechts und rinks kann man nicht velwechsern.
werch ein illtum! (Lichtung, Ernst Jandl)

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast