Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
elektronik:z8671:handbuch [2021/12/09 07:36] – angelegt volkerp | elektronik:z8671:handbuch [2024/02/14 11:13] (aktuell) – [Mastermind] volkerp | ||
---|---|---|---|
Zeile 20: | Zeile 20: | ||
Basic/Debug ignoriert die Unterscheidung zwischen Groß- und | Basic/Debug ignoriert die Unterscheidung zwischen Groß- und | ||
Kleinbuchstaben. Daher sind PRINT, PrInT und print alles | Kleinbuchstaben. Daher sind PRINT, PrInT und print alles | ||
- | gültige Basic/ | + | gültige Basic/ |
- | GRoßbuchstaben kennt), | + | wird hier alles in Großbuchstaben |
Beispiele: | Beispiele: | ||
Zeile 119: | Zeile 119: | ||
als vorzeichenlose ganze Zahl im Bereich von 0 - 65535 behandelt. | als vorzeichenlose ganze Zahl im Bereich von 0 - 65535 behandelt. | ||
Beispiel: Die Anweisung PRINT 40000\3 gibt den korrekten Wert 13333 zurück | Beispiel: Die Anweisung PRINT 40000\3 gibt den korrekten Wert 13333 zurück | ||
- | Dagwegen | + | Dagegen |
Ganzzahl mit Vorzeichen für 40000 ist -25536. | Ganzzahl mit Vorzeichen für 40000 ist -25536. | ||
- | Weil es die Dividende als sechzehn Bit positiv | + | Weil hier der Dividende als positive |
- | Zahl, kann der Backslash eine logische Rechtsverschiebung auf a durchführen | + | kann der Backslash eine logische Rechtsverschiebung auf Bitmuster |
- | Bitmuster, wie unten gezeigt: | + | |
(-2)/2 = -1 | (-2)/2 = -1 | ||
(-2)\2 = 32767 | (-2)\2 = 32767 | ||
- | Ein Versuch, mit dem Backslash durch eine negative Zahl zu dividieren | + | Ein Versuch, mit dem Backslash durch eine negative Zahl zu dividieren, |
liefert undefinierte Ergebnisse. | liefert undefinierte Ergebnisse. | ||
Der Backslash-Operator kann auch zum Drucken von Werten | Der Backslash-Operator kann auch zum Drucken von Werten | ||
größer als +32767 verwendet werden. Angenommen, N ist ein Wert außerhalb des normalen | größer als +32767 verwendet werden. Angenommen, N ist ein Wert außerhalb des normalen | ||
- | Druckbereich. | + | Druckbereichs, |
PRINT N\10; N-N\10*10 | PRINT N\10; N-N\10*10 | ||
Relationale Operatoren spezifizieren bedingte Beziehungen in | Relationale Operatoren spezifizieren bedingte Beziehungen in | ||
- | eine IF-Anweisung. Die sechs relationalen Operatoren, die von erkannt werden | + | eine IF-Anweisung. Die sechs relationalen Operatoren, die in Basic/ |
- | Basic/Debug sind: | + | |
= gleich | = gleich | ||
Zeile 152: | Zeile 150: | ||
===== Speicherreferenzen ===== | ===== Speicherreferenzen ===== | ||
- | BasiC/Debug kann die internen Z8671-Register direkt ansprechen | + | Basic/Debug kann die internen Z8671-Register direkt ansprechen |
- | und alle externen Speicher (> 100h). Der Inhalt einer beliebigen Adresse | + | sowie den externen Speicher (> 100h). Der Inhalt einer beliebigen Adresse |
kann untersucht und RAM geändert werden. | kann untersucht und RAM geändert werden. | ||
Zeile 168: | Zeile 166: | ||
Das ist die erste Zeilennummer) | Das ist die erste Zeilennummer) | ||
- | Byte-Referenzen werden verwendet, um ein einzelnes Register in der CPU zu ändern, E/A zu steuern | + | Byte-Referenzen werden verwendet, um ein einzelnes Register in der CPU zu ändern, E/A-Geräte |
- | Geräte | + | oder zum Zugriff |
- | Sechzehn-Bit-Wörter werden | + | Sechzehn-Bit-Wörter werden durch das Wortsignalzeichen "^", |
- | durch das Wortsignalzeichen "$" | + | gefolgt von der Adresse, |
- | signifikantes | + | Damit wird das höherwertige |
- | signifikantes | + | niederwertige |
- | Zeigerregisterwerte | + | Modifikation von Zeigerregisterwerten |
Der Adresswert kann eine Variable, eine Konstante, ein Hex-Wert sein, | Der Adresswert kann eine Variable, eine Konstante, ein Hex-Wert sein, | ||
Zeile 184: | Zeile 182: | ||
Beispiel: Wenn beispielsweise die benötigte Adresse vom Wert von C abhängt, | Beispiel: Wenn beispielsweise die benötigte Adresse vom Wert von C abhängt, | ||
- | Basic/ | + | kann Basic/Debug die Berechnung durchführen: |
145 LET @(C*100) = A | 145 LET @(C*100) = A | ||
- | Indirekte Adressierung kann Basic/Debug durch mehrere | + | Indirekte Adressierung kann in Basic/Debug durch mehrere |
Adressen erfolgen, um die erforderlichen Info zu erhalten: | Adressen erfolgen, um die erforderlichen Info zu erhalten: | ||
Zeile 230: | Zeile 228: | ||
Für logisches ODER ergänzen Sie die AND-Funktion um das | Für logisches ODER ergänzen Sie die AND-Funktion um das | ||
Subtrahieren jedes Elements von -1. Zum Beispiel | Subtrahieren jedes Elements von -1. Zum Beispiel | ||
- | entspricht | + | entspricht |
+ | < | ||
-1-AND(-1-A, | -1-AND(-1-A, | ||
+ | </ | ||
Die arithmetische Summe kann auch für das logische ODER verwendet werden | Die arithmetische Summe kann auch für das logische ODER verwendet werden | ||
Zeile 251: | Zeile 251: | ||
Nachdem das Unterprogramm für die Maschinensprache zusammengestellt wurde, | Nachdem das Unterprogramm für die Maschinensprache zusammengestellt wurde, | ||
speichern Sie es im Speicher, der sonst nicht von Basic/Debug belegt wird | speichern Sie es im Speicher, der sonst nicht von Basic/Debug belegt wird | ||
- | (Programm oder Stack). | + | (außerhalb |
- | Verwenden Sie die Adresse der ersten Anweisung des Unterprogramms als erste | + | Verwenden Sie die Adresse der ersten Anweisung des Unterprogramms als erstes |
Argument der USR-Funktion wie folgt: | Argument der USR-Funktion wie folgt: | ||
Zeile 261: | Zeile 261: | ||
es keine Maschinensprachroutine am Standort gibt, | es keine Maschinensprachroutine am Standort gibt, | ||
ist das Ergebnis undefiniert. | ist das Ergebnis undefiniert. | ||
- | Auf die Adresse können ein oder zwei Werte folgen, die | + | Auf die Adresse können ein oder zwei Werte folgen, die |
vom Unterprogramm verarbeitet werden können. Zum Beispiel: | vom Unterprogramm verarbeitet werden können. Zum Beispiel: | ||
Zeile 269: | Zeile 269: | ||
Basic/Debug übergibt die Werte an das Unterprogramm in | Basic/Debug übergibt die Werte an das Unterprogramm in | ||
den Registern 18-19 und 20-21 und erwartet den resultierenden Wert in | den Registern 18-19 und 20-21 und erwartet den resultierenden Wert in | ||
- | 18-19 zurück. Dieser resultierende Wert wird verwendet, um zu beenden | + | 18-19 zurück. Dieser resultierende Wert wird verwendet, um |
- | die Auswertung des Ausdrucks. | + | die Auswertung des Ausdrucks |
Die Register, in denen die Argumente übergeben werden, hängen von | Die Register, in denen die Argumente übergeben werden, hängen von | ||
Zeile 306: | Zeile 306: | ||
Er darf nur verwendet werden, wenn das Unterprogramm keinen Wert zurückgibt. | Er darf nur verwendet werden, wenn das Unterprogramm keinen Wert zurückgibt. | ||
Das erste Argument ist die Adresse des ersten Bytes des | Das erste Argument ist die Adresse des ersten Bytes des | ||
- | Subroutine. Die letzten beiden optionalen Argumente werden verwendet, um zu übergeben | + | Subroutine. Die letzten beiden optionalen Argumente werden verwendet, um |
- | Werte an das Unterprogramm. Im Gegensatz zur USR-Funktion wird der Inhalt von R18-19 | + | Werte an das Unterprogramm |
verworfen und es wird kein Wert zurückgegeben. Ansonsten übergibt GO@ Argumente an die | verworfen und es wird kein Wert zurückgegeben. Ansonsten übergibt GO@ Argumente an die | ||
Unterprogramm auf die gleiche Weise wie USR (d.h. in Registier 18-19 und 20-21, s.o.). | Unterprogramm auf die gleiche Weise wie USR (d.h. in Registier 18-19 und 20-21, s.o.). | ||
Zeile 326: | Zeile 326: | ||
Programm an dieser Zeile fort. GOSUB muss der letzte Befehl in seiner Zeile | Programm an dieser Zeile fort. GOSUB muss der letzte Befehl in seiner Zeile | ||
sein. Ein Unterprogramm kann ein anderes aufrufen. Die RETURN-Anweisung am Ende | sein. Ein Unterprogramm kann ein anderes aufrufen. Die RETURN-Anweisung am Ende | ||
- | des zweiten Unterprogramms kehrt nach Ausführung | + | des zweiten Unterprogramms kehrt nach Ausführung zum ersten |
- | Unterprogramm. Auf diese Weise können Unterprogramme verschachtelt werden. | + | Unterprogramm |
Zeile 362: | Zeile 362: | ||
Der IF/ | Der IF/ | ||
statement kann eine andere Anweisung sein oder eine Zeilennummer, | statement kann eine andere Anweisung sein oder eine Zeilennummer, | ||
- | Liste von durch Doppelpunkte getrennten | + | Liste von durch Doppelpunkten getrennte |
- | Jede dieser | + | Jede dieser |
Das Schlüsselwort THEN kann weggelassen werden, um Speicherplatz zu sparen. | Das Schlüsselwort THEN kann weggelassen werden, um Speicherplatz zu sparen. | ||
Ebenso darf GOTO vor einer Zeilennummer entfallen. | Ebenso darf GOTO vor einer Zeilennummer entfallen. | ||
Zeile 374: | Zeile 374: | ||
Es gibt nur zwei Situationen, | Es gibt nur zwei Situationen, | ||
- | nicht weggelassen werden darf: Es darf nicht weggelassen werden, wenn der zweite | + | nicht weggelassen werden darf: Zum einen darf es nicht weggelassen werden, wenn der zweite |
Ausdruck mit einer dezimalen oder hexadezimalen Konstante endet und eine | Ausdruck mit einer dezimalen oder hexadezimalen Konstante endet und eine | ||
Zeilennummer statt einer Anweisung verwendet wird. Zum Beispiel: | Zeilennummer statt einer Anweisung verwendet wird. Zum Beispiel: | ||
Zeile 386: | Zeile 386: | ||
IF 1 > X 1000 | IF 1 > X 1000 | ||
- | Die zweite Situation, bei der THEN nicht weggelassen werden darf, ist | + | Die zweite Situation, bei der THEN nicht weggelassen werden darf, ist, |
wenn der zweite Ausdruck mit einer hexadezimalen Konstante endet, | wenn der zweite Ausdruck mit einer hexadezimalen Konstante endet, | ||
und der Anweisungsteil eine LET-Anweisung ist, in der das Schlüsselwort | und der Anweisungsteil eine LET-Anweisung ist, in der das Schlüsselwort | ||
Zeile 416: | Zeile 416: | ||
INPUT verwirft alle im Puffer verbleibenden Werte von | INPUT verwirft alle im Puffer verbleibenden Werte von | ||
- | vorherige IN-, INPUT- oder RUN-Anweisungen und fordert neue Daten an | + | vorherige IN-, INPUT- oder RUN-Anweisungen und fordert neue Daten |
- | vom Betreiber. IN verwendet alle Werte, die im Puffer | + | vom Nutzer an. IN verwendet |
und fordert dann neue Daten an. | und fordert dann neue Daten an. | ||
Zeile 425: | Zeile 425: | ||
Wert am Anfang der Liste zugewiesen bekam, kann verwendet werden, um später | Wert am Anfang der Liste zugewiesen bekam, kann verwendet werden, um später | ||
eine weitere Variable in der Liste zu definieren. | eine weitere Variable in der Liste zu definieren. | ||
- | Beispielsweise kann die Anweisung INPUT C,A | + | Beispielsweise kann die Anweisung INPUT C,A als gültige Eingabe |
- | 10, | + | 10,C*5 verarbeiten. |
Wenn ein Programm vom Bediener die Eingabe einer Liste von | Wenn ein Programm vom Bediener die Eingabe einer Liste von | ||
Zeile 434: | Zeile 434: | ||
verwendet werden, um die Interpretation von Eingabewerten zu ändern: | verwendet werden, um die Interpretation von Eingabewerten zu ändern: | ||
+ | < | ||
? %123, | ? %123, | ||
? %12 3AND(56) (hex 123A, Variablen N, D, dezimal 56) | ? %12 3AND(56) (hex 123A, Variablen N, D, dezimal 56) | ||
? %123, | ? %123, | ||
+ | </ | ||
Da Basic/Debug nur einen Eingabezeilenpuffer hat, werden INPUT | Da Basic/Debug nur einen Eingabezeilenpuffer hat, werden INPUT | ||
Zeile 464: | Zeile 466: | ||
Werte zuzuweisen. | Werte zuzuweisen. | ||
- | Um dem Bediener | + | Um dem Nutzer |
- | Werten einzugeben, | + | Werten einzugeben, |
um die Anforderungen zu beschreiben. Wenn die PRINT-Anweisung mit einem Semikolon | um die Anforderungen zu beschreiben. Wenn die PRINT-Anweisung mit einem Semikolon | ||
abgeschlossen ist, wird der INPUT-Prompt "?" | abgeschlossen ist, wird der INPUT-Prompt "?" | ||
Zeile 475: | Zeile 477: | ||
100 PRINT "BITTE JA ODER NEIN EINGEBEN" | 100 PRINT "BITTE JA ODER NEIN EINGEBEN" | ||
110 LET N=J-1 | 110 LET N=J-1 | ||
- | 120 DRUCK " | + | 120 PRINT " |
130 INPUT N | 130 INPUT N | ||
140 IF N=J THEN PRINT " | 140 IF N=J THEN PRINT " | ||
Zeile 497: | Zeile 499: | ||
alphabetisches Zeichen A-Z sein, eine Speicherreferenz oder eine Register-Referenz. | alphabetisches Zeichen A-Z sein, eine Speicherreferenz oder eine Register-Referenz. | ||
Der Wert des Ausdrucks wird entweder im | Der Wert des Ausdrucks wird entweder im | ||
- | Speicherort, oder in den Speicherort der Variablen gelegt, | + | Speicherort oder in den Speicherort der Variablen gelegt, |
und kann bei jedem späteren Auftreten der Variablen verwendet werden. | und kann bei jedem späteren Auftreten der Variablen verwendet werden. | ||
Da das Gleichheitszeichen die Syntax dieses Befehls eindeutig macht, | Da das Gleichheitszeichen die Syntax dieses Befehls eindeutig macht, | ||
Zeile 555: | Zeile 557: | ||
1060| (Signed) | 1060| (Signed) | ||
1070| | 1070| | ||
- | |||
Fünf Zeilen dieses Programms sind eingerückt, | Fünf Zeilen dieses Programms sind eingerückt, | ||
Zeile 564: | Zeile 565: | ||
einschließlich der vertikalen Striche am linken Rand. Der vertikale | einschließlich der vertikalen Striche am linken Rand. Der vertikale | ||
Strich wird benötigt, um Zeile 1000 einzurücken; | Strich wird benötigt, um Zeile 1000 einzurücken; | ||
- | Konsistenz enthalten. | + | Konsistenz enthalten. |
eine Anweisung einzurücken, | eine Anweisung einzurücken, | ||
verwenden Sie den vertikalen Strich, um Textzeilen einzurücken, | verwenden Sie den vertikalen Strich, um Textzeilen einzurücken, | ||
Zeile 585: | Zeile 586: | ||
kein Speicher-Überlaufschutz mehr vorhanden, und das Programm kann zerstört werden. | kein Speicher-Überlaufschutz mehr vorhanden, und das Programm kann zerstört werden. | ||
- | -> vp: es muss zusätzlich Register 4-5 auf 20h Byte nach Programmende (oder höher) | + | -> vp: Es muss zusätzlich Register 4-5 auf 20h Byte nach Programmende (oder höher) |
gesetzt werden, dann ist alles korrekt, z.B.: | gesetzt werden, dann ist alles korrekt, z.B.: | ||
- | $4=%89FF | + | ^4=%89FF |
Zeile 612: | Zeile 613: | ||
und weitere Anweisung folgen. | und weitere Anweisung folgen. | ||
- | Wenn ein Ausdruck als Argument für PRINT eingegeben wird | + | Wenn ein Ausdruck als Argument für PRINT eingegeben wird, |
wertet Basic/Debug ihn aus und listet seinen Dezimalwert auf dem Bildschirm. | wertet Basic/Debug ihn aus und listet seinen Dezimalwert auf dem Bildschirm. | ||
Nur die signifikanten Stellen werden gedruckt, führende Nullen und Divisionsreste nicht. | Nur die signifikanten Stellen werden gedruckt, führende Nullen und Divisionsreste nicht. | ||
PRINT gibt Zahlen als ganze Zahlen mit Vorzeichen aus. Eine Methode zum Drucken von | PRINT gibt Zahlen als ganze Zahlen mit Vorzeichen aus. Eine Methode zum Drucken von | ||
- | unsignierten Werte mittels ' | + | vorzeichenlosen Werten |
- | Um einen Hexadezimalwert | + | Um einen Hexadezimalwert |
PRINT HEX (Ausdruck) | PRINT HEX (Ausdruck) | ||
Zeile 626: | Zeile 627: | ||
Im Gegensatz zu Zeichenketten muss der HEX-Funktion das Schlüsselwort PRINT vorangestellt werden, | Im Gegensatz zu Zeichenketten muss der HEX-Funktion das Schlüsselwort PRINT vorangestellt werden, | ||
- | ebenso wie jeden Ausdruck, der mit einer Variablen beginnt. | + | ebenso wie jedem Ausdruck, der mit einer Variablen beginnt. |
Das Schlüsselwort kann jedoch vor einem | Das Schlüsselwort kann jedoch vor einem | ||
Ausdruck weggelassen werden, wenn dem Ausdruck ein " | Ausdruck weggelassen werden, wenn dem Ausdruck ein " | ||
Zeile 657: | Zeile 658: | ||
Um rechtsbündig ausgerichtete Spalten zu drucken, müssen führende Leerzeichen | Um rechtsbündig ausgerichtete Spalten zu drucken, müssen führende Leerzeichen | ||
- | hinzugefügt werden. Basic/Debugging | + | hinzugefügt werden. Basic/Debug kann nur in Anführungszeichen eingeschlossene |
Leerzeichen drucken. Das folgendes Beispielprogramm fügt führende Leerzeichen zu N hinzu: | Leerzeichen drucken. Das folgendes Beispielprogramm fügt führende Leerzeichen zu N hinzu: | ||
Zeile 667: | Zeile 668: | ||
- | Basic/Debug kann die meisten Steuerzeichen drucken, wie z.B. bell, wenn | + | Basic/Debug kann die meisten Steuerzeichen drucken, wie z.B. den Signalton (bell, ^G), wenn |
sie in einer Zeichenkette in Anführungszeichen enthalten sind. Die | sie in einer Zeichenkette in Anführungszeichen enthalten sind. Die | ||
folgende Steuerzeichen können nicht gedruckt werden: | folgende Steuerzeichen können nicht gedruckt werden: | ||
Zeile 709: | Zeile 710: | ||
alles, was dem REM-Schlüsselwort folgt, daher muss REM und sein | alles, was dem REM-Schlüsselwort folgt, daher muss REM und sein | ||
Kommentar der letzte Befehl in einer Zeile sein. Der gemäßigte Gebrauch von | Kommentar der letzte Befehl in einer Zeile sein. Der gemäßigte Gebrauch von | ||
- | Anmerkungen in einem Programm | + | Anmerkungen in einem Programm |
Pflegen. Bemerkungen nehmen jedoch Platz im Speicher ein und sollten | Pflegen. Bemerkungen nehmen jedoch Platz im Speicher ein und sollten | ||
für maximale Platzausnutzung weggelassen werden. | für maximale Platzausnutzung weggelassen werden. | ||
Zeile 735: | Zeile 736: | ||
Dieser Befehl initiiert die sequentielle Ausführung aller | Dieser Befehl initiiert die sequentielle Ausführung aller | ||
- | Anweisungen im Speicher abgelegt. RUN wird nur im | + | Anweisungen, die im Speicher abgelegt |
Sofortmodus genutzt. Datenwerte für den ersten IN-Befehl können | Sofortmodus genutzt. Datenwerte für den ersten IN-Befehl können | ||
durch Kommas getrennt dem Schlüsselwort RUN folgen: | durch Kommas getrennt dem Schlüsselwort RUN folgen: | ||
Zeile 751: | Zeile 752: | ||
Die Programmausführung wird oft durch einen Fehler abrupt beendet. | Die Programmausführung wird oft durch einen Fehler abrupt beendet. | ||
- | Nach dem Ändern der fehlerhaften Anweisung im Direktmodus kann der Benutzer | + | Nach dem Ändern der fehlerhaften Anweisung im Direktmodus kann der Nutzer |
den Lauf neu starten, indem er GOTO mit den entsprechenden Zeilennummer nutzt, | den Lauf neu starten, indem er GOTO mit den entsprechenden Zeilennummer nutzt, | ||
oder Sie setzen das Programm mit einem STOP-Befehl zurück, und starten | oder Sie setzen das Programm mit einem STOP-Befehl zurück, und starten | ||
Zeile 807: | Zeile 808: | ||
===== Speichernutzung ===== | ===== Speichernutzung ===== | ||
- | Standard: 1020 (Basic-Programm) bis FFDF (Arbeitspeicher) | + | Standard: 1020 (Basic-Programm) bis FFEF (Arbeitspeicher) |
- | yy=FF, xx=10 | + | xx=10, |
+ | |||
+ | Wenn nur ROM vorhanden ist, so ist xx=0 und yy=0. Dann werden nur interne Register genutzt. | ||
+ | In diesem Fall sind nur die Variablen A..L sicher nutzbar. M..Z wird vom Gosub-Stack mitgenutzt. | ||
< | < | ||
Zeile 817: | Zeile 821: | ||
; yy68 - yyF0 Input line buffer, used for editing in immediate mode and | ; yy68 - yyF0 Input line buffer, used for editing in immediate mode and | ||
; user response to IN or INPUT request in run mode. | ; user response to IN or INPUT request in run mode. | ||
+ | ; Reg. 68-7F im ROM-Mode Input-Buffer sowie Expression Evaluation stack. | ||
+ | ; Expression Evaluation stack grows from 7F (hex) down, and the line | ||
+ | ; buffer grows from 68 (hex) up. | ||
; yy56 - yy67 Unused. | ; yy56 - yy67 Unused. | ||
; yy54 - yy55 Storage for variable z. | ; yy54 - yy55 Storage for variable z. | ||
Zeile 824: | Zeile 831: | ||
; yy20 Base of GOSUB stack. Stack grows down to lower memory addresses, | ; yy20 Base of GOSUB stack. Stack grows down to lower memory addresses, | ||
; and may extend until it reaches the top of the user's Basic/Debug program. | ; and may extend until it reaches the top of the user's Basic/Debug program. | ||
+ | ; Reg. 40-67 im ROM-Mode GOSUB-Stack | ||
; Register | ; Register | ||
Zeile 868: | Zeile 876: | ||
- | ===== Direkte | + | ===== Direkte |
Basic/ | Basic/ | ||
- | Direktes | + | Aufrufen der direkten Ein-/ |
- | USR- oder GO@-Anweisung | + | USR- oder GO@-Anweisung Binärdaten lesen und schreiben. |
- | input %8053 (ES1988, | + | input orig Z8671 %54 |
- | output %8058 (ES1988, | + | output orig Z8671 %61 |
Das folgende Beispielprogramm druckt das Hex-Äquivalent | Das folgende Beispielprogramm druckt das Hex-Äquivalent | ||
Zeile 881: | Zeile 889: | ||
10 PRINT "INPUT A CHARACTER, PLEASE"; | 10 PRINT "INPUT A CHARACTER, PLEASE"; | ||
- | 20 C = USER (%8053) | + | 20 C = USER (%54) |
30 PRINT" THE HEX VALUE OF "; | 30 PRINT" THE HEX VALUE OF "; | ||
- | 40 GO@ %8058, C | + | 40 GO@ %61, C |
50 PRINT" IS "; HEX (C);". SHALL WE DO ANOTHER?"; | 50 PRINT" IS "; HEX (C);". SHALL WE DO ANOTHER?"; | ||
- | 60 Q = USER (%8053) | + | 60 Q = USER (%54) |
70 PRINT : IF Q = %59 GOTO 10 | 70 PRINT : IF Q = %59 GOTO 10 | ||
80 REM %59 IS AN ASCII " | 80 REM %59 IS AN ASCII " | ||
+ | ====== Mastermind ====== | ||
+ | |||
+ | Beispielprogramm nach "Zilog z8671-7-chip-computer" | ||
+ | |||
+ | Erläuterungen | ||
+ | * Zeile 20 initialisiert den Zähler T2 für Zufallszahlen | ||
+ | * Zeile 30 erzeugt 4 Zufallszahlen. Dazu ist 4x eine beliebige Taste zu drücken (USR(84) = char input) | ||
+ | * ^10+2 = YY22 Pointer auf Variable A | ||
+ | * THEN, LET, PRINT vor "", | ||
+ | * " | ||
+ | |||
+ | < | ||
+ | 10 REM MASTERMIND | ||
+ | 20 @243=7: | ||
+ | 40 X=USR(84): | ||
+ | | ||
+ | 50 "": | ||
+ | 100 "GUESS ",:IN E, | ||
+ | 110 I=I+1 | ||
+ | 300 J=^10+2: | ||
+ | 301 L=0 L Zähler 1..4 | ||
+ | 302 R=0: | ||
+ | 310 IF ^J=^K LET P=P+1 Test auf gleiche Zahl, gleicher Platz | ||
+ | 320 J=J+2: | ||
+ | 330 J=^10+2: | ||
+ | 331 L=0 L Zähler 1..4 | ||
+ | 340 IF ^J=^K LET R=R+1: | ||
+ | 341 J=J+2 nächste Plätze | ||
+ | 350 L=L+1: IF 4>L GOTO 340 next L | ||
+ | 351 J=^10+2 J zeigt auf A | ||
+ | 352 L=0 L Zähler | ||
+ | 360 K=K+2:IF ^10+17>K GOTO 340 nächster Platz K auf F etc., next | ||
+ | 363 J=^10+2: | ||
+ | 366 IF ^J>9 LET ^J=^J-10 ggf. wieder 10 abziehen | ||
+ | 367 J=J+2 nächster Platz | ||
+ | 368 IF ^10+9>J GOTO 366 Ende nach D | ||
+ | 369 Y=1: | ||
+ | 370 "RIGHT "; | ||
+ | 380 IF 4>P GOTO 100 wenn weniger als 4 am richtigen Platz, weiter raten | ||
+ | 390 X=0: | ||
+ | 400 "RIGHT IN "; | ||
+ | INPUT X Eingabe Variablenname Y oder N | ||
+ | 410 IF X=Y GOTO 10 Wenn Eingabe == 1 (Wert von Y), dann neues Spiel | ||
+ | |||
+ | :RUN | ||
+ | 1111 Zufallszahlen init | ||
+ | GUESS ? 1,2,3,4 | ||
+ | RIGHT 2 PLACE 0 | ||
+ | ... | ||
+ | GUESS ? 3,7,1,0 | ||
+ | RIGHT 4 PLACE 4 | ||
+ | RIGHT IN 15 GUESSES; | ||
+ | ? N | ||
+ | : | ||
+ | </ | ||