
              TURBO BASIC mehr als ein Compiler
            


Wenn man TB (Turbo Basic) nur zum Compilieren von GW-Basic Programmen
bentzt, nuzt man nur einen geringen Teil der Mglichkeiten die dieses
Programm bietet.Deshalb mchte ich Ihnen TB etwas nher bringen.

Als erstes mchte ich den hervorragenden Editor nennen, der schon
fast eine Textverarbeitung darstellt, wen man einmal davon absieht das
keine Drucker-Steuerung und Textvormatierung mglich ist.
Der Compiler wurde in Assembler geschrieben und ist dementsprechend
schnell bei der bersetzung.So schnell das er ein Arbeiten fast wie
bei einem Interpreter ermglicht. Das heit, in der Testfase kann man
sein Programm jederzeit ndern und neu compilieren, ohne umstndliches
laden und lngeren Wartezeiten.
Fehler werden nicht nur bei der bersetzung angezeigt, auch whrend
des Programmablaufes auftretende Fehler werden automatisch im Quelltext
angezeigt. Fr die Fehlerkorrektur mu nicht einmal in den Editor
gesprungen werden, denn man befindet sich automatisch in diesen.
Das erzeugte Programm ist gegenber GW-Basic, rund um den Faktor fnf
schneller. Unter gewissen Voraussetzungen sind Geschwindigkeitssteigerungen
bis zum Zehnfachen mglich.
Aber Geschwindigkeit und Komfort ist nicht alles was TB zu bieten hat.
TB ist auch eine eigene Programmiersprache die gegenber GW-Basic einige
Vorteile bietet.
Es kann in TB zur Gnze auf Zeilennummern verzichtet werden, Sprungziele
und Unterprogramme werden mit Namen (Label) aufgerufen.
Unterprogramme knnen, unabhngig vom brigen Programm, mit lokalen
Variablen geschrieben werden. Diese werden dann mit CALL und bergabe
von Parametern aufgerufen.
berhaupt lehnt sich TB bei Prozeduren, Schleifen und Unterprogrammen
stark an Pascal an, aber ohne der blichen Nachteile.
Selbstverstndlich ist man mit TB an keine 64K Grenze gebunden.
Es stehen fr Variablen und Strings je 64K Speicher zu Verfgung, wobei
einzelne Strings bis 32k lang sein knnen. Datenfelder (Arrays) knnen
je 64k belegen und der Rest des Speichers steht dem Programm zu Verfgung.
Dies sind aber noch nicht alle Vorteile die TB bietet deshalb mchte ich
Ihnen ein kleines Programm vorstellen, damit sie sich selbst von den
Mglichkeiten die TB bietet berzeugen knnen.

ZGEN ist ein Zeichengenerator fr die Erstellung beliebiger Zeichen fr
den Drucker. Erstellt wurde das Programm Fr den Seikosha SL-80AI, es
sollte aber auch auf fr andere 24-Nadeldrucker geeignet sein.
Fr andere Drucker mte das Programm erst umgeschrieben werden, wobei
ich Ihnen aber gerne behilflich bin.


******************************************************************************
   '*** ZEICHEN GENERATOR FR 24 NADELDRUCKER (SEIKOSHA SL-80 AI 180 TPI) ***
           '*** V 1.1 vom 19.10.88 von Robert Smola in Turbo Basic ***

	COLOR 7,0
	KEY OFF
	CLS
	PRINT
PRINT "   ZEICHEN - GENERATOR FR 24 NADELDRUCKER  (SEIKOSHA SL-80 AI 180 TPI)
	PRINT : PRINT
PRINT "   Dieser Zeichen-Generator hilft bei der Erstellung eigener Zeichen am
PRINT "   Drucker, die beim IBM  Zeichensatz nicht enthalten, oder nicht dar -
PRINT "   stellbar sind.
PRINT "   Das Zeichen wird in Grovormat  am Bildschirm erstellt und kann an -
PRINT "   schlieend mit den dazugehrenden Datenbytes ausgedruckt werden.
PRINT "   Diese Datenbytes knnen dann in  Programmen eingebunden werden, oder
PRINT "   auch in Texte wenn Ihr  Textverarbeitungs Programm direkte Drucker -
PRINT "   steuerung zult.
PRINT "   Der Drucker gibt Ihr Zeichen mit folgender Befehlssequenz aus:
PRINT "   27;42;39;18;0;... Hier mssen nun die 54 Bytes Ihres Zeichen folgen.
PRINT "   Sie knnen aber auch  die Bytes auf  Disk abspeichern  und spter in
PRINT "   Ihr Programm laden, oder direkt mit dem `type` Befehl ausdrucken.
PRINT "   Z.b. TYPE Name.ZGN>PRN   (Anschlieend Zeilenvorschub senden !)
PRINT "   Der Steuerkode fr den Drucker wird dabei automatisch abgespeichert.
PRINT "   Das Zeichen als solches kann aber  auch auf Disk gespeichert und zur
PRINT "   spteren Bearbeitung wieder geladen werden.
	PRINT : PRINT
	COLOR 31,0
