DER BASIC-INTERPRETER-BAUKASTEN für 68HC11-, Z80-, HD64180-, 80X86-EPC-Systeme von Dr. rer. nat. Hehl Hans HEDV-Entwicklung 85456 Wartenberg (C) 1989 - 2012 Dr. Hehl Stand 16.04.2012 Steuerungsrechner und Einplatinencomputer haben sich auf dem Computermarkt behauptet. Der Anwender solcher Einplatinencomputer benötigt meistens nur eine 8-Bit-CPU. Jahrzehnte lang bewährte sich die Z80-CPU von Zilog. Nun wird auch der Baustein 68HC11 von Motorola verwendet oder ein 80X86. Für die Programmierung des Betriebssystems sollte eine Hochsprache zur Verfügung stehen, die eine Programmentwicklung auf dem PC ermöglicht, aber ebenso auf dem Steuerungsrechner im Eprom lauffähig ist. Dies ist bei den heute erhältlichen Hochsprachen fast nie der Fall, auch die Quellen sind meistens nicht erhältlich. Da in der Regel unterschiedlichste Hardware-Voraussetzungen gegeben sind, muss das Betriebs- system universell an die jeweilige Situation anpassbar sein. Das setzt z.B. voraus, daß der Anwender auch den Quellcode der Software erhält und dieser ausführlich kommentiert ist. Ein Modulsystem erleichtert natürlich die Anpassung des Betriebssystems, da nicht benötigte Funktionen entfallen und einen kompakten, übersichtlichen Quellcode ergeben. Dadurch wird auch das Fehlerrisiko größerer Entwicklungen drastisch verringert. Betriebssysteme fahr- barer Roboter benötigen z.B. komplizierte trigonometrische Funktionen zur Bahnberechnung, die in einer Hochsprache zur Verfügung stehen. Es sollten also die grundlegenden mathema- tischen Funktionen wie SIN, COS, ATN usw. oder auch Logarithmen (Basis E und 10) enthalten sein. DIE LÖSUNG Der hier vorgestellte BASIC-INTERPRETER-BAUKASTEN erfüllt die genannten Voraussetzungen. Über 300 ausführlich kommentierte Module, die als Include-Dateien zu einem Kernteil ein- gebunden werden können, ermöglichen dem Anwender, sich sein individuelles System zusam- menzusetzen. ENTWICKLUNG Die gesamte Entwicklung eines Betriebssystems für einen Steuerungsrechner und auch die Testphase kann auf dem PC erfolgen, da die Module des Einplatinensystems (im Z80-, 80X86- und 68HC11-Code) ebenso auf dem PC funktionieren. Mit Emulatoren/Simulatoren kann dann auf dem PC der BASIC-Interpreter ohne Hardware gestestet werden. Eine PC-Vollversion des Basic-Interpreters enthält alle Befehle für die Programment- wicklung für den Einplatinencomputer. Ein spezieller Basic-Linker erlaubt die Ablage und spätere Ausführung des Basic-Programms im internen Tokenformat (schneller und kom pakter Code) an beliebigen Adressen im Steuerungsrechner. Für alle Quellen sind ge- eignete, erprobte und preiswerte PC-Assembler erhältlich. ANPASSUNG Die einfache Anpassung an spezielle Hardware-Situationen wird erstens durch freie Adreß- wahl von RAM und ROM möglich. Der Basic-Interpreter kann an beliebiger Adresse im ROM liegen. Das Basic-Programm kann im RAM oder im ROM an frei wählbarer Adresse liegen. Für die internen Variablen des Interpreters, für die Programmvariablen und für den Stapel der CPU werden RAM-Bereiche benötigt, deren Adresslagen ebenfalls wählbar sind. Zweitens sind die Einsprünge der I/O-Routinen über Sprungleisten geführt, eine einfache Änderung der Labels in der Quelle genügt. Ein Terminalbetrieb des Interpreters vom PC aus über V24-Schnittstelle ist mit üblichen Programmen wie Procomm oder Kermit ebenso wie ein BLACK-BOX-Betrieb möglich, bei dem der Interpreter nach manuellem RESET oder nach Einschalten der Stromversorgung immer einen AUTO-Start durchführt. Ein Programmwechsel kann z.B. durch Verwendung der "Scheck- karten-Eproms" als Programmspeicher erfolgen. GRÖSSE Die kleinste BLACK-BOX-Version des Interpreters mit allen wichtigen Befehlen,auch mit allen mathematischen Routinen, benötigt nur 2 KByte ROM und 2 KByte RAM, da speicher- optimierend programmiert wurde. Ohne Banking sind bis zu 64 KByte ROM und 64 KByte RAM möglich. FEHLERCODE Die Fehlerbehandlung kann individuell gewählt werden. Bei Terminalbetrieb erfolgt die Ausgabe vollständiger deutscher Fehlermeldungen am PC. Bei Black-BOX-Betrieb kann durch Einsatz entsprechender Module z.B. die Fehler-Nr. im RAM abgelegt oder eine Leuchtdiode eingeschaltet oder eine eigene Routine angesprungen werden. BASIC-Befehlssatz Der Befehlssatz des Basic-Interpreters ist umfangreich. Über bis zu 255 Ausgabekanälen können Peripherie-Einheiten wie LCD-Anzeigen problemlos angesteuert werden. So wird z.B. mit dem Befehl PRINT#3, "Zeichenkette" über den Ausgabekanal Nr. 3 ein LCD-Display ange- steuert. LCD-Basic-Befehle lassen sich beliebig definieren und einbinden. Grafikbefehle werden im Eprom-betrieb nicht benötigt, sind aber für den Grafikprozessor EF9366 von Thomson vorhanden. TOOLKIT-Befehle wie Suchen (FIND), Austauschen (REPLACE) und Kopieren (COPY) erleichtern die Programmentwicklung. Es gibt einen Zeileneditor im Eprom-Betrieb (Terminalbetrieb!). BASIC-Programm Die BASIC-Programme können mit jedem ASCII-Editor (z.B. Notepad) bearbeitet werden. Der Anwender kann sich bis zu 250 neue Basic-Befehle selber programmieren, z.B. VENTIL AUF oder MOTOR ON, da eine Erweiterung der Befehlsworte einfach möglich ist. STANDARDS und Preise Verschiedene fertige Standardlösungen sind vorgegeben, so das Betriebssystem der Sepia-Z80 und ein leicht erweiterbares BLACK-BOX-System und natürlich der komplette Interpreter als PC-Version. Es gibt eine Einsteigerversion wie die des EURO-Z80 mit der Quelle schon für 50 Euro. Für den Profi stehen fast 6 MByte Software in der Vollversion zur Verfügung. Der Anwender sollte allerdings grundlegende Kenntnisse der jeweiligen Maschinensprache besitzen, wenn er die Module abändern will. DOKUMENTATION Die Dokumentation des Baukastens beinhaltet verschiedene Handbücher auf CD, so einmal das Handbuch aller Basic-Befehle der Vollversion mit Beispielen, sowie die komplette Dokumentation zum EURO-Z80 und zum Z80-Debugger sowie weitere Informationen zum Eprom- und BLACK-BOX-Betrieb, ebenso das PRN-Listing der Z80-Routinen des Interpreters in der Grund- Version 3.1 (beinhaltet über 530 KByte Text). HOTLINE Oft ist eine mündliche Auskunft besser und hilft schneller, deshalb gibt es eine kosten lose HOTLINE bei Bezug des Interpreter-Baukastens, d.h. man kann einfach beim Autor anrufen (16.00 - 20.00 Uhr, Tel.08762/3070). REFERENZEN Referenzen aus vielen Bereichen wie Hochschule und Industrie sind auf Anfrage erhältlich. Einige Anwendungsbeispiele sollen genügen: Robotersteuerung - Gesamthochschule Kassel, Ausbildung - Berufsförderungswerk Oberhausen, Präzisionsmessungen - Fa.DEVA, Temperaturmess- anlagen - Fa. Seltmann, EURO-Z80 - Fa. Kolter, Fa. TOPAS, Dresden, Sepia - Fa.Kolter usw. INFORMATION Anschrift: HEDV-Entwicklung Dr. Hehl Hans Lindenstr. 20 D-85456 Wartenberg Tel: 08762/3070 Der BASIC-Grund-Befehlssatz Die Liste enthält alle Befehle des Interpreters, die mit '*' gekennzeichneten Befehle entfal- len normalerweise in der EPROM-Version. ABS Absolutwertbildung: ABS(-523) = 523 AND Undverknüpfung: 3 AND 5 = 1 ASC dezimale ASCII-Wert eines Zeichens ATN Arcustangens, z.B. ATN(2)=1.1071487178 AUTO automatische, beliebige Zeilennummerierung BYE * Zurück zum Betriebssystem BYTE Zugriff auf einzelne Bytes von Dateien BYTE$ Zugriff auf Zeichenketten: B$ = BYTE$(#0,1) nur 1 Zeichen von Tastatur einlesen BYTEPOLL Abfrage, ob Taste gedrückt (wenn INTERRUPT aus) CALL Sprung zu einer Speicheradresse mit Parameterübergabe auf Stack CHR$ Ausgabe eines ASCII-Zeichens CLEAR Reservierung von Speicher für Variablen und I/O-Pufferbereiche CSAVE,CLOAD Bandroutinen, nur bei entsprechender Hardware-Unterstützung CLOSE * Schließen von I/O-Kanälen CONT Fortsetzen des Programmes nach STOP COPY Beliebiges Duplizieren von Programmzeilen COS Cosinus CLR Bildschirm löschen DATA, READ DATA-Zeilen lesen (siehe RESTORE Zeilennummer) DATE$ Datumseingabe beim Interpreterstart, Ausgabe im Programm DEF FN auch Mehrzeilendefinition (auch Buchstaben) FNEND DELETE Löschen von Zeilen und Zeilenbereichen DIM Reservierung von Variablen: DIM A1$(100), B(20) DIR * Directory-Ausgabe ohne Programmverlust Ausgabe auch in sequentielle und virtuelle Dateien, damit bearbeitbar, Ausgabe auch auf Drucker EE Eulersche Zahl, 2.7182818285 EDIT Zeilenorientierter Editor EOF * Dateiende (CTRL-Z, 1Ah) erkennen, auch ON EOF GOTO möglich END Programmende, nötig vor Unterprogrammen ERASE * Datei löschen aus Directory EQV logische Gleichwertigkeit ERROR Definition beliebiger Fehlermeldungen ERL Abfrage der Zeilennummer nach Fehler ERR Abfrage der Fehlernummer nach Fehler EXCHANGE schneller Variablentausch (sortieren) EXP Exponentialfunktion Y = E^X z.B. EXP(88) = 1.651636255E+38 FIND Suchen von Zeichen bzw. Zeichenketten FIX schneidet Zahlen nach Dezimalpunkt ab, z.B. FIX(-0.5) = 0, nicht wie INT(-0.5) = 1 FIX Zeichenkette erzeugen (Zeichen, Anzahl) FOR, TO, STEP, EXIT, NEXT Schleifenbefehle FRE(X) Anzeige des verfügbaren Speichers FRE(X$) Anzeige des verfügbaren Stringspeichers GOTO Sprungbefehl (verpönt!), aber auch: ON Z GOTO GOSUB Unterprogramm-Aufruf, auch ON Z GOSUB HEX$ Umwandlung Dezimal in Sedezimal (hex) HEX$(1000) = 03E8 & Umwandlung Sedezimal in Dezimal &3E8 = 1000 (Eingabe von sedezimalen Zahlen mit Input) IF,THEN,ELSE besondere Schleifenfunktion IMP logische Ungleichheit (Implizierung) INP,OUT Portzugriff (IOE, Floppy-Controller etc.) Ein- und Ausgabe INPUT Eingabe von Zeichen, auch von anderen Kanälen INPUT LINE Eingabe aller Zeichen (auch Komma!) INSTR Suchen von Zeichen in Strings INT Ganzwert-Bildung: INT(123.567) = 123 INTERRUPT Abbruch eines laufenden Programmes (durch CTRL-E) verhindern KILL Löschung der Speicherreservierung (mit DIM) KILL A$,A1 etc LEFT$, RIGHT$, MID$ Zeichenkettenverarbeitung LIST Ausgabe der Programmzeilen, auch in sequentielle u. virtuelle Dateien bzw. Drucker (z.B. LIST#2) LOAD * Laden eines Programmes, Variablen werden gelöscht (mit NEW) LOADGO Laden und Starten eines Programmes, auch ab einer bestimmten Programm zeile starten, Starten des Interpreters auch mit Programmname LOC * Stellung des Bytezeigers in Datei angeben LOCATE X,Y setzt Cursor für Eingabemasken an X,Y LOF * Angabe der RECORDS einer Datei LOG nat. Logarithmus, LOG(1000) = 6.907755279 LOG(0.99995) = -5.0001249077E-05 LOG10 dek. Logarithmus LOG10(EE) = .4342944819 LOOKUP * Suchbefehl für Dateien im Directory LVAR Ausgabe der Variableninhalte, auch Drucker und Diskette MAT READ * Matrix-Befehle, lesen und schreiben MAT WRITE MERGE * Nachladen und Verbinden von Programmen MID$ zusätzlich: Austausch von Stringteilen, z.B. MID$(A$,Startzeichen,Anzahl) = B$ MOD Modulo-Funktion (Divisionsrest) NEW Löschen eines Programmes (nur Zeiger) NOT binäre Negation OPEN * Dateieröffnung (Kanal, Modus, Name, Satzlänge) in vielfältiger Form, sequentielle und virtuelle Dateien (Random) OPTION Veränderung der E/A-Kanal-Parameter OR ODER-Verknüpfung: 3 OR 5 = 7 OUTBYTE * Ausgabe einzelner Bytes PEEK Speicherinhalte lesen PI Kreiszahl PI = 3.1415926536 POKE Speicher beschreiben POS Cursor- oder Druckkopf-Position PRECISION Arithmetik auf 11 Stellen, Ausgabe mit weniger Stellen, z.B. PRECISION 5 PRINT vielfältiger Ausgabe-Befehl PRIVACY Schutz durch Passwort (alle Befehle) READ Einlesebefehl von binären Einheiten REM Dokumentations-Befehl, im Text auch Kleinbuchstaben erlaubt RENAME * Dateinamen ändern RENUMBER Neunummerierung von Programmzeilen, auch nach GOSUB, GOTO REPLACE Ersetzen von Zeichen in Programmzeilen RESET * Rücksetzen des Systems von BASIC auch (auch mit Laufwerkswechsel) RESUME umfangreiche Fehlerbehandlung beenden, auch RESUME Zeilennummer , RESUME NEXT RESTORE XY Datazeiger auf beliebige DATA-Zeile RETURN zurück vom Unterprogramm nach GOSUB, auch RETURN Zeilennummer auch ON Z RETURN Zeilennummer RND Pseudo-Zufallszahl RANDOMIZE Zufallszahlen starten aus Refresh-Register RSEG nur bei MS-DOS: Segmentadresse ausgeben und Basic-Programm- Anfangsadresse RUN Starten eines Programmes, auch ab einer bestimmten Zeile SAVE,A * erstmalige Speicherung, auch im ASCII-Format möglich, damit können Programme mit einem Texteditor wie Word-Star bearbeitet werden. RESAVE,A * wie SAVE, aber Überschreiben einer Datei SETLOC * Bytezeiger in Datei setzen SGN Vorzeichen-Ermittlung SIN Sinus SINUS(45*PI/180) = .70710678119 SPACE$ Leerzeichenkette erzeugen SPC Abstand bei Strings erzeugen SQR Quadratwurzel SQR(2) = 1.4142135624 STOP Programmlauf-Abbruch STR$ Kennzeichnung als Zeichenkette STRING$ Zeichenkette multiplizieren TAB Tabulator TAN Tangens (im Bogenmaß) TRACE Ausgabe der bearbeiteten Zeilennummern (auch auf Diskette oder Drucker) USER * Umschalten der USER-Bereiche (CP/M) von BASIC aus (0-9 möglich) USING Umfangreiche Formatierung (Zahlen,Texte) VAL Umwandlung Zeichenkette in Zahl VARPTR Adressenangabe der Stringzeiger XOR Exklusiv-Oder 3 XOR 5 = 6 WAIT warten, bis e. Port einen best. Wert besitzt (WAIT Adresse, Maske M (XOR), Zustand Z (AND)) WRITE * Schreibbefehl für einzelne Bytes OPERATOREN: /, ^, -, *, +, =, <>, <, >, <=, =<, =>, >= AND, OR, XOR, NOT, IMP, EQV \ Ganzzahldivision BASIC-Modul im 80X86-, Z80- und 68HC11-Code ;************************************* ;*** INCLUDE ASC.DOS * 80X86 ;************************************* ;Vergleichsadresse HEBAS86.COM ;01E0h ;Befehlsform: ASC(Zeichen oder Variable oder Zeichenkette) ;Funktion: Dezimalwert des ersten Zeichens ermitteln ;Token: E6h ASC: CALL LEN01 ;Adresse ermitteln, Akku = Anzahl ;(Modul LEN.MAC) ;BX = Adresse der Zeichenkette JZ ASC01 ;Anzahl = 0 INC BX INC BX MOV DX,WORD PTR [BX] ;3. + 4. Byte = Adresse Zeichenkette MOV BP,DX MOV AL,BYTE PTR [BP] ;1. Buchstabe ASC01: JMP PEEK1 ;Dezimalwert ausgeben ;(Modul BFADR2.MAC) ;.......................................................... ;*** ENDE ASC.DOS ;.......................................................... ;************************************* ;*** INCLUDE ASC.MAC * Z80 ;************************************* ;Vergleichsadresse HEBAS86.COM: ;01E0h ;Befehlsform: ASC(Zeichen oder Variable oder Zeichenkette) ;Funktion: Dezimalwert des ersten Zeichens ermitteln (ASCII) ;Token: E6h ASC: CALL LEN01 ;Adresse ermitteln, Akku = Anzahl ;(Modul LEN.MAC) ;HL = Adresse der Zeichenkette JR Z,ASC01 ;Anzahl = 0 INC HL INC HL LD E,(HL) ;3. + 4. Byte = Adresse Zeichenkette INC HL ;nach DE LD D,(HL) LD A,(DE) ;aber nur 1. Buchstabe ausgeben ASC01: JP PEEK1 ;Dezimalwert ausgeben ;(Modul BFADR2.MAC) ;.......................................................... ;*** ENDE ASC.MAC ;.......................................................... ; ************************************* ; *** INCLUDE ASC.A * 68HC11 ; ************************************* ; Vergleichsadresse HEBAS86.COM ; 01E0h ; Befehlsform ASC(Zeichen oder Variable oder Zeichenkette) ; Funktion Dezimalwert des ersten Zeichens ermitteln (ASCII) ; Token E6h ASC JSR LEN01 ; Adresse ermitteln, Akku = Anzahl ; (Modul LEN.A) ; IX = Adresse der Zeichenkette BEQ ASC01 ; Anzahl = 0 INX INX XGDY LDAB 0,X ; 3. + 4. Byte = Adresse Zeichenkette INX ; nach IY LDAA 0,X ; aber zuerst High, dann LOW 68HC11 XGDY LDAA 0,Y ; aber nur 1. Buchstabe ausgeben ASC01 JMP PEEK1 ; Dezimalwert ausgeben ; (Modul BFADR2.A) ; .......................................................... ; *** ENDE ASC.A ; ..........................................................