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

1 line
5.1 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 Spool Program')
spool:
do;
$include (copyrt.lit)
/*
Revised:
19 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 start label;
declare jmp$to$start structure (
jmp$instr byte,
jmp$location address ) data (
0c3h,
.start-3);
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 maxb address external;
declare fcb (1) byte external;
declare tbuff (1) byte external;
read$console:
procedure byte;
return mon2 (1,0);
end read$console;
print$console$buffer:
procedure (buff$adr);
declare buff$adr address;
call mon1 (9,buff$adr);
end print$console$buffer;
check$console$status:
procedure byte;
return mon2 (11,0);
end check$console$status;
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;
system$reset:
procedure;
call mon1 (0,0);
end system$reset;
declare xdos literally 'mon2';
declare xdosa literally 'mon2a';
declare pcb structure (
field$adr address,
fcb$adr address)
initial (0,.fcb);
declare list$mx userqcb
initial (0,0,'MXList ');
declare control$z literally '1AH';
declare (nmbufs,actbuf) address;
list$buf:
procedure (buf$adr) byte;
declare buf$adr address;
declare buffer based buf$adr (1) byte;
declare i byte;
do i = 0 to 127;
if (char := buffer(i)) = control$z
then return true;
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);
if check$console$status then
do;
i = read$console;
call system$reset;
end;
end;
end;
return false;
end list$buf;
copy$file:
procedure (buf$base);
declare buf$base address;
declare buffer based buf$base (1) structure (
record (128) byte);
declare ok byte;
declare i address;
do forever;
actbuf = 0;
ok = true;
do while ok;
call set$dma (.buffer(actbuf));
if (ok := (readbf (.fcb) = 0)) then
do;
ok = ((actbuf := actbuf+1) <> nmbufs);
end;
else
do;
if actbuf = 0 then return;
end;
end;
do i = 0 to actbuf-1;
if list$buf (.buffer(i))
then return;
end;
if actbuf <> nmbufs then return;
end;
end copy$file;
detach$msg:
procedure;
declare ret byte;
call print$console$buffer (.(
'- Enter STOPSPLR to abort the spooler',0dh,0ah,
'- Enter ATTACH SPOOL to re-attach console to spooler',0dh,0ah,
'*** Spooler detaching from console ***','$'));
ret = xdos (detach,0);
end detach$msg;
declare ret byte;
declare (char,column,itab,jtab,i) byte;
declare nxt$chr$adr address;
declare reserved$for$disk (3) byte;
declare dummy$buffer (128) byte;
declare buffer (1) structure (
char (128) byte) at (.dummy$buffer);
declare last$dseg$byte byte
initial (0);
/*
spool:
*/
start:
call print$console$buffer (.(
'MP/M 1.1 Spooler',0dh,0ah,'$'));
nmbufs = shr((maxb-.buffer),8);
ret = xdos (open$queue,.list$mx);
if xdos (cond$read$queue,.list$mx) = 0ffh then
do;
call print$console$buffer (.(
'*** Printer busy ***',0dh,0ah,
'- Spooler will wait until printer free',0dh,0ah,'$'));
call detach$msg;
ret = xdos (read$queue,.list$mx);
end;
else
do;
call detach$msg;
end;
nxt$chr$adr = .tbuff(0);
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;
fcb(32) = 0;
call copy$file(.buffer);
call free$drives;
end;
end;
end; /* of while */
ret = xdos (write$queue,.list$mx);
call system$reset;
end spool;