1 TITLE IOCSS - IO COMMON SYSTEM SUBROUTINES
\r
3 EXTERNAL CLOSE1,DEVLST,ERROR,JBTADR
\r
4 EXTERNAL JOB,JOBFF,RELEA1,USRJDA,WAIT1,CLDS,CLEN
\r
5 EXTERNAL PJOBN,CPOPJ1,PIOMOD,CPOPJ,CPOPJ2
\r
6 EXTERNAL SCNOFF,SCNON
\r
9 ,DEC 06 00 EX COM L PT PRE 01 ADVBFE
\r
10 ,H.R. MORSE 64-12-26
\r
13 , EXIT1 RETURN IF NEXT BUFFER IS EMPTY
\r
14 , EXIT2 RETURN IF NEXT BUFFER IS FULL
\r
15 ,CLEARS THE USE BIT (IOUSE:=0) OF THE BUFFER POINTED TO BY THE
\r
16 ,OUTPUT BUFFER ADDRESS (DEVOAD) OF THE CURRENT DEVICE DATA BLOCK
\r
17 ,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING
\r
18 ,UPON RETURN, SKIPS IF THE NEXT BUFFER IS FULL.
\r
22 , ACCUMULATORS: DEVDAT U
\r
25 , DEVICE DATA BLOCK: DEVOAD S/U
\r
26 , JOB BUFFER HEADER: IOUSE S/U
\r
28 ADVBFE: ADRCHK DEVOAD(DEVDAT)
\r
29 HRLZI TAC,IOUSE; IOUSE:=0
\r
30 ANDCAB TAC,@DEVOAD(DEVDAT)
\r
31 HRRM TAC,DEVOAD(DEVDAT); DEVOAD 18-35:=NEXT BUFFER ADDRESS
\r
32 SKIPGE @DEVOAD(DEVDAT); IS IOUSE=0?
\r
33 AOS (PDP); EXIT2. BUFFER IS FULL
\r
34 POPJ PDP,; EXIT1. BUFFER IS EMPTY
\r
37 ,DEC 06 00 EX COM L PT PRE 01 ADVBFF
\r
38 ,H.R. MORSE 64-12-26
\r
41 , EXIT1 RETURN IF NEXT BUFFER IS FULL
\r
42 , EXIT2 RETURN IF NEXT BUFFER IS EMPTY
\r
43 ,SETS THE USE BIT (IOUSE:=1) OF THE BUFFER POINTED TO BY THE
\r
44 ,INPUT BUFFER ADDRESS (DEVIAD) OF THE CURRENT DEVICE DATA BLOCK
\r
45 ,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.
\r
46 ,UPON RETURN. SKIPS IF THE NEXT BUFFER IS EMPTY,
\r
50 , ACCUMULATORS: DEVDAT U
\r
53 , DEVICE DATA BLOCK: DEVIAD S/U
\r
54 , JOB BUFFER HEADER: IOUSE S/U
\r
56 ADVBFF: ADRCHK DEVIAD(DEVDAT)
\r
57 HRLZI TAC,IOUSE; IOUSE:=1
\r
58 IORB TAC,@DEVIAD(DEVDAT)
\r
59 HRRM TAC,DEVIAD(DEVDAT); DEVIAD:=NEXT BUFFER ADDRESS
\r
60 SKIPL @DEVIAD(DEVDAT); IOUSE=1?
\r
61 AOS (PDP); EXIT2. NEXT BUFFER IS EMPTY
\r
62 POPJ PDP,; EXIT1. NEXT BUFFER IS FULL
\r
66 ,DEC 06 00 EX COM L PT PRE 01 ASCIA
\r
67 ,C. FRAZIER AND W. SEGAL 64-12-26
\r
70 , EXIT ALWAYS RETURNS HERE
\r
71 ,ADDS THE ASCII INCREMENT (RIGHT JUSTIFIED) IN AC TAC1 TO THE FIVE
\r
72 ,DIGIT ASCII NUMBER (LEFT JUSTIFIED) IN AC TAC AND LEAVES THE
\r
73 ,RESULT (LEFT JUSTIFIED) IN AC TAC. TAC1 IS RESTORED.
\r
77 , ACCUMULATORS: PDP U
\r
83 ;ASCIA: PUSH PDP,TAC1; SAVE TAC1 = ASCII INCREMENT (RIGHT JUST
\r
84 ; AND TAC1,K2; CLEAR MOST SIGNIFICANT 3 BITS OF
\r
86 ; LSH TAC,-1; TAC=FIVE DIGIT ASCII NO.(RIGHT JUST.)
\r
87 ; IOR TAC,K4; SET SECOND AND THIRD MOST SIGNIFICANT
\r
88 ;, BITS OF EACH CHARACTER TO ONES.
\r
100 ; POP PDP,TAC1; RESTORE TAC1
\r
101 ; POPJ PDP,; RETURN
\r
102 ;K1: OCT 215064321506; CHARACTER MASK: 1000110
\r
103 ;K2: OCT 036170743617; CHARACTER MASK: 0001111
\r
104 ;K3: OCT 176773757677; CHARACTER MASK: 0111111
\r
105 ;K4: OCT 140603014060; CHARACTER MASK: 0110000
\r
108 INTERNAL ASSIN,ASSASG
\r
110 ASSIN: PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE
\r
111 POPJ PDP, ;DEVICE NOT FOUND
\r
112 MOVEI TAC1, ASSPRG ;DEVICE FOUND, FLAG AS ASSIGNED BY PROG
\r
114 ;ASSIGN DEVICE IF UNASSIGNED
\r
115 ;CALL: MOVE ITEM, JOB NUMBER
\r
116 ; MOVE DEVDAT, ADDR. OF DDB
\r
117 ; MOVEI TAC1, EITHER ASSPRG OR ASSCON
\r
118 ; PUSHJ PDP, ASSASG
\r
119 ; CANT ASSIGN RETURN
\r
122 ASSASG: CONO APR,CLDS ;DISABLE CLOCK
\r
123 LDB TAC,PJOBN ;GET JOB NUMBER IN DEV DATA BLOCK
\r
124 CAMN TAC,ITEM ;IS IT ALREADY ASSIGNED TO THIS JOB
\r
126 MOVEI TAC, ASSPRG+ASSCON ;NO, IS IT ASSIGNED TO ANOTHE
\r
127 CONO PI, SCNOFF ;TURN SCANNER OFF
\r
128 TDNE TAC, DEVMOD(DEVDAT) ;ARE EITHER ASSIGNED BITS SET
\r
130 IORM TAC1, DEVMOD(DEVDAT) ;NO, SET ONE OF THEM
\r
131 DPB ITEM,PJOBN ;AND STORE JOB NUMBER
\r
133 ASSAS2: CONO PI, SCNON ;TURN SCANNER BACK ON
\r
134 CONO APR,CLEN ;RENABLE CLOCK
\r
138 ;ROUTINE TO SEARCH FOR A DEVICE
\r
139 ;CALL: HRR ITEM,JOB NUMBER
\r
140 ; MOVE TAC,[SIXBIT .DEVICE NAME.]
\r
141 ; PUSHJ PDP, DEVSRC
\r
145 INTERNAL DEVLG,DEVSRC,DEVPHY
\r
146 EXTERNAL SYSTAP,DEVOPR
\r
148 DEVSRC: PUSHJ PDP, DEVLG ;SEARCH LOGICAL NAMES FIRST
\r
149 JRST DEVPHY ;NOT FOUND, SEARCH PHYSICAL NAMES
\r
152 ;SEARCH LOGICAL NAMES
\r
154 DEVLG: HLRZ DEVDAT,DEVLST ;BEGINNING OF DDB CHAIN
\r
155 JUMPE TAC,CPOPJ ;0 CANNOT BE A LOGICAL NAME
\r
156 DEVLP0: CAME TAC,DEVLOG(DEVDAT) ;COMPARE WITH LOGICAL NAME
\r
157 JRST DEV0 ;NO MATCH
\r
158 LDB TAC1,PJOBN ;DOES THE LOGICAL NAME BELONG TO THIS J
\r
161 DEV0: HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, KEEP LOOKING
\r
162 JUMPN DEVDAT,DEVLP0
\r
163 POPJ PDP, ;FINISH AND NOT FOUND
\r
165 ;SEARCH PHYSICAL NAMES
\r
167 DEVPHY: JUMPE TAC,CPOPJ ;ZERO CANNOT BE A LOGICAL NAME
\r
168 CAMN TAC,[SIXBIT /OPR/] ;IS IT "OPR"?
\r
169 MOVE TAC,DEVOPR ;YES, CHANGE TO OPERATORS TTY
\r
170 CAMN TAC,[SIXBIT /SYS/] ;IS IT "SYS"?
\r
171 MOVE TAC,SYSTAP ;YES, CHANGE TO SYSTEM TAPE NAME
\r
172 HLRZ DEVDAT,DEVLST ;SEARCH DEVICE DATA BLOCKS
\r
173 DEVLP1: CAMN TAC,DEVNAM(DEVDAT)
\r
175 HLRZ DEVDAT,DEVSER(DEVDAT)
\r
176 JUMPN DEVDAT,DEVLP1
\r
177 POPJ PDP, ;NOT FOUND
\r
180 ,DEC 06 00 EX COM L PT PRE 01 BUFCLC
\r
181 ,H. R. MORSE 64-12-26
\r
184 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED
\r
185 , SETS UP AN N BUFFER RING FOLLOWING THE USERS PROGRAM, WHERE N
\r
186 , IS IN THE ADDRESS FIELD OF AC UUO.
\r
187 , THE BUFFER RING FORMAT IS AS FOLLOWS:
\r
188 , LOCATION LH CONTENTS RH
\r
189 , C(JOBFF) + 1 BUFFER C(JOBFF) +1
\r
190 , + 0(BUFFER SIZE+2) SIZE + 1(BUFFER SIZ+2)
\r
191 , C(JOBFF) +1 BUFFER C(JOBFF) +1
\r
192 , +1(BUFFER SIZE+2) SIZE + 2(BUFFER SIZE+2)
\r
196 , C(JOBFF) + 1 BUFFER C(JOBFF) + 1
\r
197 , + (N-2)(BUFFER SIZE+2) SIZE +(N-1)(BUFFER SIZE+2)
\r
198 , C(JOBFF) + 1 BUFFER C(JOBFF) + 1
\r
199 , + (N-1)(BUFFER SIZE+2) SIZE
\r
200 ,THEN SET BUFPNT:=IOUS,C(JOBFF) + 1
\r
201 , AND JOBFF:=C(JOBFF) + 1 + N(BUFFER SIZE + 2)
\r
202 , BUFWRD IS RESTORED.
\r
205 , ROUTINES CALLED: ADRCK
\r
206 , SYMBOLS SET/USED:
\r
207 , ACCUMULATORS: BUFPNT S/U PROG U
\r
208 , BUFWRD S/U TAC S/U
\r
209 , DEVDAT U TAC1 S/U
\r
211 , DEVICE DATA BLOCK: DEVCHR U
\r
212 , JOB AREA: JOBFF S/U
\r
213 , JOB BUFFER HEADER: IOUSE U
\r
217 BUFCLC: PUSH PDP,BUFWRD; SAVE BUFWRD ON STACK
\r
218 LDB TAC,[POINT 12,DEVCHR(DEVDAT),35];TAC:=BUFFER SIZE
\r
219 HRRZ BUFPNT,JOBFF(PROG);BUFPNT:=FIRST FREE LOCATION + 1
\r
223 HRL BUFWRD,TAC; BUFWRD:=BUFFER SIZE,FIRST FREE LOC + 1
\r
224 ADDI TAC,2; TAC:=BUFFER SIZE + 2
\r
225 HRRZ TAC1,UUO; TAC1:=N=ADDRESS FIELD OF AC UUO
\r
226 BUFC1: ADD BUFWRD,TAC; BUFWRD:=C(BUFWRD) + C(TAC)
\r
227 ADRCHK BUFPNT; CHECK BUFFER FOR MEMORY BOUND
\r
228 MOVEM BUFWRD,@BUFPNT; BUFFER HEADER+1:=C(BUFWRD)
\r
229 HRR BUFPNT,BUFWRD; BUFPNT 18-35:=C(BUFWRD 18-35)
\r
230 SOJG TAC1,BUFC1; N:=N-1. IS N>0?
\r
231 HRR BUFWRD,JOBFF(PROG)
\r
233 PUSHJ PDP,ADRCK ;CHECK LAST ADR. OF HEADER
\r
234 HRRZI TAC,-2(BUFPNT)
\r
236 MOVEM BUFWRD,@BUFPNT;LINK LAST BUFFER TO FIRST BUFFER
\r
238 HRRM BUFPNT,JOBFF(PROG);JOBFF:=C(JOBFF)+1+N(BUFFER SIZE+2)
\r
239 HRR BUFPNT,BUFWRD; BUFPNT:=IOUSE,ADDRESS OF FIRST BUFFER
\r
242 POP PDP,BUFWRD; RESTORE BUFWRD FROM STACK.
\r
246 ,DEC 06 00 EX COM L PT PRE 01 BUFCLR
\r
247 ,H. R. MORSE 64-12-26
\r
250 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED
\r
251 , CLEAR THE WORD COUNT AND DATA AREA OF THE BUFFER WHOSE ADDRESS
\r
253 ,MONITOR INTERFACE:
\r
255 , ROUTINE CALLED: ADRCK
\r
256 , SYMBOLS SET/USED:
\r
257 , ACCUMULATORS: PDP U TAC S/U
\r
260 BUFCLR: HRLI TAC,PROG
\r
261 ADRCHK TAC; PROCEED IF CURRENT BUFFER ADDRESS
\r
262 , < PROTECTION ADDRESS.
\r
263 HLRZ TAC1,@TAC; TAC1 18-35=SIZE
\r
265 ADD TAC1,TAC; TAC1:=CURRENT BUFFER ADDRESS + SIZE
\r
266 ADRCHK TAC1; PROCEED IF CURRENT BUFFER ADDRESS
\r
267 , + SIZE < PROTECTION ADDRESS.
\r
268 MOVEI TAC,@TAC; TAC:=CURRENT BUFFER ADDRESS+1,
\r
269 , CURRENT BUFFER ADDRESS+1
\r
272 CLEARM 0(TAC); WORD COUNT:=0
\r
273 AOS TAC; TAC:=CURRENT BUFFER ADDRESS+1,
\r
274 , CURRENT BUFFER ADDRESS+2
\r
275 BLT TAC,@TAC1; CLEAR BUFFER
\r
278 SUBTTL 5-17-65 PART 2
\r
283 , EXIT ALWAYS RETURNS HERE
\r
284 ,CALCULATES FOLDED 12 BIT CHECKSUMS OF THE DATA WORDS IN THE
\r
285 ,BUFFER WHOSE ADDRESS IS IN AC TAC1. TWO ALGORITHMS ARE USED.
\r
286 ,ON RETURN, THE LEFT HALF OF AC TAC CONTAINS A CHECKSUM OBTAINED
\r
287 ,BY ACCUMULATING, IN ONES COMPLEMENT, THE DATA WORDS AND FOLDING IT.
\r
288 ,THE LEFT HALF OF AC DAT CONTAINS A CHECKSUM OBTAINED BY ACCUMULATING
\r
289 ,IN TWOS COMPLEMENT, THE DATA WORDS AND FOLDING IT. AC TAC1
\r
293 , ROUTINES CALLED: FOLD
\r
294 , SYMBOLS SET/USED:
\r
295 , ACCUMULATORS: DAT S/U SUB S
\r
301 CKS12: ADD TAC1,PROG; TAC1:=-WORD COUNTER,ADDRESS OF FIRST DATA
\r
307 CLEARM TAC; INITIALIZE TWOS COMPLEMENT SUM
\r
308 CKS12A: ADD TAC,0(TAC1); TWOS COMPLEMENT ADD
\r
309 AOBJN TAC1,CKS12A; DONE?
\r
319 MOVEI TAC1,1 ;TAC1:=1
\r
323 ,DEC 06 00 EX COM L PT PRE 01 CLRBYT
\r
324 ,H. R. MORSE 64-12-26
\r
327 , EXIT ALWAYS RETURN HERE
\r
328 ,CALLED WITH A BYTE POINTER IN AC TAC, IT CLEARS THE REST OF THE
\r
329 ,WORD POINTED TO BY THE BYTE POINTER.
\r
332 , SYMBOLS SET/USED:
\r
333 , ACCUMULATORS: PDP U
\r
337 CLRBYT: LDB TAC1,[POINT 6,TAC,5]; TAC1:=P
\r
338 DPB TAC1,[POINT 12,TAC,11]; TAC 0-5:=0, TAC 6-12:=P
\r
340 DPB TAC1,TAC; CLEAR BITS 36-P THROUGH 35
\r
344 ;ROUTINE TO RELEASE ALL DEVICES ASSIGNED TO JOB
\r
347 EXTERNAL PUUOAC,RELEA3
\r
350 IORELS: MOVEI TAC,RELEA3 ;RELEASE ALL IO DEVICES(DONT CLOSE)
\r
352 ;ROUTINE TO DO IO FOR ALL DEVICES ASSIGNED TOI JOB
\r
353 ;CALL MOVEI TAC,ADR. OR IO SUB.
\r
358 IOALL: PUSH PDP,TAC ;SAVE ADR. FO SUB.
\r
360 IOALL1: MOVE DEVDAT, USRJDA(DAT)
\r
361 MOVE IOS,DEVIOS(DEVDAT)
\r
365 PUSHJ PDP,@(PDP) ;CALL THE SUB.
\r
370 ;KILL ALL DEVICES(RELEASE WITHOUT WAITING FOR DEVICE INACTIVE)
\r
375 IOKILL: MOVEI TAC,RELEA5
\r
379 ,DEC 06 00 EX COM L PT PRE 01 IOSET
\r
380 ,H. R. MORSE 64-12-26
\r
383 , EXIT ALWAYS RETURNS HERE
\r
384 ,THIS PROGRAM IS CALLED FROM AN INTERRUPT SERVICE ROUTINE.
\r
385 ,IT PUTS THE ADDRESS OF THE DATA AREA OF THE JOB (C(JBTADR18-35))
\r
386 ,CONNECTED TO THE DEVICE SPECIFIED BY AC DEVDAT IN AC PROG AND
\r
387 ,PUTS THE ITEM POINTER (C(DEVCTR)) IN AC ITEM.
\r
390 , SYMBOLS SET/USED:
\r
391 , ACCUMULATORS: DEVDAT U PDP U
\r
393 , DEVICE DATA BLOCK: DEVCHR U
\r
395 , SYSTEM ADDRESSES: JBTADR U
\r
398 IOSET: LDB PROG,PJOBN
\r
399 MOVE ITEM,DEVCTR(DEVDAT); ITEM:=ITEM POINTER=C(DEVCTR)
\r
400 HRRZ PROG,JBTADR(PROG); PROG:=C(JBTADR 18-35)
\r
404 ,6-CSS-DEC-IOSETC-PL-PRE1
\r
405 ,H.R. MORSE 17-11-64
\r
409 , EXIT ALWAYS RETURN HERE
\r
411 ,SETS JBFPTR18-35:=C(TAC1 18-35)
\r
412 , JBFCTR:=C(ITEM)*[WORD LENGTH/BYTE SIZE]
\r
413 ,WHERE WORD LENGTH:=36 DECIMAL
\r
414 , BYTE SIZE:=C(JBFPTR6-11)
\r
415 , [X]:= INTEGER PART OF X
\r
419 , ROUTINES CALLED: ITMCT1
\r
420 , SYMBOLS SET/USED:
\r
421 , ACCUMULATORS: JBUF S/U TAC S/U
\r
422 , ITEM S/U TAC1 S/U
\r
427 IOSETC: ADDI JBUF,1 ;JBFPTR12-18:=0
\r
428 HRLZI TAC,7777 ;JBFPTR18-35:=C(TAC1 18-35)+1
\r
432 LDB TAC1,[POINT 6,@JBUF,11] ;TAC1:=BYTE SIZE
\r
433 PUSHJ PDP,ITMCT1 ;JBFCTR:=C(ITEM)*[36/BYTE SIZE]
\r
439 ,DEC 06 00 EX COM L PT PRE 01 ITMSET, ITMCNT, ITMCT1
\r
440 ,H.R. MORSE 64-12-26
\r
444 , EXIT ALWAYS RETURNS HERE
\r
445 ,SETS AC ITEM:=(BUFFER SIZE-1)*[WORD LENGTH/BYTE SIZE]
\r
446 ,WHERE BUFFER SIZE:=BITS 1-17 OF THE BUFFER HEADER WORD POINTED TO
\r
448 , WORD LENGTH:=36 DECIMAL
\r
449 , BYTE SIZE:=INTEGER PART OF X.
\r
453 , EXIT ALWAYS RETURNS HERE
\r
454 ,SETS AC ITEM=C(ITEM)*[WORD LENGTH/BYTE SIZE]
\r
458 , EXIT ALWAYS RETURNS HERE
\r
459 ,SETS AC ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)]
\r
463 , SYMBOLS SET/USED:
\r
464 , ACCUMULATORS: DEVDAT U TAC S/U
\r
465 , ITEM S/U TAC1 S/U
\r
467 , DEVICE DATA BLOCK: DEVADR U
\r
471 INTERN ITMSET,ITMCNT,ITMCT1
\r
472 ITMSET: LDB ITEM,[POINT 17,@DEVADR(DEVDAT),17];ITEM:=BUFFER SIZE-1
\r
474 ITMCNT: LDB TAC1,[POINT 6,DEVPTR(DEVDAT),11];TAC1:=BYTE SIZE
\r
475 ITMCT1: MOVEI TAC,44 ;ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)]
\r
481 ;ROUTINE TO SET DEVICE STATUS WORD FROM UUO
\r
486 SETIOS: LDB TAC,[POINT 4,UUO,35] ;GET DEVICE DATA MODE
\r
487 MOVEI TAC,1 ;AND CHECK FOR LEGALITY
\r
489 TDNN TAC,DEVMOD(DEVDAT)
\r
490 JRST ILLMOD ;ILLEGAL MODE
\r
491 TRZ UUO,IOACT ;LET USER SET ALL BITS EXCEPT IOACT
\r
492 HRRM UUO,DEVIOS(DEVDAT)
\r
496 ,DEC 06 00 EX COM L PT PRE 01 NEWBUF, BPNSET
\r
497 ,H. R. MORSE 64-12-26
\r
500 , EXIT ALWAYS RETURNS HERE
\r
501 ,CLEARS THE BUFFERE CURRENTLY POINTED TO BY THE INPUT BUFFER
\r
502 ,ADDRESS (DEVDR) OF THE CURRENT DEVICE. SETS UP THE BYTE
\r
503 ,POINTER (DEVPTR), AND THE ITEM COUNT (DEVCTR) AND RETURNS.
\r
506 , EXIT ALWAYS RETURNS HERE
\r
507 ,SETS UP THE BYTE POINTER (DEVPTR) AND THE ITEM COUNT (DEVCTR)
\r
508 ,OF THE CURRENT DEVICE AND RETURNS.
\r
511 , ROUTINES CALLED: BUFCLR, ITMSET
\r
512 , SYMBOLS SET/USED:
\r
513 , ACCUMULATORS: DEVDAT U PDP U
\r
515 , DEVICE DATA BLOCKS: DEVADR U
\r
519 INTERN BPNSET,NEWBUF
\r
521 NEWBUF: HRRZ TAC,DEVADR(DEVDAT); TAC:=INPUT BUFFER HEADER ADDRESS
\r
522 PUSHJ PDP,BUFCLR; CLEAR INPUT BUFFER.
\r
523 BPNSET: HRR TAC,DEVADR(DEVDAT)
\r
525 AND TAC,DEVPTR(DEVDAT); DEVPTR 0-5:=0, DEVPTR 12:=0
\r
526 HRR TAC,DEVADR(DEVDAT); DEVPTR 10-35:=C(DEVADR 18-35) + 1
\r
528 MOVEM TAC,DEVPTR(DEVDAT)
\r
529 PUSHJ PDP,ITMSET; ITEM:=(BUFFER SIZE-1)[36/BYTE SIZE]
\r
530 MOVEM ITEM,DEVCTR(DEVDAT); DEVCTR:=ITEM COUNT
\r
534 ,DEC 06 00 EX COM L PT PRE 02 SETBYT
\r
535 ,H. R. MORSE 64-12-26
\r
538 , EXIT ALWAYS RETURN HERE
\r
543 ,WHERE S=35 IF DATA MODE (IOS 32-25) IS BINARY (B)
\r
544 , S=8 IF DATA MODE IS IMAGE (I)
\r
545 , S=7 IF DATA MODE IS ASCII PACKED (A)
\r
547 , ASCII SEQUENCED (AS)
\r
548 , ASCII SEQUENCED (ASL)
\r
549 , OR ALTERNATE MODE BREAK (AM)
\r
552 , SYMBOLS SET/USED:
\r
553 , ACCUMULATORS: PROG U TAC S
\r
555 , DEVICE DATA BLOCK: DEVIOS U
\r
557 SETBYT: MOVE TAC1,DEVIOS(DEVDAT); FETCH DATA MODE, BITS 32-35 0
\r
559 CAIE TAC1,IB ;DATA MODE IMAGE BINARY?
\r
560 CAIN TAC1,B; IS DATA MODE=BINARY?
\r
561 HRLI TAC,4400+PROG; SET BYTE SIZE TO 36.
\r
562 CAIN TAC1,I; IS DATA MODE=IMAGE?
\r
564 TRNE TAC1,14; IS DATA MODE=ASCII PACKED,ASCII LINE,
\r
565 JRST .+2; ASCII SEQUENCED,OR ASCII SEQUENCED LINE
\r
566 HRLI TAC,700+PROG; SET BYTE SIZE TO 7.
\r
569 SETBY1: HLLZ TAC,DEVMOD(DEVDAT)
\r
575 ,DEC 06 00 EX COM L PT PRE 01 STORE ITEM
\r
576 ,H.R. MORSE 64-12-26
\r
579 , EXIT1 CHECKSUM ERROR
\r
580 , EXIT2 BLOCK FULL OR BLOCK COMPLETE
\r
581 , EXIT3 DATA STORED CORRECTLY
\r
582 ,CALLED FROM AN INPUT SERVICE ROUTINE WITH A DATA ITEM IN AC DAT.
\r
583 ,STORES THE DATA ITEM IN THE BUFFER, CHECKING TO SEE IF IT WERE
\r
584 ,THE FIRST ITEM ON THE BUFFER AND SETTING UP THE POINTER AND
\r
585 ,WORD COUNT APPROPRIATELY CHECKING THE MODE TO SEE IF ANY SPECIAL
\r
586 ,PROCESSING NEED BE DONE. FOR EXAMPLE, GENERATION OF SEQUENCE
\r
587 ,NUMBERS PRECEDING EACH LINE IN SEQUENCE MODE, OR THE TERMINATION
\r
588 ,OF A BUFFER ON CERTAIN CHARACTERS IN OTHER MODES, OR IF THE BUFFER
\r
589 ,RETURN OCCURS ON AN ERROR CONDITION. THE SECOND RETURN OCCURS
\r
590 ,ON A BLOCK FULL CONDITION OR BLOCK COMPLETE CONDITION, THE THIRD
\r
591 ,RETURN OCCURS ON THE DATA STORED CORRECTLY CONDITION. THIS
\r
592 ,ROUTINE ALSO DOES SOME CHECKING ON INPUT OF BINARY RECORD,
\r
593 ,PAPER TAPE OR CARDS.
\r
596 , XXXX ALWAYS SKIPS
\r
597 , EXIT ALWAYS RETURNS HERE
\r
598 ,STORES THE WORD COUNT:=C(DEVPTR 18-35) -C(DEVIAD 18-35) - 1
\r
602 , ROUTINES CALLED: ASCIA, CKS12, ITMSET, NEWBUF
\r
603 , SYMBOLS SET/USED:
\r
604 , ACCUMULATORS: DAT U PDP U
\r
608 , DEVICE DATA BLOCK: DEVCTR U DEVPTR S/
\r
609 , DEVIAD U DEVSEQ S/
\r
610 , IO STATUS WORD: A U I U
\r
614 , JOB BUFFER AREA: WORD COUNT S
\r
616 INTERN STODAT, STOSQD
\r
618 STODAT: TLNE IOS,IOFST; WILL THE NEXT ITEM BE THE FIRST ITEM
\r
620 PUSHJ PDP,NEWBUF; SET UP A NEW BUFFER. ITEM:=(BUFFER
\r
621 , SIZE - 1)*[36/BYTE SIZE]
\r
622 LDB TAC1,PIOMOD; TAC1:=DATA MODE
\r
623 CAIN TAC1,B; MODE=BINARY?
\r
626 STO1: DPBI DAT,DEVPTR(DEVDAT); STORE DATA IN BUFFER.
\r
627 CAIE TAC1,A; MODE=ASCII, IMAGE, OR BINARY?
\r
632 CAIG DAT,214 ;LINE FEED,FORM FEED, OR VERTICAL TAB?
\r
636 SOJGE ITEM,CPOPJ2; ITEM:=C(ITEM)-1. IS C(ITEM)>OR=0?
\r
637 STOE1: TRO IOS,IOBKTL ;IOBKTL:=1
\r
639 STOAIB: SOJG ITEM,CPOPJ2; ITEM:=C(ITEM)-1. IS C(ITEM)>0?
\r
640 CAIN TAC1,A; MODE=ASCII?
\r
642 CAIN TAC1,B; MODE=BINARY?
\r
644 STOI: PUSHJ PDP,ITMSET; ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]
\r
646 SUB ITEM,DEVCTR(DEVDAT)
\r
647 HRRZ TAC1,DEVIAD(DEVDAT) ;STORE ITEM COUNT INSTEAD OF
\r
648 ADDI ITEM,1 ;IN FIRST WORD OF BUFFER
\r
651 STOSQD: MOVE TAC1,DEVIAD(DEVDAT); TAC1:=ADDRESS OF WORD COUNT
\r
653 HRRZ ITEM,DEVPTR(DEVDAT); ITEM:=C(DEVPTR 18-25) -
\r
654 , C(DEVIAD 18-35) -1
\r
656 STOSQE: HRRM ITEM,@TAC1 ;WORD COUNT TO FIRST WORD IN BUFFER
\r
657 JRST CPOPJ1; EXIT2. BLOCK COMPLETE
\r
658 STOBIN: TLZN IOS,IOFST; WILL THE NEXT ITEM BE THE FIRST ITEM
\r
659 JRST STO1; OF A BUFFER? IOSFST:=0
\r
661 CAMLE TAC,ITEM; IS WORD COUNT <OR= (BUFFER SIZE-1)*
\r
662 JRST STOE1; [36/BYTE SIZE]?
\r
663 MOVE ITEM,TAC; ITEM:=WORD COUNT
\r
664 MOVEM DAT,@DEVPTR(DEVDAT); STORE WORD COUNT IN BUFFER
\r
665 JRST CPOPJ2; EXIT3. DATA STORED CORRECTLY.
\r
666 STOBND: HRRZ TAC1,DEVIAD(DEVDAT)
\r
667 PUSHJ PDP,CKS12; COMPUTE CHECKSUM
\r
668 ADD TAC1, DEVIAD(DEVDAT)
\r
669 HLLZ TAC1,@TAC1; DATA CHECKSUM=COMPUTED CHECKSUM?
\r
671 JRST CPOPJ1; EXIT2. BLOCK COMPLETE
\r
672 TRO IOS,IODTER; IODTER:=1
\r
673 JRST CPOPJ; EXIT1. CHECKSUM ERROR
\r
676 ,DEC 06 00 EX COM L PT PRE 01 UINTQ
\r
677 ,H.R. MORSE 64-12-26
\r
680 , EXIT ALWAYS RETURNS HERE
\r
681 ,TAC:=CONTENTYS OF WORD FOLLOWING UUO CALL
\r
685 , SYMBOLS SET/USED:
\r
686 , ACCUMULATORS: PDP U TAC S/U
\r
689 UINTQ: MOVE TAC, -1(PDP) ;TAC:=ADDRESS FOLLOWING UUO C
\r
690 HRLI TAC, PROG ;RELOCATE ADDRESS
\r
691 MOVE TAC, @TAC ;TAC:=CONTENTS OF WORD FOLLOW
\r
692 ;UUO CALL FROM USERS AREA
\r