Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
tiny:es40:basic_debug [2022/08/04 06:37] – gelöscht - Externe Bearbeitung (Unknown date) 127.0.0.1tiny:es40:basic_debug [2022/08/04 06:37] (aktuell) – ↷ Seite von tiny:basic_debug nach tiny:es40:basic_debug verschoben volkerp
Zeile 1: Zeile 1:
 +====== BASIC/DEBUG für ES4.0 ======
 +
 +BASIC/DEBUG ist ein kleines (nur 2048 Byte!) und extrem leistungsfähiges TINY-BASIC.
 +Es umfasst ein Basic mit Editor/Debugger, Hex, peek/deek und poke/doke (via @ und ^), Rechnen mit Punkt- vor Strichrechnung.
 +
 +Das Original ist im ROM des [[elektronik:z8671|]] enthalten, Details siehe [[elektronik:z8671:basic_debug|]].
 +
 +angepasst an Tiny ES4.0, V. Pohlers Nov. 2021:
 +  * Speicherbereich 8000-87FF, Start auf 8000h
 +  * USR-Funktionen zum Laden/Speichern
 +  * neue Funktion RND(n)
 +
 +===== Download =====
 +
 +  * {{ :tiny:z8671basic_es40.zip |}} Binary, Quellen, Basic-Converter (Perl)
 +===== Beschreibung =====
 +
 +siehe das sehr gute Handbuch von Zilog {{ :elektronik:z8671_basic_debug.pdf |}} (der Hochpfeil in der Doku ist das Zeichen "^")
 +Das meiste daraus auf deutsch steht hier [[elektronik:z8671:handbuch|]].
 +
 +Der abw. Adressbereich und abw. Fehlernummern (s.u.) sind zu beachten!
 +
 +Nach dem Start (auf Adr. 8000h) wir ein Autostart-Programm gesucht. Wird kein Programm auf Adresse 9020h gefunden, sendet das BASIC/DEBUG des Z8671 einen ':' als Bereitschaftszeichen (Prompt) für eine mögliche Kommunikation. Im BASIC/DEBUG-Modus können beliebige BASIC/DEBUG-Befehle an den Z8671 gesendet werden, z.B.
 +<code>
 +:10 PRINT "HALLO TINY"
 +:LIST
 +:RUN
 +</code>
 +===== Erweiterungen/Änderungen =====
 +
 +**Laden und Speichern** erfolgt über USR-Funktionen:
 + LOAD: L=USR(%8003)    L,S sind hier Dummy-Variablen wg. Funktionsaufruf
 + SAVE: S=USR(%8006)
 +
 +Die Funktion **RND**(n) liefert eine Zufallszahl zwischen 0 und n-1.
 +  A=RND(88)
 +Achtung: Es wird die RND-Funktion des ES4.0 genutzt. Diese überschreibt leider die Register %70..%77, genau den Bereich, den BASIC/DEBUG intern für den expression stack benötigt. RND darf deshalb nicht in zu tief verschachtelten Funktionen genutzt werden, möglichst nur per Direktzuweisung an Variablen.
 +  10 A=1+2*(0+0*(0+0*(RND(88)+1)))
 +ist daher nicht zulässig und produziert fehlerhafte Ergebnisse.
 +
 +**Speicherbereiche**
 +  Programm 8000-87FF
 +  Autostart-ROM-Basic-Programm ab 9020h
 +  Basic-Programm  E000..EFFF (am oberen Ende Arbeitszellen)
 +
 +Der **Basic-Beginn** kann geändert werden (Reg8+9), z.B.
 +  PRINT HEX(^8) : REM Anzeige Inhalt Doppelregister %8,9
 +  LET ^8=%A000 : neuer Basic-Beginn auf A000h
 +Hinweis: Das Ende sollte dann auch geändert werden: ^4=Endadr+20h (oder größer), sonst kein insert/delete vernünftig möglich. Wird das Programm nur ausgeführt (z.B. ROM-BASIC-Programme), ist das nicht nötig. Wichtig ist, dass ^4 auf jeden Fall auf freien RAM zeigt (GOSUB-Stack).
 +
 +**RENEW**, stellt nach Neustart das Programm wieder her:
 +  ^^8=1 (setzt erste Zeilennummer von FFFF auf 1)
 +
 +**Beenden** mit Reset oder
 +  GO@0
 +  
 +USR-Funktionen zur **Einzelzeichen-Ein- und -Ausgabe**
 +  input   %8054  (statt %54)
 +  output  %805E  (statt %61)
 +
 +**CLS**
 +  LET X=USR(%805E,12): REM CLS, X IST DUMMY
 +
 +**JTC-Emu**-Hinweis:
 +
 +jtc-Dateien laden, dann Endadr+20h (oder größer) nach %4,5, sonst kein insert/delete vernünftig möglich. z.B.
 +  ^4=%89FF
 +
 +===== Beispiele =====
 +
 +**LIST** innerhalb Programm zur Textausgabe (aus Z8671 BASIC/DEBUG Manual)
 +
 +<code>
 +100 REM THIS PROGRAM PRINTS A MESSAGE N TIMES
 +110 IF N>0 THEN 200
 +120 : PRINT "HOW MANY TIMES";
 +130 : INPUT N
 +200 REM BEGIN LOOP
 +210 : LET N=N-1
 +220 : LIST 1000, 1070
 +230 : IF N>0 THEN 210
 +240 STOP
 +1000|  This is a message saved in memory.  It will be 
 +1010|printed when the program is RUN.  If you tried to 
 +1020|execute lines 1000 to 1070 you would get an error 
 +1030|message.  But in this program, lines 1000+ are not 
 +1040|executed, just LISTed. 
 +1050| 
 +1060| (Signed) 
 +1070| 
 +</code>
 +
 +**MASTERMIND**, aus Zilog Z8671-7-chip-computer, leicht modifiziert.
 +
 +  * Einsatz der zusätzlichen Funktion RND
 +  * ^10+2 = YY22 Pointer auf Variable A. Durch Direktzugriff im Speicher kann auf die Variablen A..D,E..H indiziert zugegriffen werden, es sind Schleifen möglich. (als Array-Ersatz)
 +  * THEN, LET, PRINT vor "", GOTO vor Zahl nach IF, Leerzeichen können entfallen, Für Tempo und Lesbarkeit sollten sie stehen.
 +  * "Y/N":INPUT X - Eingabe von Variablen ist zulässig, "Y" wird als Variable ausgewertet. Die nachfolgende Zeile vergleicht X mit dem Wert Y. Gute Idee!
 +
 +<code>
 +10 REM MASTERMIND
 +40 A=RND(10):B=RND(10):C=RND(10):D=RND(10)
 +50 "":I=0
 +100 "GUESS ",:IN E,F,G,H
 +110 I=I+1
 +300 J=^10+2:K=J+8
 +301 L=0
 +302 R=0:P=0
 +310 IF ^J=^K LET P=P+1
 +320 J=J+2:K=K+2:L=L+1:IF 4>L GOTO 310
 +330 J=^10+2:K=J+8
 +331 L=0
 +340 IF ^J=^K LET R=R+1:^J=^J+10:L=3
 +341 J=J+2
 +350 L=L+1: IF 4>L GOTO 340
 +351 J=^10+2
 +352 L=0
 +360 K=K+2:IF ^10+17>K GOTO 340
 +363 J=^10+2:K=J+8
 +366 IF ^J>9 LET ^J=^J-10
 +367 J=J+2
 +368 IF ^10+9>J GOTO 366
 +369 Y=1:N=0
 +370 "RIGHT ";R;" PLACE ";P
 +380 IF 4>P GOTO 100
 +390 X=0:Y=1
 +400 "RIGHT IN ";I;" GUESSES;";"PLAY ANOTHER Y/N":INPUT X
 +410 IF X=Y GOTO 10
 +
 +</code>
 +
 +===== Fehlermeldungen =====
 +
 +Durch die erweiterte IL verschieben sich die Fehlernummern gegenüber dem Original:
 +
 +<code>
 +11 Program line has a line number 0 or greater than 32768.
 +17 Memory full; new line not inserted.
 +27 No program to RUN.
 +38 GOTO is not at the end of program line.
 +42 Cannot GOTO negative or zero line number.
 +45 Line number in GOTO does not exist.
 +67 GOSUB is not at the end of the line.
 +72 Unrecognizable statement type beginning with GO.
 +82 Unrecognizable statement type, or '=' missing from LET statement.
 +100 LET is missing its '='.
 +142 Quote missing in PRINT statement.
 +173 RETURN is not at the end of the line.
 +174 GOSUB stack underflow.
 +177 The GOSUB for this RETURN no longer exists.
 +183 STOP is not at the end of the line.
 +209 INPUT variable name is missing.
 +212 IN or INPUT expects variable name.
 +250 LIST is not at end of line.
 +313 Unrecognizable relation in IF statement.
 +349 Out of memory on GOSUB or expression evaluation.
 +384 Divide by zero.
 +394 Missing parenthesis in AND, RND or USR call.
 +441 Syntax error in expression, or unrecognizable statement type.
 +445 Missing right parenthesis in expression.
 +</code>
 +