C 64
Tips & Tricks

Ziffern und Zeiger auf dem C 64

Digitaluhren sind out. Um dem Trend der Zeit zu folgen, haben wir für Sie eine »Analog-Uhr« auf dem C 64 installiert.

Es sind schon etliche Versionen von Digitaluhren auf dem C 64 veröffentlicht worden. Zur Abwechslung haben wir diesmal eine Interrupt-gesteuerte Analoguhr für Sie. Das Programm blendet ein klassisches Ziffernblatt mit Zeigern in die rechte obere Ecke des Bildschirms ein.

Hinweise zum Eintippen. Geben Sie zuerst das Maschinenprogramm »UHR PRG.« (Listing 1) mit dem MSE ein, und speichern Sie es. Dann tippen Sie »UHR SPRITEGEN« (Listing 2) mit dem Checksummer ab und speichern es ebenfalls. Starten Sie »UHR SPRITEGEN«. Dieses lädt zuerst das Maschinenprogramm und berechnet danach die Sprite-Daten für die Uhr und die Zeiger. Nach etwa vier Minuten werden die Spritedaten inklusive der Interruptroutine auf Diskette gespeichert. Das Programm wird dann mit LOAD "ANALOGUHR",8,1 geladen.

Zum Programm. Die Uhr wird durch »SYS 40000,hh,mm,ss« eingeschaltet. Dabei bedeuten hh, mm, ss jeweils Stunden, Minuten und Sekunden mit je zwei Ziffern (Zum Beispiel »SYS 40000,15,05,00« stellt die Uhr auf 15:05,00). Der Bildschirmspeicher liegt jetzt von 35840 bis 36839 und der Basic-Speicher wird auf etwa 33000 Bytes begrenzt. Durch RUN/STOP-RESTORE wird die Uhr abgeschaltet und der Bildschirm liegt wieder bei 1024. Das Ziffernblatt und die drei Zeiger bestehen aus Sprites, die von der neuen Interrupt-Routine gesteuert werden. Diese Routine liest bei jedem Interrupt die »time-of-day«-Register der CIA 1, berechnet für jeden Zeiger die Bildschirmposition und setzt die Spritpointer. Dann wird zum normalen Interrupt des Betriebssystems gesprungen.

Programmbeschreibung: Das Basic-Programm »UHR SPRITEGEN« besteht hauptsächlich aus drei Schleifen. In den Zeilen 160-260 werden die Zeigersprites erzeugt. Die IF-Zeilen bestimmen die Startkoordinaten der Linien. Durch READ in Zeile 220 werden die Endkoordinaten aus dem ersten Datenblock gelesen. Die aufgerufenen Unterprogramme löschen das zu bearbeitenden Sprite (460), ziehen eine Linie im Sprite (370) und übertragen das Sprite in den endgültigen Speicher unter dem Basic-ROM (480). In den Zeilen 270-290 werden die Daten für die vier Sprites, die das Zifferblatt darstellen, gelesen und gePOKEt. Zeile 300 liest die Daten für das Maschinenprogramm, das das Programm »ANALOGUHR« speichert. Dieses wird in Zeile 310 aufgerufen. Das Unterprogramm Zeile 340-360 setzt einen Punkt im bearbeiteten Sprite, in Zeile 380-440 werden die Punkte für eine Linie (X1, Y1, X2, Y2) berechnet und gesetzt. Zeile 460 löscht das Arbeitssprite. In Zeile 480 werden die Spritedaten in den Speicherbereich, entsprechend der Variablen »W«, die in Zeile 240 berechnet wird, übertragen. Die Datazeilen enthalten die X2,Y2-Koordinaten der Zeiger, die Daten für das Zifferblatt und für die Speicherroutine.

Das Maschinenprogramm »UHR PRG.« arbeitet folgendermaßen: nach SYS 40000 wird zuerst die Uhr in CIA I gestellt, der Bildschirm verschoben und die Spriteregister des VIC initialisiert. Dann wird der Basic-Speicher begrenzt und der NMI- und IRQ-Vektor verbogen. Anschließend wird zum Basic-Warmstart gesprungen. Die neue NMI-Routine setzt nur den Bildschirm wieder zurück, dann wird zum »Restore« des Betriebssystems gesprungen.

Das eigentliche Steuerprogramm ist eine neue Interruptroutine. Zuerst wird die Stunde gelesen, von BCD in binär umgewandelt, und daraus die vorläufige Spritenummer für den Stundenzeiger berechnet. Außerdem wird die Spriteposition des Stundenzeigers berechnet (Stunde <3 ≙ rechtes oberes Viertel, Stunde <6 ≙ rechtes unteres Viertel etc.). Dann werden die Minuten gelesen, umgerechnet und die Position des Minutenzeigers berechnet. Wenn die Minuten größer oder gleich 30 sind, wird der Stundenzeiger um eine halbe Stunde vorgerückt. Schließlich wird noch der Sekundenzeiger nach der gleichen Methode gesetzt. Bevor zur IRQ-Routine des Betriebssystems gesprungen wird, muß noch das Zehntelsekunden-Register gelesen werden, um die Uhr wieder freizugeben.

