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.