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.