Tips & Tricks zum C 16
Zum hervorragenden Basic des C16 bringen wir Ihnen noch vier wirklich nützliche Befehle. Außerdem zeigen wir, wie man mit einem kleinen Trick fast beliebig große Grafik-Textfenster erzeugen kann.
Unsere Tips & Tricks-Kiste schreit nach C 16-Futter! Vor allem die Profis seien hier noch einmal dazu aufgerufen, uns ihren interessantesten POKE, die nützlichste Maschinenroutine oder das genialste Basic-Programm zu schicken. Jede brauchbare Einsendung wird veröffentlicht. (tr)
Vier nützliche Basic-Befehle
Das Programm »BASICTOOL« (Listing 1) ist ein sogenannter »DATA-Lader«, der vier kurze Maschinenprogramme erzeugt. Hierdurch werden einige zusätzliche Funktionen auf dem C 16 implementiert:
OLD
Mit diesem Befehl kann man Basic-Programme, die unbeabsichtigt durch »NEW« oder einen Reset gelöscht wurden, wieder lauffähig machen. Er hilft bisweilen auch, wenn Programme fehlerhaft von Kassette geladen wurden.
Aufgerufen wird er einfach mit: SYS 1618
SWAP
Dieser Befehl wurde für den C 64 bereits in der 64’er, Ausgabe 12/85 vorgestellt. Ich habe ihn für den C 16 umgeschrieben.
Er dient dazu, zwei Strings miteinander zu vertauschen. Dies geschieht durch Vertauschen der Stringdeskriptoren, es entsteht also kein »Stringmüll«. Die gefürchtete Garbage Collection wird verhindert.
Es gilt folgender Syntax für den Aufruf: SYS 1569 (A$,B$) A$ und B$ können hierbei zwei beliebige Stringvariable sein.
BLOAD und BSAVE
Diese Befehle simulieren die entsprechenden Befehle des C 128. Sie dienen dazu, von einem Basic-Programm aus einen ganzen Speicherblock zu laden oder zu speichern.
Man kann so zum Beispiel eine Grafik speichern oder ein Maschinenprogramm nachladen. Auch Programme, die mit dem S-Befehl des eingebauten Monitors gespeichert wurden, können geladen werden.
Es gilt folgende Syntax:
BLOAD: SYS 1536 "name", g, 1
BSAVE: SYS 1548 "name", g, 1, aa, ea+1
Hierbei ist g die Gerätenummer (1 oder 8 für Kassette oder Disk), aa die Anfangs- und ea die Endadresse des Speicherbereichs.
Beispiel: aa = 8192, ea = 16384 zum Speichern der HiRes-Grafik.
100 rem ***** basictool ***** 110 : 120 data 20,6b,a8,a5,0a,a6,2b,a4 130 data 2c,4c,d5,ff,20,6b,a8,20 140 data de,9d,84,d8,85,d9,20,de 150 data 9d,a6,14,a8,a9,d8,4c,d8 160 data ff,20,8e,94,20,2c,93,20 170 data 1a,93,a5,64,85,d0,a5,65 180 data 85,d1,20,91,94,20,2c,93 190 data 20,1a,93,a0,00,b1,d0,85 200 data d2,b1,64,91,d0,a5,d2,91 210 data 64,c8,c0,03,d0,ef,20,8b 220 data 94,60,a9,01,a8,91,2b,20 230 data 18,88,20,4b,88,68,68,4c 240 data 9a,8a,00,00,00,00,00,00 250 : 260 fori=1536to1639 270 readd$:pokei,dec(d$):c=c+dec(d$) 280 next:ifc<>12205thenprint" data fehler!":end 290 : 300 rem **** syntax-hinweise **** 310 : 320 rem old: 330 rem sys 1618 340 : 350 rem swap: 360 rem sys 1569 (a$,b$) 370 : 380 rem bload: 390 rem sys 1536 "name",8,1 400 : 410 rem bsave: 420 rem sys 1548 "name",8,1,anf,end+1 430 rem anfangs-/endadresse dezimal 440 : 450 rem ************************* 455 : 460 print" objektcode speichern (j/n)?" 470 getkeyc$:ifc$<>"j"thenend 480 print" casette oder disk (c/d)?":getkeyc$ 490 ifc$="d"thenu=8:elseu=1 500 sys1548"minitool.obj",u,1,1536,1640:ifu=8thendirectory
Beliebig große Grafikfenster
Dieses Maschinenprogramm steuert einen Rasterzeilen-Interrupt, durch den man im »GRAPHIC 2«- oder »GRAPHIC 4«-Modus ein fast beliebig großes Grafik-Fenster erzeugen kann. Die hierzu notwendige Routine ist bereits im ROM des C 16 vorhanden, denn auch im normalen Split-Screen-Modus muß ja ein Raster-Interrupt stattfinden. Man kann also diese Routine einfach kopieren und ein wenig ändern. Wie dies am einfachsten geschieht, wird im folgenden beschrieben:
- Geben Sie zunächst die folgende Basic-Zeile ein:
10 SYS 4293
Dies wird der spätere Einsprung in die Initialisierungs-Routine. Achten Sie darauf, daß zwischen »SYS« und der Adresse höchstens ein Space steht, sonst kommen Sie mit dem Speicherplatz nicht hin.
- Rufen Sie jetzt den Monitor auf und geben Sie ein:
T CEOE CEC4 100E
Damit wird die Interrupt-Routine ins RAM kopiert. Hierbei bleibt das Low-Byte der Interrupt-Startadresse gleich ($OE), so daß später nur die High-Bytes der Interrupt-Vektoren geändert werden müssen, um den Interrupt auf unsere eigene Routine zu lenken.
- Machen Sie nun noch vom Monitor aus folgende Änderung: A 1015 JSR $1060.
Damit wird der Raster-Interrupt auf die eigene Routine umgelenkt.
- Zur Initialisierung müssen Sie jetzt noch folgendes kurzes Maschinenprogramm eingeben:
| A 10C5 | SEI | |
| A 10C6 | LDA#$10 | (Interrupt auf eigene Routine lenken) |
| A 10C8 | STA$0313 | |
| A 10CB | STA$0315 | |
| A 10CE | CLI | |
| A 10CF | LDA#$11 | (Basic-Start auf $1100 heraufsetzen) |
| A 10D1 | STA $2C | |
| A 10D3 | LDA#$00 | |
| A 10D5 | STA $1100 | |
| A 10D8 | PLA | |
| A 10D9 | PLA | |
| A 10DA | JMP $8A7B | (NEW/CLR ausführen) |
- Verlassen Sie jetzt den Monitor mit »X« und machen Sie im Direktmodus folgende Eingaben:
POKE 4185,129:POKE 4203,131:POKE 4238,131
Damit ist das kleinstmögliche Grafikfenster eingestellt.
- Rufen Sie wieder den Monitor auf. Speichern Sie das fertige Programm mit:
S "GRAFIKFENSTER",8,1001,10DD
Dadurch wird jetzt die vorher eingegebene Basic-Zeile zusammen mit der kopierten Maschinenroutine als zusammenhängendes Programm gespeichert und später als solches auch wieder geladen.
Kassettenbenutzer müssen statt der »8« natürlich eine »1« einsetzen.
Das so gespeicherte Programm können Sie nun einfach mit »LOAD ’’GRAFIKFENSTER" ,8« (beziehungsweise mit »LOAD "GRAFIKFENSTER",1 für Datasette) laden und mit »RUN« starten. Dabei wird automatisch der Basic-Start um 256 Byte nach oben gesetzt. Danach können Sie Basic-Programme eingeben oder laden, als ob nichts geschehen wäre. Sobald Sie aber »GRAPHIC 2« oder »GRAPHIC 4« eingeben, sehen Sie, daß jetzt nicht mehr fünf sondern neun Textzeilen sichtbar werden. Dies wurde durch die POKE-Befehle erreicht, die einfach dafür sorgen, daß bei einer früheren Rasterzeile als sonst in den Text-Modus zurückgeschaltet wird. Weitere POKE-Möglichkeiten entnehmen Sie bitte der Tabelle. Sie können damit jederzeit von Basic aus die Größe des Grafikfensters ändern.
Wichtiger Hinweis:
Sowohl bei der Eingabe als auch beim Laden des Programms muß der Basic-Start unbedingt auf seinem Normalwert sein! Ansonsten liegt die am Anfang eingegebene Basic-Zeile nicht an der richtigen Stelle im Speicher. Drücken Sie also am besten einmal auf den Reset-Knopf. Dies ist besonders wichtig für Besitzer eines Plus/4 oder eines C 16 mit RAM-Erweiterung, da hier beim erstmaligen Einschalten der Grafik der Basic-Start automatisch um 12 KByte heraufgesetzt wird!
Tabelle:
In nachfolgender Tabelle ist aufgeführt, welchen Effekt man erzielt, wenn man durch POKE-Befehle die Größe des Grafikfensters ändern will. Dazu müssen Sie jeweils in die Speicherstellen 4203 und 4238 den Wert von X, und in Speicherstelle 4185 den Wert von X minus 2 POKEn.
| X | Anzahl Textzeilen | |
|---|---|---|
| 131 | 9 | kleinstmögliches Grafikfenster |
| 139 | 8 | |
| 147 | 7 | |
| 155 | 6 | |
| 163 | 5 | normal |
| 171 | 4 | |
| 179 | 3 | |
| 187 | 2 |
Ein besonderer Effekt läßt sich erzielen, wenn man den Wert in 4238 auf X plus 1 setzt. Hier wartet nämlich das Interrupt-Programm, bis der Rasterstrahl den eigentlichen Umschaltpunkt erreicht hat. Dadurch wird ein flimmerfreies Umschalten möglich. Erhöht man nun diesen Wert, so wartet der Interrupt mit dem Einschalten des Textbildschirms noch eine Rasterzeile »lang«, obwohl der Grafikbildschirm bereits ausgeschaltet wurde. Resultat ist eine schwarze Trennlinie zwischen Grafik und Text, die entsteht, während sich der Video-Chip im »Niemandsland« zwischen Text und Grafik befindet.
(Michael Schmand/tr)