	title	'MP/M II V2.0 Clock Process'
	name	'clock'
	dseg
@@clock:
	public	@@clock
	cseg
;clock:
@clock:
	public	@clock
;do;


;/*
;  Copyright (C) 1979,1980,1981
;  Digital Research
;  P.O. Box 579
;  Pacific Grove, CA 93950
;
;  Revised:
;    14 Sept 81 by Thomas Rolander
;*/

;$include (common.lit)
;$nolist
;$include (proces.lit)
;$nolist
;$include (xdos.lit)
;$nolist
;$include (xdos.ext)
;$nolist
;$include (datapg.ext)
;$nolist

;  xdos:
	extrn	xdos
;    procedure (func,info) address external;
;      declare func byte;
;      declare info address;
;    end xdos;

;  declare tod structure (
	extrn	tod
;    day address,
;    hr byte,
;    min byte,
;    sec byte ) external;

	dseg
;/*
;  Clock Process Data Segment
;*/
;  declare clock$pd process$descriptor public
;    initial (0,rtr$status,20,.tick$entrypt,
;             'Clock   ',0,0ffh,0);
clockpd:
	public	clockpd
	extrn	clipd
	dw	clipd	; pl
	db	0	; status
	db	20	; priority
	dw	clockentrypt	; stkptr
	db	'Clock   '	; name
	db	$-$	; console
	db	0ffh	; memseg (system)
	dw	$-$	; b
	dw	$-$	; thread
	dw	$-$	; disk set DMA
	db	$-$	; disk select / user code
	dw	$-$	; dcnt
	db	$-$	; searchl
	dw	$-$	; searcha
	ds	2	; drvact
	ds	20	; registers
	ds	2	; scratch

;  declare clock$stk (10) address
;    initial (restarts,.clock);
clockstk:
	dw	0c7c7h,0c7c7h,0c7c7h
	dw	0c7c7h,0c7c7h,0c7c7h
	dw	0c7c7h,0c7c7h,0c7c7h
clockentrypt:
	dw	clock
	cseg


;/*
;  clock:
;          The purpose of the clock process is to maintain a time
;        of day clock.  It utilizes the XDOS delay function to
;        increment the PUBLIC clock every one second.
;*/

;  clock:
clock:
;    procedure;
;      declare ret byte;

;      do forever;
@4:
;        ret = xdos (flag$wait,2);
	MVI	E,2H
	MVI	C,84H
	CALL	XDOS
;        if (tod.sec := dec (tod.sec + 1)) = 60h then
	LXI	H,TOD+4H
	MOV	A,M
	INR	A
	DAA
	MOV	M,A
	SUI	60H
	JNZ	@4
;        do;
;          tod.sec = 0;
	MOV	M,A
;          ret = xdos (flag$set,3);
	MVI	E,3H
	MVI	C,85H
	CALL	XDOS
;          if (tod.min := dec (tod.min + 1)) = 60h then
	LXI	H,TOD+3H
	MOV	A,M
	INR	A
	DAA
	MOV	M,A
	SUI	60H
	JNZ	@4
;          do;
;            tod.min = 0;
	MOV	M,A
;            if (tod.hr := dec (tod.hr + 1)) = 24h then
	DCX	H
	MOV	A,M
	INR	A
	DAA
	MOV	M,A
	SUI	24H
	JNZ	@4
;            do;
;              tod.hr = 0;
	MOV	M,A
;              tod.day = tod.day + 1;
	LHLD	TOD
	INX	H
	SHLD	TOD
;            end;
;          end;
;        end;
;      end;
	JMP	@4
;    end clock;
;end clock;
	END
