mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
212 lines
4.9 KiB
Plaintext
212 lines
4.9 KiB
Plaintext
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
|
||
|