BASIC-ROM

Aus C64-Wiki
Zur Navigation springenZur Suche springen
C64 BASIC-ROM Chip von 1982,
Commodore Nr. 901226-01

Mit BASIC-ROM wird ein 8 KByte großer ROM-Baustein bezeichnet, der beim C64 im Speicherbereich von 40960-49151 ($A000-$BFFF) für die CPU 6510 sichtbar eingeblendet wird. Das BASIC-ROM beinhaltet einen Großteil des BASIC-Interpreters, der aber zusätzlich zu $A000-$BFFF auch $E000-$E4D2 nutzt. Letzterer Speicherbereich liegt im ROM des KERNALs.

Tools, die neue Befehle zu BASIC hinzufügen oder BASIC-Routinen abändern sollen, müssen den Inhalt des BASIC-ROMs (je nach betroffenem Teil auch das KERNAL-ROM) ins RAM kopieren, dort verändern und die RAM-Kopie aktivieren.


Hex-Adresse Dez-Adresse Beschreibung
$A000 40960 BASIC-Kaltstartvektor ($E394)
$A002 40962 BASIC-Warmstartvektor ($E37B)
$A004 40964 Text "cbmbasic"
$A00C 40972 Adressen der BASIC-Befehle -1 (END, FOR, NEXT, ... 35 Adressen je 2 Byte)
$A052 41042 Adressen der BASIC-Funktionen (SGN, INT, ABS, ... 23 Adressen je 2 Byte)
$A080 41088 Hierarchie-Codes und Adressen der Operatoren -1 (10-mal 1+2 Bytes)
$A09E 41118 BASIC-Schlüsselwörter als Zeichenketten in PETSCII mit gesetztem Bit 7 des letzten Zeichens
$A129 41257 Schlüsselwörter, die keine Aktionsadressen haben - TAB(, TO, SPC(, ...; Bit 7 des letzten Zeichens ist gesetzt
$A140 41280 Schlüsselzeichen der Operatoren + - * etc.; außerdem AND, OR als Zeichenketten. Bit 7 des letzten Zeichens gesetzt
$A14D 41293 Schlüsselwörter der Funktionen (SGN, INT, ABS, etc.) mit gesetztem Bit 7 des letzten Zeichens
$A19E 41374 Fehlermeldungen (TOO MANY FILES, FILE OPEN, ... ); 29 Meldungen mit Bit 7 des letzten Zeichens gesetzt
$A328 41768 Zeigertabelle zu den Fehlermeldungen
$A364 41828 Meldungen des Interpreters (OK, ERROR IN, READY, BREAK)
$A38A 41866 Stapelsuchroutine für FOR-NEXT und GOSUB
$A3B8 41912 Schafft Platz im BASIC-Text zum Einfügen einer neuen BASIC-Zeile. Prüft, ob genug Platz vorhanden, dann $A3BF
$A3BF 41919 Blockverschieberoutine
$A3FB 41979 Prüft auf Platz im Stapel
$A408 41992 Schafft Platz im Speicher
$A435 42037 Fehlermeldung ?OUT OF MEMORY ausgeben
$A437 42039 Fehlermeldung ausgeben, Fehlernummer im X-Register; geht über einen Vektor in ($0300) zum BASIC-Warmstart $E38B
$A480 42112 Eingabewarteschleife; geht über einen Vektor in ($0302) zu $A483
$A49C 42140 Einfügen bzw. Löschen von Programmzeilen und Umwandlung in Token
$A533 42291 BASIC-Zeilen neu verketten (in allen Programmzeilen Zeiger auf die Folgezeile neu erstellen)
$A560 42336 Eingabe einer Zeile per Tastatur
$A579 42361 Umwandlung einer Zeile in Interpretercode; wird über einen Vektor in ($0304) nach $A57C geleitet
$A613 42515 Startadresse einer Programmzeile berechnen
$A642 42562 BASIC-Befehl NEW
$A65E 42590 BASIC-Befehl CLR
$A68E 42638 Programmzeiger auf BASIC-Start (d.h. Lädt $7A/$7B mit $2B-1/$2C-1)
$A69C 42652 BASIC-Befehl LIST
$A717 42775 BASIC-Code in Klartext umwandeln; über einen Vektor in ($0306) nach $A71A gelenkt
$A742 42818 BASIC-Befehl FOR: Schiebt 18 Byte auf den Stapelspeicher:
  1. Zeiger auf die nächstfolgende Anweisung (2 Byte)
  2. momentane Zeilennummer (2 Byte)
  3. oberer Schleifenwert (5 Byte)
  4. Vorzeichen Schrittweite (1 Byte)
  5. Schrittweite (Standardwert = 1) (5 Byte)
  6. Zeiger auf den Namen der Schleifenvariablen (2 Byte)
  7. das Schlüsselzeichen ($81) für FOR (1 Byte)
$A7AE 42926 Interpreterschleife
$A7C4 42948 Prüft auf Programmende
$A7E1 42977 BASIC-Befehl ausführen; über einen Vektor in ($0308) nach $A7E4 gelenkt
$A7ED 42989 Führt ein BASIC-Schlüsselwort aus
$A81D 43037 BASIC-Befehl RESTORE: setzt den Datenzeiger bei $41/$42 auf den Anfang des BASIC-Textes
$A82C 43052 BASIC-Befehl STOP (auch END sowie Programmunterbrechung)
$A82F 43055 BASIC-Befehl STOP
$A831 43057 BASIC-Befehl END
$A857 43095 BASIC-Befehl CONT
$A871 43121 BASIC-Befehl RUN
$A883 43139 BASIC-Befehl GOSUB: Schiebt 5 Byte auf den Stapelspeicher:
  1. den Zeiger auf die folgende Anweisung, von CHRGET-Routine (2 Byte)
  2. die aktuelle Zeilennummer (2 Byte)
  3. das Schlüsselzeichen für GOSUB (1 Byte)

Anschließend wird GOTO aufgerufen

$A8A0 43168 BASIC-Befehl GOTO
$A8D2 43218 BASIC-Befehl RETURN
$A8F8 43256 BASIC-Befehl DATA
$A906 43270 Offset des nächsten Trennzeichens finden
$A928 43304 BASIC-Befehl IF
$A93B 43323 BASIC-Befehl REM
$A94B 43339 BASIC-Befehl ON
$A96B 43371 Liest aus dem BASIC-Text eine Ganzzahl (0...63999, gewöhnlich eine Zeilennummer) in $14/$15 ein
$A9A5 43429 BASIC-Befehl LET
$A9C4 43460 Wertzuweisung Ganzzahl
$A9D6 43478 Wertzuweisung Fließkommazahl
$A9D9 43481 Wertzuweisung Zeichenkette
$A9E3 43491 Ordnet Systemvariable TI$ zu
$AA27 43559 Addiert PETSCII-Ziffer zu FAC
$AA2C 43564 Wertzuweisung an normalen Zeichenkette (LET für Zeichenketten)
$AA80 43648 BASIC-Befehl PRINT#
$AA86 43654 BASIC-Befehl CMD
$AA9A 43674 Teil der PRINT-Routine: Gibt Zeichenkette aus und fährt mit der Abwicklung von PRINT fort
$AAA0 43680 BASIC-Befehl PRINT
$AAB8 43704 Gibt Variable aus; Zahlen werden zunächst in eine Zeichenkette umgewandelt
$AACA 43722 $00 als Endekennzeichen an Zeichenkette anhängen
$AAD7 43735 Gibt eine Zeilenschaltung (#$0D) aus, der ein Zeilenvorschub (#$0A) folgt, wenn die Kanaladresse 128 ist
$AAF8 43768 TAB( (C=1) und SPC( (C=0)
$AB1E 43806 Zeichenkette ausgeben: Zeichenfolge, auf die A/Y zeigt, ausgeben, bis ein Nullbyte oder Anführungszeichen angetroffen wird
$AB3B 43835 Ausgabe Cursor rechts (oder Leerzeichen, wenn die Ausgabe nicht auf Bildschirm)
$AB3F 43839 Ausgabe eines Leerzeichens
$AB42 43842 Ausgabe Cursor rechts
$AB45 43845 Ausgabe Fragezeichen (vor Fehlermeldung)
$AB47 43847 Ausgabe eines PETSCII-Zeichens, Akku muss PETSCII-Wert enthalten
$AB4D 43853 Gibt die entsprechenden Fehlermeldungen aus für INPUT/GET/READ
$AB7B 43899 BASIC-Befehl GET
$ABA5 43941 BASIC-Befehl INPUT#
$ABBF 43967 BASIC-Befehl INPUT
$ABEA 44010 Eingabepuffer lesen
$ABF9 44025 Eingabeprompt ausgeben
$AC06 44038 BASIC-Befehl READ; GET und INPUT teilen sich diese Routine, werden aber durch ein Flag in $11 unterschieden
$AC35 44085 Einleseroutine
$ACFC 44284 Meldungen ?EXTRA IGNORED und ?REDO FROM START, beide gefolgt von $0D (CR) und Zeichenkettenendzeichen $00.
$AD1D 44317 BASIC-Befehl NEXT
$AD61 44385 Prüft auf gültige Schleife
$AD8A 44426 FRMNUM: Ausdruck holen (FRMEVL) und auf numerisch prüfen
$AD9E 44446 FRMEVL: wertet jeglichen BASIC-Formelausdruck aus und meldet Syntaxfehler. Setzt Typ-Flag $0D bei Zahl auf $00, bei Zeichenkette auf $FF; Setzt Ganzzahl-Flag $0E bei einer Fließkommazahl auf $00, bei Ganzzahl auf $80; legt den Wert im FAC ab.
$AE83 44675 EVAL: Nächstes Element eines Ausdrucks holen; wird über einen Vektor in ($030A) nach $AE86 geleitet.
$AEA8 44712 Wert für Konstante π im 5-Byte-Fließkommaformat
$AEF1 44785 Wertet Klammerausdrücke innerhalb des Textes aus
$AEF7 44791 Prüft auf Klammer zu ")"
$AEFA 44794 Prüft auf Klammer auf "("
$AEFD 44797 Prüft auf Komma
$AF08 44808 Gibt ?SYNTAX ERROR aus und kehrt zum READY-Status zurück
$AF0D 44813 Berechnet NOT
$AF14 44820 Prüft auf reservierte Variablen: Setzt Carry-Flag auf 1, wenn FAC auf ROM zeigt, was auf eine der reservierten Variablen TI$, TI, ST hinweist
$AF28 44840 Variable holen: Sucht die Variablenliste nach der in $45/$46 genannten Variablen ab
$AF48 44872 Liest den Taktzähler und bildet eine Zeichenkette, die TI$ enthält
$AFA7 44967 Funktionsberechnung: Stellt Funktionstyp fest und wertet die Funktion aus
$AFB1 44977 Zeichenkettenfunktion: prüft auf Klammer auf, holt Ausdruck (FRMEVL), prüft auf Komma, holt Zeichenkette.
$AFD1 45009 Numerische Funktion auswerten
$AFE6 45030 BASIC-Befehle OR und AND, unterschieden durch Flag in $0B (= $FF bei OR, $00 bei AND).
$B016 45078 Vergleichsoperatoren (<, =, > )
$B01B 45083 Numerischer Vergleich
$B02E 45102 Zeichenkettenvergleich
$B081 45185 BASIC-Befehl DIM
$B08B 45195 Prüft einen Variablennamen auf Gültigkeit
$B0E7 45287 Sucht Variable in Variablenliste, setzt Variablenzeiger, definiert neue Variable, wenn Name nicht gefunden
$B113 45331 Prüft auf Buchstabe
$B11D 45341 Variable anlegen
$B194 45460 Zeiger auf erstes Feldelement berechnen
$B1A5 45477 Konstante -32768 in 5-Byte-Fließkommaformat
$B1AA 45482 Wandelt FAC in Ganzzahl und speichert sie in Y/A
$B1B2 45490 Holt positiven Ganzzahlausdruck aus BASIC-Text
$B1BF 45503 Wandelt FAC in Ganzzahl
$B1D1 45521 Holt Feldvariable aus BASIC-Text
$B218 45592 Sucht nach dem Feldnamen im Zeiger ($45/$46)
$B245 45637 Fehlermeldung ?BAD SUBSCRIPT ausgeben
$B248 45640 Fehlermeldung ?ILLEGAL QUANTITY ausgeben
$B24D 45645 Fehlermeldung ?REDIM'D ARRAY ausgeben
$B261 45665 Feldvariable anlegen
$B30E 45838 Berechnung der Adresse eines Feldelements, setzen des Zeigers ($47)
$B34C 45900 Berechnet den Abstand des angegebenen Feldelements von der Feldadresse, auf die der Zeiger ($47) zeigt und setzt das Ergebnis in X/Y
$B37D 45949 BASIC-Funktion FRE
$B391 45969 Wandelt 16-Bit-Ganzzahl in Y/A-Reg. in eine Fließkommazahl
$B39E 45982 BASIC-Funktion POS
$B3A2 45986 Wandelt das Byte in Y in eine Fließkommazahl in FAC
$B3A6 45990 Test auf Direktmodus: der Wert $FF im Flag $3A zeigt Direktmodus an
$B3AE 45998 Fehlermeldung ?UNDEF'D FUNCTION ausgeben
$B3B3 46003 BASIC-Befehl DEF FN
$B3E1 46049 Prüft die Syntax von FN
$B3F4 46068 BASIC-Funktion FN
$B465 46181 BASIC-Funktion STR$
$B475 46197 Schafft Platz zum Einfügen einer Zeichenkette
$B487 46215 Zeichenkette holen, Zeiger in A/Y
$B4CA 46282 String-Descriptor-Element mit Zeiger auf Zeichenkette am String-Descriptor-Stapel ablegen
$B4F4 46324 Platz für Zeichenkette am String-Heap reservieren, Länge in A
$B526 46374 Garbage-Collection
$B606 46598 Hilfsroutine für die Garbage-Collection: Sucht String-Descriptor-Stapel, Variablen und Felder nach der nächsten (mit der höchstliegenden Adresse) zu betrachtenden Zeichenkette ab
$B63D 46653 Verknüpft zwei Zeichenketten
$B67A 46714 Verschiebt Zeichenkette in den für Zeichenketten reservierten Bereich (String-Heap)
$B6A3 46755 Zeichenkettenverwaltung FRESTR: Versuchen eine Zeichenkette freizugeben
$B6DB 46811 Zu einem Zeiger einer Zeichenkette gehörendes Element vom String-Descriptor-Stack entfernen
$B6EC 46828 BASIC-Funktion CHR$
$B700 46848 BASIC-Funktion LEFT$
$B72C 46892 BASIC-Funktion RIGHT$
$B737 46903 BASIC-Funktion MID$
$B761 46945 Zeichenkettenparameter: Holt Zeiger für String-Descriptor nach $50/$51 und die Länge nach A (und auch X)
$B77C 46972 BASIC-Funktion LEN
$B782 46978 Zeichenkettenparameter holen (Länge in Y), auf numerisch umschalten
$B78B 46987 BASIC-Funktion ASC
$B79B 47003 Holt Byte-Wert nach X: Liest einen Ausdruck aus dem BASIC-Text und wertet ihn aus; der 1-Byte-Wert wird dann in X und FAC+4 abgelegt
$B7AD 47021 BASIC-Funktion VAL
$B7EB 47083 GETADR und GETBYT: Holt eine 16-Bit-Ganzzahl (nach $14/$15) und einen 8-Bit-Wert (nach X) - z.B. Parameter für WAIT und POKE.
$B7F7 47095 Wandelt FAC in 2-Byte-Ganzzahl (Bereich 0 ... 65535) in $14/$15 und Y/A
$B80D 47117 BASIC-Funktion PEEK
$B824 47140 BASIC-Befehl POKE
$B82D 47149 BASIC-Befehl WAIT
$B849 47177 FAC = FAC + 0,5; dient zum Runden
$B850 47184 FSUB: FAC = KONSTANTE - FAC , Akku und Y-Register zeigen auf KONSTANTE (Low- und High-Byte)
$B853 47187 FSUBT: FAC = ARG - FAC
$B862 47202 Exponenten von FAC und ARG angleichen für Addition
$B867 47207 FADD: FAC = KONSTANTE (A/Y) + FAC
$B86A 47210 FADDT: FAC = ARG + FAC
$B947 47431 Mantisse von FAC invertieren
$B97E 47486 Fehlermeldung OVERFLOW ausgeben
$B983 47491 Multipliziert mit einem Byte
$B9BC 47548 Konstante 1.00 (Tabelle von Konstanten im 5-Byte-Fließkommaformat für die Berechung der LOG-Funktion mittels Taylorreihenentwicklung)
$B9C1 47553 Konstante 3 (Polynomgrad, dann 4 Koeffizienten)
$B9C2 47554 Konstante 0.434255942 (1. Koeffizient)
$B9C7 47559 Konstante 0.576584541 (2. Koeffizient)
$B9CC 47564 Konstante 0.961800759 (3. Koeffizient)
$B9D1 47569 Konstante 2.885390073 (4. Koeffizient)
$B9D6 47574 Konstante 0.707106781 = 1/SQR(2)
$B9DB 47579 Konstante 1.41421356 = SQR(2)
$B9E0 47584 Konstante -0.5
$B9E5 47589 Konstante 0.693147181 = LOG(2)
$B9EA 47594 BASIC-Funktion LOG
$BA28 47656 FMULT: FAC = Konstante (A/Y) * FAC
$BA30 47664 FMULTT: FAC = ARG * FAC
$BA59 47705 Multipliziert FAC mit einem Byte und speichert Ergebnis in $26 .. $2A
$BA8C 47756 CONUPK: ARG = Konstante (A/Y)
$BAB7 47799 Prüft FAC und ARG
$BAE2 47842 MUL10: FAC = FAC * 10
$BAF9 47865 Konstante 10 in Flpt
$BAFE 47870 FAC = FAC / 10
$BB0F 47887 FDIV: FAC = Konstante (A/Y) / FAC
$BB14 47892 FDIVT: FAC = ARG / FAC
$BB8A 48010 Fehlermeldung ?DIVISION BY ZERO ausgeben
$BBA2 48034 MOVFM: Konstante (A/Y) nach FAC übertragen
$BBC7 48071 FAC nach Akku #4 ($5C bis $60)
$BBCA 48074 FAC nach Akku #3 ($57 bis $5B)
$BBD0 48080 FAC nach Variable (die Adresse, auf die $49 zeigt)
$BBFC 48124 ARG nach FAC
$BC0C 48140 FAC (gerundet) nach ARG
$BC1B 48155 Rundet FAC
$BC2B 48171 Vorzeichen von FAC holen: A=0 wenn FAC=0, A=1 wenn FAC positiv, A=$FF wenn FAC negativ
$BC39 48185 BASIC-Funktion SGN
$BC58 48216 BASIC-Funktion ABS
$BC5B 48219 Vergleich Konstante (A/Y) mit FAC: A=0 wenn gleich, A=1 wenn FAC größer, A=$FF wenn FAC kleiner
$BC9B 48283 FAC nach Ganzzahl: wandelt FAC in 4-Byte-Ganzzahl
$BCCC 48332 BASIC-Funktion INT
$BCF3 48371 Umwandlung einer PETSCII-Zeichenkette ins Fließkommaformat
$BDB3 48563 Konstante 9999999.9 (3 Konstanten für Fließkomma nach PETSCII)
$BDB8 48568 Konstante 99999999
$BDBD 48573 Konstante 1000000000
$BDC2 48578 Ausgabe "IN" und Zeilennummer (aus CURLIN $39/$3A)
$BDCD 48589 Positive Ganzzahl in A/X ausgeben
$BDDD 48605 FAC nach PETSCII-Zeichenkette wandeln, die in $0100 beginnt und mit einem Nullbyte endet. Startadresse in A/Y.
$BE68 48744 Wandelt TI in PETSCII-Zeichenkette, die mit der Adresse $0100 beginnt und mit einem Nullbyte endet
$BF11 48913 Konstante 0.5
$BF16 48918 Tabelle von Konstanten für Gleitkomma nach PETSCII
$BF3A 48954 Tabelle von Konstanten für Umwandlung TI nach TI$
$BF71 49009 BASIC-Funktion SQR
$BF78 49016 Potenzierung FAC = ARG ↑ Konstante (A/Y)
$BF7B 49019 Potenzierung FAC = ARG ↑ FAC
$BFB4 49076 Macht FAC negativ
$BFBF 49087 Konstante 1.44269504 = 1/LOG(2) (Tabelle von 8 Fließkommakonstanten zur Auswertung der EXP-Funktion mittel Taylorreihenentwicklung)
$BFC4 49092 Konstante 7 (7 = Polynomgrad, dann 8 Koeffizienten)
$BFC5 49093 Konstante 2.149875 E-5
$BFCA 49098 Konstante 1.435231 E-4
$BFCF 49103 Konstante 1.342263 E-3
$BFD4 49108 Konstante 9.6414017 E-3
$BFD9 49113 Konstante 5.550513 E-2
$BFDE 49118 Konstante 2.402263 E-4
$BFE3 49123 Konstante 6.931471 E-1
$BFE8 49128 Konstante 1.00
$BFED 49133 BASIC-Funktion EXP
$E043 57411 POLYX, Teil des BASIC-Interpreters, aber ausgelagert ins KERNAL-ROM
$E059 57433 POLY, Teil des BASIC-Interpreters, aber ausgelagert ins KERNAL-ROM
$E264 57956 COS (Cosinus), Teil des BASIC-Interpreters, aber ausgelagert ins KERNAL-ROM
$E26B 57963 SIN (Sinus), Teil des BASIC-Interpreters, aber ausgelagert ins KERNAL-ROM
$E2B4 58036 TAG (Tangens), Teil des BASIC-Interpreters, aber ausgelagert ins KERNAL-ROM
$E30E 58126 ATN (Arkustangens), Teil des BASIC-Interpreters, aber ausgelagert ins KERNAL-ROM

Weblinks[Bearbeiten | Quelltext bearbeiten]