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