PRINT "                                                                TASTE !
	CALL WARTEN
'Bildschirm lschen
NEU:
	COLOR 7,0
	CLS
'Integer Zuweisung aller nicht deklarierten Variablen
	DEFINT A-Z
'Raster erzeugen
	FOR I = 1 TO 24
	LOCATE I,1
	PRINT "ôôôôôôôôôôôôôôôôôô";I;
	NEXT I
	LOCATE 25,1
	PRINT "1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 ";
'Text ausgeben
	LOCATE 1,45
	PRINT "Auto Curser "; : COLOR 0,7 : PRINT "EIN";
		COLOR 7,0 : PRINT " oder AUS mit .... C";
	LOCATE 3,45
	PRINT "Punkt setzen oder lschen mit ENTER";	
	LOCATE 5,45
	PRINT "Bewegung mit ........ CURSER Tasten";
	LOCATE 7,45
	PRINT "Zeichen invertieren mit ......... I";
	LOCATE 9,45
	PRINT "Zeichen ausdrucken mit .......... Z";
	LOCATE 11,45
	PRINT "Bytes ausdrucken mit ............ B";
	LOCATE 13,45
	PRINT "Bytes auf Disk speichern mit .... S";
	LOCATE 15,45
	PRINT "Zeichen abspeichern mit ......... A";
	LOCATE 17,45
	PRINT "Zeichen laden mit ............... L";
	LOCATE 19,45
	PRINT "Programm beenden mit .......... END";
        LOCATE 21,45
	PRINT "Alles lschen mit ............ HOME";
'Variablen Zuweisung
	ZEILE = 4 : SPALTE = 5
	ALT$ = "ô"
	ALTZEILE = ZEILE : ALTSPALTE = SPALTE
	RICHTUNG = 2
	DIM WERTE (54)
	AUTO = 1
	SPEICHER = 1
'Cursor setzen
SET:
	LOCATE ALTZEILE,ALTSPALTE,0
	COLOR 7,0
	PRINT ALT$;
SETX:
	IF SCREEN (ZEILE,SPALTE) = 195 AND SCREEN (ZEILE,SPALTE,1) > 1 THEN
		ALT$ = "ô"
	        LOCATE ZEILE,SPALTE,0
		COLOR 7,0
		PRINT "̹";
	ELSE
		ALT$ = ""
	        LOCATE ZEILE,SPALTE,0
		COLOR 0,7
		PRINT "ô";
	END IF
	ALTZEILE = ZEILE : ALTSPALTE = SPALTE
'Tastaturabfrage
IN:
	IN$ = INKEY$ : IF IN$ = "" THEN IN
		IF IN$ = CHR$(13) THEN SETZEN
		IF IN$ = CHR$(67) OR IN$ = CHR$(99) THEN AUTO
    		IF IN$ = CHR$(83) OR IN$ = CHR$(115) THEN SPEICHERN
		IF IN$ = CHR$(66) OR IN$ = CHR$(98) THEN BYTES
		IF IN$ = CHR$(90) OR IN$ = CHR$(122) THEN ZEICHEN
		IF IN$ = CHR$(73) OR IN$ = CHR$(105) THEN INVERT
		IF IN$ = CHR$(65) OR IN$ = CHR$(97) THEN ABSPEICHERN
		IF IN$ = CHR$(76) OR IN$ = CHR$(108) THEN LADEN
		IF LEFT$(IN$,1) <> CHR$(0) THEN BEEP : GOTO IN
	IN$ = RIGHT$(IN$,1)
		IF IN$ = CHR$(75) THEN SPALTEDECR
		IF IN$ = CHR$(77) THEN SPALTEINCR
   		IF IN$ = CHR$(72) THEN ZEILEDECR
		IF IN$ = CHR$(80) THEN ZEILEINCR
		IF IN$ = CHR$(79) THEN COLOR 7,0 : CLS : END
		IF IN$ = CHR$(71) THEN NEU
		BEEP
	GOTO IN
