BASIC-ROM
Aus C64-Wiki
Zur Navigation springenZur Suche springenMit 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:
|
$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:
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]
- Fully Commented Commodore 64 ROM Disassembly (German)
- COMMODORE 64 ROM DISASSEMBLY von Marko Mäkelä
- BASIC ROM LISTING von AAY64
- KERNAL ROM LISTING von AAY64 (mit Teil des BASIC-Interpreters)
- C64 ROM by Lee Davison
Programmierung-Portalseite
C64-BASIC: BASIC V2 · BASIC-Befehle · Variable