Special Basic
Special Basic | |
---|---|
Entwickler | Michael Störch, Lars George |
Verleger | Markt & Technik |
Release | 1987, 1993 |
Lizenz | Vollversion |
Plattform(en) | C64 |
Genre | BASIC-Erweiterung |
Steuerung | |
Medien | |
Sprache(n) | Anleitung |
Information |
|
Special Basic ist eine BASIC-Erweiterung, die von den Klassenkameraden Michael Störch und Lars George in der Freizeit programmiert, an die 64'er verkauft und 1988 in der 64'er Extra Nr.7 sowie 1993 im 64'er-Sonderheft 87 veröffentlicht worden ist [1].
Beschreibung[Bearbeiten | Quelltext bearbeiten]
Die Erweiterung wird von Diskette geladen mit
LOAD "SPECIAL BASIC",8
und mit RUN
gestartet.
Special Basic ergänzt das BASIC V2 um 200 Befehle und Funktionen aus vielen Anwendungsbereichen. Vor allem für Sprites und Zeichen findet man hier neue Programmfunktionen. Die Erweiterung unterstützt farbige Hires-Grafik, den Multicolormodus aber leider nur für Sprites. BASIC V2-Programme laufen ohne Einschränkung, sofern sie keine Maschinensprache-Routinen im Speicherbereich ab $8000 (32768) verwenden oder länger als ca. 100 Blöcke sind. Die Erweiterung benutzt die Modulkennung CBM80 ab $8000. Ausgeschaltet wird sie mit dem Befehl "GO 64", der in den Einschaltmodus des C64 zurück führt.
Viele Befehle ähneln auffallend denen von Simons' Basic. Manche haben sogar eine identische Syntax, andere unterscheiden sich nur in den Parametern. Es ist daher oft mit wenig Aufwand möglich, Simons-Basic-Programme in Special-Basic-Anwendungen umzuwandeln. Am bequemsten geht das mit Copy und Paste im Emulator Vice (ab V.3). Programme der beiden Erweiterungen sind allerdings nicht kompatibel, da sie für ihre Befehle nicht die gleichen Token verwenden.
Versionen[Bearbeiten | Quelltext bearbeiten]
Die beiden veröffentlichten Versionen von 1987 (64'er Extra Nr.7) und 1993 (Sonderheft 87) sind bis auf die Einschaltmeldung identisch.
Der Special-Basic-Teil der beiden Disketten-Inhaltsverzeichnisse:
0 "64ER EXTRA " PB 2A 66 "SPECIAL BASIC" PRG 14 "GRAFIK - DEMO" PRG 8 "GRAFIK - DEMO II" PRG 14 "ZEICHEN- DEMO" PRG 4 "MUSIK - DEMO" PRG 20 "SPRITE - DEMO" PRG 6 "STRUKTUR-DEMO" PRG 0 "----------------" DEL
0 "64'ER SONDERH.87" S1 2A 28 "DISKLADER" PRG 0 "┌──────────────┐" USR 0 "│ GRAFIK │" USR 0 "│ ERWEITERUNG │" USR 0 "└──────────────┘" USR 66 "SPECIAL BASIC" PRG 14 "GRAFIK-DEMO1" PRG 8 "GRAFIK-DEMO2" PRG 14 "ZEICHEN-DEMO" PRG 20 "SPRITE-DEMO1" PRG 8 "SPRITE-DEMO2" PRG 0 "----------------" USR 46 "GRAPHICCHARTS" PRG 2 "UMSATZ 1992.DAT" SEQ 0 "----------------" USR 59 "STERNENHIMMEL" PRG 0 "----------------" USR
Die Demo-Programme mit dem - bis auf die Schreibweise - gleichen Namen sind identisch. "MUSIK - DEMO" und "STRUKTUR-DEMO" von der 1987er-Version fehlen auf der Diskette des Sonderheftes. Dafür sind "SPRITE-DEMO2" und die beiden längeren Programme "GRAPHICCHARTS" und "STERNENHIMMEL" dazugekommen. Letzteres ist zuvor bereits als Simons'-Basic-Programm im 64'er-Magazin 5/1985 veröffentlicht worden.
Startprogramm[Bearbeiten | Quelltext bearbeiten]
"SPECIAL BASIC.PRG" ist ein Maschinenspracheprogramm mit einer BASIC-Zeile
0 SYS 2091 (C) 1987 BY MARKT & TECHNIK
bzw.0 SYS 2091 (C) 1993 BY MARKT & TECHNIK
.
Es führt folgende Aktionen aus:
- Kopieren des Codes von $08C8-$48C9 in den Bereich $8000-$BFFF
- Funktionstasten aus Befehlen der Tabelle bei $08A5 im Bereich $CB00-$CBFF installieren.
- Standardbelegung:
KEY1,"COMMANDS←" KEY2,"SHOW←" KEY3,"RUN←" KEY4,"CHAIN←" KEY5,"LIST←" KEY6,"MEMORY←" KEY7,"HELP←" KEY8,"DIR←"
- Löschen (Überschreiben mit Leerzeichen) der Bereiche $CC00-$CFFF und $F000-$F3FF
- Initialisieren der Vektor-Bytes
$CA1D/$CA1E
für FIX / VARY$CA26/$CA27
für SET / MONITOR$CA28/$CA29
für GLOBAL / LOCAL
- Reset ausführen
Speicheraufteilung[Bearbeiten | Quelltext bearbeiten]
Adressbereich | Inhalt |
$0000 bis $03FF | Zeropage und Pages 1 bis 3 |
$0400 bis $07FF | Textbildschirm |
$0800 bis $7FFF | Basic-RAM und Variablenspeicher |
$8000 bis $BFFF | Special Basic |
$C000 bis $C9FF | freies RAM (für Maschinensprache-Routinen, Sprites usw.) |
$CA00 bis $CAFF | Stack (Schleifen, EXEC-END PROC, Flags usw.) |
$CB00 bis $CBFF | Funktionstastenbelegung |
$CC00 bis $CFFF | Farbspeicher für Grafik, Bildschirmspeicher für Text mit neuem Zeichensatz) |
$D000 bis $DFFF | temporärer Speicher (TURNMOB, PAINT, GLOBAL/LOCAL) |
$E000 bis $FFFF | Hires-Grafik oder neuer Zeichensatz, bzw. Hilfsbildschirme von $F000 bis $F800 |
Geänderte Vektoren[Bearbeiten | Quelltext bearbeiten]
Vektor | Bedeutung | Adresse |
---|---|---|
$0300-$0301 | BASIC-Warmstart | $831B |
$0302-$0303 | Eingabe einer Zeile | $843E |
$0304-$0305 | Umwandlung in Interpretercode | $84C8 |
$0306-$0307 | Umwandlung in Klartext (LIST) | $86F6 |
$0308-$0309 | BASIC-Befehlsadresse holen | $87C9 |
$030A-$030B | Ausdruck auswerten | $89AD |
$0314-$0315 | IRQ | $8116 |
$0318-$0319 | NMI | $80AF |
Tabelle der Befehlstexte
- $A002 (RAM)
Sprungtabelle zu Befehlsadressen
- $BDFE+2 = $BE00 (Low-/High-Byte) für Token $63; 256/2 = 128 Bytes
- $BEFE+2 = $BF00 (Low-/High-Byte) für Token $64
Befehle und Funktionen, Kurzbeschreibung[Bearbeiten | Quelltext bearbeiten]
Die folgende Auflistung der Befehle und Funktionen ist zwar vollständig, aber kurz gefasst. Details zu den Parametern oder Beispieleprogramme findet man in der Anleitung.
Alle Befehle können auf die übliche Art und Weise abgekürzt werden.
Programmierhilfen[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
AUTO zn,s | automatische Zeilennummerierung | AUTO |
RENUM [zn,s] | die Basic-Programmzeilen werden neu nummeriert. | RENUMBER (SBX) |
DELETE [-zn/zn-/zn-zn] | Iöscht Programmzeilen | DELETE |
OLD | reaktiviert ein durch KILL, NEW oder per Reset gelöschtes Basic-Programm. | OLD |
TRACE [n] | Programmablauf testen (Geschwindigkeit n: 0 schnell, 255 langsam) | TRACE |
STRACE | Single-Step-Trace-Modus | |
MONITOR | aktiviert einen separat geladenen Maschinensprache-Monitor (z.B. SMON) | MONITOR |
SET sa | definiert die Startadresse des MONITOR-Befehls, die unter $8000 liegen muss | |
DUMP | listet alle benutzten Variablen (aber keine indizierten) und deren aktuelle Werte; mit DEF FN definierte Werte werden nicht mit angezeigt. | DUMP |
MATRIX | zeigt alle Indexvariablen (Arrays) | MATRIX Exbasic Level II PLACE (TSB) |
FIND zk/var | sucht einzelne Zeichen, Strings oder Befehle im Programmtext; zk = Zeichenkette oder Basic-Befehl, var = numerische oder Stringvarible | FIND (SBX) |
KEY n,a$ | Funktionstaste n mit beliebigem Text (z.B. Special-Basic-Befehlen) belegen. Maximal 31 Zeichen, am Ende mit "←" für CHR$(13); Speicherbereich $CB00-$CC00 (excl.) | KEY (TSB) |
SHOW | zeigt die aktuelle Liste der Funktionstasten-Belegung. | DISPLAY |
OFF | löscht die F-Tastentexte. | |
DELAY n | verzögert die Ausgabe eines Basic-Listings auf dem Bildschirm; n = Verzögerungswert (0 = schnell, 255 = langsam) | DELAY |
PAGE [n] | stoppt nach der Eingabe von LIST in Abschnitten von n Zeilen; n = Zeilenanzahl (1 bis 25) | PAGE |
MEMORY | zeigt die momentan gültige Speicheraufteilung | MEM Exbasic Level II |
Strukturiertes Programmieren[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
ELSE | in IF - THEN - ELSE | ELSE |
BEGIN [- BELSE] - BEND | in IF - THEN - BEGIN - [BELSE] - BEND | BEGIN, BEND |
REPEAT - UNTIL | REPEAT, UNTIL | |
LOOP - EXIT - END LOOP | LOOP, EXIT, END LOOP | |
PROC name(var1, var2, ...) | definiert Name und Beginn einer Programmprozedur (= Unterprogramm). Parameter lassen sich in Klammern als Variablen übergeben. | PROC |
END PROC | bestimmt das Ende einer Prozedur; damit wird sie zum Unterprogramm und lässt sich mit EXEC aufrufen. | END PROC |
CALL name[(var1, var2, ...)] | springt zu der mit PROC definierten Programmstelle | CALL |
EXEC name[(var1,var2, ...)] | aktiviert die Prozedur als Unterprogramm | EXEC |
SGOTO zn | berechnetes GOTO; zn kann eine Zeilennummer oder ein numerischer Ausdruck sein | CGOTO |
POP x | verlässt ein Unterprogramms oder eine Schleife (Stapelzeiger wird korrigiert); x = Unterprogrammart: 1=GOSUB/RETURN, 2=EXEC/END PROC, 3=REPEAT/UNTIL, 4= LOOP/ENDLOOP | |
RESET zn | setzt den DATA-Zeiger auf die Zeilennummer zn | RESET |
CASE OF wert | in CASE OF - WHEN [wert] - OTHERWISE - ENDCASE; wert = Zahl oder String (muss bei CASE OF und WHEN übereinstimmen) |
Fehlerbehandlung[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
HELP | zeigt Programmzeile mit letztem Fehler und fehlerhafter Anweisung revers gekennzeichnet | HELP, HELP (SBX) |
ON ERROR GOTO zn | springt zu einem Unterprogramm, das bei einem Fehler aktiviert werden soil. | ON ERROR (TSB) |
ERRLN | Systemvariable, enthält die Nummer der Fehlerzeile | ERRLN |
ERRN | Systemvariable, enthält die Fehlernummer. | ERRN |
ERR$ (errn) | Sytemvariable, enthält die Fehlermeldungen im Klartext | OUT (TSB) |
NO ERROR | schaltet den ON-ERROR-Modus ab | NO ERROR |
RESUME [NEXT] | macht nach einem Fehler im Programm weiter, wenn der ON-ERROR-Modus aktiviert war | RESUME (TSB) |
Ein- und Ausgabebefehle[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
FETCH a$,l,x$ | verbesserte INPUT-Routine, a$=erlaubte Zeichen, l=Länge der Eingabe (1-88), x$=Variablenname für Eingabe. | FETCH (TSB) |
GETKEY aS | wartet auf einen Tastendruck und weist dessen Wert der Variablen a$ zu. | GETKEY |
LOCATE x,y [Zeichenkette] | setzt den Cursor auf Spalte x und Zeile y des Textbildschirms und gibt dort ggf. den Text aus. | AT |
CENTER aS | platziert den Variablentext in der Bildschirmmitte | CENTRE |
CHRLO | stellt den Kleinschriftzeichensatz ein (wie PRINT CHR$(14)) | CSET 1 |
CHRHI | aktiviert wieder die Groß-/Grafik-Zeichen (entspricht PRINT CHR$(142)); die Tastenkombination <C= SHIFT) ist außer Funktion gesetzt. | CSET 0 |
CLS | löscht den Textbildschirm (wie PRINT CHR$(147)). | CLS (TSB) |
SPELL a$,n | gibt Text a$ um den Faktor n (0 schnell, 255 langsam) verzögert aus | |
PRESS r,a$ | schreibt den Inhalt von a$ in der Richtung r auf den Bildschirm. Richtung r = 1 bis 8: N/NO/O/SO/S/SW/W/NW |
Bildschirmgrafik[Bearbeiten | Quelltext bearbeiten]
Im Textmodus
Befehl | Beschreibung | ähnlich |
COLOR sf, rf, hf | setzt Farben; sf = Schriftzeichen-Farbe, rf = Rahmenfarbe, hf = Hintergrundfarbe, (0 bis 15). | COLOUR (TSB) |
FCOL s, z, b, h, f | füllt definierten Bildschirmbereich mit Zeichenfarbe f; s = Spalte, z = Zeile, b = Breite, h = Höhe | FCOL |
FCHR s, z, b, h, c | überschreibt Bildschirmbereich mit dem Zeichen c (Bildschirmcode) | FCHR |
FILL s, z, b, h, c, f | ein Bildschirmbereich wird mit farbigen Zeichen gefullt (= FCOL + FCHAR). | FILL |
SCRINV s, z, b, h | invertiert Bildschirmbereich | INV |
SCOPY s, z, b, h, ns, nz | kopiert einen Bildschirmbereich nach ns/nz (linke obere Ecke) | MOVE |
CHANGE | kopiert den aktuellen Bildschirm in den RAM-Bereich von $F000 bis $F3FF; Farb-RAM $F400 bis $F7FF. Erneutes CHANGE stellt den Urzustand wieder her. | PUSH (SBX), PULL (SBX) |
SUP s, z, b, h, m | scrollt den Bildschirmbereich um eine Zeile nach oben; mit m=1 erscheinen Zeichen, die in der obersten Zeile verschwunden sind, bei m=0 bleiben weggescrollte Zeilen verschwunden. | UP |
SDOWN s, z, b, h, m | wie SUP, nur scrollt der Bildschirm nach unten. | DOWN |
SRIGHT s, z, b, h, m | scrollt den Bildschirm eine Spalte nach rechts. | RIGHT |
SLEFT s, z, b, h, m | scrollt den Bildschirm eine Spalte nach links, | LEFT |
FLASH [f, g] | alle Zeichen mit der Farbe f blinken im Takt g (/60 Sek.). FLASH ohne Parameter stellt das Blinke wieder ab. | FLASH |
Diskettenbefehle[Bearbeiten | Quelltext bearbeiten]
Alle Floppybefehle beziehen sich auf das Laufwerk #8.
Befehl | Beschreibung | ähnlich |
DLOAD name | lädt ein Basic-Programm von Diskette (entspricht LOAD name,8,0); sehr praktisch zum Laden aus der Directory-Anzeige | DLOAD |
DSAVE name | speichert ein Basic-Programm auf Diskette (entspricht SAVE name,8) | DSAVE |
DVERIFY name | vergleicht das Basic-Programm im Speicher mit dem gleichnamigen auf Diskette. | DVERIFY |
DMERGE name | hängt die Basic-Zeilen eines von Diskette zu ladenden Programms an das im Speicher an. | MERGE |
CHAIN name | lädt und startet ein Basic-Programm von Diskette | CHAIN (SBX) |
GLOAD name | lädt eine Hiresgrafik (inkl. Farbe) | SCRLD_(TSB) |
GSAVE name | speichert den Grafikbereich als Hiresgrafik-Datei (inkl. Farbe) auf Diskette. | SCRSV_(TSB) |
BLOAD name [,sa] | lädt einen Datenbereich absolut (wie mit ",8,1" in Basic 2.0), z.B. Maschinenspracheprogramme. Die Startadresse kann mit sa vorgegeben werden. | BLOAD |
BSAVE name,sa,ea+1 | sichert den Speicherbereich von sa bis ea auf Diskette; liest immer ROM! | BSAVE |
CLOAD name | lädt einen Zeichensatz, der mit CSAVE gespeichert wurde. | |
CSAVE name | sichert einen neuen Zeichensatz auf Diskette. | |
DIR | zeigt das Inhaltsverzeichnis der aktuellen Diskette an; hält die Ausgabe an, bricht sie ab. Die Eingabe eines Filters, wie bei DIR"$:A*", ist leider nicht möglich. | DIRECTORY |
DISK a$ | gibt die Floppyanweisung a$ an die Diskettenstation weiter, entspricht OPEN 1,8,15, a$: CLOSE 1 | DISK |
ERROR | liest den Fehlerkanal der Floppy und zeigt den Status im Klartext an. |
Kassettenbefehle[Bearbeiten | Quelltext bearbeiten]
Diese Befehle werden im 64'er Sonderheft 87 nicht mehr erwähnt.
Befehl | Beschreibung | ähnlich |
MERGE name | hängt das Programm "name" an das im Speicher an. | MERGE |
HEADER name | lädt den Kopf des Programms "name" und gibt dessen Anfangs- und Endadresse sowie die Länge aus | |
Turbo-Tape-Befehle | ||
←L name | lädt das Programm "name" (10-mal schneller, falls es mit &arrl;S gespeichert wurde) | |
←S name | speichert das Programm "name" (10-mal schneller) | |
←V name | vergleicht das Programm im Speicher mit dem mit &arrl;S gespeicherten Programm "name" | |
←R name | lädt und startet das Programm "name", das mit &arrl;S gespeichert wurde | |
←M name | wie MERGE, aber nur für Programme, die mit &arrl;S gespeichert wurden |
Druckerbefehle[Bearbeiten | Quelltext bearbeiten]
Alle Druckerbefehle berücksichtigen die Geräteadresse 4 und seriell mit dem Computer verbundene Drucker wie z.B. per Hardware-Interface an der Centronics-Schnittstelle.
Befehl | Beschreibung | ähnlich |
TYPE a$ | wie PRINT, die Daten werden aber zum seriell angeschlossenen Drucker geschickt. | |
TEXTCOPY | druckt den aktuellen Textbildschirm (Low Res) zentriert in der Papiermitte. | HRDCPY |
GRAPHCOPY | gibt eine hochauflösende Grafik (Hires) zentriert auf dem Drucker aus. | COPY |
Zeichensatz[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
NCHAR | kopiert den Zeichensatz vom ROM ($D000) ins RAM ($E000), wo er sich nun ändern lässt. | MEM |
SWITCH m | Schaltet um zwischen normalem und alternativem Bildschirm/Zeichensatz; m=0 Originalzeichensalz, Bildschirmspeicher bei $0400; m=1 neuer Zeichensatz bei $E000, Bildschirmspeicher bei $CC00, ab $C000 können Sprite-Blöcke liegen. | CSET |
CHRINV c, gk | invertiert das Zeichen c (Bildschirmcode) im mit gk (0=Groß/Grafik, 1=Klein/Groß) bestimmten Zeichensatzmodus. | |
TWIST c, gk, x | rotiert das mit c und gk gewählte Zeichen x-mal um 90 Grad nach links. | |
MIRX c, gk | spiegelt das Zeichen an der x-Achse; es steht dann auf dem Kopf. | |
MIRY c, gk | spiegelt das Zeichen an der y-Achse; es erscheint seitenverkehrt. | |
CREATE 0, c, gk | ändert ein Zeichen. Diese Anweisung muss vor jeder Neudefinition mit CHAR stehen. | DESIGN |
CHAR aS [,z] | ändert eine Bit-Zeile (= Byte) im Muster des mit CREATE gewählten Zeichens. Gibt man dahinter den Parameter z an , betrifft die Änderung nur dieses Byte der Zeichenmatrix. | |
CHRCOPY c, gk, an, cn, gkn | übertragt das Zeichenmuster eines Charakters aus dem neuen Zeichensatz in die Matrix des äquivalenten Originalzeichens; an=0/1: Original-/neuer Zeichensatz | |
CHROR cl, gk1, an1, c2, gk2, an2, c, gk | Die Zeichen (1) und (2) werden ODER-verknüpft und im Zeichen c, gk gespeichert. | |
CHRAND el, kg, an1, c2, gk2, an2, c, gk | wie CHOR, aber UND-Verknüpfung. | |
SCROLL r c, gk , a, m | scrollt das Zeichen c,gk a-mal in die durch r vorgegebene Richtung. Bei m=1 erscheinen am Rand verschwundene Zeichen auf der gegenüberliegenden Seite. Ist m=0, wird die Spalte bzw. Zeile gelöscht. | UP, DOWN, LEFT, RIGHT |
EMPTY c, gk | löscht das durch c, gk bestimmte Zeichen. | |
CHAR$ (c, gk, an, z) | die String-Funktion übergibt eine 8-stellige Zeichenkette mit <«> bzw. <.> und definiert die Byte-Zeile z des durch c, gk, an bestimmten Zeichens. |
Sprite-Befehle[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
DEFMOB n, b, f, p, m | Eigenschaften des Sprites bestimmen und einschalten. Parameter: n=Sprite-Nummer(1 bis 8), b=Sprite-Block (0 bis 255), f=Farbe(0bis 15), p=Sprite-Priorität (0=vor, 1=unter Hintergrund), m=Modus (0=Hires, 1=Multicolor-Sprite). | MOB SET |
MULTI f2, f3 | wählt Farben 2 und 3 für das Multicolor-Sprite. Farbe l wird bei bei DEFMOB festgelegt. | CMOB |
MOBEX n, x, y | vergrößert das Sprite Nr. n in die gewünschte Richtung; x und y = 0/1, | |
CLEAR [n] | schaltet Sprite Nr. n bzw. alle Sprites aus. | MOB OFF |
MOBSET n, x, y | positioniert das Sprite n an gewünschter Stelle; x: 0 bis 511, y: 0 bis 255. | |
MMOB n, x1, y1, x2, y2, g | bewegt Sprite n mit der Geschwindigkeit g von x1/y1 nach x2/y2. | MMOB |
MOVE n, x, y, g | verschiebt Sprite n mit der Geschwindigkeit g nach x/y. | |
CLRVIC | setzt alle veränderten Sprite-Parameter (z.B. Position, Priorität, Vergrößerung usw.) wieder auf 0. | |
BUMP (n1 [, n2]) | testet auf Kollision (Sprite n mit dem Bildschirmvordergrund oder Sprite n1 mit Sprite n2) und gibt - wenn ja - den Wert 1 zurück, sonst 0. | CHECK nach DETECT |
CREATE 1, b, d | definiert den Sprite-Block b (0 bis 255) im Bereich d (0 bis 2; 0: Text, 2: Grafik). | DESIGN |
MOB a$ [, z] | wie bei CHAR$, nur jetzt 24x21 Punkte; bei Multicolor-Sprites werden die beiden Zusatzfarben 2 und 3 durch "=" und "/" gekennzeichnet, "*" gilt als Farbe 1. | |
TURNMOB b, d, a | rotiert den Sprite-Block b/d a-mal um 90 Grad. | |
BLCOPY b, d, bn, dn | überträgt das Pixelmuster von Sprite-Block b/d ins Sprite bn/dn. | |
BLOR b1, d1, b2, d2, b, d | ODER-Verknüpfung von Sprite b1/d1 mit b2/d2 in Sprite b/d speichern. | |
BLAND b1, d1, b2, d2, b, d | dto. mit UND-Verknüpfung. | |
ERASE b, d | löscht das Sprite-Muster des Blocks b/d. | |
BLINV b, d | zeigt das Sprite-Muster des Blocks b/d revers. | |
REFLECTX b, d | spiegelt den Sprite-Block b/d an der x-Achse. | |
REFLECTY b, d, m | spiegelt das Sprite b/d an der y-Achse; m=0/1 für Hires/Multicolor. | |
SCRMOB r, b, d, a, m | wie das Scrollen von Textzeichen (s. Beschreibung zu SCROLL) | |
SPRITE$ (b, d, z, m) | funktioniert wie CHAR$ bei Zeichen: eine 24-stellige Zeichenkette von Zeile z des Sprite-Blocks b/d wird gelesen und per PRINT ausgegeben. |
Grafikbefehle[Bearbeiten | Quelltext bearbeiten]
Nur hochauflösende Grafik mit 320x200px
Befehl | Beschreibung | ähnlich |
HIRES pf, hf | löscht Grafikschirm und schaltet Grafik ein mit Zeichenfarbe pf, Hintergrundfarbe hf. | HIRES |
GRAPHIC [pf, hf] | schaltet Grafik ein, ohne den Schirm zu löschen, ggf. neu eingefärbt. | CSET 2 |
HICOL pf, hf | ändert Zeichen- und Hintergrundfarbe für folgende Grafikbefehle | LOW COL |
NRM | zurück zum normalen Textbildschirm | NRM |
PLOT x, y, zm | setzt an den Koordinaten x/y ein Pixel im Grafikbildschirm im Zeichenmodus zm (0: loschen, 1: setzen, 2: invertieren). | PLOT |
DRAW x1, y1, x2, y2, zm | zieht eine Linie von x1/y1 nach x2/y2. | LINE |
REC x, y, b, h, zm | zeichnet ein Rechteck bei x/y (links oben) mit Breite b und Hohe h. | REC |
BOX x, y, b, h, zm | wie REC, aber das Rechteck füllt sich mit der Vordergrundfarbe. | BLOCK |
CIRCLE x, y, rx, ry, zm | zeichnet einen Kreis (rx=ry) bzw. eine Ellipse mit dem Mittelpunkt x/y und den Radien rx/ry. | CIRCLE |
ARC x, y, rx, ry, sw, ew, a, zm | zeichnet einen Ellipsenabschnitt; sw/ew = Start-/Endwinkel; a = Abstand der Eckpunkte in Grad. | ARC |
PAINT x, y, zm | füllt eine umschlossene Grafikfläche mit der Vordergrundfarbe. Bei zm = 0 wird der Bereich bis zum nächsten gelöschten Pixel eliminiert; zm = 2 (invertieren) ist nicht moglich. | PAINT |
SSHAPE a$, x, y, b, n | speichert den Ausschnitt des Grafikbildschirms (SHAPE) ab x/y mit Breite b und Höhe h in der Variablen a$. | SSHAPE |
GSHAPE a$, x, y, zm | übertragt einen mit SSHAPE gespeicherten Grafikausschnitt an der Position x/y in den aktuellen Grafikbildschirm. Die Bedeutung von zm ist (abweichend von PLOT): 0: löscht, 1: setzt, 2: invertiert, 3: löscht vorhandene Pixel, gelöschte bleiben gelöscht. | GSHAPE |
SBLOCK b, d, x ,y | kopiert das Grafik-Shape ab x/y in den Sprite-Block b/d. | |
GBLOCK b, d, x, y, gx, gy, zm | fügt den Sprite-Block b/d an den Koordinaten x/y in die aktuelle Grafik. Dabei lässt sich dieser Sprite-Shape in x- oder y-Richtung dehnen mit gx=2 bzw. gy=2. | |
TEXT x, y, a$, gx, gy, a, zm | positioniert beliebigen Text aus a$ in der Grafik an der Stelle x/y; a: Abstand der Zeichen in Pixel; gx/gy: Vergrößerung. | TEXT |
WINDOW [az, ez] | teilt den Bildschirm in zwei Teile: Hires-Grafik (von Grafikzeile az bis ez), normaler Textschirm sonst. WINDOW ohne Parameter schaltet den Modus wieder ab. | |
REVERS | invertiert den gesamten Grafikbildschirm. | |
SCNCLR | löscht den Grafikschirm. Aktuell eingestellte Farben bleiben unverändert; der Grafikmodus wird nicht eingeschaltet. | |
GRCOL s, z, b, h, pf, hf | färbt einen ausgewählten Grafikausschnitt um. | |
TEST (x, y) | ist eine Funktion, mit der man feststellt, ob ein Pixel bei x/y gesetzt (= 1) oder gelöscht (= 0) ist. | TEST |
Soundbefehle[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
VOL n | regelt die Lautstärke des SID (n = 0 bis 15). | VOL |
ENVELOPE st, a, d, s, r | bestimmt die ADSR-Kurve fur die Stimme st. Parameter: st = Stimme (1 bis 3), a/d/s/r = Attack/Decay/Sustain/Release (0 bis 15). | ENVELOPE |
WAVE st, %xxxxxxxx | bestimmt die Wellenform der Stimme st (1 bis 3). %xxxxxxxx = 8-Bit für die Wellenform mit dem niederwertigsten Bit links. Bedeutung: 0: Rauschen / 1: Rechteck / 2: Sägezahn / 3: Dreieck / 4: Test-Bit / 5: Modulation / 6: Sync. / 7: Gate-Bit | WAVE |
SOUND st, f [,l] | spielt einen Ton in der Frequenz f und mit der Länge l fur die Stimme st. | |
PULSE st, x | mit x (0 bis 4095) lässt sich die Schwingungsfrequenz der Stimme st bei Rechteck-Wellenform einstellen | WAVE |
CLRSID | setzt den SID-Chip auf Standardwerte zurück. | |
MUSIC g, aS | legt mit a$ die Reihenfolge der Notenwerte fest, die per PLAY mit der Geschwindigkeit g zum Klingen gebracht werden. | MUSIC |
PLAY m | m = Modus (0 bis 2); 0 stoppt die Musik; 1 spielt Musik; 2 spielt im Interrupt | PLAY |
BEEP x | erzeugt mit Stimme 3 einen Piepton, der x-mal wiederholt wird. |
Sonstige Befehle[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
SWAP vl, v2 | tauscht die Inhalte der Variablen v1 und v2 (müssen gleichen Typ haben). | AT (TSB) |
DOKE a, w | schreibt die Zahl w (16-Bit) im Format Low-/High-Byte in die Speicherzellen a und a+1. | DOKE (SBX) |
BIT ON/OFF a, n | Setzen (ON) bzw. Löschen (OFF) von Bit Nr. n in der Speicherstelle a. | |
KILL | entspricht der Reset-Anweisung SYS 64738 des Basic 2.0. | |
BREAK ON/OFF | schaltet die STOP-Taste ab oder an. | |
FIX a | legt die Speicherstelle a für den Befehl VARY fest. | |
VARY [w1, w2, g] | Die per FIX bestimmte Adresse wechselt mit der Geschwindigkeit g/60-stel Sekunden zwischen den Werten w1 und w2 (interruptgesteuert). VARY ohne Parameter schaltet den Modus wieder ab. | |
PAUSE s | das Programm wartet s (0 bis 255) Sekunden, bevor es mit dem nächsten Anweisung weitermacht. | PAUSE |
COMMANDS | listet alle Befehle und Funktionen von Special Basic | |
COMSHIFT ON/OFF | erlaubt/verbietet die Umschaltung zwischen Großschrift/Grafik- und Groß-/Kleinschrift-Zeichensatz. | |
RAPID ON/OFF | schaltet die Tastenwiederholungsfunktion an/aus. | |
SCREEN ON/OFF | schaltet Bildschirm ein/aus. | |
LOCAL Variablenliste | definiert lokale Variablen (z.B. für eine Prozedur PROC). | LOCAL |
GLOBAL Variablenliste | reaktiviert Variablen mit den Werten, die sie besaßen, bevor sie mit LOCAL verändert wurden. | GLOBAL |
GO 64 | setzt den C64 auf den Einschaltmodus zurück. | |
LOMEM a | legt die Speicheruntergrenze für ein Basic-Programm fest (normal 2049=$0801) und führt NEW aus. | LOMEM (SBX) |
HIMEM a | legt die Endadresse des Basic-Bereichs fest (unter Special Basic maximal 32767=$7FFF). | HIMEM (SBX) |
CLREOL | "CLear to End Of Line" löscht den Rest der Bildschirmzeile ab der Cursorposition. Die Beschreibung des Befehls im SH87 ist nicht korrekt. |
|
BCKGND [hf1, hf2, hf3, hf4] | schaltet den erweiterten Hintergrundfarbmodus ein (mit Farb-Parametern) bzw. aus (ohne Parameter) | BCKGNDS |
[[...]] | zwischen den eckigen Doppelklammern darf beliebiger Kommentar stehen, der auch mehrere Listing-Zeilen umfassen kann. |
Funktionen[Bearbeiten | Quelltext bearbeiten]
Befehl | Beschreibung | ähnlich |
YPOS | liefert die aktuelle Zeilenposition des Cursors im Textbildschirm | |
PENX | übermittelt die horizontale Spalte (x-Position) eines angeschlossenen Lichtgriffels. Berechnung der x-Koordinate im Grafikbildschirm: X=(PENX-40)*2 | PENX |
PENY | vertikale Position des Lichtgriffels | PENY |
INKEY | prüft, welche Funktionstaste gedrückt wurde und gibt deren Nummer zurück (0 = keine). | INKEY |
ERRLN | gibt die Zeilennummer an, in der das Programm den zuletzt registrierten Fehler entdeckt hat | ERRLN |
ERRN | enthält die Nummer des zuletzt registrierten Fehlers. | ERRN |
ERR$ (n) | Fehlermeldung Nr. n im Klartext. | OUT (TSB) |
ASCII (c) | konvertiert Bildschirmcode c in ASCII-Code. | |
BSC (a) | gibt den Bildschirmcode eines ASCII-Wertes aus. | |
DEC (aS) | konvertiert eine Hexadezimal- oder achtstellige Binär-Zahl in eine Dezimalzahl. | DEC |
HEX$ (d) | gibt die Dezimalzahl d als vierstelligen Hexadezimalwert (ohne "$" am Anfang) aus. | HEX$ (SBX) |
BIN$ (d) | konvertiert die Dezimalzahl d (0-255) in eine achtstellige binäre Zeichenkette. | BIN$ (SBX) |
ROW (a, b) | stellt eine Zeichenkette zusammen, die sämtliche Zeichen von PETSCII-Codes a bis b enhält. | |
DUP (aS, x) | gibt den x-mal duplizierten String a$ zurück. | DUP |
INSERT (a$,b,c$) | fügt den String a$ an der Position b in den String c$ ein. | INSERT |
INST (a$,b,c$) | wie INSERT, aber die alten Zeichen ab Position b werden überschrieben. | INST |
PLACE (aS, b$ [,c]) | sucht in b$ nach der Zeichenfolge a$ ab dem ersten Zeichen oder ab Position c; gibt die Position von a$ (oder 0) zurück. | PLACE |
USING (bS, z) | für formatierte Ausgabe einer Zahl mit PRINT USING; b$ = Format-Zeichenkette mit Dezimalpunkt (z.B. "###.##"), z = Zahl. | PRINT USING |
BY (s,z) | setzt den Cursor im Textmodus an die mit Spalte s und Zeile z vorgegebene Position; funktioniert nur hinter dem Ausgabebefehl PRINT. | AT |
DEEK (a) | gibt eine 16-Bit-Zahl zurück, die als Low- und High-Byte in a und a+1 gespeichert ist. | DEEK (SBX) |
CEEK (a) | entspricht der PEEK-Funktion, liest aber immer das RAM. | MEMPEEK_(TSB) |
CHECK (g) | testet ob das Gerät g angeschlossen ist. Falls ja, wird 1, sonst 0 zurückgegeben. | |
ROOT (x,y) | berechnet die x-te Wurzel aus y. | |
ROUND (a,b) | rundet die Zahl b auf a Nachkommastellen. Bei a = 0 entfallen die Stellen nach dem Komma. | |
EVAL (a$) | gibt den Wert des Ausdrucks zurück, der in der Zeichenkette a$ enthalten ist. | EVAL (Exbasic Level II) |
EXOR (x,y) | verknüpft die Zahlen x und y Exklusiv-Oder miteinander. | EXOR |
JOY (n) | fragt die aktuelle Stellung des Joysticks am Port n (1 oder 2) ab. Rückgabewert 0 bis 8: Mitte/N/NO/O/SO/S/SW/W/NW. Wird zusätzlich der Feuerknopf gedrückt, erhöhen sich diese Zahlen um 128. | JOY (TSB) |
$ (vierstelliger Hex-Wert) | ersetzt dezimale Zahlenangaben; ein Hex-String von $0000 bis $FFFF wird akzeptiert. Der Parameter muss eine Konstante sein. | $ |
% [achtstelliger Dualwert] | kann anstatt von Dezimalzahlen eingesetzt werden. Der Parameter muss eine Konstante sein. | % |
Hinweise[Bearbeiten | Quelltext bearbeiten]
CLREOL[Bearbeiten | Quelltext bearbeiten]
Belegt eine mit PRINT oder LIST ausgegebene Zeichenfolge mehr als eine Bildschirmzeile, wird nur in der Anfangszeile oder jeder 2. Zeile danach korrekt (d.h. von der Cursorposition bis zum Zeilenende) gelöscht. In den anderen Zeilen verschwindet nur ein Zeichen. Mit dem folgenden Beispiel kann man dieses Verhalten sehen:
100 CLS: S$ = DUP("*",255) 110 PRINT S$: WAIT 198,1 120 FOR I=0 TO 6: PRINT BY(5,I);: CLREOL: NEXT
CLREOL ab $BFC8:
LDY $D3 LDA #$20 STA ($D1),Y INY CPY #$28 BCC $BFCC RTS |
Der Spaltenindex $D3 (0 bis 79!) und der Zeiger $D1/$D2 auf den Zeilenanfang beziehen sich auf eine logische Zeile mit einer Länge von bis zu 80 Zeichen. Ist der Wert in $D3 zu Beginn größer als 40, befindet sich der Cursor in der zweiten physischen Zeile und Leerzeichen müssten bis .Y<80 (#$50) statt .Y<40 (#$28) ausgegeben werden. |
Dateiformate beim Speichern[Bearbeiten | Quelltext bearbeiten]
Grafik Dateiformat | ||
Startadresse | keine | Speicher |
Bitmap | 8000 Bytes | $E000-$FF3F |
Video-RAM | 1000 Bytes | $CC00-$CFE7 |
- CSAVE speichert einen selbstdefinierten Zeichensatz. Die Datei belegt auf der Diskette 17 Blöcke.
Zeichensatz Dateiformat | ||
Startadresse | keine | Speicher |
Zeichen | 4096 Bytes | $E000-$EFFF |
Der Dateityp ist in beiden Fällen normalerweise PRG (Programmdatei). Es ist aber auch möglich, Grafik bzw. Zeichensatz mit dem Namenszusatz ",S,W" als sequentielle Datei zu speichern, die dann natürlich auch mit dem Namenszusatz ",S,R" geladen werden muss.
Fehlermeldungen[Bearbeiten | Quelltext bearbeiten]
Special Basic enthält die zusätzlichen Fehlermeldungen
31: UNTIL WITHOUT REPEAT 32: END LOOP WITHOUT LOOP 33: MISSING END LOOP 34: MISSING BEND 35: PROC NOT FOUND 36: END PROC WITHOUT EXEC 37: CANT RESUME 38: OUT OF RANGE 39: ILLEGAL STRING LENGTH 40: WRONG STRING 41: MISSING ENDCASE 42: UNKNOWN VARIABLE
Beispiele[Bearbeiten | Quelltext bearbeiten]
Test der Grafik-Geschwindigkeit[Bearbeiten | Quelltext bearbeiten]
Im Artikel zur BASIC-Erweiterung HSG wurde ein Geschwindigkeitsvergleich mit Simons' Basic und Supergrafik durchgeführt. Das Programm umgesetzt auf Special-Basic sieht so aus:
10 PRINT CHR$(147)"SPB-DEMO":PRINT 15 GOSUB 210 20 HIRES1,0:I=10 30 FORX=5TO165STEPI:CIRCLE159,99,X,165-X,1:NEXTX 40 GOSUB 230:T1$=TM$:GOSUB210 50 HIRES3,0 60 FORX=0TO149 STEP10+I 70 FORY=189 TO 0 STEP-10-I 80 DRAWX,Y,310-X,190-Y,1 90 NEXTY,X 100 GOSUB230:T2$=TM$:NRM 120 PRINT "KREISE ";T1$;" SEC" 130 PRINT "LINIEN ";T2$;" SEC" 140 END 200 REM:INIT TOD CLOCK 210 FORI=2TO3:POKE56331-I,0:NEXT:POKE56334,PEEK(678)*128+1:RETURN 220 REM:READ TOD CLOCK 230 TM$="":FORI=2TO3:T=PEEK(56331-I) 240 TM$=TM$+CHR$(48+(240ANDT)/16)+CHR$(48+(15ANDT)) 250 NEXTI:TM$=LEFT$(TM$,2)+","+RIGHT$(TM$,1):RETURN
Geändert werden musste nur Zeile 80: DRAW statt LINE.
SPB-DEMO KREISE 45,6 SEC LINIEN 44,9 SEC READY. |
Das Ergebnis ist ernüchternd: Grafik mit Special Basic ist noch langsamer als das ohnehin schon behäbige Simons' Basic (Kreise 41,4 / Linien 18,5 sec).
Token-Tabelle[Bearbeiten | Quelltext bearbeiten]
Das folgende Programm gibt Token, Befehle und ihre Einsprungadressen auf dem Bildschirm und dem Drucker aus. Befehle oder Funktionen des Special Basic sind hervorgehoben.
100 TYPE" NR. TOKEN BEFEHL ADRESSE" 110 B=$A002:A=$BE00:P$="$63" 120 I=1:U$="###." 130 LOOP 140 : EXIT IF CEEK(B)=0 150 : P=I 160 : IF I>127 THEN P$="$64":P=I-127 170 : PRINT USING(U$,I);" "; 180 : PRINT P$;" $";RIGHT$(HEX$(P),2); 190 : TYPE USING(U$,I);" "; 200 : TYPE P$;" $";RIGHT$(HEX$(P),2); 210 : REM *** BEFEHLE 220 : T$="" 230 : LOOP 240 : T=CEEK(B)AND127 250 : T$=T$+CHR$(T) 260 : B=B+1 270 : EXIT IF CEEK(B-1)>127 280 : END LOOP 290 : L=10-LEN(T$):D$=DUP(" ",L)+"$" 300 : PRINT " ";T$;D$; 310 : TYPE " ";T$;D$; 320 : REM *** STARTADRESSE HEX 325 : IF I=128 THEN A=A+2 330 : AL=CEEK(A):AH=CEEK(A+1) 340 : AD=AH*256+AL+1 350 : PRINT HEX$(AD):TYPE HEX$(AD) 360 : I=I+1:A=A+2 370 END LOOP 380 END
Besonders praktisch ist hier die Funktion CEEK, da die Befehle und Adressen ja aus dem RAM unter dem BASIC-ROM gelesen werden.
Siehe dazu auch die Tabelle der Special Basic Token.
Programm listen[Bearbeiten | Quelltext bearbeiten]
Mit D64Lister ist es möglich, ein Special-Basic-Programm zu listen. Dazu muss man im BAM-Dialog die Datei auswählen, mit der rechten Maustaste den "File Viewer" öffnen und dort unter "Options" im "BASIC Tokenizer" Special Basic auswählen. Ist das in der Auswahlanzeige "BASIC Mode" nicht aufgeführt, öffnet man mit "edit" den "TokenTable"-Dialog und lädt dort mit "Load" die CSV-Tabelle. Jetzt sollte Special Basic wählbar sein und das Listing im "File Viewer" nach Anklicken des "TOK64"-Icons angezeigt werden.
Quellen[Bearbeiten | Quelltext bearbeiten]
- ↑ Thema: Special BASIC auf Forum64.de
Weblinks[Bearbeiten | Quelltext bearbeiten]
- 64'er Sonderheft 87 auf archive.org
- 64'er Software Extra Nr. 7 Programmier Utilities Volume 1
- 64'er 1993_04 auf archive.org Basic-Turnier '93:
- Vergleich der Basic-Dialekte: Basic V2 / Simons Basic / Exbasic Level II / Disc-Basic / Basic 3.5 / Special Basic / Basic V7