BASIC-ROM
Aus C64-Wiki
Zur Navigation springenZur Suche springen

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:
|
| $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