7
|
1 ********************************************************************
|
|
2 * Clock - OS-9 Level One V2 Clock module
|
|
3 *
|
|
4 * $Id: clock.asm,v 1.1.1.1 2001/02/21 23:30:52 boisy Exp $
|
|
5 *
|
|
6 * NOTE: This clock is TOTALLY VALID for ALL DATES between 1900-2155
|
|
7 *
|
|
8 * Ed. Comments Who YY/MM/DD
|
|
9 * ------------------------------------------------------------------
|
|
10 * 5 Tandy/Microware original version
|
|
11 * 6 Modified to handle leap years properly for BGP 99/05/03
|
|
12 * 1900 and 2100 A.D.
|
|
13
|
|
14 nam Clock
|
|
15 ttl OS-9 Level One V2 Clock module
|
|
16
|
|
17 ifp1
|
11
|
18 use defsfile
|
7
|
19 endc
|
|
20
|
55
|
21 usefirq equ 0
|
|
22
|
7
|
23 tylg set Systm+Objct
|
|
24 atrv set ReEnt+rev
|
|
25 rev set $01
|
|
26 edition set $06
|
53
|
27 TimerPort set $ffb0
|
7
|
28
|
|
29 mod eom,name,tylg,atrv,ClkEnt,size
|
|
30
|
|
31 size equ .
|
|
32
|
|
33 name fcs /Clock/
|
|
34 fcb edition
|
|
35
|
|
36 SysTbl fcb F$Time
|
|
37 fdb FTime-*-2
|
53
|
38 fcb F$STime
|
|
39 fdb FSTime-*-2
|
7
|
40 fcb $80
|
|
41
|
|
42
|
55
|
43 ifeq usefirq-1
|
|
44 ClockFIRQ
|
|
45 leas -1,s
|
|
46 pshs d,dp,x,y
|
|
47 lda 8,s
|
|
48 ora #$80 Entire flag
|
|
49 pshs a
|
|
50 stu 8,s
|
|
51 jmp [$FFF8]
|
|
52 endc
|
|
53 ClockIRQ
|
|
54 ldx #TimerPort
|
53
|
55 lda ,x
|
|
56 bita #$10
|
|
57 beq L00AE
|
54
|
58 L00AE leax ClockIRQ1,pcr
|
|
59 stx <D.SvcIRQ
|
|
60 jmp [D.XIRQ] Chain through Kernel to continue IRQ handling
|
|
61 ClockIRQ1
|
|
62 inc <D.Sec go up one second
|
|
63 lda <D.Sec grab current second
|
|
64 cmpa #60 End of minute?
|
|
65 blo VIRQend No, skip time update and alarm check
|
|
66 clr <D.Sec Reset second count to zero
|
|
67 VIRQend
|
|
68 ldx #TimerPort
|
53
|
69 lda #$8f
|
|
70 sta >TimerPort
|
54
|
71 jmp [>D.Clock]
|
|
72
|
|
73 TkPerTS equ 2
|
7
|
74
|
|
75 ClkEnt equ *
|
|
76 pshs cc
|
|
77 orcc #FIRQMask+IRQMask mask ints
|
|
78 leax >ClockIRQ,pcr
|
|
79 stx <D.IRQ
|
55
|
80 ifeq usefirq-1
|
|
81 leax >ClockFIRQ,pcr
|
|
82 stx $FFF6 must be a RAM
|
|
83 endc
|
7
|
84 * install system calls
|
|
85 leay >SysTbl,pcr
|
|
86 os9 F$SSvc
|
54
|
87 ldd #59*256+TkPerTS last second and time slice in minute
|
|
88 std <D.Sec Will prompt RTC read at next time slice
|
|
89 stb <D.TSlice set ticks per time slice
|
|
90 stb <D.Slice set first time slice
|
|
91 lda #TkPerSec Reset to start of second
|
|
92 sta <D.Tick
|
|
93
|
7
|
94 ldx #TimerPort
|
|
95 ldb #$8f start timer
|
|
96 stb ,x
|
|
97 puls pc,cc
|
|
98
|
|
99 * F$Time system call code
|
53
|
100 FTime ldx #TimerPort
|
7
|
101 ldb #$04
|
53
|
102 stb ,x
|
|
103 leax 1,x Address of system time packet
|
|
104 RetTime ldy <D.Proc Get pointer to current proc descriptor
|
|
105 ldb P$Task,y Process Task number
|
|
106 lda <D.SysTsk From System Task
|
|
107 ldu R$X,u
|
|
108 STime.Mv ldy #6 Move 6 bytes
|
|
109 FMove os9 F$Move
|
|
110 rts
|
|
111
|
|
112 FSTime clrb
|
7
|
113 rts
|
|
114
|
|
115 emod
|
|
116 eom equ *
|
|
117 end
|