Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

1 line
5.7 KiB
Plaintext
Raw Permalink 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 ('Copy Serial Data to Disk')
copy$srl$to$disk:
do;
$include (copyrt.lit)
$nolist
/*
Common Literals
*/
declare true literally '1';
declare forever literally 'while true';
declare restarts literally
'0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H,0C7C7H,
0C7C7H,0C7C7H,0C7C7H';
$list
$include (proces.lit)
$include (queue.lit)
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 fcb (1) byte external;
/**************************************
* *
* B D O S Externals *
* *
**************************************/
direct$console$in:
procedure byte;
return mon2 (6,0ffh);
end direct$console$in;
open$file:
procedure (fcb$address) byte;
declare fcb$address address;
return mon2 (15,fcb$address);
end open$file;
close$file:
procedure (fcb$address) byte;
declare fcb$address address;
return mon2 (16,fcb$address);
end close$file;
delete$file:
procedure (fcb$address);
declare fcb$address address;
call mon1 (19,fcb$address);
end delete$file;
write$record:
procedure (fcb$address) byte;
declare fcb$address address;
return mon2 (21,fcb$address);
end write$record;
create$file:
procedure (fcb$address) byte;
declare fcb$address address;
return mon2 (22,fcb$address);
end create$file;
set$DMA$address:
procedure (DMA$address);
declare DMA$address address;
call mon1 (26,DMA$address);
end set$DMA$address;
/**************************************
* *
* X D O S Externals *
* *
**************************************/
flag$wait:
procedure (flag) byte;
declare flag byte;
return mon2 (132,flag);
end flag$wait;
flag$set:
procedure (flag) byte;
declare flag byte;
return mon2 (133,flag);
end flag$set;
make$queue:
procedure (qcb$address);
declare qcb$address address;
call mon1 (134,qcb$address);
end make$queue;
open$queue:
procedure (qcb$address) byte;
declare qcb$address address;
return mon2 (135,qcb$address);
end open$queue;
delete$queue:
procedure (qcb$address) byte;
declare qcb$address address;
return mon2 (136,qcb$address);
end delete$queue;
read$queue:
procedure (qcb$address);
declare qcb$address address;
call mon1 (137,qcb$address);
end read$queue;
write$queue:
procedure (qcb$address);
declare qcb$address address;
call mon1 (139,qcb$address);
end write$queue;
terminate:
procedure;
call mon1 (143,0);
end terminate;
create:
procedure (process$descriptor$adr);
declare process$descriptor$adr address;
call mon1 (144,process$descriptor$adr);
end create;
set$console:
procedure (console);
declare console byte;
call mon1 (148,console);
end set$console;
declare buffer (8192) byte;
declare disk$wr$pd process$descriptor
initial (0,0,199,.disk$wr$stk+46,
'DiskWr ',1,0ffh,0,0,.buffer,0);
declare disk$wr$stk (24) address
initial (restarts,.disk$wr);
declare empty$cque structure (cqueue,buf(64) address)
initial (0,'EmptyQ ',2,64);
declare full$cque structure (cqueue,buf(64) address)
initial (0,'FullQ ',2,64);
declare pro$buf$adr address;
declare pro$buf based pro$buf$adr (1) byte;
declare pro$empty$uqcb userqcbhead
initial (.empty$cque,.pro$buf$adr);
declare pro$full$uqcb userqcbhead
initial (.full$cque,.pro$buf$adr);
declare con$buf$adr address;
declare con$empty$uqcb userqcbhead
initial (.empty$cque,.con$buf$adr);
declare con$full$uqcb userqcbhead
initial (.full$cque,.con$buf$adr);
declare (ret,i) byte;
/*
Disk Write Process
*/
Disk$Wr:
procedure;
do forever;
call read$queue (.con$full$uqcb);
if con$buf$adr = 0 then
do;
ret = flag$set (10);
call mon1 (143,0ffffh);
end;
call set$DMA$address (con$buf$adr);
ret = write$record (.fcb);
call write$queue (.con$empty$uqcb);
end;
end Disk$wr;
/*
Main Program
*/
start:
do;
call delete$file (.fcb);
ret = create$file (.fcb);
ret = open$file (.fcb);
fcb(32) = 0;
call make$queue (.empty$cque);
call make$queue (.full$cque);
call create (.Disk$Wr$Pd);
pro$buf$adr = .buffer;
do i = 0 to 63;
call write$queue (.pro$empty$uqcb);
pro$buf$adr = pro$buf$adr + 128;
end;
call set$console (1);
do forever;
call read$queue (.pro$empty$uqcb);
do i = 0 to 127;
if (pro$buf(i) := direct$console$in) = 1ah then
do;
call write$queue (.pro$full$uqcb);
pro$buf$adr = 0;
call write$queue (.pro$full$uqcb);
ret = flag$wait (10);
ret = delete$queue (.empty$cque);
ret = delete$queue (.full$cque);
ret = close$file (.fcb);
call terminate;
end;
end;
call write$queue (.pro$full$uqcb);
end;
end;
end copy$srl$to$disk;