Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,211 @@
title 'Clock process'
;*****************************************************
;*
;* CLOCK RSP
;*
;* The clock process will update the CCP/M-86 Time of
;* Day structure each time it returns from waiting for
;* the 'Second' System Flag (Flag 2). When the minute
;* is updated, the 'minute' flag is set (Flag 3).
;*
;*****************************************************
; ccpm functions
ccpmint equ 224 ; ccpm entry interrupt
dev_flagwait equ 132 ; flagwait
dev_flagset equ 133 ; flagset
rlr equ 68H ; Ready List Root
xiosentry equ 28H ; offset of double word pointer in
; the system data segment of XIOS entry
io_statline equ 8 ; update XIOS status line
tod_offset equ 07Eh
sec_flag equ 2
min_flag equ 3
; TOD format
tod_day equ word ptr 0
tod_hour equ byte ptr 2
tod_min equ byte ptr 3
tod_sec equ byte ptr 4
; PD fields
p_uda equ 10h ; offset of UDA segment in PD
pdlen equ 48 ; length of process descriptor
ps_run equ 0 ; PD run status
pf_keep equ 2 ; PD nokill flag
; RSP format
rsp_top equ 0 ; rsp offset
rsp_pd equ 010h ; PD offset
rsp_uda equ 040h ; UDA offset
rsp_bottom equ 140h ; end rsp header
;*****************************************************
;*
;* CLOCK CODE SEGMENT
;*
;*****************************************************
cseg
org 0
ccpm: int ccpmint ! ret
clock: ; Clock process starts here
mov ds,sysdat
mov si,.rlr ! mov es,p_uda[si] ; ES is never saved.
; Note if other ccpm system calls
; are added to this program, ES
; may be changed.
mov bx,tod_offset
; Loop forever
clockloop:
; BX -> TOD structure in SYSDAT
; Wait for Seconds Flag
mov cx,dev_flagwait ! mov dx,sec_flag
push bx
call ccpm
; Call XIOS status line update.
; ES=UDA, DS=system data segment
mov ax,io_statline
xor cx,cx ! mov dx,cx
callf dword ptr .xiosentry
pop bx
; increment seconds
clc
mov al,tod_sec[bx]
inc al ! daa ! mov tod_sec[bx],al
; check for minute mark
cmp al,60h ! jae update_min
jmp clock_loop
update_min:
; set minute flag
mov tod_sec[bx],0
; mov cx,dev_flagset ! mov dx,min_flag
; push bx ! call ccpm ! pop bx
; increment minute field of TOD
clc ! mov al,tod_min[bx]
inc al ! daa ! mov tod_min[bx],al
; check if hour
cmp al,60h ! jae update_hour
jmp clock_loop
update_hour:
;update hour field
mov tod_min[bx],0
clc ! mov al,tod_hour[bx]
inc al ! daa ! mov tod_hour[bx],al
; check for day
cmp al,24h ! jae update_day
jmp clock_loop
update_day:
; update Day field
mov tod_hour[bx],0
inc tod_day[bx]
jmp clock_loop ; loop forever
;*****************************************************
;*
;* Data Segment
;*
;*****************************************************
dseg
org 0
sysdat dw 0,0,0
dw 0,0,0
dw 0,0
org rsp_pd
dw 0,0 ; link,thread
db ps_run ; status
db 190 ; priority
dw pf_keep ; flags
db 'CLOCK ' ; name
dw offset uda/10h ; uda seg
db 0,0,0,0 ; dsk,usr,ldsk,luser
dw 0 ; mem partitions
dw 0,0 ; dvract,wait
db 0,0 ; org,net
dw 0 ; parent
db 0,0,0,0 ; cns,abort,cin,cout
db 0,0,0,0 ; lst,sf3,sf4,sf5
dw 0,0,0,0 ; reserved,pret,scratch
org rsp_uda
uda dw 0,0,0,0 ;0-7 note: no default DMA
dw 0,0,0,0 ;8-fh
dw 0,0,0,0 ;10-17
dw 0,0,0,0 ;18-1f
dw 0,0,0,0 ;20-27
dw 0,0,0,0 ;28-2f
dw 0,0,offset stack_top,0 ;30-37
dw 0,0,0,0 ;38-3f
dw 0,0,0,0 ;40-47
dw 0,0,0,0 ;48-4f
dw 0,0,0,0 ;50-57
dw 0,0,0,0 ;58-5f
db 1 ;60 INSYS <> 0
;don't switch from
;from UDA stack
;on entry to SUP
db 0
dw 0cccch,0cccch,0cccch ;62-67
dw 0cccch,0cccch,0cccch,0cccch ;68-6F
dw 0cccch,0cccch,0cccch,0cccch ;70
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;80
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;90
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;A0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;B0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;C0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;D0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;E0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;F0
dw 0cccch
stack_top dw offset clock ; code starting point
dw 0 ; code seg - set by GENSYS
dw 0 ; init. flags - set by GENSYS
; UDA is 100H bytes long
end

View File

