Files
Digital-Research-Source-Code/MPM OPERATING SYSTEMS/MPM I/MPM I SOURCE/07/sched.plm
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

1 line
3.6 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

$title('MP/M 1.1 Scheduler Process')
sched:
do;
$include (copyrt.lit)
/*
Revised:
26 Jan 80 by Thomas Rolander
*/
$include (proces.lit)
$include (queue.lit)
$include (xdos.lit)
/*
Common Literals
*/
declare true literally '0FFFFH';
declare false literally '0';
declare forever literally 'while true';
declare boolean literally 'byte';
declare restarts literally
'0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H';
mon1:
procedure (func,info) external;
declare func byte;
declare info address;
end mon1;
mon2:
procedure (func,info) byte external;
declare func byte;
declare info address;
end mon2;
mon2a:
procedure (func,info) address external;
declare func byte;
declare info address;
end mon2a;
declare xdos literally 'mon2';
declare xdosa literally 'mon2a';
/*
Sched Process Data Segment
*/
declare os address public
data (0);
declare sched$pd process$descriptor public
data (0,rtr$status,100,.sched$stk+38,
'Sched ',0,0ffh,0,0,0);
declare sched$stk (20) address
initial (restarts,.sched);
declare sched$lqcb
structure (lqueue,
buf (71) byte)
initial (0,'Sched ',69,1);
declare sched$uqcb userqcbhead
initial (.sched$lqcb,.new$entry);
declare cli$uqcb userqcb
initial (0,0,'CliQ ');
declare ret address;
declare (char,index,tindx) byte;
declare scheduling boolean;
declare temp address;
declare tod structure (
date address,
hrs byte,
min byte,
sec byte );
declare sched$item literally 'structure (
date address,
hrs byte,
min byte,
cli$command (65) byte )';
declare new$entry sched$item;
declare sched$table (4) sched$item;
room$in$table:
procedure boolean;
do tindx = 0 to 3;
if sched$table(tindx).date = 0
then return true;
end;
return false;
end room$in$table;
fill$entry:
procedure;
if room$in$table then
do;
call move (69,.new$entry,.sched$table(tindx));
scheduling = true;
end;
end fill$entry;
declare last$dseg$byte byte
initial (0);
/*
sched:
*/
sched:
procedure;
ret = xdos (make$queue,.sched$lqcb);
ret = xdos (open$queue,.cli$uqcb);
do tindx = 0 to 3;
sched$table(tindx).date = 0;
end;
do forever;
ret = xdos (read$queue,.sched$uqcb);
scheduling = false;
call fill$entry;
do while scheduling;
ret = xdos (get$tod,.tod);
scheduling = false;
do tindx = 0 to 3;
if sched$table(tindx).date <> 0 then
do;
if (tod.date > sched$table(tindx).date) or
((tod.date = sched$table(tindx).date) and
((tod.hrs > sched$table(tindx).hrs) or
((tod.hrs = sched$table(tindx).hrs) and
(tod.min >= sched$table(tindx).min)))) then
do;
cli$uqcb.msgadr = .sched$table(tindx).cli$command;
ret = xdos (write$queue,.cli$uqcb);
sched$table(tindx).date = 0;
end;
else
do;
scheduling = true;
end;
end;
end;
if scheduling then
do;
ret = xdos (flag$wait,3);
end;
if xdos (cond$read$queue,.sched$uqcb) = 0
then call fill$entry;
end;
end;
end sched;
end sched;