1 TITLE UUOCON - UUO HANDLER AND UUO+IO ROUTINES - V434
\r
2 SUBTTL /RCC TS 03 JUN 69
\r
3 XP VUUOCN,434 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB
\r
5 ENTRY UUOCON ;ALWAYS LOAD UUOCON(IF LIB SEARCH)
\r
8 ;THIS ROUTINE COMBINES THE OLD SYSCON,SYSCSS, AND IOCONT ROUTINES
\r
9 ;IT CONSISTS OF THE UUO TRAP HANDLER
\r
10 ;THE CALL UUO ROUTINES AND THE IO UUO ROUTINES
\r
11 ;SOME UUO DO DISPATCH TO OTHER ROUTINES OUTSIDE OF UUOCON
\r
12 , ALL UUOS DROP THEMSELVES IN REAL LOCATION 40, AND TRAP
\r
13 , TO 41. THE UUO HANDLER SHUFFLES THE UUO OFF TO THE USER'S
\r
14 , 40,41, IF IT IS NOT A SYSTEM UUO.
\r
15 ;SYSTEM UUOS(40-77) FIRST SAVE THE USERS ACS IN RELATIVE LOC 0-17
\r
16 ;THEN THE FOLLOWING ACS ARE LOADED UP BEFORE DISPATCHING:
\r
17 ; PDP ;PUSHDOWN LIST IN CURRENT JOB DATA AREA
\r
18 ; PROG ;CURRENT JOB RELOCATION IN RH,PROTECTION IN LH
\r
19 ; JDAT ;ADDRESS OF CURRENT JOB DATA AREA
\r
20 ; UUO ;THE CONTENTS OF LOC 40 WITH PROG IN INDEX FIELD
\r
21 ; ;SO THAT RELOCATION CAN BE DONE FOR PICKING UP ARGUMENTS
\r
22 ; EXCEPT THAT ON A CALL OR CALLI UUO, THE ADDRESS IS
\r
23 ; MODIFIED TO BE THE AC OF THE UUO,FOR
\r
24 ; PICKING UP ARGUMENTS.
\r
25 ; DEVDAT ;ADR. OF DEVICE DATA BLOCK
\r
26 ; IOS ;DEVICE IO STATUS WORD
\r
27 ; DSER ;ADR. OF DEVICE SERVICE ROUT. DISPATCH TABLE
\r
28 ; UCHN ;THE USER IO CHANNEL(AC FIELD) OF UUO
\r
30 ;RETURN IS PUSHED ON END OF PD LIST
\r
31 ;THEN IF CALL WAS FROM USER MODE, THE UUO ROUTINE IS CALLED
\r
32 ;WITH A PUSHJ, SO THAT ALL UUO ROUTINE RETURN WITH A POPJ PDP,
\r
33 ;WHICH WILL RETURN CONTROL TO UUOCON WHICH WILL RESTORE USERS
\r
34 ;ACS AND RETURN TO HIM
\r
35 ;IF THE CALL IS FROM EXEC MODE, THE UUO ROUTINE IS CALLED
\r
36 ;BY DOING JUST A JRST, WHEN THE UUO ROUTINE RETURNS WITH
\r
37 ;A POPJ, IT WILL RETURN TO THE EXEC WITHOUT RESTORING
\r
39 , CONTROL MAY ALWAYS BE RETURNED BY EXECUTING A
\r
41 , WHICH WILL RESTORE THE ACS, APR BITS, AND RETURN.
\r
42 , THE UUO HANDLER IS PURE IF THE FOLLOWING RESTRICTIONS ARE OBSERVED.
\r
43 , RESTRICTIONS: UUOS CANNOT BE CALLED BY INTERRUPT SERVICE ROUTINES.
\r
44 \f;HERE ON UUO FROM USER
\r
45 ;USER AC 17 ALREADY SAVED IN LOC USRSAV(SEE COMMON)
\r
46 ;AC 17 CONTAINS ADR OF JOB(JOBADR)
\r
47 ;SAVE HIS ACS ON REL. LOC 0-17
\r
49 ;TO UUOSY1 IF UUO FROM EXEC MODE (AC 17 GUARRANTEED NOT TO BE EQUAL TO AC PROG)
\r
51 INTERNAL UUOUSR,UUOSY1,USRXIT
\r
53 EXTERN ADRERR,CORUUO,DEVHNG,GETWRD,HOLD,ILLINS
\r
54 EXTERN ILLMOD,IOIERR,JOBKL,JOBSAV,PHOLD,REASSI,SETAPR
\r
55 EXTERN STWAIT,UGTSEG,URUN,USCHED,UUOERR
\r
57 EXTERNAL USRSAV,JOBPDL,MJOBPD,PUUOAC,USRJDA
\r
58 EXTERNAL USRHCU,JOB,JBTSTS,TIMEF
\r
59 EXTERNAL JOBDAT,JOBAC,UUO0,FORTY
\r
61 UUOUSR: MOVEM 16,16(17) ;STORE AC16 IN USER 16
\r
62 MOVEI 16,(17) ;SET UP BLT POINTER
\r
63 BLT 16,15(17) ;MOVE REAL AC'S TO USER AREA
\r
64 MOVE TAC,USRSAV ;MOVE USER 17 TO USER'S AREA
\r
66 MOVE PROG,17 ;LOAD UP POINTER TO USER PROGRAM AREA
\r
68 MOVE JDAT,JOBDAT ;ADDRESS OF JOB DATA AREA
\r
70 MOVSI PDP,MJOBPD ;LOAD UP PUSH DOWN AC AND
\r
71 HRRI PDP,JOBPDL(JDAT) ;MAKE ABSOLUTE RATHER THAN RELATIVE
\r
72 UUOSY1: PUSH PDP,UUO0 ;SAVE RETURN ON PUSH DOWN LIST
\r
73 MOVE UUO,FORTY ;GET THE UUO INTO AC(UUO)
\r
74 TLNN UUO,740000 ;SYSTEM UUO?
\r
75 ILEGAL: JRST UUOERR ;NO, 0-37 ARE ILLEGAL,PRINT ERROR
\r
76 TLO UUO,PROG ;SET FOR RELOCATION
\r
77 LDB TAC1,[POINT 9,UUO,8];PICK UP UUO OP CODE
\r
78 CAIL TAC1,100 ;ILLEGAL INSTRUCTION?
\r
79 JRST ILLINS ;YES, STOP JOB AND PRINT ERROR
\r
80 LDB UCHN,PUUOAC ;SETUP USER DEVICE CHANNEL NUMBER
\r
81 SKIPE DEVDAT,USRJDA(UCHN) ;GET ADRESS OF DEVICE DATA BLOCK
\r
82 CAMLE UCHN,USRHCU ;IS IT LESS THAN OR EQUAL TO HIGHEST
\r
83 ; USER IO CHANNEL IN USE FOR CURRENT JOB?
\r
84 JRST NOCHAN ;CHANNEL NOT ASSIGNED
\r
85 MOVE IOS,DEVIOS(DEVDAT) ;GET DATA BLOCK STATUS WORD
\r
86 MOVE DSER,DEVSER(DEVDAT);SETUP IO SERVICE DISPATCH
\r
88 CAIL TAC1,LNGUUO ;LONG DISPATCH TABLE UUO?
\r
90 DISP0: ROT TAC1,-1 ;DIVIDE UUO OPCODE BY 2, SAVE REMAINDER
\r
91 MOVE DAT,UUOTAB-20(TAC1);GET DISPATCH TABLE ENTRY
\r
92 DISP2: TLNN TAC1,400000 ;WAS UUO ODD?
\r
93 MOVS DAT,DAT ;NO, USE LH OF DISPATCH ENTRY
\r
94 CAME PROG,17 ;UUO FROM SYSTEM?
\r
95 JRST (DAT) ;YES, RETURN ADDRESS ALREADY ON PD
\r
96 ; LIST. AVOID RESTORING USER
\r
97 ; ACS ON RETURN TO SYSTEM.
\r
98 \f;DISPATCH TO UUO ROUTINE
\r
99 ;THE FOLLOWING CODE IS EXECUTED ON ALL RETURN TO USER PROGRAMS
\r
100 ;BUT IS NEVER EXECUTED ON RETURNS FROM EXEC UUOS(SAVGET)
\r
102 PUSHJ PDP,(DAT) ;NO, FROM USER. ALL
\r
103 ; UUO ROUTINES RETURN WITH POPJ
\r
104 JRST USRXIT ;NO SKIP RETURN TO USER
\r
105 USRXT1: AOS (PDP) ;SKIP RETURN TO USER
\r
106 USRXIT: MOVE ITEM,JOB ;CURRENT JOB NUMBER
\r
107 MOVE TAC,JBTSTS(ITEM)
\r
108 JUMPG TAC,USRXT2 ;HAS A CONTROL C BEEN EXECUTED?
\r
109 TLNN TAC,STOPIO ;TRYING TO STOP IO?
\r
110 SKIPE TIMEF ;NO. HAS CLOCK TICKED WHILE IN MONITOR?
\r
111 USRXT2: PUSHJ PDP,USCHED ;YES, GO CALL SCHEDULER
\r
112 POP PDP,UUO0 ;USER RETURN ADDRESS
\r
113 MOVSI 17,JOBAC(PROG) ;RESTORE ALL USER ACS
\r
115 JEN @UUO0 ;RESTORE FLAGS AND RETURN TO USER
\r
116 ; DISMISS INTERRUPT ONLY ON TRPJEN UUO
\r
117 ; IN ALL OTHER CASES NO INTERRUPTS
\r
120 NOCHAN:NOCHAN: CAMN PROG,17 ;UUO FROM USER?
\r
121 ;IF FROM EXEC, PROBABLY SAVEGET WHICH SETS USRCHN NEG. IN LH
\r
122 CAIGE TAC1,IOUUO ;YES, IS THIS AN IO UUO?
\r
123 JRST DISP0 ;NO, GO DISPATCH
\r
124 CAIE TAC1,70 ;YES,IS IT CLOSE OR RELEASE?
\r
125 CAIN TAC1,71 ;CLOSE AND RELEASE ALWAYS LEGAL EVEN THOUGH NO DEVICE ASSIGNED
\r
127 JRST IOIERR ;NO, PRINT IO TO UNASSIGNED CHANNEL
\r
130 DISP1: MOVE TAC,DEVMOD(DEVDAT) ;LONG DISPATCH TABLE UUO
\r
131 TLNE TAC,DVLNG ;DOES THIS DEVICE HAVE A LONG
\r
133 JRST DISP0 ;YES, DISPATCH
\r
134 CAIGE TAC1,76 ;NO, IS UUO LOOKUP OR ENTER?
\r
135 JRST USRXIT ;NO, RETURN TO USER
\r
136 JRST USRXT1 ;YES, SKIP RETURN TO USER
\r
138 ;TABLE OF UUO DISPATCH ADDRESSES
\r
147 UUOTAB: XWD UCALL,UINIT ;(40,41)CALL,INIT
\r
148 XWD UUOERR,UUOERR ;(42,43)FIVE UUOS FOR EACH INSTALLATION
\r
149 XWD UUOERR,UUOERR ;(44,45)TO DEFINE AS THEY SEE FIT
\r
150 XWD UUOERR,UCALLI ;(46,47),CALLI
\r
153 XWD UOPEN,TTYUUO ;(50,51)OPEN, TTCALL
\r
156 XWD UOPEN,CPOPJ ;(50,51)OPEN, NO-OP FOR TTCALL
\r
158 XWD ILEGAL,ILEGAL ;(52,53)
\r
159 XWD ILEGAL,URENAM ;(54,55),RENAME
\r
160 XP IOUUO,55 ;LOWEST IO UUO(RENAME)
\r
161 XWD TIN,TOUT ;(56,57)IN,OUT
\r
162 XWD SETIOS,USTATO ;(60,61)SETSTS,STATO
\r
163 XWD USTATS,USTATZ ;(62,63)GETSTS,STATZ
\r
164 XWD UINBF,UOUTBF ;(64,65)INBUF,OUTBUF
\r
165 XWD IN,UOUT ;(66,67)INPUT,OUTPUT
\r
166 XWD CLOSE1,RELEA1 ;(70,71)CLOSE,RELEASE
\r
167 XP LNGUUO,72 ;LOWEST LING DISPATCH TABLE UUO
\r
168 XWD UMTAPE,UDGF ;(72,73)MTAPE,GETF
\r
169 XWD UDSI,UDSO ;(74,75)SETI,SETO
\r
170 XWD UDLK,UDEN ;(76,77)LOOKUP,ENTER
\r
172 ;UUOS 42, 43, 44, 45, AND 46 ARE FOR CUSTOMERS TO DEFINE AS THEY PLEASE
\r
173 ;UUOS 40, 41 AND 47 THROUGH 77 ARE DEFINED BY DIGITAL
\r
174 ;UUOS 51,52,53 AND 54 ARE RESERVED FOR EXPANSION BY DIGITAL
\r
175 \f, CALLING SEQUENCE
\r
176 , CALL D,[SIXBIT/NAME/]
\r
177 , WHERE NAME IS THE NAME OF A SYSTEM ROUTINE.
\r
178 , IF NO SYSTEM ROUTINE WITH THE SPECIFIED NAME IF FOUND, THIS ROUTINE
\r
180 ;CONTENTS OF USER AC PLACED IN AC TAC,UUO SET TO POINT
\r
181 ;TO USER AC, PROG IN LH.
\r
182 ;ITEM SET TO JOB NUMBER
\r
186 UCALL: PUSHJ PDP,GETWDU ;SET TAC FROM CONTENTS OF EFFECTIVE ADDRESS OF
\r
187 ; UUO FROM EITHER HIGH OR LOW SEG
\r
188 ; DO NOT RETURN IF ERROR
\r
189 ; SET ITEM TO CURRENT JOB NO.
\r
190 MOVSI TAC1,-UCLLEN-CCLLEN-1 ;-SUM OF LENGTHS OF SIXBIT TABLES,
\r
191 ; -1 FOR THE CARRY TO LH IN AOBJN
\r
192 HRRI TAC1,-CCLLEN ;- LENGTH OF CUSTOMER TABLE
\r
193 CAME TAC,UCLTAB(TAC1) ;SEARCH SYSTEM ROUTINE NAME TABLE
\r
195 HRRM TAC1,UUO ;STORE INDEX IN UUO, JUST AS IF USER HAD DONE CALLI UUO
\r
198 ;CALLI UUO - CALL IMMEDIATE
\r
200 ;WHERE E IS RELATIVE INDEX IN CALL TABLE
\r
204 UCALLI: HRRE TAC1,UUO ;GET CALLI NUMBER (POS. = DIGITAL, NEG. = CUSTOMER DEFINED)
\r
205 CAML TAC1,[-CCLLEN] ;MORE NEGATIVE THAN MOST NEGATIVE CUSTOMER DEFINED UUO?
\r
206 CAIL TAC1,UCLLEN ;MORE POSITIVE THAT DIGITAL DEFINED UUO?
\r
207 POPJ PDP, ;YES, RETURN TO USER TREAT AS NO-OP SO
\r
208 ; PROGRAMS AHEAD OF MONITOR WILL STILL
\r
209 ; RUN WITHOUT ERROR MESSAGE
\r
210 CAMN PROG,17 ;NO, WAS UUO FROM MONITOR?
\r
211 POP PDP,TAC ;REMOVE RETURN
\r
212 HRR UUO,UCHN ;UUO AC FIELD
\r
213 MOVE TAC,@UUO ;PICK UP CONTENTS OF USER AC
\r
214 ROT TAC1,-1 ;DEVIDE BY 2 AND SAVE REMAINDER
\r
215 MOVE DAT,UCLJMP(TAC1) ;GET DISPACTH TABLE ENTRY
\r
216 MOVE ITEM,JOB ;SETUP CURRENT JOB NUMBER(IN CASE THIS IS CALLI)
\r
217 JRST DISP2 ;AND GO DISPATCH
\r
219 ;CALL UUO DISPATCH TABLE
\r
220 ;NEW UUO'S MUST BE ADDED AT END SINCE CALLI DEPENDS ON
\r
221 ;POSITION IN TABLE, CUSTOMERS SHOULD ADD UUO'S IN CNAMES MACRO SO CALLI ADDRESS
\r
222 ;WILL BE NEGATIVE. IN THIS WAY BOTH DIGITAL AND ITS CUSTOMERS CAN ADD UUO'S
\r
223 ;WITHOUT CONFLICT, DIGITAL GOING POSITIVE, CUSTOMERS GOING NEGATIVE.
\r
224 ; (ALSO, TOWARD TOP OF PAGE)
\r
226 ;ALSO EXTERNALS MUST BE IN RH(IE ODD CALLI INDECIES)
\r
228 EXTERNAL DDTIN,DDTOUT,CPOPJ
\r
231 X CPOPJ,CPOPJ ;(-3) PLACE FOR CUSTOMERS TO PATCH UUOS
\r
232 X CPOPJ,CPOPJ ;(-2)
\r
233 X LIGHTS,LIGHTS ;(-1) SET LIGHTS (EXAMPLE OF CUSTOMER DEFINED UUO)
\r
237 X RESET,RESET ;(0)RESET IO
\r
238 X DDTIN,DDTIN ;(1)EXT-GET DDT CHAR.
\r
239 X SETDDT,SETDDT ;(2)SETDDT LOC IN PROTECTED JOB DATA
\r
240 X DDTOUT,DDTOUT ;(3)EXT:SEND DDT CHAR.
\r
241 X DEVCHR,DVCHR ;(4)DEVICE CHARACTISTICS
\r
242 X DDTGT,CPOPJ ;(5)GET DDT MODE
\r
243 X GETCHR,DVCHR ;(6)DEVICE CHAR.(DIFF. NAME)
\r
244 X DDTRL,CPOPJ ;(7)RELEASE DDT MODE
\r
245 X WAIT,WAIT ;(10)WAIT TILL DEVICE INACTIVE
\r
246 X CORE,CORUUO ;(11)CORE UUO
\r
247 X EXIT,EXIT ;(12)EXIT
\r
248 X UTPCLR,UTPCLR ;(13)CLEAR DEC TAPE DIRECTORY
\r
249 X DATE,DATE ;(14)GET DATE
\r
250 X LOGIN,LOGIN ;(15)LOGIN
\r
251 X APRENB,APRENB ;(16)ENABLE APR FOR TRAPPING
\r
252 X LOGOUT,LOGOUT ;(17)LOGOUT
\r
253 X SWITCH,SWITCH ;(20)RETURN DATA SWITCHES
\r
254 X REASSIGN,REASSIGN ;(21)REASSIGN DEVICE TO ANOTHER JOB
\r
255 X TIMER,TIMER ;(22)RETURN JIFFY CLOCK TIME
\r
256 X MSTIME,MSTIME ;(23)RETURN TIME OF DAY IN MS
\r
257 X GETPPN,GETPPN ;(24)RETURN PROJECT-PROGRAMMER NUMBER
\r
258 X TRPSET,TRPSET ;(25)SET PI TRAP LOC, AND USER IO
\r
259 X TRPJEN,UUOERR ;(26)DISMISS INTERRUPT TO EXEC MODE(SUPERCEDED BY UJEN)
\r
260 X RUNTIM,JOBTIM ;(27)RETURN TOTAL JOB RUNNING TIME
\r
261 X PJOB,JOBNO ;(30)RETURN JOB NUMBER
\r
262 X SLEEP,SLEEP ;(31)SLEEP FOR N SECONDS, THEN RETURN TO USER
\r
263 X SETPOV,SETPOV ;(32)SET PUSH DOWN OVERFLOW TRAP
\r
264 ; (FOR COMPATIBILITY ONLY)
\r
265 X PEEK,UPEEK ;(33)TO PEEK AT CERTAIN MONITOR PARAMETERS
\r
266 X GETLIN,GETLN ;(34) GET TTY UNE NUMBER
\r
267 X RUN,URUN ;(35) RUN DEV:FILE
\r
268 X SETUWP,SETUWP ;(36) SET OR CLEAR USER MODE WRITE PROTECT
\r
269 X REMAP, REMAP ;(37) REMAP TOP OF LOW SEGMENT INTO HIGH SEG
\r
270 X GETSEG,UGTSEG ;(40) GET SHARABLE HIGH SEG
\r
271 X GETTAB,GETTAB ;(41) GET EXEC ADDRESS OF A JOB TABLE
\r
272 X SPY,USPY ;(42) SET HIGH SEG TO BE PHYSICAL CORE
\r
273 X SETNAM,SETNAM ;(43) SETNAME OF THIS PROGRAM
\r
274 X CPOPJ,CPOPJ ;2 SPARE UUO'S FOR PATCHING - DIGITAL ONLY
\r
275 X CPOPJ,CPOPJ ;ALWAYS ADD NEW UUO'S ABOVE THESE
\r
276 ;CUSTOMERS SHOULD ADD UUO'S ABOVE
\r
277 ;IN CNAMES MACRO RATHER THAN NAMES MACRO
\r
278 ; SO THAT THEIR CALLI INDECES WILL
\r
281 \f;GENERATE SIXBIT TABLE OF UUO NAMES
\r
287 ;GENERATE CUSTOMER CALL/CALLI UUO'S
\r
290 CCLLEN=.-CCLTAB ;LENGTH OF CUSTOMER DEFINED CALL/CALLI UUO'S
\r
291 ;(MINIMUM CALLI NUMBER, TOO)
\r
293 ;GENERATE DIGITAL UUO'S
\r
296 UCLLEN=.-UCLTAB ;DEFINE LENGTH OF DIGITAL UUO TABLE(MAX. CALLI NO. TOO)
\r
299 DEFINE XX (C) ;DEFINE XX IN CASE JOB NUMBER OF CUSTOMER UUO'S
\r
303 ;COUNT NUMBER OF CUSTOMER DEFINED UUO'S
\r
306 ;GENERATE HALF WORD UUO DISPATCH TABLE
\r
321 ;GENERATE CUSTOMER TABLE
\r
328 ;GENERATE DIGITAL TABLE
\r
332 IFN ZZ&1,<XX 0> ;GEN. LAST WORD IF ODD NUMBER OF UUOS
\r
334 ;FIX UP SYMBOLS NOT IN UUOCON
\r
336 IFN FT2REL,<EXTERN USPY>
\r
337 IFE FT2REL,<USPY=LCPOPJ>
\r
338 \f;EXIT UUO ROUTINE
\r
339 ;CALL: CALL FIELD, [SIXBIT/EXIT/]
\r
340 ;IF FIELD - 0, PRINT EXIT ^C. CONT WILL NOT WORK
\r
341 ;IF FIELD NON-ZERO, JUST PRINT. DO NOT RELEASE DEVICES
\r
345 EXIT: JUMPN UCHN,MONRET ;AC FIELD NON-ZERO?
\r
346 PUSHJ PDP,IORELS ;NO, RELEASE ALL DEVICES
\r
347 PUSHJ PDP,TTYFUW ;FIND TTY FOR CURRENT JOB
\r
348 ; SET ITEM TO JOB NO.,DAT TO OUTPUT BYTE POINTER
\r
349 ; DEVDAT TO TTY DDB
\r
350 JSP TAC,PHOLD ;MOVE "EXIT" TO OUTPUT BUFFER
\r
351 ; AND STOP JOB, AND START TTY, CONT WILL NOT WORK
\r
355 ; CALL 1,[SIXBIT/EXIT/] - RETURN TTY TO MONITOR MODE,
\r
356 ; STOP JOB, BUT DO NOT RELEASE DEVICES
\r
357 ;TYPE . WITH NO CRLF, ALLOW CONT COMMAND TO RETURN AFTER UUO
\r
359 EXTERN PRPER,STOP1,CRLF,TTYSTC
\r
361 MONRET: PUSHJ PDP,TTYFUW ;FIND TTY FOR CURRENT JOB
\r
362 PUSHJ PDP,CRLF ;PRINT CR LF
\r
363 PUSHJ PDP,PRPER ;PRINT .
\r
364 PUSHJ PDP,TTYSTC ;PUT TTY INTO COMMAND MODE
\r
365 JRST STOP1 ;START TTY IN MONITOR MODE AND STOP JOB
\r
366 ;BUT ALLOW CONTINUE TO WORK (RETURN CONTROL AFTER EXIT UUO)
\r
368 ;SETPOV - SET PUSH DOWN OVERFLOW TRAP
\r
369 ;CALL MOVE AC,ADR. OF TRAP ON PD OVF
\r
370 ; CALL AC,[SIXBIT /SETPOV/]
\r
374 SETPOV: MOVEM TAC,JOBAPR(JDAT)
\r
376 JRST APRENB ;SET TRAP LOC.
\r
378 \f;RESET UUO ROUTINE
\r
380 INTERNAL RESET,FTTRPSET
\r
386 CAIN TAC,1 ;IS THIS JOB 1 DOING THE RESET?
\r
387 SETZM STOPTS ;YES. MAKE SURE SCHEDULING ALLOWED
\r
388 ; IN CASE THIS FOLLOWS A TRPSET UUO
\r
392 PUSHJ PDP,HRESET ;FLAG USER AS HAVING UWP ON FOR HIGH SEG
\r
393 ; AND DO DATAO TO SET UWP ON
\r
395 PUSHJ PDP,IOKILL ;RELEASE ALL DEVICES
\r
396 MOVSI TAC,777777-USRMOD ;CLEAR ALL UUO PC FLAGS IN LH, EXCEPT USER MODE
\r
397 ANDCAM TAC,JOBPD1(JDAT) ;LEAVE USER MODE OFF TOO, IF EXEC DOING CALL RESET
\r
398 ; FALL INTO APRENB WITH RH TAC=0
\r
399 ; SO THAT ALL APR INTERRUPTS WILL BE DISABLED
\r
400 \f;ROUTINE TO SET UP APR FOR USER TRAPPING
\r
401 ;CALL: CALL AC,[SIXBIT /APRENB/]
\r
402 ;WITH FOLLOWING APR CONSO FLAG BITS
\r
403 ;TO INDICATE WHICH APR CONDITIONS SHOULD
\r
404 ;TRAP TO USER WHEN TRAP OCCURS FROM USER MODE
\r
406 ;1B19 ;PUSHDOWN OVERFLOW
\r
407 ;1B22 ;ILLEGAL MEMORY
\r
408 ;1B23 ;NON-EXISTENT MEMORY
\r
410 ;1B29 ;FLOATING POINT OVERFLOW
\r
411 ;1B32 ;ARITH. OVERFLOW
\r
415 APRENB: HRRM TAC,JOBENB(JDAT) ;SET RH TO CONSO BITS IN JOB DATA AREA
\r
416 ; USED EVERY TIME IS STARTED UP
\r
418 JRST SETAPR ;GO ENABLE/DISABLE APR FOR FOV AND HR OV
\r
419 ; ALSO SET APR CONSO INSTR. FOR PROPER FLAGS
\r
420 ; AND RETURN TO USER
\r
421 \f;RETURN JOB NUMBER FOR THIS JOB
\r
423 JOBNO: SKIPA TAC,ITEM ;JOB NUMBER
\r
424 ; SKIP AND STORE TAC IS USER AC
\r
426 ;RETURN THE DATE TO THE USER
\r
430 DATE: MOVE TAC,THSDAT
\r
433 ;RETURN JOB RUNNING TIME IN MILLISECONDS
\r
438 IFN FTTIME,<EXTERNAL JOBN
\r
444 SKIPA TAC,TTIME(TAC) ;TOTAL JOB RUNNING TIME
\r
448 TDZA TAC,TAC ;RETURN ZERO IF NO TIMMING COM.
\r
451 ;RETURN TIME OF DAY IN MILLISECONDS
\r
453 EXTERNAL TIME,JIFSEC
\r
455 MSTIME: MOVE TAC,TIME ;TIME OF DAY IN JIFFIES
\r
457 IDIVI TAC,JIFSEC ;DIVIDE BY NO. OF JIFFIES PER SECOND
\r
460 ;PUT JOB TO SLEEP FOR NSECONDS
\r
461 ;CALL CALL AC,[SIXBIT /SLEEP/]
\r
463 INTERNAL FTSLEEP,SLEEP
\r
467 EXTERNAL JIFSEC,JBTSTS,PION,PIOFF,SETSLP,WAKE,CLOCK
\r
469 TDNE TAC1,JBTSTS(ITEM) ;DOES THIS JOB HAVE A CLOCK QUEUE
\r
470 ; REQUEST IN CLOCK QUEUE?
\r
471 JRST SLEEP1 ;YES, DO NOT PUT ANOTHER ONE IN
\r
472 IMULI TAC,JIFSEC ;MULTIPLY BY NO. OF JIFFIES PER SECOND
\r
473 TRNN TAC,7777 ;0 TIME?(CHECK ONLY 12 BITS)
\r
474 MOVEI TAC,1 ;YES. SLEEP 1 JIFFY
\r
475 DPB ITEM,[POINT 6,TAC,23]
\r
476 HRLI TAC,WAKE ;ADR. IN RUNCSS WHEN JOB WAKES UP
\r
480 SLEEP1: JRST SETSLP ;SET JOB STATUS WORD SO JOB WILL NOT RUN
\r
482 IFE FTSLEEP,< POPJ PDP, ;RETURN IMMEDIATELY IF NOT A FEATURE>
\r
484 ;PEEK INTO MONITOR UUO
\r
485 ;CALL MOVEI AC,<MONITOR ADDRESS>
\r
486 ; CALL AC,[SIXBIT .PEEK.]
\r
492 HLRZ TAC1,PRJPRG(ITEM) ;GET USER'S PROJECT NR
\r
493 CAIE TAC1,1 ;ADMIN NR?
\r
494 JFCL ;SHOULD BE PATCHED TO "JRST UUOERR" IF
\r
495 ; IF CUSTOMER WANTS PEEK UUO NOT ALLOWED FOR ALL USERS
\r
497 CAMLE TAC,SYSSIZ ;ONLY UP TO SIZE OF SYSTEM
\r
498 JRST RTZER ;RETURN 0 IF USER ASKING TOO BIG
\r
501 \f;SET OR CLEAR USER MODE WRITE PROTECT BIT IN HIGH SEG FOR THIS USER ONLY
\r
502 ;CALL: MOVEI AC,0 OR 1
\r
503 ; CALL AC,[SIXBIT /SETUWP/] OR CALLI AC,34
\r
504 ; ERROR - MACHINE OR MONITOR CANNOT HANDLE TWO REG, OR TRYING TO CLEAR
\r
505 ; ;UWP OF A SHARABLE SEG(AC=1 ON RETURN)
\r
506 ; OK RETURN - AC CONTAINS PREVIOUS SETTING( OR JOB HAS NO HIGH SEG)
\r
510 SETUWP: JRST USTUWP ;GO TO ROUTINE IN SEGCON
\r
511 ;IF FT2REL=0, SETUWP DOES RTZER
\r
515 ;UUO TO REMAP TOP PART OF LOW SEGMENT INTO HIGH SEGMENT
\r
516 ;PREVIOUS HIGH SEG(IF ANY) IS KILLED AND A NEW SEGMENT NUMBER IS ASSIGNED
\r
517 ;TO THIS JOB. REMAP IS USED BY LOADER AND GET
\r
518 ;CALL: MOVEI AC,NEW HIGHEST USER ADR IN LOW SEG(EXEC ORS IN 1777)
\r
519 ; CALL AC,[SIXBIT /REMAP/] OR CALLI AC,35
\r
520 ; ERROR RETURN, MACHINE OR EXEC CANNOT HANDLE 2 REG OR DESIRED ADR
\r
521 ; ;GREATER THAN OLD LOW SEG
\r
522 ; OK RETURN, LOW SEG ABOVE ARG NOW THE HIGH SEG
\r
526 REMAP: JRST UREMAP ;CORE1 MODULE IN SEGCON
\r
529 REMAP=CPOPJ ;ERROR RETURN TO USER(CPOPJ IS AN EXTERN)
\r
532 ;ROUTINE TO GET WORD FROM USER AREA AT UUO LEVEL - EITHER SEGMENT
\r
533 ;CALL: MOVE PROG,XWD PROTECTION,RELOCATION FOR LOW SEG
\r
534 ; HRR UUO,USER ADR.
\r
535 ; HRLI UUO,PROG ;FOR RELOCATION
\r
537 ; RETURN ONLY IF ADDRESS OK, WORD IN TAC, ABS. ADR IN TAC1
\r
539 ; IF OUT OF BOUNDS, PRINT ILL UUO AND STOP JOB
\r
541 INTERN GETWDU,GETWD1
\r
544 GETWD1: HRRI UUO,1(UUO) ;INCREMENT UUO BEFORE PICKING UP WORD
\r
545 GETWDU: MOVE ITEM,JOB ;SETUP CURRENT JOB NUMBER
\r
546 PUSHJ PDP,GETWRD ;GET THE WORD AND CHECK IF LEGAL
\r
547 JRST UUOERR ;ADR. NOT IN LOW OR HIGH SEG, PRINT ERROR
\r
549 RMPERR: POPJ PDP, ;OK RETURN, TAC=WORD, TAC1=ABS. ADR.
\r
550 \f;SET LIGHTS ON CONSOLE FROM USER PROGRAM
\r
552 ;CALL AC,[SIXBIT /DATAO/] OR CALLI AC,-1
\r
554 ;THIS IS AN EXAMPLE OF A USER DEFINED UUO WITH A NEGATIVE CALLI ARG.
\r
556 LIGHTS: DATAO PI,TAC ;SENT USER'S AC TO CONSOLE LIGHTS
\r
557 POPJ PDP, ;RETURN TO HIM
\r
559 ;RETURN TIME OF DAY IN JIFFIES (60THS,50THS OR MS)
\r
563 TIMER: SKIPA TAC,TIME ;FALL INTO STOTAC
\r
565 ;RETURN DATA SWITCHES
\r
570 ;ROUTINE TO STORE TAC IN USER AREA AS SPECIFIED BY UUO
\r
571 ;MUST BE CALLED FROM UUO LEVEL WITH PROG SETUP
\r
572 ;ALSO PROG IN INDEX FIELD OF UUO
\r
576 STOTAC: HRRZ AC1,UUO
\r
577 PUSHJ PDP,UADCK1 ;IS ADDRESS IN BOUNDS(OR IN ACS)?
\r
578 MOVEM TAC,@UUO ;YES, STORE
\r
581 ;RETURN DEVICE CHARACTERISTICS
\r
585 DVCHR: PUSHJ PDP,DEVSRC ;SERACH FOR DEVICE
\r
586 TDZA TAC,TAC ;NOT A DEVICE, RETURN ZERO
\r
587 SKIPA TAC,DEVMOD(DEVDAT);DEVICE FOUND,RETURN DEVMOD
\r
588 JRST STOTAC ;RETURN ZERO, DEVICE NOT FOUND
\r
589 LDB TAC1,PJOBN ;GET JOB NO. USING DEVICE
\r
590 CAME TAC1,JOB ;DOES CURRENT USER ALREADY HAVE IT?
\r
591 TRNN TAC,ASSCON+ASSPRG ;NO, IS IT ASSIGNED?
\r
592 TLO TAC,DVAVAL ;NO, BUT HE CAN GET IT.
\r
595 ;RETURN PROJECT-PROGRAMMER NUMBER IN AC
\r
602 TDNE TAC,JBTSTS(ITEM) ;LOGIN OR LOGOUT CUSP RUNNING ?
\r
603 JRST GETPPL ;YES, SPECIAL PROJ,PROG NUMBER CHANGE.
\r
604 SKIPA TAC,PRJPRG(ITEM) ;NO, RETURN PROJECT-PROGRAMMER NO. OF THIS JOB.
\r
610 SETUWP: ;SETUWP RETURNS 0
\r
613 RTZER: MOVEI TAC,0 ;RETURN 0. TO USER AC
\r
614 JRST STOTAC ;AS SPECIFIED IN AC FIELD OF HIS UUO
\r
617 SETDDT: MOVEM TAC,USRDDT
\r
618 POPJ PDP, ;RETURN TO USER
\r
620 ;WAIT FOR IO TO BECOME INACTIVE ON CHANNEL AC
\r
623 WAIT: JUMPE DEVDAT,CPOPJ ;CHANNEL ASSIGNED?
\r
624 JRST WAIT1 ;WAIT TILL INACTIVE BEFORE
\r
625 ; RETURNING TO USER.
\r
629 EXTERNAL DUMPPP,MJOBN
\r
630 GETPPL: MOVE TAC,DUMPPP ;CHANGE USER'S NUMBERS TO [1,2]
\r
631 EXCH TAC,PRJPRG(ITEM) ; AND GET OLD NUMBERS.
\r
632 MOVSI TAC1,MJOBN ;CHECK FOR OTHER USERS UNDER SAME PP NUMBER.
\r
633 CAMN TAC,PRJPRG(TAC1) ;ANOTHER USER UNDER SAME PROJ,PROG NUMBER ?
\r
634 AOSA (PDP) ;YES, SKIP RETURN TO USER (LOGIN OR LOGOUT)
\r
635 AOBJN TAC1,.-2 ;NO, KEEP LOOKING
\r
639 GETLN: PUSHJ PDP,TTYFND ;FIND USER'S TTY DATA BLOCK.
\r
640 MOVE TAC,DEVNAM(DEVDAT) ;GET DEVICE NAME IN SIXBIT
\r
641 JRST STOTAC ;RETURN IT TO USER.
\r
642 \f;LOGIN UUO USED ONLY BY LOGIN CUSP
\r
643 ;CALL: CALL AC,[SIXBIT /LOGIN/]
\r
644 ;WHERE AC CONTAINS XWD -NO. OF ENTRIES,LOCATION
\r
645 ;WHICH IS A LIST OF JOB STATISTICS TO BE STORED IN MONITOR
\r
650 EXTERNAL JOB,JBTSTS,TTYFUW
\r
652 LOGIN: MOVSI TAC1,JLOG ;IS USER ALREADY LOGGED IN?
\r
653 TDNE TAC1,JBTSTS(ITEM)
\r
654 JRST UUOERR ;YES, PRINT ILLEGAL UUO
\r
655 HLRE AC1,TAC ;NO, -NO. OF WORDS
\r
656 HRR UUO,TAC ;FIRST REL. LOC.
\r
657 MOVE AC2,[XWD -LOGTOP,LOGTAB] ;SET FOR LOOP
\r
658 LOGIN1: AOSG AC1 ;FINISHED HIS COUNT?
\r
659 SKIPA AC3,@UUO ;NO, GET NEXT WORD FROM USER AREA
\r
660 MOVEI AC3,0 ;YES, STORE 0
\r
661 MOVEM AC3,@(AC2) ;NO, STORE ITEM
\r
662 ADDI UUO,1 ;GET NEXT ITEM
\r
663 AOBJN AC2,LOGIN1 ;FINISHED NO. OF MONITOR TABLES?
\r
664 IORM TAC1,JBTSTS(ITEM) ;YES, FINALLY SET LOGIN BIT
\r
665 MOVSI TAC1,JACCT ;RESET THIS BIT TO INDICATE LOG-IN IS
\r
666 ANDCAM TAC1,JBTSTS(ITEM) ; NOW COMPLETE AND ^C IS AGAIN PERMITTED.
\r
667 LOGIN2: PUSHJ PDP,IORELS ;RELEASE ALL DEVICES
\r
668 PUSHJ PDP,TTYFUW ;FIND TTY AND PRINT ^C
\r
671 ;TABLE OF POINTERS TO TABLES(STORED WITH JOB NUMBER AS INDEX)
\r
672 ;TO MAKE LOGIN SET MORE TABLES IN MONITOR, JUST ADD TABLE NAMES AT END
\r
677 LOGTAB: XWD ITEM,PRJPRG ;PROJECT-PROGRAMMER NUMBER
\r
680 XWD ITEM,JBTPRV ;JOB PRIVILEGE BITS
\r
683 EXP IOS ;STORE IN AC IOS, SINCE PRIVILEGE TABLE DOES NOT EXIST
\r
686 LOGTOP=.-LOGTAB ;NO. OF TABLES TO BE SET
\r
695 LOGOUT: PUSHJ PDP,TTYFUW
\r
697 TDNN TAC,JBTSTS(ITEM) ;IS JOB ALREADY LOGGED OUT ?
\r
698 JRST JOBKL ;NO, GO COMPLETE WORK OF LOGOUT CUSP.
\r
699 JRST EXIT ;YES, TREAT AS "EXIT"
\r
704 LOGIN=UUOERR ;CANT DO A LOGIN UUO
\r
705 LOGOUT=EXIT ;TREAT A KJOB UUO AS AN EXIT IN 10/40
\r
708 ;UUO TO RETURN CONTENTS OF A MONITOR JOB TABLE ENTRY
\r
709 ;CALL: HRROI AC, MONITOR JOB TABLE NUMBER
\r
710 ; HRLI AC, JOB NUMBER (OPTIONAL) LH .LT. 0 MEANS CURRENT JOB
\r
711 ; CALL AC, [SIXBIT /GETTAB/] OR CALLI AC,41
\r
712 ; ERROR RETURN AC PRESERVED IF LH OR RH TOO BIG OR
\r
713 ; AC=-1 IF NOT PRIVILIGED TO GET INFO
\r
714 ; NORMAL RETURN - AC=0 IF TABLE IS UNDEFINED
\r
716 EXTERN JOB,JOBMAX,TTYTAB,TTPMXL,JOBMXL,JBTMXL
\r
718 GETTAB: HLRZ ITEM,TAC ;GET USER SUPPLIED JOB NUMBER
\r
719 SKIPGE TAC ;DID HE SUPPLY ONE?
\r
720 MOVE ITEM, JOB ;NO, USE CURRENT JOB NUMBER
\r
721 HRRZS TAC ;GET TABLE NUMBER IN TAC
\r
722 CAIL TAC,GTTBLN ;IS TABLE NUMBER LEGAL?
\r
723 POPJ PDP, ;YES. ERROR RETURN, AC UNCHANGED
\r
724 LDB TAC1,[POINT 9,NUMTAB(TAC),8] ;MAX LEGAL ARG.
\r
725 CAMLE ITEM,TAC1 ;DOES HIS ARG EXCEED LEGAL ONE?
\r
726 POPJ PDP,0 ;YES. ERROR RETURN
\r
727 MOVE TAC,@NUMTAB(TAC) ;GET CONTENTS OF MONITOR TABLE
\r
728 AOS (PDP) ;OK (SKIP) RETURN TO USER
\r
729 JRST STOTAC ;RETURN TAC IN HIS AC
\r
731 ;THE MONITOR JOB TABLE NUMBERS:
\r
732 EXTERN JBTSTS,JBTADR,JBTPRG,NSWTBL,CNFTBL,NSWMXL,CNFMXL
\r
733 NUMTAB: XWD ITEM+JBTMXL,JBTSTS ;0 - JOB STATUS BITS
\r
734 XWD ITEM+JBTMXL,JBTADR ;1 - JOB SIZE -1 AND ABS.LOC
\r
737 XWD ITEM+JBTMXL,PRJPRG ;2 - PROJECT,PROGRAMMER NUMBER
\r
740 XWD JBTMXL,[0] ;2 - NOT DEFINED
\r
742 XWD ITEM+JBTMXL,JBTPRG ;3 - PROGRAM BEING RUN
\r
747 XWD ITEM+JOBMXL,TTIME ;4 - TOTAL RUN TIME IN JIFFIES
\r
750 XWD JOBMXL,[0] ;4 - NOT DEFINED TABLE - RETURN 0
\r
754 XWD ITEM+JOBMXL,JBTKCT ;5 - KILO-CORE TICKS(JIFFIES*SIZE IN K)
\r
757 XWD JOBMXL,[0] ;5 NOT DEFINED TABLE - RETURN 0
\r
761 XWD ITEM+JOBMXL,JBTPRV ;6 - PRIVILEGE BITS SET BY LOGIN
\r
764 XWD JOBMXL,[0] ;6 - NOT DEFINED TABLE - RETURN 0
\r
767 EXTERN JBTSWP,SWPTBL,SWPMXL
\r
768 XWD ITEM+JBTMXL,JBTSWP ;7 - LOC ON DISK, SIZE ON DISK, IN CORE PROTECT TIME
\r
771 XWD JOBMXL,[0] ;7 - NOT DEFINED TABLE - RETURN 0
\r
773 XWD ITEM+TTPMXL,TTYTAB ;10 - TTY TRANSLATOR TABLE
\r
774 XWD ITEM+CNFMXL,CNFTBL ;11 - CONFIGURATION DATA
\r
775 XWD ITEM+NSWMXL,NSWTBL ;12 - NON-SWAPPING DATA
\r
777 XWD ITEM+SWPMXL,SWPTBL ;13 - SWAPPER DATA
\r
780 EXP [0] ;13 - UNDEFINED
\r
781 ;ALL CALL ARE ERROR RETURNS SINCE TABLE
\r
786 EXTERN JBTSGN,ITMSGN
\r
788 XWD ITMSGN,JBTSGN ;14 - HIGH SEG NO. THIS JOB IS USING
\r
789 ;LH=ITEM+JOBMXL IF REENTRANT SOFTWARE
\r
790 ;LH=0+JOBMXL, SO ALL ENTRIES RETURN 0
\r
791 ; IF NON-REENTRANT SOFTWARE
\r
794 XWD JOBMXL,[0] ;14 - UNDEFINED
\r
797 EXTERN ODPMXL,ODPTBL
\r
798 XWD ITEM+ODPMXL,ODPTBL ;15 - ONCE ONLY DISK PARAMETERS
\r
801 EXP [0] ;50 - UNDEFINED
\r
803 GTTBLN=.-NUMTAB ;LENGTH OF TABLE
\r
806 IFE FTGETTAB,<GETTAB=UUOERR>
\r
808 ;UUO TO SET CURRENT PROGRAM NAME
\r
809 ; MOVE AC,[SIXBIT /NAME/]
\r
814 SETNAM: MOVEM TAC,JBTPRG(ITEM) ;STORE PROGRAM NAME FOR SYSTAT AND SYSDPY
\r
818 ;UUO TO SET JOB TO USE IO IN USER MODE
\r
819 ;AND TO SET PI INTERRUPT LOCATION IN LOWER CORE(WORKS ONLY ON PDP-10'S -SEE NEXT PAGE)
\r
820 ;CALL: CALL AC,[SIXBIT /TRPSET/]
\r
821 ; ERROR RETURN, USER NOT ALLOWED TO DO IO IN USER MODE
\r
824 ;WHERE RH(AC)=REL ADR. OF 1 INSTRUCTION TO BE MOVED INTO
\r
825 ;THE MONITOR PI TRAP LOCATION(40-57) AS SPECIFIED BY LH(AC)
\r
826 ;RELOCATION OF JOB IS ADDED TO RH OF INSTRUCTION AS IT IS MOVED.
\r
827 ;ALSO THE RELOCATION IS ADDED TO THE RH OF WORD IN USER AREA SPECIFIED BY
\r
828 ;RH OF USER INSTRUCTION IN CASE IT IS A BLKO/BLKI POINTER
\r
829 ;THE USER MUST RESET EVERY TRPSET CALL IF BLKI/BLKO POINTER
\r
830 ;AND SHOULD SET RH TO 0 IF JSR PC WORD
\r
831 ;THE APR IS ALSO SET SO USER MAY DO IO IN USER MODE
\r
832 ;TO SET USER MODE IO WITHOUT SETTING LOWER CORE, C(AC)=0
\r
833 ;STOP TIME SHARING ONLY IF AC IS NON-ZERO(IE RUN ONLY JOB 1)
\r
839 EXTERNAL JOBPD1,STOPTS
\r
841 CAIE ITEM,1 ;IS THIS JOB 1?
\r
842 POPJ PDP, ;NO, ERROR RETURN
\r
843 SETZM STOPTS ;CLEAR THE STOP TIME SHARING FLAG
\r
844 JUMPE TAC,TRPST1 ;IS AC 0?(DO NOT SET PI LOC IF YES)
\r
845 HLRZ TAC1,TAC ;NO, SET LOWER CORE
\r
846 CAIL TAC1,40 ;IS IT LEGAL LOWER CORE ADR.?
\r
848 POPJ PDP, ;NO, ERROR RETURN
\r
849 SETOM STOPTS ;SET STOP TIME SHARING FLAG, SO NO OTHER JOBS
\r
850 ; JOBS WILL RUN AND NO CORE SHUFFLING
\r
851 HRLI TAC,PROG ;YES, SET TO RELOCATE
\r
852 MOVE TAC,@TAC ;GET THE INSTR.
\r
853 ADDI TAC,(PROG) ;ADD RELOCATION SO WILL POINTER TO USER AREA
\r
854 HRRZ DAT,PROG ;USER RELOCATION
\r
855 ADDM DAT,(TAC) ;ALSO ADD RELOCATION TO WORD POINTED TO BY INSTR
\r
856 ; IN CASE IT IS A BLKI/BLKO POINTER WORD
\r
857 ; USER SHOULD RESET RH OF POINTER IF BLKI/BLKO INSTR
\r
858 ; OR CLEAR PC LOC IF JSR INSTR
\r
859 EXCH TAC,(TAC1) ;AND STORE IN MONITOR TRAP LOC.
\r
860 TRPST1: AOS (PDP) ;OK RETURN
\r
861 MOVSI TAC1,4000 ;SET USER IO PC FLAG
\r
862 IORM TAC1,JOBPD1(JDAT) ;IN UUO RETURN PC
\r
864 JRST STOTAC ;RETURN PREVIOUS CONTENTS OF PI LOC.
\r
866 ;ROUTINE TO DISMISS INTERRUPT FOR JOB DOING USER IO
\r
867 ;WHEN PC IS IN EXEC MODE
\r
868 ;NOTE THE TRPJEN UUO HAS BEEN ELIMINATED
\r
869 ;BECAUSE UUO HANDLER CANNOT BE INTERRUPTED AND REENTERED
\r
870 ;INSTEAD INTERRUPTS IN USER MODE ARE DISMISSED
\r
871 ;BY USING OP CODE 100 (UJEN) WHICH
\r
872 ;TRAPS TO EXEC 61 INSTEAD OF 41 ON PDP-10'S
\r
873 ;UJEN IS A NO-OP ON PDP-6'S AND SO THIS FACILTY IS GOOD ON PDP-10'S ONLY
\r
874 ;CALL: RESTORE ALL EXEC ACS
\r
875 ; UJEN ADR ;UJEN=100
\r
876 ; WHERE ADR CONTAINS PC STORED BY INTERRUPT JSR
\r
877 ; SEE UUO HANDLER (UUO2) FOR CODE
\r
878 \f;FOR PURPOSES OF COMMENTING THIS SUBROUTINE THE
\r
879 ;TERM 'BUFFER HEADER' SHALL REFER TO THE 3 WORD HEADER
\r
880 ;WHICH IS USED BY THE USER PROGRAM AND THIS EXEC FOR
\r
881 ;REFERING TO THE RING BUFFERS.
\r
883 ;THE CONTENTS OF THE 3 WORD HEADER (AS SET BY THE MONITOR
\r
884 ; ON EACH INPUT AND OUTPUT UUO).
\r
885 ; BIT 18-35=ADDRESS OF SECOND WORD OF THE
\r
886 ; CURRENT BUFFER IN RING WHICH USER IS REFERENCING
\r
887 ; WORD 2: BYTE POINTER TO CURRENT ITEM.
\r
888 ; WORD 3: POSITIVE ITEM COUNT (NO. OF ITEMS LEFT ON
\r
889 ; INPUT, NO. OF FREE ITEMS TO GO ON OUTPUT).
\r
891 ;EACH BUFFER IN THE RING HAS FOLLOWING FORMAT (AS THE USER SEES IT)
\r
893 ; WORD 1: RESERVED FOR BLOCK NUMBER FOR FIXED ADDRESS DEVICES
\r
894 ; WORD 2: BIT 0=USE BIT FOR THIS BUFFER
\r
895 ; BIT 1-17=NO. OF WORDS WHICH FOLLOW (LENGTH OF BUFFER)/
\r
896 ; BIT 18-35=ADDRESS OF SECOND WORD OF NEXT BUFFER IN RING
\r
897 ; WORD 3: LH=LINK TO NEXT BLOCK (SET BY MONITOR FOR DECTAPE)
\r
898 ; RH=NO. OF WORDS OF DATA WHICH FOLLOW (USUALLY
\r
899 ; SET BY EXEC EXCEPT IF THE USER HAS SPECIFIED
\r
900 ; THAT HE WANTS TO COMPUTE WORD COUNT
\r
901 ; HIMSELF INSTEAD OF HAVING THE MONITOR DO IT
\r
902 ; USING THE BYTE POINTER IN THE 3 WORD HEADER).
\r
910 , EXIT ALWAYS RETURNS HERE
\r
911 , THIS ROUTINES PROCESSES THE CLOSE UUO AND DETERMINES WHETHER THE
\r
912 ,OUTPUT ROUTINE SHOULD BE CALLED IF OUTPUT WERE ACTIVE, CLEARS
\r
913 ,THE INPUT BUFFER AREA IF INPUT WERE ACTIVE, AND CLEARS THE
\r
914 ,ITEM COUNTS OF BOTH INPUT AND OUTPUT HEADERS SERVING TO BOTH
\r
915 ,TERMINATE THE USE OF THE DEVICE AND SET THE I/O ROUTINES TO
\r
916 ,ACCEPT ANOTHER INPUT OR OUTPUT COMMAND IN A CLEAR STATE.
\r
917 ,IN THE CASE OF OUTPUT DEVICES, THE CLOSE ROUTINE OF THE DEVICE HANDL-
\r
918 ,ING ROUTINE IS CALLED IN CASE ANY SPECIAL HANDLING IS REQUIRED.
\r
922 CLOSE1: PUSHJ PDP,WAIT1 ;WAIT UNTIL DEVICE IS INACTIVE
\r
923 TRNN UUO,CLSIN ;SUPPRESS INPUT CLOSE?
\r
924 TLOE DEVDAT,ICLOSB ;NO. INPUT ALREADY BEEN CLOSED?
\r
927 CAIGE TAC,SD ;DUMP MODE?
\r
928 JRST UCLSBI ;NO. CLOSE BUFFERED INPUT.
\r
929 UCLS5: PUSHJ PDP,DCLI(DSER) ;YES. DISPATCH TO DEVICE DEP. ROUTINE
\r
930 JRST UCLS2 ;MUST NOT DESTROY UUO,DEVDAT,DSER,UCHN
\r
931 UCLSBI: MOVE TAC,DEVMOD(DEVDAT)
\r
932 TLNE DEVDAT,INBFB+INPB ;WAS AN INPUT BUFFER SETUP?
\r
934 TLNE TAC,DVDSK ;CLOSING A DISK FILE ?
\r
935 JRST UCLS5 ;YES, DO DEVICE DEPENDENT CLOSE ANYWAY.
\r
936 JRST UCLS2 ;NO, CLOSE NOT NECESSARY.
\r
937 UCLS4: TLNE TAC,DVLNG ;IS THIS A LONG DISPATCH TABLE?
\r
938 PUSHJ PDP,DCLI(DSER) ;YES, CLOSE INPUT
\r
939 HRRZ TAC1,DEVBUF(DEVDAT)
\r
941 HRRZ DAT,@TAC1 ;FIRST WORD OF 3 WORD BUFFER HEADER
\r
942 HRR TAC1,@TAC1 ;REMEMBER CURRENT BUFFER IN TAC1
\r
943 HRLZI TAC,IOUSE ;USED BOTH FOR HEADER AND EACH BUFFER
\r
944 JUMPE DAT,UCLS1 ;HAS A RING BEEN SETUP?(NO IF 0)
\r
946 MOVEI AC1,(DAT) ;IS ADDRESS SPECIFIED BY CONTENTS OF
\r
947 PUSHJ PDP,UADRCK ;FIRST WORD OF 3 WORD BUFFER HEADER IN BOUNDS?
\r
949 UCLS0: HRR DAT,@DAT ;ADVANCE CURRENT INPUT BUFFER ADDRESS
\r
950 CAIN AC1,(DAT) ;IS THIS THE SAME BUFFER AS LAST ONE?
\r
951 JRST UCLS1 ;YES. BAD RING. LOOPING ON ITSELF.
\r
952 MOVEI AC1,(DAT) ;IS ADDRESS OK?
\r
954 ANDCAM TAC,@DAT ;YES, CLEAR USE BIT.
\r
955 CAME TAC1,DAT ;DONE?
\r
959 UCLS1: HRLI DAT,PROG
\r
960 HRR DAT,DEVBUF(DEVDAT)
\r
961 IORM TAC,@DAT ;FLAG AS VIRGIN BUFFER IN 3 WORD HEADER
\r
962 ADDI DAT,2 ;JBFCTR:=0
\r
963 SETZM @DAT ;CLEAR INPUT ITEM COUNT.
\r
964 MOVE IOS,[XWD IOEND,IODEND]
\r
965 ANDCAB IOS,DEVIOS(DEVDAT)
\r
966 UCLS2: TRNN UUO,CLSOUT ;SUPPRESS OUTPUT CLOSE?
\r
967 TLOE DEVDAT,OCLOSB ;NO. OUTPUT ALREADY CLOSED?
\r
972 PUSHJ PDP,RELSEG ;CLEAR SHARED SEG NAME IF FILE JUST CLOSED HAS
\r
973 ; EXTENSION .SHR AND SEG HAS SAME DIRECTORY AND NAME
\r
976 LDB TAC,PIOMOD ;NO.
\r
977 CAIGE TAC,SD ;DUMP MODE?
\r
978 JRST UCLSBO ;NO. CLOSE BUFFERED OUTPUT
\r
979 UCLS7: PUSHJ PDP,DCL(DSER) ;YES. DISPATCH TO DEVICE DEP. ROUTINE
\r
981 UCLSBO: TLNN DEVDAT,OUTBFB+OUTPB ;WAS AN OUTPUT BUFFER SET UP?
\r
983 HLR DAT, DEVBUF(DEVDAT) ;VIRGIN OUBPUT BUFFER?
\r
986 JRST UCLS6 ;YES, DO NOT CLOSE UNLESS IT IS A DISK FILE
\r
987 UCLS2A: MOVE DSER,DEVSER(DEVDAT)
\r
988 SKIPL @DEVOAD(DEVDAT) ;NO, HAS SERVICE ROUTINE WRITTEN
\r
989 ; ITS NEXT BUFFER YET?
\r
991 TRZ IOS,760000 ;NO,CLEAR ERROR BITS AND START OUTPUT DEVICE
\r
993 PUSHJ PDP,DOU(DSER) ;CALL SERVICE ROUTINE TO DO OUTPUT
\r
995 PUSHJ PDP,WAIT1 ;WAIT TILL MOST BUFFERS FILLED
\r
996 TRNN IOS,760000 ;ERROR?
\r
997 JRST UCLS2A ;NO,RETURN WHEN ALL EMPTIED
\r
998 ; OR SHUFFLING REQUIRED STOPS DEVICE
\r
1000 UCLS2B: MOVE DSER,DEVSER(DEVDAT)
\r
1001 PUSHJ PDP,DCL(DSER) ;CLOSE OUTPUT BUFFER
\r
1002 HLR DAT,DEVBUF(DEVDAT)
\r
1007 SETZM @DAT ;JBFCTR:=0
\r
1009 TLO DEVDAT,OCLOSB ;SET OCLOSB AFTER OUTPUT IS COMPLETE
\r
1010 UCLS3: HLLM DEVDAT,USRJDA(UCHN)
\r
1011 POPJ PDP, ;EXIT THIS UUO
\r
1013 UCLS6: MOVSI TAC,DVDSK
\r
1014 TDNE TAC,DEVMOD(DEVDAT) ;CLOSING A DISK FILE ?
\r
1015 JRST UCLS7 ;YES, DO DISK CLOSE ROUTINE IN ANY EVENT
\r
1017 \f,CALLING SEQUENCE
\r
1019 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED
\r
1022 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED
\r
1023 , SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM FOR DEVICE
\r
1024 , D AND INITIALIZES THE JOB BUFFER AREA HEADER:
\r
1025 , JBFADR0:=1, JBFADR 1-17:=0
\r
1026 , JBFADR 18-35:=ADDRESS OF FIRST BUFFER IN RING
\r
1027 ,INPUT SETS DEVIAD:=ADDRESS OF FIRST BUFFER IN RING
\r
1028 ,OUTPUT SET DEVOAD:=ADDRESS OF FIRST BUFFER IN RING
\r
1029 ,BUFPNT IS RESTORED.
\r
1030 \f INTERNAL UINBF, UOUTBF
\r
1031 EXTERNAL PUUOAC,USRJDA
\r
1034 UOUTBF: TLO DEVDAT,OUTBFB ;FLAG OUTBUF UUO DONE
\r
1035 PUSH PDP,BUFPNT ;SAVE BUFPNT ON STACK
\r
1036 PUSHJ PDP,BUFCLC ;SET UP BUFFER RING
\r
1037 HLR TAC,DEVBUF(DEVDAT) ;TAC:=OUTPUT BUFFER AREA HEADER ADDRESS
\r
1038 HRRM BUFPNT,DEVOAD(DEVDAT) ;DEVOAD:=ADDRESS OF FIRST BUFFER
\r
1040 UOBF1: HRLI TAC,PROG ;RELOCATE BUFFER AREA HEADER ADDRESS
\r
1041 MOVEM BUFPNT,@TAC ;JBFADR:=IOUSE,ADDRESS OF FIRST BUFFER
\r
1044 MOVEM DEVDAT,USRJDA(TAC)
\r
1045 POP PDP,BUFPNT ;RESTORE BUFPNT FROM STACK
\r
1046 POPJ PDP, ;EXIT THIS UUO
\r
1047 UINBF: TLO DEVDAT,INBFB ;FLAG INBUF UUO DONE
\r
1048 PUSH PDP,BUFPNT ;SAVE BUFPNT ON STACK
\r
1049 PUSHJ PDP,BUFCLC ;SET UP BUFFER RING
\r
1050 HRRM BUFPNT,DEVIAD(DEVDAT) ;DEVIAD:=ADDRESS OF FIRST BUFFER
\r
1052 HRR TAC,DEVBUF(DEVDAT) ;TAC:=INPUT BUFFER AREA HEADER ADDRESS
\r
1054 \f;OPEN UUO - PERFORMS SAME OPERATION AS INIT
\r
1055 ;MAY BE USED EASILY BY REENTRANT PROGRAMS
\r
1056 ;CALLING SEQUENCE FROM USER AREA
\r
1061 ;LH(ADR)=0,RH(ADR)=DATA MODE THIS INIT
\r
1062 ;LH(ADR+1)=OUTPUT BUFFER HEADER ADDRESS
\r
1063 ;RH(ADR+1)=INPUT BUFFER HEADER ADDRESS
\r
1064 ;C(ADR+2,...,ADR+5)=SAME AS LOOKUP OR ENTER
\r
1068 UOPEN: PUSHJ PDP,GETWDU ;SET TAC TO CONTENTS OF FIRST ARG(IO STATUS BITS)
\r
1069 AOJA UUO,UINIT0 ;MAKE UUO POINT TO ARG+1(WITH PROG STILL
\r
1074 , INIT D,MODUS D=JOB DEVICE CHANNEL
\r
1075 , MODUS=IORDEL,IOCON,IOWC,MODE.
\r
1076 , SIXBIT/NAME/ DEVICE NAME
\r
1077 , XWD OBUF,IBUF BUFFER AREA HEADER ADDRESSES
\r
1078 , EXIT1 DEVICE NOT AVAILABLE
\r
1079 , EXIT2 DEVICE PROPERLY ASSIGNED
\r
1080 ,THE LEFT HALF OF NAME CONTAINS THE THREE LETTER DEVICE MNEMONIC,
\r
1081 , THE RIGHT HALF IS EITHER ZERO (SYSTEM WILL ASSIGN AN ARBITRARY
\r
1082 , UNIT) OR NON-ZERO TO REQUEST A SPECIFIC UNIT (LEFT JUSTIFIED).
\r
1083 ,IF THE SELECTED DEVICE IS NOT AVAILABLE, CONTROL RETURNS TO EXIT1.
\r
1084 ,OTHERWISE, THE DEVICE IS ASSIGNED TO THE USER AND ATTACHED TO HIS
\r
1085 ,CHANNEL D. THE DEVICE IS INITIALIZED IN THE FOLLOWING MANNER AFTER
\r
1088 , DATA MODE:=BITS 32-35 OF AC UUO
\r
1089 , IOCON:=BIT 31 OF AC UUO
\r
1090 , IOWC:=BIT 30 OF AC UUO
\r
1091 , IORDEL:=BIT 29 OF AC UUO
\r
1092 , IOACT:=IODEND:=IOBKTL:=IODTER:=IODERR:=IOIMPM:=0
\r
1093 , JBFADR:=JBFCTR:=0 FOR THE SPECIFIED BUFFERS.
\r
1094 , DEVBUF:=OBUF,IBUF
\r
1096 EXTERNAL STREQ,STUSER
\r
1097 EXTERNAL USRJDA,USRHCU,SYSTAP,TPOPJ,TPOPJ1,IADPTR
\r
1099 UINIT: MOVE TAC,UUO ;SAVE FIRST ARG(IO STATUS BITS) IN TAC
\r
1100 HRR UUO,-1(PDP) ;SET UUO TO ADR+1 OF USER ARGS
\r
1101 AOS -1(PDP) ;SET RETURN SKIP THE 2 ARGUMENTS
\r
1103 UINIT0: PUSH PDP,UUO ;HERE ON OPEN UUO, SAVE ADR+1 OF USER ARGS
\r
1104 PUSH PDP,TAC ;SAVE IO STATUS BITS(FIRST ARG)
\r
1105 SKIPE DEVDAT,USRJDA(UCHN) ;IS A DEVICE ALREADY ASSIGNED TO THIS CHAN?
\r
1106 CAMLE UCHN,USRHCU ;YES, IS THIS CHAN. LESS OR EQUAL TO HIGHEST
\r
1107 ; CHAN. FOR THIS USER?
\r
1108 JRST UINITA ;NO, NO PREVIOUS DEVICE TO RELEASE
\r
1109 PUSHJ PDP,RELEA0 ;RELEASE PREVIOUS DEVICE ON THIS CHAN.
\r
1110 UINITA: MOVE UUO,-1(PDP) ;RESTORE UUO (ADR+1 OF 3 ARGS)
\r
1111 PUSHJ PDP,GETWDU ;C(TAC)=DEVICE NAME IF IN BOUNDS
\r
1112 ; DO NOT RETURN IF OUT OF BOUNDS(PRINT ERR AND STOP)
\r
1113 ; SET ITEM TO CURRENT JOB NUMBER
\r
1114 PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE NAME
\r
1115 ; (SET SYSDEV BIT IN LH OF
\r
1116 ; DEVDAT IF THIS IS SYSTEM TAPE)
\r
1117 JRST UINITE ;NO SUCH DEVICE
\r
1118 MOVE UUO,(PDP) ;RESTORE USER'S MODE SETTING
\r
1119 PUSHJ PDP,CHKMOD ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN
\r
1120 MOVE TAC,DEVNAM(DEVDAT) ;PHYSICAL DEVICE NAME
\r
1121 CAME TAC,[SIXBIT /DSK/] ;NOT DISK?
\r
1122 CAME TAC,SYSTAP ;SYSTEM TAPE DEVICE?
\r
1123 JRST UINIT1 ;NO, DISK OR NOT SYSTEM TAPE
\r
1124 AOSE STREQ ;SYSTEM TAPE, INCREMENT REQUEST COUNT
\r
1125 PUSHJ PDP,STWAIT ;SYSTEM TAPE BUSY, PUT JOB IN WAIT
\r
1126 MOVEM ITEM,STUSER ;SET THIS JOB AS ONLY USER OF SYSTEM TAPE
\r
1127 ; CONTROL C DOES NOT STOP JOB WHILE USING S. T.
\r
1128 UINIT1: MOVE TEM,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS
\r
1129 TLNN TEM,DVDTA ;IS THIS DEVICE A DECTAPE?
\r
1131 LDB TAC1,IADPTR ;YES, GE NO OF USER CHANS DEV INITED ON
\r
1132 HRR TEM,TAC1 ;SAVE OLD NUMBER
\r
1133 AOS TAC1 ;INCREASE CHANNEL COUNT
\r
1134 CAIL TAC1,3 ;ANY MORE THAN JUST 2 CHANNELS?
\r
1135 JRST UINITE ;YES, GIVE ERROR RETURN(POP TAC)
\r
1136 DPB TAC1,IADPTR ;YES, STORE UPDATED CHANNEL COUNT FOR THIS DEVICE(DTA)
\r
1137 UINITB: MOVEI TAC1,ASSPRG ;TRY TO ASSIGN IT BY PROGRAM
\r
1139 JRST UINIT6 ;NOT AVAILABLE, GIVE ERROR RETURN(POP TAC)
\r
1140 POP PDP,UUO ;RESTORE USER'S MODE SETTING
\r
1141 PUSHJ PDP,SETIOS ;SET DDB IOS STATUS WORD
\r
1142 ; FROM RT. HALF OF AC UUO
\r
1143 ; WAIT FOR DEVICES TO BECOME INACTIVE IN CASE IT IS
\r
1144 ; INITED ON A DIFFERENT CHANNEL(OR MONITOR COMMAND
\r
1145 ; RESPONSE ON TTY)
\r
1147 IORB IOS,DEVIOS(DEVDAT)
\r
1148 \fUINITL: CAMG UCHN,USRHCU ;IS THIS CHAN. .GT. HIGHEST CHAN. IN USE?
\r
1150 AOS TAC,USRHCU ;YES, BUMP HIGHEST SO FAR BY ONE
\r
1151 SETZM USRJDA(TAC) ;AND CLEAR IT OUT
\r
1152 JRST UINITL ;AND KEEP LOOKING
\r
1154 UINITC: TLO DEVDAT,INITB+ICLOSB+OCLOSB;SET INIT UUO BIT
\r
1155 ;PREVENT SUPERFLUOUS CALLS TO CLOSE (SEE LOOKUP,ENTER)
\r
1156 AOS UUO,(PDP) ;ADVANCE TO 3RD ARG(BUFFER HEADER)
\r
1157 PUSHJ PDP,GETWDU ;C(TAC)=BUFFER HEADER ARG
\r
1158 HLRZ TAC1,TAC ;OUTPUT BUFFER HEADER FROM USER
\r
1159 JUMPE TAC1,UINIT4 ;WAS ONE SPECIFIED?
\r
1160 HRLM TAC1,DEVBUF(DEVDAT);YES, SET DEVICE DATA BLOCK
\r
1161 TLO DEVDAT,OBUFB ;SET OUTPUT BUFFER SPECIFIED BIT
\r
1162 PUSHJ PDP,UINITZ ;INITIALIZE OUTPUT BUFFER HEADER
\r
1163 UINIT4: PUSHJ PDP,GETWDU ;C(TAC)=BUFFER HEADER ARG FROM USER
\r
1164 HRRZ TAC1,TAC ;INPUT BUFFER HEADER
\r
1165 JUMPE TAC1,UINIT5 ;WAS ONE SPECIFIED?
\r
1166 HRRM TAC1,DEVBUF(DEVDAT) ;YES, SET DEVICE DATA BLOCK
\r
1167 TLO DEVDAT,IBUFB ;SET INPUT BUFFER SPECIFIED BIT
\r
1168 MOVSI IOS,IOEND ;CLEAR END OF FILE FLAG
\r
1169 ANDCAB IOS,DEVIOS(DEVDAT) ;AND RETAIN IOS
\r
1170 PUSHJ PDP,UINITZ ;INITIALIZE INPUT BUFFER HEADER
\r
1171 UINIT5: MOVEM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS AND DEVICE
\r
1172 ; DATA BLOCK ADDRESS
\r
1173 JRST TPOPJ1 ;SUCCESSFUL RETURN(POP TAC)
\r
1175 UINIT6: TLNE TEM,DVDTA ;WAS DEVICE A DECTAPE?
\r
1176 DPB TEM,IADPTR ;YES, RESTORE NO. OF USER CHAN INITED ON
\r
1177 UINITE: POP PDP,TAC ;REMOVE IO STATUS ARG
\r
1178 JRST TPOPJ ;AND GIVE ERROR RETURN AND POP TAC
\r
1179 \f,CALLING SEQUENCE
\r
1180 , PUSHJ PDP,UINITZ
\r
1181 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED.
\r
1182 ,SETS JBFADR:=JBFCTR:=0 FOR THE BUFFER AREA HEADER WHOSE ADDRESS
\r
1183 ,IS IN AC TAC1. ALSO,JBFPTR 0-5:=JBFPTR 12-17:=0,JBFPTR 6-11:=BYTE SIZE
\r
1186 UINITZ: HRLI TAC1,PROG ;SET FOR RELOCATION
\r
1187 MOVEI AC1,2(TAC1) ;CHECK 3RD WORD OF BUFFER HEADER
\r
1189 SETZM @TAC1 ;CLEAR FIRST WORD (CURRENT BUFFER) OF 3 WORD HEADER
\r
1190 AOS TAC1 ;POINT TO SECOND WORD (BYTE POINTER)
\r
1192 AOS TAC1 ;POINT TO THIRD WORD (ITEM COUNT)
\r
1193 SETZM @TAC1 ;SET ITEM COUNT TO ZERO
\r
1194 PUSHJ PDP,SETBYT ;SET BYTE SIZE ACCORDING TO MODE AS SET IN AC IOS
\r
1197 HLLM TAC,@TAC1 ;AND STORE IN SECOND WORD
\r
1199 \f;LONG DISPATCH TABLE UUOS - GET HERE ONLY IF DEVICE HAS LONG
\r
1201 ;DISPACTH TO DEVICE DEPENDENT SERVICE ROUTINE
\r
1202 ;ENTER UUO - ENTER FILE NAME IN DIRECTORY
\r
1206 UDEN: MOVEI TAC,CLSIN
\r
1207 TLNN DEVDAT,OCLOSB ;FILE OPEN?
\r
1208 PUSHJ PDP,UDLKC ;YES. CLOSE IT[OCLOSB_1]
\r
1211 MOVEM IOS,DEVIOS(DEVDAT)
\r
1212 HLLM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS
\r
1213 PUSHJ PDP,DEN(DSER) ;ATTEMPT AN ENTER
\r
1214 POPJ PDP, ;FAILURE
\r
1216 TLO DEVDAT,ENTRB ;NOTE SUCCESSFUL ENTER
\r
1217 JRST DLKDEN ;STORE THE PROGRESS BITS
\r
1219 ;LOOKUP UUO - LOOKUP FILE NAME IN DIRECTORY
\r
1223 UDLK: MOVEI TAC,CLSOUT ;IN HIBIT OUTPUT CLOSE BIT
\r
1224 TLNN DEVDAT,ICLOSB ;FILE OPEN?
\r
1225 PUSHJ PDP,UDLKC ;YES. CLOSE IT[ICLOSB_1]
\r
1226 TDZ IOS,[XWD IOEND,776000]
\r
1227 MOVEM IOS,DEVIOS(DEVDAT)
\r
1228 HLLM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS
\r
1229 PUSHJ PDP,DLK(DSER) ;ATTEMPT A LOOKUP
\r
1230 POPJ PDP, ;FAILURE
\r
1232 TLO DEVDAT,LOOKB ;NOTE SUCCESSFUL LOOKUP
\r
1233 DLKDEN: LDB TAC,PUUOAC ;GET CHANNEL #
\r
1234 HLLM DEVDAT,USRJDA(TAC) ;STORE UUO PROGRESS BITS
\r
1235 JRST CPOPJ1 ;SUCCESS RETURN TO USER (CALL+2)
\r
1239 UDLKC: PUSH PDP,UUO
\r
1244 \f;RENAME UUO - HERE ON SHORT DISPATCH TABLE DEVICES TOO
\r
1249 URENAM: MOVE TAC,DEVMOD(DEVDAT) ;IS THIS DEVICE A LONG DISPATCH TABLE?
\r
1251 JRST CPOPJ1 ;NO, GIVE SKIP RETURN TO USER
\r
1253 JRST DRN(DSER) ;YES, DISPATCH TO SERVICE ROUTINE
\r
1257 PUSHJ PDP,DRN(DSER) ;TRY TO RENAME (SERVICE ROUTINE)
\r
1258 POPJ PDP, ;ERROR,ERROR RETURN TO USER
\r
1259 JRST RELSG1 ;SUCCESSFUL RENAME, GO ZERO SHARABLE SEG NAME
\r
1260 ; IF NEW FILE EXT IS .SHR AND FILE NAME
\r
1261 ; FIND DIRECTORY (DEVICE) ARE SAME AS SHARABLE SEG
\r
1262 ; ALWAYS SKIP RETURN
\r
1265 ;SETO UUO - SET NEXT OUTPUT BLOCK NUMBER(DECTAPE)
\r
1267 UDSO: JRST DSO(DSER)
\r
1269 ;SETI UUO - SET NEXT INPUT BLOCK NUMBER
\r
1271 UDSI: JRST DSI(DSER)
\r
1273 ;GETF UUO - GET NEXT FREE BLOCK
\r
1275 UDGF: JRST DGF(DSER)
\r
1277 ;MTAPE UUO - MAGTAPE OPERATIONS
\r
1279 UMTAPE: JRST DMT(DSER)
\r
1281 ;UTPCLR - CLEAR DECTAPE DIRECT.
\r
1283 UTPCLR: MOVE TAC,DEVMOD(DEVDAT) ;IS THIS A LONG DISPATCH TABLE?
\r
1285 POPJ PDP, ;NO,RETURN
\r
1286 JRST DCLR(DSER) ;YES, DISPATCH
\r
1289 ;1) IF OUTPUT ACTIVE ON THIS CHANNEL, WAIT FOR IT TO COMPLETE.
\r
1290 ;2) IF DUMP MODE, WAIT FOR DEVICE INACTIVE, CALL SERVICE
\r
1291 ; ROUTINE TO START INPUT, WAIT TILL COMPLETE, THEN RETURN TO USER.
\r
1292 ;3) IF NO BUFFER RING SETUP, SET UP 2 RING BUFFER.
\r
1293 ;4) IF FIRST REFERENCE, START SERVICE ROUTINE, GO TO
\r
1294 ;5) FLAG CURRENT BUFFER AS FREE TO RECEIVE MORE INPUT
\r
1295 ; (USE BIT SET TO 0).
\r
1296 ; START SERVICE ROUTINE FILLING FIRST BUFFER WITH USE BIT 0
\r
1297 ; (NEXT BUFFER OR ONE AHEAD OF IT)
\r
1298 ; (SERVICE ROUTINE WILL SET USE BIT WHEN IT FINISHES FILLING
\r
1300 ;7) IF NEXT INPUT BUFFER IS FULL OF DATA, GO TO 10).
\r
1301 ;8) PUT JOB IN IO WAIT TILL NEXT BUFFER FILLED.
\r
1302 ;9) IF NEXT INPUT BUFFER STILL NOT FILLED, CHECK FOR END
\r
1303 ; OF FILE OR ERROR BITS SET BY SERVICE ROUTINE.
\r
1304 ;10) CONVERT WORD COUNT AS STORED BY SERVICE ROUTINE IN THIRD
\r
1305 ; WORD OF BUFFER TO ITEM COUNT AND STORE IN THIRD WORD
\r
1306 ; OF HEADER (ITEM COUNT) ALSO SET BYTE POINTER (SECOND
\r
1307 ; WORD OF HEADER) AND RETURN TO USER.
\r
1309 EXTERNAL USRJDA,PIOMOD
\r
1311 IN: TLNE IOS,IO ;IS THIS DEVICE ALREADY DOING OUTPUT?
\r
1312 PUSHJ PDP,WAIT1 ;YES, WAIT TILL IT IS FINISHED.
\r
1313 TLO DEVDAT,INPB ;FOR THIS DEVICE.
\r
1315 HLLM DEVDAT,USRJDA(UCHN) ;IN LH OF CURRENT JOB DEVICE CHANNEL
\r
1316 LDB TAC,PIOMOD ;IO MODE
\r
1317 CAIL TAC,SD ;IT THE IO MODE DUMP(SD,D,DR)?
\r
1319 IN1: HRR JBUF,DEVBUF(DEVDAT) ;NO, GET ADDRESS OF BUFFER HEADER
\r
1320 HRLZI TAC,IOUSE ;BUFFER INUSE BIT
\r
1321 HRLI JBUF,PROG ;SET INDEX FIELD FOR RELOCATION USING AC PROG
\r
1322 MOVEI AC1,2(JBUF) ;CHECK BUFFER HEADER
\r
1324 MOVE IOS,DEVIOS(DEVDAT) ;SETUP IO STATUS AGAIN FORM FROM MEMORY
\r
1325 ; AC IOS IS CLOBBERED BY AUTOMATIC CORE EXPANSION
\r
1326 ; ON AN IMPLICIT INBUF ON FIRST INPUT
\r
1327 MOVE TAC1,@JBUF ;GET WORD 1 OF 3 WORD BUFFER HEADER.
\r
1328 HRLI TAC1,PROG ;SET INDEX FIELD COR RELOCATION USING AC PROG
\r
1329 SKIPG @JBUF ;HAS A BUFFER RING BEEN SET UP (RH NON-ZERO)
\r
1330 ; WHICH HAS BEEN REFERENCED BY PREVIOUS INPUT (BIT0=0)
\r
1331 JRST INPUTF ;NO. GO SET UP BUFFER IF NECESSARY AND DO FIRST IO
\r
1332 HRRZ AC1,TAC1 ;YES, CHECK ADR. TO SEE IF OK
\r
1334 MOVE IOS,DEVIOS(DEVDAT)
\r
1337 ANDCAB TAC,@TAC1 ;FLAG CURRENT BUFFER AS FREE TO
\r
1338 ; RECEIVE MORE INPUT, CLEAR USE BIT
\r
1339 ; AND GET POINTER TO NEXT BUFFER
\r
1340 HRRM TAC,@JBUF ;SET WORD 1 IN 3 WORD HEADER TO NEXT BUFFER
\r
1341 HRRZ AC1,TAC ;AND CHECK ITS ADDRESS TO SEE IF IN BOUNDS
\r
1343 TRNE IOS,IOACT ;IS THE DEVICE ALREADY ACTIVE
\r
1345 MOVE AC1,DEVMOD(DEVDAT) ;GET DEVICE CHARACTERISTIC WORD
\r
1346 HRLI TAC,PROG ;SET FOR RELOCATION
\r
1347 TLNN AC1,DVTTY ;IS IT A TTY?
\r
1348 HRR TAC,@TAC ;GET POINTER 1 BUFFER AHEAD OF NEXT BUFFER
\r
1350 HRRZ AC1,TAC ;SEE IF USER HAS CLOBBERED POINTER
\r
1352 SKIPL @TAC ;IS THE USE BIT SET?
\r
1353 PUSHJ PDP,CALIN ;NO, START SERVICE ROUTINE FILLING EMPTY BUFFER
\r
1354 INPT0C: HRR TAC1,@TAC1 ;GET USE BIT FOR NEXT BUFFER
\r
1355 INPT0A: SKIPGE @TAC1 ;IS USE BIT SET YET?(BUFFER FILLED YET?)
\r
1356 JRST INPUT2 ;YES, RETURN IMMEDIATELY TO USER
\r
1357 \fINPT2: PUSHJ PDP,WSYNC ;NO, PUT JOB IN IO WAIT TILL BUFFER FILLED.
\r
1358 SKIPL @TAC1 ;RETURN WHEN BUFFER FILLED. CHECK TO MAKE SURE.
\r
1359 JRST INEOF ;NO, MUST BE EOF OR ERROR
\r
1360 INPUT2: ADDI TAC1,1 ;YES, GET WORD COUNT AS SET BY IO SERVICE
\r
1361 HRRZ ITEM,@TAC1 ;RH OF 3RD WORD(FIRST SO-CALLED DATA WORD)
\r
1362 SOJA TAC1,IOSETC ;SET ITEM COUNT AND BYTE POINTER
\r
1363 ; IN 3 WORD HEADER AND RETURN TO USER
\r
1365 INPT1: TRNN IOS,IOACT
\r
1370 INEOF: TDNN IOS,[XWD IOEND,IODERR+IOBKTL+IODTER+IOIMPM]
\r
1371 ; EOF OR ERROR BIT SET BY SERVICE ROUTINE
\r
1372 JSP DAT,UUOERR ;NO,MONITOR ERROR AT UUO LEVEL
\r
1373 TLNE IOS,IOEND ;IS THIS EOF?
\r
1374 TRO IOS,IODEND ;YES, SET USER EOF BIT.
\r
1375 IORM IOS,DEVIOS(DEVDAT)
\r
1376 POPJ PDP, ;RETURN TO USER'S PROGRAM
\r
1380 ;HERE ON FIRST INPUT AFTER INIT, INIT & LOOKUP, OR INIT & LOOKUP & INPUT
\r
1381 INPUTF: ANDCAB TAC,@JBUF ;MARK THAT BUFFERS HAVE BEEN REFER
\r
1382 ; BY CLEARING SIGN BIT OF 1ST WORD IN 3 WORD
\r
1383 ; IN 3 WORD BUFFER HEADER
\r
1384 JUMPE TAC,INPUT3 ;HAS A RING BEEN SET UP YET?
\r
1385 HRRZ AC1,TAC1 ;YES ADDRESS CHECK FIRST USER BUFFER
\r
1386 PUSHJ PDP,UADRCK ;
\r
1387 SKIPG @TAC1 ;IS USE BIT SET IN FIRST USER INPUT BUFFER?
\r
1388 ; CAN HAPPEN IF TTY AND USER HAS TYPED
\r
1389 ; IN LINE AFTER INBUF BUT BEFORE FIRST INPUT UUO
\r
1390 JRST INPUT2 ;YES, DO NOT CALL SERVICE ROUTINE(SCNSER)
\r
1391 ; SINCE USER BUFFER ALREADY HAS DATA
\r
1392 HRRM TAC,DEVIAD(DEVDAT) ;YES, STORE ADR. OF 2ND WORD OF
\r
1393 ; A BUFFER FOR SERVICE ROUTINE
\r
1394 PUSHJ PDP,CALIN ;YES. GO START IO SERVICE ROUTINE
\r
1397 INPUT3: HRRI UUO,2 ;BUFFERS NOT SETUP YET.
\r
1400 HLLZS UUO ;CLEAR RIGHT HALF
\r
1404 INDMP: PUSHJ PDP,WSYNC ;INPUT DUMP
\r
1405 PUSHJ PDP,DDI(DSER) ;CALL SERVICE ROUTINE
\r
1406 JRST WAIT1 ;THEN WAIT TILL IO FINISHED BEFORE
\r
1407 ; RETURNING TO USER.
\r
1409 EXTERNAL JOBPFI,USRREL
\r
1411 CALIN: TLNE IOS,IOEND
\r
1415 HRRZ AC1,DEVIAD(DEVDAT) ;IS FIRST ADR. ABOVE JOB DATA AREA?
\r
1417 JRST ADRERR ;NO, PRINT ERROR AND STOP JOB
\r
1418 HLRZ AC2,@DEVIAD(DEVDAT) ;GET LENGTH OF BUFFER
\r
1419 TRZ AC2,IOUSE ;CLEAR USE BIT IN CASE IT IS ON(TTY)
\r
1421 CAMLE AC1,USRREL ;IS LAST ADDRESS IN BOUNDS?
\r
1422 JRST ADRERR ;NO, STOP JOB AND PRINT ERROR
\r
1423 PUSHJ PDP,DIN(DSER) ;DISPATCH TO IO SERVICE ROUTINE
\r
1427 \f,CALLING SEQUENCE
\r
1434 ,IF INPUT IS ACTIVE, WAIT FOR IT TO COMPLETE.
\r
1435 ,IF DUMP MODE WAS SELECTED BY THE LAST INIT UUO OR SETSTS UUO
\r
1436 , THE PROGRAM WAITS UNTIL THE DEVICE IN INACTIVE AND THEN
\r
1437 , WRITES THE DUMPFILE AND RETURNS CONTROL TO THE USER'S PROGRAM
\r
1438 , WHEN IO HAS COMPLETED.
\r
1439 ,IF THE MODE IS NOT DUMP, THEN
\r
1440 ,1) IF ADR IS NOT ZERO, WAIT FOR DEVICE TO BECOME INACTIVE THEN SET THE
\r
1441 , CURRENT BUFFER ADDRESS EQUAL TO ADR AND AN INDICATOR (JBFADR0)
\r
1442 , SPECIFYING THAT THIS BUFFER RING HAS NEVER BEEN REFERENCED FROM THE
\r
1443 , USER'S PROGRAM BY AN INPUT OR AN OUTPUT UUO. OTHERWISE, GO TO
\r
1446 ,2) IF THE BUFFER RING HAS NEVER BEEN REFERENCED (JBFADR0=1), THE
\r
1447 , BUFFER IS CLEARED, IOUSE SET TO ZERO AND
\r
1448 , IF THE CURRENT BUFFER ADDRESS IS ZERO, A TWO BUFFER RING IS SET UP.
\r
1451 ,3) IF THE BUFFER RING HAS BEEN REFERENCED (JBFADR0=0 ,THEN A CHECK IS
\r
1452 , MADE TO DETERMINE IF THE WORD COUNT IS TO BE COMPUTED.
\r
1453 , IF THE WORD COUNT IS TO BE COMPUTED (IOWC=0), IT IS SET EQUAL
\r
1454 , TO THE ADDRESS FOR THE LAST DATA WORD MINUS THE ADDRESS OF THE
\r
1455 , BUFFER MINUS ONE.
\r
1457 ,4) IOUSE IS SET TO ONE, INDICATING THAT THE BUFFER IS FULL OR BEING
\r
1458 , EMPTIED, AND THE CURRENT BUFFER ADDRESS IS ADVANCED.
\r
1460 ,5) IF THE DEVICE IS NOT ACTIVE (IOACT=0), OUTPUT IS STARTED.
\r
1461 ,6) IF THE CURRENT BUFFER IS FULL OR BEING EMPTIED (IOUSE=1),
\r
1462 , THE PROGRAM WAITS UNTIL THE DEVICE FINISHES THE BUFFER
\r
1463 , (THE OUTPUT SERVICE ROUTINE CLEARS THE USE BIT WHEN
\r
1464 , IT FINISHES OUTPUTTING A BUFFER).
\r
1465 ,7) THE CURRENT BUFFER IS CLEARED.
\r
1466 ,8) THE ITEM POINTER IS INITIATED TO THE CURRENT BUFFER ADDRESS+1
\r
1467 , AND THE ITEM COUNT IS SET TO THE PRODUCT OF THE BUFFER SIZE
\r
1468 , MINUS ONE AND THE INTEGER PART OF 36/BYTE SIZE.
\r
1469 ,9) RETURN TO THE USER'S PROGRAM
\r
1470 \f;HERE ON OUTPUT UUO
\r
1471 EXTERNAL USRJDA,PIOMOD
\r
1473 UOUT: TLO DEVDAT,OUTPB ;SET OUTPUT UUO BIT
\r
1474 TLZ DEVDAT,OCLOSB ;CLEAR CLOSE OUTPUT BIT
\r
1476 ;HERE FROM DEVICE SERVICE ROUTINES ON CLOSE UUO
\r
1480 OUT: TLNN IOS,IO ;IS THIS DEVICE ALREADY DOING INPUT?
\r
1481 PUSHJ PDP,WAIT1 ;YES, WAIT TILL IT BECOMES INACTIVE
\r
1482 HLLM DEVDAT,USRJDA(UCHN);SAVE NEW BIT SETTINGS.
\r
1483 LDB TAC,PIOMOD ;GET DATA MODE SET BY INIT OR SETSTS.
\r
1484 CAIL TAC,SD ;IS IT DUMP MODE(SD,DR,D)?
\r
1486 PUSHJ PDP,OUTA ;NO, CHECK FOR NON-ZERO ADDRESS(USER
\r
1488 HLR JBUF,DEVBUF(DEVDAT) ;REL. ADDR. OF OUTPUT BUFFER HEADER
\r
1489 MOVEI AC1,2(JBUF) ;CHECK END OF 3 WORD HEADER
\r
1491 HRLI JBUF,PROG ;SET INDEX FIELD FOR RELOCATION.
\r
1492 SKIPG TAC1,@JBUF ; CHECK FIRST WORD OF BUFFER HEADER
\r
1493 JRST OUTF ;RING NOT SET UP OR FIRST REFERENCE TO RING
\r
1494 AOS JBUF ;COMPUTE WORD COUNT FROM BYTE POINTER
\r
1495 HRRZ TAC,@JBUF ;GET RH OF BYTE POINTER.
\r
1496 ADDI TAC1,1 ;REL. ADDR. OF 3RD WORD IN BUFFER.
\r
1498 SUB TAC,TAC1 ;DISTANCE FILLED BY USER.
\r
1500 TRNE IOS,IOWC ;DOES USER WANT SYSTEM TO COMPUTE WORD
\r
1501 ; COUNT FROM BYTE POINTER?
\r
1503 HRRZ AC1,TAC1 ;PROCEED ONLY IF ADDR. OF WORD COUNT IN BOUNDS
\r
1504 ADDI AC1,(TAC) ;FORM REL. ADR OF LAST WORD TO OUTPUT
\r
1506 HRRM TAC,@TAC1 ;YES, STORE WORD COUNT IN 3RD WORD OF BUFFER.
\r
1507 \fOUT2: SUBI JBUF,1 ;REL. ADDR. OF 1ST WORD IN HEADER
\r
1508 ; (POINTER TO CURRENT BUFFER).
\r
1509 SUBI TAC1,1 ;REL. ADDR. OF 2ND WORD IN BUFFER
\r
1510 ; (LINK TO NEXT BUFFER).
\r
1511 HRLZI TAC,IOUSE ;FLAG CURRENT BUFFER CONTAINS ACTIVE DATA.
\r
1513 HRRM TAC,@JBUF ;ADVANCE CURRENT BUFFER ADDRESS
\r
1514 MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE?
\r
1516 PUSHJ PDP,DOU(DSER) ;NO,START OUTPUT.
\r
1517 HLR JBUF,DEVBUF(DEVDAT) ;JBUF TO REL. ADDR. OF BUFFER HEADER
\r
1518 HRLI JBUF,PROG ;SET TO RELOCATE
\r
1519 MOVE TAC1,@JBUF ;TAC1 TO REL. ADDR. OF 2ND WORD OF BUFFER.
\r
1525 SKIPG @TAC1 ;HAS SERVICE ROUTINE EMPTIED NEXT BUFFER
\r
1526 ; YET (USE BIT = 0)?
\r
1527 PUSHJ PDP,WSYNC ;NO, WAIT.
\r
1528 JRST OUTS ;RETURN TO USER.
\r
1531 OUTF: SKIPE TAC1,@JBUF
\r
1535 HLR JBUF,DEVBUF(DEVDAT)
\r
1537 OUTF1: HRLZI TAC, IOUSE
\r
1538 ANDCAB TAC, @JBUF ;IOUSE:=0
\r
1539 HRRM TAC,DEVOAD(DEVDAT)
\r
1540 OUTS: HRRZ TAC,@JBUF ;CLEAR NEXT OUTPUT BUFFER.
\r
1541 PUSHJ PDP,BUFCLR ;BEING CLEARED.
\r
1542 JRST ADRERR ;ADDRESS CHECK
\r
1545 LDB ITEM,[POINT 17,@TAC1,17]
\r
1548 ; JBFCTR:=(BUFFER SIZE-1)*[36/BYTE
\r
1550 ; RETURN TO USER'S PROGRAM
\r
1552 OUTDMP: PUSHJ PDP,WSYNC
\r
1553 PUSHJ PDP,DDO(DSER)
\r
1554 JRST WAIT1 ;WAIT BEFORE RETURNING TO USER
\r
1556 ,CALLING SEQUENCE:
\r
1558 , EXIT ALWAYS RETURNS HERE
\r
1559 ,IF THE ADDRESS FIELD OF AC UUO IS ZERO,EXIT. OTHERWISE,CHECK IOACT.
\r
1560 ,IF IOACT=1, WAIT FOR IOACT=0.
\r
1561 ,SET JBFADR18-35:=ADDRESS FIELD OF AC UUO. JBFADR0:=1 AND EXIT.
\r
1564 OUTA: TRNN UUO,777774 ;IS BUFFER ADDRESS SPECIFIED?
\r
1567 HLR JBUF,DEVBUF(DEVDAT)
\r
1570 HRRM UUO,DEVOAD(DEVDAT)
\r
1574 \f,RELEASE A DEVICE
\r
1576 INTERNAL RELEA1,RELEA2,RELEA3,RELEA5,RELEA6,RELEA9
\r
1577 EXTERNAL USRJDA,USRHCU,CPOPJ,SYSTAP,STUSER,STREQ,STAVAL,PJOBN,IADPTR
\r
1581 RELEA1: TRZ UUO,-1 ;CLOSE BOTH INPUT AND OUTPUT
\r
1583 PUSHJ PDP,WAIT1 ;WAIT FOR DEVICE TO BECOME INACTIVE
\r
1584 RELEA5: PUSHJ PDP,DRL(DSER) ;DISPATCH TO DEVICE SERVICE ROUTINE
\r
1585 MOVEI IOS,IOACT ;CLEAR IO ACTIVE BIT
\r
1586 ANDCAB IOS,DEVIOS(DEVDAT) ;AND RETURN WITH IOS SET
\r
1587 LDB TAC1,IADPTR ;GET COUNT OF NO OF CHANS DEVICE ON(IF DTA)
\r
1588 SOS TAC1 ;COUNT DOWN BY ONE
\r
1589 MOVE TAC,DEVMOD(DEVDAT)
\r
1590 TLNE TAC,DVDTA ;DEVICE A DTA?
\r
1591 DPB TAC1,IADPTR ;YES, STORE UPDATED COUNT
\r
1592 SETZB DAT,USRJDA(UCHN) ;CLEAR DEVICE ASSIGNMENT
\r
1593 MOVE TAC,USRHCU ;HIGHEST IO CHANNEL IN USE
\r
1594 RELEA4: HRRZ TAC1,USRJDA(TAC)
\r
1595 JUMPN DAT,RELE4A ;NON-ZERO CHAN. ALREADY?
\r
1596 MOVE DAT,TAC1 ;NO, SET DAT WHEN FIRST(HIGHEST) FOUND
\r
1597 MOVEM TAC,USRHCU ;STORE HIGHEST IN USE CHANNEL
\r
1598 RELE4A: CAIE TAC1,(DEVDAT) ;IS THIS DEVICE SAME AS ONE BEING RELEASED?
\r
1600 JUMPGE TAC,CPOPJ ;EXIT IF ON ANOTHER CHANNEL
\r
1601 HLLZS DEVIAD(DEVDAT) ;CLEAR INPUT BUFFER ADDRESS
\r
1602 HLLZS DEVOAD(DEVDAT) ;AND OUTPUT BUFFER ADDRESS.
\r
1603 \f;CALLED FROM ERROR STOP ROUTINE(ESTOP)
\r
1604 RELEA9: MOVE TAC,DEVNAM(DEVDAT) ;IS THIS SYSTEM TAPE?
\r
1605 CAME TAC,[SIXBIT /DSK/] ;DSK IS NEVER QUEUED
\r
1607 JRST RELEA7 ;IS DISK OR NOT SYSTEM TAPE
\r
1608 SKIPN STUSER ;HAS COUNT ALREADY BEEN REDUCED AT ESTOP?
\r
1610 SETZM STUSER ;YES, CLEAR SYSTEM USER NO.
\r
1611 SOSL STREQ ;YES, REDUCE COUNT
\r
1612 SETOM STAVAL ;SOMEONE IS WAITING, SET AVAILABLE FLAG/
\r
1613 RELEA7: MOVEI TAC1,ASSPRG ;CLEAR ASSIGNED BY PROGRAM BIT
\r
1614 RELEA6: ANDCAB TAC1,DEVMOD(DEVDAT) ;CALLED FROM DEASSIGN
\r
1615 TRZ TAC1,777 ;CLEAR JOB NO. FIELD
\r
1618 TDNN TAC1,[XWD TTYATC,ASSCON+ASSPRG]
\r
1619 DPB TAC1,PJOBN ;CLEAR JOB NUMBER IF ALL 3 BITS OFF
\r
1620 POPJ PDP, ;IE ASSIGNED BY CONSOLE,PROGRAM, OR
\r
1622 IFN FTDISK,<EXTERNAL CLRDDB,IPOPJ
\r
1623 TDNE TAC1,[XWD TTYATC,ASSCON+ASSPRG]
\r
1624 POPJ PDP, ;DEVICE ASSIGNED BY OTHER MEANS TOO
\r
1625 DPB TAC1,PJOBN ;CLEAR JOB NUMBER
\r
1626 PUSH PDP,ITEM ;SAVE JOB NO.
\r
1627 TLNE TAC1,DVDSK ;IS DEVICE A DSK
\r
1628 PUSHJ PDP,CLRDDB ;YES-RETURN DDB TO STORAGE
\r
1629 JRST IPOPJ ;RESTORE JOB NO. & RETURN.
\r
1634 , EXIT1 ALL SELECTED BITS ARE 0
\r
1635 , EXIT2 SOME SELECTED BITS ARE 1
\r
1636 ,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S CHANNEL D WHICH
\r
1637 ,ARE SELECTED BY MASK.
\r
1641 USTATO: TRNE IOS,(UUO) ;SKIP IF ANY INDICATED BITS ARE ONE
\r
1643 POPJ PDP, ;RETURN TO USER
\r
1648 , EXIT ALWAYS RETURNS HERE
\r
1649 ,STORES I/O STATUS WORD OF DEVICE ON CHANNEL D IN LOCATION ADR.
\r
1655 USTATS: HRRZ TAC,IOS ;GET USER HALF OF IOS.
\r
1656 JRST STOTAC ;ADDRESS CHECK AND STORE IN USER AREA
\r
1661 , EXIT1 SOME SELECTED BITS ARE 1
\r
1662 , EXIT2 ALL SELECTED BITS ARE 0
\r
1664 ,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S
\r
1665 ,CHANNEL D WHICH ARE SELECTED BY MASK.
\r
1669 USTATZ: TRNN IOS,(UUO) ;SKIP IF ALL INDICATED BITS ARE ZERO
\r
1671 POPJ PDP, ;RETURN TO USER
\r
1672 \f;IN UUO - LIKE INPUT SKIPS IF EOF OR ERRORS
\r
1676 TIN: PUSHJ PDP,IN ;DO INPUT UUO
\r
1677 TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM+IODEND
\r
1682 ;OUT UUO - LIKE OUTPUT - SKIPS IF ERRORS
\r
1686 TOUT: PUSHJ PDP,UOUT ;DO OUTPUT UUO
\r
1687 TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM
\r
1692 ;5 UUOS FOR EACH INSTALLATION TO DEFINE
\r
1696 \fSUBTTL IOCSS - COMMON IO SUBROUTINES
\r
1698 ;ROUTINE TO ADVANCE OUTPUT BUFFER AT INTERRUPT LEVEL
\r
1700 ;CALL: PUSHJ PDP,ADVBFE
\r
1701 , EXIT1 RETURN IF NEXT BUFFER IS EMPTY
\r
1702 , EXIT2 RETURN IF NEXT BUFFER IS FULL
\r
1703 ,CLEARS THE USE BIT (IOUSE:=0) OF THE BUFFER POINTED TO BY THE
\r
1704 ,OUTPUT BUFFER ADDRESS (DEVOAD) OF THE CURRENT DEVICE DATA BLOCK
\r
1705 ,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.
\r
1706 ,UPON RETURN, SKIPS IF THE NEXT BUFFER IS FULL.
\r
1707 ;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO
\r
1708 ;MAKE SURE IT IS NOT IN JOB DATA AREA OR ABOVE USER AREA
\r
1709 ;THE SECOND WORD OF CURRENT BUFFER WAS CHECKED AT UUO LEVEL
\r
1710 ;OR PREVIOUS CALL TO ADVBFE
\r
1712 INTERNAL ADVBE1,ADVBFE
\r
1713 EXTERNAL XJBPFI,CPOPJ
\r
1715 ADVBFE: MOVEI TAC1,@DEVOAD(DEVDAT) ;ABS. ADR. OF 2ND WORD OF LAST BUF.
\r
1716 JUMPE TAC1,CPOPJ ;HAS DEVOAD BEEN CLEARED BY RELEASE?
\r
1717 MOVEM IOS,-1(TAC1) ;NO. STORE IO STATUS WORD(ERROR BITS)
\r
1718 ; IN FIRST WORD OF BUFFER
\r
1719 MOVSI TAC,IOUSE ;IOUSE:=0
\r
1720 ANDCAB TAC,(TAC1) ;CLEAR USE BIT IN 2ND WORD
\r
1721 ; ADRESS CHECKED WHEN STORED IN DEVOAD
\r
1722 ; DEVICE ACTIVE SINCE THEN
\r
1723 HRLZ TAC,TAC ;NEXT BUFFER ADR. TO LH
\r
1724 CAMLE TAC,XJBPFI ;IS IT IN IO PROTECTED PART OF JOB DATA AREA?
\r
1725 CAML TAC,PROG ;NO, IS IT GREATER OR EQUAL TO LAST WORD IN USER AREA?
\r
1726 POPJ PDP, ;YES, DO NOT STORE NEXT ADDRESS
\r
1727 ; CATCH ERROR LATER AT UUO LEVEL
\r
1728 HLRM TAC,DEVOAD(DEVDAT) ;NOW SAFELY STORE NEXT BUFFER ADRESS
\r
1730 ;ENTER HERE FROM SCNSER TO CHECK IF NEXT BUFFER FULL OF DATA YET
\r
1732 ADVBE1: SKIPL @DEVOAD(DEVDAT) ;IS IOUSE=0?
\r
1733 POPJ PDP, ;EXIT1. BUFFER IS EMPTY
\r
1734 JRST ADVBF1 ;GO SEE IF USER TYPED CONTROL C
\r
1735 ; OR EXEC IS WAITING TO SHUFFLE JOB
\r
1737 ;ROUTINE TO ADVANCE INPUT BUFFER AT INTERRUPT LEVEL
\r
1739 ;CALL: PUSHJ PDP,DEVBFF
\r
1740 , EXIT1 RETURN IF NEXT BUFFER IS FULL
\r
1741 , EXIT2 RETURN IF NEXT BUFFER IS EMPTY
\r
1742 ,SETS THE USE BIT (IOUSE:=1) OF THE BUFFER POINTED TO BY THE
\r
1743 ,INPUT BUFFER ADDRESS (DEVIAD) OF THE CURRENT DEVICE DATA BLOCK
\r
1744 ,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.
\r
1745 ,UPON RETURN, SKIPS IF THE NEXT BUFFER IS EMPTY.
\r
1746 ;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO MAKE SURE
\r
1747 ;IT IS NOT IN IO PROTECTED PART OF JOB DATA AREA OR ABOVE
\r
1749 ;ALSO END OF BUFFER IS CHECKED TO MAKE SURE NOT ABOVE JOB AREA
\r
1752 EXTERNAL XJBPFI,PJOBN,JBTSTS,CPOPJ
\r
1754 ADVBFF: MOVEI TAC1,@DEVIAD(DEVDAT) ; ABS. ADR. OF LAST INPUT BUFFER
\r
1755 JUMPE TAC1,CPOPJ ;HAS DEVIAD BEEN CLEARED BY RELEASE?
\r
1756 MOVEM IOS,-1(TAC1) ;NO. STORE IOS WORD IN FIRST WORD OF BUF.
\r
1757 MOVSI TAC,IOUSE ;IOUSE:=1
\r
1758 IORB TAC,(TAC1) ;FLAG THAT DATA HAS BEEN INPUT
\r
1759 HRLZ TAC,TAC ;NEXT BUFFER TO LEFT HALF
\r
1760 CAMLE TAC,XJBPFI ;IS ADR. IN PROT. PART OF JOB DATA AREA?
\r
1761 CAML TAC,PROG ;NO, WILL SECOND AND THIRD WORD FIT?
\r
1762 POPJ PDP, ;NO, GIVE ERROR RETURN SO DEVICE WILL STOP
\r
1763 HLRM TAC,DEVIAD(DEVDAT) ;YES, SAFELY STORE ADDRESS OF NEXT BUFFER
\r
1764 SKIPGE TAC1,@DEVIAD(DEVDAT) ;IS NEXT INPUT BUFFER STILL FULL?
\r
1765 POPJ PDP, ;YES, GIVE STOP RETURN
\r
1766 TRZ TAC1,-1 ;XWD LENGTH OF BUFFER,0
\r
1767 ADD TAC,TAC1 ;ADD LENGTH TO REL. ADR. OF SECOND WORD
\r
1768 ; LENGTH=NO. WORDS WHICH FOLLOW SECOND
\r
1769 CAMLE TAC,PROG ;IS LAST WORD IN BOUNDS?
\r
1770 POPJ PDP, ;NO, GIVE STOP RETURN
\r
1771 ADVBF1: LDB TAC,PJOBN ;GET JOB NO. FROM DEVICE DATA BLOCK
\r
1772 SKIPGE TAC,JBTSTS(TAC) ;IS RUN BIT ON IN JOB STATUS WORD
\r
1773 TLNE TAC,SHF+CMWB ;YES, SYSTEM WAITING TO SHUFFLE,
\r
1774 ; EXECUTE A COMMAND, OR TO SWAP JOB OUT?
\r
1775 ; SHF SET BY SWAPPER TO STOP IO IF IT WANTS TO SWAP JOB OUT
\r
1776 ; 2 RELOC REG SOFTWARE DOES NOT SET SHF IN LOW SEG
\r
1777 ; IF JOB HAS 2 SEG, SINCE HIGH SEG CAN BE
\r
1778 ; SWAPPED EVEN THOUGH ACTIVE IO IN LOW SEG.
\r
1779 ; THUS A LIMITED FORM OF MONITOR BUFFERING IS ACHIEVED
\r
1780 POPJ PDP, ;YES,PRETEND NEXT BUFFER NOT AVAILABLE
\r
1781 TRNN IOS,IOCON ;NEXT BUFFER AVAILABLE. DISCONTINUOUS MODE?
\r
1785 ;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY
\r
1786 ;CALL HRRZ AC1,REL ADR.
\r
1787 ; PUSHJ PDP,UADCK1
\r
1788 ; NEVER RETURNS IF ERROR,STOPS JOB AND PRINTS ERROR
\r
1789 ;BAD ADR. IF IN LOC 20-JOBPFI IN JOB DATA AREA
\r
1790 ;OR IF ABOVE PROTECTION(USRREL) FOR CURRENT JOB
\r
1793 EXTERNAL USRREL,JOBPFI
\r
1795 UADCK1: TRNN AC1,777760 ;IN USER ACS?
\r
1796 POPJ PDP, ;YES, ADDRESS IS OK
\r
1798 ;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY
\r
1799 ;USER ACS ARE ALSO ILLEGAL(ADR IS FOR IO USE LATER AT
\r
1801 ;CALL: HRRZ AC1,REL.ADR.
\r
1802 ; PUSHJ PDP,UADRCK
\r
1803 ; NEVER RETURN IF ERROR
\r
1806 EXTERNAL USRREL,JOBPFI
\r
1808 UADRCK: CAILE AC1,JOBPFI ;IS ADR. IN IO PROT. PART OF JOB DATA AREA?
\r
1809 CAMLE AC1,USRREL ;NO, IS IT ABOVE PROTECT.?
\r
1810 JRST ADRERR ;YES, STOP JOB AND PRINT ERROR
\r
1813 ;ROUTINE TO ADDRESS CHECK AT ANY LEVEL
\r
1814 ;CALL: MOVE PROG,[XWD PROT.,RELOC,]
\r
1815 ; HRRZ TAC,REL. ADR.
\r
1816 ; PUSHJ PDP,IADRCK
\r
1817 ; ERROR RETURN(ERROR MESSAGE NOT PRINTED,JOB NOT STOPPED)
\r
1821 EXTERNAL JOBPFI,CPOPJ1
\r
1823 IADRCK: MOVS TAC1,PROG ;GET PROTECTION(TO RH)
\r
1824 CAILE TAC,JOBPFI ;ADR. ABOVE PROT. PART OF JOB DATA AREA?
\r
1825 CAILE TAC,(TAC1) ;YES, BELOW OR EQUAL TO PROTECT.?
\r
1827 JRST CPOPJ1 ;YES, SKIP RETURN
\r
1829 ;ROUTINE TO CHECK VALIDITY OF A DUMP MODE COMMAND LIST
\r
1831 ;A LIST OF 0 OR MORE IOWD FORMAT WORDS
\r
1832 ; TERMINATED BY A GOTO WORD(LH=0)
\r
1833 ; WHICH POINTS TO ANOTHER LIST OF 0 OR MORE IOWD FORMAT WORDS ETC.
\r
1834 ; UNTIL A GOTO WORD IS ENTIRELY ZERO
\r
1836 ;SINCE MONITOR DOES NOT RESCHEDULE WHEN IN EXEC MODE
\r
1837 ;A MAXIMUM LIST OF 100 IS IMPOSED
\r
1839 ;CALL: MOVE UUO,[XWD PROG,REL. ADR. OF FIRST COMMAND]
\r
1840 ; PUSHJ PDP,COMCHK
\r
1841 ; ADDRESS CHECK RETURN(ERROR ROUTINE IS NOT CALLED)
\r
1842 ; OK RETURN, SUM OF LH OF IOWDS IN DAT
\r
1843 ; USER ADDRESS OF FIRST IOWD LH PROG IN INDEX FIELD IN UUO
\r
1847 EXTERNAL JOBPFI,USRREL,TPOPJ1,USRHCU
\r
1849 COMCHK: PUSH PDP,UUO ;SAVE POINTER TO LIST
\r
1851 MOVEI AC1,JOBPFI ;HIGHEST IO PROTECTED LOC. IN JOB DATA AREA
\r
1852 SKIPGE USRHCU ;IS A SAVE OR GET IN PROGRESS(MAYBE RUN UUO)
\r
1853 MOVEI AC1,JOBSAV ;YES, HIGHEST LOC. NOT WRITTEN BY SAVE
\r
1854 SETZB DAT,AC2 ;CLEAR WORD COUNT AND ADDRESS OF FIRST IOWD
\r
1855 MOVEI ITEM,100 ;ONLY 100 LISTS
\r
1856 SKIPA TAC1,UUO ;CHECK THE START OF LIST.
\r
1857 COMCK0: HRR UUO,TAC1 ;CHANGE COMMAND LIST POINTER ON GO TO WORD
\r
1858 HRRZ TAC,TAC1 ;SET UP TAC FOR IADRCK
\r
1859 TRNN TAC,777760 ;IS LIST IN THE ACS?
\r
1860 JRST COMCK1 ;YES. THAT'S OK.
\r
1862 JRST COMCKE ;BAD ADDR.
\r
1863 COMCK1: SOJLE ITEM,COMCKE ;EXCEEDED 100 YET?
\r
1864 SKIPN TAC1,@UUO ;NO. GET NEXT IOWD. END OF LIST?
\r
1866 JUMPG TAC1,COMCK0 ;NO. IS IT A GO TO WORD?
\r
1867 HLRE TAC,TAC1 ;NO. SAVE NEGATIVE WORD COUNT
\r
1868 HRRZS TAC1 ;GET LOWEST ADDRESS-1
\r
1869 CAMGE TAC1,AC1 ;IS IT GREATER THAN LOC. PROTECTED
\r
1870 ; FROM IO IN JOB DATA AREA?
\r
1871 JRST COMCKE ;NO. ERROR RETURN
\r
1872 SUB TAC1,TAC ;YES. COMPUTE LAST LOC.
\r
1873 CAMLE TAC1,USRREL ;IS LAST LOC. IN BOUNDS?
\r
1874 JRST COMCKE ;NO. ERROR RETURN
\r
1875 SUB DAT,TAC ;YES. ACCUMULATE NEG. WORD COUNT
\r
1876 SKIPN AC2 ;IS THIS THE FIRST IOWD?
\r
1877 MOVE AC2,UUO ;YES. SAVE ADDRESS IN AC2
\r
1878 AOJA UUO,COMCK1 ;GO GET NEXT IOWD
\r
1879 \fCOMCK2: SKIPE AC2 ;ARE THERE ANY IOWDS WITH LH NOT 0?
\r
1880 MOVE UUO,AC2 ;YES, POINT UUO TO FIRST SUCH IOWD.
\r
1882 JRST TPOPJ1 ;REMOVE SAVED UUO AND SKIP RETURN
\r
1885 COMCKE: POP PDP,AC2
\r
1886 POP PDP,UUO ;RESTORE ORIGINAL UUO
\r
1887 POPJ PDP, ;ERROR RETURN
\r
1888 \fINTERNAL ASSASG,FTDISK
\r
1889 EXTERNAL SCNON,SCNOFF,PJOBN
\r
1891 ;ASSIGN DEVICE IF UNASSIGNED
\r
1892 ;CALL: MOVE ITEM, JOB NUMBER
\r
1893 ; MOVE DEVDAT, ADDR. OF DDB
\r
1894 ; MOVEI TAC1, EITHER ASSPRG OR ASSCON
\r
1895 ; PUSHJ PDP, ASSASG
\r
1896 ; CAN'T ASSIGN RETURN
\r
1900 ASSASG: IFN FTDISK,<EXTERNAL SETDDB
\r
1901 MOVE TAC,DEVMOD(DEVDAT) ;IS IT A DISK?
\r
1903 PUSHJ PDP,SETDDB ;YES, BUILD DEVICE DATA BLOCK
\r
1905 NOSCHEDULE ;DISABLE SCHEDULING
\r
1906 LDB TAC,PJOBN ;GET JOB NUMBER IN DEV DATA BLOCK
\r
1907 CAMN TAC,ITEM ;IS IT ALREADY ASSIGNED TO THIS JOB
\r
1909 MOVEI TAC, ASSPRG+ASSCON ;NO, IS IT ASSIGNED TO ANOTHER JOB?
\r
1910 CONO PI,SCNOFF ;TURN SCANNER OFF
\r
1911 TDNE TAC, DEVMOD(DEVDAT) ;ARE EITHER ASSIGNED BITS SET?
\r
1913 DPB ITEM,PJOBN ;NO, STORE JOB NUMBER
\r
1914 ASSAS1: IORM TAC1,DEVMOD(DEVDAT) ;SET ONE OF ASSIGN BITS
\r
1916 ASSAS2: CONO PI,SCNON ;TURN SCANNER CHAN. BACK ON
\r
1917 SCHEDULE ;SCHEDULING
\r
1919 \f;ROUTINE TO SEARCH FOR A DEVICE
\r
1920 ;CALL: HRR ITEM,JOB NUMBER
\r
1921 ; MOVE TAC,[SIXBIT .DEVICE NAME.]
\r
1922 ; PUSHJ PDP, DEVSRC
\r
1926 INTERNAL DEVLG,DEVSRC,DEVPHY
\r
1927 EXTERNAL SYSTAP,DEVOPR,TTYFND,CPOPJ1,DEVLST,PJOBN,GETDDB
\r
1931 MOVSI DEVDAT,JLOG ;DO NOT ALLOW LOGICAL NAMES IF THE JOB IS NOT
\r
1932 ; NOT LOGGED IN OR IS IN THE PROCESS OF BEING LOGGED OUT
\r
1933 TDNE DEVDAT,JBTSTS(ITEM) ;OTHERWISE USER CAN RUN OWN LOGOUT PROGRAM
\r
1934 ; JLOG SET TO 0 IN COMMAND DECODER ON KJOB
\r
1936 PUSHJ PDP, DEVLG ;SEARCH LOGICAL NAMES FIRST
\r
1937 JRST DEVPHY ;NOT FOUND, SEARCH PHYSICAL NAMES
\r
1938 JRST CPOPJ1 ;FOUND
\r
1940 ;SEARCH LOGICAL NAMES
\r
1942 DEVLG: HLRZ DEVDAT,DEVLST ;BEGINNING OF DDB CHAIN
\r
1943 DEVLP0: CAME TAC,DEVLOG(DEVDAT) ;COMAPRE WITH LOGICAL NAME
\r
1944 JRST DEV0 ;NO MATCH
\r
1945 LDB TAC1,PJOBN ;DOES THE LOGICAL NAME BELONG TO THIS JOB?
\r
1947 JUMPN TAC,CPOPJ1 ;YES, GIVE SUCCESSFUL RET. IF NAME NOT 0
\r
1948 DEV0: HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, KEEP LOOKING
\r
1949 JUMPN DEVDAT,DEVLP0
\r
1950 POPJ PDP, ;FINISHED AND NOT FOUND
\r
1952 ;SEARCH PHYSICAL NAMES
\r
1954 DEVPHY: CAMN TAC,[SIXBIT /OPR/] ;IS IT "OPR"?
\r
1955 MOVE TAC,DEVOPR ;YES, CHANGE TO OPERATOR'S TTY
\r
1956 CAMN TAC,[SIXBIT /SYS/] ;IS IT "SYS"?
\r
1957 SKIPA TAC,SYSTAP ;YES, CHANGE TO SYSTEM TAPE DEVICE NAME
\r
1958 TDZA TAC1,TAC1 ;NO, CLEAR SYSTEM TAPE FLAG
\r
1959 MOVEI TAC1,SYSDEV ;YES, SET SYSTEM TAPE FLAG
\r
1960 HLRZ DEVDAT,DEVLST ;SEARCH DEVICE DATA BLOCKS
\r
1962 TLO DEVDAT,(TAC1) ;SET SYSTEM TAPE BIT IF SEARCHING FOR SYS
\r
1963 CAMN TAC,DEVNAM(DEVDAT) ;MATCH OF PHYSICAL NAME?
\r
1964 JUMPN TAC,CPOPJ1 ;YES, GIVE OK RET. IF NAME IS NOT 0
\r
1965 HLRZ DEVDAT,DEVSER(DEVDAT)
\r
1966 JUMPN DEVDAT,DEVLP1
\r
1967 CAME TAC,[SIXBIT /TTY/] ;IS THIS PUBLIC LOGICAL NAME TTY?
\r
1968 JRST GETDDB ;SEE IF IT'S A TTY.
\r
1969 PUSH PDP,DAT ;SAVE OUTPUT BYTE POINTER(TTY) OR INIT. ARG. ADR.
\r
1970 PUSHJ PDP,TTYFND ;YES, FIND TTY JOB IS ATTACHED TO
\r
1971 POP PDP,DAT ;RESTORE
\r
1972 JRST CPOPJ1 ;AND GIVE SUCCESSFUL RETURN
\r
1973 \f;ROUTINE TO SETUP N-RING IO BUFFER IN USER AREA
\r
1975 ;CALL: PUSHJ PDP,BUFCLC
\r
1976 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED
\r
1977 , SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM, WHERE N
\r
1978 , IS IN THE ADDRESS FIELD OF AC UUO.
\r
1979 , THE BUFFER RING FORMAT IS AS FOLLOWS:
\r
1980 , LOCATION LH CONTENTS RH
\r
1981 , C(JOBFF) + 1 BUFFER C(JOBFF) +1
\r
1982 , + 0(BUFFER SIZE+2) SIZE + 1(BUFFER SIZE+2)
\r
1983 , C(JOBFF) +1 BUFFER C(JOBFF) +1
\r
1984 , +1(BUFFER SIZE+2) SIZE + 2(BUFFER SIZE+2)
\r
1988 , C(JOBFF) + 1 BUFFER C(JOBFF) + 1
\r
1989 , + (N-2)(BUFFER SIZE+2) SIZE +(N-1)(BUFFER SIZE+2)
\r
1990 , C(JOBFF) + 1 BUFFER C(JOBFF) + 1
\r
1991 , + (N-1)(BUFFER SIZE+2) SIZE
\r
1992 ,THEN SET BUFPNT:=IOUSE,C(JOBFF) + 1
\r
1993 , AND JOBFF:=C(JOBFF) + N(BUFFER SIZE + 2)
\r
1994 , BUFWRD IS RESTORED.
\r
1998 BUFCLC: PUSH PDP,BUFWRD ;SAVE BUFWRD ON STACK
\r
1999 LDB TAC,[POINT 12,DEVCHR(DEVDAT),35];TAC:=BUFFER SIZE
\r
2000 HRRZ BUFPNT,JOBFF(PROG) ;BUFPNT:=FIRST FREE LOCATION + 1
\r
2002 HRRZ BUFWRD,BUFPNT
\r
2004 HRL BUFWRD,TAC ;BUFWRD:=BUFFER SIZE,FIRST FREE LOC + 1
\r
2005 ADDI TAC,2 ;TAC:=BUFFER SIZE + 2
\r
2006 HRRZ TAC1,UUO ;TAC1:=N=ADDRESS FIELD OF AC UUO
\r
2007 HRRZ AC1,TAC ;BUFFER SIZE+2
\r
2008 IMUL AC1,TAC1 ;TIME NO. OF BUFFERS
\r
2009 ADD AC1,BUFWRD ;LOC. OF FIRST BUFFER
\r
2010 HRRZ AC1,AC1 ;MAKE SURE POSITIVE
\r
2011 CAMG AC1,USRREL ;WILL THIS SPACE FIR IN USER CORE?
\r
2012 JRST BUFC1 ;YES, FO DO INBUF CODE
\r
2013 ; NO, AUTOMATICALLY EXPAND SIZE OF USER CORE
\r
2014 \f PUSH PDP,TAC ;SAVE A BUNCH OF ACS USED IN CORE AND IO WAIT
\r
2021 MOVE ITEM,JOB ;CURRENT JOB NUMBER
\r
2022 MOVE TAC,AC1 ;HIGHEST USER ADR. TO TRY FOR
\r
2023 MOVEI UUO,UUO ;SET INDEX FIELD TO 0, SO STOTAC WILL STORE
\r
2024 ; NO. OF K CORE AVAILABLE IN EXEC AC UUO INSTEAD
\r
2025 ; OF USER'S AC UUO
\r
2026 PUSHJ PDP,CORUUO ;TRY TO ASSIGN CORE
\r
2027 JFCL ;ERROR RETURN-LET ADR CHECK HAPPEN AND STOP JOB
\r
2035 BUFC1: ADD BUFWRD,TAC ;BUFWRD:=C(BUFWRD) + C(TAC)
\r
2036 HRRZ AC1,BUFPNT ;IS LAST ADDR IN BOUNDS?
\r
2038 MOVEM BUFWRD,@BUFPNT ;BUFFER HEADER+1:=C(BUFWRD)
\r
2039 HRR BUFPNT,BUFWRD ;BUFPNT 18-35:=C(BUFWRD 18-35)
\r
2040 SOJG TAC1,BUFC1 ;N:=N-1. IS N GR 0?
\r
2041 HRR BUFWRD,JOBFF(PROG)
\r
2043 MOVEI AC1,-2(BUFPNT) ;CHECK LAST ADR. OF HEADER
\r
2046 MOVEM BUFWRD,@BUFPNT ;LINK LAST BUFFER TO FIRST BUFFER
\r
2047 ADDI BUFPNT,-1(TAC)
\r
2048 HRRM BUFPNT,JOBFF(PROG) ;JOBFF:=C(JOBFF)+1+N(BUFFER SIZE+2)
\r
2049 HRR BUFPNT,BUFWRD ;BUFPNT:=IOUSE,ADDRESS OF FIRST BUFFER
\r
2052 POP PDP,BUFWRD ;RESTORE BUFWRD FROM STACK.
\r
2054 \f;ROUTINE TO CLEAR IO BUFFER IN USER AREA
\r
2055 ;CALLED AT INTERRUPT AND UUO LEVEL
\r
2057 ;CALL: HRRZ TAC,REL. ADR. OF 2ND WORD OF USER BUFFER
\r
2058 ; PUSHJ PDP,BUFCLR
\r
2059 ; ERROR RETURN MEMORY EXCEEDED
\r
2060 , EXIT RETURNS HERE IF MEMORY NOT EXCEEDED
\r
2061 , CLEARS THE WORD COUNT AND DATA AREA OF THE BUFFER WHOSE ADDRESS
\r
2062 , IS IN TAC 18-35.
\r
2065 EXTERNAL TPOPJ,CPOPJ1
\r
2067 BUFCLR: PUSHJ PDP,IADRCK ;IN BOUNDS?
\r
2068 POPJ PDP, ;NO. ERROR RETURN
\r
2070 PUSH PDP,TAC ;SAVE FIRST BUFFER ADR.
\r
2071 HLRZ TAC1,@TAC ;TAC1 18-35=SIZE
\r
2073 ADD TAC,TAC1 ;LAST ADR=2ND ADR+SIZE
\r
2074 TLZ TAC,-1 ;CLEAR LEFT HALF
\r
2075 PUSHJ PDP,IADRCK ;LAST ADDRESS IN BOUNDS?
\r
2076 JRST TPOPJ ;NO. ERROR RETURN
\r
2077 HRLI TAC,PROG ;SET LAST ADR. FOR RELOC.
\r
2078 POP PDP,TAC1 ;RESTORE FIRST ADR.
\r
2079 NOSHUFF ;NO SHUFFLING
\r
2080 MOVEI TAC1,@TAC1 ;ABS. ADR. OF 2ND WORD OF BUFFER
\r
2082 AOBJN TAC1,.+1 ;THIRD WORD IN BUFFER
\r
2083 SETZM (TAC1) ;CLEAR THIRD WORD
\r
2084 AOS TAC1 ;SET DEST. ADR. TO 4TH WORD
\r
2085 BLT TAC1,@TAC ;CLEAR BUFFER
\r
2086 SHUFFLE ;SHUFFLING
\r
2087 JRST CPOPJ1 ;SUCESSFUL RETURN
\r
2089 ;ROUTINE TO COMPUTE 12 BIT FOLDED CHECKSUM
\r
2091 ;CALL: PUSHJ PDP,CKS12
\r
2092 , EXIT ALWAYS RETURNS HERE
\r
2093 ,CALCULATES FOLDED 12 BIT CHECKSUMS OF THE DATA WORDS IN THE
\r
2094 ,BUFFER WHOSE ADDRESS IS IN AC TAC1. TWO ALGORITHMS ARE USED.
\r
2095 ,ON RETURN, THE LEFT HALF OF AC TAC CONTAINS A CHECKSUM OBTAINED
\r
2096 ,BY ACCUMULATING, IN ONE'S COMPLEMENT, THE DATA WORDS AND FOLDING IT.
\r
2097 ,THE LEFT HALF OF AC DAT CONTAINS A CHECKSUM OBTAINED BY ACCUMULATING,
\r
2098 ,IN TWO'S COMPLEMENT, THE DATA WORDS AND FOLDING IT. AC TAC1
\r
2103 CKS12: ADD TAC1,PROG ;TAC1:=-WORD COUNT,ADDRESS OF FIRST DATA WORD
\r
2109 CLEARM TAC ;INITIALIZE TWO'S COMPLEMENT SUM
\r
2110 CKS12A: ADD TAC,0(TAC1) ;TWO'S COMPLEMENT ADD
\r
2111 AOBJN TAC1,CKS12A ;DONE?
\r
2121 MOVEI TAC1,1 ;TAC1:=1
\r
2123 \f;ROUTINE TO CLEAR RESIDUE OF WORD POINTED TO BY A BYTE POINTER
\r
2125 ;CALL: PUSHJ PDP,CLRBYT
\r
2126 , EXIT ALWAYS RETURNS HERE
\r
2127 ,CALLED WITH A BYTE POINTER IN AC TAC, IT CLEARS THE REST OF THE
\r
2128 ,WORD POINTED TO BY THE BYTE POINTER.
\r
2132 CLRBYT: LDB TAC1,[POINT 6,TAC,5] ;TAC1:=P
\r
2133 DPB TAC1,[POINT 12,TAC,11] ;TAC 0-5:=0,TAC 6-12:=P
\r
2135 DPB TAC1,TAC ;CLEAR BITS 36-P THROUGH 35
\r
2138 ;ROUTINE TO PUT EVEN PARITY IN ( OR TAKE IT OUT OF ) BIT 28 OF
\r
2139 ;AC TEM. ASSUMING CHARACTER IS IN BITS 28-35 OF TEM, REST CLEAR.
\r
2140 ;TAC IS DESTROYED. CALLED FROM PTP AND TTY SERVICE ROUTINES
\r
2142 ;CALL: PUSHJ PDP,PEVEN8
\r
2143 ; EXIT HERE WITH TEM SET TO EVEN PARITY
\r
2147 PEVEN8: MOVE TAC,TEM ;COPY ORIGINAL CHARACTER
\r
2148 IMULI TAC,200401 ;MAKE THREE COPIES OF THE CHAR
\r
2149 AND TAC,[OCT 11111111] ;GET THE BITS INDIVIDUALLY
\r
2150 IMUL TAC,[OCT 11111111] ;ADD UP THE BITS
\r
2151 TLNE TAC,10 ;TEST THE PARITY OF THE SUM
\r
2152 TRC TEM,200 ;IT WAS ODD. MAKE IT EVEN.
\r
2153 POPJ PDP,0 ;RETURN
\r
2154 \f;ROUTINE TO RELEASE ALL DEVICES ASSIGNED TO JOB
\r
2160 IORELS: MOVEI TAC,RELEA3 ;RELEASE ALL IO DEVICES(DON'T CLOSE)
\r
2162 ;ROUTINE TO DO IO FOR ALL DEVICES ASSIGNED TO JOB
\r
2163 ;CALL MOVEI TAC,ADR. OF IO SUB.
\r
2165 ; RETURNS WITH ITEM=CURRENT JOB # ,UUO PRESERVED
\r
2168 EXTERNAL TPOPJ,USRHCU,USRJDA
\r
2170 IOALL: PUSH PDP,TAC ;SAVE ADR. OF SUB.
\r
2171 PUSH PDP,UUO ;SAVE UUO
\r
2172 SETZB UCHN,UUO ;START WITH USER CHANNEL 0
\r
2173 IOALL1: CAMLE UCHN,USRHCU ;IS IT GREATER THAN HIGHEST CHAN. USED?
\r
2174 JUMPN UCHN,IOALL2 ;YES - RETURN
\r
2175 ; IF USRCHU IS NEG - ASSUME SAVGET
\r
2176 ; WHICH USES CHANNEL 0
\r
2177 SKIPN DEVDAT,USRJDA(UCHN) ;GET NEXT DDB ADR., IS IT IN USE?
\r
2178 AOJA UCHN,IOALL1 ;NO, KEEP GOING
\r
2179 MOVE IOS,DEVIOS(DEVDAT)
\r
2181 MOVE DSER,DEVSER(DEVDAT) ;SETUP ADR. OF DEV. DISP. TABLE
\r
2182 LDB TAC,PJOBN ;GET JOB NUMBER WHICH JOB IS ASSIGNED TO
\r
2183 CAMN TAC,JOB ;IS IT SAME AS CURRENT JOB(SHOULD BE EXCEPT FOR 140
\r
2184 ; RESTART WHILE THIS JOB WAS SWAPPED OUT)
\r
2185 ; DEVICE DATA BLOCKS JOB NUMBERS ARE SET TO 0 ON
\r
2186 ; 140 RESTART,BUT THE JOB DATA AREA DEVICE ASSIGNMENTS
\r
2187 ; FOR SWAPPED OUT JOBS HAVE NOT
\r
2188 PUSHJ PDP,@-1(PDP) ;YES,CALL THE SUB.
\r
2189 AOJA UCHN,IOALL1 ;INCREMENT USER CHAN. NO.
\r
2190 IOALL2: POP PDP,UUO ;RESTORE UUO & RETURN RESTORING TAC TOO
\r
2191 MOVE ITEM,JOB ;GET JOB NO.
\r
2195 ;WAIT TILL ALL DEVICES ARE INACTIVE
\r
2199 IOWAIT: MOVEI TAC,WAIT1
\r
2202 ;KILL ALL DEVICES(RELEASE WITHOUT WAITING FOR DEVICE INACTIVE)
\r
2206 IOKILL: MOVEI TAC,RELEA5
\r
2207 PUSHJ PDP,IOALL ;RELEASE ALL DEVICES WITHOUT WAITING
\r
2209 ;ROUTINE TO CLEAR PROTECTED JOB DATA AREA IN MONITOR
\r
2210 ;AND RECLAIM FREE AREA ABOVE USER PROGRAM FOR IO BUFFERS
\r
2211 ;CALL: MOVE JDAT,ADR. OF CURRENT JOB DATA AREA
\r
2212 ; PUSHJ PDP,SETUSR
\r
2214 INTERNAL SETUSR,CLRUSR
\r
2215 EXTERNAL USRLO1,USRLO,USRHI,JOBSA,JOBFF
\r
2216 EXTERNAL JOBENB,USRHCU
\r
2218 SETUSR: HLRZ TAC,JOBSA(JDAT) ;RESET FIRST FREE LOC. FOR THIS JOB
\r
2219 MOVEM TAC,JOBFF(JDAT)
\r
2220 CLRUSR: SETZM JOBENB(JDAT) ;INITIALIZE APR TRAPPING (I.E., NONE)
\r
2221 MOVEI TAC,USRLO1 ;FIRST LOC+1 TO CLEAR
\r
2222 HRLI TAC,USRLO ;FIRST LOC.
\r
2225 SETZM USRHCU ;CLEAR HIGHEST USER IO CHAN. IN USE
\r
2228 ;ROUTINE TO FLAG DEVICE ACTIVE
\r
2229 ;CALL MOVE IOS,IO STATUS BITS
\r
2230 ; MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK
\r
2231 ; PUSHJ PDP,SETACT
\r
2232 ;CALLED BY ALL IO SERVICE ROUTINES AT UUO AND INTERRUPT LEVELS
\r
2234 INTERNAL SETACT,CLRACT,STOIOS,ORACT
\r
2235 EXTERNAL PDVTIM,PDVCNT
\r
2237 ORACT: TRO IOS,IOACT
\r
2238 IORB IOS,DEVIOS(DEVDAT)
\r
2240 SETACT: TRO IOS,IOACT
\r
2242 CLRACT: TRZ IOS,IOACT
\r
2243 STOIOS: MOVEM IOS,DEVIOS(DEVDAT)
\r
2244 ORACT1: LDB TAC,PDVTIM ;GET NO. OF SECONDS
\r
2245 DPB TAC,PDVCNT ;TO WAIT BEFORE
\r
2246 POPJ PDP, ;DEVICE IS CONSIDERED HUNG
\r
2249 EXTERNAL HNGTIM,HNGSEC,DEVLST
\r
2251 DEVCHK: MOVEI TAC,HNGSEC ;RESET HUNG DEVICE CHECK TIME
\r
2252 MOVEM TAC,HNGTIM ;TO CHECK ONCE A SECOND
\r
2253 HLRZ DEVDAT,DEVLST
\r
2254 DEVCK0: MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE?
\r
2257 LDB TAC,PDVCNT ;YES,DECREMENT
\r
2258 SOJL TAC,DEVCK1 ;0 MEANS IGNORE DEVICE
\r
2260 JUMPN TAC,DEVCK1 ;HAS COUNT GONE TO 0?
\r
2261 MOVE DSER,DEVSER(DEVDAT);YES, GET DISPATCH TABLE ENTRY
\r
2263 PUSHJ PDP,DHNG(DSER) ;DISPATCH TO SERVICE ROUTINES TO
\r
2265 PUSHJ PDP,DEVHNG ;PRINT ERROR MESSAGE AND STOP JOB
\r
2266 POP PDP,DEVDAT ;DO NOT PRINT MESS. AND STOP JOB RETURN
\r
2267 DEVCK1: HLRZ DEVDAT,DEVSER(DEVDAT)
\r
2268 JUMPN DEVDAT,DEVCK0
\r
2270 \f;ROUTINE TO SETUP PROG AND ITEM FOR INTERRUPT SERVICE ROUTINE
\r
2272 ;CALL PUSHJ PDP,IOSET
\r
2273 , EXIT ALWAYS RETURNS HERE
\r
2274 ,THIS PROGRAM IS CALLED FROM AN INTERRUPT SERVICE ROUTINE.
\r
2275 ,IT PUTS THE ADDRESS OF THE DATA AREA OF THE JOB (C(JBTADR18-35))
\r
2276 ,CONNECTED TO THE DEVICE SPECIFIED BY AC DEVDAT IN AC PROG AND
\r
2277 ,PUTS THE ITEM POINTER (C(DEVCTR)) IN AC ITEM.
\r
2280 EXTERNAL PJOBN,JBTADR
\r
2282 IOSET: LDB PROG,PJOBN
\r
2283 MOVE ITEM,DEVCTR(DEVDAT) ;ITEM:=ITEM POINTER=C(DEVCTR)
\r
2284 MOVE PROG,JBTADR(PROG) ;PROG:=C(JBTADR 18-35)
\r
2285 MOVE IOS,DEVIOS(DEVDAT) ;GET IO STATUS FROM THE DDB
\r
2289 , PUSHJ PDP,IOSETC
\r
2290 , EXIT ALWAYS RETURNS HERE
\r
2292 ,SETS JBFPTR18-35:=C(TAC1 18-35)
\r
2293 , JBFCTR:=C(ITEM)*[WORD LENGTH/BYTE SIZE]
\r
2294 ,WHERE WORD LENGTH:=36 DECIMAL
\r
2295 , BYTE SIZE:=C(JBFPTR6-11)
\r
2296 , [X]:= INTEGER PART OF X
\r
2302 IOSETC: ADDI JBUF,1 ;JBFPTR12-18:=0
\r
2303 HRLZI TAC,7777 ;JBFPTR18-35:=C(TAC1 18-35)+1
\r
2307 LDB TAC1,[POINT 6,@JBUF,11] ;TAC1:=BYTE SIZE
\r
2308 PUSHJ PDP,ITMCT1 ;JBFCTR:=C(ITEM)*[36/BYTE SIZE]
\r
2312 \f;ROUTINE TO RETURN NO. OF ITEMS IN BUFFER
\r
2314 ;CALL: PUSHJ PDP,ITMSET
\r
2315 , EXIT ALWAYS RETURNS HERE
\r
2316 ,SETS AC ITEM:=(BUFFER SIZE-1)*[WORD LENGTH/BYTE SIZE]
\r
2317 ,WHERE BUFFER SIZE:=BITS 1-17 OF THE BUFFER HEADER WORD POINTED TO
\r
2319 , WORD LENGTH:=36 DECIMAL
\r
2320 , BYTE SIZE:=INTEGER PART OF X.
\r
2323 , PUSHJ PDP,ITMCNT
\r
2324 , EXIT ALWAYS RETURNS HERE
\r
2325 ,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/BYTE SIZE]
\r
2328 , PUSHJ PDP,ITMCT1
\r
2329 , EXIT ALWAYS RETURNS HERE
\r
2330 ,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/C(TAC1)]
\r
2332 INTERN ITMSET,ITMCNT,ITMCT1
\r
2333 ITMSET: LDB ITEM,[POINT 17,@DEVADR(DEVDAT),17];ITEM:=BUFFER SIZE-1
\r
2335 ITMCNT: LDB TAC1,[POINT 6,DEVPTR(DEVDAT),11];TAC1:=BYTE SIZE
\r
2336 ITMCT1: MOVEI TAC,44 ;ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)]
\r
2340 \f;ROUTINE TO SET DEVICE STATUS WORD FROM UUO
\r
2345 SETIOS: PUSHJ PDP,WAIT1 ;WAIT FOR DEVICE (INCLUDING TTY
\r
2346 ; MONITOR COMMAND RESPONSE WHEN
\r
2349 PUSHJ PDP,CHKMOD ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN
\r
2350 TRZ UUO,IOACT ;LET USER SET ALL BITS EXCEPT IOACT
\r
2351 HRRM UUO,DEVIOS(DEVDAT)
\r
2356 ;CHECK FOR A LEGAL MODE FOR DEVICE
\r
2357 CHKMOD: LDB TAC1,[POINT 4,UUO,35] ;GET DEVICE DATA MODE
\r
2358 MOVEI TAC,1 ;AND CHECK FOR LEGALITY
\r
2360 TDNN TAC,DEVMOD(DEVDAT)
\r
2361 JRST ILLMOD ;ILLEGAL MODE
\r
2365 ;SETUP BYTE POINTER AND ITEM COUNT
\r
2366 ;CALL PUSHJ PDP,NEWBUF
\r
2367 ; ADDRESS CHECK WHEN SETTING UP BUFFER
\r
2373 INTERNAL NEWBUF,NEWBF1
\r
2376 NEWBUF: HRRZ TAC,DEVADR(DEVDAT) ;TAC:=INPUT BUFFER HEADER ADDRESS
\r
2377 PUSHJ PDP,BUFCLR ;CLEAR INPUT BUFFER.
\r
2378 POPJ PDP, ;ADDRESS CHECK
\r
2380 AND TAC,DEVPTR(DEVDAT) ;DEVPTR 0-5:=0, DEVPTR 12:=0
\r
2381 HRR TAC,DEVADR(DEVDAT) ;DEVPTR 18-35:=C(DEVADR 18-35) + 1
\r
2383 MOVEM TAC,DEVPTR(DEVDAT)
\r
2384 PUSHJ PDP,ITMSET ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]
\r
2385 MOVEM ITEM,DEVCTR(DEVDAT) ;DEVCTR:=ITEM COUNT
\r
2386 JRST CPOPJ1 ;RETURN
\r
2387 \f;ROUTINE TO SETUP BYTE POINTER ACCORDING TO DATA MODE
\r
2389 ;CALL: PUSHJ PDP,SETBYT
\r
2390 , EXIT ALWAYS RETURNS HERE
\r
2395 ,WHERE S=36 IF DATA MODE (IOS 32-25) IS BINARY (B)
\r
2396 , IMAGE (I), IMAGE BINARY (IB), OR DUMP (SD,D,DR)
\r
2397 , S=7 IF DATA MODE IS ASCII PACKED (A)
\r
2399 , ASCII SEQUENCED (AS)
\r
2400 , ASCII SEQUENCED LINE (ASL)
\r
2401 , OR ALTERNATE MODE BREAK (AM)
\r
2405 SETBYT: TRNN IOS,14 ;IS MODE LESS THAN 10?
\r
2406 HRLI TAC,700+PROG ;YES,ASCII OR ASCII LINE
\r
2407 TRNE IOS,14 ;10 OR GREATER?
\r
2408 HRLI TAC,4400+PROG ;YES, IMAGE,IMAGE BIN. OR BIN.
\r
2410 \f;ROUTINE TO STORE DATA IN IOBUFFER FOR INPUT CHAR. AT A TIME DEVICES
\r
2412 ;CALL: PUSHJ PDP,STODAT
\r
2413 , EXIT1 CHECKSUM ERROR
\r
2414 , EXIT2 BLOCK FULL OR BLOCK COMPLETE
\r
2415 , EXIT3 DATA STORED CORRECTLY
\r
2416 ,CALLED FROM AN INPUT SERVICE ROUTINE WITH A DATA ITEM IN AC DAT.
\r
2417 ,STORES THE DATA ITEM IN THE BUFFER, CHECKING TO SEE IF IT WERE
\r
2418 ,THE FIRST ITEM ON THE BUFFER AND SETTING UP THE POINTER AND
\r
2419 ,WORD COUNT APPROPRIATELY CHECKING THE MODE TO SEE IF ANY SPECIAL
\r
2420 ,PROCESSING NEED BE DONE. FOR EXAMPLE, THE TERMINATION
\r
2421 ,OF A BUFFER ON CERTAIN CHARACTERS IN OTHER MODES, OR IF THE BUFFER
\r
2422 ,IS FULL. THERE ARE THREE RETURNS FROM THIS ROUTINE: THE FIRST
\r
2423 ,RETURN OCCURS ON AN ERROR CONDITION, THE SECOND RETURN OCCURS
\r
2424 ,ON A BLOCK FULL CONDITION OR BLOCK COMPLETE CONDITION, THE THIRD
\r
2425 ,RETURN OCCURS ON THE DATA STORED CORRECTLY CONDITION. THIS
\r
2426 ,ROUTINE ALSO DOES SOME CHECKING ON INPUT OF BINARY RECORD,
\r
2427 ,PAPER TAPE OR CARDS.
\r
2429 , PUSHJ PDP,STOSQD
\r
2430 , XXXX ALWAYS SKIPS
\r
2431 , EXIT ALWAYS RETURNS HERE
\r
2432 ,STORES THE WORD COUNT:=C(DEVPTR 18-35) -C(DEVIAD 18-35) - 1
\r
2434 \f INTERN STODAT, STOSQD
\r
2435 EXTERNAL PIOMOD,CPOPJ,CPOPJ1,CPOPJ2
\r
2437 STODAT: TLNN IOS,IOFST ;IS THIS FIRST ITEM OF BUFFER?
\r
2439 PUSHJ PDP,NEWBUF ;SET UP A NEW BUFFER. ITEM:=(BUFFER
\r
2440 ; SIZE - 1)*[36/BYTE SIZE]
\r
2442 STO0: LDB TAC1,PIOMOD ;DATA MODE
\r
2443 CAIN TAC1,B ;MODE=BINARY?
\r
2446 STO1: IDPB DAT,DEVPTR(DEVDAT) ;STORE DATA IN BUFFER.
\r
2447 CAIE TAC1,A ;MODE=ASCII, IMAGE, OR BINARY?
\r
2450 CAIE TAC1,IB ;IMAGE BINARY?
\r
2451 CAIN TAC1,B ;CHECKSUM BINARY?
\r
2453 ANDI DAT,177 ;NO, MUST BE ASCII LINE MODE.
\r
2454 CAIG DAT,14 ;LINE FEED,FORM FEED, OR VERTICAL TAB?
\r
2458 SOJGE ITEM,CPOPJ2 ;ITEM:=C(ITEM)-1. IS C(ITEM) GR OR=0?
\r
2459 STOE1: TRO IOS,IOBKTL ;IOBKTL:=1
\r
2461 STOAIB: SOJG ITEM,CPOPJ2; ITEM:=C(ITEM)-1. IS C(ITEM) GR 0?
\r
2462 CAIN TAC1,A ;MODE=ASCII?
\r
2464 CAIN TAC1,B ;MODE=BINARY?
\r
2465 JRST STOBND ;YES, COMPUTE CHECKSUM AND CHECK.
\r
2466 PUSHJ PDP,ITMSET ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]
\r
2468 SUB ITEM,DEVCTR(DEVDAT)
\r
2469 MOVE TAC1,DEVIAD(DEVDAT) ;STORE ITEM COUNT
\r
2470 ADDI ITEM,1 ;IN FIRST WORD OF BUFFER
\r
2472 \fSTOSQD: TLZN IOS,IOFST ;FIRST CALL?
\r
2474 PUSHJ PDP,NEWBUF ;YES, CLEAR BUFFER,SET ITEM COUNT
\r
2475 POPJ PDP, ;ADDRESS CHECK
\r
2476 STOSQF: MOVE TAC1,DEVIAD(DEVDAT) ;REL. ADR. OF BUFFER
\r
2478 HRRZ ITEM,DEVPTR(DEVDAT) ;ITEM:=C(DEVPTR 18-35) -
\r
2479 ; C(DEVIAD 18-35) -1
\r
2481 STOSQE: HRRM ITEM,@TAC1 ;WORD COUNT TO FIRST WORD IN BUFFER
\r
2482 JRST CPOPJ1 ;EXIT2. BLOCK COMPLETE
\r
2485 STOBIN: TLZN IOS,IOFST ;WILL THE NEXT ITEM BE THE FIRST ITEM
\r
2486 JRST STO1 ;OF A BUFFER? IOFST:=0
\r
2487 HRRZ TAC,DAT ;YES.
\r
2488 CAMLE TAC,ITEM ;IS WORD COUNT LE (BUFFER SIZE-1)*
\r
2489 JRST STOE1 ; [36/BYTE SIZE]?
\r
2490 MOVE ITEM,TAC ;ITEM:=WORD COUNT
\r
2491 MOVEM DAT,@DEVPTR(DEVDAT) ;STORE WORD COUNT IN BUFFER
\r
2492 JRST CPOPJ2 ;EXIT3. DATA STORED CORRECTLY.
\r
2494 STOBND: HRRZ TAC1,DEVIAD(DEVDAT)
\r
2495 PUSHJ PDP,CKS12 ;COMPUTE CHECKSUM
\r
2496 ADD TAC1, DEVIAD(DEVDAT)
\r
2497 HLLZ TAC1,@TAC1 ;DATA CHECKSUM=COMPUTED CHECKSUM?
\r
2499 JRST CPOPJ1 ;EXIT2. BLOCK COMPLETE
\r
2500 TRO IOS,IODTER ;IODTER:=1
\r
2501 POPJ PDP, ;EXIT1. CHECKSUM ERROR
\r
2505 IFN FTCHECK,<INTERNAL CHKEND
\r