(M. Michaelis/og)
PROGRAMM : UHR PRG.       9C40 9E4C
-----------------------------------
9C40 : AD 0F DC 29 7F 8D 0F DC   2B
9C48 : AD 0E DC 09 80 8D 0E DC   BB
9C50 : A2 03 D0 03 20 73 00 20   E6
9C58 : FD AE 38 E9 30 0A 0A 0A   87
9C60 : 0A 85 FD 20 73 00 38 E9   9C
9C68 : 30 05 FD C9 60 90 03 4C   03
9C70 : 48 B2 E0 03 D0 0D C9 24   8F
9C78 : B0 F5 C9 12 90 05 18 F8   5B
9C80 : 69 68 D8 9D 08 DC CA D0   3B
9C88 : CB 8E 08 DC A9 34 8D 18   DB
9C90 : D0 A9 95 8D 00 DD A9 8C   FB
9C98 : 8D 88 02 A9 FF 8D 15 D0   81
9CA0 : 8D 10 D0 8E 29 D0 A9 01   FD
9CA8 : 8D 28 D0 8D 2A D0 8D 2B   E5
9CB0 : D0 8D 2C D0 8D 2D D0 8D   0D
9CB8 : 27 D0 A9 8C 85 34 85 38   C4
9CC0 : 78 A9 21 8D 14 03 A9 9D   42
9CC8 : 8D 15 03 A9 19 8D 18 03   3A
9CD0 : A9 9D 8D 19 03 68 68 58   94
9CD8 : A9 22 8D 06 D0 8D 0A D0   FA
9CE0 : A9 3A 8D 0C D0 8D 08 D0   C6
9CE8 : A9 38 8D 07 D0 8D 09 D0   31
9CF0 : A9 4D 8D 0B D0 8D 0D D0   54
9CF8 : A9 D4 8D FB 8F A9 D5 8D   A7
9D00 : FC 8F A9 D6 8D FD 8F A9   63
9D08 : D7 8D FE 8F A9 93 20 D2   B5
9D10 : FF A9 80 8D 00 A0 4C 74   D5
9D18 : A4 A9 04 8D 88 02 4C 66   DA
9D20 : FE 78 AD 0B DC 29 1F 20   FB
9D28 : 30 9E AA 0A 18 69 BC 85   5E
9D30 : FD 8A C9 09 90 0E AD 4A   CB
9D38 : 9E 8D 00 D0 AD 4B 9E 8D   82
9D40 : 01 D0 D0 30 C9 06 90 0E   0F
9D48 : AD 48 9E 8D 00 D0 AD 49   42
9D50 : 9E 8D 01 D0 D0 1E C9 03   3A
9D58 : 90 0E AD 46 9E 8D 00 D0   1B
9D60 : AD 47 9E 8D 01 D0 D0 0C   FC
9D68 : AD 44 9E 8D 00 D0 AD 45   58
9D70 : 9E 8D 01 D0 AD 0A DC 20   0E
9D78 : 30 9E AA 09 80 8D F9 8F   3F
9D80 : 8A C9 2D 90 15 AD 4A 9E   71
9D88 : 8D 02 D0 AD 4B 9E 8D 03   E6
9D90 : D0 A9 01 05 FD 8D F8 8F   65
9D98 : D0 41 C9 1E 90 15 AD 48   38
9DA0 : 9E 8D 02 D0 AD 49 9E 8D   5A
9DA8 : 03 D0 A9 01 05 FD 8D F8   06
9DB0 : 8F D0 28 C9 0F 90 13 A5   F8
9DB8 : FD 8D F8 8F AD 46 9E 8D   4E
9DC0 : 02 D0 AD 47 9E 8D 03 D0   83
9DC8 : D0 11 AD 44 9E 8D 02 D0   15
9DD0 : AD 45 9E 8D 03 D0 A5 FD   C2
9DD8 : 8D F8 8F AD 09 DC 20 30   D3
9DE0 : 9E AA 09 80 8D FA 8F 8A   2A
9DE8 : C9 2D 90 0E AD 4A 9E 8D   F0
9DF0 : 04 D0 AD 4B 9E 8D 05 D0   3D
9DF8 : D0 30 C9 1E 90 0E AD 48   D7
9E00 : 9E 8D 04 D0 AD 49 9E 8D   3B
9E08 : 05 D0 D0 1E C9 0F 90 0E   E1
9E10 : AD 46 9E 8D 04 D0 AD 47   46
9E18 : 9E 8D 05 D0 D0 0C AD 44   85
9E20 : 9E 8D 04 D0 AD 45 9E 8D   3B
9E28 : 05 D0 AD 08 DC 4C 31 EA   CC
9E30 : AA 4A 4A 4A 4A A8 8A 29   42
9E38 : 0F C0 00 F0 06 18 69 0A   A0
9E40 : 88 D0 FA 60 36 39 36 4D   9C
9E48 : 22 4D 22 39               0D
Listing 1. Das Maschinenprogramm »UHR PRG.« Bitte mit dem MSE eingeben.
100 rem   ***  analoguhr ***
110 rem   marc michaelis
120 rem   pfarrhoehe 11
130 rem   8507 oberasbach
140 rem
150 ifa=0thena=1:load"uhr prg.",8,1
160 forj=0to83
170 ifj=0orj=60thenx1=0:y1=20
180 ifj=15orj=66thenx1=0:y1=0
190 ifj=30orj=72thenx1=20:y1=0
200 ifj=45orj=78thenx1=20:y1=20
210 gosub460
220 readx2,y2
230 gosub370
240 w=40960+64*j
250 gosub480
260 next
270 forj=46336to46591
280 reada:pokej,a
290 next
300 forj=832to880:reada:pokej,a:next
310 sys 832
320 end
330 rem plot
340 q=y*3+int(x/8)+832:q1=2^(7-(x-int(x/8)*8))
350 pokeq,peek(q)orq1
360 return
370 rem linie ziehen (x1,y1,x2,y2)
380 ifabs(x2-x1)<5then420
390 fori=x1tox2step(x2-x1)/20
400 y=int((y2-y1)/(x2-x1)*(i-x1)+y1)
410 x=int(i):gosub330:next:return
420 fori=y1toy2step(y2-y1)/20
430 x=int(((x2-x1)/(y2-y1)*(i-y1)+x1))
440 y=int(i):gosub330:next:return
450 rem loeschen sprite
460 fori=832to896:pokei,0:next:return
470 rem uebertragen sprite
480 fori=0to63:pokew+i,peek(832+i):next:return
490 rem data fuer zeiger ( x und y )
500 data0,0,2,0,4,1,6,1,8,2,10,3,12,4,13,5,15,7,16,8,17,10,18,12,19,14,19,16
510 data20,18
520 data20,0,20,2,19,4,19,6,18,8,17,10,16,12,15,13,13,15,12,16,10,17,8,18,6,19
530 data4,19,2,20
540 data20,20,18,20,16,19,14,19,12,18,10,17,8,16,7,15,5,13,4,12,3,10,2,8,1,6
550 data1,4,0,2
560 data0,20,0,18,1,16,1,14,2,12,3,10,4,8,5,7,7,5,8,4,10,3,12,2,14,1,16,1,18,0
570 data 0,10,3,10,5,11,7,13,9,15,10,17
580 data10,0,10,3,9,5,7,7,5,9,3,10
590 data20,10,17,10,15,9,13,7,11,5,10,3
600 data 10,20,10,17,11,15,13,13,15,11,17,10
610 rem zifferblatt sprites
620 data0,0,255,0,7,8,0,24,8,0,32,0,0,224,85,1,16,37,2,0,85,4,84,0,4,36,0,8
630 data84,0,8,0,0,24,0,0,37,64,0,32,128,0,65,64,0,64,0,0,64,0,0,128,0,0,128
640 data0,0,128,0,0,138,128,0,239,128,0,0,112,0,0,12,0,0,2,0,0,3,128,0,4,64
650 data0,0,32,0,16,16,0,16,8,0,16,4,0,0,4,0,0,6,0,0,169,0,0,161,0,0,160,128
660 data0,0,128,0,0,128,0,0,64,0,0,64,0,0,64,0,84,64,200,233,0,8,138,128,0
670 data128,0,0,128,0,0,128,0,0,85,80,0,85,80,0,73,80,0,32,0,0,36,0,0,24,0
680 data0,8,170,0,8,170,0,4,74,0,2,0,42,1,16,42,0,224,18,0,32,0,0,24,8,0,7
690 data8,0,0,255,141,0,85,192,0,84,64,0,0,64,0,0,64,0,0,64,2,160,128,2,160
700 data128,2,64,128,0,1,0,0,9,0,0,6,0,40,4,0,40,4,0,16,24,0,0,32,0,4,64,0
710 data3,128,0,2,0,0,12,0,0,112,0,0,128,0,0,0
720 rem daten fuer abspeicherroutine
730 data169,54,133,1,162,8,32,186,255,169,9,162,104,160,3,32,189,255,169,64
740 data133,251,169,156,133,252,169,251,162,0,160,182,32,216,255,169,55,133
750 data1,96,65,78,65,76,79,71,85,72,82
Listing 2. Das Basic-Programm »UHR SPRITEGEN« erzeugt die nötigen Sprites der Uhr, verbindet diese mit dem Maschinenprogramm und speichert beides als »ANALOGUHR« auf Diskette
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →