Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
elektronik:u883 [2021/08/02 09:08] – [JU+TE-Hinweise] volkerp | elektronik:u883 [2024/04/28 13:13] (aktuell) – [Downloads] volkerp | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== U883 ====== | ====== U883 ====== | ||
- | Der U883 ist ein spezieller Vertreter der [[tiny: | + | Der U883 ist ein spezieller Vertreter der [[elektronik: |
Der U883 ist maskenprogammierter U881, der interne PROM enthält ein einfaches TINY-MPBASIC. | Der U883 ist maskenprogammierter U881, der interne PROM enthält ein einfaches TINY-MPBASIC. | ||
Zeile 10: | Zeile 10: | ||
Der U883 wird im Heimcomputer [[:tiny|]] genutzt. | Der U883 wird im Heimcomputer [[:tiny|]] genutzt. | ||
+ | Ein Vorläufer des U883 ist der UB881D-004. Dieser maskenprogammierte Einchipmikrorechner enthält die Version 2.0 des Tiny- | ||
+ | MPBASIC. im U883 ist Version 3.0 des Tiny-MPBASIC enthalten. | ||
+ | |||
+ | Zusätzlich zum U883 erschien ein 8K-PROM U2365 **BM200** mit Entwicklungstools zum U883 (Basic-Editor, | ||
===== Downloads ===== | ===== Downloads ===== | ||
- | * {{: | + | * {{ : |
Zeile 23: | Zeile 27: | ||
===== Literatur ===== | ===== Literatur ===== | ||
- | * Claßen/ | + | |
- | * rfe 3/1985, s. xxx | + | |
+ | * Müller, S.: Einchipmikrorechner U883 interpretiert Tiny-MPBASIC. Radio, | ||
* TINY-MPBASIC. Kundeninformation, | * TINY-MPBASIC. Kundeninformation, | ||
* ein paar Hinweise zum TINY-MPBASIC stehen auch in Kieser/ | * ein paar Hinweise zum TINY-MPBASIC stehen auch in Kieser/ | ||
- | Mit dem PROM U2365 **BM200** gab es einen 2K-ROM mit Entwicklungstools zum U883. Beschrieben wurde dies in der mikroprozessorttechnik | + | Mit dem PROM U2365 **BM200** gab es einen 8K-ROM mit Entwicklungstools zum U883. Beschrieben wurde dies in der [[elektronik: |
* https:// | * https:// | ||
Zeile 40: | Zeile 45: | ||
Autor des TINY-MPBASIC ist Siegmar Müller, damals Applikations-Ing. im Funkwerk Erfurt (Truppe Meder/ | Autor des TINY-MPBASIC ist Siegmar Müller, damals Applikations-Ing. im Funkwerk Erfurt (Truppe Meder/ | ||
- | ... | + | Beschreibung s. [[elektronik: |
- | Beschreibung s.a. TINY | ||
- | |||
- | Auszug aus Claßen/ | ||
- | |||
- | **8. U883 TINY-MPBASIC** | ||
- | |||
- | Der Einchipmikrorechner U883 enthält in seinem 2K Byte großen internen ROM | ||
- | einen einfachen BASIC-Interpreter. Daneben existiert ein dazugehöriger Editor- | ||
- | / | ||
- | Programmentwicklung notwendig sind, enthält. Diese Komponenten liegen entweder | ||
- | im externen ROM, sie können nach vollendeter Entwicklungsarbeit entfallen, oder sie existieren | ||
- | auf einem Wirtsrechner. | ||
- | |||
- | Damit wird vielen potentiellen Anwendern des Einchipmikrorechners, | ||
- | keine Entwicklungstechnik verfügen, eine Möglichkeit gegeben, Programme zu | ||
- | entwickeln (z.B.: für Steuerungs- oder Regelungsaufgaben im | ||
- | Rationalisierungsmittelbau). Der Anwender kann somit seine Programme im | ||
- | Zusammenspiel mit der von ihm erstellten Hardware austesten. Nach der Erprobung | ||
- | ist das fertige Programm in einen EPROM zu laden, und das Gerät kann eingesetzt | ||
- | werden. | ||
- | |||
- | Da die Problemlösung in Form von BASIC-Programmen erarbeitet wird, ist ein | ||
- | schnelles Erstellen und Modifizieren der Anwendersoftware möglich, ohne daß ein | ||
- | großer Aufwand für die sonst notwendige Entwicklungstechnik auftritt. | ||
- | |||
- | **8.1. Sprachkonzept und Anwendung** | ||
- | |||
- | Das in TINY-MPBASIC geschriebene Anwenderprogramm wird vom im internen ROM- | ||
- | Bereich des U883 befindlichen BASIC-Interpreters abgearbeitet. | ||
- | |||
- | Neben dem BASIC-Programm sind Initialisierungsteile und, falls notwendig, die | ||
- | Prozeduren GET_CHAR (Einzelzeicheneingabe) und PUT_CHAR (Einzelzeichenausgabe) | ||
- | zu erstellen. Diese sehr stark vom Einsatzfall abhängigen Teile sind in | ||
- | Assemblersprache zu realisieren. | ||
- | |||
- | Nach durchgeführter Initialisierung kann das BASIC-Anwenderprogramm aufgerufen | ||
- | werden. Dies erfolgt durch einen CALL-Befehl zur Adresse %7FD (Registerpointer auf %10: SRP #%10). Vorher sind in | ||
- | Register 6 der höherwertige Teil und in Register 7 der niederwertige Teil der | ||
- | Startadresse zu laden. Der Anwender kann für seine Problemlösung zusätzlich noch | ||
- | externe Prozeduren und Funktionen in Assemblersprache realisieren, | ||
- | aus aufrufbar sind. Das Vorhandensein externer Prozeduren und Funktionen wird | ||
- | dem Interpreter dadurch bekannt gemacht, daß in den Registern 8 und 9 die | ||
- | Adresse einer Prozedurnamentabelle übergeben wird. Falls keine externen | ||
- | Prozeduren verwendet werden, so sind die Register 8 und 9 vor Aufruf des BASIC- | ||
- | Interpreters Null zu setzen. Das Setzen der Register 6 bis 9 erfolgt mit dem Registerpointerwert %00. | ||
- | |||
- | Das BASIC-Anwenderprogramm muss syntaktisch fehlerfrei sein. Es wird in | ||
- | verdichteter Form abgespeichert. Die Erstellung eines syntaktisch fehlerfreien | ||
- | Programms und der abarbeitbaren verdichteten Form erfolgt mit Hilfe | ||
- | des Editor/ | ||
- | |||
- | Der TINY-MPBASIC-Interpreter verarbeitet intern 16 Bit breite Daten, die als | ||
- | Integergrößen (Zweierkomplementdarstellung: | ||
- | Bytewerte (niederwertige 8 Bit) interpretiert werden können. Konstanten können | ||
- | in Dezimal- oder Hexadezimalschreibweise (durch das Prozentzeichen | ||
- | gekennzeichnet: | ||
- | Klammern gesetzt werden, damit das Vorzeichen nicht als Operator wirkt. Für | ||
- | Variablenbezeichnungen sind die Buchstaben A bis Z verwendbar. (Sie belegen im | ||
- | Registersatz die Adressen ab %20.) | ||
- | |||
- | |||
- | Bild 8.1. Zusammenspiel des U883-BASIC-Interpreters mit Anwenderteilen | ||
- | |||
- | Ausdrücke werden durch Verknüpfung von Konstanten, Variablen- oder | ||
- | Funktionswerten durch logische und arithmetische Operatoren gebildet. | ||
- | |||
- | ^ Operatoren ^ ^ Abkürzung ^ ASCII-Kode ^ | ||
- | | + | Addition | + | 2B | | ||
- | | - | Subtraktion | - | 2D | | ||
- | | * | Multiplikation | * | 2A | | ||
- | | / | Division | / | 2F | | ||
- | | $MOD | Modulo | $M | 24 4D | | ||
- | | $AND | logisches UND (bitweise) | $A | 24 41 | | ||
- | | $OR | logisches ODER " | ||
- | | $XOR | exklusives ODER " | $X | 24 58 | | ||
- | |||
- | Ausdrücke werden von links nach rechts ausgewertet. Es besteht die Möglichkeit | ||
- | der Klammerung. Die Verschachtelungstiefe hängt dabei von der verfügbaren | ||
- | Stackgröße ab. | ||
- | |||
- | Eine Prozedur ist ein in Assemblersprache geschriebenes Programm, das | ||
- | einen Satz von BASIC übergebenen Eingabeparametern verarbeitet und | ||
- | Ausgabeparameter an den BASIC-Interpreter zurückgibt. Die | ||
- | Parameterübergabe erfolgt im Stackbereich. Der Aufruf erfolgt über | ||
- | Prozedurnamen. | ||
- | |||
- | Bild 8.2. Parameterübergabeschema für externe Prozeduren | ||
- | |||
- | Funktionen sind Prozeduren, die genau einen Wert an den Interpreter übergeben. | ||
- | Sie können deshalb in Ausdrücken verwendet werden. | ||
- | |||
- | Neben einer Reihe von fest integrierten Standardprozeduren und -funktionen | ||
- | hat der Anwender die Möglichkeit, | ||
- | angepasste Prozeduren oder Funktionen hinzuzufügen. Die Verbindung zu | ||
- | TINY-MPBASIC erfolgt über die schon erwähnte Prozedurnamentabelle. | ||
- | |||
- | Bild 8.3. Aufbau der externen Prozedurnamentabelle | ||
- | |||
- | je Procedur | ||
- | 1 Byte Namenslänge | ||
- | 1..5 Byte Procedurenamen | ||
- | 2 Byte Adresse | ||
- | Ende mit Namenslänge = FFh | ||
- | |||
- | Das BASIC-Anwenderprogramm ist zeilenorientiert. Jede Zeile beginnt mit einer | ||
- | Nummer. Pro Zeile muss wenigstens eine Anweisung vorhanden sein. Mehrere | ||
- | Anweisungen auf einer Zeile sind möglich, wenn sie durch Semikolons getrennt | ||
- | sind. | ||
- | Soll eine Anweisung mehrmals hintereinander mit verschiedenen Argumenten ausgeführt | ||
- | werden, dann genügt es, den Namen einmal aufzuschreiben und die verschiedenen Argumente | ||
- | durch Kommas zu trennen. | ||
- | Die Programmzeilen müssen in aufsteigender Folge markiert sein. Die | ||
- | Anweisungsnamen werden in abgekürzter Form abgelegt, um möglichst wenig | ||
- | Speicherplatz zu belegen. Leerzeichen werden außer in Kommentaren und Texten | ||
- | entfernt. Die Sortierung und das Herstellen der verdichteten Form übernimmt | ||
- | normalerweise der Editorteil. | ||
- | |||
- | **8.2. Anweisungen** | ||
- | |||
- | Die Wertzuweisung für eine Variable ist die LET-Anweisung. | ||
- | |||
- | LET Variablenname = Ausdruck | ||
- | |||
- | Zur Programmverzweigung dient die GOTO-Anweisung. | ||
- | |||
- | GOTO Ausdruck | ||
- | |||
- | Unterprogramme können mit Hilfe der GOSUB-Anweisung aufgerufen werden. Das Ende | ||
- | eines Unterprogramms wird durch die RETURN-Anweisung markiert. Sie bewirkt die | ||
- | Programmfortsetzung bei der nach GOSUB folgenden Anweisung. | ||
- | |||
- | GOSUB Ausdruck | ||
- | RETURN | ||
- | |||
- | Unterprogramme können weitere Unterprogramme aufrufen. Die | ||
- | Verschachtelungstiefe wurde zu Verhinderung eines Stacküberlaufs | ||
- | auf 15 beschränkt. | ||
- | |||
- | Programmverzweigungen werden mit der IF/ | ||
- | folgende Form: | ||
- | |||
- | IF Ausdruck Vergleichsoperator Ausdruck THEN Anweisung | ||
- | ELSE Anweisung | ||
- | |||
- | Für Vergleichsoperator kann dabei stehen: | ||
- | |||
- | = , < , > , <= , >= oder <> (für ungleich) | ||
- | |||
- | Falls die nach IF folgende Bedingung wahr ist. so wird die folgende Anweisung | ||
- | ausgeführt und der Rest übersprungen. Andernfalls wird mit die mit ELSE | ||
- | beginnende Zeile abgearbeitet. | ||
- | |||
- | Mit der PROC-Anweisung kann innerhalb des BASIC-Programms eine externe | ||
- | Prozedur aufgerufen werden. | ||
- | |||
- | PROC [Variablenliste] = Prozedurname [Parameterliste] | ||
- | |||
- | Die Variablen innerhalb der optionalen Variablenliste (Rückgabeparameter) | ||
- | und die Parameter innerhalb der ebenfalls optionalen Parameterliste | ||
- | (Eingabeparameter) sind durch Kommas zu trennen. Als Parameter sind | ||
- | Variablen und Konstanten zulässig. | ||
- | |||
- | Zur Ein-/ | ||
- | Festlegung, über welche Geräte die Ein-/ | ||
- | Programme GET_CHAR und PUT_CHAR. Dies kann je nach Anwendungsfall sehr | ||
- | unterschiedliche Hardware sein (z.B.: Terminal, Fernschreiber, | ||
- | Anzeigen und verschiedene Tastaturen o.ä.). | ||
- | |||
- | PRINT [" | ||
- | PRINTHEX [" | ||
- | |||
- | Die PRINT-Anweisungen geben einen Zahlenwert (bei PRINT: dezimal und bei | ||
- | PRINTHEX: hexadezimal) aus. Diesem Wert kann eine beliebige Textkette | ||
- | vorangestellt sein. Falls sowohl der Text als auch der Ausdruck fehlen, so | ||
- | wird lediglich ein Zeilenvorschub (%0D) ausgegeben. Wird die PRINT-Anweisung | ||
- | (bzw. PRINTHEX) mit einem Komma abgeschlossen, | ||
- | Zeilenvorschubs (%0D). | ||
- | |||
- | INPUT [" | ||
- | |||
- | Die INPUT-Anweisung gibt, falls vorhanden, erst den angegebenen Text aus | ||
- | und weist den eingegebenen Wert der spezifizierten Variable zu. Die Eingabe | ||
- | kann sowohl dezimal als auch hexadezimal (% vor dem Wert) erfolgen. | ||
- | Bei fehlerhafter Eingabe wird ein Fragezeichen ausgegeben und eine neue | ||
- | Eingabe erwartet. INPUT ist auch als Funktion verfügbar. | ||
- | |||
- | Zur Programmsteuerung dienen die STOP- und END-Anweisung. | ||
- | |||
- | STOP | ||
- | END | ||
- | |||
- | Die Programmzeile, | ||
- | der Interpreter verlassen. Sie dient in Verbindung mit dem Debuggerteil | ||
- | zum Programmtest (Setzen von Unterbrechungspunkten). Durch Aufruf des | ||
- | Interpreters mit dem Eintrittspunkt %7FA kann der Programmablauf fortgesetzt | ||
- | werden. | ||
- | Die END-Anweisung kennzeichnet das Programmende. Sie bewirkt ebenfalls das | ||
- | Verlassen des BASIC-Interpreters. | ||
- | |||
- | Zur Kommentierung der Programme dient die REM-Anweisung. | ||
- | |||
- | REM [Kommentartext] | ||
- | |||
- | Bei der Anwendung dieser Anweisung sollte der zur Verfügung stehende | ||
- | Gesamtspeicherplatz für das Anwenderprogramm bedacht werden. | ||
- | |||
- | Zur Erzeugung von Warteschleifen kann die WAIT-Anweisung verwendet werden. | ||
- | |||
- | WAIT Ausdruck | ||
- | |||
- | Sie bewirkt das Durchlaufen einer Softwarewarteschleife. Der Ausdruckswert | ||
- | spezifiziert dabei die Anzahl der Durchläufe. Beim Wert 1 wird die Schleife | ||
- | einmal und beim Wert -1 (entspricht %FFFF) 65536-mal durchlaufen. Bei einer Taktfrequenz von 8 | ||
- | MHz dauert ein Durchlauf eine Millisekunde. Die Zeitangabe ist nicht ganz exakt, da für | ||
- | den Aufruf der Zeitschleife eine gewisse Zeit benötigt wird. | ||
- | |||
- | Mit Hilfe der CALL-Anweisung kann ein in Assemblersprache geschriebenes Programm | ||
- | aufgerufen werden, ohne daß Parameter übermittelt werden. | ||
- | |||
- | CALL Ausdruck | ||
- | |||
- | Der Ausdruckswert ist die Programmadresse. Das Maschinenprogramm muß mit einem | ||
- | RET-Befehl enden. | ||
- | |||
- | Mit Hilfe der TRAP-Anweisung kann laufend das Erfülltsein einer Bedingung | ||
- | getestet werden. | ||
- | |||
- | TRAP Bedingung TO Ausdruck | ||
- | |||
- | Nach dieser Anweisung prüft der Interpreter vor der Abarbeitung jeder neuen | ||
- | Zeile, ob die angegebene Bedingung erfüllt ist. Im positiven Fall | ||
- | wird zur TRAP-Routine verzweigt, deren Anfangsadresse durch Ausdruck | ||
- | bestimmt wird. Eine TRAP-Routine ist ein Unterprogramm, | ||
- | endet. Sobald eine TRAP-Bedingung eingeschaltet ist, verlangsamt sich die | ||
- | weitere Programmabarbeitung. Durch die Anweisung | ||
- | |||
- | CLTRP | ||
- | |||
- | wird eine aktive TRAP-Bedingung gelöscht. | ||
- | |||
- | Fest integriert im TINY-MPBASIC-Interpreter sind folgende Standard-Prozeduren und -Funktionen: | ||
- | |||
- | | ABS [Parameter] | ||
- | | NOT [Parameter] | ||
- | | GTC | Zeichen mittels GET_CHAR holen | | ||
- | | INPUT | Zahl mittels GET_CHAR holen | | ||
- | | PTC [Parameter] | ||
- | | RL [Parameter] | ||
- | | RR [Parameter] | ||
- | | GETR [Register] | ||
- | | GETRR [Register] | liefert den Inhalt des spezifizierten Registers (höherwertige 8 Bit) und des nachfolgenden Registers (niederwertige 8 Bit) | | ||
- | | GETEB [Adresse] | ||
- | | GETEW [Adresse] | ||
- | |||
- | Analog können auch Register und Bytes (bzw. Wörter) im externen | ||
- | Datenspeicher gesetzt werden: | ||
- | |||
- | | SETR [Register, | ||
- | | SETRR [Register, | ||
- | | SETEB [Adresse, | ||
- | | SETEW [Adresse, | ||
- | |||
- | Innerhalb der verdichteten Form des BASIC-Programms werden | ||
- | für die Anweisungen folgende Abkürzungen verwendet: | ||
- | |||
- | ^ Anweisung ^ Abkürzung ^ ASCII-Code ^ | ||
- | | LET | L | 4C | | ||
- | | GOTO | G | 47 | | ||
- | | GOSUB | S | 53 | | ||
- | | RETURN | R | 52 | | ||
- | | IF..THEN | F...; | 46...3B | | ||
- | | ELSE... | >; ... | 3E 3B | | ||
- | | PROC | O | 4F | | ||
- | | INPUT | I | 49 | | ||
- | | PRINT | P | 50 | | ||
- | | PRINTHEX | H | 48 | | ||
- | | STOP | T | 54 | | ||
- | | END | E | 45 | | ||
- | | REM | M | 4D | | ||
- | | WAIT | W | 57 | | ||
- | | CALL | C | 43 | | ||
- | | TRAP...TO | !..., |21...2C | | ||
- | | CLRTRP | / | 2F | | ||
- | |||
- | Der restliche Programmtext wird ohne Leerzeichen in ASCII-Zeichen (die | ||
- | Zeilennummer als 2 Byte große Hexadezimalzahl) abgespeichert. Das | ||
- | Zeilenende wird durch %0D und das Programmende durch %00 gekennzeichnet. | ||
- | |||
- | ===== Beispiel ===== | ||
- | |||
- | **Hinweis: der nachfolgende Text beschreibt nicht die endgültige Version des TINY-MPBASIC, | ||
- | Die finale Beschreibung ist in rfe 3/1985, im Wissensspeicher 4. Auflage sowie in der Doku zum JU+TE zu finden** | ||
- | |||
- | Auszug aus Claßen/ | ||
- | |||
- | **8.3. Programmbeispiel** | ||
- | |||
- | Das folgende Demonstrationsbeispiel zur Anwendung von TINY-MPBASIC wurde aus | ||
- | /46/ übernommen. Das Bild 8.4. zeigt das zur Initialisierung und Programmstart | ||
- | notwendige Assemblerprogramm. | ||
- | |||
- | Die Bilder 8.5. und 8.6. zeigen ein BASIC-Demonstrationsprogramm in | ||
- | Quellform und in der verdichteten Form. | ||
- | |||
- | < | ||
- | 01 U883TEST MODULE | ||
- | 02 | ||
- | 03 ! MOEGLICHES ANWENDERPROGRAMM IM EXT. SPEICHER ! | ||
- | 04 INTERNAL | ||
- | 05 | ||
- | 06 ENTRY | ||
- | P 0812 07 $ABS %812 ! EINTRITTSPUNKTE ! | ||
- | P 0812 8D 081B 08 JP BEGIN | ||
- | P 0815 8D 0841 09 JP GET_CHAR | ||
- | P 0818 8D 0851 10 JP PUT_CHAR | ||
- | 11 END EINTRITT | ||
- | 12 | ||
- | 13 ! INITIALISIERUNG UND AUFRUF DES INTERPRETERS ! | ||
- | 14 | ||
- | P 081B 15 BEGIN PROCEDURE | ||
- | 16 ENTRY | ||
- | P 081B 8C 96 | ||
- | P 081D E6 FF 80 | ||
- | P 0820 E6 F4 40 | ||
- | P 0823 E6 F7 49 | ||
- | P 0826 E6 F5 0D | ||
- | P 0829 E6 F1 43 | ||
- | P 082C B0 FB | ||
- | P 082E 9F | ||
- | P 082F E6 06 08 | ||
- | P 0832 E6 07 69 | ||
- | P 0835 B0 08 | ||
- | P 0837 B0 09 | ||
- | P 0839 E6 F0 23 | ||
- | P 083C D6 07FD | ||
- | P 083F 8B DA | ||
- | P 0841 32 END BEGIN | ||
- | 33 | ||
- | 34 ! ZEICHEN HOLEN BZW. SENDEN | ||
- | 35 | ||
- | 36 | ||
- | P 0841 37 | ||
- | 38 ENTRY | ||
- | P 0841 56 FA F7 | ||
- | P 0844 76 FA 08 40 GTC10: | ||
- | P 0847 6B FB | ||
- | P 0849 56 FA F7 | ||
- | P 084C 88 F0 | ||
- | P 084E 56 E8 7F | ||
- | P 0851 45 END GET_CHAR | ||
- | 46 | ||
- | P 0851 47 | ||
- | 48 ENTRY | ||
- | P 0851 76 FA 10 | ||
- | P 0854 6B FB | ||
- | P 0856 56 FA EF | ||
- | P 0859 89 F0 | ||
- | P 085B A6 E8 0D | ||
- | P 085E 6B 01 | ||
- | P 0860 AF | ||
- | P 0861 8C 0A 56 PTC10: | ||
- | P 0863 D6 0851 | ||
- | P 0866 8C 0D | ||
- | P 0868 AF | ||
- | P 0869 60 END PUT_CHAR | ||
- | 61 | ||
- | 62 $SECTION PROGRAM | ||
- | 63 | ||
- | 64 ! BEGINN DES BASICPROGRAMMS ! | ||
- | P 0869 65 | ||
- | 66 END U883TEST | ||
- | </ | ||
- | |||
- | Bild 8.4. Assemblerprogramm für TINY-MPBASIC | ||
- | |||
- | <code gwbasic> | ||
- | 1 REM BASIC DEMONSTRATION | ||
- | 10 PRINT " | ||
- | 20 PRINT | ||
- | 30 PRINT "1 PRIMFAKTORZERLEGUNG" | ||
- | 40 PRINT "2 UMRECHNUNG HEX-DEZIMAL" | ||
- | 50 PRINT "3 UMRECHNUNG DEZIMAL-HEX" | ||
- | 60 PRINT "4 REGISTERINHALT MODIFIZIEREN" | ||
- | 70 PRINT "5 LANGSAM ALPHABET DRUCKEN" | ||
- | 80 PRINT "6 NEU BEGINNEN" | ||
- | 90 PRINT | ||
- | 100 INPUT " | ||
- | 110 GOTO 150*A | ||
- | 150 REM PRIMFAKTORZERLEGUNG | ||
- | 160 INPUT " ZAHL=? " A | ||
- | 170 LET B = 2 | ||
- | 180 IF A < 2, GOTO 240 | ||
- | 190 LET C = A/B*B | ||
- | 200 IF C <> A, LET B = B+1; GOTO 190 | ||
- | 220 PRINT B | ||
- | 230 LET A = A/B; GOTO 180 | ||
- | 240 PRINT " | ||
- | 250 GOTO 100 | ||
- | 300 REM UMRECHNUNGEN | ||
- | 310 INPUT " | ||
- | 320 PRINT " | ||
- | 330 GOTO 100 | ||
- | 450 INPUT " | ||
- | 460 PRINTHEX "HEX = " A | ||
- | 470 GOTO 100 | ||
- | 600 REM REGISTERINH. MODIFIZ. | ||
- | 610 INPUT " | ||
- | 620 PRINTHEX " | ||
- | 630 INPUT "NEUER INHALT: " B | ||
- | 640 PROC SETR[A,B] | ||
- | 650 GOTO 100 | ||
- | 750 REM ALPHABET DRUCKEN | ||
- | 760 INPUT " | ||
- | 770 LET B = 26; LET C = %41 | ||
- | 780 LET Z = C; GOSUB 1000 | ||
- | 790 LET Z = %20; GOSUB 1000; REM SPACE DAZWISCHEN | ||
- | 800 WAIT A | ||
- | 810 LET C = C+1; LET B = B-1 | ||
- | 820 IF B <> 0, GOTO 780 | ||
- | 830 LET Z = %D; GOSUB 1000; REM CR & LF ANHAENGEN | ||
- | 840 LET Z = %A; GOSUB 1000 | ||
- | 850 GOTO 100 | ||
- | 900 REM PROGRAMM VERLASSEN | ||
- | 910 END | ||
- | 1000 IF GETR[%FA] $A %10 <> %10 GOTO 1000 | ||
- | 1010 PROC SETR[%FA, | ||
- | 1020 PROC SETR[%F0,Z] | ||
- | 1030 RETURN | ||
- | 2000 END | ||
- | </ | ||
- | |||
- | Bild 8.5. TINY-MPBASIC-Programm (Quellform) | ||
- | |||
- | < | ||
- | 0000h: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ | ||
- | 0010h: FF FF 8D 08 1B 8D 08 41 8D 08 51 8C 96 E6 FF 80 ; ÿÿ...A.QŒ–æÿ€ | ||
- | 0020h: E6 F4 40 E6 F7 41 E6 F5 0D E6 F1 43 B0 FB 9F E6 ; æô@æ÷Aæõ.æñC°ûŸæ | ||
- | 0030h: 06 08 E6 07 69 B0 08 B0 09 E6 F0 23 D6 07 FD 8B ; ..æ.i°.°.æð# | ||
- | 0040h: DA 56 FA F7 76 FA 08 6B FB 56 FA F7 88 F0 56 E8 ; ÚVú÷vú.kûVú÷ˆðVè | ||
- | 0050h: 7F 76 FA 10 6B FB 56 FA EF 89 F0 A6 E8 0D 6B 01 ; vú.kûVúï‰ð¦è.k. | ||
- | 0060h: AF 8C 0A D6 08 51 8C 0D AF 00 00 4D 42 41 53 49 ; ¯Œ.Ö.QŒ.¯..MBASI | ||
- | 0070h: 43 44 45 4D 4F 4E 53 54 52 41 54 49 4F 4E 0D 00 ; CDEMONSTRATION.. | ||
- | 0080h: 0A 50 22 57 41 45 48 4C 45 4E 20 53 49 45 20 42 ; .P" | ||
- | 0090h: 49 54 54 45 20 45 49 4E 20 50 52 4F 47 52 41 4D ; ITTE EIN PROGRAM | ||
- | 00a0h: 4D 42 45 49 53 50 49 45 4C 20 21 22 0D 00 14 50 ; MBEISPIEL !"...P | ||
- | 00b0h: 0D 00 1E 50 22 31 20 50 52 49 4D 46 41 4B 54 4F ; ...P"1 PRIMFAKTO | ||
- | 00c0h: 52 5A 45 52 4C 45 47 55 4E 47 22 0D 00 28 50 22 ; RZERLEGUNG" | ||
- | 00d0h: 32 20 55 4D 52 45 43 48 4E 55 4E 47 20 48 45 58 ; 2 UMRECHNUNG HEX | ||
- | 00e0h: 2D 44 45 5A 49 4D 41 4C 22 0D 00 32 50 22 33 20 ; -DEZIMAL" | ||
- | 00f0h: 55 4D 52 45 43 48 4E 55 4E 47 20 44 45 5A 49 4D ; UMRECHNUNG DEZIM | ||
- | 0100h: 41 4C 2D 48 45 58 22 0D 00 3C 50 22 34 20 52 45 ; AL-HEX" | ||
- | 0110h: 47 49 53 54 45 52 49 4E 48 41 4C 54 20 4D 4F 44 ; GISTERINHALT MOD | ||
- | 0120h: 49 46 49 5A 49 45 52 45 4E 22 0D 00 46 50 22 35 ; IFIZIEREN" | ||
- | 0130h: 20 4C 41 4E 47 53 41 4D 20 41 4C 50 48 41 42 45 ; LANGSAM ALPHABE | ||
- | 0140h: 54 20 44 52 55 43 4B 45 4E 22 0D 00 50 50 22 36 ; T DRUCKEN" | ||
- | 0150h: 20 4E 45 55 20 42 45 47 49 4E 4E 45 4E 22 0D 00 ; NEU BEGINNEN" | ||
- | 0160h: 5A 50 0D 00 64 49 22 50 52 4F 47 52 41 4D 4D 20 ; ZP..dI" | ||
- | 0170h: 4E 52 20 3F 3A 20 22 41 0D 00 6E 47 31 35 30 2A ; NR ?: " | ||
- | 0180h: 41 0D 00 96 4D 50 52 49 4D 46 41 4B 54 4F 52 5A ; A..–MPRIMFAKTORZ | ||
- | 0190h: 45 52 4C 45 47 55 4E 47 0D 00 A0 49 22 5A 41 48 ; ERLEGUNG.. I" | ||
- | 01a0h: 4C 3D 3F 20 22 41 0D 00 AA 4C 42 3D 32 0D 00 B4 ; L=? " | ||
- | 01b0h: 46 41 3C 32 3B 47 32 34 30 0D 00 BE 4C 43 3D 41 ; FA< | ||
- | 01c0h: 2F 42 2A 42 0D 00 C8 46 43 3C 3E 41 3B 4C 42 3D ; / | ||
- | 01d0h: 42 2B 31 3B 47 31 39 30 0D 00 DC 50 42 0D 00 E6 ; B+1; | ||
- | 01e0h: 4C 41 3D 41 2F 42 3B 47 31 38 30 0D 00 F0 50 22 ; LA=A/ | ||
- | 01f0h: 46 45 52 54 49 47 22 0D 00 FA 47 31 30 30 0D 01 ; FERTIG" | ||
- | 0200h: 2C 4D 55 4D 52 45 43 48 4E 55 4E 47 45 4E 0D 01 ; , | ||
- | 0210h: 36 49 22 48 45 58 5A 41 48 4C 3D 3F 20 22 41 0D ; 6I" | ||
- | 0220h: 01 40 50 22 44 45 5A 49 4D 41 4C 20 3D 20 22 41 ; .@P" | ||
- | 0230h: 0D 01 4A 47 31 30 30 0D 01 C2 49 22 44 45 5A 49 ; ..JG100..ÂI" | ||
- | 0240h: 4D 41 4C 5A 41 48 4C 3D 3F 20 22 41 0D 01 CC 48 ; MALZAHL=? " | ||
- | 0250h: 22 48 45 58 20 3D 20 22 41 0D 01 D6 47 31 30 30 ; "HEX = " | ||
- | 0260h: 0D 02 58 4D 52 45 47 49 53 54 45 52 49 4E 48 2E ; ..XMREGISTERINH. | ||
- | 0270h: 20 4D 4F 44 49 46 49 5A 2E 0D 02 62 49 22 52 45 ; MODIFIZ...bI" | ||
- | 0280h: 47 49 53 54 45 52 20 4E 52 2E 3A 20 22 41 0D 02 ; GISTER NR.: "A.. | ||
- | 0290h: 6C 48 22 49 4E 48 41 4C 54 20 3D 20 22 47 45 54 ; lH" | ||
- | 02a0h: 52 5B 41 5D 0D 02 76 49 22 4E 45 55 45 52 20 49 ; R[A]..vI" | ||
- | 02b0h: 4E 48 41 4C 54 3A 20 22 42 0D 02 00 4F 53 45 54 ; NHALT: " | ||
- | 02c0h: 52 5B 41 2C 42 5D 0D 02 8A 47 31 30 30 0D 02 EE ; R[A, | ||
- | 02d0h: 4D 41 4C 50 48 41 42 45 54 20 44 52 55 43 4B 45 ; MALPHABET DRUCKE | ||
- | 02e0h: 4E 0D 02 F8 49 22 57 41 52 54 45 5A 45 49 54 20 ; N..øI" | ||
- | 02f0h: 5A 57 49 53 43 48 45 4E 20 5A 57 45 49 20 42 55 ; ZWISCHEN ZWEI BU | ||
- | 0300h: 43 48 53 54 41 42 45 4E 20 5B 4D 53 45 43 5D 3A ; CHSTABEN [MSEC]: | ||
- | 0310h: 22 41 0D 03 02 4C 42 3D 32 36 3B 4C 43 3D 25 34 ; " | ||
- | 0320h: 31 0D 03 0C 4C 5A 3D 43 3B 53 31 30 30 30 0D 03 ; 1...LZ=C; | ||
- | 0330h: 16 4C 5A 3D 25 32 30 3B 53 31 30 30 30 3B 4D 53 ; .LZ=%20; | ||
- | 0340h: 50 41 43 45 20 44 41 5A 57 49 53 43 48 45 4E 0D ; PACE DAZWISCHEN. | ||
- | 0350h: 03 20 57 41 0D 03 2A 4C 43 3D 43 2B 31 3B 4C 42 ; . WA..*LC=C+1; | ||
- | 0360h: 3D 42 2D 31 0D 03 34 46 42 3C 3E 30 3B 47 37 38 ; =B-1..4FB<> | ||
- | 0370h: 30 0D 83 3E 4C 5A 3D 25 44 3B 53 31 30 30 30 3B ; 0.ƒ> | ||
- | 0380h: 4D 43 52 20 26 20 4C 46 20 41 4E 48 41 45 4E 47 ; MCR & LF ANHAENG | ||
- | 0390h: 45 4E 0D 03 48 4C 5A 3D 25 41 3B 53 31 30 30 30 ; EN..HLZ=%A; | ||
- | 03a0h: 0D 83 52 47 31 30 30 0D 03 84 4D 50 52 4F 47 52 ; .ƒRG100..„MPROGR | ||
- | 03b0h: 41 4D 4D 20 56 45 52 4C 41 53 53 45 4E 0D 03 8E ; AMM VERLASSEN..Ž | ||
- | 03c0h: 45 0D 03 E8 46 47 45 54 52 5B 25 46 41 5D 24 41 ; E..èFGETR[%FA]$A | ||
- | 03d0h: 25 31 30 3C 3E 25 31 30 3B 47 31 30 30 30 0D 03 ; %10<> | ||
- | 03e0h: F2 4F 53 45 54 52 5B 25 46 41 2C 30 5D 3B 4D 52 ; òOSETR[%FA, | ||
- | 03f0h: 45 51 55 45 53 54 20 52 55 45 43 4B 53 45 54 5A ; EQUEST RUECKSETZ | ||
- | 0400h: 45 4E 0D 03 FC 4F 53 45 54 52 5B 25 46 30 2C 5A ; EN..üOSETR[%F0, | ||
- | 0410h: 5D 0D 04 06 52 0D 07 D0 45 0D FF FF FF FF FF FF ; ]...R..ÐE.ÿÿÿÿÿÿ | ||
- | </ | ||
- | |||
- | Bild 8.6. TINY-MPBASIC-Programm (verdichtete Form, Format U881 BM004) | ||
- | |||
- | < | ||
- | 00000000h: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ | ||
- | 00000010h: FF FF 8D 08 1B 8D 08 41 8D 08 51 8C 96 E6 FF 80 ; ÿÿ...A.QŒ–æÿ€ | ||
- | 00000020h: E6 F4 40 E6 F7 49 E6 F5 0D E6 F1 43 B0 FB 9F E6 ; æô@æ÷Iæõ.æñC°ûŸæ | ||
- | 00000030h: 06 08 E6 07 69 B0 08 B0 09 E6 F0 23 D6 07 FD 8B ; ..æ.i°.°.æð# | ||
- | 00000040h: DA 56 FA F7 76 FA 08 6B FB 56 FA F7 88 F0 56 E8 ; ÚVú÷vú.kûVú÷ˆðVè | ||
- | 00000050h: 7F 76 FA 10 6B FB 56 FA EF 89 F0 A6 E8 0D 6B 01 ; vú.kûVúï‰ð¦è.k. | ||
- | 00000060h: AF 8C 0A D6 08 51 8C 0D AF 80 01 4D 42 41 53 49 ; ¯Œ.Ö.QŒ.¯€.MBASI | ||
- | 00000070h: 43 44 45 4D 4F 4E 53 54 52 41 54 49 4F 4E 0D 80 ; CDEMONSTRATION.€ | ||
- | 00000080h: 0A 50 22 57 41 45 48 4C 45 4E 20 53 49 45 20 42 ; .P" | ||
- | 00000090h: 49 54 54 45 20 45 49 4E 20 50 52 4F 47 52 41 4D ; ITTE EIN PROGRAM | ||
- | 000000a0h: 4D 42 45 49 53 50 49 45 4C 20 21 22 0D 80 14 50 ; MBEISPIEL !" | ||
- | 000000b0h: 0D 80 1E 50 22 31 20 50 52 49 4D 46 41 4B 54 4F ; .€.P" | ||
- | 000000c0h: 52 5A 45 52 4C 45 47 55 4E 47 22 0D 80 28 50 22 ; RZERLEGUNG" | ||
- | 000000d0h: 32 20 55 4D 52 45 43 48 4E 55 4E 47 20 48 45 58 ; 2 UMRECHNUNG HEX | ||
- | 000000e0h: 2D 44 45 5A 49 4D 41 4C 22 0D 80 32 50 22 33 20 ; -DEZIMAL" | ||
- | 000000f0h: 55 4D 52 45 43 48 4E 55 4E 47 20 44 45 5A 49 4D ; UMRECHNUNG DEZIM | ||
- | 00000100h: 41 4C 2D 48 45 58 22 0D 80 3C 50 22 34 20 52 45 ; AL-HEX" | ||
- | 00000110h: 47 49 53 54 45 52 49 4E 48 41 4C 54 20 4D 4F 44 ; GISTERINHALT MOD | ||
- | 00000120h: 49 46 49 5A 49 45 52 45 4E 22 0D 80 46 50 22 35 ; IFIZIEREN" | ||
- | 00000130h: 20 4C 41 4E 47 53 41 4D 20 41 4C 50 48 41 42 45 ; LANGSAM ALPHABE | ||
- | 00000140h: 54 20 44 52 55 43 4B 45 4E 22 0D 80 50 50 22 36 ; T DRUCKEN" | ||
- | 00000150h: 20 4E 45 55 20 42 45 47 49 4E 4E 45 4E 22 0D 80 ; NEU BEGINNEN" | ||
- | 00000160h: 5A 50 0D 80 64 49 22 50 52 4F 47 52 41 4D 4D 20 ; ZP.€dI" | ||
- | 00000170h: 4E 52 20 3F 3A 20 22 41 0D 80 6E 47 31 35 30 2A ; NR ?: " | ||
- | 00000180h: 41 0D 80 96 4D 50 52 49 4D 46 41 4B 54 4F 52 5A ; A.€–MPRIMFAKTORZ | ||
- | 00000190h: 45 52 4C 45 47 55 4E 47 0D 80 A0 49 22 5A 41 48 ; ERLEGUNG.€ I" | ||
- | 000001a0h: 4C 3D 3F 20 22 41 0D 80 AA 4C 42 3D 32 0D 80 B4 ; L=? " | ||
- | 000001b0h: 46 41 3C 32 3B 47 32 34 30 0D 80 BE 4C 43 3D 41 ; FA< | ||
- | 000001c0h: 2F 42 2A 42 0D 80 C8 46 43 3C 3E 41 3B 4C 42 3D ; / | ||
- | 000001d0h: 42 2B 31 3B 47 31 39 30 0D 80 DC 50 42 0D 80 E6 ; B+1; | ||
- | 000001e0h: 4C 41 3D 41 2F 42 3B 47 31 38 30 0D 80 F0 50 22 ; LA=A/ | ||
- | 000001f0h: 46 45 52 54 49 47 22 0D 80 FA 47 31 30 30 0D 81 ; FERTIG" | ||
- | 00000200h: 2C 4D 55 4D 52 45 43 48 4E 55 4E 47 45 4E 0D 81 ; , | ||
- | 00000210h: 36 49 22 48 45 58 5A 41 48 4C 3D 3F 20 22 41 0D ; 6I" | ||
- | 00000220h: 81 40 50 22 44 45 5A 49 4D 41 4C 20 3D 20 22 41 ; @P" | ||
- | 00000230h: 0D 81 4A 47 31 30 30 0D 81 C2 49 22 44 45 5A 49 ; .JG100.ÂI" | ||
- | 00000240h: 4D 41 4C 5A 41 48 4C 3D 3F 20 22 41 0D 81 CC 48 ; MALZAHL=? " | ||
- | 00000250h: 22 48 45 58 20 3D 20 22 41 0D 81 D6 47 31 30 30 ; "HEX = " | ||
- | 00000260h: 0D 82 58 4D 52 45 47 49 53 54 45 52 49 4E 48 2E ; .‚XMREGISTERINH. | ||
- | 00000270h: 20 4D 4F 44 49 46 49 5A 2E 0D 82 62 49 22 52 45 ; MODIFIZ..‚bI" | ||
- | 00000280h: 47 49 53 54 45 52 20 4E 52 2E 3A 20 22 41 0D 82 ; GISTER NR.: "A.‚ | ||
- | 00000290h: 6C 48 22 49 4E 48 41 4C 54 20 3D 20 22 47 45 54 ; lH" | ||
- | 000002a0h: 52 5B 41 5D 0D 82 76 49 22 4E 45 55 45 52 20 49 ; R[A].‚vI" | ||
- | 000002b0h: 4E 48 41 4C 54 3A 20 22 42 0D 82 80 4F 53 45 54 ; NHALT: " | ||
- | 000002c0h: 52 5B 41 2C 42 5D 0D 82 8A 47 31 30 30 0D 82 EE ; R[A, | ||
- | 000002d0h: 4D 41 4C 50 48 41 42 45 54 20 44 52 55 43 4B 45 ; MALPHABET DRUCKE | ||
- | 000002e0h: 4E 0D 82 F8 49 22 57 41 52 54 45 5A 45 49 54 20 ; N.‚øI" | ||
- | 000002f0h: 5A 57 49 53 43 48 45 4E 20 5A 57 45 49 20 42 55 ; ZWISCHEN ZWEI BU | ||
- | 00000300h: 43 48 53 54 41 42 45 4E 20 5B 4D 53 45 43 5D 3A ; CHSTABEN [MSEC]: | ||
- | 00000310h: 22 41 0D 83 02 4C 42 3D 32 36 3B 4C 43 3D 25 34 ; " | ||
- | 00000320h: 31 0D 83 0C 4C 5A 3D 43 3B 53 31 30 30 30 0D 83 ; 1.ƒ.LZ=C; | ||
- | 00000330h: 16 4C 5A 3D 25 32 30 3B 53 31 30 30 30 3B 4D 53 ; .LZ=%20; | ||
- | 00000340h: 50 41 43 45 20 44 41 5A 57 49 53 43 48 45 4E 0D ; PACE DAZWISCHEN. | ||
- | 00000350h: 83 20 57 41 0D 83 2A 4C 43 3D 43 2B 31 3B 4C 42 ; ƒ WA.ƒ*LC=C+1; | ||
- | 00000360h: 3D 42 2D 31 0D 83 34 46 42 3C 3E 30 3B 47 37 38 ; =B-1.ƒ4FB<> | ||
- | 00000370h: 30 0D 83 3E 4C 5A 3D 25 44 3B 53 31 30 30 30 3B ; 0.ƒ> | ||
- | 00000380h: 4D 43 52 20 26 20 4C 46 20 41 4E 48 41 45 4E 47 ; MCR & LF ANHAENG | ||
- | 00000390h: 45 4E 0D 83 48 4C 5A 3D 25 41 3B 53 31 30 30 30 ; EN.ƒHLZ=%A; | ||
- | 000003a0h: 0D 83 52 47 31 30 30 0D 83 84 4D 50 52 4F 47 52 ; .ƒRG100.ƒ„MPROGR | ||
- | 000003b0h: 41 4D 4D 20 56 45 52 4C 41 53 53 45 4E 0D 83 8E ; AMM VERLASSEN.ƒŽ | ||
- | 000003c0h: 45 0D 83 E8 46 47 45 54 52 5B 25 46 41 5D 24 41 ; E.ďFGETR[%FA]$A | ||
- | 000003d0h: 25 31 30 3C 3E 25 31 30 3B 47 31 30 30 30 0D 83 ; %10<> | ||
- | 000003e0h: F2 4F 53 45 54 52 5B 25 46 41 2C 30 5D 3B 4D 52 ; òOSETR[%FA, | ||
- | 000003f0h: 45 51 55 45 53 54 20 52 55 45 43 4B 53 45 54 5A ; EQUEST RUECKSETZ | ||
- | 00000400h: 45 4E 0D 83 FC 4F 53 45 54 52 5B 25 46 30 2C 5A ; EN.ğOSETR[%F0, | ||
- | 00000410h: 5D 0D 84 06 52 0D 87 D0 4D 45 4E 44 45 0D 20 ; ].„.R.‡ÐMENDE. | ||
- | </ | ||
- | |||
- | Bild 8.6. TINY-MPBASIC-Programm (verdichtete Form, Format U883 final) | ||
- | |||
- | * {{ : | ||
===== JU+TE-Hinweise ===== | ===== JU+TE-Hinweise ===== | ||
- | |||
- | Entgegen dem obigen Beispiel aus dem Buch kodiert der finale U883 ein wenig anders: | ||
* nach 0D (Zeilenende) wird das 7. Bit des nachfolgenden Bytes (15. Bit der Zeilennummer) gesetzt. Die höchstmögliche Zeilennummer ist daher 32767. | * nach 0D (Zeilenende) wird das 7. Bit des nachfolgenden Bytes (15. Bit der Zeilennummer) gesetzt. Die höchstmögliche Zeilennummer ist daher 32767. | ||
Zeile 632: | Zeile 59: | ||
Erkenntnisse: | Erkenntnisse: | ||
+ | * Proc-Befehlserweiterungen können zur Laufzeit gesetzt werden (Adresse der Prozedurtabelle in Register 8 und 9).\\ Es ist sogar möglich, die Tabellen zwischendurch zu wechseln und unterschiedliche Implementierungen für dieselben Prozedurnamen zu programmieren, | ||
* Rückgabeparameter werden mit 0 vorbelegt | * Rückgabeparameter werden mit 0 vorbelegt | ||
* TO bei TRAP muss als , übersetzt werden | * TO bei TRAP muss als , übersetzt werden | ||
* GOTO sucht passende Zeile oder nächstgrößere; | * GOTO sucht passende Zeile oder nächstgrößere; | ||
* REM endet bei ";", | * REM endet bei ";", | ||
- | * INPUT gibt es auch als Prozedur | + | * ";" |
- | * PROC-Aufrufe können nicht mit , aneinandergereiht werden | + | * PROC-Aufrufe können nicht mit , aneinandergereiht werden |
+ | * erfolgt ein END in einem Unterprogramm, | ||
+ | * Die Suche nach einer Zeile hat einen Fehler: Zeilennummern Hex xx0Dh werden nicht korrekt verarbeitet (Bug im U883). Deshalb keine Zeilen n*256+13 nutzen! | ||
< | < |