mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 17:34:06 +00:00
1 line
4.9 KiB
Plaintext
1 line
4.9 KiB
Plaintext
$title('MP/M 1.1 Spool Process')
|
||
spool:
|
||
do;
|
||
|
||
$include (copyrt.lit)
|
||
/*
|
||
Revised:
|
||
26 Jan 80 by Thomas Rolander
|
||
*/
|
||
|
||
$include (proces.lit)
|
||
$include (queue.lit)
|
||
$include (xdos.lit)
|
||
$include (fcb.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;
|
||
|
||
open:
|
||
procedure (fcb$adr) byte public;
|
||
declare fcb$adr address;
|
||
declare fcb based fcb$adr fcb$descriptor;
|
||
return mon2 (15,fcb$adr);
|
||
end open;
|
||
|
||
readbf:
|
||
procedure (fcb$adr) byte public;
|
||
declare fcb$adr address;
|
||
return mon2 (20,fcb$adr);
|
||
end readbf;
|
||
|
||
set$dma:
|
||
procedure (dma$adr) public;
|
||
declare dma$adr address;
|
||
call mon1 (26,dma$adr);
|
||
end set$dma;
|
||
|
||
free$drives:
|
||
procedure;
|
||
call mon1 (39,0ffffh);
|
||
end free$drives;
|
||
|
||
lo:
|
||
procedure (char) public;
|
||
declare char byte;
|
||
call mon1 (5,char);
|
||
end lo;
|
||
|
||
declare xdos literally 'mon2';
|
||
declare xdosa literally 'mon2a';
|
||
|
||
declare list$mx userqcb
|
||
initial (0,0,'MXList ');
|
||
|
||
declare control$z literally '1AH';
|
||
|
||
declare reserved$for$disk (3) byte;
|
||
declare buffer (128) byte;
|
||
|
||
/*
|
||
Spool Process Data Segment
|
||
*/
|
||
declare os address public
|
||
/* The OS address will be filled in here by the
|
||
MPM Loader, this address is used by Mon1 & Mon2 */
|
||
data (0);
|
||
|
||
declare spool$pd process$descriptor public
|
||
/* This is 'data' because it must precede
|
||
the PRL file code segment */
|
||
data (0,rtr$status,20,.spool$stk+38,
|
||
'Spool ',0,0ffh,0,0,.buffer,0);
|
||
declare spool$stk (20) address
|
||
initial (restarts,.spool);
|
||
|
||
declare spool$lqcb
|
||
structure (lqueue,
|
||
buf (110) byte)
|
||
initial (0,'SPOOL ',53,2);
|
||
declare spool$uqcb userqcbhead
|
||
initial (.spool$lqcb,.field);
|
||
declare field (53) byte;
|
||
declare disk$select byte at (.field(0));
|
||
declare console byte at (.field(1));
|
||
|
||
declare dsk$slct$adr address
|
||
initial (.spool$pd.disk$slct);
|
||
declare dsk$slct based dsk$slct$adr byte;
|
||
|
||
declare pcb structure (
|
||
field$adr address,
|
||
fcb$adr address)
|
||
initial (0,.fcb);
|
||
|
||
declare fcb fcb$descriptor;
|
||
|
||
declare stpspl$cqcb circularqueue
|
||
initial (0,'STOPSPLR',0,1);
|
||
declare stpspl$uqcb address
|
||
initial (.stpspl$cqcb);
|
||
|
||
declare ret byte;
|
||
|
||
declare (char,column,itab,jtab,eod,i) byte;
|
||
|
||
declare nxt$chr$adr address;
|
||
|
||
declare last$dseg$byte byte
|
||
initial (0);
|
||
|
||
|
||
/*
|
||
spool:
|
||
*/
|
||
|
||
spool:
|
||
procedure;
|
||
|
||
ret = xdos (make$queue,.spool$lqcb);
|
||
ret = xdos (make$queue,.stpspl$cqcb);
|
||
ret = xdos (open$queue,.list$mx);
|
||
ret = xdos (set$priority,200);
|
||
|
||
do forever;
|
||
ret = xdos (read$queue,.spool$uqcb);
|
||
dsk$slct = disk$select;
|
||
nxt$chr$adr = .field(1);
|
||
do while (nxt$chr$adr <> 0) and
|
||
(nxt$chr$adr <> 0FFFFH);
|
||
pcb.field$adr = nxt$chr$adr + 1;
|
||
nxt$chr$adr = xdosa (parse$fname,.pcb);
|
||
if nxt$chr$adr <> 0FFFFH then
|
||
do;
|
||
if open (.fcb) <> 0FFH then
|
||
do;
|
||
ret = xdos (read$queue,.list$mx);
|
||
call set$dma (.buffer);
|
||
fcb.nr = 0;
|
||
eod = 0;
|
||
do while (not eod) and (readbf (.fcb) = 0);
|
||
if xdos (cond$read$queue,.stpspl$uqcb) = 0 then
|
||
do;
|
||
eod = true;
|
||
nxt$chr$adr = 0;
|
||
do while xdos (cond$read$queue,.spool$uqcb) = 0;
|
||
;
|
||
end;
|
||
end;
|
||
else
|
||
do i = 0 to last(buffer);
|
||
if (char := buffer(i)) = control$z
|
||
then eod = true;
|
||
if not eod then
|
||
do;
|
||
itab = (char = 09H) and (7 - (column and 7));
|
||
if char = 09H
|
||
then char = ' ';
|
||
do jtab = 0 to itab;
|
||
if char >= ' '
|
||
then column = column + 1;
|
||
if char = 0AH then column = 0;
|
||
call lo(char);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
call free$drives;
|
||
ret = xdos (write$queue,.list$mx);
|
||
end;
|
||
end;
|
||
end; /* of while */
|
||
end;
|
||
end spool;
|
||
/*
|
||
Dummy Main Program
|
||
*/
|
||
do;
|
||
;
|
||
end;
|
||
end spool;
|
||
|