Diese Kapitel beschreibt Programme, die die Verbindung zu BASIC-Programmen erleichtern. Mit den angegebenen Routinen kann man BASIC-Programme starten, BASIC-Variablen und BASIC-Programmzeilen suchen, Fehlermeldungen ausgeben und Parameter aus BASIC-Programmen an Maschinenprogramme uebergeben. Die verwendeten ROM-Routinen und Speicherplaetze sind : Name 2001 3001 8001 Beschreibung ARGBYT $D676 $D678 $C8D4 Argumentausw. Byte-Daten ARGINT $D0A0 $D090 $C2E0 Argumentausw. Integer ARGKLA $CE05 $CDEC $BEE9 Argument in Klammern auswerten ARGREA $CCA4 $CC8B $BD84 Argumentausw. real ARGUM $CCB8 $CC9F $BD98 Aurumentauswertung CHRGET $00C2 $0070 $0070 Zeichen aus BASIC-Text holen ERRO $C36C $C36A $B3E0 Ausgabe BASIC-Fehlermeldung ERROC $C359 $C357 $B3CF Abort Files, Fehlermeldung FVAR $CF7B $CF6D $C12B BASIC-Variable einrichten/suchen KLAUF $CE0E $CDF5 $BEF2 prueft auf Klammer auf KLAZU $CE0B $CDF2 $BEEF prueft auf Klammer zu KOMMA $CE11 $CDF8 $BEF5 prueft auf Komma NUMTYP $CCA7 $CC8E $BD87 prueft auf num. Argument PTRC $C777 $C787 $B80A Pointer initialisieren PTRW $C59A $C5A7 $B622 Pointer setzen RDINT $C863 $C873 $B8F6 Integer-Zahl aus Basic-Text RUN $C6CF $C6DA $B75F RUN BASIC-Programm SBAL $C522 $C52C $B5A3 BASIC-Zeile suchen SBAV $CFD7 $CFC9 $C187 BASIC-Varible suchen STRTYP $CCA9 $CC90 $BD89 prueft auf Stringargument ARGFLG $5E $07 $07 Argumentflag String/numerisch FAC1 $B0-B6 $5E-64 $5E-64 Floating Akkumulator #1 LINADR $AE-AF $5C-5D $5C-5D Adresse einer BASIC-Zeile LINUM $08-09 $11-12 $11-12 Nummer einer BASIC-Zeile TYPFLG $5F $08 $08 Typflag integer/real VARADR $96-97 $44-45 $44-45 Variablenadresse VARNAM $94-95 $42-43 $42-43 Variblenname
Ruecksetzen aller BASIC-Zeiger (loeschen aller Variablen), Kalt-Start : JSR PTRC JMP RUN
Ruecksetzen aller BASIC-Zeiger (Variablen bleiben erhalten), Warm-Start: JSR PTRW JMP RUN
Die folgende Routine liefert die Adresse zu einer gesuchten BASIC-Variablen. Der Name der Variablen wird dabei in VARNAM wie folgt abgelegt: a) VARNAM enthaelt den ASCII-Code des ersten Buchstabens der Variablen. b) VARNAM+1 enthaelt den ASCII-Code des zweiten Zeichens (Buchstabe oder Zahl) der Variablen. Besteht die Variable nur aus einem Buchstaben, so wird in VARNAM+1 der Wert 80 geschrieben. c) handelt es sich um eine Integer-Variable (%), wird in beiden Bytes das hoechstwertige Bit gesetzt (OR mit $80). d) handelt es sich um eine String-Variable ($), wird in Adresse VARNAM+1 das hoechstwertige Bit gesetzt (OR mit $80). Beispiele: Variable VARNAM VARNAM+1 X $58 $00 L$ $4C $80 AB $41 $42 D1% $C4 $B1 Der Suchvorgang erfolgt mit: JSR SBAV Als Ergebnis steht die Adresse der gesuchten Variablen in VARADR. Die Variablen sind folgendermassen im Speicher abgelegt: integer : low Byte, high Byte real : Speicherformat (5 Bytes) string : Laenge (1 Byte), Stringadresse (low Byte, high Byte)
Die Nummer der gesuchten Zeile muss zunaechst in LINUM abgelegt werden (low Byte, high Byte). Die gesuchte Zeile wurde gefunden, wenn nach Rueckkehr das Carry-Flag gesetzt ist. Die Anfangsadresse der gesuchten Zeile steht dann in LINADR. Der Suchvorgang beginnt mit : JSR SBAL
Die folgende Routine gibt eine Meldung aus dem Speicherbereich ab $C190/$C192/$B20D aus. Das X-Register wird mit dem Abstand der Textbeginns der auszugebenden Meldung zum Beginn des Textblocks (s.o.) geladen. JSR ERRO Sollen gleichzeitig alle offenen Files unzugaenglich gemacht werden (kein CLOSE!) und ausserdem ein eventuelles CMD-Kommandos aufgehoben werden, so ist statt ERRO die Routine ERROC aufzurufen. JSR ERRORC
Eine ganze Zahl aus dem BASIC-Programm wird im ASCII-Code gelesen und umgewandelt. Pointen in den BASIC-Text befinden sich in der CHRGET-Routine (CHRGET+7). Das Ergebnis steht im Adressenformat (low Byte, high Byte) in LINNUM. JSR RDINT
Eine ungemein nuetzliche ROM-Routine, die es gestattet, Parameter aus einem BASIC-Programm in ein Maschinenprogramm zu uebernehmen. Jede erdenkliche Parameterstruktur ist moeglich. Den Aufruf der auswertenden Maschinenroutine kann ueber einen SYS-Aufruf oder aber Spracherweiterungen (mit eigenen Befehlsworten - aehnlich z.B. TOOLKIT) erfolgen. Beispiele: SYS (826) 20 SYS 826 K SYS 826,K,I SYS 826 (K) INSTRING (A$,B$,J) SYS 826 (K+J,LEFT$(A$,2)) SYSIN,D Die Parameter unterliegen den ueblichen Regeln der BASIC-Syntax. Danach sind zulaessig: numerische Konstanten, Strings, numerische Variablen (integer oder real), String-Arrays, numerische Ausdruecke, String-Ausdruecke. Die Parameter-Uebengabestruktur kann beliebig gewaehlt wenden: Variable direkt hinter der Adresse, numerische Konstante direkt hinter den Adresse (die Adresse muss dann in Klammern stehen, s.o.) , Variablen oder Feldelemente in Klammern eingeschlossen oder durch ein Komma vom Befehlswort oder SYS-Aufruf getrennt. Aus Gruenden einer uebersichtlichen ('sauberen') Parameteruebergabe empfiehlt sich immer die Verwendung der eingeklammerten oder durch ein Komma abgetrennten Parameter. Der Aufruf von mit Parametern ausgestatteten Routinen kann beliebig erfolgen, d.h. im direkten Modus oder aus einem Programm. Leerzeichen sind beliebig einfugbar. Der Aufruf kann an beliebiger Stelle einer Programmzeile stehen. Da diese Routine wohl zu den wichtigsten des Interpreters gehoeren duerfte, ist sie auch entsprechend komfortabel ausgestattet. Es existiert daher eine Reihe von Entry-Points zur Auswertung der unterschiedlichsten Parameter.
Diese Routinen ermoeglichen auf einfachste Art die Pruefung der gewaehlten Syntax. JSR KLAUF ;KLAMMER AUF VORHANDEN ? Das naechste Zeichen (ungleich Leerzeichen) des BASIC-Textes wird geholt. Ist es nicht das Zeichen "(", so erfolgt ein Fehlerabbruch mit der Meldung: "SYNTAX ERROR" bzw. "SYNTAX ERROR IN xxx". JSR KOMMA ;KOMMA VORHANDEN ? Das naechste Zeichen (ungleich Leerzeichen) des BASIC-Textes wird geholt. Ist es nicht das Zeichen ",", so erfolgt ein Fehlerabbruch mit der Meldung: "SYNTAX ERROR" bzw. "SYNTAX ERROR IN xxx". JSR KLAZU ;KLAMMER ZU VORHANDEN Das naechste Zeichen (ungleich Leerzeichen) des BASIC-Textes wird geholt. Ist es nicht das Zeichen ")", so erfolgt ein Fehlerabbruch mit der Meldung: "SYNTAX ERROR" bzw. "SYNTAX ERROR IN xxx".
Konstante und Variable werden direkt verarbeitet, Ausdruecke werden zunaechst entsprechend den BASIC-Regeln ausgewertet. Das Ergebnis jeder Parameter-Auswertung wird im Fioating Akku #1 (FAC1) abgelegt. Numerische Konstante und konstante Ausdruecke werden als reelle Zahl in den FAC1 geschrieben. Bei numerischen Variablen, Feidelementen oder Ausdruecken daraus (integer oder real) wird der Wert der Variablen, des Feldelementes oder das Ergebnis des arithmetischen Ausdruckes in den FAC1 geschrieben. Bei String-Argumenten (Konstante, Variable, Feldelement, Ausdruck) wird ab FAC1+3 ($B3-B4/$61-62/$61-62) ein Pointer (low Byte, high Byte) auf den String-Descriptor abgelegt. Der Stringdescriptor enthaelt an erster Stelle die Stninglaenge, gefolgt von der Stningadresse (low Byte, high Byte). Beispiele: Real-Variable: A=4:SYS 826(A) Der FAC1 enthaelt: $ 83 80 00 00 00 00 00 Integer-Variable: B%=4:SYS 826(B%) Der FAC1 enthaelt: $ 83 80 00 00 00 00 00 String-Vaniable: CLR:A$='**' :SYS 826(A$) Der FAC1 enthaelt: $ 8A 00 00 05 04 00 00 Pointer auf String-Descniptor: $0405 Stning-Descriptor (32 K RAM) : $ 02 FE 7F Das bedeutet: Stninglaenge 2, Stningadresse $7FFE Ab Adresse $7FFE steht der Stning "**".
Bei der Uebernahme eines Parametens werden zwei Flags gesetzt, die seinen Typ kennzeichnen: ARGFLG und TYPFLG. ARGFLG gibt an, ob der ausgewertete Parameter vom Typ "numerisch" oder String ist. ARGFLG = $00 : Argument numerisch ARGFLG = $FF : Argument Str ing Bei numenischem Argument (ARGFLG =$00) gibt TYPFLG an, ob der ausgewertete Parameter vom Typ "integer" oder "real" ist. TYPFLG = $00 : Argument real TYPFLG = $80 : Argument integer (%) Diese Flags koennen vom Programm untersucht werden. Im Fehlerfall (Parameter von anderem Typ als erwartet) koennen entsprechende Meldungen ausgegeben werden. Die im ROM enthaltene Meldung "TYPE MISMAICH ERROR" kann auf einfachste Weise ausgegeben werden: LDX #$A3 (#$A8 beim 2001-Computer) JMP ERRORC Da entsprechende Routinen zur Typenueberpruefung natuerlich in den ROM's enthalten sind, ist folgende Vereinfachung moeglich: Pruefen auf Stringargument ("TYPE MISMATCH ERROR" bei numenischem Argument): JSR STRTYP Pruefen auf numerisches Argument ("TYPE MISMATCH ERROR" bei Stningargument) : JSR NUMTVP
Je nach Problemstellung koennen unterschiedliche Routinen aufgerufen werden. Damit koennen Argumentauswertung, Syntax-Pruefung, Typumwandlung, Bereichsueberpruefungen zu einem einzelnen JSR-Befehl zusammengefasst werden. a) Generell kann jeder Parameter mit der Routine ARGUM ausgewertet werden. Art und Typ des Parametens koennen aus ARGFLG und TYPFLG (s.o.) entnommen werden. Das Ergebnis der Argumentauswertung steht im Floating Akku #1 (FAC1), s. 7.7.2 . JSR ARGUM b) Ein einzelner, in Klammer eingeschlossener Parameter kann ueber die Befehlsfolge "KLAUF, ARGUM, KLAZU" ausgewertet werden, zusammengefasst mit: JSR ARGKLA c) Liegt der Parameter im Wertebereich -32767 bis +32767 (integer), so kann mit der folgenden Routine eine Argumentauswertung, Typenueberpruefung, Real-Integer-Umwandlung und Grenzenueberpruefung fuer den Wertebereich. Das Ergebnis steht als ganze Zahl ab FAC1+3 ($B3-B4/$61-62/$61-62) im Zahlenformat (high Byte, low Byte). Bei Verlassen des Wertebereiches erfolgt ein Fehlerabbruch mit der Meldung "ILLEGAL QUANTITY ERROR". JSR ARGINT d) Liegt der Parameter im Wertebereich 0 bis 255 (Byte), so uebernimmt die folgende Routine die Argumentauswertung, Typueberpruefung, Real-Integer-Umwandlung und Grenzenueberpruefung fuer den Wertebereich. Das Ergebnis steht in FAC1+4 ($B4/$62/$62) und im X-Register. Bei Verlassen des Wertebereiches erfolgt ein Fehlerabbruch mit der Meldung "ILLEGAL QUANTITY ERROR". JSR ARGBYT e) Wird als Parameter eine reelle Zahl (Variable, Ausdruck) erwartet, so koennen Argumentauswertung und Typueberpruefung zusammengefasst werden: JSR ARGREA
Es ist bei mehreren Parametern nicht notwendig, diese aööe beim Eintritt in die Routine sofort auszuwerten. Diese Auswertungen koennen auch nach und nach im Verlauf der Berechnung erfolgen. Nach Auswertung eines Parameters ist dessen Wert entsprechend zu verarbeiten, d.h. der Wert muss vor der Berarbeitung des naechsten Parameters aus dem FAC1 "gerettet" werden. Bei vorzeitigem Verlassen der Routine muss - falls der Programmverlauf fortgesetzt werden soll - dafuer gesorgt werden, das die noch nicht ausgewerteten Parameter ueberlesen werden. Der Text- Pointer der CHRGET-Routine muss daher entsprechend korrigiert werden. Wird in eine SYS-Adresse statt einer Konstante eine einfache Variable eingesetzt, so muss diese in Klammern gesetzt werden, wenn ein geklammerter Parameter folgt. Richtig : SYS 826 (A) SYS (826) (A) SYS 826, A SYS PA ,A SYS (PA) (A) Falsch : SYS PA (A) Hier wuerde nicht die Routine ab Adresse PA sondern ab Adresse PA(A) aufgerufen ! Sind fuer ein Parameter numerische und String-Werte zulaessig (s: 7.7.6), so ist stets mit der Routine ARGUM zu arbeiten. Abhaengig vom Flag ARGFLAG kann dann die weitere Verarbeitung erfolgen.
Das auswertende Maschinenprogramm beginne bei Adresse "PA". Fuer jedes Beispiel folgt eine Reihe von Maschinenbefehlen zur Auswertung des (der) Parameter. SYS PA (I+J) JSR ARGKLA SYS PA (300) JSR KLAUF JSR ARGINT JSR KLAZU SYS PA (A$,10) JSR KLAUF JSR ARGUM JSR KOMMA JSR ARGBYT JSR KLAZU SYS PA (EXP(2)) JSR KLAUF JSR ARGREA JSR KLAZU SYS PA, RIGHT$(A$,5) JSR KOMMA JSR ARGUM SYS PA (Z$) JSR ARGKLA SYS PA ('033A') JSR KLAUF SYS PA (826) JSR ARGUM BIT ARGFLG BMI HEX BPL DEZ SYS PA, I%(J+1) JSR KOMMA JSR ARGINT
Dieses Programm ist dann nuetzlich, wenn es darum geht, an Parameter des BASIC-Programms Werte zu uebergeben. Beispiel : SYS xxx,EIN,AUS Der Wert der Variablen EIN soll an das Maschinenprogramm uebergeben werden, die Variable AUS soll das Ergebnis erhalten. Den Wert von EIN erhaelt man einfach durch Aufruf der Routine ARGUM (s. Kap. 7.7). Die Adresse von AUS kann mit der folgenden Routine gefunden werden : JSR FVAR Der Variablenname (im Beispiel: AUS) wird aus der Programmzeile entnommen und in VARNAM abgelegt (Format s. Kap. 7.3). Gleichzeitig werden die Flags TYPFLG ($00=real, $80=integer) und VARFLG ($00=numerisch, $ff=String) gesetzt. Die Variable wird dann mit der Routine SBAV (s. Kap. 7.3) gesucht. Wird sie nicht gefunden, so wird sie neu eingerichtet. Als Ergebnis wird die Startadresse der Variablen im X-Register (low Byte) und Y-Register (high Byte) uebergeben. Beispiel : Addition der Werte zweier Parameter , Zuweisung des Ergebnisses an den dritten Parameter und Ausgabe auf dem Bildschirm. Die Angaben in Klammern verweisen auf das Kapitel mit der ausfuehrlichen Beschreibung der jeweiligen Befehle. SYS AD, S1, S2, SU : REM SU = S1 + S2 & PRINT SU JSR KOMMA ; Komma vorhanden ? (Kap. 7.7.1) JSR ARGREA ; Reelles Argument auswerten (S1) (Kap. 7.7.4) JSR FAC12 ; FAC1 in FAC2 kopieren (Kap. 5.5) JSR KOMMA ; Komma vorhanden JSR ARGREA ; Reelles Argument auswerten (S2) LDA FAC1+5 ; Vorzeichenvergleich EOR FAC2+5 ; von FAC1 und FAC2 STA FAC2+6 LDA FAC1 ; Exponent FAC1 JSR ADD ; FAC1=FAC2+FAC1 JSR KOMMA ; Komma vorhanden ? JSR FVAR ; Variable finden JSR FAC1MEM ; Ergebnis ablegen (SU) JSR FPOUT ; Ausgeben und Return
Letzte Änderung: 2019-01-04 10:06:25