mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
188 lines
4.3 KiB
Plaintext
188 lines
4.3 KiB
Plaintext
$title('MP/M II V2.0 Scheduler Process - Banked Portion')
|
||
sched:
|
||
do;
|
||
|
||
$include (copyrt.lit)
|
||
/*
|
||
Revised:
|
||
14 Sept 81 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$stack$pointer address
|
||
data (.sched$stk+38);
|
||
|
||
declare nrs$name (8) byte data (
|
||
'Sched ');
|
||
|
||
declare sched$pd$adr address;
|
||
declare sched$pd based sched$pd$adr process$descriptor;
|
||
|
||
declare sched$stk (20) address
|
||
initial (restarts,.sched);
|
||
|
||
declare sched$lqcb$adr address;
|
||
declare sched$lqcb based sched$lqcb$adr structure (
|
||
lqueue,
|
||
buf (71) byte);
|
||
|
||
declare sched$uqcb userqcbhead
|
||
initial (0,.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;
|
||
|
||
declare assign$cli$pb (10) byte initial (
|
||
0,'cli ',0);
|
||
|
||
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;
|
||
|
||
sched$pd$adr = os + 2;
|
||
sched$lqcb$adr = sched$pd$adr + 52;
|
||
sched$uqcb.pointer = .sched$lqcb;
|
||
|
||
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;
|
||
assign$cli$pb(0) = (sched$table(tindx).cli$command(1)
|
||
and 0fh);
|
||
ret = xdos (assign$console,.assign$cli$pb);
|
||
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;
|
||
|