X X 1 1 BBBB
X X 1 1 B B i
X X 1 1 B B sss
X 1 1 ----- BBBB aaaa s s i cccc
X X 1 1 B B a a s i c
X X 1 1 B B a a s s i c
X X 1 1 BBBB aaaaa sss i cccc
VERSION 1.04
(C) 1997-2001 by Markus Hoffmann
(m.hoffmann@uni-bonn.de)
(http://www-cip.physik.uni-bonn.de/~hoffmann/)
ALL RIGHTS RESERVED
THIS PROGRAM IS PROVIDED "AS IS" WITHOUT A WARRANTY OF ANY KIND
See the file `COPYING' for licensing information
Last change to this file: April 5, 2001
==> <==
Structured-BASIC-Interpreter with X11 graphic capabilities
- using the functionality of GFA-BASIC on AtariST
with GEM/TOS (GFA-BASIC ported to UNIX-environment)
- can be used as a shell
- can be used to write cgi-Scripts
- a psydocompiler can be used to make stand-alone-Binaries
FEATURES
========
Structured-BASIC-Interpreter
- without line-numbers
- GOTO / GOSUB-labels are symbolic names
- Structure elements:
WHILE - EXIT IF - WEND
REPEAT - EXIT IF - UNTIL
DO - EXIT IF - LOOP
IF - ELSE IF - ELSE - ENDIF
FOR - EXIT IF - NEXT
PROCEDURE() - EXITIF - RETURN
FUNCTION() - RETURN - ENDFUNCTION
- Variable types indicated by appendix to name:
varname REAL (double)
varname% INTEGER (long)
varname! BOOLEAN (*)
varname$ STRING
- PROCEDURE and FUNCTION can have formal parameters
and local variables
- DEFFN defines an inline-function (*)
- integrated graphic instructions
- A Psydo-compiler is available
(*) not implemented yet
This file is separated into following sections:
1. About X11-Basic (general description)
2. Language Description
3. How to use the Psydo-Compiler
4. Frequently Asked Questions
5. History
6. Known Bugs
1. ABOUT X11-Basic
###################
Copyright information
~~~~~~~~~~~~~~~~~~~~~
X11-Basic is free software and distributed under the GNU License. Read the file
COPYING for details.
Intruduction
~~~~~~~~~~~~
X11-Basic is a non-standard Basic interpreter with full X capability and some
other special features. Syntax is most similar to the old GFA-Basic ATARI ST
implementation. Old gfa-prgrams should run with only few changes.
The actual implementation run on Unix workstations and Linux-PCs with the X
Window system.
##########################
## Bedienungsanleitung: ##
##########################
Das Programm kann mit folgenden Parametern aufgerufen werden:
xbasic <filename> --- Basic-Programm ausführen [input.bas]
-l --- Programm nur laden
-e <kommando> --- Basic Kommando ausführen
--eval <ausdruck> --- Num. Ausdruck auswerten
Beispiel:
xbasic testme.bas
xbasic -e 'alert 1,"Hallo !",1," OK ",b'
xbasic --eval 1+3-4*3
X11-Basic als Dämon:
=====================
wird X11-Basic mit
xbasic --daemon
gestartet, so erscheint bei der Kommandoeingabe kein Prompt und es erfolgt kein
Echo der Tastatureingabe.
X11-Basic als Shell:
====================
X11-Basic Programme können auch wie Shell-Scripts gestartet werden.
Hierzu installiert man xbasic in /bin/. Mit der Anweisung
#!/bin/xbasic
in der ersten Zeile des Scipts wird es als X11-Basic-Programm ausgeführt.
Kurzanleitung zu X11BASIC:
===========================
Variablenkonzept:
-----------------
Der interpreter kennt 64-Bit Floatingpoint Variablen, 32-Bit Integervariablen,
Zeichenketten und beliebigdimensionale Felder obengenannter Typen.
Eine Deklaration der Variablen ist nicht nötig (Außer bei Feldern --> DIM),
da der Interpreter den Typ an der Endung der Variable erkennt:
Integervariablen tragen die Endung %, Zeichenketten ein $, Felder ein ().
Variablen ohne Endung werden als float interpretiert.
Pointer sind Integer, Funktionsergebnisse werden durch @ gekennzeichnet
Logische Ausdrücke sind ebenfalls vom Typ Interger.
Typenumwandlungen werden bei Bedarf automatisch vorgenommen, wo dies möglich
ist.
Die Variablen werden dynamisch verwaltet, so sind beliebig große Zeichenketten
und Felder möglich. Die Grenze ist hier nur der maximal allozierbare Speicher
und max. 31 Bit für die Indizierung. Das sollte vorerst ausreichen.
Beispiele:
Integer-Variablen: i%=25
a%=varptr(b$)
b%=malloc(100000)
Float-Variablen: a=1.2443e17
b=@f(x)
Zeichenkettenvariablen: t$="Das ist ein Text"
Felder/Arrays: i%(),a(),t$()
Logische Ausdrücke: (a=2 AND b=5) sind vom Typ Integer (TRUE=-1, FALSE=0)
OPERATOREN
##########
Man unterscheidet zwischen numerischen, Zeichenketten- und Feld- bzw.
Matritzenoperatoren, je nachdem, ob das Ergebnis der Operation eine Zahl oder
eine Zeichenkette ist.
-- Zeichenkettenoperatoren ---
+ Dier Verkettung von Zeichenketten.
Dabei werden die durch + verbundenen Strings lückenlos
aneinandergefügt.
Beispiel: a$="X11", b$="-" und c$="BASIC", dann ergibt sich
d$=a$+b$+c$ die Zeichenkette "X11-BASIC"
$() Zeichenkettenfunktionen:
z.B. LEFT$, RIGHT$, MID$, SPACE$, STRING$, STR$ ...
-- Numerische Operatoren --
Die numerischen Operatoren können in vier Kategorien gegliedert werden:
* Arithmetische Operatoren
* Vergleichsoperatoren
* Logische Operatoren
* Numerische Funktionen
-- Matritzenoperatoren --
Matritzenoperatoren oder allgemein Feld-Operatoren operieren auf Feldern.
Je nach Feldtyp und Dimension können sie unterschiedliche Bedeutung haben.
$ F I D2 D3 Dn Sonstige Bemerkungen
+ * * * * * *
- - * * * * *
* - * * * - - M1=N2 , auch skalar
INV() - * * * - - M=N
TRANS() * * * * - - M=N
Weiterhin gibt es Operatorn/Funktionen, die zwischen verschiedenen
Variablenklassen Operieren: z.B.
a%=INT(b), c=DET(d()), s=SMUL(a(),b()), a()=NULL(2,4,5), ...
Insbesondere sei auf den Reduktionsoperator hingewiesen:
b()=a(:,3) ist ein eindimensionaler Vektor, nämlich die Spalte Nr. 3 der
Matrix a.
-- Integer und Float-Variablen ---
() Klammerung
+ - * / Grundrechenarten
^ Potenz
MOD Modulo
DIV Ganzzahliger Teiler
Vergleichsoperatoren: = <> < > <= >=
====================================
Vergleichsoperatoren können zwischen zwei Ausdrüchen gleichen Typs stehen, also
zwischen Zeichenkettenausdrücken, numerischen Ausdrücken oder Feld-Ausdrücken.
Abhängig vom Wahrheitswert (wahr oder falsch) wird dem Vergleich entweder der
Wert -1 (wahr) oder 0 (falsch) zugeordnet.
(Da sich in jedem Fall eine Zahl ergibt, zählt auch der Vergleich von
Zeichenketten zu den numerischen Operatoren.)
Folgende Vergleichsoperatoren sind verfügbar:
= gleich
> größer als
< kleiner als
<> ungleich
>= größer oder gleich
<= kleiner oder gleich
Zum Vergleich von numerischen Ausdrücken sollen hier nur einige Beispiele
aufgeführt werden:
PRINT 3=1.5*2 übergibt den Wert -1 (wahr)
PRINT 5>5 übergibt den Wert 0 (falsch)
Der Vergleich von Zeichenketten vollzieht sich nach folgenden Regeln:
* Zwei Zeichenketten sind gleich, wenn sie vollständig übereinstimmen.
(Dabei werden alle Zeichen der Strings, auch Leerzeichen und Satzzeichen,
verglichen. So gilt z.B. " 123 v fdh.-," = " 123 v fdh.-,")
* Bein Größenvergleich zweier Strings wird folgendermaßen verfahren:
Die Zeichenketten werden Zeichenweise verglichen, solange, bis der
ASCII-Code des Zeichens des einen Strings kleiner ist als der des
Zeichens des anderen Strings, oder das Zeichenkettenende eines Strings
erreicht wird. Dieser Ist dann kleiner als der andere.
Beispiele:
"X11">"X11" ergibt 0
"X11"<"x11" ergibt -1
"123"<"abc" ergibt -1
"123">"1234" ergibt 0
Logische Operatoren: AND OR NAND OR NOT XOR EQV IMP
====================================================
Mit Hilfe der logischen Operatoren können Ausdrücke oder Beziehungen zwischen
Ausdrücken miteinander verbunden werden.
In der Regel werden mit logischen Operatoren Wahrheitswerte verknüpft und als
Ergebnis wiederum Wahrheitswerte ausgegeben.
Dabei wird jedem numerischen Ausdruck ungleich 0 der Wahrheitswert 0 und jedem
Ausdruck, dessen Wert gleich 0 ist, der Wahrheitswert falsch zugeordnet.
Die von den Logischen Operatoren erzeugten Wahrheitswerte ergeben sich aus
der Bit-weisen Operation, wenn die Operanden als 32-Bit Integerwerte
angesehen werden. Deshalb gehört zum Wahrheitswert 0 (falsch) der
Wahrheitswert -1 (wahr). Hierfür gibt es auch die Systemvariablen TRUE=-1
und FALSE=0. Dies kann man auch in numerischen Ausdrücken Verwenden, z.B.:
a=ABS(x=0)*100+ABS(x=1)*200 je nach dem Wert von x erhält die Variable a die
Werte 100 oder 200.
AND Konjunktion
Das Ergebnis von AND ist nur dann w, wenn beide Argumente w sind:
A | B | A AND B
-----+-----+-----------
w | w | w
w | f | f
f | w | f
f | f | f
Beispiele:
Print 3=3 AND 4>2 ergibt -1 (w)
Print 3>3 AND 5>3 ergibt 0 (f)
OR Disjunktion
Das Ergebnis von OR ist nur dann f, wenn beide Argumente f sind:
A | B | A OR B
-----+-----+-----------
w | w | w
w | f | w
f | w | w
f | f | f
Beispiele:
Print "A"<"a" OR 3=5 ergibt -1 (w)
Print 2>7 OR 10=20 ergibt 0 (f)
XOR Exclusives (oder ausschließendes) Oder
Das Ergebnis von XOR ist f, wenn die Argumente gleiche Wahrheitswerte
haben:
A | B | A XOR B
-----+-----+-----------
w | w | f
w | f | w
f | w | w
f | f | f
Beispiele:
Print 3=3 XOR 6=6 ergibt 0 (f)
Print 3>5 XOR 3<5 ergibt -1 (w)
NOT Die Negation vertauscht Wahrheitswerte in ihr Gegenteil.
A | NOT A
-----+----------
w | f
f | w
Beispiel:
Print NOT 3=3 ergibt 0 (f)
IMP Implikation
Das Resultat der Operation ist dann falsch, wenn falsch auf wahr folgt.
A | B | A IMP B
-----+-----+-----------
w | w | w
w | f | f
f | w | w
f | f | w
EQV Äquivalenz
Die Operation ist identisch mit (A IMP B) AND (B IMP A)
A | B | A EQV B
-----+-----+-----------
w | w | w
w | f | f
f | w | f
f | f | w
Die logischen Operatoren werden hauptsächlich dazu benutzt, um abhängig vom
Wahrheitswert verbundener Ausdrücke verschiedene Programmabläufe zu ermöglichen
(z.B. über die Befehle IF, WHILE, EXIT IF ...)
Logische Operatoren können aber auch dazu benutzt werden, um Bitfolgen zu
verknüpfen.
Strukturiertes Programmieren
============================
Der Interpreter nennt sich zwar Basic, jedoch gibt es gegenüber den
Uralt-Basic-Dialekten Einschränkungen und Erweiterungen, die strukturiertes
Programmieren erlaubt. Die Programme sind dann übersichtlicher.
Zeilennummern gibt es nicht und in jeder Zeile kann höchstens eine Anweisung
stehen.
Sprünge mit GOTO sind zwar möglich, aber nicht nötig, da alle gängigen
Schleifentypen zur Verfügung stehen, einschließlich einem Befehl für weitere
Abbruchbedingungen (--> EXIT IF).
Selbstdefinierte Prozeduren und Funktionen mit Parameterliste und
Rückgabewerten jeden Typs sind möglich.
Die Programmstruktur eines Programms erlaubt also üblicherweise ein Hauptteil,
z.B. eine Schleife, von der aus Unterprogramme aufgerufen werden.
Mit einem Kommando (--> MERGE) lassen sich so auch ganze Bibliotheken
hinzuzubinden.
------ Anweisungen -------------
Allgemeines:
Nach Befehlen sind Kommentare erlaubt, die mit einem "!" vom Befehl abzusetzen
sind.
DO ! Endlosschleife
LOOP ! und nix drin
Diese Kommentare sind natürlich nicht erlaubt nach DATA (und REM).
Der &-Operator gefolgt von einem Zeichenkettenausdruck evaluiert deren inhalt
als Programm-Code.
Beispiel:
clr i
a$="print a$"
label1:
inc i
if i>10
b$="label2"
else
b$="label1"
endif
&a$
goto &b$
label2:
end
erzeugt 10x die Ausgabe "print a$".
Dies führt leicht zu unübersichtlichem Code, aber schließlich schimpft sich
der Interpreter ja Basic.
' -- Abkürzung für REM
? -- Abkürzung für PRINT
@ -- Abkürzung für GOSUB, bzw Funktionsaufruf
~ -- Abkürzung für VOID
! -- Kommentar hinter einer Zeile
& -- Indirektes Kommando
------ Systemvariablen ----------
TRUE -1
FALSE 0
CRSCOL n.n.
CRSLIN n.n.
PI 3.141592...
TIMER Systemtimer, float, erhöht sich mehr oder weniger
kontinuierlich mit der Zeit, pro Sekunde um eins
STIMER Dasselbe nur ganzzahlig
CTIMER Dasselbe nur in Einheiten der CPU-Zeit
PC Zeilennummer der nächsten auszuführenden Zeile
SP interner Stackpointer (Verschachtelungstiefe)
ERR Fehlernummer des letzten Fehlers
MOUSEX X-Koordinate der Mausposition relativ zum Fensterursprung
MOUSEY Y-Koordinate der Mausposition
MOUSEK Bitrepräsentation der gedrückten Maustasten,
Button 1=Bit 0,Button 2=Bit 1 usw.
MOUSES Status der Umschalttasten
INKEY$ Inhalt des Tastaturpuffers
TERMINALNAME$ Devicename des Terminals
TIME$ Aktuelle Zeit
DATE$ Aktuelles Datum
==================== Befehle ==============================
ADD a,b -- gleiche Wirkung wie a=a+b
AFTER n,procedure -- Nach n Sekunden wird die Procedure einmal ausgeführt
ALERT a%,b$,c%,d$,var -- Warn- und Infobox
a% sign: 1=! 2=? 3=STOP
b$ textstring lines separated by |
c% default button
d$ string for buttons separated by |
var return # of button selected
ARRAYFILL a(),b -- Füllt ganzes Array mit Wert
ARRAYCOPY ziel(),b() -- Kopiert ganzes Array inclusive Dimensionierung
BEEP -- Warnton auf der Console Auslösen
BELL -- dasselbe wie BEEP
BGET #f,a%,n% -- Liest n% Bytes aus File #f nach Adresse a%
BLOAD f$,a%[,l%] -- Lädt File an Adresse
BMOVE q%,z%,n% -- Kopiert n% Bytes großen Speicherbereich
BOX x1%,y1%,x2%,y2% -- Rechteck zeichenen
BPUT
BREAK -- entspricht EXIT IF true
BSAVE f$,a%,l% -- Speichert l% Bytes ab Adresse a% in File f$
CALL adr%[,par,...] -- siehe Exec
CASE const -- siehe SELECT * CASE * DEFAULT * ENDSELECT
CHAIN
CIRCLE x%,y%,r%
CLEAR -- alle Variablen und Inhalte löschen
CLEARW [[#]n%] -- Fenster mit Hintergrundfarbe ausfüllen
CLOSE [[#]n%] -- I/O-Kanal schließen
CLOSEW [[#]n%] -- Fenster schließen
CLR a,b%,c(),f$ -- Löscht Variableninhalte
CLS -- Löscht Textscreen/Console
color n% -- Farbe auswählen
CONT -- Programmausführung fortfahren
DATA 1,"Hallo",... -- Definiert Konstanten im Programmcode
DEC var -- Decrementiere var
DEFAULT -- siehe SELECT * CASE * DEFAULT * ENDSELECT
DEFFILL c,a,b
DEFLINE a,b
DEFMARK c,a,g -+- define: colour, size, type (POLYMARK)
| c colour
| a type of marker
| (1=. 2=+ 3=* 4=[] 5=+ 6=#)
+- g size of marker (0,20,40,60,80,100)
DEFMOUSE i% -- ändert das Erscheinungsbild des Mauscursors.
DEFTEXT c,s,r,g
DIM
DIV
DO * LOOP -- Endlosschleife
DPOKE adr%,word% -- Schreibt den 2-Byte-Wert an Adresse adr%
DRAW [[x1,y1] TO] x2,y2
DUMP -- Variablenliste
DUMP "@" -- Liste der Funktionen und Prozeduren
DUMP ":" -- Liste der Labels
DUMP "#" -- Liste der Offenen Files
DUMP "K" -- Liste der implementierten Kommandos
DUMP "F" -- Liste der internen Funktionen
ECHO {ON|OFF} -- Programmzeilenechomodus ein-/ausschalten
EDIT set edit-mode and perform the following actions
- SAVE "name.~~~" writes the BASIC-program
into a temporary file,
- calls the editor 'vi'
- NEW clears internal values
- LOAD "name.~~~" reads the BASIC-program
from the temporary file.
ELLIPSE x,y,a,b[,a1,a2] -- Zeichnet Ellipse bzw. Sektor
ELSE -- Siehe IF * ELSE * ENDIF
END -- Programmende, kehrt zurück in den Direktmodus
ENDFUNCTION -- siehe FUNCTION * ENDFUNCTION
ENDIF -- Siehe IF * ELSE * ENDIF
ENDSELECT -- Siehe SELECT * CASE * DEFAULT * ENDSELECT
ERASE a()[,b$(),...] -- Löscht felder
ERROR n% -- löst Fehler Nr. n% aus
EVENT
EVERY
EXEC adr%[,var%[,...]] -- Ruft Unterroutine an Adresse adr% auf. Die Parameter
aus der Parameterliste werden auf dem Stack
übergeben. Typen werden mit D: (double)
oder L: (integer) festgelegt.
Die Adresse adr% kann Adresse eines Symbols
sein, welches sich in einem zugelinkten
shared-object-File befindet. (siehe sym_adr())
EXIT IF a -- Verlässt Schleife wenn Bedingung a erfüllt ist
FFT a(),i -- Fouriertransformation. i=-1 Rücktransformation
Dim?(a()) muss Zweierpotenz sein.
FILESELECT titel$,pfad$,default$,f$ -- display a fileselector-box
titel$ Titel
pfad$ search-path + selector
default$ filename
f$ return selected filename with path or ""
FLUSH [#n] -- Output flushen
FOR * NEXT -- For Next Schleife
FORM_INPUT t$
FUNCTION * ENDFUNC
GET x,y,w,h,g$ -- Grafik-Ausschnitt in g$ speichern
GOSUB
GOTO
GRAPHMODE mode set graphic-mode
mode: 1=replace 2=transparent
3=xor 4=reverse transparent
HELP <expr> -- prints short help on expr
HOME -- Textcursor home
IF * ELSE IF * ELSE * ENDIF
INC a% -- increments a%
INFOW
INPUT [#unit,] ["text";] varlist
read values for variables separated by comma
#unit logical device number (OPEN)
"text" is printed before reading the values
varlist: list of variables separated by comma
KEYEVENT a,b -- Waits until Key is Pressed
LET a=b -- Erzwingt Zuweisung
LINE
LINEINPUT [#unit,] ["text";] varlist
read values for variables separated by newline
LINK #n,t$ -- Lädt shared object file t$
LIST [s,e] -- Listet Programmcode von Zeile s bis e
LLIST [s,e] -- writes the BASIC-program-listing from line s to
line e with linenumbers into the file
"<programname>.prme" and prints it on demand
LOAD a$ -- Lädt Programm (Dateiname in a$), parses the
BASIC-program text and generates the internal data
structures
LOCAL var[,var2,...] -- specifies a list of vars to be local in Procedure
LOOP -- see DO * LOOP
LPOKE adr%,long% -- Schreibt den 4-Byte-Wert an Adresse adr%
LTEXT x%,y%,t$ -- Line-Text
MENUDEF array$(),proc read text for menu-header from array$()
the string-array contains the text
for menu-line and menu-rows
- end of row: empty string ""
- end of menu-text: empty string ""
proc is a procedure with one parameter
which is the number of the selected item
to call when item was selected
MENUSET n,x change menu-point #n with value x
x=0 ' ' normal, reset marker '^'
x=1 '^' set marker
x=2 '=' set menu-point non selectable
x=3 ' ' set menue-point selectable
'-' permanent non selectable
MENU STOP switch off the menu
ON MENU GOSUB p1 define PROCEDURE p1 to handle an action
if a menue-point was selected
ONMENU execute the menu and
MENU wait for menue-events
MERGE f$ -- Merges bas-file to actual program code
MOUSE x,y,k -- gets position and state of mouse
MOUSEEVENT
MOTIONEVENT
MOVEW
MUL a,b -- a=a*b
NEW -- Löscht alle Variablen und hält Programmausführung an.
NEXT -- see FOR * NEXT
NOP -- do nothing
NOOP -- do nothing
ON * GOSUB proc1[,proc2,...]
ON BREAK GOSUB proc
ON ERROR GOSUB proc
OPEN mode$,#n,filename$ -- Öffnet ein file
mode$="I" for input
mode$="O" for output
mode$="A" append
mode$="S" socket
OPENW n
OUT #n,a
PAUSE sec -- Hält Programmausführung für sec Sekunden an
PBOX x1,y1,x2,y2
PCIRCLE x,y,r[,a1,a2]
PELLIPSE x,y,a,b[,a1,a2]
PLIST -- Formatiertes Listing
PLOT x,y -- Punkt an Bildschirmkoordinate x,y zeichnen
POKE adr%,byte% -- Schreibt byte an Adresse adr%
POLYLINE n,x(),y() draw polygon in (x(),y())
the first point = last point to draw
a closed polygon
POLYFILL n,x(),y() draw filled polygon
connects first point with last point
and fills the resulting polygon with
pattern defined in DEFFILL
POLYMARK n,x(),y() draw polygon points
type of points defined in DEFMARK
n # of points
x(),y() arrays with (x,y)-values of points
PRINT a;b$ -- Ausgewachsener BASIC-Standard-Befehl
PROCEDURE procname [(p1 [,p2] ... )] * RETURN
PSAVE a$ -- writes the reformatted BASIC-program into file with
the name a$
PUT x,y,g$ -- Grafik in g$ an x,y Ausgeben
PUTBACK [#n,]a% -- Zeichen mit ASCII-Code a% an inputkanal zurückgeben
QUIT -- Verlässt den X11-BASIC-Interpreter
RANDOMIZE
READ var -- reads constant from DATA statement
RELSEEK #n,d
REM Kommentar -- Kommentarzeile
REPEAT -- siehe REPEAT * UNTIL
RESTORE [label]-- (re)sets pointer for READ-statement to "label"
RESUME
RETURN -- define the end of a PROCEDURE
RETURN expr -- define the end of a FUNCTION
RUN -- Startet die Programmausführung
SAVE a$ -- writes the BASIC-program into file with the name a$
SCOPE a(),typ,yscale,yoffset -- Schnelles Plotten des Feldes a()
SCOPE y(),x(),typ,yscale,yoffset,xscale,xoffset -- 2D Plot
SEEK
SGET screen$ -- Fensterinhalt in screen$ speichern
SHOWPAGE -- Aktualisiert die Grafikausgabe
SPUT screen$ -- (xwd) Grafik in screen$ auf Window
SUB
SWAP
SYSTEM t$ -- Führt Shell-Kommando aus
e.g. SYSTEM "ls" prints current directory
TEXT x,y,t$
TROFF
TRON
UNLINK #n -- Entfernt shared object #n
UNTIL exp -- if exp is false goto REPEAT
VERSION -- Gibt xbasic Versionsinformationen aus
VOID a -- Berechnet Ausdruck a und vergisst Ergebnis
VSYNC -- Aktualisiert die Grafikausgabe
WORT_SEP t$,d$,mode,a$,b$ -- Teilt String t$ auf in a$ und b$
XLOAD -- wie load, mit FILESELECTOR
XRUN -- load und run, mit FILESELECTOR
=============== Funktionen =========================
DEFFN fname(parlist)=expression
DEFFN fname$(parlist)=$-expression
define an inline-function
e.g.: DEFFN av(x,y)=SQR(x^2+y^2)
e.g.: a=@av(b,c) ! call av
e.g.: DEFFN add$(a$,b$)=a$+b$
FUNCTION fname(parlist) ! define a function
FUNCTION fname$(parlist) ! define a $-function
e.g.: FUNCTION av(x,y)
LOCAL z
z = SQR(x^2+y^2)
RETURN 2*z
ENDFUNCTION
b=ABS(a) -- Absolutbetrag
c=ADD(a,b) -- Addiere, binär
a%=ARRPTR(b()) -- Adresse des Array-Descriptors
a%=ASC(t$) -- ASCII-Wert des ersten Zeichens von t$
b=ATN(a) -- Arcustangens
b=ATAN(a) -- Arcustangens
b=ATAN2(a,c) -- Arcustangens alle 4 Sektoren
b$=BIN$(a%[,n%]) -- Stellt a% als Binärzahl mit n% Stellen
t$=CHR$(a%) -- Zeichen mit ASCII-Code a%
b=COS(a) -- Cosinus
b%=CVI(a$) -- Wandelt Zeichenkette in 2-Byte-Integer
b%=CVL(a$) -- Wandelt Zeichenkette in 4-Byte-Integer
b=CVS(a$) -- identisch mit CVF
b=CVF(a$) -- Wandelt Zeichenkette in 4-Byte-Float
b=CVD(a$) -- Wandelt Zeichenkette in 8-Byte-Double
DFREE
y=DEG(x) -- entspricht y=180*x/pi
DIM?(a()) -- Ruckgabe ist Anzahl der Elemente von a()
i%=DPEEK(adr%)
t$=ENV$(n$) -- Inhalt der Environmentvariable mit Namen n$
EOF(#n) -- -1 wenn Ende des Files #n erreicht, sonst 0
b=EVEN(a%) -- TRUE wenn a% gerade
EXIST(fname$) -- -1 wenn File fname$ existiert, sonst 0
ret%=EXEC(adr%[,var%]) -- siehe Befehl EXEC mit int-Rückgabeparameter
b=EXP(a) -- Exponentialfuntion
b=FRAC(a) -- Liefert den nichtganzzahligen Anteil an a
FRE(n) -- Keine Funtion, nur aus Kompatibilitätsgründen da.
a%=FORM_ALERT(n%,t$)
c%=GET_COLOR(r%,g%,b%) -- Alloziert eine Farbe in der Farbtabelle und gibt die
Nummer zurück. Ist in der Farbtabelle kein Platz
mehr, so wird die Nummer derjenigen Farbe
zurückgegeben, die der angeforderten am nächsten
kommt.
f%=GLOB(a$,b$[,flags%]) -- Testet, ob a$ in das Pattern b$ passt
t$=HEX$(a%[,n%]) -- a% als Hexadezimalzahl
c%=INP(#n) -- Liest ein Zeichen (Byte) vom Kanal. Kanal -2 ist stdin
i%=INP%(#n)
t$=INPUT$(#n,anz%)
a%=INSTR(s1$,s2$[,n]) -- tests if s2$ is contained in s1$, then
returns start-position of s2$, else 0.
start comparison at pos. n (default=1)
i=INT(a) -- Schneidet die Nachkommastellen ab, liefert ganze Zahl
LEFT$(a$[,n%]) -- extraxts from string a$ the first (left) n characters
l%=LEN(t$)
b=LN(a) -- Natürlicher Logarithmus
p%=LOC(#n) -- Position des Filepointers (--> SEEK/RELSEEK)
l%=LOF(#n) -- Länge des files
a=LOG(b)
a=LOG10(b)
b%=LPEEK(adr%)
LPOS
m=MAX(a,b,c,...)
m=MAX(f())
m$=MID$(t$,s[,l]) -- extraxts from string t$ a string from position s
with l characters
m=MIN(a,b,c,...)
m=MIN(f())
t$=MKI$(i%) -- Wandelt Integer in 2-Byte String
t$=MKL$(i%) -- Wandelt integer in 4-Byte String
t$=MKF$(a) -- Wandelt Realzahl in 4 Byte String
t$=MKD$(a) -- Wandelt Realzahl in 8 Byte String
o$=OCT$(d%,n%)
a=ODD(d%) -- liefert TRUE wenn d% ungerade
d%=PEEK(a%)
c%=POINT(x%,y%) -- Liefert Farbwert des Punkts der Grafik im aktuellen Fenster
POS
t$=PRG$(i) -- Programmzeile i (Quelltext)
RANDOM(n%) -- Zufallszahl zwischen [0 und n%[
RIGHT$(a$,n%)
a%=RINSTR(s1$,s2$[,n]) -- tests if s2$ is contained in s1$, then
returns start-position of s2$, else 0.
start comparison at pos. n (default=1)
start comparison at right
b=SIN(a) -- Sinus
i%=SGN(a) -- Vorzeichen (-1,0,1)
t$=SPACE$(i%) -- gibt einen String
SPC(i%)
b=SQR(a) -- Wurzel
b=SQRT(a) -- Wurzel
t$=STR$(a[,b%,c%])
t$=STRING$(w$,i%)
adr%=SYM_ADR(#n,s$) -- liefert Adresse des Symbols mit Namen s$ aus shared
Object File #n
t$=SYSTEM$(n$) -- Ausgabe des Shell-Kommandos n$
TAB(i%)
b=TAN(a) -- Tangens
b=TRUNC(a)
u$=UPPER$(t$) -- liefert t$ in Großbuchstaben
a=VAL(t$) -- Wandelt String in Zahl, falls der String eine
Zahlendarstellung enthält.
i%=VAL?(t$) -- Liefert die Anzahl der umwandelbaren Zeichen
a%=VARPTR(v) -- Adresse der Variablen v
##############################################################################
Befehl: OPEN
============
Syntax: OPEN mode$,[#]n%,f$[,port%]
Beschreibung:
Mit diesem Befehl werden Dateien (streams) geöffnet. Es kann sich hierbei nicht
nur um reguläre Files handeln, sondern es können auch spezielle Files und
Sockets geöffnet werden.
mode$ "O" = output (write only), "I" = input (read only), "U" = read and write
"A" = append
Der Zweite Buchstabe spezifiziert den Typ:
"" default ist reguläres File
"C" Socket connect
"S" Socket listen
"A" Socket accept connection
f$ Filename oder Hostname
n% Kanalnummer
port% gibt den Port für die Verbindung (Socket) an.
Beispiele:
OPEN "I",#1,"data.dat" ---- Öffnet File "data.dat" zum Lesen
OPEN "UC",#1,"localhost",80 ---- Öffnet Port 80 zum Lesen und Schreiben
#############################################################################
Befehl: CLOSE
=============
Syntax: CLOSE [[#]n%]
Beschreibung:
Mit diesem Befehl wird ein zuvor geöffneter Kanal geschlossen.
n% Kanalnummer
Wird keine Kanal angegeben, werden alle offenen Kanäle geschlossen
#############################################################################
Befehl: LINK, UNLINK, SYM_ADR()
================================
Syntax: LINK #n%,t$
UNLINK #n%
adr%=SYM_ADR(#n%,sym$)
Beschreibung:
Mit LINK wird eine Shared-Library (*.so in /var/lib) dynamisch hinzugelinkt, und
kann über eine Kanalnummer angesprochen werden. Die Adressen der einzelnen
Symbole liefert SYM_ADR, der man den Symbolnamen übergibt.
#############################################################################
Befehl: CALL, EXEC, EXEC()
===========================
Syntax: CALL adr%[,parameterliste]
EXEC adr%[,parameterliste]
r%=EXEC adr%[,parameterliste]
Beschreibung:
Mit diesem Befehl wird eine Unterroutine an Adresse adr%
ausgeführt. Die Parameterübergabe ist wie in C über den Stack.
Defaultmäßig werden integers übergeben. Wird D: vorangestellt, wird
ein double, mit F: ein Float, mit L: ein long int übergeben.
Rückgabe ist immer int.
Beispiel:
dim result(100)
link #1,"simlib.so"
adr=sym_adr(#1,"CalcBeta")
CALL adr,D:1.2,L:0,L:varptr(result(0))
unlink #1
#############################################################################
Befehl: SYSTEM, SYSTEM$()
===========================
Syntax: SYSTEM cmd$
t$=SYSTEM$(cmd$)
Beschreibung:
Mit diesem Befehl wird ein Shellkomando ausgefuehrt.
Mit dem SYSTEM-Kommando geschieht die Text-Ein- und Ausgabe wie gewohnt
"uber das Terminal.
Die SYSTEM$-Funktion f"angt die stdout-Ausgabe auf und speichert sie in
t$.
Beispiel:
system "mkdir testordner"
d$=system$("ls")
print d$
#############################################################################
Funktion: GLOB()
===========================
Syntax: t$=GLOB(name$,pattern$[,flags%])
Beschreibung:
GLOB() "uberpr"uft, ob name$ das Wildcard-Pattern pattern$ erf"ullt
und liefert -1 zurueck, wenn erf"ullt, sonst 0. Mit flags% kann ein
die Art der "uberpr"ufung beeinflu"st werden.
flags%
0 -- default, kein Zeichen wird extra behandelt
1 -- bei name$ handelt es sich um einen Filenamen
(die Zeichen '/' werden nicht im Pattern gefunden)
2 -- Backslashes quote special characters
4 -- Spezialbehandlung von '.'
8 -- bei name$ handelt es sich um einen Filenamen und es
wird nur die Pfadangabe getestet
16 -- Gross und Kleinschreibung ignorieren
Beispiel:
glob("abcd","abc?") ergibt -1
glob("abcd","*") ergibt -1
glob("abc","ab??") ergibt 0
glob("*a[0-9]*","sad33333") ergibt 0
#############################################################################
Funktion: ROUND
===============
Syntax: a=ROUND(b[,n])
Beschreibung:
Liefert auf n Nachkommastellen gerundeten Wert von b.
n<0: Es wird vor dem Komma gerundet
#############################################################################
Funktion: SWAP
===============
Syntax: a%=SWAP(b%)
Beschreibung:
Liefert Wert durch Vertauschen der High und Low-Words von b%.
Siehe auch: BYTE(), CARD(), WORD()
#############################################################################
Funktion: BYTE
===============
Syntax: a%=BYTE(b%)
Beschreibung:
Liefert untere 8 Bits von von b%. (identisch mit a%=b% AND 255)
Siehe auch: CARD(), WORD(), SWAP()
#############################################################################
Funktion: CARD
===============
Syntax: a%=CARD(b%)
Beschreibung:
Liefert untere 16 Bits von von b%. (identisch mit a%=b% AND (2^16-1))
Siehe auch: BYTE(), WORD(), SWAP()
#############################################################################
Funktion: WORD
===============
Syntax: a%=WORD(b%)
Beschreibung:
Liefert untere 16 Bits von von b% und erweitert vorzeichenrichtig.
Siehe auch: BYTE(), CARD(), SWAP()
#############################################################################
--------------------------------------------------------------------------------
4. How to use the pseudo compiler
==================================
The X11-Basic package is shipped with a pseudo compiler, which makes
stand-alone binaries out of Basic source code. Actually this "compiler" is
not a real compiler, since the source code is still interpreted on runtime.
But the source code is linked to the X11-Basic library so there results one
independant executable. Another advantage is that it is quite hard to extract
a full running *.bas File from this binary since the code is compressd in a
way.
You can find the compiler in examples/utils/compiler.bas. Yes, the compiler
compiles itself. Yust make sure you have built the shared library
libx11basic.so and the library for static linking before
(make lib; make x11basic.a) and moved it to /usr/lib.
Then do
xbasic compiler.bas
select compiler.bas in the Fileselector.
choose if it shall be linked dynamically or statically
select compiler or whatever the binary filename should be in the next Fileselector.
after finishing, you will find a psydo-code.o in the actal directory. You may
delete this.
--------------------------------------------------------------------------------
4. FREQUENTLY ASKED QUESTIONS
#############################
Q: Why can't I compile X11Basic on my Computer with Zintorola 86060 processor and
Sluggix 0.8 Beta O.S.?
A: If you have GNU-C and X11R5/6 for this system, and X11Basic still won't compile,
please let me know as soon as possible, I will try to fix it.
Q: How do I leave the interpreter `gently'?
A: type quit or press ctrl-c (twice)
Q: What do all the warnings mean?
A: Well, isn't proper ported to your (any?) system.
Q: Why do the graphics look funny?
A: Some X-Servers do not clean newly allocated Pixmaps. So rubbish is displayed
if the window is maped. Please do a clearw 1 as a first command.
F: Kann ich meine alten Atari Programme "einfach" rüberziehen oder müssen
die noch irgendwie ( speziell Gem Programme ) angepasst werden?
A: Die müssen noch angepasst werden. Es gibt kleinere Unterschiede in der
Syntax, Systemaufrufe (XBIOS,BIOS,VDISYS etc), Inline-Blöcke gehen
natürlich nicht, short int
Variablen gibt es nicht etc. Also man muss nochmal mit der Hand
drübergehen. Aber es gibt nichts, was nicht irgendwie auch geht.
Bei kleinen Programmen (ca. 30 Zeilen) ist es ein Kinderspiel. Bei
größeren (mehere 100 Zeilen) ist es schon was arbeit. 1000-Zeilen
Programme habe ich noch nicht portiert. Es lohnt wahrscheinlich nicht.
Für Programme, an denen man nichts mehr machen will, empfehle ich dann
doch lieber STonX oder sowas.
Q: Program XXX doesn't run, what should I do?
A: Well this question is too difficult to answer.
Q: Can I use X11-Basic as a shell ?
A: Yes, simply copy the xbasic executable to /usr/bin .
The shell scripst then should have in their first line
#!/bin/xbasic
Q: Can I use X11-Basic as an internet daemon ?
A: Yes, start xbasic with the option -daemon .
This feature is still experimental. So use it on your own risk since this opens several security holes
to your system.
Q: Can X11-Basic generate stand-alone programs, which may run
without the xbasic executable ?
A: No. X11-Basic does not translate its input into assembly, you always need
the xbasic executable. On the other hand: the xbasic executable is rather
small (<200 kB), so you might spread it around with your X11-Basic
programs.
Q: May I charge for my X11-Basic programs ?
A: Yes, you may. But you should state clearly, that xbasic itself is available
free of charge. Refer to the File COPYING for details.
Q: Where can I get the newest version of X11-Basic?
A: Probably at
http://www-cip.physik.uni-bonn.de/~hoffmann/X11-Basic/
Don't bet on it though! :-)
Q: What can I do to speed up the development of X11-Basic?
A: You can try to bribe me with any amount of money, any type of hardware or
software (no pirated stuff please).
A nice postcard might suffice too. :-)
If you like to implement some new features and/or commands to x11basic,
please send me your new sources with description. But I only will implement
this stuff if I like it .-)
--------------------------------------------------------------------------------
4. HISTORY
==========
In the beginning there were absurd plans, long sleepless nights, and incredible
boredom.
Very First Version (1990)
--------------------------
It was a Mailbox-Program with Basic features (only character-Graphics with
Vt100EMU) on my ATARI ST (!).
First version with a version number - Version 0.1 ( 1997)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Mailbox-Program was rewritten in c on my Linux-PC
- first X11-Commands
Version 0.2 Alpha (1998)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- improved X11-Basic for use at the physics institute in Bonn
- Fixed last Problems of the Parser (didn't like -1*(4-3) )
- Added more X-features (redraw)
- First portation to a HP-Workstation
- Readline library in use
Version 1.00 (Mar 1999)
~~~~~~~~~~~~~~~~~~~~~~
- Makefile and configure script adapted from STonX
- True-color Displays
- X rootwindow, multiple windows
- INKEY$
- First GPL-Distribution
- FILESELECT,ALERT
Version 1.01 (Jun 1999)
~~~~~~~~~~~~~~~~~~~~~~
- POINT()
Version 1.02 (Jun 2000)
~~~~~~~~~~~~~~~~~~~~~~
- rsrc_load
- shell, daemon
Version 1.03 (Mar 2001)
~~~~~~~~~~~~~~~~~~~~~~~
- copyarea, sget, sput, get,put
- fill-Patterns
- drop down menues
- String-Variables may now contain nul-characters.
- POKE,DPOKE,LPOKE,EVEN(),ODD()
- LINK,UNLINK
- CVI(),CVD(),CVF(),CVL()
- MKI$(),MKD$(),MKL$(),MKF$()
- ON x GOSUB proc1,proc2,...
- ON x GOTO label1,label2,...
- INSTR(),RINSTR()
Version 1.04 (Apr. 2001)
~~~~~~~~~~~~~~~~~~~~~~~~
- splitted off shared library libx11basic.so (300kB)
- bug fixed which caused print a,b to segmentation fault
- DUMP "#"
- SYM_ADR()
- CALL, EXEC, EXEC() with parameter list
- DUMP "K" DUMP "F"
Version 1.05pre (Jul. 2001)
~~~~~~~~~~~~~~~~~~~~~~~~
- PRINT USING
- SYSTEM$()
- GLOB()
--------------------------------------------------------------------------------
Things left to do:
==================
- Speed up the interpretation with precompiled tokens
- Optimize a bit more
- Fix the bugs
(etc. etc.)
BUGS:
=====
- Exponentialdarstellungen von Zahlen mit negativem Exponent (z.B. 2e-5) werden
vom Parser nicht verdaut. (Abhilfe: 2/1e5)
- Integer-Artmetrik sehr(!) unvollständig
noch nicht alles implementiert. Syntax nicht idiotensicher.