|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 125184 (0x1e900) Types: TextFile Names: »tprimo«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦this⟧ »tprimo«
! *** tprimo *** ; ; ; niels møller jørgensen, june 1978. ; revision 2, feb. 1979. ; revision 2.1, nov. 1979. knud christensen ! printermodule begin !fp.no; !branch 2,10; !sections 44; procedure waitmess (.w3.; ! abs ref curr corout (return) ! w2); ! abs ref message buffer (return) ! procedure sendwait (.w3.; ! abs ref curr corout (return) ! w0 ; ! result (return) ! w1 ; ! abs ref message (call) ! w2); ! abs ref process name (call) ! procedure link (.w3.; ! abs ref curr corout (return) ! w1 ; ! abs ref queue element (call) ! w2); ! abs ref queue head (call) ! procedure move (.w3.; ! abs ref curr corout (return) ! w0 ; ! number of halfwords to move (call) ! w1 ; ! abs ref first halfword to move (call) ! w2); ! abs ref destination (call) ! procedure opmess (.w3.; w1); ! abs ref message (call) ! procedure get_branches (.w3.; ! abs ref curr corout (return) ! w0); ! coroutine number ! procedure copyanswer (.w3.; w0; ! first of data area (call) ! ! result from copy core (return) ! w1; ! last of data area (call) ! ! no of bytes copied (return) ! w2); ! message buffer (call) ! procedure compare (.w3.; ! abs ref curr corout (return) ! w0 ; ! no of bytes to compare (call) ! ! =0 the bytes are equal ! w1 ; ! abs ref 1. string ! w2); ! abs ref 2. string ! procedure outtime (.w3.; ! return (call) ! w2); ! abs ref string (call) ! ! all registers unchanged ! procedure testout (.w3.; ! return (call) ! w0 ; ! record length (call) ! w1 ; ! abs ref start of test record (call) ! w2); ! record kind (call) ! procedure create_tc (.w3.; ref ct_tc, ct_devname; ! device name from entry ! word ct_hostno,ct_hostid; ref ct_procref); ! abs ref ext. process descr. ! procedure remove_tc (.w3.; ref rt_tc); procedure find_tc (.w3.; ref ft_devname; word ft_hostno,ft_hostid; word ft_kind; ! kind of device ! w1); ! result (return) ! ! >0: abs ref tc found ! ! =0: tc not found, no free tc ! ! <0: tc not found, -abs ref free tc ! procedure looktransport (.w3.; ! abs ref curr corout (return) ! w1 ; ! name of transport (call) ! w2); ! abs ref core address ! ! -1 if name illegal ! ! 0 if unknown (return) ! procedure puttransport (.w3.; w1); ! name of transport ! procedure ioworkarea (.w3.; w1); ! message address (call) ! procedure linkupremote (.w3.; word lur_kind; word lur_hostno, lur_hostid; ref lur_deviname; w0 ; ! return value from host proc (return) ! w2); ! ref proc descr adr (return) ! procedure init (.w3.); ! abs ref curr corout (return) ! procedure freetransport (.w3.; w1; ! name of transport (return) ! w2); ! abs ref core address ! ! 0 if no free transport (return) ! procedure deftr_semantic (.w3.; ! abs ref curr corout (return) ! w0 ; ! result , internal value (return) ! w1 ; ! abs ref transport coroutine (return) ! w2); ! abs ref transport desc. in core (call) ! procedure appl_interface (.w3.); procedure nextchar (.w3.; word stp; ! abs ref word next to last input word ! w0 ; ! next char (return) ! w1 ; ! partial word (call,return) ! w2); ! abs ref next input word (call,return) ! procedure nextparam (.w3.; ref paramref, ! ref to param area 4 words ! stopbuf; ! abs ref word next to last inp.word ! w0; ! paramtype (return ! ! -1 = syntax error ! ! 0 = no param ! ! 1= text ! ! 2= @text ! ! 3= positiv integer ! w1; ! partial word (call,return) ! w2); ! abs ref next inp.word (call,return) ! procedure lookupremote (.w3.; ref lur_function, ! 2=lookup process, 3= lookup ! lur_procnameref, lur_devname; w0; ! return value from host proc (return) ! w1; ! kind ! w2); ! abs ref area to put host address: ! ! dhlinkno<12+hostno, hostid ! procedure terminalid (.w3.; ! abs ref curr corout (return) ! w0; ! device host link no (call) ! w2); ! abs ref area to put device name (call) ! procedure find_consoldevice (.w3.; ! abs ref curr corout (return) ! w0; ! 1= local 2= remote (call) ! w1; ! abs ref console name (call) ! ! return: ! ! >0 abs ref transp. corout ! ! =0 not found ! ! <0 removed but signed up by operator ! w2); ! abs ref device name (call) ! procedure operator (.w3.); ! return (pseudo call) ! procedure get_block (.w3.; ! abs ref curr corout (return) ! w0; ! max no of hwords in block (call) ! ! no of hword in block (return) ! w1; ! abs ref buffer first ! w2); ! status (return) ! procedure put_block (.w3.; ! abs ref curr corout (return ) ! w0; ! no of hwords in block (call) ! ! no of hwords actually put (return) ! w1; ! abs ref buffer (call) ! w2); ! status (return) ! procedure closebs (.w3.); ! abs ref curr corout (return) ! procedure hold (.w3.); ! abs ref curr corout (return) ! procedure oproutput (.w3.; ! abs ref curr corout (return) ! w0 ; ! call ! ! = 1 pending output ! ! = 2 error output ! ! return: undefined ! w1 ; ! call: text code ! ! return: undefined ! w2); ! call: status ! ! return: console status ! procedure updatetransport (.w3.); ! abs ref curr corout (return) ! procedure check_devicestatus (.w3.; ! abs ref curr corout (return) ! w0; ! answer result from monitor (call) ! w1; ! abs ref answer (call) ! w2); ! modified status (algol manner) (return) ! procedure prlistid (.w3.; ! abs ref curr corout (return) ! w0); ! no of halfwords in block (return) ! procedure prlistdate (.w3.; ! abs ref curr corout(return) ! w0); ! no of halfwords in block (return) ! procedure pr (.w3.); ! return (pseudo call) ! procedure pc (.w3.); ! pseudo call ! procedure rd (.w3.); ! pseudo call ! procedure tw (.w3.); ! pseudo call ! label central_wait,wait_next,coru_found,activate,initialize, interrupt,unin; record controlmess (ref cm_next,cm_prev,cm_receiver,cm_sender; byte cm_op,cm_mode); record coroutine (ref c_next,c_prev,c_mbuf; word c_w0,c_w1,c_w2; ref c_ic; word c_nr); record transpcorout (array(1:!length(coroutine)) tc_fill of byte; ref tc_nexttc; ! static link to next transport coroutine ! byte tc_created, ! = 0 if the coroutine is idle ! tc_kind; ! kind of slow device ! ref tc_nexttr,tc_prevtr; ! queue head of transport queue ! ref tc_buf; word tc_bufsize; word tc_hostno,tc_hostid; text(11) tc_devname; ! device name ( defined in entry ) ! text(14) tc_name; ! name of external process ! text(14) tc_console; ! process name of opr. console ! text(11) tc_devcons; ! device name of operator if remote ! word tc_ointervent; ! = 0 no intervention from operator or appl. ! ! <>0 <free param> shift +<command> ! word tc_aintervent; ! = 0 no intervention from appl. ! ! <> 0 intervention from appl. ! byte tc_state,tc_cause; word tc_status; byte tc_mode; word tc_bsl,tc_bsu; text(14) tc_bsname; text(11) tc_qgroup,tc_qname; word tc_transno,tc_bsptr; ref tc_saveic); record prcorout (array (1:!length(transpcorout)) pr_fill of byte; word pr_inpstate; byte pr_workffs,pr_worknls; word pr_partial,pr_workptr,pr_workstartptr); record pccorout (array(1:!length(transpcorout)) pc_fill of byte; word pc_inpstate); record rdcorout (array(1:!length(transpcorout)) rd_fill of byte; word rd_inpstate); record twcorout (array(1:!length(transpcorout)) tw_fill of byte; word tw_inpstate); record oprcorout (array(1:!length(coroutine)) opr_fill of byte; ref opr_buf; word opr_savew1; text(14) opr_console); record tr_descr (text(11) tr_name,tr_user,tr_sname,tr_rname,tr_bsarea; byte tr_mode, tr_kind; word tr_basel,tr_baseu; word tr_bsstartptr; ! start position in bs area ! text(11) tr_qgroup, tr_qname; ref tr_corou; ! abs ref core adr of transport coroutine ! word tr_state, tr_cause, tr_status, tr_charposition; ref tr_waitmess; word tr_removetime); ! 8388607 transport not terminated ! ! 8388606 transp. not terminated, release descr. when finished ! ! <8388606 transport terminated, the value indi- ! ! cates when the descr is free again ! ! unit=clock shift -20 = shortclock shift -1 ! record bufhead (byte buf_op,buf_mode; ref buf_first,buf_last; word buf_data1); record queuerec ! structure of element in transport coroutine queue ! (ref tq_next,tq_prev; word tq_transno); record opcom (byte opop,opmode; text(5) optext1; word logstatus; text(11) optext2); incode word event_res; ref current:=0, event:=0, activqfst,activqlast, answerqfst,answerqlast, waitqfst,waitqlast, holdqfst,holdqlast, tqfreefst,tqfreelast; ! head of idle transport queue elements ! ref apl_fst; ref opr_fst, opr_top; ref tcpool_fst, tcpool_top; word trans_first,trans_top; ! position of transport descriptions on bs ! word trans_old:= -1; ! position on description area of last last free transp. ! byte testmop:=5,testmode:=0; ref testmfst,testmlast; word testsegm:=0,maxtestsegm; double starttime; byte bs_op,bs_mode; ref bs_first,bs_last; word bs_segno; word waitbufs; double trsaveperiod; ! period to save transp.descr after termination of ! ! transport operation ! byte prheadtrail, ! = 0 no header and trailer page on printer lists ! ! <>0 header and trailer page on printer lists ! oprtdetails; ! <>0 output details to operator ! word prlpage; ! max number of lines pr printer page ! word ans_status,ans_bytes,ans_chars,ans4,ans5,ans6,ans7,ans8; byte faultop:=4,faultmode:=1; text(20) faulttxt:="***fault"; byte spcomop:=2,spcommode:=8'1001; text(8) spcomtext:="status"; text(14) spoolname; byte tstcomop:= 2, tstcommode:= 8'1000; text(8) tstcomtext:="status"; text(14) testname; ref firstfree,procconsole; word oprt_bufl:= 76; ref curropr, freeopr; ! work variables used by central logic ! begin interrupt: firstfree:= w1; procconsole:= w2; w3:=address(interrupt); w0:= 0; monitor(0); ! set interrupt address ! goto initialize; w1+0; w1+0; ! fill up interrupt area ! testout(.w3.,w0:=16,w1:=address(interrupt),w2:=15); opmess(.w3.,w1:=address(faultop)); initialize: !get 2; init(.w3.); ! call init for allocating and initializing buffers, ! ! descriptors, semaphores etc. ! goto activate; central_wait: w2:=0; ! base of event queue ! wait_next: w3:= 0; current:= w3; monitor(24); ! wait next event ! event:=w2; event_res:= w0; testout(.w3.,w0:=24,w1:=w2,w2:=6); w1:= 66; comment testout(.w3.,w0:=34,w1:=(w1).word,w2:=8); w2:=event; if w0 := event_res = 1 then begin ! an answer has arrived in event queue ! w1:=address(ans_status); monitor(18); ! wait answer (take the answer home) ! w1:=answerqfst; while w3:=address(answerqfst) <> w1 do begin ! scan answer queue to find corresponding sender ! if w2 = (w1).c_mbuf then begin ! activate waiting coroutine ! (w1).c_w0:=w0; goto coru_found; end; w1:=(w1).c_next; end; goto central_wait; end ! answer ! else begin ! message has arrived in event queue ! if w0:= (w2).cm_op = 7 then begin ! control message ! w1:= apl_fst; if w0:=(w1).c_mbuf>=0 then goto wait_next; (w1).c_w2:= w2; (w1).c_mbuf:= w2; monitor(26); ! get event ! goto coru_found; end else if w0=0 then begin ! att message ! w0:= 0; freeopr:= w0; if w2:=(w2).cm_sender<=0 then goto unin; w2+2; w1:= opr_top; while w1-!length(oprcorout)>=opr_fst do begin curropr:= w1; if w0:=(w1).c_mbuf<0 then freeopr:= w1 else begin ! reject if a session is allready going on ! compare(.w3.,w0:=8,w1:=address((w1).opr_console),w2); if w0=0 ! match ! then goto unin; end; w1:= curropr; end; if w3:=freeopr=0 then goto unin; move(.w3.,w0:=8,w1:=w2,w2:=address((w3).opr_console)); w1:= freeopr; w2:= event; (w1).c_w2:= w2; (w1).c_mbuf:= w2; monitor(26); ! get event ! goto coru_found; end else begin ! operation illegal ! unin: ans_status:= w0:= 0; ans_bytes:= w0; ans_chars:= w0; w0:= 3; w1:= address(ans_status); w2:=event; monitor(22); ! send answer ! testout(.w3.,w0:=2,w1,w2:=60); goto central_wait; end; end; ! message ! coru_found: link(.w3.,w1,w2:=address(activqfst)); activate: w1:=address(activqfst); if w3:=(w1).c_next=w1 then goto central_wait; current:= w3; get_branches(.w3.,w0:=(w3).c_nr); testout(.w3.,w0:=!length(prcorout),w1:=current,w2:=11); w0:= (w3).c_w0; w1:= (w3).c_w1; w2:= (w3).c_w2; call w0 current.c_ic; end; ! main program ! body of waitmess begin incode ref return; begin return:=w3; w3:=b.current; (w3).c_w0:=w0; (w3).c_w1:=w1; (w3).c_ic:=w0:=return; w0:=-1; (w3).c_mbuf:= w0; link(.w3.,w1:=w3,w2:=address(b.waitqfst)); testout(.w3.,w0:=!length(coroutine),w1,w2:=62); goto b.activate; end; end; ! waitmess ! body of sendwait begin incode ref return; begin return:=w3; w3:=b.current; (w3).c_w1:=w1; (w3).c_w2:=w2; w3:=w2; monitor(16); ! send message ! w1:=b.current; (w1).c_mbuf:=w2; (w1).c_ic:=w0:=return; link(.w3.,w1,w2:=address(b.answerqfst)); testout(.w3.,w0:=6,w1:=(w3).c_w1,w2:=63); goto b.activate; end; end; ! sendwait ! body of link begin incode double savef1; word savew2; ref return; begin savef1:=f1; savew2:=w2; return:=w3; ! remove queue element from actual queue ! w3:=(w1).c_prev; (w3).c_next:=w0:=(w1).c_next; w3:=(w1).c_next; (w3).c_prev:=w0:=(w1).c_prev; ! link up element as the last element in the queue ! (w1).c_prev:=w3:=(w2).c_prev; (w1).c_next:=w2; (w2).c_prev:=w1; (w3).c_next:=w1; f1:=savef1; w2:=savew2; w3:=b.current; call w0 return; end; end; ! link ! body of move begin incode double savef1; word savew2; ref return; begin savef1:=f1; savew2:=w2; return:=w3; w3:=w1+w0; while w1 < w3 do begin ! move from w1 to w2, one word at a time ! (w2).word:=w0:=(w1).word; w1+2; w2+2; end; f1:=savef1; w2:=savew2; w3:=b.current; call w0 return; end; end; ! move ! body of opmess begin incode double savef1,savef3; text(14) parent; begin savef1:=f1; savef3:=f3; w1:=66; w1:=(w1).word+50; move(.w3.,w0:=8,w1:=(w1).word+2,w2:=address(parent)); w3:=w2; f1:=savef1; monitor(16); ! send message to parent ! w1:=address(b.ans_status); monitor(18); ! wait answer ! f1:=savef1; f3:=savef3; end; end; ! opmess ! body of get_branches comment get overlay code necessary to execute coroutine; begin label discerror; incode double savef1; word savew2; ref return; word lastcorutype:= -1, currcorutype; byte op:= 2, mode:= 8'1001; text(6) t_status:= "status"; word status; text(11) t_progname; begin savef1:= f1; savew2:= w2; return:= w3; w3:= 0; f0//100; currcorutype:= w0; if w0<>lastcorutype then begin if w0>=2 then ! dev corout ! if w0:=lastcorutype<2 then begin ! transport coroutine procedures ! !get 5; if w0<>1 then goto discerror; end; case w1:= currcorutype+1 of begin !get 3; ! apl interface ! !get 4; ! opr interface ! !get 6; ! printer ! !get 7; ! punch ! !get 8; ! reader ! !get 8; ! cardr. , uses reader corout ! !get 9; ! tty ! end; !test 11; if w0<>1 then goto discerror; lastcorutype:= w0:= currcorutype; end; if w2:=b.current>0 then if w0:=(w2).c_ic=0 then begin case w1:= currcorutype+1 of begin appl_interface(.w3.); operator(.w3.); pr(.w3.); pc(.w3.); rd(.w3.); rd(.w3.); tw(.w3.); end; (w2).c_ic:= w3; !test 12; end; f1:= savef1; w2:= savew2; w3:= b.current; call w0 return; discerror: status:= w0; move(.w3.,w0:=8,w1:=w3,w2:=address(t_progname)); w1:= address(op); opmess(.w3.,w1); end; end; ! get branches ! body of copyanswer comment answer operation: copy data area into sender send answer ; begin incode word resw0, savew0,savew2; ref return; ! general copy params ! word gc_func:= 13; ! from me to sender ! ref gc_first, gc_last; word gc_rel:= 0; begin savew0:= w0; savew2:= w2; return:= w3; gc_first:= w0; gc_last:= w1; w1:= address(gc_func); monitor(84); ! general copy ! resw0:= w0; if w0=2 then begin ! stopped ! b.ans_status:= w0:= 8'00000400; w0:= 1; end else if w0=3 then begin ! unintel, param error ! end else begin b.ans_status:= w0:= 0; b.ans_bytes:= w1; w0:= w1; b.ans_chars:= w1 ashift -1 + w0; testout(.w3.,w0,w1:=savew0,w2:=66); w0:= 1; end; w1:= address(b.ans_status); w2:= savew2; monitor(22); ! send answer ! testout(.w3.,w0:=6,w1,w2:=61); w0:= resw0; w1:= b.ans_bytes; w2:= savew2; w3:= b.current; call w0 return; end; end; ! copy answer ! body of outtime begin record timetext(word hourtxt,minutetxt); incode word daysize:=1687500,hoursize:=70313,minutesize:=1172; ref return,bufref; double savef1; begin savef1:=f1; bufref:=w2; return:=w3; f3:=(w3:=108).double lshift -9 // daysize; ! w3:=dayno ! f1 lshift -100; ! 0 ! f2 // hoursize; ! w2:=hour ! f1 // minutesize; ! w1:=minute ! w0:=0; f1 // 10; bufref.minutetxt:=w1 + 48 lshift 8 + w0 + 48 lshift 8 + 32; w1:=0; f2 // 10; bufref.hourtxt:=w2 + 48 lshift 8 + w1 + 48 lshift 8 + 46; f1:=savef1; w2:=bufref; w3:=return; end; end; body of testout begin label close; record dump (word reg0,reg1,reg2,reg3,exreg,instr,cause,sbreg); record testhead (byte reclength,reckind; word time,testref); incode word bufrel:=0; ref return; double savef1; word savew2; begin if w0>500 then w0:= 500; ! cut down size of test record ! savef1:=f1; savew2:=w2; return:=w3; if w3:=b.testmfst < b.testmlast then begin ! if testbuffer exists then generate testoutput ! if w0+bufrel+(!length(testhead)+2) > 510 then begin ! no room for next record so change buffer ! w3+bufrel; (w3).word:=w0:=-1; w1:=address(b.testmop); w3:=address(b.testname); monitor(16); ! send message ! w1:=b.testmfst; monitor(18); ! wait answer ! if w2:=1 lshift w0 or (w1).word <> 2 then begin b.testmlast:=w1:=b.testmfst; w1:=address(b.tstcomop); (w1).logstatus:=w2; opmess(.w3.,w1); end; if w1:=b.testsegm+1 = b.maxtestsegm then w1:=1; b.testsegm:=w1; bufrel:=w0:=0; end; f1:=savef1; w2:=savew2; w3:=b.testmfst+bufrel; (w3).reclength:=w0+!length(testhead); (w3).reckind:=w2; bufrel:=w1:=bufrel+w0; w1:= b.current; if w1<>0 then w1:= (w1).c_nr; (w3).testref:=w1; w1:=108; f1:=(w1).double-b.starttime lshift -7; (w3).time:=w1; f1:=savef1; move(.w3.,w0,w1,w2:=w3+!length(testhead)); end; w2:=savew2; if w2=15 then begin ! internal interrupt ! w3:=(w1).instr-2; if w0:=(w3).word lshift -12 = (51*64) ! key store ! then begin ! reestablish registers and continue ! w0:=(w1).instr; return:=w0; w0:=(w1).reg0; w2:=(w1).reg2; w3:=(w1).reg3; w1:=(w1).reg1; call w0 return; end else begin ! output last segment and halt ! close: (w3:=b.testmfst+bufrel).word:=w0:=-2; w3:=address(b.testname); w1:=address(b.testmop); monitor(16); ! send message ! w1:= address(b.ans_status); monitor(18); ! wait answer ! monitor(10); ! release process ! end; end else if w2 = 64 then goto close else; f1:=savef1; w2:=savew2; w3:=b.current; call w0 return; end; end; ! testout ! body of compare begin incode word savew1, savew2; ref return; begin savew1:= w1; savew2:= w2; return:= w3; w3:= w1+w0; w0:= 0; while w1<w3 do begin w0:= (w1).word; w0-(w2).word; w1+2; w2+2; if w0<>0 then w1:= w3; end; w1:= savew1; w2:= savew2; w3:= b.current; call w0 return; end; end; ! compare ! body of create_tc begin incode double savef1; word savew2; ref return; begin savef1:= f1; savew2:= w2; return:= w3; w1:= (w3).ct_tc; w0:= 0; (w1).c_ic:= w0; (w1).tc_created:= w0:= 1; (w1).tc_hostno:= w0:= (w3).ct_hostno; (w1).tc_hostid:= w0:= (w3).ct_hostid; w2:= address((w1).tc_devname); move(.w3.,w0:=8,w1:=return.ct_devname,w2); w1:= return.ct_tc; w2:= address((w1).tc_name); w1:= return.ct_procref; w1+2; move(.w3.,w0,w1,w2); w1:= return.ct_tc; w2:= address((w1).tc_console); if w0:=(w2).word=0 then ! no operator ! begin w3:= address((w1).tc_qgroup); (w3).word:= w0; if w0:=(w1).tc_kind=8 ! tty ! then begin move(.w3.,w0:=8,w1:=address((w1).tc_name),w2); end else if w0:=(w1).tc_hostno=0 ! local ! then begin w1:= b.procconsole; w1+2; move(.w3.,w0:=8,w1,w2); end else; end; link(.w3.,w1:=return.ct_tc,w2:=address(b.activqfst)); testout(.w3.,w0:=!length(transpcorout),w1,w2:=53); f1:= savef1; w2:= savew2; w3:= return; end; end; ! create_ct ! body of remove_tc begin incode double savef1; word savew2; ref return; begin savef1:= f1; savew2:= w2; return:= w3; w1:= (w3).rt_tc; w0:= 0; (w1).c_mbuf:= w0; (w1).tc_created:= w0; w3:= address((w1).tc_name); monitor(10); ! release ! if w2:= (w1).tc_hostno<>0 then begin ! remote ! monitor(64); ! remove process ! !test 30; end; if w0:=(w1).tc_kind=8 ! tty ! then begin ! remove operator ! w2:= address((w1).tc_console); (w2).word:= w0:= 0; w2:= address((w1).tc_devcons); (w2).word:= w0; end; link(.w3.,w1,w2:=address(b.waitqfst)); testout(.w3.,w0:=!length(prcorout),w1,w2:=54); f1:=savef1; w2:= savew2; w3:= return; end; end; ! remove_tc ! body of find_tc begin label found; incode word savew0, savew2, freetc; ref return; begin savew0:= w0; savew2:= w2; return:= w3; freetc:= w0:= 0; w1:= b.tcpool_fst; while w1<b.tcpool_top do begin if w0:=(w1).tc_kind=return.ft_kind then begin if w0:=(w1).tc_hostno=return.ft_hostno then if w0:=(w1).tc_hostid=return.ft_hostid then begin compare(.w3.,w0:=8,w1+!position(tc_devname),w2:=return.ft_devname); w1-!position(tc_devname); if w0=0 then goto found; end; if w0:=freetc=0 then if w0:=(w1).tc_created=0 ! not created ! then begin w2:= address((w1).tc_console); if w0:=(w2).word=0 then freetc:= w1; ! no operator logged in ! end; end; w1:= (w1).tc_nexttc; end; w1:= freetc; found: if w0:=(w1).tc_created=0 then -(w1); w0:= savew0; w2:= savew2; w3:= return; ! w3 not equal to current corout++++++ ! !test 70; end; end; ! find_tc ! body of looktransport begin incode word savew0, savew1; ref return; begin savew0:= w0; savew1:= w1; return:= w3; ! check legality of transport name ! w2:= 1; if w1<b.trans_first then w2:= -1; if w1>=b.trans_top then w2:= -1; w1 extract 9; while w1>0 do w1-!length(tr_descr); if w1<>0 then w2:= -1; if w2>0 then begin b.bs_op:= w0:= 3; b.bs_segno:= w1:= savew1 ashift -9; ioworkarea(.w3.,w1:=address(b.bs_op)); w2:= savew1 extract 9; w2+b.bs_first; w1:= 108; f1:= (w1).double lshift -20; if w0:=(w2).tr_waitmess=0 then if w0:=(w2).tr_removetime<w1 then ! entry free ! w2:= 0; end; w0:= savew0; w1:= savew1; w3:= b.current; !test 305; call w0 return; end; end; ! looktransport ! body of puttransport begin incode ref return; word savew0, savew1, savew2; begin savew0:= w0; savew1:= w1; savew2:= w2; return:= w3; b.bs_op:= w0:= 5; b.bs_segno:= w1 ashift -9; w1:= savew1 extract 9; w1+b.bs_first; testout(.w3.,w0:=!length(tr_descr),w1,w2:=68); ioworkarea(.w3.,w1:=address(b.bs_op)); w0:= savew0; w1:= savew1; w2:= savew2; w3:= b.current; call w0 return; end; end; ! puttransport ! body of ioworkarea comment transport a segment to or from the spool area ; begin incode word status, bytes, chars, a4, a5, a6, a7, a8; double savef1; ref savew2, return; begin savef1:= f1; savew2:= w2; return:= w3; testout(.w3.,w0:=8,w1,w2:=52); w3:= address (b.spoolname); monitor(16); w1:= address(status); monitor(18); if w2:=1 lshift w0 or (w1).word <> 2 then begin w1:=address(b.spcomop); (w1).logstatus:=w2; testout(.w3.,w0:=16,w1,w2:=64); opmess(.w3.,w1); end; f1:= savef1; w2:= savew2; w3:= b.current; call w0 return; end; end; ! ioworkarea ! body of linkupremote begin incode word savew1, return; text(14) host:= "host"; ! operation message ! word om_op:= 2'000000000001000000001100; ref om_first, om_last; byte om_unu1, om_hostno; word om_hostid; byte om_homereg:= 0, om_netid:= 0; ! operation output ! word oo_modekind, oo_timeoutsbuffers:= 0, oo_bufsize:= 0; text(11) oo_deviname; word oo_unu1; word oo_net1:= 0, oo_net2:= 0, oo_unu2; ! operation answer ! word oa_return,oa_bytes,oa_chars,oa_net1,oa_net2,oa_net3,oa_d1,oa_d2; ! operation input ! word oi_kind,oi_bufs,oi_bufsize; text(11) oi_deviname; word oi_net1,oi_net2,oi_net3; ref oi_procdescr; begin savew1:= w1; return:= w3; om_hostno:= w0:= (w3).lur_hostno; om_hostid:= w0:= (w3).lur_hostid; oo_modekind:= w0:= (w3).lur_kind; move(.w3.,w0:=8,w1:=(w3).lur_deviname,w2:=address(oo_deviname)); ! move output to input area ! move(.w3.,w0:=22,w1:=address(oo_modekind),w2:=address(oi_kind)); om_first:= w2; w2+20; om_last:= w2; testout(.w3.,w0:=22,w1,w2:=66); w1:= address(om_op); testout(.w3.,w0:=12,w1,w2:=2); w3:= address(host); monitor(16); ! send message ! w1:= address(oa_return); monitor(18); ! wait answer ! if w0<>1 then oa_return:= w0:= 1; ! a little bit dirty ! testout(.w3.,w0:=12,w1,w2:=67); testout(.w3.,w0:=22,w1:=address(oi_kind),w2:=66); w0:= oa_return; w2:= oi_procdescr; w1:= savew1; w3:= return; end; end; ! link up remote ! !branch 1,2; body of init begin label allocate,initbufs; incode ref return; byte opversion:=16,modeversion:= 8'0140; text(14) textversion:= ! *** primo *** ! "release: 2.1" ; word ! date of version ! verdate:= 791126, comment ===trimstart; ! date of options ! options := 0, ! number of printer coroutines ! prcount := 3, ! size of printer buffer (halfwords) ! prbufsize := 128, ! leading and trailing page on printer lists ! prltpage := 1, ! max lines pr printer page ! prlinepage := 100, ! number of punch coroutines ! pccount := 1, ! size of punch buffer (halfwords) ! pcbufsize := 128, ! number of reader coroutines ! rdcount := 1, ! size of reader buffer (halfwords) ! rdbufsize := 128, ! number of cardreader coroutines ! cdcount := 1, ! size of cardreader buffer (halfwords) ! cdbufsize := 108, ! number of tty coroutines (halfwords) ! twcount := 1, ! size of tty buffer ! twbufsize := 64, ! no of operator coroutines ! oprcount := 2, ! no of transport description segmnts ! trsegm := 100, ! size of testoutput area ! testsegmnts := 42, ! transport description save period ! trsaveminut := 60, ! no of waiting transports ( total ) ! waittrans := 50, ! no of pending wait operations ! waitops := 5, ! output details to operator ( when <> 0) ! oprdetails := 1, comment ===trimfinis; spoolpointer:=0; text(11) testarea:= "primotest", spoolarea:= "primospool", pseudoname:= "primosys"; array(1:10) tail of word := 0 0 0 0 0 0 0 0 0 0; ref queuefst,queuetop; ref tcbufref, oprbufref; byte op1:=16,mode1:=8'40; word alarm; text(14) resource:= ""; word stdvalue,margin,bufclaim,stop:=0; text(14)size := "size", area := "area", buf := "buf"; byte funcop:= 16, funcmode:= 0; text(21) functext:="***function 1,2,3,4,5"; byte inittrop:= 2, inittrmode:= 1; text(20)inittr:=" ***init troubles"; byte op2:=16,mode2:=0; text(20) started:="started"; word pos_nine:= 9, neg_nine:= -9; begin return:=w3; goto allocate; initbufs: w0:= 0; w2:= b.tcpool_top; for w2-2 step 2 downto b.bs_first do (w2).word:= w0; w1:= queuefst; w2:= address(b.tqfreefst); while w1<queuetop do begin (w1).tq_next:= w1; (w1).tq_prev:= w1; link(.w3.,w1,w2); w1+!length(queuerec); end; ! init appl. interface corout ! w1:= b.apl_fst; (w1).c_next:= w1; (w1).c_prev:= w1; (w1).c_nr:= w0:= 1; link(.w3.,w1,w2:=address(b.activqfst)); ! init opr. interface ! w1:= b.opr_fst; if w0:=oprcount>0 then for w0:=1 step 1 upto oprcount do begin (w1).c_next:= w1; (w1).c_prev:= w1; (w1).c_nr:= w3:= w0+100; (w1).opr_buf:= w2:= oprbufref; w2+b.oprt_bufl+(!length(bufhead)-2); oprbufref:= w2; link(.w3.,w1,w2:=address(b.activqfst)); w1+!length(oprcorout); end; w1:= b.tcpool_fst; if w3:=prcount>0 then for w3:=1 step 1 upto prcount do begin (w1).c_next:=w1; (w1).c_prev:=w1; (w1).c_nr:=w2:=w3+200; (w1).tc_kind:= w0:= 14; (w1).tc_nexttr:= w0:= address((w1).tc_nexttr); (w1).tc_prevtr:= w0; (w1).tc_buf:=w2:=tcbufref; w2+prbufsize+(!length(bufhead)-2); tcbufref:= w2; (w1).tc_bufsize:= w0:= prbufsize; w0:= w1+!length(prcorout); (w1).tc_nexttc:= w0; w1:= w0; end; if w3:=pccount>0 then for w3:= 1 step 1 upto pccount do begin (w1).c_next:=w1; (w1).c_prev:=w1; (w1).c_nr:=w2:=w3+300; (w1).tc_kind:= w0:= 12; (w1).tc_nexttr:= w0:= address((w1).tc_nexttr); (w1).tc_prevtr:= w0; (w1).tc_buf:=w2:=tcbufref; w2+pcbufsize+(!length(bufhead)-2); tcbufref:= w2; (w1).tc_bufsize:= w0:= pcbufsize; w0:= w1+!length(pccorout); (w1).tc_nexttc:= w0; w1:= w0; end; if w3:=rdcount>0 then for w3:=1 step 1 upto rdcount do begin (w1).c_next:=w1; (w1).c_prev:=w1; (w1).c_nr:=w2:=w3+400; (w1).tc_kind:= w0:= 10; (w1).tc_nexttr:= w0:= address((w1).tc_nexttr); (w1).tc_prevtr:= w0; (w1).tc_buf:=w2:=tcbufref; w2+rdbufsize+(!length(bufhead)-2); tcbufref:= w2; (w1).tc_bufsize:= w0:= rdbufsize; w0:= w1+!length(rdcorout); (w1).tc_nexttc:= w0; w1:= w0; end; if w3:=cdcount>0 then for w3:= 1 step 1 upto cdcount do begin ! use reader corout ! (w1).c_next:= w1; (w1).c_prev:= w1; (w1).c_nr:= w2:= w3+500; (w1).tc_kind:= w0:= 16; (w1).tc_nexttr:= w0:= address((w1).tc_nexttr); (w1).tc_prevtr:= w0; (w1).tc_buf:= w2:= tcbufref; w2+cdbufsize+(!length(bufhead)-2); tcbufref:= w2; (w1).tc_bufsize:= w0:= cdbufsize; w0:= w1+!length(rdcorout); (w1).tc_nexttc:= w0; w1:= w0; end; if w3:=twcount>0 then for w3:= 1 step 1 upto twcount do begin (w1).c_next:= w1; (w1).c_prev:= w1; (w1).c_nr:= w2:= w3+600; (w1).tc_kind:= w0:= 8; (w1).tc_nexttr:= w0:= address((w1).tc_nexttr); (w1).tc_prevtr:= w0; (w1).tc_buf:= w2:= tcbufref; w2+twbufsize+(!length(bufhead)-2); tcbufref:= w2; (w1).tc_bufsize:= w0:= twbufsize; w0:= w1+!length(twcorout); (w1).tc_nexttc:= w0; w1:= w0; end; testout(.w3.,w0:=50,w1:=address(verdate),w2:=69); w1:= 66; testout(.w3.,w0:= 150,w1:=(w1).word-4,w2:=8); b.bs_op:= w0:= 5; ! clear work area ! w1:= address(b.bs_op); w2:= b.trans_top ashift neg_nine; for w2-1 step 1 downto 0 do begin b.bs_segno:= w2; ioworkarea(.w3.,w1); end; call w0 return; allocate: opmess(.w3.,w1:=address(opversion)); w3:= 66; w3:= (w3).word+29; ! test function mask ! if w0:=(w3).byte onemask 8'3700 then else begin stop:= w0:= 1; opmess(.w3.,w1:=address(funcop)); end; w1:= 108; b.starttime:= f1:= (w1).double; b.activqfst:=w0:=address(b.activqfst); b.activqlast:=w0; b.answerqfst:=w0:=address(b.answerqfst); b.answerqlast:=w0; b.waitqfst:=w0:=address(b.waitqfst); b.waitqlast:=w0; b.holdqfst:= w0:= address(b.holdqfst); b.holdqlast:= w0; b.tqfreefst:= w0:= address(b.tqfreefst); b.tqfreelast:= w0; b.bs_first:= w1:= b.firstfree; w1+510; b.bs_last := w1; w1+2; oprbufref:= w1; ! buffer for operator ! w0:=(!length(bufhead)-2)+b.oprt_bufl; w1+w0; tcbufref:=w1; w0:=(!length(bufhead)-2)+prbufsize; w0*prcount; w1+w0; w0:=(!length(bufhead)-2)+pcbufsize; w0*pccount; w1+w0; w0:=(!length(bufhead)-2)+rdbufsize; w0*rdcount; w1+w0; w0:=(!length(bufhead)-2)+cdbufsize; w0*cdcount; w1+w0; w0:=(!length(bufhead)-2)+twbufsize; w0*twcount; w1+w0; queuefst:= w1; w0:= !length(queuerec); w0*waittrans; w1+w0; queuetop:= w1; b.apl_fst:= w1; w1+!length(coroutine); b.opr_fst:= w1; w0:= !length(oprcorout)*oprcount; w1+w0; b.opr_top:= w1; b.tcpool_fst:= w1; w0:= !length(prcorout)*prcount; w1+w0; w0:=!length(pccorout)*pccount; w1+w0; w0:=!length(rdcorout)*rdcount; w1+w0; w0:=!length(rdcorout)*cdcount; w1+w0; w0:=!length(twcorout)*twcount; w1+w0; b.tcpool_top:= w1; w3:=66; w3:=(w3).word+22; f3:=(w3).double; w3-2; b.testmlast:=w3; if w0:=testsegmnts > 0 then w3-510; b.testmfst:=w3; margin:=w3-w1; if w3 <> 0 then begin w0:=b.testmlast+2; stdvalue:=w0-w2-margin; move(.w3.,w0:=8,w1:=address(size),w2:=address(resource)); if w3:=margin < 0 then begin alarm:=w2:=2763306; ! "***" ! stop:=w2; end else alarm:=w2:=2105376; ! " " ! opmess(.w3.,w1:=address(op1)); end; w3:=66; w3:=(w3).word+26; bufclaim:=w1:=(w3).byte; w3+1; w1:=(w3).byte; ! area process claim +3 primospool primotest primosys (pseudo) ! margin:= w1-(w2:= prcount+pccount+rdcount+cdcount+twcount+3); if w1 <> 0 then begin stdvalue:=w2 + 1 ! one for program area process ! ; move(.w3.,w0:=8,w1:=address(area),w2:=address(resource)); if w3:=margin < 0 then begin alarm:=w2:=2763306; ! "***" ! stop:=w2; end else alarm:=w2:=2105376; ! " " ! opmess(.w3.,w1:=address(op1)); end; margin:= w1:= bufclaim-(w2:= 1+prcount+pccount+rdcount+cdcount+twcount+ oprcount + 1 ! testoutput ! +waitops); if w1 <> 0 then begin stdvalue:=w2; move(.w3.,w0:=8,w1:=address(buf),w2:=address(resource)); if w3:=margin < 0 then begin alarm:=w2:=2763306; ! "***" ! stop:=w2; end else alarm:=w2:=2105376; ! " " ! opmess(.w3.,w1:=address(op1)); end; w3:=address(spoolarea); monitor(48); ! remove entry ! f2:= b.starttime; f2 lshift -19; (tail(w1:=6)).word:= w2; b.trans_first:= w2:= 0; w2:= trsegm; b.trans_top:= w2 ashift 9; w2 ashift -9; (tail(w1:=1)).word:=w2; monitor(40); ! create spool area ! w1:=3; monitor(50); ! permanent entry ! monitor(52); ! create area process ! monitor(8); ! reserve area process ! if w0 <> 0 then begin stdvalue:=w2; move(.w3.,w0:=8,w1:=address(spoolarea),w2:=address(resource)); alarm:=w2:=2763306; stop:=w2; opmess(.w3.,w1:=address(op1)); end; move(.w3.,w0:=8,w1:=address(spoolarea),w2:=address(b.spoolname)); w3:=address(testarea); monitor(48); ! remove entry ! (tail(w1:=1)).word:=w2:=testsegmnts; b.maxtestsegm:=w2; if w2 > 0 then begin monitor(40); ! create testoutput area ! w1:=3; monitor(50); ! permanent entry ! monitor(52); ! create area process ! monitor(8); ! reserve area process ! if w0 <> 0 then begin stdvalue:=w2; move(.w3.,w0:=8,w1:=address(testarea),w2:=address(resource)); alarm:=w2:=2763306; stop:=w2; opmess(.w3.,w1:=address(op1)); end; move(.w3.,w0:=8,w1:=address(testarea),w2:=address(b.testname)); end; if w0:=stop <> 0 then begin ! the resources are not available for start up ! opmess(.w3.,w1:=address(inittrop)); end; opmess(.w3.,w1:=address(op2)); b.prheadtrail:= w0:= prltpage; b.oprtdetails:= w0:= oprdetails; b.prlpage:= w0:= prlinepage; w0:= 0; w1:= trsaveminut*(60*1000*10); b.trsaveperiod:= f1; b.waitbufs:= w0:= waitops; w3:=address(pseudoname); monitor(80); goto initbufs; end; end; ! init ! !branch 1,3; body of freetransport comment find a free transport description if possible, and make the description available in core; begin label exit; incode ref return; begin return:= w3; if w1:= b.trans_old<0 then begin b.trans_old:= w1:= b.trans_first; end; w2:= 0; while w2=0 do begin w3:= w1+(!length(tr_descr)+!length(tr_descr)-2) ashift -9 ashift 9; if w3>w1 then begin ! change segment ! if w3=b.trans_top then w1:=b.trans_first else w1:= w3; end else w1+!length(tr_descr); looktransport(.w3.,w1,w2); if w2>0 then w2:= 0 else begin w2:= w1 extract 9; w2+b.bs_first; end; if w1=b.trans_old then goto exit; end; exit: b.trans_old:= w1; w3:= b.current; !test 311; call w0 return; end; end; ! freetransport ! body of deftr_semantic comment execute define transport operation. called from application interface coroutine to avoid breaking address limit ; begin label l_resources, l_ent, l_dev, l_devslow, exit; incode word savew2; ref return; ref transref, procref, tc_ref; word hostno, hostid; text(11) docname; ! file descriptor ! word ent_mk; text(11) ent_docname; word ent_6,ent_7,ent_8,ent_9,ent_10; word sender_receiver,bs_dev; ! help vars used to look up sender/receiver entries ! word zero:= 0; begin return:= w3; transref:= w2; w2:= b.event; w3:= (w2).cm_sender; if w3<=0 then -(w3); ! get sender cat base and check that it is contained in my std base ! w3+68; w2:= 66; w2:= (w2).word+76; transref.tr_basel:= w0:= (w3).word; if w0<(w2).word then goto l_resources; w3+2; w2+2; transref.tr_baseu:= w1:= (w3).word; if w1>(w2).word then goto l_resources; w3:= address(zero); monitor(72); ! set cat base ! !test 91; ! test sender and receiver entry ! sender_receiver:= w0:= 0; bs_dev:= w0; ! bs area not found yet ! while w0:=sender_receiver+1<=2 do begin sender_receiver:= w0; w1:= address(ent_mk); if w0=1 then w3:= address((w3:=transref).tr_sname) else w3:= address((w3:=transref).tr_rname); monitor(42); ! look up entry ! !test 92; if w0<>0 then goto l_ent; if w0:= ent_mk<0 then begin ! file descriptor ! if w0 extract 12=4 then begin ! bs descriptor ! transref.tr_bsstartptr:= w0:= ent_8 ashift 9; move(.w3.,w0:=8,w1:=address(ent_docname), w2:=address((w2:=transref).tr_bsarea)); w1:= address(ent_mk); w3:= address(ent_docname); monitor(42); ! look up entry ! !test 94; if w0<>0 then goto l_dev; if w0:= ent_mk<0 then goto l_dev; bs_dev:= w0:= sender_receiver; end else begin if w2:=sender_receiver=1 then begin !test 95; if w0=8 then ! typewriter ! else if w0=10 then ! reader ! else if w0=16 then ! cardr ! else goto l_ent; end else begin !test 96; if w0=12 then ! punch ! else if w0=14 then ! printer ! else goto l_ent; end; transref.tr_kind:= w0:= ent_mk; transref.tr_mode:= w0 lshift 1 lshift -13; hostno:= w0:= ent_7; hostid:= w0:= ent_8; move(.w3.,w0:=8,w1:=address(ent_docname),w2:=address(docname)); end; end ! file descriptor ! else begin !test 97; bs_dev:= w0:= sender_receiver; move(.w3.,w0:=8,w1:=w3, w2:=address((w2:=transref).tr_bsarea)); end; end; if w0:= bs_dev=0 then goto l_ent; ! bs_area not found ! w1:= address(b.tqfreefst); if w0:=(w1).tq_next=w1 then goto l_resources; ! no free queue element ! find_tc(.w3.,w0:=address(docname),w0:=hostno,w0:=hostid,w0:=transref.tr_kind, w1); !test 98; tc_ref:= w1; if w1=0 then begin ! no free coroutine ! goto l_resources; end else if w1>0 then begin ! exist allready ! end else begin ! dont exist ! if w0:=hostno=0 then begin ! local device ! w3:= address(docname); monitor(4); ! get process description ! !test 99; if w0=0 then goto l_devslow; procref:= w0; monitor(8); end else begin ! remote device ! linkupremote(.w3.,w0:=transref.tr_kind,w0:=hostno,w0:=hostid, w0:=address(docname),w0,w2); if w0<>4096 then if w0<>4103 then ! link not created ! goto l_devslow; procref:= w2; end; -(w1); tc_ref:= w1; create_tc(.w3.,w1,w0:=address(docname),w0:=hostno,w0:=hostid,w0:=procref); w2:= procref; comment if w0:=(w2+36).byte<>transref.tr_kind then goto l_devslow; end; w0:= 0; exit: w1:= tc_ref; w2:= transref; w3:= b.current; call w0 return; l_resources : w0:= 2; goto exit; l_ent : if w0:=sender_receiver=1 then w0:= 3 else w0:= 5; goto exit; l_dev : if w0:= sender_receiver=1 then w0:= 4 else w0:= 6; goto exit; l_devslow : if w0:=bs_dev=1 then w0:= 6 else w0:= 4; goto exit; end; end; ! deftr_semantic ! body of appl_interface comment application interface coroutine; begin label wait_m, rdt_resources,rdt_syntax,rdt_sent,rdt_sdev,rdt_rent,rdt_rdev, rgt, rgt_syntax, rgt_unknown, rgt_resources, tr_finished, rrt, rrt_syntax, rrt_unknown, rkt, rkt_syntax, rkt_unknown,repkill, stopped,unint,reject; record def_transport (word dth_op,dth_trname; text(11) dt_trname; word dth_user; text(11) dt_user; word dth_sub,dth_sender,dth_sname; text(11) dt_sname; word dth_receiver,dth_rname; text(11) dt_rname; word dth_queues,dth_qgroup; text(11) dt_qgroup; word dth_qname; text(11) dt_qname); record getst_transport (word gth_op,gth_no; word gt_no); record relea_transport (word rth_op,rth_no; word rt_no); record kill_transport (word kth_op,kth_no; word kt_no); incode ! answer define transport ! byte adt_1:= 3, adt_2:= 0, adt_3:= 1, adt_4:= 4'010010; text(11) adt_trname; byte adt_5:= 2, adt_6:= 4'010010; text(11) adt_user; byte adt_7:= 3, adt_8:= 4'010001; word adt_no; byte adt_9:= 4, adt_10:= 4'010000, adt_11:=1, adt_12:= 4'020001; word adt_rcode; byte adt_13, adt_14:= 4'020002; ! device troubles params ! word adt_cause, adt_status:= 0; ! answer get state ! byte agt_1, agt_2:= 0, agt_3:= 4, agt_4:= 4'010000, agt_5:= 1, agt_6:= 4'020001; word agt_rcode; byte agt_7:= 1, agt_8:= 4'010010; text(11) agt_trname; byte agt_9:= 3, agt_10:= 4'010001; word agt_no; byte agt_11:= 1000, agt_12:= 4'010000, agt_13:= 3, agt_14:= 4'020000, agt_15:= 4, agt_16:= 4'030001; word agt_state; byte agt_19:= 7, agt_20:= 4'030002; word agt_ptr1, agt_ptr2; byte agt_17:= 6, agt_18:= 4'030002; word agt_cause, agt_status; ! answer release descr ! byte art_1:= 9, art_2:= 0, art_3:= 4, art_4:= 4'010000, art_5:= 1, art_6:= 4'020001; word art_rcode; ! answer kill transport ! byte akt_1:= 11, akt_2:= 0, akt_3:= 4, akt_4:= 4'010000, akt_5:= 1, akt_6:= 4'020001; word akt_rcode; ! work area for control operation data ! array(1:(!length(def_transport)+2)) cont_data of byte; ! data area for control operation data, longer than longest data area ! ! general copy params ! word gc_func:= 4; ! copy from sender to me ! ref gc_first, gc_last; word gc_rel:= 0; word bytesmoved; ref transref, tc_ref; word transno; ! used by kill ! ref return; begin return:= w3; call w3 return; ! pseudo call ! wait_m: waitmess(.w3.,w2); cont_data(w1:=1); w3:= w1+!length(def_transport); gc_first:= w1; gc_last:= w3; w1:= address(gc_func); monitor(84); ! general copy core ! if w0=2 then goto stopped; if w0=3 then goto unint; if w1<=0 then goto unint; ! no data ! bytesmoved:= w1; cont_data(w1:=1); testout(.w3.,w0:=bytesmoved,w1,w2:=66); if w0:=(w1).word=4'2000000 then begin ! define transport ! if w0:=bytesmoved<>!position(dth_queues) then if w0<>!length(def_transport) then goto unint; ! length of data illegal ! freetransport(.w3.,w1,w2); if w2=0 then goto rdt_resources; adt_no:= w1; transref:= w2; w1:= w2+!length(tr_descr)-2; w0:= 0; for w1 step 2 downto transref do (w1).word:= w0; cont_data(w1:=1); if w0:=(w1).dth_trname<>4'1010010 then goto rdt_syntax; !test 52; move(.w3.,w0:=8,w1:=address((w1).dt_trname),w2:=address(adt_trname)); move(.w3.,w0,w1,w2:=address((w2:=transref).tr_name)); cont_data(w1:=1); if w0:=(w1).dth_user<>4'2010010 then goto rdt_syntax; move(.w3.,w0:=8,w1:=address((w1).dt_user),w2:=address(adt_user)); move(.w3.,w0,w1,w2:=address((w2:=transref).tr_user)); cont_data(w1:=1); if w0:=(w1).dth_sub<>(1000*4096+4'010000) then goto rdt_syntax; if w0:=(w1).dth_sender<>4'1020000 then goto rdt_syntax; if w0:=(w1).dth_sname<>4'2030010 then goto rdt_syntax; move(.w3.,w0:=8,w1:=address((w1).dt_sname),w2:=address((w2:=transref).tr_sname)); cont_data(w1:=1); if w0:=(w1).dth_receiver<>4'2020000 then goto rdt_syntax; if w0:=(w1).dth_rname<>4'2030010 then goto rdt_syntax; !test 58; move(.w3.,w0:=8,w1:=address((w1).dt_rname),w2:=address((w2:=transref).tr_rname)); if w1:=bytesmoved=!length(def_transport) then begin ! queue fields present ! cont_data(w1:=1); if w0:=(w1).dth_queues<>4'3030000 then goto rdt_syntax; if w0:=(w1).dth_qgroup<>4'1100010 then goto rdt_syntax; move(.w3.,w0:=8,w1:=address((w1).dt_qgroup),w2:=address((w2:=transref).tr_qgroup)); cont_data(w1:=1); if w0:=(w1).dth_qname<>4'3100010 then goto rdt_syntax; !test 60; move(.w3.,w0:=8,w1:=address((w1).dt_qname),w2:=address((w2:=transref).tr_qname)); end; deftr_semantic(.w3.,w0,w1,w2:=transref); !test 61; tc_ref:= w1; case w1:= w0 of ! w1=0 transport defined, no action ! begin rdt_syntax : w1:= 1; rdt_resources : w1:= 3; rdt_sent : begin adt_13:= w1:= 3; adt_cause:= w1:= 1; w1:= 5; end; rdt_sdev : begin adt_13:= w1:= 3; adt_cause:= w1:= 2; w1:= 5; end; rdt_rent : begin adt_13:= w1:= 4; adt_cause:= w1:= 1; w1:= 6; end; rdt_rdev : begin adt_13:= w1:= 4; adt_cause:= w1:= 2; w1:= 6; end; end; adt_rcode:= w1; if w1>=5 ! device troubles ! then w1:= address(adt_status) else w1:= address(adt_rcode); copyanswer(.w3.,w0:=address(adt_1),w1,w2:=b.event); if w0=0 then ! data copied to sender ! if w0:=adt_rcode=0 then begin ! operation accepted, initialize transport ! w2:= transref; (w2).tr_corou:= w0:= tc_ref; (w2).tr_state:= w0:= 0; (w2).tr_removetime:= w0:= 8'37777777; puttransport(.w3.,w1:=adt_no); link(.w3.,w1:=b.tqfreefst,w2:=address(tc_ref.tc_nexttr)); (w1).tq_transno:= w0:= adt_no; end; end ! define transport ! else if w0=4'10000000 then begin ! get state of subtransport ! if w0:=bytesmoved<>!length(getst_transport) then goto unint; ! length of data illegal ! agt_1:= w0:= 5; ! ans get state ! cont_data(w1:=1); if w0:=(w1).gth_no<>4'3010001 then goto rgt_syntax; looktransport(.w3.,w1:=(w1).gt_no,w2); agt_no:= w1; if w2<=0 then goto rgt_unknown; transref:= w2; if w0:=(w2).tr_state=0 then begin ! not finished ! w1:= (w2).tr_corou; if w0:=(w1).tc_transno<>agt_no then agt_state:= w0:= 2 ! waiting ! else begin ! executing or hold state ! agt_state:= w0:= 3; ! executing ! w2:= b.holdqfst; while w3:=address(b.holdqfst)<>w2 do begin if w1=w2 then agt_state:= w0:= 4; ! hold ! w2:= (w2).c_next; end; end; end else begin ! finished ! tr_finished: agt_state:= w0:= (w2).tr_state; agt_cause:= w0:= (w2).tr_cause; agt_status:= w0:= (w2).tr_status; agt_ptr1:= w0:= 0; agt_ptr2:= w0:= (w2).tr_charposition; end; w0:= 0; rgt: ! reply get transport ! agt_rcode:= w0; move(.w3.,w0:=8,w1:=address((w1:=transref).tr_name), w2:=address(agt_trname)); if w1:=agt_state=5 then w1:= address(agt_ptr2) else if w1=6 then w1:= address(agt_status) else w1:= address(agt_state); copyanswer(.w3.,w0:=address(agt_1),w1,w2:=b.event); if w0<>w0 then begin ! operation not accepted ! rgt_syntax : w0:= 1; goto rgt; rgt_unknown : w0:= 2; goto rgt; rgt_resources: w0:= 3; goto rgt; end; end ! get state of transport ! else if w0=4'12000000 then begin ! wait and get state of subtransport ! if w0:=bytesmoved<>!length(getst_transport) then goto unint; ! length of data illegal ! agt_1:= w0:= 7; ! answer waitget transport ! cont_data(w1:=1); if w0:=(w1).gth_no<>4'3010001 then goto rgt_syntax; looktransport(.w3.,w1:=(w1).gt_no,w2); agt_no:= w1; if w2<=0 then goto rgt_unknown; transref:= w2; if w0:=(w2).tr_state=0 then begin ! not finished ! if w0:=(w2).tr_waitmess>0 then goto reject; if w0:=b.waitbufs<=0 then goto rgt_resources; b.waitbufs:= w0-1; transref.tr_waitmess:= w2:= b.event; puttransport(.w3.,w1:=agt_no); end else begin ! finished ! goto tr_finished; end; end ! wait and get state of transport ! else if w0=4'20000000 then begin ! release description ! if w0:=bytesmoved<>!length(relea_transport) then goto unint; ! length of data illegal ! cont_data(w1:=1); if w0:=(w1).rth_no<>4'3010001 then goto rrt_syntax; looktransport(.w3.,w1:=(w1).rt_no,w2); if w2<=0 then goto rrt_unknown; if w0:=(w2).tr_removetime>=8'37777776 then w0:= 8'37777776 else w0:= 0; (w2).tr_removetime:= w0; w0:= 0; rrt: ! reply release transport ! art_rcode:= w0; copyanswer(.w3.,w0:=address(art_1),w1:=address(art_rcode),w2:=b.event); cont_data(w1:=1); if w0=0 then ! data copied to sender ! if w0:=art_rcode=0 then ! operation accepted ! puttransport(.w3.,w1:=(w1).rt_no); if w0<>w0 then begin ! operation not accepted ! rrt_syntax : w0:= 1; goto rrt; rrt_unknown : w0:= 2; goto rrt; end; end ! release description ! else if w0=4'22000000 then begin ! kill ! if w0:=bytesmoved<>!length(kill_transport) then goto unint; ! length of data illegal ! cont_data(w1:=1); if w0:=(w1).kth_no<>4'3010001 then goto rkt_syntax; looktransport(.w3.,w1:=(w1).kt_no,w2); if w2<=0 then goto rkt_unknown; transref:= w2; transno:= w1; w0:= 0; if w0<>w0 then begin ! operation not accepted ! rkt_syntax : w0:= 1; goto rkt; rkt_unknown : w0:= 2; end; rkt: ! reply kill transport ! akt_rcode:= w0; copyanswer(.w3.,w0:=address(akt_1),w1:=address(akt_rcode),w2:=b.event); if w0 or akt_rcode=0 then begin ! data copied to sender and operation accepted ! w2:= transref; if w0:=(w2).tr_state=0 then begin ! not finished ! w1:= (w2).tr_corou; if w0:=(w1).tc_transno<>transno then begin ! waiting ! w1:= address((w1).tc_nexttr); repkill: w1:= (w1).tq_next; if w0:=(w1).tq_transno<>transno then goto repkill; link(.w3.,w1,w2:=address(b.tqfreefst)); w2:= transref; if w0:=(w2).tr_removetime=8'37777776 ! released ! then w0:= 0 else begin w1:= 108; f1:= (w1).double+b.trsaveperiod lshift -20; end; (w2).tr_removetime:= w1; (w2).tr_state:= w0:= 8; ! killed by appl ! w0:= (w2).tr_waitmess; w1:= 0; (w2).tr_waitmess:= w1; puttransport(.w3.,w1:=transno); if w0>0 then begin b.event:= w0; ! very dirty ! agt_1:= w0:= 7; goto tr_finished; end; end else begin ! set coroutine flag ! (w1).tc_aintervent:= w0:= 1; end; end; ! not finished ! end; ! data copied to sender ! end ! kill ! else begin reject: w0:= 2; if w0<>w0 then begin unint: w0:= 3; end; b.ans_status:= w1:= 0; if w1<>w1 then begin stopped: w0:= 1; b.ans_status:= w1:= 8'400; end; b.ans_bytes:= w1:= 0; b.ans_chars:= w1; w1:= address(b.ans_status); w2:=b.event; monitor(22); ! send answer ! testout(.w3.,w0:=2,w1,w2:=61); end; w0:= 0; (w3).c_mbuf:= w0; goto wait_m; end; end; ! appl_interface ! !branch 1,4; body of nextchar begin incode ref return; begin return:= w3; if w1=0 then if w2=(w3).stp then w1:= 10 ashift 16 else begin w1:= (w2).word; w2+2; end; w0:= 0; f1 lshift 8; w3:= return; end; end; ! nextchar ! body of nextparam begin label l_text, outloop1, exit; incode ref return; word paramtype, char; ref parampointer, stoppointer; begin return:= w3; parampointer:= w0:= (w3).paramref; w0+8; stoppointer:= w0; for w3:= stoppointer-2 step 2 downto parampointer do (w3).word:= w0:= 0; w0:= 32; while w0=32 do nextchar(.w3.,w3:=return.stopbuf,w0,w1,w2); if w0=64 ! asterix ! then begin paramtype:= w3:= 2; nextchar(.w3.,w3:=return.stopbuf,w0,w1,w2); if w0<97 then begin paramtype:= w0:= -1; goto exit; end; goto l_text; end else if w0>=97 then begin ! text ! paramtype:= w3:= 1; l_text: while w0<>32 do begin if w0=10 then goto outloop1; char:= w0; if w3:=parampointer=stoppointer then ! string too long ! begin paramtype:= w0:= -1; goto exit; end; (w3).word:= w0:= (w3).word lshift 8 + char; if w0>4'33333333 then begin w3+2; parampointer:= w3; end; nextchar(.w3.,w3:=return.stopbuf,w0,w1,w2); end; outloop1: if w3:=parampointer<stoppointer then begin w0:= (w3).word; if w0<>0 then while w0<=4'33333333 do w0 lshift 8; (w3).word:= w0; end; end else if w0=10 then paramtype:= w0:= 0 else if w0< 48 then paramtype:= w0:= -1 else if w0>= 58 then paramtype:= w0:= -1 else begin ! digit ! paramtype:= w3:= 3; word(parampointer):= w3:= 0; while w0<>32 do begin if w0=10 then goto exit; char:= w0; if w0<48 then w0:= 200; if w0>=58 then ! not digit ! begin paramtype:= w0:= -1; goto exit; end; w0:= word(parampointer); w0*10; w0+char-48; word(parampointer):= w0; if w3<>0 then ! too big ! begin paramtype:= w0:= -1; goto exit; end; nextchar(.w3.,w3:=return.stopbuf,w0,w1,w2); end; end; exit: w0:= paramtype; w3:= return; end; end; ! nextparam ! body of lookupremote begin incode word savew1, savew2; ref return; text(14) host:= "host"; ! operation message ! word om_op; ref om_first, om_last; ref om_procref; ! operation output ! word oo_modekind:=14, oo_timeoutsbuffers:= 0, oo_bufsize:= 0; text(11) oo_deviname; word oo_unu1; word oo_net1:= 0, oo_net2:= 0, oo_unu2; ! operation answer ! word oa_return,oa_bytes,oa_chars,oa_net1,oa_net2,oa_net3,oa_d1,oa_d2; ! operation input ! word oi_kind,oi_bufs,oi_bufsize; text(11) oi_deviname; word oi_net1,oi_net2,oi_net3; ref oi_procdescr; begin savew1:= w1; savew2:= w2; return:= w3; if w0:=(w3).lur_function=2 then w0:= 2'000000000001000000000101 else w0:= 2'000000000001000000000111; om_op:= w0; w3:= (w3).lur_procnameref; monitor(4); ! get process description ! om_procref:= w0; move(.w3.,w0:=8,w1:=return.lur_devname,w2:=address(oo_deviname)); ! move output to input area ! move(.w3.,w0:=22,w1:=address(oo_modekind),w2:=address(oi_kind)); om_first:= w2; w2+20; om_last:= w2; testout(.w3.,w0:=22,w1,w2:=66); w1:= address(om_op); testout(.w3.,w0:=12,w1,w2:=2); w3:= address(host); monitor(16); ! send message ! w1:= address(oa_return); monitor(18); ! wait answer ! if w0<>1 then oa_return:= w0:= 1; ! a little bit dirty ! testout(.w3.,w0:=12,w1,w2:=67); testout(.w3.,w0:=22,w1:=address(oi_kind),w2:=66); w0:= oa_return; w1:= oi_kind; w2:= savew2; (w2).word:= w3:= oa_net1; w2+2; (w2).word:= w3:= oa_net2; w2:= savew2; w3:= return; end; end; ! look up remote ! body of terminalid comment convert devicehost linkno to the corresponding devicename. +++++++ This procedure exists only because the host procedure +++++++ lookup link is not implemented yet. the procedure is very dirty +++++++ because it uses an implementational detail in the device +++++++ host ; begin incode double savef1; word savew2; ref return; text(11) terminal:= "terminal"; begin savef1:= f1; savew2:= w2; return:= w3; w0+1; ! devicename = "terminal" concat text(devicehost linkno + 1) ! w3:= 0; f0//10; w2:= address(terminal); w2+4; if w0=0 then begin (w2).word:= w1:= (w2).word lshift -8 lshift 8 + 48 + w3; w2+2; (w2).word:= w1:= 0; end else begin (w2).word:= w1:= (w2).word lshift -8 lshift 8 + 48 + w0; w2+2; (w2).word:= w1:= w3+48; end; move(.w3.,w0:=8,w1:=address(terminal),w2:=savew2); f1:= savef1; w3:= b.current; call w0 return; end; end; body of find_consoldevice comment find a transport coroutine with the console name and device name given as parameters; begin label found; incode word savew0, savew1, savew2; ref return; byte dhlinkno, hostno; word hostid; text(11) workname; begin savew0:= w0; savew1:= w1; savew2:= w2; return:= w3; if w0=2 then ! remote ! begin ! get devicename of operator terminal ! lookupremote(.w3.,w3:=2,w1,w2,w0,w1,w2:=address(dhlinkno)); w2:= address(workname); if w0 extract 12=0 ! device lookup up ! then terminalid(.w3.,w0:=dhlinkno,w2) else (w2).word:= w0:= -1; end; w1:= b.tcpool_fst; while w1<b.tcpool_top do begin compare(.w3.,w0:=8,w1+!position(tc_devname),w2:=savew2); w1-!position(tc_devname); if w0=0 then begin if w0:=savew0=1 ! local device ! then begin if w0:=(w1).tc_hostno=0 then begin compare(.w3.,w0:=8,w1+!position(tc_console),w2:=savew1); w1-!position(tc_console); if w0=0 then goto found; end; end else begin if w0:=(w1).tc_hostno<>0 then begin compare(.w3.,w0:=8,w1+!position(tc_devcons),w2:=address(workname)); w1-!position(tc_devcons); if w0=0 then goto found; end; end; end; w1:= (w1).tc_nexttc; end; w1:= 0; found: if w0:=(w1).tc_created=0 then -(w1); w0:= savew0; w2:= savew2; w3:= b.current; call w0 return; end; end; body of operator comment operator coroutine; begin label outloop1,outloop2,outtext; incode text(2) oproutput:= "="; word stopbuf, char, partial; ref bufpointer; word paramno, comno; ref devcorout; byte kind, dummy; byte dhlinkno, hostno; word hostid; word param1type; text(11) devname; word freeparam; text(8) freedummy; ! may be changed by nextparam ! text(11) command, start := "start", restart := "restart", stop := "stop", kill := "kill", request := "request", signup := "signup", signoff := "signoff", emptytext:= ""; comment command syntax table. command syntax: <command> (<process> (<freeparam>)) <command> ::= <text> <process> ::= <text> ! @<text> <freeparam> ::= <pos. integer> the table contains for every command an entry containing: <action> lshift 6+<process param legal> shift 4+<free param legal> lshift 2 <action> the action to perform <param legal> = 2'00 param illegal 2'01 param optional 2'10 param compulsary; byte csyntax, ! current syntax entry ! csyntax1 := 4'2210, ! start ! csyntax2 := 4'2200, ! restart ! csyntax3 := 4'2200, ! stop ! csyntax4 := 4'2200, ! kill ! csyntax5 := 4'3000, ! request ! csyntax6 :=4'10220, ! signup ! csyntax7 :=4'11200, ! signoff ! csyntaxlast:= 4'1000; ! empty ! ! reply texts ! text(26) t_ready := "ready", t_syntax := "***syntax", t_comm := "***command unknown", t_plusparam := "***command +param", t_minusparam:= "***command -param", t_unknown := "***device unknown", t_stateill := "***state illegal", t_notallow := "***not allowed", t_nores := "***no resources"; ! reply output format ! text( 6) time; text(11) ownname; text( 2) colon:= ":"; text(26) vartext; text( 1) lasttext:= "'10'"; ref return; begin return:= w3; call w3 return; ! pseudo call ! while w1=w1 do begin waitmess(.w3.,w2); w0:= 1; w1:= address(b.ans_status); monitor(22); ! send answer ! w1:= (w3).opr_buf; w2:= address((w1).buf_data1); move(.w3.,w0:=2,w1:=address(oproutput),w2); w1:= (w3).opr_buf; (w1).buf_op:= w0:= 5; (w1).buf_first:= w0:= address((w1).buf_data1); (w1).buf_last:= w0:= w0; testout(.w3.,w0-(w1).buf_first+2,w1:=(w1).buf_first,w2:=0); w1:= (w3).opr_buf; sendwait(.w3.,w0,w1,w2:=address((w3).opr_console)); (w1).buf_op:= w0:= 3; w0:= (w1).buf_first; w0+b.oprt_bufl-2; (w1).buf_last:= w0; sendwait(.w3.,w0,w1,w2); ! input received interpret command ! if w0<>1 then w0:= 0 else w0:= b.ans_bytes; w1:= (w1).buf_first; testout(.w3.,w0,w1,w2:=0); bufpointer:= w1; w1+w0; stopbuf:= w1; partial:= w0:= 0; nextparam(.w3.,w3:=address(command),w3:=stopbuf,w0,w1:=partial, w2:=bufpointer); partial:= w1; bufpointer:= w2; if w0>1 then w0:= -1; if w0<0 then begin w1:= address(t_syntax); goto outtext; end; ! find number of command ! w1:= address(emptytext); w1+8; w2:= address(command); w0:= 1; while w0<>0 do begin w1-8; compare(.w3.,w0:=8,w1,w2); end; if w1=w2 then begin ! command unknown ! w1:= address(t_comm); goto outtext; end; comno:= w1-w2 ashift -3; !test 202; w2:= address(csyntax); w2+w1; csyntax:= w1:= (w2).byte; nextparam(.w3.,w3:=address(devname),w3:=stopbuf,w0,w1:=partial, w2:=bufpointer); partial:= w1; bufpointer:= w2; param1type:= w0; if w0=3 ! number ! then w0:= -1; if w0=-1 then begin w1:= address(t_syntax); goto outtext; end; if w2:= csyntax lshift -4 extract 2=0 then begin if w0<>0 then begin w1:= address(t_plusparam); goto outtext; end; end else if w2=2'10 then begin if w0=0 then begin w1:= address(t_minusparam); goto outtext; end; end else; nextparam(.w3.,w3:=address(freeparam),w3:=stopbuf,w0,w1:=partial, w2:=bufpointer); w3:= b.current; !test 203; if w0<>3 ! number ! then if w0<>0 then begin w1:= address(t_syntax); goto outtext; end; if w2:=csyntax lshift -2 extract 2=0 then begin if w0<>0 then begin w1:= address(t_plusparam); goto outtext; end; end else if w2=2'10 then begin if w0=0 then begin w1:= address(t_minusparam); goto outtext; end; end else; ! execute command ! w2:= csyntax lshift -6; !test 204; case w2 of begin begin ! no action ! end; begin ! put command into corou. descr. ! find_consoldevice(.w3.,w0:=param1type,w1:=address((w3).opr_console), w2:=address(devname)); devcorout:= w1; if w1<=0 then begin if w1=0 then w1:=address(t_unknown) else w1:=address(t_stateill); goto outtext; end; if w0:=comno=1 ! start ! then begin if w2:=freeparam>2000 then begin w1:= address(t_notallow); goto outtext; end; end else if w2=2 ! restart ! then begin if w0:=(w1).tc_kind<>14 ! printer ! then if w0<>12 ! punch ! then begin w1:= address(t_notallow); goto outtext; end; end else; w0:= 1; w1:= b.holdqfst; while w2:=address(b.holdqfst)<>w1 do begin ! scan hold queue ! (w3).opr_savew1:= w1; compare(.w3.,w0:=8,w1:=address((w1).tc_devname), w2:=address(devname)); w1:= (w3).opr_savew1; if w0=0 then begin ! device corout found ! w1:= address(b.holdqfst); end else w1:= (w1).c_next; end; w1:= devcorout; if w0<>0 then begin ! device corout not in hold state ! if w0:= comno<> 3 ! stop ! then begin w1:= address(t_stateill); goto outtext; end; end else begin ! device corout in hold state ! if w0:=comno=3 then begin w1:= address(t_stateill); goto outtext; end; link(.w3.,w1,w2:=address(b.activqfst)); end; (w1).tc_ointervent:= w0:= freeparam lshift 12+comno; end; begin ! request ! w1:= b.holdqfst; while w2:=address(b.holdqfst)<>w1 do begin ! scan hold queue ! (w3).opr_savew1:= w1; compare(.w3.,w0:=8,w1:=address((w1).tc_console),w2:=address((w3).opr_console)); if w0=0 ! match ! then begin ! coroutine in hold state with operator terminal ! ! as console found ! w1:= (w3).opr_savew1; w1:= (w1).tc_buf; w0:= (w1).buf_last; w2:= (w1).buf_first; w0-w2+2; if w0>b.oprt_bufl then key(char):= w1; ! halt ! testout(.w3.,w0,w1,w2:=0); sendwait(.w3.,w0,w1,w2:=address((w3).opr_console)); end; w1:= (w3).opr_savew1; w1:= (w1).c_next; end; end; ! request ! begin ! signup ! if w0:=param1type<>2 then begin w1:= address(t_notallow); goto outtext; end; w3:= address((w3).opr_console); lookupremote(.w3.,w0:=3,w3,w3:=address(devname),w0,w1,w2:=address(dhlinkno)); !test 231; kind:= w1; if w1:=freeparam<>0 then kind:= w1; if w0<>0 ! no link ! then if w0<>4096 ! remote link exist ! then begin if w0 extract 12<>0 then w1:= address(t_unknown) else w1:= address(t_stateill); goto outtext; end; find_tc(.w3.,w3:=address(devname),w3:=hostno,w3:=hostid, w3:= kind, w1); !test 232; if w1=0 then begin w1:= address(t_nores); goto outtext; end; if w1>0 then begin w1:= address(t_stateill); goto outtext; end; -(w1); devcorout:= w1; (w1).tc_hostno:= w0:= hostno; (w1).tc_hostid:= w0:= hostid; move(.w3.,w0:=8,w1:=address(devname), w2:=address((w2:=devcorout).tc_devname)); move(.w3.,w0,w1:=address((w3).opr_console), w2:=address((w2:=devcorout).tc_console)); lookupremote(.w3.,w0:=2 ! lookup process !, w0:= address((w3).opr_console), w0 ! devname dummy ! , w0,w1,w2:=address(dhlinkno)); w3:= b.current; terminalid(.w3.,w0:=dhlinkno,w2:=address((w2:=devcorout).tc_devcons)); testout(.w3.,w0:=!length(transpcorout),w1:=devcorout,w2:=68); end; begin ! signoff ! find_consoledevice(.w3.,w0:=param1type,w1:=address((w3).opr_console), w2:=address(devname)); !test 250; if w1=0 then begin w1:= address(t_unknown); goto outtext; end; if w1>0 then begin w1:= address(t_stateill); goto outtext; end; -(w1); w1:= address((w1).tc_console); (w2).word:= w0:= 0; w2:= address((w1).tc_devcons); (w2).word:= w0; end; end; ! case ! w1:= address(t_ready); outtext: ! w1 abs ref reply text ! move(.w3.,w0:=18,w1,w2:=address(vartext)); outtime(.w3.,w2:=address(time)); w1:= 66; w1:= (w1).word+2; move(.w3.,w0:=8,w1,w2:=address(ownname)); w0:= address(lasttext); w2:=address(time); w0-w2; w1:=(w3).opr_buf; (w1).buf_op:= w2:= 5; (w1).buf_last:= w2:= (w1).buf_first+w0; w0+2; w2:= (w1).buf_first; move(.w3.,w0,w1:=address(time),w2); testout(.w3.,w0,w1,w2:=0); sendwait(.w3.,w0,w1:=(w3).opr_buf,w2:=address((w3).opr_console1)); w0:= 0; (w3).c_mbuf:= w0 ! clear operation ! end; ! loop ! end; end; ! operator ! !branch 1,5; body of get_block comment get the next block to be output on device from the area connected to current coroutine ; begin label rep, exit; incode word zero:= 0; word bl; ! length of current block ! word savew0, savew1; ref return; word status, bytes, chars, a4, a5, a6, a7, a8; begin savew0:= w0; savew1:= w1; return:= w3; w3:= b.current; w0:= (w3).tc_bsl; w1:= (w3).tc_bsu; w3:= address(zero); monitor(72); ! set cat.base ! !test 901; bl:= w0:= 0; w3:= b.current; b.bs_segno:= w0:= (w3).tc_bsptr ashift -9 - 1; while w0:= bl<savew0 do begin ! get data from bs and move to device buffer ! b.bs_op:= w0:= 3; b.bs_segno:= w0:= b.bs_segno +1; rep: w1:= address(b.bs_op); testout(.w3.,w0:=8,w1,w2:=52); w3:= address((w3:=b.current).tc_bsname); monitor(16); ! send message ! w1:= address(status); monitor(18); ! wait answer ! w2:= 1 lshift w0; if w0=1 then w2+status else bytes:= w0:= 0; status:= w2; if w2 and 2'100100<>0 then begin ! create and reserve area process ! monitor(52); ! create ! !test 904; if w0=0 then monitor(8); ! reserve ! !test 905; if w0<>0 then goto exit; goto rep; end; w3:= b.current; if w2:= status=2 then begin ! move to transp. corout. buffer ! if w0:=bytes=0 then goto rep; w1:= (w3).tc_bsptr+bl extract 9; w0-w1; ! not used in bs buffer ! w2:= savew0-bl; ! free bytes in buffer ! if w0>w2 then w0:= w2; w2:= savew1+bl; move(.w3.,w0,w1+b.bs_first,w2); bl:= w0+bl; end else goto exit; end; exit: w0:= bl; w1:= savew1; w2:= status; w3:= b.current; !test 910; call w0 return; end; end; ! get_block ! body of put_block comment put the block pointed out by the parameters into the area connected to current coroutine. the block is put from the current bsposition and onwards. the rest of the segment is filled with zeroes; begin label rep2, exit; incode word zero:= 0; word savew0, savew1; ref return; word status, bytes, chars, a4, a5, a6, a7, a8; begin savew0:= w0; savew1:= w1; return:= w3; w3:= b.current; w1:= (w3).tc_bsptr-2; ! end of last record ! if w0:=savew0+w1 ashift -9 ashift 9>w1 then begin ! not room on current segment, clear buffer ! !test 911; (w3).tc_bsptr:= w0; w0:= 0; for w1:= b.bs_first step 2 upto b.bs_last do (w1).word:= w0; w0:= (w3).tc_bsl; w1:= (w3).tc_bsu; w3:= address(zero); monitor(72); ! set cat. base ! !test 912; end else begin ! get segment ! get_block(.w3.,w0:=2,w1:=address(status),w2); if w2<>2 then goto exit; end; ! copy block to bs buffer ! w2:= (w3:=b.current).tc_bsptr extract 9; move(.w3.,w0:=savew0,w1:=savew1,w2+b.bs_first); !test 916; ! put segment ! b.bs_op:= w0:= 5; b.bs_segno:= w0:= (w3).tc_bsptr ashift -9; rep2: w1:= address(b.bs_op); testout(.w3.,w0:=8,w1,w2:=52); w3:= address((w3:=b.current).tc_bsname); monitor(16); ! send message ! w1:= address(status); monitor(18); ! wait answer ! w2:= 1 lshift w0; if w0=1 then w2+status else bytes:= w0:= 0; if w0:= w2 and 2'100100<>0 then begin ! create and reserve area process ! monitor(52); ! create ! !test 914; if w0=0 then monitor(8); ! reserve ! !test 915; if w0<>0 then goto exit; goto rep2; end; if w2=2 then if w0:=bytes=0 then goto rep2; exit: w1:= savew1; if w2<>2 then w0:= 0 else w0:= savew0; w3:= b.current; !test 920; call w0 return; end; end; body of closebs comment terminate the use of the area connected to current printer coroutine ; begin incode ref return; word zero:= 0; double savef1; begin savef1:= f1; return:= w3; w3:= b.current; w0:= (w3).tc_bsl; w1:= (w3).tc_bsu; w3:= address(zero); monitor(72); ! set cat.base ! w3:= address((w3:=b.current).tc_bsname); monitor(64); ! remove process ! f1:= savef1; w3:= b.current; call w0 return; end; end; ! closebs ! body of hold comment link current coroutine into the hold-queue; begin incode ref return; begin return:= w3; w3:= b.current; (w3).c_w0:= w0; (w3).c_w1:= w1; (w3).c_w2:= w2; (w3).c_ic:= w0:= return; link(.w3.,w1:=w3,w2:=address(b.holdqfst)); testout(.w3.,w0:=!length(coroutine),w1,w2:=4); goto b.activate; end; end; ! hold ! body of oproutput begin label rep_sw, exit; record outformat ! output format ! (text( 6) time; text(11) ownname; word colon; word outtype; word asterix; text(11) processname; text(1) vartext); ! start of variable message ! incode text( 9) t1:= " prepare "; text(11) t1trname; text( 1) t11:= " "; text(11) t1truser; text( 1) t12:= " "; text(11) t1trqgroup; text( 1) t13:= "."; text(11) t1trqname; text(15) t2 := " intervention", t21 := " parity error", t22 := " timer", t23 := " data overrun", t24 := " block length", t25 := " end document", t26 := " load point", t27 := " tapemark, att", t28 := " write enable", t29 := " mode error", t210:= " read error", t211:= " card reject", t212:= " bit 12", t213:= " bit 13", t214:= " bit 14", t215:= " stopped", t216:= " word defect", t217:= " position err.", t218:= " do'39'nt exist", t219:= " disconnected", t220:= " unintelligent", t221:= " rejected", t222:= " normal"; text(21) t3:= " stopped by operator"; text(14) t4:= " end transport"; word t4state; text(10) t5:= " transmit"; word textsize; ref transref; ! abs ref descr of transport ! ref bufref; ! abs ref first of data in buffer ! text(14) clock:="clock"; word timeunit:= 0, timevalue:= 20; word savew2; begin savew2:= w2; w2:= b.current; (w2).tc_saveic:= w3; w3:= b.current; w2:= address((w3).tc_console); if w2:=(w2).word=0 then ! no operator exist ! begin w2:= 32; ! does not exist ! goto exit; end; w2:= (w3).tc_buf; w2:= address((w2).buf_data1); bufref:= w2; if w0=1 then w0:= 0 else if w0=2 then w0:= 2763306 ! *** ! else; (w2).outtype:= w0; if w0:=(w3).tc_hostno<>0 ! remote ! then w0:= 64; ! asterix ! (w2).asterix:= w0; case w1 of ! select variable text ! begin begin looktransport(.w3.,w1:=(w3).tc_transno,w2); transref:= w2; move(.w3.,w0:=8,w1:=address((w2).tr_name),w2:=address(t1trname)); move(.w3.,w0,w1:=address((w1:=transref).tr_user),w2:=address(t1truser)); move(.w3.,w0,w1:=address((w1:=transref).tr_qgroup),w2:=address(t1trqgroup)); move(.w3.,w0,w1:=address((w1:=transref).tr_qname),w2:=address(t1trqname)); w1:= address(t1); if w0:=(w2).word=0 then w0:= 24 else w0:= 44; end; begin ! status error ! w0:= -10; w1:= 0; w2:= savew2; while w1=0 do begin f2 lshift 1; w0+10; end; w1:= address(t2); w1+w0; w0:= 10; end; ! status error ! begin ! operator stop ! w1:= address(t3); w0:= 14; end; begin ! end transport ! t4state:= w0:= savew2+ 4'02000300; ! state + " 0" ! w1:= address(t4); w0:= 12; end; begin ! transmit ! w1:= address(t5); w0:= 8; end; end; ! case ! ! w1 abs ref start of variable text, w0 length of variable text ! textsize:= w0; move(.w3.,w0,w1,w2:=address((w2:=bufref).vartext)); (w2+w0).word:= w1:= 10; ! terminate text with nl ! outtime(.w3.,w2:=address((w2:=bufref).time)); w1:= 66; w1:= (w1).word+2; move(.w3.,w0:=8,w1,w2:=address((w2:=bufref).ownname)); bufref.colon:= w1:= 58; ! ":" ! move(.w3.,w0,w1:=address((w3).tc_devname),w2:=address((w2:=bufref).processname)); w1:= (w3).tc_buf; (w1).buf_op:= w2:= 5; (w1).buf_mode:= w2:= 0; (w1).buf_first:= w2:= bufref; w0:= !length(outformat)+textsize; ! including one word for nl ! w2+w0-2; (w1).buf_last:= w2; testout(.w3.,w0,w1:=(w1).buf_first,w2:=0); rep_sw: sendwait(.w3.,w0,w1:=(w3).tc_buf,w2:=address((w3).tc_console)); w2:= 1 ashift w0; if w2=2 then w2+b.ans_status else begin b.ans_bytes:= w0:= 0; if w0:= w2 and 2'110000 <> 0 then ! does not exist, disconnected ! begin if w0:=(w3).tc_hostno<>0 then begin sendwait(.w3.,w0,w1:=address(timeunit),w2:=address(clock)); ! delay ! linkupremote(.w3.,w0:=8,w0:=(w3).tc_hostno,w0:=(w3).tc_hostid, w0:=address((w3).tc_devcons),w0,w2); w3:= b.current; if w0=4096 ! created ! then begin w1:= w2; w1+2; move(.w3.,w0:=8,w1,w2:=address((w3).tc_console)); goto rep_sw; end else w2:= 32; end; end; end; if w0:=8'00200002 onemask w2 then ! no status bits except att and normal ! if w0:=(w1).buf_first+b.ans_bytes<=(w1).buf_last then goto rep_sw; exit: !test 1010; call w0 (w3).tc_saveic; end; end; ! oproutput ! body of updatetransport comment update description of transport; begin incode ref transref; ! answer wait and get state of transport ! byte awt_1:= 7, awt_2:= 0, awt_3:= 4, awt_4:= 4'010000, awt_5:= 1, awt_6:= 4'020001; word awt_rcode:= 0; byte awt_7:= 1, awt_8:= 4'010010; text(11) awt_trname; byte awt_9:= 1, awt_10:= 4'010001; word awt_no; byte awt_11:= 1000, awt_12:= 4'010000, awt_13:= 3, awt_14:= 4'020000, awt_15:= 4, awt_16:= 4'030001; word awt_state; byte awt_19:= 7, awt_20:= 4'030002; word awt_ptr1, awt_ptr2; byte awt_17:=6, awt_18:= 4'030002; word awt_cause, awt_status; double savef1; word savew2; ref return; begin savef1:= f1; savew2:= w2; return:= w3; w3:= b.current; awt_no:= w1:= (w3).tc_transno; looktransport(.w3.,w1,w2); transref:= w2; awt_state:= w0:= (w3).tc_state; (w2).tr_state:= w0; awt_cause:= w0:= (w3).tc_cause; (w2).tr_cause:= w0; awt_status:= w0:= (w3).tc_status; (w2).tr_status:= w0; awt_ptr1:= w0:= 0; w1:= (w3).tc_bsptr; awt_ptr2:= w0:= w1+(w1 ashift -1); ! convert halfword position to char pos. ! (w2).tr_charposition:= w0; if w0:=(w2).tr_waitmess>0 then begin ! pending wait operation ! move(.w3.,w0:=8,w1:=address((w2).tr_name),w2:=address(awt_trname)); if w1:=awt_state=5 ! completed ! then w1:= address(awt_ptr2) else if w1=6 ! aborted ! then w1:= address(awt_status) else w1:= address(awt_state); copyanswer(.w3.,w0:=address(awt_1),w1,w2:=transref.tr_waitmess); b.waitbufs:= w0:= b.waitbufs+1; w2:= transref; w0:= 0; (w2).tr_waitmess:= w0; end; if w1:=(w2).tr_removetime=8'37777776 then w1:= 0 else begin w1:= 108; f1:= (w1).double+b.trsaveperiod lshift -20; end; (w2).tr_removetime:= w1; puttransport(.w3.,w1:=awt_no); f1:= savef1; w2:= savew2; w3:= b.current; call w0 return; end; end; ! updatetransport ! body of check_devicestatus comment check device status for current coroutine, and clear noise in hwords transferred. try to repair rejected and does not exist; begin incode double savef1; word helpw2; ref return; begin savef1:= f1; return:= w3; w3:= b.current; w2:= 1 ashift w0; if w2=2 then w2+(w1).word else begin w1+2; (w1).word:= w0:= 0; ! hwords:= 0 ! if w2=4 then begin ! rejected ! w3:= address((w3).tc_name); monitor(8); ! reserve ! if w0=0 then w2:= 2; end else if w0:= w2 and 2'110000 <> 0 then begin ! does not exist ! if w0:= (w3).tc_hostno<>0 ! remote ! then begin helpw2:= w2; linkupremote(.w3.,w0:=(w3).tc_kind,w0:=(w3).tc_hostno, w0:=(w3).tc_hostid,w0:=address((w3).tc_devname),w0,w2); w3:= b.current; if w0=4096 ! created ! then begin w1:= w2; w1+2; move(.w3.,w0:=8,w1,w2:=address((w3).tc_name)); w2:= 2; end else w2:= helpw2; end; end else; end; f1:= savef1; w3:= b.current; call w0 return; end; end; !branch 2,6; body of prlistid begin incode ref return; double savef2; ref transref; text(12) t_cont:= "contents of:"; text(13) t_trans:= "'10'transport :"; text(13) t_user := "'10'user :"; text(2) nlff:= "'10''12'"; begin savef2:= f2; return:= w3; w3:= b.current; looktransport(.w3.,w1:=(w3).tc_transno,w2); transref:= w2; w2:= (w3).tc_buf; w2:= address((w2).buf_data1); move(.w3.,w0:=8,w1:=address(t_cont),w2); w2+w0; move(.w3.,w0:=8,w1:=address((w1:=transref).tr_sname),w2); w2+w0; move(.w3.,w0:=10,w1:=address(t_trans),w2); w2+w0; move(.w3.,w0:=8,w1:=address((w1:=transref).tr_name),w2); w2+w0; move(.w3.,w0:=10,w1:=address(t_user),w2); w2+w0; move(.w3.,w0:=8,w1:=address((w1:=transref).tr_user),w2); w2+w0; move(.w3.,w0:=2,w1:=address(nlff),w2); w2+w0; w1:= (w3).tc_buf; w1:= address((w1).buf_data1); w0:= w2-w1; f2:= savef2; w3:= b.current; call w0 return; end; end; body of prlistdate comment generate a text containing the current date and time. put the text into the buffer of current coroutine; begin procedure convertdecimal(.w3.;w0); incode text(11) ownname; text(7) fillspaces:= " :"; word year,point1:=46,month,point2:=46,day,sp2:=32, hour,point3:=46,min,nl:=10; double savef2; ref return; begin savef2:= f2; return:= w3; w1:= 66; w1:= (w1).word+2; move(.w3.,w0:=8,w1,w2:=address(ownname)); w1:= 108; ! get clock ! f1:= (w1).double; f1 ashift -4; f1//(60*60*625); w3:= 0; f0//(60*625); convertdecimal(.w3.,w0); min:= w0; w0:= 0; f1//24; convertdecimal(.w3.,w0); hour:= w0; f1 lshift 26; w0+99111; w3:= 0; f0//1461; ! year ! w3 ashift -2; w3*5; w3+461; f3//153; if w3 ! month ! >=13 then begin w3-12; w0+1; end; month:= w3; convertdecimal(.w3.,w0); year:= w0; convertdecimal(.w3.,w0:=month); month:= w0; w2+5; f2//5; convertdecimal(.w3.,w0:=w2); day:= w0; w0:= address(nl); w1:= address(ownname); w0-w1+2; move(.w3.,w0,w1,w2:=address((w2:=(w3).tc_buf).buf_data1)); f2:= savef2; w3:= b.current; call w0 return; end; body of convertdecimal begin incode ref return; begin return:= w3; w3:= 0; f0//10; w0+48 lshift 8+w3+48; w3:= b.current; call w0 return; end; end; end; ! prlistdate ! body of pr comment printer coroutine; begin label loop, closeup, suicide, startloop; incode text(15) contin:= "'12'continuation'10''10'"; text(102) triang1:= " *************** ************* *********** ********* ******* ***** *** * '10'"; text(103) triang2:= "'12' * *** ***** ******* ********* *********** ************* ***************'10''10'"; ref first, last; ref transref, queueref; word halt; ref return; begin return:= w3; call w3 return; ! pseudo call ! while w1=w1 do begin ! get next transport ! w1:= address((w3).tc_nexttr); w1:= (w1).tq_next; if w2:=address((w3).tc_nexttr)=w1 then goto suicide; ! end transp. queue ! ! hold tranport if no corout in queue matches current ! while w2:=address((w3).tc_nexttr)<>w1 do begin queueref:= w1; looktransport(.w3.,w1:=(w1).tq_transno,w2); transref:= w2; compare(.w3.,w0:=8,w1:=address((w2).tr_qgroup),w2:=address((w3).tc_qgroup)); if w0=0 then compare(.w3.,w0:=8,w1:=address((w1:=transref).tr_qname), w2:=address((w3).tc_qname)); halt:= w0; if w0=0 then w1:= address((w3).tc_nexttr) else w1:= queueref.tq_next; end; !test 205; if w0:=halt<>0 then begin ! no matching transport found ! w1:= (w3).tc_nexttr; queueref:= w1; looktransport(.w3.,w1:=(w1).tq_transno,w2); transref:= w2; end; w1:= queueref; (w3).tc_transno:= w0:= (w1).tq_transno; link(.w3.,w1:=queueref,w2:=address(b.tqfreefst)); w2:= transref; (w3).tc_ointervent:= w0:= 0; (w3).tc_aintervent:= w0; (w3).tc_mode:= w0:= (w2).tr_mode; (w3).tc_bsl:= w0:= (w2).tr_basel; (w3).tc_bsu:= w0:= (w2).tr_baseu; (w3).tc_bsptr:= w0:= (w2).tr_bsstartptr; (w3).tc_state:= w0:= 0; move(.w3.,w0:=8,w1:=address((w2).tr_bsarea),w2:=address((w3).tc_bsname)); move(.w3.,w0,w1:=address((w1:=transref).tr_qgroup), w2:=address((w3).tc_qgroup)); move(.w3.,w0,w1:=address((w1:=transref).tr_qname), w2:=address((w3).tc_qname)); if w0:=b.prheadtrail<>0 then (w3).pr_inpstate:= w0:= -3 else (w3).pr_inpstate:= w0; if w0:=halt<>0 then if w0:=(w2:=address((w3).tc_console)).word<>0 then begin ! hold device ! oproutput(.w3.,w0:=1,w1:=1,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; hold(.w3.); end; loop: if w2:=(w3).tc_ointervent<>0 then begin ! operator intervention ! !test 206; case w2 extract 12 of begin begin ! start ! looktransport(.w3.,w1:=(w3).tc_transno,w2); (w3).pr_partial:= w0:= 0; (w3).pr_worknls:= w0; (w3).pr_workffs:= w0:= (w3).tc_ointervent lshift -12; (w3).pr_workptr:= w0:= (w3).tc_bsptr; (w3).pr_workstartptr:= w0:= (w2).tr_bsstartptr; startloop: ! backfile until start of file or until ! ! an appropriate nr of ffs or nls are met ! if w0:=(w3).pr_workffs=0 then else if w0:=(w3).pr_workptr<=(w3).pr_workstartptr then else begin w0:= (w3).pr_partial; if w0=0 then begin if w0:=(w3).tc_bsptr=(w3).pr_workptr then begin w0- (w3).tc_bufsize; if w0<(w3).pr_workstartptr then w0:= (w3).pr_workstartptr; (w3).tc_bsptr:= w0; w1:= (w3).tc_buf; (w1).buf_op:= w0:= 0; (w1).buf_mode:= w0; ! sense ! sendwait(.w3.,w0,w1,w2:=address((w3).tc_name)); ! pass ! get_block(.w3.,w0:=(w3).tc_bufsize,w1:=address((w1).buf_data1),w2); if w1:=(w3).pr_workptr-(w3).tc_bsptr>w0 then begin ! error, stop searching ! (w3).pr_workffs:= w0:= 0; goto startloop; end; end; (w3).pr_workptr:= w0:= (w3).pr_workptr-2; w1:= (w3).tc_bsptr; w0-w1; ! relative position in buffer ! w1:= (w3).tc_buf; w1:= address((w1).buf_data1); w1+w0; w0:= (w1).word; end; w1:= 0; f1 lshift -8; (w3).pr_partial:= w0; w1 lshift -16; if w1=12 then (w3).pr_workffs:= w0:= (w3).pr_workffs-1 else if w1=10 then begin (w3).pr_worknls:= w0:= (w3).pr_worknls+1; if w0=b.prlpage then begin (w3).pr_workffs:= w0:= (w3).pr_workffs-1; (w3).pr_worknls:= w0:= 0; end; end else; goto startloop; end; (w3).tc_bsptr:= w0:= (w3).pr_workptr; end; ! start ! begin ! restart ! looktransport(.w3.,w1:=(w3).tc_transno,w2); (w3).tc_bsptr:= w0:= (w2).tr_bsstartptr; end; if w0:=(w3).pr_inpstate<=0 then ! not trailing triangel ! begin ! stop ! oproutput(.w3.,w0:=1,w1:=3,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; (w3).tc_ointervent:= w0:= 0; hold(.w3.); (w3).pr_inpstate:= w0:= -4; goto loop; end; begin ! kill ! (w3).tc_state:= w0:= 7; ! killed by operator ! goto closeup; end end; ! case ! (w3).tc_ointervent:= w2:= 0; end; if w2:=(w3).tc_aintervent<>0 then begin (w3).tc_state:= w0:= 8; ! killed by appl ! goto closeup; end; case w2:=(w3).pr_inpstate + 5 of begin ! get next input block ! move(.w3.,w0:=10,w1:=address(contin), w2:=address((w2:=(w3).tc_buf).buf_data1)); move(.w3.,w0:=68,w1:=address(triang1), w2:=address((w2:=(w3).tc_buf).buf_data1)); prlistdate(.w3.,w0); prlistid(.w3.,w0); begin ! normal input mode ! get_block(.w3.,w0:=(w3).tc_bufsize,w1:=address((w1:=(w3).tc_buf).buf_data1),w2); if w0<=0 then begin (w3).tc_state:= w1:= 6; ! aborted ! (w3).tc_cause:= w1:= 1; ! sender ! (w3).tc_status:= w2; end else begin ! cut block size down if an em-char is found in the block ! w1:= (w3).tc_buf; first:= w2:= address((w1).buf_data1); w2-2; w0+w2; last:= w0; while w2+2<=last do begin w3:= 0; w0:= (w2).word; while w0<>0 do begin f0 lshift 8; if w1:= w3 extract 8=25 then begin w3 lshift -8; (w2).word:= w3; last:= w2; (w3:=b.current).tc_state:= w1:= 5; ! completed ! w0:= 0; end; end; end; w0:= last-first+2; w3:= b.current; end; end; move(.w3.,w0:=70,w1:=address(triang2), w2:=address((w2:=(w3).tc_buf).buf_data1)); prlistdate(.w3.,w0); prlistid(.w3.,w0); end; ! case ! if w0>0 then begin ! write next output block ! w1:= (w3).tc_buf; (w1).buf_op:= w2:= 5; (w1).buf_mode:= w2:= (w3).tc_mode; (w1).buf_first:= w2:= address((w1).buf_data1); w2+w0-2; (w1).buf_last:= w2; testout(.w3.,w0,w1:=(w1).buf_first,w2:=0); w1:= (w3).tc_buf; sendwait(.w3.,w0,w1,w2:=address((w3).tc_name)); check_devicestatus(.w3.,w0,w1:=address(b.ans_status),w2); if w1:=(w3).pr_inpstate=0 then ! normal input mode ! (w3).tc_bsptr:= w0:= (w3).tc_bsptr+b.ans_bytes; if w1<=0 then if w2<>2 then begin if w0:=(w1:=address((w3).tc_console)).word<>0 then begin oproutput(.w3.,w0:=2,w1:=2,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; hold(.w3.); if w0:=b.prheadtrail<>0 then (w3).pr_inpstate:= w0:= -4; goto loop; end else begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 2; ! receiver ! (w3).tc_status:= w2; goto closeup; end; end; end; case w2:=(w0:=(w3).pr_inpstate+1)+4 of begin (w3).pr_inpstate:= w0; (w3).pr_inpstate:= w0; (w3).pr_inpstate:= w0; (w3).pr_inpstate:= w0; begin ! normal input mode ! if w2:=(w3).tc_state>0 then begin if w2:=b.prheadtrail<>0 then (w3).pr_inpstate:= w0 else goto closeup; end; end; (w3).pr_inpstate:= w0; (w3).pr_inpstate:= w0; goto closeup; end; !test 295; goto loop; closeup: closebs(.w3.); updatetransport(.w3.); if w0:=b.oprtdetails<>0 then oproutput(.w3.,w0:=1,w1:=4,w2:=(w3).tc_state); end; ! operation ! suicide: remove_tc(.w3.,w1:=b.current); goto b.activate; end; end; ! pr ! !branch 2,7; body of pc comment punch coroutine; begin label loop, closeup, suicide; incode ref first, last; ref transref, queueref; ref return; begin return:= w3; call w3 return; ! pseudo call ! while w1=w1 do begin ! get next transport ! w1:= address((w3).tc_nexttr); w1:= (w1).tq_next; if w2:=address((w3).tc_nexttr)=w1 then goto suicide; ! end transp. queue ! w1:= (w3).tc_nexttr; queueref:= w1; looktransport(.w3.,w1:=(w1).tq_transno,w2); transref:= w2; w1:= queueref; (w3).tc_transno:= w0:= (w1).tq_transno; link(.w3.,w1:=queueref,w2:=address(b.tqfreefst)); w2:= transref; (w3).tc_ointervent:= w0:= 0; (w3).tc_aintervent:= w0; (w3).tc_mode:= w0:= (w2).tr_mode; (w3).tc_bsl:= w0:= (w2).tr_basel; (w3).tc_bsu:= w0:= (w2).tr_baseu; (w3).tc_bsptr:= w0:= (w2).tr_bsstartptr; (w3).tc_state:= w0:= 0; move(.w3.,w0:=8,w1:=address((w2).tr_bsarea),w2:=address((w3).tc_bsname)); move(.w3.,w0,w1:=address((w1:=transref).tr_qgroup), w2:=address((w3).tc_qgroup)); move(.w3.,w0,w1:=address((w1:=transref).tr_qname), w2:=address((w3).tc_qname)); (w3).pc_inpstate:= w0:= -1; begin ! hold device ! oproutput(.w3.,w0:=1,w1:=1,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; hold(.w3.); end; loop: if w2:=(w3).tc_ointervent<>0 then begin ! operator intervention ! !test 206; case w2 extract 12 of begin begin ! start ! end; ! start ! begin ! restart ! looktransport(.w3.,w1:=(w3).tc_transno,w2); (w3).tc_bsptr:= w0:= (w2).tr_bsstartptr; end; if w0:=(w3).pc_inpstate<=0 then begin ! stop ! oproutput(.w3.,w0:=1,w1:=3,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; (w3).tc_ointervent:= w0:= 0; hold(.w3.); (w3).pc_inpstate:= w0:= -1; goto loop; end; begin ! kill ! (w3).tc_state:= w0:= 7; ! killed by operator ! goto closeup; end end; ! case ! (w3).tc_ointervent:= w2:= 0; end; if w2:=(w3).tc_aintervent<>0 then begin (w3).tc_state:= w0:= 8; ! killed by appl ! goto closeup; end; case w2:=(w3).pc_inpstate + 2 of begin ! get next input block ! begin ! put 90 null chars ! w1:= address((w2:=(w3).tc_buf).buf_data1); (w1).word:= w0:= 0; move(.w3.,w0:=60,w1,w2:=w1+2); end; begin ! normal input mode ! get_block(.w3.,w0:=(w3).tc_bufsize,w1:=address((w1:=(w3).tc_buf).buf_data1),w2); if w0<=0 then begin (w3).tc_state:= w1:= 6; ! aborted ! (w3).tc_cause:= w1:= 1; ! sender ! (w3).tc_status:= w2; end else begin ! cut block size down if an em-char is found in the block ! w1:= (w3).tc_buf; first:= w2:= address((w1).buf_data1); w2-2; w0+w2; last:= w0; while w2+2<=last do begin w3:= 0; w0:= (w2).word; while w0<>0 do begin f0 lshift 8; if w1:= w3 extract 8=25 then begin w3 lshift -8; (w2).word:= w3; last:= w2; (w3:=b.current).tc_state:= w1:= 5; ! completed ! w0:= 0; end; end; end; w0:= last-first+2; w3:= b.current; end; end; begin ! put 90 null chars ! w1:= address((w2:=(w3).tc_buf).buf_data1); (w1).word:= w0:= 0; move(.w3.,w0:=60,w1,w2:=w1+2); end; end; ! case ! if w0>0 then begin ! write next output block ! w1:= (w3).tc_buf; (w1).buf_op:= w2:= 5; (w1).buf_mode:= w2:= (w3).tc_mode; (w1).buf_first:= w2:= address((w1).buf_data1); w2+w0-2; (w1).buf_last:= w2; testout(.w3.,w0,w1:=(w1).buf_first,w2:=0); w1:= (w3).tc_buf; sendwait(.w3.,w0,w1,w2:=address((w3).tc_name)); check_devicestatus(.w3.,w0,w1:=address(b.ans_status),w2); if w1:=(w3).pc_inpstate=0 then ! normal input mode ! (w3).tc_bsptr:= w0:= (w3).tc_bsptr+b.ans_bytes; if w1<=0 then if w2<>2 then begin if w0:=(w1:=address((w3).tc_console)).word<>0 then begin oproutput(.w3.,w0:=2,w1:=2,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; hold(.w3.); (w3).pc_inpstate:= w0:= -1; goto loop; end else begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 2; ! receiver ! (w3).tc_status:= w2; goto closeup; end; end; end; case w2:=(w0:=(w3).pc_inpstate+1)+1 of begin (w3).pc_inpstate:= w0; begin ! normal input mode ! if w2:=(w3).tc_state>0 then begin (w3).pc_inpstate:= w0; end; end; goto closeup; end; !test 295; goto loop; closeup: closebs(.w3.); updatetransport(.w3.); if w0:=b.oprtdetails<>0 then oproutput(.w3.,w0:=1,w1:=4,w2:=(w3).tc_state); end; ! get next transport ! suicide: remove_tc(.w3.,w1:=b.current); goto b.activate; end; end; ! pc ! !branch 2,8; body of rd comment reader coroutine; begin label loop, closeup, suicide; incode ref first, last; ref transref, queueref; ref return; begin return:= w3; call w3 return; ! pseudo call ! while w1=w1 do begin ! get next transport ! w1:= address((w3).tc_nexttr); w1:= (w1).tq_next; if w2:=address((w3).tc_nexttr)=w1 then goto suicide; ! end transp. queue ! w1:= (w3).tc_nexttr; queueref:= w1; looktransport(.w3.,w1:=(w1).tq_transno,w2); transref:= w2; w1:= queueref; (w3).tc_transno:= w0:= (w1).tq_transno; link(.w3.,w1:=queueref,w2:=address(b.tqfreefst)); w2:= transref; (w3).tc_ointervent:= w0:= 0; (w3).tc_aintervent:= w0; (w3).tc_mode:= w0:= (w2).tr_mode; (w3).tc_bsl:= w0:= (w2).tr_basel; (w3).tc_bsu:= w0:= (w2).tr_baseu; (w3).tc_bsptr:= w0:= (w2).tr_bsstartptr; (w3).tc_state:= w0:= 0; move(.w3.,w0:=8,w1:=address((w2).tr_bsarea),w2:=address((w3).tc_bsname)); move(.w3.,w0,w1:=address((w1:=transref).tr_qgroup), w2:=address((w3).tc_qgroup)); move(.w3.,w0,w1:=address((w1:=transref).tr_qname), w2:=address((w3).tc_qname)); begin ! hold device ! oproutput(.w3.,w0:=1,w1:=1,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; hold(.w3.); end; loop: if w2:=(w3).tc_ointervent<>0 then begin ! operator intervention ! !test 206; case w2 extract 12 of begin begin ! start ! (w3).rd_inpstate:= w0:= (w3).tc_ointervent lshift -12; end; ! start ! begin ! restart ! ! command not allowed ! end; begin ! stop ! oproutput(.w3.,w0:=1,w1:=3,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; (w3).tc_ointervent:= w0:= 0; hold(.w3.); goto loop; end; begin ! kill ! (w3).tc_state:= w0:= 7; ! killed by operator ! goto closeup; end end; ! case ! (w3).tc_ointervent:= w2:= 0; end; if w2:=(w3).tc_aintervent<>0 then begin (w3).tc_state:= w0:= 8; ! killed by appl ! goto closeup; end; ! get next input block ! w1:= (w3).tc_buf; (w1).buf_op:= w2:= 3; (w1).buf_mode:= w2:= (w3).tc_mode; (w1).buf_first:= w2:= address((w1).buf_data1); w2+(w3).tc_bufsize-2; (w1).buf_last:= w2; sendwait(.w3.,w0,w1,w2:=address((w3).tc_name)); check_devicestatus(.w3.,w0,w1:=address(b.ans_status),w2); w1:= (w3).tc_buf; if w0:=b.ans_bytes=0 then begin if w2=2 then goto loop; (w1).buf_data1:= w0:= 4'012101210121; ! "<25><25><25>" ! if w0:= 8'01000002 ! end doc, normal ! onemask w2 then begin if w0:=(w3).rd_inpstate>0 then begin ! file continues on another tape ! oproutput(.w3.,w0:=1,w1:=2,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; end else begin hold(.w3.); goto loop; end; end else begin (w3).tc_state:= w0:= 5; ! completed ! end; end else begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 1; ! sender ! (w3).tc_status:= w2; end; w0:= 2; end; w1:= (w1).buf_first; if w2:=(w1).word<>4'012101210121 then testout(.w3.,w0,w1,w2:=0); put_block(.w3.,w0,w1,w2); if w2=2 then (w3).tc_bsptr:= w0+(w3).tc_bsptr else begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 2; ! receiver ! (w3).tc_status:= w2; end; if w0:=(w3).tc_state=0 then goto loop; closeup: closebs(.w3.); updatetransport(.w3.); if w0:=b.oprtdetails<>0 then oproutput(.w3.,w0:=1,w1:=4,w2:=(w3).tc_state); end; ! get next transport ! suicide: remove_tc(.w3.,w1:=b.current); goto b.activate; end; end; ! rd ! !branch 2,9; body of tw comment tty coroutine; begin label loop, closeup, suicide; incode ref first, last; ref transref, queueref; ref return; begin return:= w3; call w3 return; ! pseudo call ! while w1=w1 do begin ! get next transport ! w1:= address((w3).tc_nexttr); w1:= (w1).tq_next; if w2:=address((w3).tc_nexttr)=w1 then goto suicide; ! end transp. queue ! w1:= (w3).tc_nexttr; queueref:= w1; looktransport(.w3.,w1:=(w1).tq_transno,w2); transref:= w2; w1:= queueref; (w3).tc_transno:= w0:= (w1).tq_transno; link(.w3.,w1:=queueref,w2:=address(b.tqfreefst)); w2:= transref; (w3).tc_ointervent:= w0:= 0; (w3).tc_aintervent:= w0; (w3).tc_mode:= w0:= (w2).tr_mode; (w3).tc_bsl:= w0:= (w2).tr_basel; (w3).tc_bsu:= w0:= (w2).tr_baseu; (w3).tc_bsptr:= w0:= (w2).tr_bsstartptr; (w3).tc_state:= w0:= 0; move(.w3.,w0:=8,w1:=address((w2).tr_bsarea),w2:=address((w3).tc_bsname)); (w3).tw_inpstate:= w0:= 5; oproutput(.w3.,w0:=1,w1:=5,w2); if w2<>2 then begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 3; ! operator ! (w3).tc_status:= w2; goto closeup; end; loop: if w2:=(w3).tc_aintervent<>0 then begin (w3).tc_state:= w0:= 8; ! killed by appl ! goto closeup; end; ! get next input block ! w1:= (w3).tc_buf; (w1).buf_op:= w2:= 3; (w1).buf_mode:= w2:= (w3).tc_mode; (w1).buf_first:= w2:= address((w1).buf_data1); w2+(w3).tc_bufsize-2; (w1).buf_last:= w2; sendwait(.w3.,w0,w1,w2:=address((w3).tc_name)); check_devicestatus(.w3.,w0,w1:=address(b.ans_status),w2); w1:= (w3).tc_buf; if w0:=b.ans_bytes=0 then begin if w2=2 then goto loop; (w1).buf_data1:= w0:= 4'012101210121; ! "<25><25><25>" ! if w0:= 8'10000002 ! timer , normal ! onemask w2 then begin if w0:=(w3).tw_inpstate>0 then begin (w3).tw_inpstate:= w0-1; goto loop; end else begin (w3).tc_state:= w0:= 5; ! completed ! end; end else begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 1; ! sender ! (w3).tc_status:= w2; end; w0:= 2; end else (w3).tw_inpstate:= w2:= 0; w1:= (w1).buf_first; if w2:=(w1).word<>4'012101210121 then testout(.w3.,w0,w1,w2:=0); put_block(.w3.,w0,w1,w2); if w2=2 then (w3).tc_bsptr:= w0+(w3).tc_bsptr else begin (w3).tc_state:= w0:= 6; ! aborted ! (w3).tc_cause:= w0:= 2; ! receiver ! (w3).tc_status:= w2; end; if w0:=(w3).tc_state=0 then goto loop; closeup: if w0:=b.oprtdetails<>0 then oproutput(.w3.,w0:=1,w1:=4,w2:=(w3).tc_state); closebs(.w3.); updatetransport(.w3.); end; ! get next transport ! suicide: remove_tc(.w3.,w1:=b.current); goto b.activate; end; end; ! tw ! end. ▶EOF◀