Special Basic

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Special Basic
Die Einschaltmeldung von Special Basic
Entwickler Michael Störch, Lars George
Verleger Markt & Technik
Release 1987, 1993
Lizenz Vollversion
Plattform(en) C64
Genre BASIC-Erweiterung
Steuerung Icon tastatur.png Icon paddle.png Icon joystick.png
Medien Icon disk525.png
Sprache(n) Anleitung Sprache:deutsch
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]

Version 1993 Einschaltmeldung.
64'er Extra Nr.7 (Cover).
64'er Extra Nr.7 (Rückseite).
64'er Extra Nr.7 (Disk-Label).

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]

  • GSAVE speichert eine Hires-Grafik mit Farbe. Die Datei belegt auf der Diskette 36 Blöcke.
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]

  1. Thema: Special BASIC auf Forum64.de

Weblinks[Bearbeiten | Quelltext bearbeiten]

Vergleich der Basic-Dialekte: Basic V2 / Simons Basic / Exbasic Level II / Disc-Basic / Basic 3.5 / Special Basic / Basic V7