Cleanup of typos.
[retro-software/dec/tops10/v1.19.git] / src / iocont.mac
1         TITLE IOCONT - CONTROL FOR IO PROGRAMMED OPERATORS\r
2         SUBTTL 8-9-95\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
7         EXTERNAL SETIOS\r
8 \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
13 \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
19 \r
20 ;EACH BUFFER IN THE RING HAS FOLLOWING FORMAT (AS THE USER SEES IT)\r
21 \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
32 \r
33 \f\r
34 ,H. R. MORSE      2/21/65\r
35 ,CALLING SEQUENCE\r
36 ,         CLOSE D,\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
46 ,MONITOR INTERFACE\r
47 ,         STORAGE: 30\r
48 ,         ROUTINES CALLED:   DCL, WAIT1, UXIT\r
49 ,         SYMBOLS SET/USED:\r
50 ,             ACCUMULATORS:       DAT    S/U    PROG U\r
51 ,                                 DEVDAT U      TAC  S/U\r
52 ,                                 IOS    S/U    TAC1 S/U\r
53 ,                                  PDP   U\r
54 ,             DEVICE DATA BLOCK:   DEVBUF  U\r
55 ,                                  DEVIOS  S/U\r
56 ,                                  DEVSER  U\r
57 ,             IO STATUS WORD:      IOACT   S    IODTER S\r
58 ,                                  IOBEG   S    IOEND  S\r
59 ,                                  IOBKTL  2    IOFST  S\r
60 ,                                  IODEND  S    IOIMPM S\r
61 ,                                  IODERR  S    IOSTRT S\r
62 ,                                  IODISC  S    IOW    S\r
63 ,             JOB BUFFER AREA:     IOUSE   S    \r
64 ,                                  JBFCTR  S\r
65 \f\r
66 \r
67 INTERNAL CLOSE1\r
68 \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
73           PUSH PDP,DAT\r
74           LDB TAC,PIOMOD\r
75           CAIGE TAC,DR\r
76           JRST UCLS4\r
77           MOVE TAC,DEVSER(DEVDAT)\r
78           PUSHJ PDP,DCL(TAC)\r
79           JRST UCLS3\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
83           JRST UCLS2                                ;NO\r
84           HRRZ TAC1,DEVBUF(DEVDAT)\r
85           HRLI TAC1,PROG\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
90           HRLI DAT,PROG         ;YES\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
95           JRST UCLS0\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
103           JRST UCLS3                    ;NO\r
104           HLR DAT, DEVBUF(DEVDAT)       ;VIRGIN OUBPUT BUFFER?\r
105           HRLI DAT, PROG\r
106           SKIPG @DAT\r
107           JRST UCLS3            ;YES\r
108           MOVE TAC,DEVSER(DEVDAT)\r
109           PUSHJ PDP,DCL(TAC); CLOSE OUTPUT BUFFER\r
110           HLR DAT,DEVBUF(DEVDAT)\r
111           HRLI DAT,PROG\r
112           HRLZI TAC,IOUSE\r
113           IORM TAC,@DAT\r
114           ADDI DAT,2\r
115           SETZM @DAT;           JBFCTR:=0\r
116 UCLS3:    PUSHJ PDP,WAIT1\r
117           POP PDP,DAT\r
118           TDZ IOS,[XWD IOEND,IODEND]\r
119           TLO IOS,IOBEG\r
120           MOVEM IOS,DEVIOS(DEVDAT);     IODISC:=0\r
121           JRST UXIT;            EXIT THIS UUO\r
122 \f\r
123 \r
124 ,DEC 06 00 EX UUO L PT PRE 02 INBUF,OUTBUF\r
125 ,H. R. MORSE        64-12-26\r
126 ,CALLING SEQUENCE\r
127 ,         INBUF D,N\r
128 ,         EXIT                RETURNS HERE IF MEMORY NOT EXCEEDED\r
129 ,CALLING SEQUENCE\r
130 ,         OUTBUF D,N\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
139 ,MONITOR INTERFACE\r
140 ,         STORAGE:13\r
141 ,         ROUTINES CALLED: BUFCLC,  UXIT\r
142 ,         SYMBOLS SET/USED:\r
143 ,             ACCUMULATORS:   BUFPNT  S/U               PROG U\r
144 ,                             DEVDAT  U                 TAC  S/U\r
145 ,                             PDP     U                 TAC1 S/U\r
146 ,             DEVICE DATA BLOCK:        DEVBUF  U\r
147 ,                             DEVIAD  S\r
148 ,                             DEVOAD  S\r
149 ,             JOB BUFFER AREA:          JBFADR  S\r
150 \f\r
151 \r
152         INTERN UINBF, UOUTBF\r
153 \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
158 ,                                       IN RING\r
159 UOBF1:    HRLI TAC,PROG;        RELOCATE BUFFER AREA HEADER ADDRESS\r
160           MOVEM BUFPNT,@TAC;    JBFADR:=IOUSE,ADDRESS OF FIRST BUFFER\r
161 ,                                       IN RING\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
167 ,                                       IN RING\r
168           HRR TAC,DEVBUF(DEVDAT); TAC:=INPUT BUFFER AREA HEADER ADDRE\r
169           JRST UOBF1\r
170 \f\r
171 \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
174 ,CALLING SEQUENCE\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
187 ,IOACT IS ZERO:\r
188 ,         IOBEG:=1\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
196 ,MONITOR INTERFACE\r
197 ,         STORAGE:  20\r
198 ,         ROUTINES CALLED:      UINTQ, ASSIGN(UASG1),USEL,UINITZ,UXIT\r
199 ,         SYMBOLS SET/USED:\r
200 ,             ACCUMULATORS:     DEVDAT U\r
201 ,                               PDP    U        TAC  U\r
202 ,                               PROG   U        TAC1 S/U\r
203 ,             DEVICE DATA BLOCK:         DEVBUF S\r
204 \f\r
205 \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
212           AOS (PDP)\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
216           LDB TAC,PUUOAC\r
217           HRRZM DEVDAT,USRJDA(TAC)      ;STORE DDB ADR IN DEVICE TABL\r
218           HRLZI TAC,IOBEG\r
219           MOVEM TAC,DEVIOS(DEVDAT)\r
220           PUSHJ PDP,SETIOS      ;SET DDB IOS STATUS WORD\r
221                                 ;FROM RT. HALF OF UUO\r
222           PUSHJ PDP,UINTQ\r
223           HRLI DEVDAT, INITB    ;SET INIT UUO BIT\r
224           TLNN TAC,-1   \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
238           JRST CUXIT2\r
239 \f\r
240 \r
241 ,DEC 06 00 EX COM L PT PRE 03 UINITZ\r
242 ,H. R. MORSE        64-12-26\r
243 ,CALLING SEQUENCE\r
244 ,         PUSHJ PDP,UINITZ\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
248 ,MONITOR INTERFACE\r
249 ,         STORAGE:15\r
250 ,         ROUTINES CALLED:      ADRCK, SETBYT\r
251 ,         SYMBOLS SET/USED:\r
252 ,             ACCUMULATORS:     PDP   U                 TAC    S/U\r
253 ,                       TAC1  S/U\r
254 ,            JOB BUFFER AREA:  JBFADR S\r
255 ,                                       JBFCTR S\r
256 ,                                       JBFPTR S\r
257           INTERN UINITZ\r
258 \r
259 UINITZ:   TRNN TAC1,-1;         IS BUFFER SPECIFIED?\r
260           POPJ PDP,;RETURN\r
261           HRLI TAC1,PROG\r
262           PUSHJ PDP,ADRCK       ;CHECK 3 WORD BUFFER HEADER\r
263           HRRZI TAC,2(TAC1)\r
264           SETZM @TAC1;          JBFADR:=0\r
265           AOS TAC1\r
266           PUSH PDP,TAC\r
267           PUSH PDP,TAC1\r
268           AOS TAC1\r
269           SETZM @TAC1;          JBFCTR:=0\r
270           PUSHJ PDP,SETBYT;     JBFPTR 6-11:=BYTE SIZE\r
271           TLZ TAC,770077\r
272           POP PDP,TAC1\r
273           HLLM TAC,@TAC1\r
274           POP PDP,TAC\r
275           POPJ PDP,;            RETURN\r
276 \f\r
277 \r
278 INTERNAL IN\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
286           JRST INDMP            ;YES\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
304           JRST INPT0B           ;NO.\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
310           SKIPL @TAC\r
311           PUSHJ PDP,CALIN\r
312 INPT0C:   HRR TAC1,@TAC1\r
313 INPT0A:   SKIPGE @TAC1\r
314           JRST INPUT2\r
315 INPUT1:   PUSHJ PDP,WSYNC\r
316           SKIPGE @TAC1\r
317           JRST INPUT2\r
318           TDNE IOS,[XWD IOEND,IODERR]\r
319           JRST INEOF\r
320           MOVE IOS,DEVIOS(DEVDAT)\r
321           JRST INPUT1\r
322 \r
323 INPUT2:   ADDI TAC1,1\r
324           HRRZ ITEM,@TAC1\r
325           SUBI TAC1,1\r
326           PUSH PDP,ITEM         ;SAVE WORD COUNT AS STORED BY IO SERVIC\r
327           PUSHJ PDP,IOSETC\r
328           POP PDP,ITEM\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
332           JRST UXIT\r
333 \f\r
334 \r
335 INEOF:    HRRZI IOS,IODEND\r
336           IORM IOS,DEVIOS(DEVDAT)\r
337           JRST UXIT\r
338 \r
339 INPUTA:   HRR TAC1,UUO\r
340           ANDCAM TAC,@TAC1\r
341           JRST INPUT0\r
342 \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
351                                         ;FILLING BUFFER\r
352           JRST INPT0A\r
353 INPUT3:   HRRI UUO,2            ;BUFFERS NOT SETUP YET.\r
354                                         ;SET UP 2\r
355           PUSHJ PDP, UINBF\r
356           HLLZS UUO             ;CLEAR RIGHT HALF\r
357           JRST IN1\r
358 \r
359 INDMP:    PUSHJ PDP,WSYNC\r
360           MOVE TAC,DEVSER(DEVDAT)\r
361           PUSHJ PDP,DDI(TAC)\r
362           PUSHJ PDP,WAIT1\r
363           JRST UXIT\r
364 \f\r
365 \r
366 \r
367 \r
368 CALIN:    TLNE IOS,IOEND\r
369           POPJ PDP,\r
370           PUSHJ PDP,WSYNC\r
371           PUSH PDP,TAC1\r
372           MOVE TAC,DEVSER(DEVDAT)\r
373           PUSHJ PDP,DIN(TAC)\r
374           POP PDP,TAC1\r
375           POPJ PDP,\r
376 \r
377 \r
378 \f\r
379 \r
380 ,DEC 06 00 EX COM  L PT PRE 03 OUTPUT\r
381 ,H.R. MORSE    2/21/65\r
382 ,CALLING SEQUENCE\r
383 ,       OUTPUT D,\r
384 ,       EXIT\r
385 ,OR\r
386 ,       OUTPUT D, ADR\r
387 ,       EXIT\r
388 \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
401 ,   2) DIRECTLY.\r
402 \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
406 ,      THE GO TO 8\r
407 ,\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
413 \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
416 \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
425 \f\r
426 \r
427 ,MONITOR INTERFACE\r
428 ,     STORAGE:  54\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
433 ,                       IOS U           TAC S/U\r
434 ,                       ITEM S/U        TAC1 S/U\r
435 ,                       JBUF S/U        UUO S\r
436 ,                       PDP U\r
437 ,       DEVICE DATA BLOCK: DEVBUF U     DEVOAD S\r
438 ,       IO STATUS WORD: IOACT U\r
439 ,                       IOWC U\r
440 ,       JOB BUFFER AREA:        JBADR S/U\r
441 ,                        JBFCTR S\r
442 ,                        JBPPTR S/U\r
443 ,                        BUFFER SIZE U\r
444 ,                        IOUSE S/U\r
445 ,                        WORD COUNT S\r
446 \f\r
447 \r
448 \r
449           INTERN OUT\r
450 \r
451 OUT:      TLNN IOS,IO   ;IS THIS DEVICE ALREADY DOING INPUT?\r
452           PUSHJ PDP,WAIT1       ;YES, WAIT TILL IT BECOMES INACTIVE\r
453           LDB TAC,PUUOAC\r
454           TLO DEVDAT,OUTPB\r
455           HLLM DEVDAT,USRJDA(TAC)\r
456           LDB TAC,PIOMOD\r
457           CAIL TAC,DR\r
458           JRST OUTDMP\r
459           PUSHJ PDP,OUTA\r
460 OUT1:     HLR JBUF,DEVBUF(DEVDAT)\r
461           PUSHJ PDP,ADRCK       ;CHECK END OF 3 WORD HEADER\r
462           HRRZI TAC,2(JBUF)\r
463           HRLI JBUF,PROG\r
464           HRLZI TAC, IOUSE\r
465           SKIPG TAC1, @JBUF             ;HAS THIS BUFFER EVER BEEN\r
466                                         ;;REFERENCED?(JBFADR0=0?)\r
467           JRST OUTF\r
468           AOS JBUF\r
469           HRRZ TAC, @JBUF\r
470           ADDI TAC1, 1\r
471           SUB TAC, TAC1\r
472           HRLI TAC1,PROG\r
473           TRNE IOS, IOWC                ;COMPUTE WORD COUNT?(IOWC=0?)\r
474           JRST OUT2\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
478                                         ;            -C(JBFPTR18-35)-\r
479 OUT2:     SUBI JBUF,1\r
480           SUBI TAC1,1\r
481           HRLZI TAC, IOUSE\r
482           IORB TAC, @TAC1               ;IOUSE:=1\r
483           ADRCHK TAC1\r
484           HRRM TAC,@JBUF                ;ADVANCE CURRENT BUFFER ADDRE\r
485           MOVE IOS,DEVIOS (DEVDAT)\r
486           TRNN IOS,IOACT\r
487           PUSHJ PDP, CALOUT             ;START OUTPUT\r
488           HLR JBUF,DEVBUF(DEVDAT)\r
489           HRLI JBUF,PROG\r
490           MOVE TAC1,@JBUF\r
491           HRLI TAC1,PROG\r
492           SKIPG @TAC1                   ;IOUSE=1?\r
493           PUSHJ PDP, WSYNC              ;WAIT FOR DEVICE TO BECOME IN\r
494           JRST OUTS\r
495 \f\r
496 \r
497 OUTF:     SKIPE TAC1,@JBUF\r
498           JRST OUTF1\r
499           HRRI UUO,2\r
500           PUSHJ PDP,UOUTBF\r
501           HLR JBUF,DEVBUF(DEVDAT)\r
502           HRLI JBUF,PROG\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
507           PUSHJ PDP,BUFCLR\r
508           HRR TAC1,@JBUF\r
509           HRLI TAC1,PROG\r
510           LDB ITEM,[POINT 17,@TAC1,17]\r
511           SUBI ITEM,1\r
512           PUSHJ PDP,IOSETC      ;JBFPTR18-35:=CURRENT BUFFER\r
513                                 ;ADDRESS+1\r
514                                 ;JBFCTR:=(BUFFER SIZE-1)*[36/BYTE\r
515                                 ;SIZE]\r
516           JRST UXIT             ;RETURN TO USERS PROGRAM\r
517 \r
518 OUTDMP:   PUSHJ PDP,WSYNC\r
519           MOVE TAC,DEVSER(DEVDAT)\r
520           PUSHJ PDP,DDO(TAC)\r
521           PUSHJ PDP,WAIT1\r
522           JRST UXIT\r
523 \f\r
524 \r
525 \r
526 ,DEC 06 00 EX COM L PT PRE 01 OUTA\r
527 ,H.R. MORSE     64-12-26\r
528 \r
529 ,CALLING SEQUENCE:\r
530 ,         PUSHJ PDP,OUTA\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
535 \r
536 ,MONITOR INTERFACE\r
537 ,         STORAGE:13\r
538 ,         ROUTINES CALLED:      WSYNC\r
539 ,         SYMBOLS SET/USED:\r
540 ,             ACCUMULATORS:     DEVDAT U\r
541 ,                               IOS U           PROG U\r
542 ,                               JBUF S/U        TAC S/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
546 ,                               JBFADR S\r
547 \r
548           INTERN OUTA\r
549 OUTA:     TRNN UUO, 777777      ;IS BUFFER ADDRESS SPECIFIED?\r
550           POPJ PDP,             ;NO\r
551           PUSHJ PDP,WAIT1\r
552           HLR JBUF,DEVBUF(DEVDAT)\r
553           HLRI JBUF,PROG\r
554           HRRM UUO,@JBUF\r
555           HRRM UUO,DEVOAD(DEVDAT)\r
556           HRLZI TAC,IOUSE\r
557           ANDCAM TAC,@JBUF\r
558           POPJ PDP,             ;RETURN\r
559 \f\r
560 \r
561 \r
562 ,DEC 06 00 EX COM L PT PRE 03 CALOUT\r
563 ,H.R. MORSE      2/21/65\r
564 \r
565 ,CALLING SEQUENCE\r
566 ,         PUSHJ PDP,CALOUT\r
567 ,         EXIT\r
568 \r
569 ,DISPATCH TO DEVICE SERVICE ROUTINE DOU TO INITIATE OUTPUT.\r
570 \r
571 ,MONITOR INTERFACE\r
572 ,         STORAGE:2\r
573 ,         SYMBOLS SET/USED:\r
574 ,             ACCUMULATORS:     DEVDAT U\r
575 ,                               TAC U\r
576 ,         DEVICE DATA BLOCK:    DEVSER U\r
577 \r
578           INTERN CALOUT\r
579 CALOUT:   TRNN IOS,IOACT\r
580           JRST CALOU1\r
581           TRNN IOS,IOCON\r
582           POPJ PDP,\r
583           PUSHJ PDP,WSYNC\r
584 CALOU1:   MOVE TAC,DEVSER(DEVDAT)\r
585           JRST DOU(TAC)\r
586 \f\r
587 \r
588 \r
589 ,RELEASE A DEVICE\r
590 \r
591 INTERNAL RELEA1,RELEA2,RELEA3,RELEA5\r
592 \r
593 RELEA0:   MOVE IOS,DEVIOS(DEVDAT)       ;CALLED FROM INIT\r
594 RELEA2:RELEA3:\r
595 RELEA1:   TRZ UUO,-1            ;CLOSE BOTH INPUT AND OUTPUT\r
596           PUSHJ PDP,CLOSE1\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
600           LDB TAC,PUUOAC\r
601           SETZM USRJDA(TAC)\r
602           MOVEI TAC,17          ;IS THE DEVICE ON AONTHER USER CHANNEL?\r
603 RELEA4:   HRRZ TAC1,USRJDA(TAC)\r
604           CAIE TAC1,(DEVDAT)\r
605           SOJGE TAC,RELEA4\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
611           JRST UXIT\r
612 \r
613 \f\r
614 \r
615 \r
616 ,DEC 06 00 EX UUO L PT PRE 01 STATO\r
617 ,H.R. MORSE     64-12-26\r
618 \r
619 ,CALLING SEQUENCE\r
620 ,         STATO D,MASK\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
625 \r
626 ,MONITOR INTERFACE:\r
627 ,         STORAGE:              3\r
628 ,         ROUTINES CALLED:      UXIT\r
629 ,         SYMBOLS SET/USED:\r
630 ,             ACCUMULATORS:     IOS U\r
631 ,                               PDP U\r
632 ,                               UUO U\r
633 \r
634           INTERN USTATO\r
635 \r
636 USTATO:   TRNE IOS,(UUO)        ;SKIP IF ANY INDICATED BITS ARE ONE\r
637           AOS (PDP)\r
638           JRST UXIT\r
639 \f\r
640 \r
641 ,DEC 06 00 EX UUO L PT PRE 01 STATUS\r
642 ,H.R. MORSE   64-12-26\r
643 \r
644 ,CALLING SEQUENCE\r
645 ,         STATUS D,ADR\r
646 ,         EXIT                  ALWAYS RETURNS HERE\r
647 ,STORES I/O STATUS WORD OF DEVICE ON CHANNEL D IN LOCATION ADR.\r
648 \r
649 ,MONITOR INTERFACE\r
650 ,         STORAGE:              3\r
651 ,         ROUTINES CALLED:      UXIT\r
652 ,         SYMBOLS SET/USED:     \r
653 ,             ACCUMULATORS:     IOS U\r
654 ,                               PROG U\r
655 ,                               UUO U\r
656 \r
657 INTERN USTATS\r
658 EXTERNAL ADRERR,USRREL\r
659 \r
660 USTATS:   MOVE TAC,USRREL               ;CHECK TO SEE IF IN BOUNDS\r
661           CAIG TAC,(UUO)\r
662           PUSHJ PDP,ADRERR\r
663           HRLI UUO,PROG         ;LOAD STATUS INTO INDICATED ADDRESS.\r
664           HRRZM IOS,@UUO\r
665           JRST UXIT\r
666 \f\r
667 \r
668 ,CALLING SEQUENCE\r
669 ,         SETSTS D,BITS\r
670 ,         EXIT                  ALWAYS RETURN HERE\r
671 \r
672 INTERNAL USETST\r
673 EXTERNAL WAIT1,SETIOS\r
674 \r
675 USETST:   PUSHJ PDP,WAIT1       ;WAIT TILL DEVICE INACTIVE\r
676           MOVSI IOS, IOBEG\r
677           IORM IOS,DEVIOS(DEVDAT)\r
678           HRRM UUO,DEVIOS(DEVDAT)\r
679           JRST UXIT\r
680 \r
681 ,DEC 06 00 EX UUO L PT PRE 01 STATZ\r
682 ,H.R. MORSE     64-12-26\r
683 \r
684 ,CALLING SEQUENCE\r
685 ,         STATZ D,MASK\r
686 ,         EXIT1                 SOME SELECTED BITS ARE 1\r
687 ,         EXIT2                 ALL SELECTED BITS ARE 0\r
688 \r
689 ,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USERS\r
690 ,CHANNEL D WHICH ARE SELECTED BY MASK,\r
691 \r
692 ,MONITOR INTERFACE\r
693 ,         STORAGE:              3\r
694 ,         ROUTINES CALLED:      UXIT\r
695 ,         SYMBOLS SET/USED:\r
696 ,             ACCUMULATORS:     IOS U\r
697 ,                               PDP U\r
698 ,                               UUO U\r
699 \r
700           INTERN USTATZ\r
701 \r
702 USTATZ:   TRNN IOS,(UUO)        ;SKIP IF ALL INDICATED BITS ARE ZERO\r
703           AOS (PDP)\r
704           JRST UXIT\r
705 \r
706           END,\r