QUICK Ecke Teil 23
von Harald Schönfeld
Wie versprochen zeige ich in der
heutigen Ausgabe anhand eines "echten"
BASIC-Programms, wie BASIC-Programme in
QUICK umgesetzt werden können.
Man vergebe mir, daß ich nur einen 40-
Zeiler umsetze, aber auch das ist schon
ganz schon langwierig.
Buchstabenlaufen
Ich habe tief in meine Diskettenkiste
gegriffen und ein uraltes
BASIC-Programm gefunden, das sich zur
Umsetzung gut eignet, weil es:
- nicht zu lang war
- ich den Programmcode schon vergessen
hatte
- kein Fließkommazahlen benötigt
- eine Reihe von unterschiedlichsten
Befehlen und Berechnungen benutzt
Was tut das BASIC-Programm BUCHST.BAS?
Das Programm benutzt die 4 vorhandenen
Player, um eine einfache VERTIKALE
Laufschrift zu erzeugen. Man gibt einen
Text ein, dessen Zeichen aus dem
Zeichensatz in die Player kopiert
werden.
Zunächst muß man festlegen, wieviele
Player/Spalten benutzt werden sollen (1
bis 4). Dann kann man wählen, wie
schnell diese Player von links nach
rechts bewegt werden sollen. Danach
kann für jeden der 4 Player die
Buchstabenbreite und -höhe eingegeben
werden. Je nach Höhe der Zeichen können
dann 10 bis 30 Zeichen untereinander
dargestellt werden. Die jeweiligen
Texte werden eingegeben, wobei eine
kleine Skala gezeichnet wird, die die
Anzahl der möglichen Zeichen zeigt.
Wie das Eingeben abläuft kann man sich
im BASIC gut ansehen.
Danach wird die Anfangsadresse des
Playerbereichs festgelegt und die
Breite der Player wird gesetzt. Dann
werden je nach Textinhalt die Bytes,
die im Zeichensatz das Aussehen der
Zeichen bestimmen in den Player
kopiert. Dabei wird jedes Byte, je nach
oben eingegebener Höhe, bis zu 2 mal
wiederholt.
Sind die Zeichen komplett in die Player
kopiert, so beginnt eine
Endlosschleife, die die die Player
bewegt.
Das gesamte BASIC-Programm sieht dann
so aus, wie es das File BUCHST.LST
zeigt.
Natürlich ist das Programm nicht
sonderlich optimiert, aber es tut
seinen Dienst. Was fällt auf?
- Die Player ruckeln
- Das kopieren der Zeichen in die
Player dauert eine Weile
Es macht also schon Sinn, das Programm
nach QUICK umzuschreiben.
Buchstabenlaufen in QUICK
Worauf ist bei der Umsetzung in QUICK
zu achten?
Zunächst müssen alle nötigen Variablen
definiert werden. Dabei sind einige
Hilfsvariablen für die Berechnungen
nötig und außerdem werden einige
Systemvariablen definiert, die später
unschöne POKEs weitgehend überflüssig
machen.
Das Einlesen der Variablenfelder läuft
ähnlich wie in BASIC ab. Allerdings
sind die Spalten hier von 0 bis 3
(nicht 1 bis 4) durchnummeriert, da die
ARRAYs mit dem 0. Element beginnen.
Diese unscheinbare Änderung des
Schleifenindexes bedingt dummerweise
Änderungen in vielen Schleifen im
ganzen Programm. Im Nachhinein muß ich
sagen: Vergeßt das 0. BYTE in diesem
Fall besser!
Die niegrigste Geschwindigkeit ist in
QUICK 1 und nicht 0.5. Das ist sowieso
relativ!
Die Darstellung der Linealmarkierung
wurde geändert. In BASIC kann man mit
IF (X/5)=INT(X/5)
feststellen, ob die position durch 5
teilbar ist. In QUICK ist es einfacher
immer eine Zähler mitlaufen zu lassen.
Die Berechnung der Anfangsadresse des
Playerbereichs wurde geändert, da der
Speicheraufbau in QUICK anders ist. Als
Anfang wird hier $a000 gewählt, das
liegt unterhalb des Bildschirm-
speichers.
Das Löschen der jeweils 256 Byte langen
Playerbereiche besorgt der CLR-Befehl,
das ist schnell und einfach ideal.
Anstatt GOSUB schreibt man in QUICK
natürlich den Namen eines
Unterprogramms .TXT2PLAY hin. Die
Übergabe der sowieso globalen Variablen
wäre nicht unbedingt nötig, aber
schaden kann es auch nicht.
Der Graphics-Befehl wird in QUICK nicht
für Kanal 6 sondern besser für Kanal 5
gegeben, so kann man auch mit LPT
darauf zugreifen. Das ist aber nicht
unbedingt nötig.
Die Player werden nun eingeschaltet,
indem auf OS-Variablen zugegriffen
wird.
Die folgende Schleife zum Bewegen der
Player ist ungebremst etwas zu schnell
(ausprobieren!) und muß durch einen
PAUSE-Aufruf verlangsamt werden. PAUSE
ist ein Unterprogramm, das den TIMER in
der Adresse 540 benutzt um 1/50 Sekunde
zu warten.
Im Unterprogramm selbst wird genau das
gleiche getan wie im BASIC - auch wenn
man das vom ersten Ansehen her nicht
vermuten würde. Was wurde geändert?
Vor allem werden nur ganze Zahlen
benutzt, deshalb wurden einige
Berechnungen so umgeschrieben, daß auf
Fließkommazahlen verzichtet werden
kann.
Einige "logische" Operationen wie
GH=2*GH*(GH>0) sind im BASIC zwar kurz,
in QUICK aber nicht so sinnvoll. Hier
ist es wesentlich schneller ein
IF-Statement zu verwenden:
IF GH>0
GH=2*GH
ELSE
GH=0
ENDIF
Wie gesagt muß auf den geänderten
Schleifenindex geachtet werden.
Außerdem sollten Adressen immer
WORD-Variablen sein.
Und zu guter letzt: In QUICK heißt es
INPUT(H)
und nicht
INPUT H
Der Compiler bringt keine
Fehlermeldung, aber trotzdem darf man
eine ganze Weile nach diesem Fehler
suchen (Ächz!)
Und hier nun der QUICK-Quellcode, der
wie erwartet etwas länger ist:
Quick-Sourcetext
D1:BUCHST.QIK
* BUCHSTABENLAUFEN in QUICK
* ein Demo fuer BASIC -> QUICK
* UserMag 92
BYTE
(+
H,H1,L,Z,I,J,SP
LMARGN=82
PMBASE=54279
SDMCTL=559
GRACTL=53277
PCOLR0=704
PCOLR1=705
PCOLR2=706
PCOLR3=707
)+
WORD
(+
ANF
SIZEP0,SIZEP
HPOSP0,HPOS
)+
ARRAY
(+
SW(4),G(4),B(4),T(40),S(4),CL(2)
)+
MAIN
CLOSE(6)
OPEN(6,12,0,"E:")
LMARGN=2
DATA(CL)
(+
125,0
)+
SIZEP0=53256
HPOSP0=53248
?("BUCHSTABENLAUFEN in QUICK")
?("Wieviele Spalten (1-4)")
INPUT(SP)
I=0
REPEAT
?("Schrittweite Spalte",I,"(1-8)")
INPUT(H)
SW(I)=H
I++
UNTIL I=SP
I=0
REPEAT
?(CL,"BUCHSTABENLAUFEN")
?("GROESSE SPALTE ",I,"(1/2/3)")
INPUT(H)
G(I)=H
DIV(30,H,L)
?("BREITE SPALTE ",I,"(0/1/2)")
INPUT(H)
B(I)=H
?
?("SPALTE ",I,"IST ",L)
?("BUCHSTABEN LANG")
?("BITTE GEBEN SIE DEN TEXT EIN")
J=1
Z=1
REPEAT
ADD(J,2,H)
POS(H,10)
IF Z=5
?("Ä")
Z=1
ELSE
?("N")
Z++
ENDIF
J+
UNTIL J>L
INPUT(T)
?
?("EINEN MOMENT BITTE?")
ANF=$A000
PMBASE=$A0
H=B(I)
IF H=2
H=3
ENDIF
ADD(I,SIZEP0,SIZEP)
POKE(SIZEP,H)
S(I)=0
ADD($A4,I,ANF)
CLR(ANF,1)
.TXT2PLAY(ANF,I)
I+
UNTIL I=SP
CLOSE(6)
OPEN(5,12,2,"S:")
SETCOL(0,10,10)
SETCOL(1,3,6)
LPT
LPT
LPT(" das")
LPT
LPT(" BUCHSTABENLAUFEN")
SDMCTL=62
GRACTL=3
PCOLR0=14
PCOLR1=238
PCOLR2=142
PCOLR3=94
REPEAT
I=0
REPEAT
H=S(I)
H1=SW(I)
ADD(H,H1,H)
S(I)=H
ADD(HPOSP0,I,HPOS)
POKE(HPOS,H)
I++
UNTIL I=SP
.PAUSE
UNTIL 1=0
ENDMAIN
PROC TXT2PLAY
IN
WORD
(+
ANF
)+
BYTE
(+
I
)+
LOCAL
BYTE
(+
GH,J,H,CB,JJ
)+
WORD
(+
L2,WH
)+
BEGIN
MULT(ANF,256,ANF)
GH=G(I)
MULT(GH,4,WH)
IF GH>1
MULT(GH,4,WH)
SUB(ANF,WH,ANF)
ENDIF
J=1
H=T(0)
REPEAT
MULT(H,8,WH)
ADD(57344,WH,L2)
SUB(L2,256,L2)
JJ=0
REPEAT
ADD(L2,JJ,WH)
PEEK(WH,CB)
MULT(GH,8,WH)
MULT(J,WH,WH)
ADD(ANF,WH,WH)
MULT(GH,JJ,H)
ADD(WH,H,WH)
POKE(WH,CB)
IF GH>1
ADD(WH,1,WH)
POKE(WH,CB)
IF GH=3
ADD(WH,1,WH)
POKE(WH,CB)
ENDIF
ENDIF
JJ+
UNTIL JJ=8
H=T(J)
J++
UNTIL H=0
ENDPROC
PROC PAUSE
LOCAL
BYTE
(+
TIM=540
)+
BEGIN
TIM=1
REPEAT
UNTIL TIM=0
ENDPROC
Am besten ist es, beide Texte
auszudrucken und direkt zu vergleichen.
So, damit wären wir am Ende dieses
Themas für diesen Monat angelangt
angelangt.
Bis zur nächsten Ausgabe wünschen wir
noch viel Spaß mit dem Umwandeln von
BASIC-Programmen in QUICK.