C 64
Windows

»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:

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:

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
Listing «Bildspeicher«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →