BASIC-Erweiterung
Eine BASIC-Erweiterung ergänzt oder verbessert die bereits vorhanden BASIC-Befehle und -Anweisungen. Manche BASIC-Erweiterungen sind für allgemeine Zwecke geeignet, andere für bestimmte Bereiche optimiert, wie z.B. für Grafikdarstellungen, Musikerzeugung, für die Diskettenverwaltung oder zum komfortableren Programmieren.
Arten von BASIC-Erweiterungen[Bearbeiten | Quelltext bearbeiten]
Eine BASIC-Erweiterung wird in Maschinensprache programmiert und kann auf dem C64 entweder als Software, die von einem Datenträger geladen wird, oder als Steckmodul (Hardware), das in den Expansionsport eingesteckt werden muss, genutzt werden.
- Innerhalb von BASIC lassen sich Maschinenprogramme mittels DATA-Zeilen einfügen. Dies ist eine beliebte Art, zusätzliche BASIC-Befehle zu implementieren. Zwar ist dadurch der verfügbare (BASIC-)Speicher kleiner, doch werden die neuen Befehle immer gleich mitgeladen.
- Üblicher ist es, das Erweiterungsprogramm zu laden und zu starten, bevor ein Programm ausgeführt wird, das die neuen Befehle benutzt.
- Einige Compiler, wie z.B. der Basic-Boss, bieten zusätzliche BASIC-Befehle und haben damit schon eine Erweiterung eingebaut.
- Ein Steckmodul hat den Vorteil, dass die BASIC-Erweiterung sofort verfügbar ist und bietet die Möglichkeit, zusätzlichen Speicher bereitzustellen. Die Software kann nun nicht mehr so leicht wie solche auf Diskette weitergegeben werden, was vom Hersteller aber durchaus gewünscht ist.
Wichtig: BASIC-Programme, die Befehle der BASIC-Erweiterungen beinhalten, sind nur voll funktionsfähig mit der entsprechenden BASIC-Erweiterung. Ohne diese gibt es Fehlermeldungen des BASIC V2. |
Methoden der Implementierung[Bearbeiten | Quelltext bearbeiten]
Die beiden folgenden Methoden, eine BASIC-Erweiterung beim C64 zu erstellen, sind am häufigsten anzutreffen:
- Wedge: Hier klinkt sich der Programmierer in die Verarbeitung von BASIC-Code ein. Zwei Stellen sind dafür gut geeignet:
- CHRGET liegt ab $0073 in der Zeropage und verwaltet den Programmzeiger. Durch einen Patch dieser Routine kann auf zusätzlichen Programmcode umgeschaltet werden. Dieses Verfahren lässt sich bis auf die CBM-Basic Anfänge (BASIC 1.0) zurückführen und war damals bei den PETs und Nachfolger die einzige Möglichkeit den Interpreter zu erweitern. Ein Beispiel dafür ist das DOS 5.1 von der 1541-Test/Demo Diskette.
- Die Routine "BASIC-Befehl ausführen" ($A7E4) lässt sich über den Vektor $308/$309 auf eigenen Code umleiten. Im Buch 64 intern wird dieses Verfahren im Abschnitt "Wie erweitert man BASIC?" erklärt.
- Bei der Wedge-Methode wird das Programm etwas langsamer ausgeführt, da zusätzlicher Code zu verarbeiten ist. Die neuen BASIC-Befehle beginnen hier in der Regel mit einem speziellen Kennzeichen, wie "!" oder "@", wonach meistens nur noch ein Buchstabe bzw. ein Token folgt.
- Befehle mit eigenen Token: Mit dieser eleganteren Methode können längere und damit aussagekräftigere Befehlsnamen erzeugt werden, sie erfordert aber größeren Aufwand (da mittels weiterer Vektoren auch noch das Anzeigen von Tokens und das Umwandeln in Tokens zu behandeln sind). Am Beispiel von Simons Basic kann man sehen, welche Vektoren dazu auf neue Routinen umgeleitet werden.
Weitere Artikel[Bearbeiten | Quelltext bearbeiten]
Alle Artikel zum Thema BASIC-Erweiterung findet man in der Kategorie BASIC-Erweiterung.
BASIC-Erweiterungen für den C64
- Becker BASIC 64 (1987)
- Business BASIC (1985)
- DOS 5.1 (1982)
- DotBASIC Plus[1] (2008)
- Exbasic Level II (1983/1988)
- Final Cartridge III (1987)
- Graphic Routine (1986)
- GW-BASIC Emulator (1987)
- High-Speed-Grafik (1986)
- IDE64 BASIC (1994)
- Laser BASIC (1985)
- Paradoxon-Basic (1987)
- Programmer's Little Helper (1987)
- Simons' BASIC (1983)
- Simons' BASIC Extension (1983)
- Special Basic (1987)
- Spectrum Simulator (1985)
- Speech Basic (1986)
- Structured BASIC (1984)
- SupaBASIC (198?)
- Super BASIC (1983)
- SuperBASIC 64 (Compute!; Dezember 1983)
- SuperBasic-64 (1984)
- Super BASIC C64 (1985)
- Super Expander 64 (1984)
- Supergrafik (1986)
- Tegra (1987)
- Tuned Simons Basic (1986)
Programmierung[Bearbeiten | Quelltext bearbeiten]
;############################################################################### ;# Programm: BASIC-Erweiterung mit 2 neuen Befehlen @A und @B ;# Dateiname: basic_erweiterung.asm ;# ;# Assembler: ACME ;# Assemblierung: acme -f cbm -o basic_erweiterung.prg basic_erweiterung.asm ;# ;# Start mit: SYS 49152 ;# ;# Quelltext: * Kleinschreibung (bis auf Kommentare) ;# * nur Leerzeichen, keine Tabulatoren ;# * Abstand: jeweils 20 Zeichen (Label --> Befehl --> Kommentar) ;# * Zeilenlänge max. 80 Zeichen ;# ;# Beschreibung: BASIC-Erweiterung als Wedge-Methode in der ;# Interpreterschleifenvektor-Variante: ;# Befehl: @A Adresse, 16-Bit-Wert ;# Befehl: @B Rahmenfarbe, Hintergrundfarbe ;# ;############################################################################### *=$c000 ; Startadresse des Programms: 49152 ; ----- @Initialisierung@ ----- lda #<start ; Vektor ($0308) der Interpreterschleife sta $0308 ; auf eigene Routine umbiegen lda #>start sta $0309 lda #<$0803 ; Programmende zurücksetzen sta $2d lda #>$0803 sta $2e rts ; Rücksprung zu BASIC ; ----- @neue Interpreterschleife@ ----- start: jsr $0073 ; CHRGET: Byte aus Programm holen cmp #"@" ; auf @ prüfen bne normal ; wenn kein @ --> verzweige nach normal jsr $0073 ; holt weiteres Byte jsr $b113 ; auf Buchstaben prüfen bcc fehler ; nein, dann Syntax-Error ausgeben sbc #65 ; ja, dann 65 subtrahieren ; --> A=0, B=1, C=2, .... asl ; Zahl verdoppeln A=0, B=2, C=4, .... tay ; Y = A lda tabelle+1,y ; Befehlsadresse MSB holen pha ; am Stapel sichern lda tabelle,y ; Befehlsadresse LSB holen pha ; am Stapel sichern jmp $0073 ; holt Byte und führt Befehl aus normal: jsr $0079 ; CHRGOT: letztes Byte auffrischen jmp $a7e7 ; zur alten Interpreterschleife nach dem CHRGET fehler: jmp $af08 ; Fehlermeldung "?SYNTAX ERROR" ausgeben ; ----- @Befehl: @A Adresse, 16Bit-Wert@ ----- befehl_a: jsr $ad8a ; Ausdruck holen jsr $b7f7 ; auf numerisch prüfen ; Selbstmodifizierender Code: sty adresse+1 ; Adresse Low-Byte schreiben sta adresse+2 ; Adresse High-Byte schreiben jsr $aefd ; auf "," prüfen jsr $ad8a ; Ausdruck holen (Wert in Y/A) jsr $b7f7 ; auf numerisch prüfen ldx #1 ; mit High-Byte beginnen adresse: sta $0000,x ; Adresse wir oben modifiziert tya ; Low-Byte dex bpl adresse ; beim 3. Durchlauf verlassen jmp $a7ae ; zurück in die alte Interpreterschleife ; ----- @Befehl: @B Rahmenfarbe, Hintergrundfarbe@ ----- befehl_b: jsr $ad8a ; Ausdruck holen jsr $b7f7 ; auf numerisch prüfen sty $d020 ; Rahmenfarbe setzen jsr $aefd ; auf "," prüfen jsr $ad8a ; Ausdruck holen jsr $b7f7 ; auf numerisch prüfen sty $d021 ; Hintergrundfarbe setzen jmp $a7ae ; zurück in die alte Interpreterschleife ; ----- @Zeigertabelle der neuen Befehle@ ----- tabelle: !word befehl_a - 1 ; Zeiger Befehl @A minus 1 !word befehl_b - 1 ; Zeiger Befehl @B minus 1 !word $af07 ; Zeiger Befehl @C ("Syntax Error") !word $af07 ; Zeiger Befehl @D ("Syntax Error") !word $af07 ; Zeiger Befehl @E ("Syntax Error") ; ...
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Mapping the C64 siehe unter "CHRGET" bzw. "BASIC Indirect Vector Table"
- Sample wedge - Adding four new BASIC commands codebase64.org
- Commodore Languages List: Übersicht von BASIC-Erweiterungen; 01.05.2015
- BASIC Extensions bei Commodore Software
Quellen