»Windows« für den C 64
Dieses Programm für den C 64 stellt vier Speicher für Bildschirminhalte im Text/Blockgrafikmodus zur Verfügung. Da diese Speicher im RAM »unterhalb« des Betriebssystems liegen, beanspruchen sie keinen zusätzlichen Speicherplatz. Das Programm ist in Maschinensprache geschrieben und durch Verwendung eines Verschiebeladers in verschiedenen Speicherbereichen lauffähig.
Besonders in größeren Programmen ist es oft wünschenswert, zwischen mehreren Bildschirmen umschalten zu können oder aber Fenster mit Zusatzinformationen in den laufenden Bildschirm einblenden zu können, ohne jedoch seinen ursprünglichen Inhalt zu zerstören. Um dies zu ermöglichen, stellt das Programm vier Speicher zur Verfügung, in denen komplette Bildschirminhalte oder Teile daraus abgelegt werden können. Ein Speicher belegt einen Bereich von 2 KByte, jeweils ein KByte für Zeichen und Farbe. Da diese Speicher unterhalb des Betriebssystems im RAM ab Adresse $E000 untergebracht sind, beanspruchen Sie keinerlei zusätzlichen Platz.
Anwendung
Das Programm bietet folgende Betriebsarten:
- STORE: SYS BA,NR,XO,YO,FB,FH Speichern
- RECALL: SYSBA+3,NR Rückholen
- SWAP: SYSBA+6,NR Austauschen
Die Parameter haben folgende Bedeutung:
BA = Basisadresse des Programms (siehe unten)
NR = Nummer des angesprochenen Speichers (0…3)
X0,Y0 = Position der linken oberen Ecke des zu speichernden Bereiches (0..39,0..24)
FB = Breite des Bereiches(1…40)
FH = Hohe des Bereiches(1…25)
Die Fensterseite (Höhe) darf nur bis zum rechten (unteren) Bildrand reichen. Wenn zum Beispiel die linke obere Ecke auf die Koordinate X = 10und Y = 5 gesetzt ist, so ist die maximale Fensterbreite 30 und die maximale Fensterhöhe 20. Falsche Angaben für die Parameter erzeugen die Fehlermeldung »ILLEGAL QUANTITY ERROR«.
STORE: Um einen kompletten Bildschirm abzuspeichern, geben Sie folgendes ein: SYS BA,NR,0,0,40,25. Mit anderen Parametern erzeugen sie ein Bildschirmfenster, das bei RECALL auch nur den durch diese Parameter definierten Bereich überschreibt. Darum bleibt der ursprüngliche Bildschirm erhalten.
RECALL: Es ist nur die Angabe der Speichernummer nötig. Der gespeicherte Bereich wird an seine ursprüngliche Position zurückgeschrieben.
SWAP: Wenn Sie ein schon vorher vorbereitetes und im Speicher stehendes Informationsfenster in den aktuellen Bildschirm einblenden, wird dessen ursprünglicher Inhalt zerstört. Um ihn zu erhalten, müßten Sie ihn vor der Einblendung in einen noch freien Speicher retten. SWAP erleichtert die Arbeit und spart Speicherplatz, indem es die Inhalte von aktuellem Schirm und Speicher austauscht. Mit einmal SWAP rufen sie den Speicher ab, noch einmal SWAP erzeugt wieder das ursprüngliche Bild. Die Information über Position und Größe des auszutauschen Bereiches liefert das Bild im Speicher. SWAP wird daher nur mit der Speichernummer aufgerufen.
Noch ein Hinweis: Vermeiden Sie es, mit RECALL oder SWAP einen Speicher aufzurufen, in den noch nichts hineingeschrieben wurde, dies würde zum Absturz des Programms führen (siehe: Kompatibilität zu Simons-Basic). Der Basic-Lader initialisiert alle 4 Speicher, um einer Fehlbedienung vorzubeugen.
Laden des Programmes
Die Verschieberoutine des Basic-Laders gestattet es, das Programm auf den Anfang jeder (sinnvollen) Speicherseite zu legen. Nach dem Start bietet der Lader die Optionen:
1 RAM-Ende normales Basic ($9E00)
2 RAM-EndeSimons-Basic ($7E00)
3 Geschützter Bereich ($C000)
>7 Eingabe der Startseite
Die Optionen 1 bis 3 setzen den Programmanfang auf die angegebene Adresse, bei Eingabe einer Zahl > 7 wird diese als die Nummer derjenigen Speicherseite interpretiert, wo das Programm abgelegt werden soll.
Aus der Nummer der Speicherseite erhält man durch Multiplikation mit 256 die noch fehlende Basisadresse. Das Ladeprogramm gibt sie am Schluß mit aus.
Der Vektor für die Basic-Obergrenze in (55),(56) wird entsprechend der Startadresse des Maschinenprogramms heruntergesetzt, sofern das Programm nicht im geschützten Bereich untergebracht ist. Beachten Sie, daß Sie diesen Vektor nach einem Reset beziehungsweise STOP/RESTORE korrigieren, sonst wird das Programm überschrieben.
Im Programmlisting erkennen Sie zwei Unterschiedlich umfangreiche Blocks von DATA-Zeilen. Der erste, große Block stellt das eigentliche Programm dar, der kleine ist eine Liste von Adressen, welche relativ zum Programmanfang diejenigen Bytes angeben, die bei einer Verschiebung korrigiert werden müssen. Der Korrekturwert ergibt sich aus der Differenz zwischen der Startadresse, mit der das Programm assembliert wurde ($9E00=Speicherseite 158) und der gewünschten Startseite. Die beiden Blocks besitzen eigene Checksummen und OK-/Fehlermeldungen.
Kompatibilität zu Simons-Basic
»Bildspeicher« ist auch eine hilfreiche Erweiterung der Simons-Basic-Befehle für die Bildschirmsteuerung. Es sind jedoch folgende Punkte zu beachten:
- Die Hires-Grafik überschreibt alle vier Speicher. Diese müssen daher vor einem Zugriff mit »RECALL« oder »SWAP« unbedingt neu beschrieben werden.
- Der geschützte Bereich ab $C000 wird ebenfalls von Hires überschrieben, so daß »Bildspeicher« in Programmen, welche die Hires-Grafik benützen, am Basic-RAM-Ende untergebracht werden muß (Option 2).
Ob Sie jedoch nun mit oder ohne Simons-Basic arbeiten, in jedem Falle ist »Bildspeicher« eine nützliche Routine, die auch dem C 64-Besitzer das Fenster zum »Windowing« aufstößt.
(Hans-Herbert Hagedorn / ev)100 rem ********************** 110 rem * * 120 rem * bildspeicher * 130 rem * * 140 rem * h.h.hagedorn * 150 rem * * 160 rem * rupprechtstr.30 * 170 rem * * 180 rem * 83 landshut * 190 rem * * 200 rem * tel. 0871/67337 * 210 rem * * 220 rem ********************** 230 : 240 print"{clr}":print:print 250 print" {rvon}bildspeicher-position " 260 print:print" normal-basic = $9e00 (1)" 265 print:print" simons-basic = $7e00 (2)" 270 print:print" gesch.bereich= $c000 (3)" 275 print:print" page-adresse eingeben (>7)" 280 print:print tab(25):input l 290 if l=1 then l=158 300 if l=2 then l=126 305 if l=3 then l=192 310 if l>7 and l<255 then d=158-l:goto 320 315 print"???":goto 280 320 poke2,d+100:poke780,l:if l<161 then poke 56,l:poke55,0 325 clr:i=peek(780)*256:j=i 330 read a:ifa>=0then poke i,a:i=i+1:s=s+a:goto330 340 if s<>51530 then print"datenfehler",s:end 345 print"programmdaten ok":s=0:d=peek(2)-100:if d=0 then 380 350 read p:if p>=0 then a=j+p:pokea,peek(a)-d:s=s+p:goto350 360 ifs<>8737 then print"blockkorrekturfehler",s:end 370 print:print"blockkorrektur ok" 380 print:print"basisadresse = ";j 385 for i=0 to 3:sys j,i,0,0,40,25:next 390 data 076,009,158,076,087,158,076,091 400 data 158,032,110,158,224,004,176,066 410 data 142,163,159,032,110,158,224,040 420 data 176,056,142,159,159,032,110,158 430 data 224,025,176,046,142,160,159,032 440 data 110,158,224,000,240,036,024,138 450 data 109,159,159,201,041,176,027,202 460 data 142,161,159,032,110,158,224,000 470 data 240,016,024,138,109,160,159,201 480 data 026,176,007,142,162,159,032,116 490 data 158,096,162,014,076,058,164,169 500 data 000,240,002,169,255,141,166,159 510 data 032,110,158,224,004,176,235,142 520 data 163,159,032,197,158,096,032,253 530 data 174,076,158,183,032,005,159,032 540 data 076,159,160,003,185,159,159,145 550 data 091,136,016,248,024,165,091,105 560 data 004,133,091,174,162,159,172,161 570 data 159,177,087,145,091,177,089,145 580 data 093,136,016,245,032,112,159,202 590 data 208,236,096,172,161,159,177,087 600 data 072,177,091,145,087,104,145,091 610 data 177,089,072,177,093,145,089,104 620 data 145,093,136,016,233,032,112,159 630 data 202,208,224,240,059,120,165,001 640 data 072,169,053,133,001,032,076,159 650 data 160,003,177,091,153,159,159,136 660 data 016,248,032,005,159,024,169,004 670 data 101,091,133,091,174,162,159,173 680 data 166,159,208,183,172,161,159,177 690 data 091,145,087,177,093,145,089,136 700 data 016,245,032,112,159,202,208,236 710 data 104,133,001,088,096,032,067,159 720 data 024,172,160,159,240,016,173,164 730 data 159,105,040,141,164,159,144,003 740 data 238,165,159,136,208,240,024,173 750 data 164,159,109,159,159,141,164,159 760 data 133,087,133,089,144,003,238,165 770 data 159,024,173,136,002,109,165,159 780 data 133,088,024,169,216,109,165,159 790 data 133,090,096,169,000,141,164,159 800 data 141,165,159,096,169,000,133,091 810 data 133,093,169,224,133,092,169,228 820 data 133,094,174,163,159,240,016,024 830 data 160,008,152,101,092,133,092,152 840 data 101,094,133,094,202,208,243,096 850 data 024,169,040,101,087,133,087,144 860 data 002,230,088,024,169,040,101,089 870 data 133,089,144,002,230,090,056,173 880 data 161,159,101,091,133,091,144,002 890 data 230,092,056,173,161,159,101,093 900 data 133,093,144,002,230,094,096,000 905 data -1 910 rem korrekturtabelle 920 : 930 data 002,005,008,011,018,021 940 data 028,031,038,041,050,058 950 data 061,070,077,080,095,098 960 data 105,108,118,121,126,141 970 data 144,158,165,191,207,214 980 data 220,230,233,238,252,263 990 data 267,272,277,282,289,292 1000 data 295,304,311,319,327,330 1010 data 348,393,405,-1