@@ -0,0 +1,298 @@
CP/M ASM86 1.1 SOURCE: CLOCK.A86 Clock process PAGE 1
1
2 title 'Clock process'
3
4 ;*****************************************************
5 ;*
6 ;* CLOCK RSP
7 ;*
8 ;* The clock process will update the CCP/M-86 Time of
9 ;* Day structure each time it returns from waiting for
10 ;* the 'Second' System Flag (Flag 2). When the minute
11 ;* is updated, the 'minute' flag is set (Flag 3).
12 ;*
13 ;*****************************************************
14
15 ; ccpm functions
16
17 00E0 ccpmint equ 224 ; ccpm entry interrupt
18 0084 dev_flagwait equ 132 ; flagwait
19 0085 dev_flagset equ 133 ; flagset
20
21 0068 rlr equ 68H ; Ready List Root
22
23 0028 xiosentry equ 28H ; offset of double word pointer in
24 ; the system data segment of XIOS entry
25 0008 io_statline equ 8 ; update XIOS status line
26
27 007E tod_offset equ 07Eh
28 0002 sec_flag equ 2
29 0003 min_flag equ 3
30
31 ; TOD format
32
33 0000 tod_day equ word ptr 0
34 0002 tod_hour equ byte ptr 2
35 0003 tod_min equ byte ptr 3
36 0004 tod_sec equ byte ptr 4
37
38 ; PD fields
39
40 0010 p_uda equ 10h ; offset of UDA segment in PD
41 0030 pdlen equ 48 ; length of process descriptor
42
43 0000 ps_run equ 0 ; PD run status
44 0002 pf_keep equ 2 ; PD nokill flag
45
46 ; RSP format
47
48 0000 rsp_top equ 0 ; rsp offset
49 0010 rsp_pd equ 010h ; PD offset
50 0040 rsp_uda equ 040h ; UDA offset
51 0140 rsp_bottom equ 140h ; end rsp header
52
53 ;*****************************************************
CP/M ASM86 1.1 SOURCE: CLOCK.A86 Clock process PAGE 2
54
55 ;*
56 ;* CLOCK CODE SEGMENT
57 ;*
58 ;*****************************************************
59
60 cseg
61 org 0
62
63
64 0000 CDE0C3 ccpm: int ccpmint ! ret
65
66 clock: ; Clock process starts here
67
68 0003 8E1E0000 mov ds,sysdat
69 0007 8B3668008E44 mov si,.rlr ! mov es,p_uda[si] ; ES is never saved.
70 10
71 ; Note if other ccpm system calls
72 ; are added to this program, ES
73 ; may be changed.
74 000E BB7E00 mov bx,tod_offset
75
76 ; Loop forever
77 clockloop:
78 ; BX -> TOD structure in SYSDAT
79 ; Wait for Seconds Flag
80 0011 B98400BA0200 mov cx,dev_flagwait ! mov dx,sec_flag
81 0017 53 push bx
82 0018 E8E5FF 0000 call ccpm
83
84 ; Call XIOS status line update.
85 ; ES=UDA, DS=system data segment
86 001B B80800 mov ax,io_statline
87 001E 33C98BD1 xor cx,cx ! mov dx,cx
88 0022 FF1E2800 callf dword ptr .xiosentry
89
90 0026 5B pop bx
91
92 ; increment seconds
93 0027 F8 clc
94 0028 8A4704 mov al,tod_sec[bx]
95 002B FEC027884704 inc al ! daa ! mov tod_sec[bx],al
96
97 ; check for minute mark
98
99 0031 3C607303 0038 cmp al,60h ! jae update_min
100 0035 E9D9FF 0011 jmp clock_loop
101
102 update_min:
103 ; set minute flag
104
105 0038 C6470400 mov tod_sec[bx],0
106 ; mov cx,dev_flagset ! mov dx,min_flag
CP/M ASM86 1.1 SOURCE: CLOCK.A86 Clock process PAGE 3
107
108 ; push bx ! call ccpm ! pop bx
109
110 ; increment minute field of TOD
111
112 003C F88A4703 clc ! mov al,tod_min[bx]
113 0040 FEC027884703 inc al ! daa ! mov tod_min[bx],al
114
115 ; check if hour
116
117 0046 3C607303 004D cmp al,60h ! jae update_hour
118 004A E9C4FF 0011 jmp clock_loop
119
120 update_hour:
121 ;update hour field
122
123 004D C6470300 mov tod_min[bx],0
124 0051 F88A4702 clc ! mov al,tod_hour[bx]
125 0055 FEC027884702 inc al ! daa ! mov tod_hour[bx],al
126
127 ; check for day
128
129 005B 3C247303 0062 cmp al,24h ! jae update_day
130 005F E9AFFF 0011 jmp clock_loop
131
132 update_day:
133 ; update Day field
134
135 0062 C6470200 mov tod_hour[bx],0
136 0066 FF07 inc tod_day[bx]
137 0068 E9A6FF 0011 jmp clock_loop ; loop forever
138
139 ;*****************************************************
140 ;*
141 ;* Data Segment
142 ;*
143 ;*****************************************************
144
145 dseg
146 org 0
147
148 0000 000000000000 sysdat dw 0,0,0
149 0006 000000000000 dw 0,0,0
150 000C 00000000 dw 0,0
151
152 org rsp_pd
153
154 0010 00000000 dw 0,0 ; link,thread
155 0014 00 db ps_run ; status
156 0015 BE db 190 ; priority
157 0016 0200 dw pf_keep ; flags
158 0018 434C4F434B20 db 'CLOCK ' ; name
159 2020
CP/M ASM86 1.1 SOURCE: CLOCK.A86 Clock process PAGE 4
160
161 0020 0400 dw offset uda/10h ; uda seg
162 0022 00000000 db 0,0,0,0 ; dsk,usr,ldsk,luser
163 0026 0000 dw 0 ; mem partitions
164 0028 00000000 dw 0,0 ; dvract,wait
165 002C 0000 db 0,0 ; org,net
166 002E 0000 dw 0 ; parent
167 0030 00000000 db 0,0,0,0 ; cns,abort,cin,cout
168 0034 00000000 db 0,0,0,0 ; lst,sf3,sf4,sf5
169 0038 000000000000 dw 0,0,0,0 ; reserved,pret,scratch
170 0000
171
172 org rsp_uda
173
174 0040 000000000000 uda dw 0,0,0,0 ;0-7 note: no default DMA
175 0000
176 0048 000000000000 dw 0,0,0,0 ;8-fh
177 0000
178 0050 000000000000 dw 0,0,0,0 ;10-17
179 0000
180 0058 000000000000 dw 0,0,0,0 ;18-1f
181 0000
182 0060 000000000000 dw 0,0,0,0 ;20-27
183 0000
184 0068 000000000000 dw 0,0,0,0 ;28-2f
185 0000
186 0070 000000003A01 dw 0,0,offset stack_top,0 ;30-37
187 0000
188 0078 000000000000 dw 0,0,0,0 ;38-3f
189 0000
190 0080 000000000000 dw 0,0,0,0 ;40-47
191 0000
192 0088 000000000000 dw 0,0,0,0 ;48-4f
193 0000
194 0090 000000000000 dw 0,0,0,0 ;50-57
195 0000
196 0098 000000000000 dw 0,0,0,0 ;58-5f
197 0000
198 00A0 01 db 1 ;60 INSYS <> 0
199 ;don't switch from
200 ;from UDA stack
201 ;on entry to SUP
202 00A1 00 db 0
203
204 00A2 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch ;62-67
205 00A8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;68-6F
206 CCCC
207 00B0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;70
208 CCCC
209 00B8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
210 CCCC
211 00C0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;80
212 CCCC
CP/M ASM86 1.1 SOURCE: CLOCK.A86 Clock process PAGE 5
213
214 00C8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
215 CCCC
216 00D0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;90
217 CCCC
218 00D8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
219 CCCC
220 00E0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;A0
221 CCCC
222 00E8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
223 CCCC
224 00F0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;B0
225 CCCC
226 00F8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
227 CCCC
228 0100 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;C0
229 CCCC
230 0108 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
231 CCCC
232 0110 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;D0
233 CCCC
234 0118 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
235 CCCC
236 0120 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;E0
237 CCCC
238 0128 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
239 CCCC
240 0130 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;F0
241 CCCC
242 0138 CCCC dw 0cccch
243
244 013A 0300 stack_top dw offset clock ; code starting point
245 013C 0000 dw 0 ; code seg - set by GENSYS
246 013E 0000 dw 0 ; init. flags - set by GENSYS
247
248 ; UDA is 100H bytes long
249 end
250
251
252 END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 2%
CP/M ASM86 1.1 SOURCE: CLOCK.A86 Clock process PAGE 006
CCPM 0000 L 64# 82
CCPMINT 00E0 N 17# 64
CLOCK 0003 L 66# 244
CLOCKLOOP 0011 L 77# 100 118 130 137
CS SREG V
DEVFLAGSET 0085 N 19#
DEVFLAGWAIT 0084 N 18# 80
DS SREG V 68
ES SREG V 69
IOSTATLINE 0008 N 25# 86
MINFLAG 0003 N 29#
PDLEN 0030 N 41#
PFKEEP 0002 N 44# 157
PSRUN 0000 N 43# 155
PUDA 0010 N 40# 69
RLR 0068 N 21# 69
RSPBOTTOM 0140 N 51#
RSPPD 0010 N 49# 152
RSPTOP 0000 N 48#
RSPUDA 0040 N 50# 172
SECFLAG 0002 N 28# 80
SS SREG V
STACKTOP 013A V 186 244#
SYSDAT 0000 V 68 148#
TODDAY 0000 N 33# 136
TODHOUR 0002 N 34# 124 125 135
TODMIN 0003 N 35# 112 113 123
TODOFFSET 007E N 27# 74
TODSEC 0004 N 36# 94 95 105
UDA 0040 V 161 174#
UPDATEDAY 0062 L 129 132#
UPDATEHOUR 004D L 117 120#
UPDATEMIN 0038 L 99 102#
XIOSENTRY 0028 N 23# 88