TITLE IOCONT - CONTROL FOR IO PROGRAMMED OPERATORS SUBTTL 8-9-95 EXTERNAL BUFCLC,ERROR,IOSETC,IOIERR,BUFCLR EXTERNAL SETBYT,UINTQ,WAIT1,WSYNC,ADRCK EXTERNAL UXIT,USRJDA,JOBJDA,ILLMOD,PUUOAC,PIOMOD EXTERNAL JOB,ASSIN,PJOBN,ADRERR,USRREL,CUXIT1,CUXIT2 EXTERNAL SETIOS ;FOR PURPOSES OF COMMENTING THIS SUBROUTINE THE ;TERM BUFFER HEADER SHALL REFER TO THE 3 WORD HEADER ;WHICH IS USED BY THE USER PROGRAM AND THIS EXEC FOR ;REFERING TO THE RING BUFFERS. ;THE CONTENTS OF THE 3 WORD HEADER (AS SET BY THE MONITOR FOR THE USE ; FROM USERS PROGRAM BY AN INPUT OR AN OUTPUT UUO ; WORD 2: BYTE POINTER TO CURRENT ITEM. ; WORD 3: POSITIVE ITEM COUNT (NO. OF ITEMS LEFT ON ; INPUT, NO. OF FREE ITEMS TO GO ON OUTPUT). ;EACH BUFFER IN THE RING HAS FOLLOWING FORMAT (AS THE USER SEES IT) ; WORD 1: RESERVED FOR BLOCK NUMBER FOR FIXED ADDRESS DEVIC ; WORD 2: BIT 0=USE BIT FOR THIS BUFFER ; BIT 1-17=NO. OF WORDS WHICH FOLLOW (LENGTH OF BUF ; BIT 18-35=ADDRESS OF SECOND WORD OF NEXT BUFFER I ; WORD 3: LH=LINK TO NEXT BLOCK (SET BY MONITOR FOR DECTAB ; RH=NO. OF WORDS OF DATA WHICH FOLLOW (USUALLY ; SET BY EXEC EXCEPT TO COMPUTE WORD COUNT ; THAT HE WANTS TO COMPUTE WORD COUNT ; HIMSELF INSTEAD OF HAVING THE MONITOR DO IT ; USING THE BYTE POINTER IN THE 3 WORD HEADER). ,H. R. MORSE 2/21/65 ,CALLING SEQUENCE , CLOSE D, , EXIT ALWAYS RETURNS HERE , THIS ROUTINE PROCESSES THE CLOSE UUO AND DETERMINES WHETHER THE ,OUTPUT ROUTINE SHOULD BE CALLED IF OUTPUT WERE ACTIVE, CLEARS ,THE INPUT BUFFER AREA IF INPUT WERE ACTIVE, AND CLEARS THE ,ITEM COUNTS OF BOTH INPUT AND OUTPUT HEADERS SERVING TO BOTH ,TERMINATE THE USE OF THE DEVICE AND SET THE I/O ROUTINES TO ,ACCEPT ANOTHER INPUT OR OUTPUT COMMAND IN A CLEAR STATE. ,IN THE CASE OF OUTPUT DEVICES. THE CLOSE ROUTINE OF THE DEVICE HANDL ,ING ROUTINE IS CALLED IN CASE ANY SPECIAL HANDLING IS REQUIRED. ,MONITOR INTERFACE , STORAGE: 30 , ROUTINES CALLED: DCL, WAIT1, UXIT , SYMBOLS SET/USED: , ACCUMULATORS: DAT S/U PROG U , DEVDAT U TAC S/U , IOS S/U TAC1 S/U , PDP U , DEVICE DATA BLOCK: DEVBUF U , DEVIOS S/U , DEVSER U , IO STATUS WORD: IOACT S IODTER S , IOBEG S IOEND S , IOBKTL 2 IOFST S , IODEND S IOIMPM S , IODERR S IOSTRT S , IODISC S IOW S , JOB BUFFER AREA: IOUSE S , JBFCTR S INTERNAL CLOSE1 CLOSE1: TLOE DEVDAT,CLOSB ;HAS A CLOSE ALREADY BEEN DONE? JRST UXIT ;YES, FOR THIS CHANNEL LDB TAC,PUUOAC ;USER DEVICE CHANNEL NO. HLLM DEVDAT,USRJDA(TAC) PUSH PDP,DAT LDB TAC,PIOMOD CAIGE TAC,DR JRST UCLS4 MOVE TAC,DEVSER(DEVDAT) PUSHJ PDP,DCL(TAC) JRST UCLS3 UCLS4: PUSHJ PDP,WAIT1; WAIT UNTIL DEVICE IS INACTIVE. TRNN UUO,CLSIN ;SUPPRESS INPUT? TLNN DEVDAT,IBUFB ;NO, WAS INPUT BUFFER SPECIFIED? JRST UCLS2 ;NO HRRZ TAC1,DEVBUF(DEVDAT) HRLI TAC1,PROG HRRZ DAT,@TAC1 ;FIRST WORD OF 3 WORD BUFFER HEADER HRR TAC1,@TAC1 ;REMEMBER CURRENT BUFFER IN TAC1 HRLZI TAC,IOUSE ;USER BOTH FOR HEADER AND EACH BUFFER JUMPE DAT,UCLS1 ;HAS A RING BEEN SETUP?(NO IF 0) HRLI DAT,PROG ;YES UCLS0: HRR DAT,@DAT; ADVANCE CURRENT INPUT BUFFER ADDRESS ADRCHK DAT ;IS ADDRESS OF? ANDCAM TAC,@DAT ;YES, CLEAR USE BIT. CAME TAC1,DAT; DONE? JRST UCLS0 UCLS1: HRLI DAT,PROG HRR DAT,DEVBUF(DEVDAT) IORM TAC,@DAT ;FLAG AS VIRGIN BUFFER IN 3 WORD HEADER ADDI DAT,2; JBFCTR:=0 SETZM @DAT ;CLEAR INPUT ITEM COUNT. UCLS2: TRNN UUO,CLSOUT ;SUPPRESS OUTPUT? TLNN DEVDAT,OBUFB ;NO.WAS OUPUT BUFFER SPECIFIED? JRST UCLS3 ;NO HLR DAT, DEVBUF(DEVDAT) ;VIRGIN OUBPUT BUFFER? HRLI DAT, PROG SKIPG @DAT JRST UCLS3 ;YES MOVE TAC,DEVSER(DEVDAT) PUSHJ PDP,DCL(TAC); CLOSE OUTPUT BUFFER HLR DAT,DEVBUF(DEVDAT) HRLI DAT,PROG HRLZI TAC,IOUSE IORM TAC,@DAT ADDI DAT,2 SETZM @DAT; JBFCTR:=0 UCLS3: PUSHJ PDP,WAIT1 POP PDP,DAT TDZ IOS,[XWD IOEND,IODEND] TLO IOS,IOBEG MOVEM IOS,DEVIOS(DEVDAT); IODISC:=0 JRST UXIT; EXIT THIS UUO ,DEC 06 00 EX UUO L PT PRE 02 INBUF,OUTBUF ,H. R. MORSE 64-12-26 ,CALLING SEQUENCE , INBUF D,N , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED ,CALLING SEQUENCE , OUTBUF D,N , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED , SETS UP AN N BUFFER RING FOLLOWING THE USERS PROGRAM FOR DEVICE , D AND INITIALIZES THE JOB BUFFER AREA HEADER: , JBFADR0:=1, JBFADR 1-17:=0 , JBFADR 18-35:=ADDRESS OF FIRST BUFFER IN RING ,INPUT SETS DEVIAD:=ADDRESS OF FIRST BUFFER IN RING ,OUTPUT SET DEVOAD:=ADDRESS OF FIRST BUFFER IN RING ,BUFPNT IS RESTORED. ,MONITOR INTERFACE , STORAGE:13 , ROUTINES CALLED: BUFCLC, UXIT , SYMBOLS SET/USED: , ACCUMULATORS: BUFPNT S/U PROG U , DEVDAT U TAC S/U , PDP U TAC1 S/U , DEVICE DATA BLOCK: DEVBUF U , DEVIAD S , DEVOAD S , JOB BUFFER AREA: JBFADR S INTERN UINBF, UOUTBF UOUTBF: PUSH PDP,BUFPNT; SAVE BUFPNT ON STACK PUSHJ PDP,BUFCLC; SET UP BUFFER RIGH HLR TAC,DEVBUF(DEVDAT);TAC:=OUTPUT BUFFER AREA HEADER ADDRE HRRM BUFPNT,DEVOAD(DEVDAT);DEVOAD:=ADDRESS OF FIRST BUFFER , IN RING UOBF1: HRLI TAC,PROG; RELOCATE BUFFER AREA HEADER ADDRESS MOVEM BUFPNT,@TAC; JBFADR:=IOUSE,ADDRESS OF FIRST BUFFER , IN RING POP PDP,BUFPNT; RESTORE BUFPNT FROM STACK JRST UXIT; EXIT THIS UUO UINBF: PUSH PDP,BUFPNT; SAVE BUFPNT ON STACK PUSHJ PDP,BUFCLC; SET UP BUFFER RING HRRM BUFPNT,DEVIAD(DEVDAT); DEVIAD:=ADDRESS OF FIRST BUFFER , IN RING HRR TAC,DEVBUF(DEVDAT); TAC:=INPUT BUFFER AREA HEADER ADDRE JRST UOBF1 ,DEC 06 00 EX UUO L PT PRE 03 INIT ,H. R. MORSE AND D. A. WITCRAFT 2/21/65 ,CALLING SEQUENCE , INIT D,MODUS D=JOB DEVICE CHANNEL , MODUS=IORDEL,IOCON,IOWC,MODE. , SIXBIT/NAME/ DEVICE NAME , XWD OBUF,IBUF BUFFER AREA HEADER ADDRESS , EXIT1 DEVICE NOT AVAILABLE , EXIT2 DEVICE PROPERLY AVAILABLE ,THE LEFT HALF OF NAME CONTAINS THE THREE LETTER DEVICE MNEMONIC, , THE RIGHT HALF IS EITHER ZOER (SYSTEM WILL ASSIGN AN ARBITRARY , UNIT) OR NON-ZERO TO REQUEST A SPECIFIC UNIT (LEFT JUSTIFIED). ,IF THE SELECTED DEVICE IS NOT AVAILABLE. CONTROL RETURNS TO EXIT1. ,OTHERWISE, THE DEVICE IS ASSIGNED TO THE USER AND ATTACHED TO HIS ,CHANNEL D. THE DEVICE IS INITIALIZED IN THE FOLLOWING MANNER AFTER ,IOACT IS ZERO: , IOBEG:=1 , DATA MODE:=BITS 32-35 OF AC UUO , IOCON:=BIT 31 OF AC UUO , IOWC:=BIT 40 OF AC UUO , IORDEL:=BIT 29 OF AC UUO , IOACT:=IODEND:=IOBKTL:=IODTER:=IODERR:=IOIMPM:=0 , JBFADR:=JBFCTR:=0 FOR THE SPECIFIED BUFFERS. , DEVBUF:=OBUF,IBUF ,MONITOR INTERFACE , STORAGE: 20 , ROUTINES CALLED: UINTQ, ASSIGN(UASG1),USEL,UINITZ,UXIT , SYMBOLS SET/USED: , ACCUMULATORS: DEVDAT U , PDP U TAC U , PROG U TAC1 S/U , DEVICE DATA BLOCK: DEVBUF S INTERN UINIT,UINIT1 UINIT: LDB TAC,PUUOAC ;USER DEVICE CHANNEL NO. SKIPE DEVDAT,USRJDA(TAC) ;IS A DEVICE ALREADY HERE? PUSHJ PDP,RELEA0 ;YES, RELEASE IT MOVE UUO,40 ;RESTORE AC UUO FROM LOC 40 PUSHJ PDP,UINTQ ;GET SIXBIT DEVICE NAME FROM USER AOS (PDP) UINIT1: MOVE ITEM,JOB ;CALLED BY SAVGET PUSHJ PDP,ASSIN; TRY TO ASSIGN DEVICE JRST CUXIT1; NOT AVAILABLE LDB TAC,PUUOAC HRRZM DEVDAT,USRJDA(TAC) ;STORE DDB ADR IN DEVICE TABL HRLZI TAC,IOBEG MOVEM TAC,DEVIOS(DEVDAT) PUSHJ PDP,SETIOS ;SET DDB IOS STATUS WORD ;FROM RT. HALF OF UUO PUSHJ PDP,UINTQ HRLI DEVDAT, INITB ;SET INIT UUO BIT TLNN TAC,-1 JRST UINIT4 ;OUTPUT NOT SPECIFIED HLLM TAC,DEVBUF(DEVDAT) TLO DEVDAT,OBUFB ;SET OUTPUT BUFFER SPECIFIED BIT UINIT4: TRNN TAC,-1; IS IBUF SPECIFIED? JRST UINIT5 ;INPUT BUF NOT SPECIFIED HRRM TAC,DEVBUF(DEVDAT); DEVBUF 18-35:=IBUF TLO DEVDAT,IBUFB ;SET INPUT BUFFER SPECIFIED BIT UINIT5: HRRZ TAC1,TAC; TAC1:=PROG,IBUF PUSHJ PDP,UINITZ; JBFADR:=JBFCTR:=0 FOR IBUF HLR TAC1,TAC; TAC1:=PROG,OBUF PUSHJ PDP,UINITZ; JBFADR:=JBFCTR:=0 FOR OBUF LDB TAC,PUUOAC ;STORE UUO BITS FOR THIS CHANNEL HLLM DEVDAT,USRJDA(TAC) JRST CUXIT2 ,DEC 06 00 EX COM L PT PRE 03 UINITZ ,H. R. MORSE 64-12-26 ,CALLING SEQUENCE , PUSHJ PDP,UINITZ , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED. ,SETS JBFADR:=JBFCTR:=0 FOR THE BUFFER AREA HEADER WHOSE ADDRESS ,IS IN AC TAC1. ALSO,JBFPTR 0-5:=JBFPTR 12-17:=0,JBFPTR 6-11:=BYTE S ,MONITOR INTERFACE , STORAGE:15 , ROUTINES CALLED: ADRCK, SETBYT , SYMBOLS SET/USED: , ACCUMULATORS: PDP U TAC S/U , TAC1 S/U , JOB BUFFER AREA: JBFADR S , JBFCTR S , JBFPTR S INTERN UINITZ UINITZ: TRNN TAC1,-1; IS BUFFER SPECIFIED? POPJ PDP,;RETURN HRLI TAC1,PROG PUSHJ PDP,ADRCK ;CHECK 3 WORD BUFFER HEADER HRRZI TAC,2(TAC1) SETZM @TAC1; JBFADR:=0 AOS TAC1 PUSH PDP,TAC PUSH PDP,TAC1 AOS TAC1 SETZM @TAC1; JBFCTR:=0 PUSHJ PDP,SETBYT; JBFPTR 6-11:=BYTE SIZE TLZ TAC,770077 POP PDP,TAC1 HLLM TAC,@TAC1 POP PDP,TAC POPJ PDP,; RETURN INTERNAL IN IN: TLNE IOS,IO ;IS THIS DEVICE ALREADY DOING OUTPUT! PUSHJ PDP,WAIT1 ;YES,WAIT TILL IT IS FINISHED LDB TAC,PUUOAC ;SET BIT THAT SAYS AN INPUT UUO HAS OCC TLO DEVDAT,INPB ;FOR THIS DEVICE HLLM DEVDAT,USRJDA(TAC) ;IN LH OF CURRENT JOB DEVICE LDB TAC,PIOMOD ;IO MODE CAIL TAC,DR ;IS THE IO MODE DUMP MODE? JRST INDMP ;YES IN1: HRR JBUF,DEVBUF(DEVDAT) ;NO, GET ADDRESS OF R WORD BU HRLZI TAC,IOUSE ;BUFFER INUSE BIT HRLI JBUF,PROG ;SET INDEX FIELD FOR RELOCATION USING A PUSHJ PDP,ADRCK ;CHECK BUFFER HEADER HRRZI TAC,2(JBUF) ;END ADDRESS OF 3 WORD HEADER MOVE TAC1,@JBUF ;GET WORD 1 OF 3 WORD BUFFER HEADER (PO HRLI TAC1,PROG ;SET INDEX FIELD COR RELOCATION USING A SKIPG @JBUF ;HAS A BUFFER RING BEEN SET UP (RH NON- ;WHICH HAS BEEN REFERENCED BY PREVIOUS JRST INPUTF ;NO, GO SET UP BUFFER IF NECESSARY AND ADRCHK TAC1 ;YES, CHECK ADDRESS TO SEE IF IN BOUNDS ANDCAB TAC,@TAC1 ;FLAG THIS BUFFER AS BEING FILLED (USE ;AND GET POINTER TO NEXT BUFFER HRRM TAC,@JBUF ;SET WORD 1 IN 3 WORD HEADER TO NEXT BU ADRCHK TAC ;AND CHECK ITS ADDRESS TO SEE IF IN BOUNDS INPUT0: MOVE IOS,DEVIOS(DEVDAT) ;GET IO STATUS WORD TRNN IOS,IOACT ;IS THE DEVICE ALREADY ACTIVE (FILLING JRST INPT0B ;NO. TRNN IOS,IOCON ;DOES THE USER WANT TO STOP AFTER EVERY JRST INPT0C ;NO. HE WANTS NORMAL CONTINUOUS OVERLAP PUSHJ PDP,WSYNC ;YES, WAIT TILL DEVICE FINISHES WITH ON INPT0B: HRLI TAC,PROG ;SET FOR RELOCATION HRR TAC,@TAC ;GET POINTER 1 BLOCK AHEAD OF NEXT BBUF SKIPL @TAC PUSHJ PDP,CALIN INPT0C: HRR TAC1,@TAC1 INPT0A: SKIPGE @TAC1 JRST INPUT2 INPUT1: PUSHJ PDP,WSYNC SKIPGE @TAC1 JRST INPUT2 TDNE IOS,[XWD IOEND,IODERR] JRST INEOF MOVE IOS,DEVIOS(DEVDAT) JRST INPUT1 INPUT2: ADDI TAC1,1 HRRZ ITEM,@TAC1 SUBI TAC1,1 PUSH PDP,ITEM ;SAVE WORD COUNT AS STORED BY IO SERVIC PUSHJ PDP,IOSETC POP PDP,ITEM LDB TAC,PIOMOD ;GET DEVICE DATA MODE CAIN TAC, I ;IMAGE MODE? MOVEM ITEM,@JBUF ;YES, STORE WORD COUNT NOT ITEM COUNT JRST UXIT INEOF: HRRZI IOS,IODEND IORM IOS,DEVIOS(DEVDAT) JRST UXIT INPUTA: HRR TAC1,UUO ANDCAM TAC,@TAC1 JRST INPUT0 ;HERE ON FIRST INPUT AFTER INIT, INIT & LOOKUP, OR INIT & LOOKUP & IN INPUTF: ANDCAM TAC,@JBUF ;MARK THAT BUFFERS HAVE BEEN REFERENCED HRR TAC,@JBUF ;PICKUP ADDRESS OF FIRST BUFFERE IN RING HRRM TAC,DEVIAD(DEVDAT) ;SET CURRENT RING BUFFER ADDR ;IN DEVICE DATA BLOCK SKIPN @JBUF ;HAS A RING BEEN SET UP YET? JRST INPUT3 ;NO, GO SET UP A 2 BUFFER RING PUSHJ PDP,CALIN ;YES, GO START TO SERVICE ROUTINE ;FILLING BUFFER JRST INPT0A INPUT3: HRRI UUO,2 ;BUFFERS NOT SETUP YET. ;SET UP 2 PUSHJ PDP, UINBF HLLZS UUO ;CLEAR RIGHT HALF JRST IN1 INDMP: PUSHJ PDP,WSYNC MOVE TAC,DEVSER(DEVDAT) PUSHJ PDP,DDI(TAC) PUSHJ PDP,WAIT1 JRST UXIT CALIN: TLNE IOS,IOEND POPJ PDP, PUSHJ PDP,WSYNC PUSH PDP,TAC1 MOVE TAC,DEVSER(DEVDAT) PUSHJ PDP,DIN(TAC) POP PDP,TAC1 POPJ PDP, ,DEC 06 00 EX COM L PT PRE 03 OUTPUT ,H.R. MORSE 2/21/65 ,CALLING SEQUENCE , OUTPUT D, , EXIT ,OR , OUTPUT D, ADR , EXIT ,IF INPUT IS ACTIVE, WAIT FOR IT TO COMPLETE. ,IF DUMP MODE WAS SELECTED BY THE LAST INIT UUO., THEN A CHECK IS MADE , TO SEE IF DUMP FILES ARE LEGAL FOR THIS DEVICE. IF DUMP FILES AR , NOT LEGAL. (IORET=0) AN ERROR MESSAGE IS PRINTED ON THE TTY AND , CONTROL IS TRANSFERRED T THE COMMAND INPUT ROUTINE. , OTHERWISE,THE PROGRAM WAITS UNTIL THE DEVICE IS INACTIVE AND THEN , WRITES THE DUMPFILE AND RETURNS CONTROL TO THE USERS PROGRAM ,IF THE MODE IS NOT DUMP, THEN ,1) IF ADR IS NOT ZERO, WAIT FOR DEVICE TO BECOME INACTIVE THEN SET T , CURRENT BUFFER ADDRESS EQUAL TO ADR AND AN INDICATOR (JBFADR0) , SPECIFYING THAT THIS BUFFER RING HAS NEVER BEEN REFERENCED FROM T , USERS PROGRAM BY AN INPUT OR AN OUTPUT UUO. OTHERWISE, GO TO , 2) DIRECTLY. ,2) IF THE BUFFER RING HAS NEVER BEEN REFERENCED (JBFADR0=1), THE , BUFFER IS CLEARED. IOUSE SET TO ZERO AND , IF THE CURRENT BUFFER ADDRESS IS ZERO, A TWO BUFFER RING IS SE , THE GO TO 8 , ,3) IF THE BUFFER RING HAS BEEN REFERENCED (JBFADR0=0 ,THEN A C , MADE TO DETERMINE IF THE WORD COUNT IS TO BE COMPUTED. , IF THE WORD COUNT IS TO BE COMPUTED (IOWC=0), IT IS SET EQUAL , TO THE ADDRESS FOR THE LAST DATA WORD MINUS THE ADDRESS OF THE , BUFFER MINUS ONE, ,4) IOUSE IS SET TO ONE. INDICATING THAT THE BUFFER IS FULL OR BEING , EMPTIED, AND THE CURRENT BUFFER ADDRESS IS ADVANCED. ,5) IF THE DEVICE IS NOT ACTIVE (IOACT=0), OUTPUT IS STARTED. ,6) IF THE CURRENT BUFFER IS FULL OR BEING EMPTIED (IOUSE=1), , THE PROGRAM WAITS UNTIL THE DEVICE IS INACTIVE ,7) THE CURRENT BUFFER IS CLEARED. ,8) THE ITEM POINTER IS INITIATED TO THE CURRENT BUFFER ADDRESS+1 , AND THE ITEM COUNT IS SET TO THE PRODUCT OF THE BUFFER SIZE , MINUS ONE AND THE INTEGER PART OF 36/BYTE SIZE. ,9) RETURN TO THE USERS PROGRAM ,MONITOR INTERFACE , STORAGE: 54 , ROUTINE CALLED: ADRCK, BUFCLR, CALOUT, INOUT, IOSETC, OUTA, , OUTBUF, UXIT, WSYNC, , SYMBOLS SET/USED: , ACCUMULATORS: DEVDAT U PROG U , IOS U TAC S/U , ITEM S/U TAC1 S/U , JBUF S/U UUO S , PDP U , DEVICE DATA BLOCK: DEVBUF U DEVOAD S , IO STATUS WORD: IOACT U , IOWC U , JOB BUFFER AREA: JBADR S/U , JBFCTR S , JBPPTR S/U , BUFFER SIZE U , IOUSE S/U , WORD COUNT S INTERN OUT OUT: TLNN IOS,IO ;IS THIS DEVICE ALREADY DOING INPUT? PUSHJ PDP,WAIT1 ;YES, WAIT TILL IT BECOMES INACTIVE LDB TAC,PUUOAC TLO DEVDAT,OUTPB HLLM DEVDAT,USRJDA(TAC) LDB TAC,PIOMOD CAIL TAC,DR JRST OUTDMP PUSHJ PDP,OUTA OUT1: HLR JBUF,DEVBUF(DEVDAT) PUSHJ PDP,ADRCK ;CHECK END OF 3 WORD HEADER HRRZI TAC,2(JBUF) HRLI JBUF,PROG HRLZI TAC, IOUSE SKIPG TAC1, @JBUF ;HAS THIS BUFFER EVER BEEN ;;REFERENCED?(JBFADR0=0?) JRST OUTF AOS JBUF HRRZ TAC, @JBUF ADDI TAC1, 1 SUB TAC, TAC1 HRLI TAC1,PROG TRNE IOS, IOWC ;COMPUTE WORD COUNT?(IOWC=0?) JRST OUT2 ADRCHK TAC1 ;PROCEED IF ADDRESS OF WORD COUNT ;