1 TITLE IOCONT - CONTROL FOR IO PROGRAMMED OPERATORS
\r
3 EXTERNAL BUFCLC,ERROR,IOSETC,IOIERR,BUFCLR
\r
4 EXTERNAL SETBYT,UINTQ,WAIT1,WSYNC,ADRCK
\r
5 EXTERNAL UXIT,USRJDA,JOBJDA,ILLMOD,PUUOAC,PIOMOD
\r
6 EXTERNAL JOB,ASSIN,PJOBN,ADRERR,USRREL,CUXIT1,CUXIT2
\r
9 ;FOR PURPOSES OF COMMENTING THIS SUBROUTINE THE
\r
10 ;TERM BUFFER HEADER SHALL REFER TO THE 3 WORD HEADER
\r
11 ;WHICH IS USED BY THE USER PROGRAM AND THIS EXEC FOR
\r
12 ;REFERING TO THE RING BUFFERS.
\r
14 ;THE CONTENTS OF THE 3 WORD HEADER (AS SET BY THE MONITOR FOR THE USE
\r
15 ; FROM USERS PROGRAM BY AN INPUT OR AN OUTPUT UUO
\r
16 ; WORD 2: BYTE POINTER TO CURRENT ITEM.
\r
17 ; WORD 3: POSITIVE ITEM COUNT (NO. OF ITEMS LEFT ON
\r
18 ; INPUT, NO. OF FREE ITEMS TO GO ON OUTPUT).
\r
20 ;EACH BUFFER IN THE RING HAS FOLLOWING FORMAT (AS THE USER SEES IT)
\r
22 ; WORD 1: RESERVED FOR BLOCK NUMBER FOR FIXED ADDRESS DEVIC
\r
23 ; WORD 2: BIT 0=USE BIT FOR THIS BUFFER
\r
24 ; BIT 1-17=NO. OF WORDS WHICH FOLLOW (LENGTH OF BUF
\r
25 ; BIT 18-35=ADDRESS OF SECOND WORD OF NEXT BUFFER I
\r
26 ; WORD 3: LH=LINK TO NEXT BLOCK (SET BY MONITOR FOR DECTAB
\r
27 ; RH=NO. OF WORDS OF DATA WHICH FOLLOW (USUALLY
\r
28 ; SET BY EXEC EXCEPT TO COMPUTE WORD COUNT
\r
29 ; THAT HE WANTS TO COMPUTE WORD COUNT
\r
30 ; HIMSELF INSTEAD OF HAVING THE MONITOR DO IT
\r
31 ; USING THE BYTE POINTER IN THE 3 WORD HEADER).
\r
34 ,H. R. MORSE 2/21/65
\r
37 , EXIT ALWAYS RETURNS HERE
\r
38 , THIS ROUTINE PROCESSES THE CLOSE UUO AND DETERMINES WHETHER THE
\r
39 ,OUTPUT ROUTINE SHOULD BE CALLED IF OUTPUT WERE ACTIVE, CLEARS
\r
40 ,THE INPUT BUFFER AREA IF INPUT WERE ACTIVE, AND CLEARS THE
\r
41 ,ITEM COUNTS OF BOTH INPUT AND OUTPUT HEADERS SERVING TO BOTH
\r
42 ,TERMINATE THE USE OF THE DEVICE AND SET THE I/O ROUTINES TO
\r
43 ,ACCEPT ANOTHER INPUT OR OUTPUT COMMAND IN A CLEAR STATE.
\r
44 ,IN THE CASE OF OUTPUT DEVICES. THE CLOSE ROUTINE OF THE DEVICE HANDL
\r
45 ,ING ROUTINE IS CALLED IN CASE ANY SPECIAL HANDLING IS REQUIRED.
\r
48 , ROUTINES CALLED: DCL, WAIT1, UXIT
\r
50 , ACCUMULATORS: DAT S/U PROG U
\r
54 , DEVICE DATA BLOCK: DEVBUF U
\r
57 , IO STATUS WORD: IOACT S IODTER S
\r
63 , JOB BUFFER AREA: IOUSE S
\r
69 CLOSE1: TLOE DEVDAT,CLOSB ;HAS A CLOSE ALREADY BEEN DONE?
\r
70 JRST UXIT ;YES, FOR THIS CHANNEL
\r
71 LDB TAC,PUUOAC ;USER DEVICE CHANNEL NO.
\r
72 HLLM DEVDAT,USRJDA(TAC)
\r
77 MOVE TAC,DEVSER(DEVDAT)
\r
80 UCLS4: PUSHJ PDP,WAIT1; WAIT UNTIL DEVICE IS INACTIVE.
\r
81 TRNN UUO,CLSIN ;SUPPRESS INPUT?
\r
82 TLNN DEVDAT,IBUFB ;NO, WAS INPUT BUFFER SPECIFIED?
\r
84 HRRZ TAC1,DEVBUF(DEVDAT)
\r
86 HRRZ DAT,@TAC1 ;FIRST WORD OF 3 WORD BUFFER HEADER
\r
87 HRR TAC1,@TAC1 ;REMEMBER CURRENT BUFFER IN TAC1
\r
88 HRLZI TAC,IOUSE ;USER BOTH FOR HEADER AND EACH BUFFER
\r
89 JUMPE DAT,UCLS1 ;HAS A RING BEEN SETUP?(NO IF 0)
\r
91 UCLS0: HRR DAT,@DAT; ADVANCE CURRENT INPUT BUFFER ADDRESS
\r
92 ADRCHK DAT ;IS ADDRESS OF?
\r
93 ANDCAM TAC,@DAT ;YES, CLEAR USE BIT.
\r
94 CAME TAC1,DAT; DONE?
\r
96 UCLS1: HRLI DAT,PROG
\r
97 HRR DAT,DEVBUF(DEVDAT)
\r
98 IORM TAC,@DAT ;FLAG AS VIRGIN BUFFER IN 3 WORD HEADER
\r
99 ADDI DAT,2; JBFCTR:=0
\r
100 SETZM @DAT ;CLEAR INPUT ITEM COUNT.
\r
101 UCLS2: TRNN UUO,CLSOUT ;SUPPRESS OUTPUT?
\r
102 TLNN DEVDAT,OBUFB ;NO.WAS OUPUT BUFFER SPECIFIED?
\r
104 HLR DAT, DEVBUF(DEVDAT) ;VIRGIN OUBPUT BUFFER?
\r
108 MOVE TAC,DEVSER(DEVDAT)
\r
109 PUSHJ PDP,DCL(TAC); CLOSE OUTPUT BUFFER
\r
110 HLR DAT,DEVBUF(DEVDAT)
\r
115 SETZM @DAT; JBFCTR:=0
\r
116 UCLS3: PUSHJ PDP,WAIT1
\r
118 TDZ IOS,[XWD IOEND,IODEND]
\r
120 MOVEM IOS,DEVIOS(DEVDAT); IODISC:=0
\r
121 JRST UXIT; EXIT THIS UUO
\r
124 ,DEC 06 00 EX UUO L PT PRE 02 INBUF,OUTBUF
\r
125 ,H. R. MORSE 64-12-26
\r
128 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED
\r
131 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED
\r
132 , SETS UP AN N BUFFER RING FOLLOWING THE USERS PROGRAM FOR DEVICE
\r
133 , D AND INITIALIZES THE JOB BUFFER AREA HEADER:
\r
134 , JBFADR0:=1, JBFADR 1-17:=0
\r
135 , JBFADR 18-35:=ADDRESS OF FIRST BUFFER IN RING
\r
136 ,INPUT SETS DEVIAD:=ADDRESS OF FIRST BUFFER IN RING
\r
137 ,OUTPUT SET DEVOAD:=ADDRESS OF FIRST BUFFER IN RING
\r
138 ,BUFPNT IS RESTORED.
\r
141 , ROUTINES CALLED: BUFCLC, UXIT
\r
142 , SYMBOLS SET/USED:
\r
143 , ACCUMULATORS: BUFPNT S/U PROG U
\r
146 , DEVICE DATA BLOCK: DEVBUF U
\r
149 , JOB BUFFER AREA: JBFADR S
\r
152 INTERN UINBF, UOUTBF
\r
154 UOUTBF: PUSH PDP,BUFPNT; SAVE BUFPNT ON STACK
\r
155 PUSHJ PDP,BUFCLC; SET UP BUFFER RIGH
\r
156 HLR TAC,DEVBUF(DEVDAT);TAC:=OUTPUT BUFFER AREA HEADER ADDRE
\r
157 HRRM BUFPNT,DEVOAD(DEVDAT);DEVOAD:=ADDRESS OF FIRST BUFFER
\r
159 UOBF1: HRLI TAC,PROG; RELOCATE BUFFER AREA HEADER ADDRESS
\r
160 MOVEM BUFPNT,@TAC; JBFADR:=IOUSE,ADDRESS OF FIRST BUFFER
\r
162 POP PDP,BUFPNT; RESTORE BUFPNT FROM STACK
\r
163 JRST UXIT; EXIT THIS UUO
\r
164 UINBF: PUSH PDP,BUFPNT; SAVE BUFPNT ON STACK
\r
165 PUSHJ PDP,BUFCLC; SET UP BUFFER RING
\r
166 HRRM BUFPNT,DEVIAD(DEVDAT); DEVIAD:=ADDRESS OF FIRST BUFFER
\r
168 HRR TAC,DEVBUF(DEVDAT); TAC:=INPUT BUFFER AREA HEADER ADDRE
\r
172 ,DEC 06 00 EX UUO L PT PRE 03 INIT
\r
173 ,H. R. MORSE AND D. A. WITCRAFT 2/21/65
\r
175 , INIT D,MODUS D=JOB DEVICE CHANNEL
\r
176 , MODUS=IORDEL,IOCON,IOWC,MODE.
\r
177 , SIXBIT/NAME/ DEVICE NAME
\r
178 , XWD OBUF,IBUF BUFFER AREA HEADER ADDRESS
\r
179 , EXIT1 DEVICE NOT AVAILABLE
\r
180 , EXIT2 DEVICE PROPERLY AVAILABLE
\r
181 ,THE LEFT HALF OF NAME CONTAINS THE THREE LETTER DEVICE MNEMONIC,
\r
182 , THE RIGHT HALF IS EITHER ZOER (SYSTEM WILL ASSIGN AN ARBITRARY
\r
183 , UNIT) OR NON-ZERO TO REQUEST A SPECIFIC UNIT (LEFT JUSTIFIED).
\r
184 ,IF THE SELECTED DEVICE IS NOT AVAILABLE. CONTROL RETURNS TO EXIT1.
\r
185 ,OTHERWISE, THE DEVICE IS ASSIGNED TO THE USER AND ATTACHED TO HIS
\r
186 ,CHANNEL D. THE DEVICE IS INITIALIZED IN THE FOLLOWING MANNER AFTER
\r
189 , DATA MODE:=BITS 32-35 OF AC UUO
\r
190 , IOCON:=BIT 31 OF AC UUO
\r
191 , IOWC:=BIT 40 OF AC UUO
\r
192 , IORDEL:=BIT 29 OF AC UUO
\r
193 , IOACT:=IODEND:=IOBKTL:=IODTER:=IODERR:=IOIMPM:=0
\r
194 , JBFADR:=JBFCTR:=0 FOR THE SPECIFIED BUFFERS.
\r
195 , DEVBUF:=OBUF,IBUF
\r
198 , ROUTINES CALLED: UINTQ, ASSIGN(UASG1),USEL,UINITZ,UXIT
\r
199 , SYMBOLS SET/USED:
\r
200 , ACCUMULATORS: DEVDAT U
\r
203 , DEVICE DATA BLOCK: DEVBUF S
\r
206 INTERN UINIT,UINIT1
\r
207 UINIT: LDB TAC,PUUOAC ;USER DEVICE CHANNEL NO.
\r
208 SKIPE DEVDAT,USRJDA(TAC) ;IS A DEVICE ALREADY HERE?
\r
209 PUSHJ PDP,RELEA0 ;YES, RELEASE IT
\r
210 MOVE UUO,40 ;RESTORE AC UUO FROM LOC 40
\r
211 PUSHJ PDP,UINTQ ;GET SIXBIT DEVICE NAME FROM USER
\r
213 UINIT1: MOVE ITEM,JOB ;CALLED BY SAVGET
\r
214 PUSHJ PDP,ASSIN; TRY TO ASSIGN DEVICE
\r
215 JRST CUXIT1; NOT AVAILABLE
\r
217 HRRZM DEVDAT,USRJDA(TAC) ;STORE DDB ADR IN DEVICE TABL
\r
219 MOVEM TAC,DEVIOS(DEVDAT)
\r
220 PUSHJ PDP,SETIOS ;SET DDB IOS STATUS WORD
\r
221 ;FROM RT. HALF OF UUO
\r
223 HRLI DEVDAT, INITB ;SET INIT UUO BIT
\r
225 JRST UINIT4 ;OUTPUT NOT SPECIFIED
\r
226 HLLM TAC,DEVBUF(DEVDAT)
\r
227 TLO DEVDAT,OBUFB ;SET OUTPUT BUFFER SPECIFIED BIT
\r
228 UINIT4: TRNN TAC,-1; IS IBUF SPECIFIED?
\r
229 JRST UINIT5 ;INPUT BUF NOT SPECIFIED
\r
230 HRRM TAC,DEVBUF(DEVDAT); DEVBUF 18-35:=IBUF
\r
231 TLO DEVDAT,IBUFB ;SET INPUT BUFFER SPECIFIED BIT
\r
232 UINIT5: HRRZ TAC1,TAC; TAC1:=PROG,IBUF
\r
233 PUSHJ PDP,UINITZ; JBFADR:=JBFCTR:=0 FOR IBUF
\r
234 HLR TAC1,TAC; TAC1:=PROG,OBUF
\r
235 PUSHJ PDP,UINITZ; JBFADR:=JBFCTR:=0 FOR OBUF
\r
236 LDB TAC,PUUOAC ;STORE UUO BITS FOR THIS CHANNEL
\r
237 HLLM DEVDAT,USRJDA(TAC)
\r
241 ,DEC 06 00 EX COM L PT PRE 03 UINITZ
\r
242 ,H. R. MORSE 64-12-26
\r
245 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED.
\r
246 ,SETS JBFADR:=JBFCTR:=0 FOR THE BUFFER AREA HEADER WHOSE ADDRESS
\r
247 ,IS IN AC TAC1. ALSO,JBFPTR 0-5:=JBFPTR 12-17:=0,JBFPTR 6-11:=BYTE S
\r
250 , ROUTINES CALLED: ADRCK, SETBYT
\r
251 , SYMBOLS SET/USED:
\r
252 , ACCUMULATORS: PDP U TAC S/U
\r
254 , JOB BUFFER AREA: JBFADR S
\r
259 UINITZ: TRNN TAC1,-1; IS BUFFER SPECIFIED?
\r
262 PUSHJ PDP,ADRCK ;CHECK 3 WORD BUFFER HEADER
\r
264 SETZM @TAC1; JBFADR:=0
\r
269 SETZM @TAC1; JBFCTR:=0
\r
270 PUSHJ PDP,SETBYT; JBFPTR 6-11:=BYTE SIZE
\r
279 IN: TLNE IOS,IO ;IS THIS DEVICE ALREADY DOING OUTPUT!
\r
280 PUSHJ PDP,WAIT1 ;YES,WAIT TILL IT IS FINISHED
\r
281 LDB TAC,PUUOAC ;SET BIT THAT SAYS AN INPUT UUO HAS OCC
\r
282 TLO DEVDAT,INPB ;FOR THIS DEVICE
\r
283 HLLM DEVDAT,USRJDA(TAC) ;IN LH OF CURRENT JOB DEVICE
\r
284 LDB TAC,PIOMOD ;IO MODE
\r
285 CAIL TAC,DR ;IS THE IO MODE DUMP MODE?
\r
287 IN1: HRR JBUF,DEVBUF(DEVDAT) ;NO, GET ADDRESS OF R WORD BU
\r
288 HRLZI TAC,IOUSE ;BUFFER INUSE BIT
\r
289 HRLI JBUF,PROG ;SET INDEX FIELD FOR RELOCATION USING A
\r
290 PUSHJ PDP,ADRCK ;CHECK BUFFER HEADER
\r
291 HRRZI TAC,2(JBUF) ;END ADDRESS OF 3 WORD HEADER
\r
292 MOVE TAC1,@JBUF ;GET WORD 1 OF 3 WORD BUFFER HEADER (PO
\r
293 HRLI TAC1,PROG ;SET INDEX FIELD COR RELOCATION USING A
\r
294 SKIPG @JBUF ;HAS A BUFFER RING BEEN SET UP (RH NON-
\r
295 ;WHICH HAS BEEN REFERENCED BY PREVIOUS
\r
296 JRST INPUTF ;NO, GO SET UP BUFFER IF NECESSARY AND
\r
297 ADRCHK TAC1 ;YES, CHECK ADDRESS TO SEE IF IN BOUNDS
\r
298 ANDCAB TAC,@TAC1 ;FLAG THIS BUFFER AS BEING FILLED (USE
\r
299 ;AND GET POINTER TO NEXT BUFFER
\r
300 HRRM TAC,@JBUF ;SET WORD 1 IN 3 WORD HEADER TO NEXT BU
\r
301 ADRCHK TAC ;AND CHECK ITS ADDRESS TO SEE IF IN BOUNDS
\r
302 INPUT0: MOVE IOS,DEVIOS(DEVDAT) ;GET IO STATUS WORD
\r
303 TRNN IOS,IOACT ;IS THE DEVICE ALREADY ACTIVE (FILLING
\r
305 TRNN IOS,IOCON ;DOES THE USER WANT TO STOP AFTER EVERY
\r
306 JRST INPT0C ;NO. HE WANTS NORMAL CONTINUOUS OVERLAP
\r
307 PUSHJ PDP,WSYNC ;YES, WAIT TILL DEVICE FINISHES WITH ON
\r
308 INPT0B: HRLI TAC,PROG ;SET FOR RELOCATION
\r
309 HRR TAC,@TAC ;GET POINTER 1 BLOCK AHEAD OF NEXT BBUF
\r
312 INPT0C: HRR TAC1,@TAC1
\r
313 INPT0A: SKIPGE @TAC1
\r
315 INPUT1: PUSHJ PDP,WSYNC
\r
318 TDNE IOS,[XWD IOEND,IODERR]
\r
320 MOVE IOS,DEVIOS(DEVDAT)
\r
323 INPUT2: ADDI TAC1,1
\r
326 PUSH PDP,ITEM ;SAVE WORD COUNT AS STORED BY IO SERVIC
\r
329 LDB TAC,PIOMOD ;GET DEVICE DATA MODE
\r
330 CAIN TAC, I ;IMAGE MODE?
\r
331 MOVEM ITEM,@JBUF ;YES, STORE WORD COUNT NOT ITEM COUNT
\r
335 INEOF: HRRZI IOS,IODEND
\r
336 IORM IOS,DEVIOS(DEVDAT)
\r
339 INPUTA: HRR TAC1,UUO
\r
343 ;HERE ON FIRST INPUT AFTER INIT, INIT & LOOKUP, OR INIT & LOOKUP & IN
\r
344 INPUTF: ANDCAM TAC,@JBUF ;MARK THAT BUFFERS HAVE BEEN REFERENCED
\r
345 HRR TAC,@JBUF ;PICKUP ADDRESS OF FIRST BUFFERE IN RING
\r
346 HRRM TAC,DEVIAD(DEVDAT) ;SET CURRENT RING BUFFER ADDR
\r
347 ;IN DEVICE DATA BLOCK
\r
348 SKIPN @JBUF ;HAS A RING BEEN SET UP YET?
\r
349 JRST INPUT3 ;NO, GO SET UP A 2 BUFFER RING
\r
350 PUSHJ PDP,CALIN ;YES, GO START TO SERVICE ROUTINE
\r
353 INPUT3: HRRI UUO,2 ;BUFFERS NOT SETUP YET.
\r
356 HLLZS UUO ;CLEAR RIGHT HALF
\r
359 INDMP: PUSHJ PDP,WSYNC
\r
360 MOVE TAC,DEVSER(DEVDAT)
\r
368 CALIN: TLNE IOS,IOEND
\r
372 MOVE TAC,DEVSER(DEVDAT)
\r
380 ,DEC 06 00 EX COM L PT PRE 03 OUTPUT
\r
381 ,H.R. MORSE 2/21/65
\r
389 ,IF INPUT IS ACTIVE, WAIT FOR IT TO COMPLETE.
\r
390 ,IF DUMP MODE WAS SELECTED BY THE LAST INIT UUO., THEN A CHECK IS MADE
\r
391 , TO SEE IF DUMP FILES ARE LEGAL FOR THIS DEVICE. IF DUMP FILES AR
\r
392 , NOT LEGAL. (IORET=0) AN ERROR MESSAGE IS PRINTED ON THE TTY AND
\r
393 , CONTROL IS TRANSFERRED T THE COMMAND INPUT ROUTINE.
\r
394 , OTHERWISE,THE PROGRAM WAITS UNTIL THE DEVICE IS INACTIVE AND THEN
\r
395 , WRITES THE DUMPFILE AND RETURNS CONTROL TO THE USERS PROGRAM
\r
396 ,IF THE MODE IS NOT DUMP, THEN
\r
397 ,1) IF ADR IS NOT ZERO, WAIT FOR DEVICE TO BECOME INACTIVE THEN SET T
\r
398 , CURRENT BUFFER ADDRESS EQUAL TO ADR AND AN INDICATOR (JBFADR0)
\r
399 , SPECIFYING THAT THIS BUFFER RING HAS NEVER BEEN REFERENCED FROM T
\r
400 , USERS PROGRAM BY AN INPUT OR AN OUTPUT UUO. OTHERWISE, GO TO
\r
403 ,2) IF THE BUFFER RING HAS NEVER BEEN REFERENCED (JBFADR0=1), THE
\r
404 , BUFFER IS CLEARED. IOUSE SET TO ZERO AND
\r
405 , IF THE CURRENT BUFFER ADDRESS IS ZERO, A TWO BUFFER RING IS SE
\r
408 ,3) IF THE BUFFER RING HAS BEEN REFERENCED (JBFADR0=0 ,THEN A C
\r
409 , MADE TO DETERMINE IF THE WORD COUNT IS TO BE COMPUTED.
\r
410 , IF THE WORD COUNT IS TO BE COMPUTED (IOWC=0), IT IS SET EQUAL
\r
411 , TO THE ADDRESS FOR THE LAST DATA WORD MINUS THE ADDRESS OF THE
\r
412 , BUFFER MINUS ONE,
\r
414 ,4) IOUSE IS SET TO ONE. INDICATING THAT THE BUFFER IS FULL OR BEING
\r
415 , EMPTIED, AND THE CURRENT BUFFER ADDRESS IS ADVANCED.
\r
417 ,5) IF THE DEVICE IS NOT ACTIVE (IOACT=0), OUTPUT IS STARTED.
\r
418 ,6) IF THE CURRENT BUFFER IS FULL OR BEING EMPTIED (IOUSE=1),
\r
419 , THE PROGRAM WAITS UNTIL THE DEVICE IS INACTIVE
\r
420 ,7) THE CURRENT BUFFER IS CLEARED.
\r
421 ,8) THE ITEM POINTER IS INITIATED TO THE CURRENT BUFFER ADDRESS+1
\r
422 , AND THE ITEM COUNT IS SET TO THE PRODUCT OF THE BUFFER SIZE
\r
423 , MINUS ONE AND THE INTEGER PART OF 36/BYTE SIZE.
\r
424 ,9) RETURN TO THE USERS PROGRAM
\r
429 , ROUTINE CALLED: ADRCK, BUFCLR, CALOUT, INOUT, IOSETC, OUTA,
\r
430 , OUTBUF, UXIT, WSYNC,
\r
431 , SYMBOLS SET/USED:
\r
432 , ACCUMULATORS: DEVDAT U PROG U
\r
434 , ITEM S/U TAC1 S/U
\r
437 , DEVICE DATA BLOCK: DEVBUF U DEVOAD S
\r
438 , IO STATUS WORD: IOACT U
\r
440 , JOB BUFFER AREA: JBADR S/U
\r
451 OUT: TLNN IOS,IO ;IS THIS DEVICE ALREADY DOING INPUT?
\r
452 PUSHJ PDP,WAIT1 ;YES, WAIT TILL IT BECOMES INACTIVE
\r
455 HLLM DEVDAT,USRJDA(TAC)
\r
460 OUT1: HLR JBUF,DEVBUF(DEVDAT)
\r
461 PUSHJ PDP,ADRCK ;CHECK END OF 3 WORD HEADER
\r
465 SKIPG TAC1, @JBUF ;HAS THIS BUFFER EVER BEEN
\r
466 ;;REFERENCED?(JBFADR0=0?)
\r
473 TRNE IOS, IOWC ;COMPUTE WORD COUNT?(IOWC=0?)
\r
475 ADRCHK TAC1 ;PROCEED IF ADDRESS OF WORD COUNT
\r
476 ;<PROTECTION ADDRESS
\r
477 HRRM TAC, @TAC1 ;WORD COUNT:=C(JBFPTR18-35)
\r
482 IORB TAC, @TAC1 ;IOUSE:=1
\r
484 HRRM TAC,@JBUF ;ADVANCE CURRENT BUFFER ADDRE
\r
485 MOVE IOS,DEVIOS (DEVDAT)
\r
487 PUSHJ PDP, CALOUT ;START OUTPUT
\r
488 HLR JBUF,DEVBUF(DEVDAT)
\r
492 SKIPG @TAC1 ;IOUSE=1?
\r
493 PUSHJ PDP, WSYNC ;WAIT FOR DEVICE TO BECOME IN
\r
497 OUTF: SKIPE TAC1,@JBUF
\r
501 HLR JBUF,DEVBUF(DEVDAT)
\r
503 OUTF1: HRLZI TAC, IOUSE
\r
504 ANDCAB TAC, @JBUF ;IOUSE:=0
\r
505 HRRM TAC,DEVOAD(DEVDAT)
\r
506 OUTS: HRRZ TAC,@JBUF
\r
510 LDB ITEM,[POINT 17,@TAC1,17]
\r
512 PUSHJ PDP,IOSETC ;JBFPTR18-35:=CURRENT BUFFER
\r
514 ;JBFCTR:=(BUFFER SIZE-1)*[36/BYTE
\r
516 JRST UXIT ;RETURN TO USERS PROGRAM
\r
518 OUTDMP: PUSHJ PDP,WSYNC
\r
519 MOVE TAC,DEVSER(DEVDAT)
\r
526 ,DEC 06 00 EX COM L PT PRE 01 OUTA
\r
527 ,H.R. MORSE 64-12-26
\r
531 , EXIT ALWAYS RETURN HERE
\r
532 ,IF THE ADDRESS FIELD OF AC UUO IS ZERO,EXIT. OTHERWISE,CHECK IOACT.
\r
533 ,IF IOACT=1, WIAT FOR IOACT=0.
\r
534 ,SET JBFADR18-35:=ADDRESS FIELD OF AC UUO. JBFADR0:=1 AND EXIT.
\r
538 , ROUTINES CALLED: WSYNC
\r
539 , SYMBOLS SET/USED:
\r
540 , ACCUMULATORS: DEVDAT U
\r
543 , DEVICE DATA BLOCK: DEVIOS U DEVBUF U
\r
544 , IO STATUS WORD: IOACT U
\r
545 , JOB BUFFER AREA: IOUSE U
\r
549 OUTA: TRNN UUO, 777777 ;IS BUFFER ADDRESS SPECIFIED?
\r
552 HLR JBUF,DEVBUF(DEVDAT)
\r
555 HRRM UUO,DEVOAD(DEVDAT)
\r
562 ,DEC 06 00 EX COM L PT PRE 03 CALOUT
\r
563 ,H.R. MORSE 2/21/65
\r
569 ,DISPATCH TO DEVICE SERVICE ROUTINE DOU TO INITIATE OUTPUT.
\r
573 , SYMBOLS SET/USED:
\r
574 , ACCUMULATORS: DEVDAT U
\r
576 , DEVICE DATA BLOCK: DEVSER U
\r
579 CALOUT: TRNN IOS,IOACT
\r
584 CALOU1: MOVE TAC,DEVSER(DEVDAT)
\r
591 INTERNAL RELEA1,RELEA2,RELEA3,RELEA5
\r
593 RELEA0: MOVE IOS,DEVIOS(DEVDAT) ;CALLED FROM INIT
\r
595 RELEA1: TRZ UUO,-1 ;CLOSE BOTH INPUT AND OUTPUT
\r
597 PUSHJ PDP,WAIT1 ;WAIT FOR DEVICE TO BECOME INACTIVE
\r
598 RELEA5: MOVE TAC, DEVSER(DEVDAT) ;RELEASE WITHOUT WAITING
\r
599 PUSHJ PDP, DRL (TAC)
\r
602 MOVEI TAC,17 ;IS THE DEVICE ON AONTHER USER CHANNEL?
\r
603 RELEA4: HRRZ TAC1,USRJDA(TAC)
\r
606 JUMPGE TAC,UXIT ;EXIT IF ON ANOTHER CHANNEL
\r
607 MOVEI TAC1,ASSPRG ;OTHERWISE CLEAR ASSIGNED BY PROG. BIT
\r
608 ANDCAB TAC1,DEVMOD(DEVDAT)
\r
609 TDNN TAC1,[XWD TTYUSE,ASSCON] ; ASSIGNED BY CONSOLE OR TTY I
\r
610 DPB UUO,PJOBN ;NO. CLEAR JOB NUMBER
\r
616 ,DEC 06 00 EX UUO L PT PRE 01 STATO
\r
617 ,H.R. MORSE 64-12-26
\r
621 , EXIT1 ALL SELECTED BITS ARE 0
\r
622 , EXIT2 SOME SELECTED BITS ARE 1
\r
623 ,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USERS CHANNEL D WHICH
\r
624 ,ARE SELECTED BY MASK.
\r
626 ,MONITOR INTERFACE:
\r
628 , ROUTINES CALLED: UXIT
\r
629 , SYMBOLS SET/USED:
\r
630 , ACCUMULATORS: IOS U
\r
636 USTATO: TRNE IOS,(UUO) ;SKIP IF ANY INDICATED BITS ARE ONE
\r
641 ,DEC 06 00 EX UUO L PT PRE 01 STATUS
\r
642 ,H.R. MORSE 64-12-26
\r
646 , EXIT ALWAYS RETURNS HERE
\r
647 ,STORES I/O STATUS WORD OF DEVICE ON CHANNEL D IN LOCATION ADR.
\r
651 , ROUTINES CALLED: UXIT
\r
652 , SYMBOLS SET/USED:
\r
653 , ACCUMULATORS: IOS U
\r
658 EXTERNAL ADRERR,USRREL
\r
660 USTATS: MOVE TAC,USRREL ;CHECK TO SEE IF IN BOUNDS
\r
663 HRLI UUO,PROG ;LOAD STATUS INTO INDICATED ADDRESS.
\r
670 , EXIT ALWAYS RETURN HERE
\r
673 EXTERNAL WAIT1,SETIOS
\r
675 USETST: PUSHJ PDP,WAIT1 ;WAIT TILL DEVICE INACTIVE
\r
677 IORM IOS,DEVIOS(DEVDAT)
\r
678 HRRM UUO,DEVIOS(DEVDAT)
\r
681 ,DEC 06 00 EX UUO L PT PRE 01 STATZ
\r
682 ,H.R. MORSE 64-12-26
\r
686 , EXIT1 SOME SELECTED BITS ARE 1
\r
687 , EXIT2 ALL SELECTED BITS ARE 0
\r
689 ,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USERS
\r
690 ,CHANNEL D WHICH ARE SELECTED BY MASK,
\r
694 , ROUTINES CALLED: UXIT
\r
695 , SYMBOLS SET/USED:
\r
696 , ACCUMULATORS: IOS U
\r
702 USTATZ: TRNN IOS,(UUO) ;SKIP IF ALL INDICATED BITS ARE ZERO
\r