Verschiedenes
BRKKEY
ist ein Flag, das gesetzt wird, wenn das OS ein Drücken der BREAK-Taste registriert.
Der normale Wert von BRKKEY ist $FF. ƒndert er sich, so wurde die BREAK-Taste gedrückt.
Der hierfür zuständige IRQ (nicht identisch mit dem IRQ für die softwaremäßige
BRK-Anweisung) muß eingeschaltet werden, damit das OS die BREAK-Taste abfragen
kann.
Der
Timeout-Wert des Druckers wird in der Speicherstelle PTIMOT
gespeichert. Sie enthält den Wert der Timeaut-Periode für SIO in Sekunden.
Diese Zeit kann durch ƒndern des Wertes in PTIMOT beliebig verlängert oder verkürzt
werden. PTIMOT wird auf 30 Sekungen initialisiert; dies geschieht bei jedem ÷ffnen
(OPEN) des Druckers. Der normale Timeout-Wert für den 825-Drucker beträgt
5 Sekunden.
1 POKE 752,1:BOTO
3
3 ? "<":REM
Bildschirm loeschen
4 ? "Stunde";:INPUT
HOUR:? "Minute";:INPUT MIN:? "Sekunde";:INPUT SEC
5 CMD=1:GOSUB 65
6 ?" ";HOUR;":";MIN;":";SEC:?"
":?" "
7 CMD=2:GOSUB 65
9 ?"";HOUR;":";MIN;":";SEC;"
":GOTO 7
10 REM Dies ist ein
Beispiel fuer die Erstellung einer
20 REM Echtzeit-Uhr.
Diese Routine erwartet die Eingabe
30 REM einer Zeit
(Std., Min., Sec.).Danach wird die Echt-
40 REM zeit-Uhr auf
0 gesetzt. Der augenblickliche Wert
50 REM in RTCLOCK
wird benutzt, damit durch Addieren zum
60 REM Wert der Echtzeit-Uhr
die aktuelle Zeit entsteht.
65 HIGH=1536:MED=1537:LDW=1538
66 REM
67 REM *****Einsprungpunkt*****
68 REM
70 ON CMD BOTO 100,200
80 REM
90 REM *****Uhr initialisieren*****
95 REM
100 POKE 20,0:POKE19,0:POKE18,0
105 DIM CLOCK$(50)
106 CLOCK$="
":GOSUB 300
110 IHOUR=HOUR:IMIN=MlN:ISEC=SEC:RETURN
197 REM
198 *****Uhr lesen*****
199 REM
200 REM
201 A=USR(ADR(CLOCK$))
210 TIME=((PEEK(HIGH)*256+PEEK(MED))*256+(PEEK(LOW))/50
220 HOUR=INT(TIME/3600):TIME=TIME-(HOUR*3600)
230 MIN=INT(TIME/60):SEC=INT(TIME-(min*60))
235 SEC=SEC+ISEC:IF
SEC>60 THEN SEC=SEC-60:MIN=MIN+l
236 MIN=MIN+IMIN:IF
MIN>60 THEN MIN=MIN-60:HOUR=HOUR+l
237 HOUR=HOUR+IHOUR
240 HOUR=HOUR-(INT(HOUR/24))*24
250 RETURN
300 FOR I=l TO 38:READ
Z:CLOCK$(I,I)=CHR$(Z):NEXT I:RETURN
310 DATA 104,165,18,141,0,6,165,19,141,1,6,165
320 DATA 20,141,2,6,165,18,205,0,6,208,234
330 DATA 165,19,205,1,6,208,227,165,20,205,2,6,209,220,96
Abbildung
8.13:
Echtzeit-Uhr
DIE
SYSTEM-TIMER
Es
gibt zwei Arten von Timern. Die System-Timer besitzen die Bildschirm-Frequenz. Für
nordamerikanische Fernsehgeräte beträgt diese Frequenz 59,923334 Hertz.
Europäische Geräte haben eine Frequenz von 50 Hertz. Die POKEY-Timer arbeiten
mit durch den Benutzer veränderlichen Frequenzen.
Es gibt 6 System-Timer:
Name Speicherstelle
Vektor/Flag
RTCLOK $0012,3
keine
CDTMV1 $0218,2
CDTMA1 $0226,2
CDTMV2 $021A,2
CDTMA2 $0228,2
CDTMV3 $021C,2
CDTMA3 $022A,1
CDTMV4 $021E,2
CDTMA4 $022C,1
CDTMV5 $0220,2
CDTMA5 $022E,1
Alle
System-Timer werden als Teil des Vertical-Blanks VBLANK) aktualisiert. Wenn dieses
ausgeschaltet oder umgangen wird, werden die Timer nicht mehr geändert.
Die
Echtzeit/Uhr (RTCLOK) und der System-Timer Nr. 1 (CDTMV1) werden während der
ersten Stufe des VBLANKs auf den neuesten Stand gebracht. RTCLOK zählt von 0
an aufwärts und ist ein 3-Byte-Wert. Wenn RTCLOK seinen maximalen Wert erreicht
(16.777.216), so wird dieser wieder auf Null zurückgesetzt. In Beispiel 8.13
wird eine Anwendung für RTCLOK gezeigt.
Da
die System/Timer als ein Teil des VBLANK-Prozesses aktualisiert werden, ist besondere
Aufmerksamkeit erforderlich, damit dieses korrekt geschieht. Eine mit SETVBV (.$E45C.)
bezeichnete Routine wird benutzt, um sie zu setzen. Der Aufruf dieser Routine sieht
wie folgt aus:
Register X & Y
: Timer-Wert
Register A
: Nummer des Timers: A=l bis 5=> Timer Nr. 1-5
Beispiel:
LDA #1 ; Setzen des System-Timers
Nr. 1
LDY #0
LDX $02 ; Der Wert beträgt
$200 VBLANKs.
JSR SETVBV ;Aufrufen
der Routine zum Setzen der Timer
5 ? " ":REM
Bildschirm löschen
6 REM Routine zum
Setzen einer Metronom-Rate.
7 REM Von M. Ekbers
für Carla.
10 X=10:FOR I=l TO
2 STEP 0
20 TOP=l0:FOR J=l
TO TOP:NEXT J:REM Verzögerungs-Schleife
50 IF STICK(0)=l3
THEN X=X+1:REM Nach oben = schneller
51 IF STICK (0)=14
THEN X=X-1:REM Nach unten = langsamer
52 IF X<l THEN
X=1:REM X darf niemals kleiner als 1 oder
53 IF X>255 THEN
X=255:REM grösser als 255 sein.
54 REM
56 ?"";INT(3600/X);"
Schläge pro Minute
"
60 POKE 0,X:REM In
Speicherstelle $0000 steht die Rate
70 NEXT I:REM für
die folgende Assembler-Routine.
-------------------------------------------------------------
40
*=$600
50 ; Metronom-Routine...benutzt
$0000 zum Uebersetzen d. Rate.
60 ;
70 AUDF1
= $D200 Audio Frequenz-Register
80 AUDC1
= $D201 Audio Kontroll-Register
90 FREG
= $08 AUDF1-Wert
0100 VOLUME
= $AF WERT VON AUDC1
0110 OFF
= $A0 Lautstaerke ausschalten
0120 SETVBV
= $E45C Routine zum Setzen
des Timer-Wertes
0130 CDTMA2
= $0228 Vektor von Timer
2
0140 ZTIMER
= $0000 VBLANK-Wert des Timers
in Zero-Page
0150 ;
0160 START
LDA #10
0170
STA ZTIMER
0180 INIT
0190 ; Setzen des
Timer-Vektors
0200 ;
0210
LDA #CNTINT&255
0220
STA CDTMA2
0230
LDA #CNTINT/256
0240
STA CDTMA2+1
0250 ;
0260 ; Setzen dem
Timers nach dem Voktor
0270 ;
0290
LDY ZTIMER Setzen
von Timer 2 auf Zaehler
0290
JSR SETIME
0300
RTS
0310 ;
0320 ;
0330 ;
0340 CNTINT
0350 ;
0360 ; Bereitmachen
das Audio-Kanals für "Klick"-
0370 ; Geraeusch
0380
LDA #VOLUME
0390
STA AUDC1
0400
LDA #FREQ
0410
STA AUDF1
0420
LDY #$FF
0430 DELAY
0440
DEY
0450
BNE DELAY
0460
STY AUDC1
0470
JMP INIT
0480 ;
0490 ; Unterroutine
zum Setzen das Timers
0500 ;
0510 SETIME
0520
LDX #0
Niemals 256 VBLANKs
0530
LDA #2
Setzen von Timer 2
0540
JSR SETVBV System-Routine
zum Setzen
0550
RTS
der Timer
0560
*=$2E2
0570
.WORD START
0580
.END
Abbildung
8. 14:
Metronom
Die
System-Timer 1 bis 5 sind 2-Byte Zähler. Sie können mit Hilfe der SETVBV-Routine
auf einen bestimmten Wert gesetzt werden. Sie werden dann während des VBLANKs
durch das OS dekrementiert. Timer 1 wird in der 1. Stufe des immediate VBLANKs dekrementiert.
Bei den Timern 2 bis 5 geschieht dieses während des immediate VBLANKs in der
2. Stufe. Wenn ein bestimmter Timer auf den Wort 0 heruntergezählt wurde, werden
verschiedene Aktionen vom OS durchgeführt.
Die
System-Timer 1 und 2 besitzen ihnen zugeordnete Vektoren. Erreicht einer dieser Timer
den Wert 0, dann simuliert das OS einen JSR-Befehl über den entsprechenden Vektor.
In Abbildung 8.9b stehen die Werte der Vektoren für diese beiden Timer.
Die
Timer 3 bis 5 besitzen Flags, die normalerweise gesetzt sind, d.h. einen anderen
Wert als Null aufweisen. Sobald einer dieser Timer gleich Null ist,löscht das
OS das entsprechende Flag, d.h. es setzt es auf 0. Das Flag kann durch den Benutzer
geprüft werden, woraufhin dieser dann bestimmte Operationen einleiten kann.
Die
Timer 1 bis 5 sind Software-Timer für allgemeine Verwendung. Timer 1 wird z.B.durch
die SIO zum Timing von Operationen über den seriellen Bus verwendet. Wird der
Wert das Timers auf Null gesetzt bevor eine Bus-Operation abgeschlossen ist, so wird
eine "Timeout"-Fehlermeldung erzeugt. Timer 1 wird auf verschiedene Werte
gesetzt, abhängig von dem angesprochenen Gerät. Dieses garantiert, daß
der Computer nicht endlos auf die Antwort eines nicht vorhandenen Gerätes wartet.
Timer 3 wird ebenfalls durch das OS benutzt. Der Cassetten-Handler verwendet diesen
Timer zum Festlegen der zum Schreiben und Lesen von Tonband-Headern benötigten
Zeit. In Beispiel 8.14 wird Timer 2 zum Simulieren eines Metronoms benutzt. Die Rate
des Metronoms kann mit Hilfe des Joysticks auf verschiedene Werte gesetzt werden.