'Spalte links
SPALTEDECR:
	IF SPALTE > 1 THEN SPALTE = SPALTE - 2 ELSE BEEP
	RICHTUNG = 1
	GOTO SET
'Spalte rechts
SPALTEINCR:
	IF SPALTE < 35 THEN SPALTE = SPALTE + 2 ELSE BEEP
	RICHTUNG = 2
	GOTO SET
'Zeile hinauf
ZEILEDECR:
	IF ZEILE > 1 THEN DECR ZEILE ELSE BEEP
	RICHTUNG = 3
	GOTO SET
'Zeile hinunter
ZEILEINCR:
	IF ZEILE < 24 THEN INCR ZEILE ELSE BEEP
	RICHTUNG = 4
	GOTO SET
'Punkt setzen
SETZEN:
	SPEICHER = 1
	IF SCREEN (ZEILE,SPALTE) = 204 THEN ALT$ = "" ELSE ALT$ = "ô"
	IF AUTO = 0 THEN SET
	ON RICHTUNG GOTO SPALTEDECR, SPALTEINCR, ZEILEDECR, ZEILEINCR
'Zeichen invertieren
INVERT:
	SPEICHER = 1
	LOCATE ALTZEILE,ALTSPALTE
	COLOR 7,0
	PRINT ALT$;
	IF ALT$ = "ô" THEN ALT$ = "" ELSE ALT$ = "ô"
	FOR I = 1 TO 24
		FOR J = 1 TO 35 STEP 2
		LOCATE I,J
		IF SCREEN (I,J) = 195 THEN PRINT ""; ELSE PRINT "ô";
		NEXT J
	NEXT I
	GOTO SET
'Automatischer Curser an/aus
AUTO:
	IF AUTO = 0 THEN
		AUTO = 1 : LOCATE 1,57 : COLOR 0,7 : PRINT "EIN";
			 COLOR 7,0 : PRINT " oder AUS";
		ELSE
		AUTO = 0 : LOCATE 1,57 : COLOR 7,0 : PRINT "EIN oder ";
			COLOR 0,7 : PRINT "AUS";
	END IF
	GOTO IN
'Zeichen drucken
ZEICHEN:
	ON ERROR GOTO DRUCKERFEHLER
	CALL ZEICHEN
	LPRINT CHR$(27);CHR$(42);CHR$(39);CHR$(18);CHR$(0);
        FOR I = 0 TO 53
	LPRINT CHR$(WERTE(I));
	NEXT I
	LPRINT : LPRINT : LPRINT : LPRINT : LPRINT
	ON ERROR GOTO
	GOTO SET
'Bytes drucken
BYTES:
	ON ERROR GOTO DRUCKERFEHLER
	CALL ZEICHEN
	WIDTH "LPT1:", 72
	FOR I = 0 TO 53
	IF WERTE(I) < 10 THEN LPRINT "00"; FNBYTE$;
	IF WERTE(I) >9 AND WERTE(I) < 100 THEN LPRINT "0"; FNBYTE$;
	IF WERTE(I) >99 THEN LPRINT FNBYTE$;
        NEXT I
	LPRINT : LPRINT : LPRINT : LPRINT : LPRINT
	ON ERROR GOTO
	GOTO SET
'Abspeichern auf Disk
SPEICHERN:
	CALL ZEICHEN
	LOCATE  23,43
	COLOR 0,7
	PRINT "Bitte Filenamen eingeben";
	COLOR 7,0
	PRINT "         .ZGN";
	LOCATE 23,68,1,11,12
	CALL IN
        IF FILE$ = "" THEN PRINT FNENDE$ : GOTO SET
	FILE$ = FILE$ + ".ZGN"
		LOCATE 23,43
		PRINT "  ";
		COLOR 0,7
		PRINT "An bestehendes File anhngen ? J/N";
		COLOR 7,0
		PRINT " ";
	ON ERROR GOTO DISKFEHLER
INST:
		WHILE NOT INSTAT : WEND
		A$ = INKEY$
		IF A$ = CHR$(74) OR A$ = CHR$(106) THEN_
		OPEN FILE$ FOR APPEND AS #1 : GOTO AUS
		IF A$ = CHR$(78) OR A$ = CHR$(110) THEN_
		OPEN FILE$ FOR OUTPUT AS #1 : GOTO AUS
		BEEP : GOTO INST
AUS:
	PRINT#1, CHR$(27);CHR$(42);CHR$(39);CHR$(18);CHR$(0);
        FOR I = 0 TO 53
	PRINT#1, CHR$(WERTE(I));
	NEXT I
	CLOSE#1
	ON ERROR GOTO
	PRINT FNENDE$
	GOTO SET
'Zeichen abspeichern
ABSPEICHERN:
	LOCATE ALTZEILE,ALTSPALTE
	COLOR 7,0
	PRINT ALT$;
	LOCATE  23,43
	COLOR 0,7
	PRINT "Bitte Filenamen eingeben";
	COLOR 7,0
	PRINT "         .ZEI";
	LOCATE 23,68,1,11,12
	CALL IN
        IF FILE$ = "" THEN PRINT FNENDE$ : GOTO SET
	FILE$ = FILE$ + ".ZEI"
	ON ERROR GOTO DISKFEHLER
	OPEN FILE$ FOR OUTPUT AS #1
        FOR I = 1 TO 24
		FOR J = 1 TO 36
		A$ = CHR$(SCREEN(I,J))
		WRITE#1, A$
		NEXT J
	NEXT I
	CLOSE#1
	ON ERROR GOTO
	PRINT FNENDE$
	GOTO SET
'Zeichen laden
LADEN:
	SPEICHER = 1
	LOCATE  23,43
	COLOR 0,7
	PRINT "Bitte Filenamen eingeben";
	COLOR 7,0
	PRINT "         .ZEI";
	LOCATE 23,68,1,11,12
	CALL IN
        IF FILE$ = "" THEN PRINT FNENDE$ : GOTO SET
	FILE$ = FILE$ + ".ZEI"
	ON ERROR GOTO DISKFEHLER
	OPEN FILE$ FOR INPUT AS #1
	        FOR I = 1 TO 24
		FOR J = 1 TO 36
		LOCATE I,J
		INPUT#1, A$
		PRINT A$;
		NEXT J
	NEXT I
	CLOSE#1
	ON ERROR GOTO
	PRINT FNENDE$
	GOTO SETX
'Drucker Fehler abfangen
DRUCKERFEHLER:
	BEEP
     	LOCATE 23,43
	COLOR 31,0
	PRINT "  Drucker   FEHLER      Taste drcken";		
	CALL WARTEN
	LOCATE 23,43
	PRINT FNENDE$
	RESUME SET
'Disk Fehler abfangen
DISKFEHLER:
	BEEP
        LOCATE 23,43
	COLOR 31,0
	PRINT "  Disk      FEHLER      Taste drcken";		
	CALL WARTEN
	LOCATE 23,43
	PRINT FNENDE$
	RESUME SET
'Prozedur zur Zeichen Berechnung
SUB ZEICHEN
 	LOCAL Z, I, K, WERT
	SHARED WERTE (), ALTZEILE, ALTSPALTE, ALT$, SPEICHER
		IF SPEICHER = 0 THEN EXIT SUB
	        SPEICHER = 0
	LOCATE ALTZEILE,ALTSPALTE
	COLOR 7,0
	PRINT ALT$;
	Z = 0
	FOR I = 1 TO 35 STEP 2
	WERT = 0
		FOR K = 1 TO 8
		IF SCREEN (K,I) = 219 THEN GOSUB WERT
		NEXT K
	WERTE (Z) = WERT : INCR Z
	WERT = 0
		FOR K = 9 TO 16
		IF SCREEN (K,I) = 219 THEN GOSUB WERT
		NEXT K
	WERTE (Z) = WERT : INCR Z
	WERT = 0
		FOR K = 17 TO 24
		IF SCREEN (K,I) = 219 THEN GOSUB WERT
		NEXT K
	WERTE (Z) = WERT : INCR Z
	NEXT I
EXIT SUB
'Unterprogeamm zur ermittlung eines Bytes
	WERT:
		IF K = 1 OR K =  9 OR K = 17 THEN WERT = WERT + 128
		IF K = 2 OR K = 10 OR K = 18 THEN WERT = WERT + 64
		IF K = 3 OR K = 11 OR K = 19 THEN WERT = WERT + 32
		IF K = 4 OR K = 12 OR K = 20 THEN WERT = WERT + 16
		IF K = 5 OR K = 13 OR K = 21 THEN WERT = WERT + 8
		IF K = 6 OR K = 14 OR K = 22 THEN WERT = WERT + 4
		IF K = 7 OR K = 15 OR K = 23 THEN WERT = WERT + 2
		IF K = 8 OR K = 16 OR K = 24 THEN WERT = WERT + 1
	RETURN
END SUB
'Prozedur warten auf Taste
SUB WARTEN
	LOCAL A$
	WHILE NOT INSTAT : WEND	: A$ = INKEY$	
END SUB
'Funktion Bytes drucken
DEF FNBYTE$
	SHARED WERETE()
	FNBYTE$ = (RIGHT$ (STR$(WERTE(I)),LEN (STR$(WERTE(I)))-1) + " ")
	END DEF
'Prozedur Filename schreiben
SUB IN
	LOCAL A$, Z
	SHARED FILE$
INS:	
	A$ = INKEY$ : IF A$ = "" THEN INS	
	IF A$ = CHR$(8) THEN DEL
	IF A$ = CHR$(13) THEN SCHREIBE
        IF A$ = CHR$(45) THEN SETS
	IF A$ > CHR$(47) AND A$ < CHR$(58) THEN	SETS
        IF A$ > CHR$(64) AND A$ < CHR$(91) THEN SETS
        IF A$ = CHR$(95) THEN SETS
        IF A$ > CHR$(96) AND A$ < CHR$(123) THEN SETS
	IF A$ = CHR$(129) OR A$ = CHR$(154) THEN SETS
	IF A$ = CHR$(132) OR A$ = CHR$(142) THEN SETS
	IF A$ = CHR$(148) OR A$ = CHR$(153) THEN SETS
	IF A$ = CHR$(225) THEN SETS
	BEEP : GOTO INS
SETS:
	IF POS(0) = 76 THEN BEEP : GOTO INS
	PRINT A$;
	GOTO INS
DEL:
	IF POS(0) = 68 THEN BEEP : GOTO INS
        LOCATE 23,POS(0)-1
	PRINT " ";
	LOCATE 23,POS(0)-1,1,11,12
	GOTO INS
SCHREIBE:
	FILE$ = ""
	IF POS(0) = 68 THEN EXIT SUB
	Z = 68
	DO UNTIL SCREEN(23,Z) = 32 OR SCREEN(24,Z) = 46
	FILE$ = FILE$ + CHR$(SCREEN(23,Z))
	INCR Z
	LOOP
	END SUB
'Funktion lschen
DEF FNENDE$
	LOCATE 23,43
	PRINT "                                     ";
	END DEF
                               '*** ENDE ***
 *****************************************************************************


Am Ende gebe ich Ihnen noch eine kleine Funktionsbeschreibung des Programmes,
das dem Club auch auf Diskette und als EXE File zu Verfgung steht.

Jeder gesetzte Punkt am Bildschirm entspricht einem Nadelanschlag im 24-
Nadel-180 TPI Grafikmodus.

C...Auto Curser ein oder aus : Automatisches weiterrcken des Cursers ein,-
                               oder ausgeschalteten.
I...Zeichen invertieren      : Alle nicht gesetzten Punkte werden gesetzt
                               alle gesetzten gelscht.
Z...Zeichen ausdrucken       : Das Zeichen wird am Drucker ausgegeben und
                               anschlieend werden vier Zeilenvorschbe
                               gesendet.
B...Bytes ausdrucken         : Die Datenbytes des Zeichens werden ausgegeben
                               und anschlieend werden vier Zeilenvorschbe
                               gesendet.
S...Bytes auf Disk speichern : Die Steuerkodes fr den Drucker und die Daten-
                               bytes des Zeichen werden auf das aktuelle
                               Laufwerk gespeichert. Dabei besteht die
                               Mglichkeit an bestehende Files anzuhngen und
                               somit ganze Zeichenketten zu erstellen.
A...Zeichen abspeichern      : Der Bildschirmteil der das Zeichen darstellt
                               wird auf das aktuelle Laufwerk gespeichert.
L...Zeichen laden            : Ladet das Zeichen das mit A gespeichert wurde.

END...Programm beenden       : Das Programm wird beendet.

HOME...Alles lschen         : Das Programm wird neu gestartet.




