Added base source
[retro-software/dec/tops10/v4.5.git] / src / errcon.mac
1 TITLE ERRCON - MONITOR DETECTED ERROR HANDLING ROUTINES - V404\r
2 SUBTTL T.HASTINGS/TH/RCC   TS  01 JUN 69\r
3 XP VERRCN,404\r
4                         ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
5 \r
6         ENTRY ERRCON    ;ALWAYS LOAD ERRCON(IF LIB SEARCH)\r
7 ERRCON:\r
8 \r
9 ;THESE ERROR ROUTINE PRINT "ERROR IN JOB N"\r
10 ;FOLLOWED BY AN APPROPRIATE ERROR MESSAGE\r
11 ;THEN THE JOB IS STOPPED AND CONSOLE IS RETURNED TO\r
12 ;MONITOR COMMAND MODE\r
13 \r
14 \r
15 ;APR DETECTED ERRORS\r
16 ;PUSHDOWN OVERFLOW,ILLEGAL MEMORY, NONEXISTENT MEMORY\r
17 ;FOR WHICH THE USER IS NOT ENABLED.\r
18 ;SEE APRSER TO SEE HOW APR INTERRUPTS ARE HANDLED\r
19 ;CALL:  SKIPE TAC,APRERR        ;RESULT OF CONI APR,APRERR\r
20 ;       PUSHJ PDP,APRLIM        ;FROM CLK SERVICE ROUT,(LOWEST PRIORTY PI)\r
21 ;       RETURN TO RESCHEDULE NEW USER\r
22 \r
23 INTERNAL APRILM\r
24 EXTERNAL USRREL,CONMES,HOLD,INLMES,JOBN,PJOBN,PRQM\r
25 EXTERNAL STOP1,TTYFUW,USRXIT,UUO0,WSCHED\r
26 \r
27 APRILM: SETZM APRERR            ;CLEAR FLAG IMMEDIATELY,IN CASE OTHER ERRORS OCCUR\r
28         TRNN TAC,ILM            ;ILLEGAL MEMORY?\r
29         JRST APRNXM             ;NO\r
30         HRRZ TAC,APRPC          ;YES, PC STORED BY APR INTERRUPT\r
31 IFE FT2REL,<\r
32         CAMG TAC,USRREL         ;IS PC IN BOUNDS/\r
33 >\r
34 IFN FT2REL,<\r
35         EXTERN SEGILM\r
36         CAMLE TAC,USRREL        ;IS PC IN BOUNDS(LOG SEG)?\r
37         PUSHJ PDP,SEGILM        ;NO. IS PC IN LEGAL MEMORY IN HIGH SEG?\r
38 >\r
39         JRST APRILR             ;YES. GO PRINT ILL MEM REF\r
40         JSP TAC,ERRPTU          ;NO. PRINT PC EXCEEDS MEM BOUND\r
41         ASCIZ /PC OUT OF BOUNDS/\r
42         JRST APRSCD             ;PRINT LOC, THEN STOP JOB\r
43 \r
44 APRILR: JSP TAC,ERRPTU\r
45         ASCIZ /ILL MEM REF/\r
46         JRST APRSCD             ;PRINT LOC, THEN STOP JOB\r
47 \r
48 \fAPRNXM:        TRNN TAC,NXM            ;NON-EX MEM?\r
49         JRST APRPDL             ;NO\r
50         JSP TAC,ERRPTU          ;YES\r
51         ASCIZ /NON EX MEM/\r
52         JRST APRSCD             ;PRINT LOC, THEN STOP JOB\r
53 \r
54 APRPDL: TRNN TAC,POV            ;PUSHDOWN OVERFLOW?\r
55         JSP DAT,UERROR          ;NO, MUST BE HARDWARE PROBLEM\r
56         JSP TAC,ERRPTU          ;YES\r
57         ASCIZ /PDL OV/\r
58 ASPSC:  MOVE TAC1,APRPO         ;PRINT APR PC\r
59         JRST PCPNT              ;AS:\r
60                                 ; 1)"AT USER LOC XXX" OR\r
61                                 ; 2)"AT EXEC LOC XXX; EXEC CALLED FROM \r
62                                 ; EXEC/USER LOC YYY\r
63 \f;ADDRESS CHECK ERROR AT ANY LEVEL\r
64 ;DEVDAT MUST BE SET UP TO POINT TO OFFENDING DEVICE\r
65 \r
66 INTERNAL ADRERR\r
67 \r
68 ADRERR: JSP TAC,ERRDEV          ;GET JOB NO. FROM DEVICE DATA BLOCK\r
69         ASCIZ /ADDRESS CHECK FOR /\r
70         JRST DEVEXC             ;PRINT "DEVICE XXX; EXEC CALLED FROM \r
71                                 ; EXEC/USER LOC YYY"\r
72                                 ; THEN STOP JOB\r
73 \r
74 ;UNEXPLAINABLE MONITOR ERROR\r
75         ;CALL:  JSP DAT,UERROR  ;AT UUO LEVEL(PDP SET UP)\r
76         ;       JSP DAT,ERROR   ;AT INTERRUPT LEVEL(PDP NOT SET UP)\r
77         ;       JSP DAT,OERROR  ;AT INTERRUPT OR UUO LEVEL (PDP SET UP) -MESSAGE TO \r
78         ;                       ; OPERATOR'S CONSOLE RATHER THAN SPECIAL JOB\r
79         ;       JSP DAT,CERROR  ;BLAME JOB=C(ITEM), PDP SETUP\r
80 \r
81 INTERNAL ERROR,UERROR,CERROR,OERROR\r
82 EXTERNAL JOB,ERRPDL,NULADR\r
83 NLADDR: EXP NULADR\r
84 ERROR:  MOVEI PDP,ERRPDL        ;USE LOWER CORE FOR PD LIST\r
85 OERROR: PUSH PDP,NLADDR         ;PUSH ADR, OF NULJOB ON PD LIST IN CASE\r
86                                 ; THIS ERROR IS AT PI LEVEL 7 OR HIGHER\r
87                                 ; SO NULL JOB WILL BE STARTED WHEN LAST\r
88                                 ; POPJ IS DONE(STOP2 IN RUNCSS)\r
89         TDZA ITEM,ITEM          ;BLAME JOB 0(PRINT ON OPERATORS TTY)\r
90 UERROR: MOVE ITEM,JOB           ;PRINT FOR CURRENT JOB\r
91 CERROR:\r
92 IFN FTHALT,<\r
93         HALT    .+1             ;PUT ADR OF JSP DAT, IN PC AND STOP SO A\r
94                                 ; DUMP CAN BE TAKEN,CONTINUE WILL PRINT ERROR MESSAGE\r
95 >\r
96         JSP TAC,ERRPNT          ;ITEM ALREADY SETUP\r
97         ASCIZ /ERROR IN MONITOR/\r
98         MOVE TAC1,-1(PDP)       ;GET LOC OF JSP DAT,ERROR\r
99         JRST PCPNT              ;PRINT "AT EXEC LOC XXX:\r
100                                 ; EXEC CALLED FROM EXEC/USER YYY"\r
101                                 ; THEN STOP JOB\r
102 \r
103 ;INPUT UUO FOR OUTPUT DEVICE\r
104 ;CALLED AT UUO LEVEL ONLY\r
105 \r
106 INTERNAL ILLINP\r
107 \r
108 ILLINP: JSP TAC,ERRPTU\r
109         ASCIZ /OUTPUT /\r
110         PUSHJ PDP,ERNAM         ;PRINT "DEVICE XXX"\r
111         JSP TAC,UUOMES          ;PRINT MESSAGE,UUOPC,STOP JOB\r
112         ASCIZ / CANNOT DO INPUT/\r
113 \f;OUTPUT UUO FOR INPUT DEVICE\r
114 ;CALLED AT UUO LEVEL ONLY\r
115 \r
116 INTERNAL ILLOUT\r
117 \r
118 ILLOUT: JSP TAC,ERRPTU\r
119         ASCIZ /INPUT /\r
120         PUSHJ PDP,ERNAM         ;PRINT "DEVICE XXX"\r
121         JSP TAC,UUOMES          ;PRINT MESSAGE,UUOPC,STOP JOB\r
122         ASCIZ / CANNOT DO OUTPUT/\r
123 \r
124 ;ILLEGAL DEVICE DATA MODE (INIT, OPEN, OR SETSTS UUOS)\r
125 ;CALLED AT UUO LEVEL ONLY\r
126 \r
127 INTERNAL ILLMOD\r
128 \r
129 ILLMOD: JSP TAC,ERRPTU\r
130         ASCIZ /ILLEGAL DATA MODE FOR /\r
131         JRST DEVEXC             ;PRINT "DEVICE XXX",UUO PC\r
132 \r
133 ;IO UUO TO USER CHANNEL WITH NO PREVIOUS INIT OR OPEN\r
134 ;CALLED AT UUO LEVEL ONLY\r
135 \r
136 INTERNAL IOIERR\r
137 \r
138 IOIERR: JSP TAC,ERRPTU\r
139         ASCIZ /IO TO UNASSIGNED CHANNEL/\r
140         JRST UUOPCP             ;PRINT UUO PC\r
141 \f;ILLEGAL UUO\r
142 ;CALLED AT UUO LEVEL ONLY\r
143 \r
144 INTERNAL UUOERR\r
145 \r
146 UUOERR: JSP TAC,ERRPTU\r
147         ASCIZ /ILLEGAL UUO/\r
148         MOVE TAC1,UUO0          ;GET LAST UUO PC\r
149 IFN FTHALT,<\r
150         TLNN TAC1,USRMOD                ;UUO FROM EXEC?\r
151         HALT    .+1                     ;YES, HALT SO DUMP CAN BE TAKEN\r
152                                         ; CONTINUE WILL PRINT MESSAGE\r
153 >\r
154         SOSJ TAC1,PCPNT         ;AND PRINT, PRINT USER UUO PC IF DIFF.\r
155 \r
156 ;ILLEGAL INSTRUCTION\r
157 \r
158 ;HALT INSTRUCTION IS A SPECIAL CASE WHICH STOPS JOB BUT\r
159 ;THE USER MAY CONTINUE FROM IT(EFFECTIVE ADR.)\r
160 ;CALLED AT UUO LEVEL WITH A JRST\r
161 \r
162 INTERNAL ILLINS\r
163 EXTERNAL JOBPD1,TTYSTC\r
164 \r
165 ILLINS: HLRZ TAC,UUO            ;ILLEGAL OPCODE\r
166         CAIN TAC,254200+PROG    ;IS IT A HALT?\r
167         JRST HALTI              ;YES, PRINT DIFFERENT MESSAGE\r
168         JSP TAC,ERRPTU\r
169         ASCIZ /ILL INST./\r
170         JRST UUOPCP             ;PRINT UUO PC AD STOP JOB\r
171 \r
172 HALTI:  JSP TAC,ERRPTU\r
173         ASCIZ /HALT/\r
174         SOS TAC1,JOBPD1(JDAT)   ;UUOPC=LOC OF HALT+1\r
175         PUSHJ PDP,PCP           ;PRINT "USER LOC XXX"\r
176         PUSHJ PDP,INLMES        ;PRINT MONITOR MODE RESPONSE\r
177         ASCIZ /\r
178 ^C\r
179 \r
180 ./\r
181         HRRM UUO,JOBPD1(JDAT)   ;SAVE EFFECTIVE ADDRESS OF HALT\r
182         PUSHJ PDP,TTYSTC        ;START TTY TYPING\r
183         PUSHJ PDP,STOP1         ;STOP JOB\r
184                                 ; RETURN ONLY IF HE TYPES CONT\r
185         PUSH PDP,JOBPD1(JDAT)   ;PUT USER RETURN ON END OF PD LIST\r
186         JRST USRXIT             ;RETURN TO USER IN CASE HE TYPES CONT COMMAND\r
187 \f;ROUTINE FOR HUNG IO DEVICE\r
188 ;CALL   MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
189 ;       PUSHJ PDP,DEVHNG\r
190 \r
191 INTERNAL DEVHNG\r
192 \r
193 DEVHNG: MOVEI TAC,IOACT         ;TURN OFF IO DEVICE ACTIVE BIT IN\r
194         ANDCAM TAC,DEVIOS(DEVDAT);MEMORY AND IOS\r
195         TRZ IOS,IOACT\r
196         JSP TAC,ERRDEV\r
197         ASCIZ /HUNG /\r
198         JRST DEVEXC\r
199 \r
200 ;BAD DECTAPE DIRECTORY\r
201 ;CALLED AT INTERRUPT AND UUO LEVELS WITH DEVDAT AND ITEM SETUP\r
202 \r
203 INTERNAL BADDIR\r
204 \r
205 BADDIR: JSP TAC,ERRPNT\r
206         ASCIZ /BAD DIRECTORY FOR /\r
207 \r
208 ;ROUTINE TO PRINT "DEVICE XXX; EXEC CALLED FOR EXEC/USER YYY"\r
209 ;THEN STOP JOB\r
210 ;TO BE USED BY DEVICE DEPENDENT ERROR MESSAGES AFTER JSP TAC,DEVERR\r
211 \r
212 INTERNAL DEVEXC\r
213 \r
214 DEVEXC: PUSHJ PDP,ERNAM         ;PRINT "DEVICE XXX"\r
215         JRST EXCALP             ;PRINT "EXEC CALLED FROM EXEC/USER LOC YYY"\r
216 \f;ROUTINE TO HALT A JOB WHEN A DEVICE IS NOT READY FOR I/O\r
217 ;CALLED FROM XXSER AT UUO LEVEL\r
218 ;CALL   MOVE DEVDAT,ADDR. OF DEV. DDB\r
219 ;       PUSHJ PDP,HNGSTP\r
220 \r
221 INTERNAL HNGSTP\r
222 \r
223 HNGSTP: PUSH PDP,ITEM\r
224         PUSH PDP,IOS\r
225         PUSH PDP,DEVDAT         ;SAVE DEV'S IOS WORD & DDB\r
226         PUSHJ PDP,TTYFUN        ;FIND JOB'S TTY & WAIT UNTIL I/O IS FINISHED\r
227         PUSHJ   PDP,PRQM        ;PRINT QUESTION MARK FOR BATCH\r
228         PUSHJ PDP,ERNAM         ;PRINT "DEVICE XXX"\r
229         PUSHJ PDP,INLMES        ;AND MSG.\r
230 ASCIZ   /OK?\r
231 ^C\r
232 \r
233 ./      PUSHJ PDP,TTYSTC        ;START UP TTY IN COMMAND MODE\r
234         POP PDP,DEVDAT          ;BRING BACK DEV DDB & IOS WORD\r
235         POP PDP,IOS\r
236         PUSHJ PDP,STOP1         ;STOP JOB &\r
237         POP PDP,ITEM\r
238         JRST WSCHED             ;RESCHEDULE\r
239 \f;COMMON ERROR MESSAGE SETUP ROUTINES\r
240 ;CALL:  JSP TAC,ERRPTU, ERRDEV, OR ERRPNT\r
241 ;       ASCIZ /MESSAGE/\r
242 ;       RETURNS HERE WITH DEVDAT SAVED 0(PDP)\r
243 ;       C(DEVDAT)=TTYDDB, DAT TO TTY OUTPUT BUFFER POINTER\r
244 ;       ITEM=JOB NUMBER\r
245 \r
246 ;USE ERRPTU IF AT UUO LEVEL FOR SURE\r
247 ;ERRDEV IF ERROR FOR AN ASSIGNED DEVICE AT ANY LEVEL\r
248 ;ERRPNT WITH ITEM ALREADY SET TO OFFENDING JOB NUMBER\r
249 ;THE JSP CALL IS USED IN CASE PUSHDOWN SPACE BECOMES CRITICAL\r
250 ;AGAIN AND ERRPNT HAS TO WIRE EXISTING LIST OUT\r
251 \r
252 INTERNAL ERRPTU\r
253 INTERNAL ERRDEV,ERRPNT\r
254 EXTERNAL PJOBN,JOB,JBTADR,JBTDAT,TTYFND,NULERR\r
255 IFN FTTTYSER,<EXTERNAL TTYERP>\r
256 \r
257 ERRPTU: SKIPA ITEM,JOB          ;BLAME CURRENT JOB IS NOT 0.\r
258 ERRDEV: LDB ITEM,PJOBN          ;JOB NO, FROM DEVICE DATA BLOCK\r
259 ERRPNT: SKIPM ITEM              ;ERROR IN NULL JOB?\r
260         SETOM NULERR            ;YES, SET FLAG FOR ERROR IN NULL JOB\r
261                                 ; SO STATE OF NULL JOB WILL BE REESTABLISHED\r
262                                 ; WHEN IS IT RUN AGAIN(SEE CLOCK1)\r
263 \r
264         PUSH PDP,DAT            ;SAVE CALL TO ERROR(JSP DAT,ERROR)\r
265 IFN FTRCHK,<\r
266         CAIL    ITEM,JOBN       ;JOB NUMBER\r
267         HALT    .               ;OUT OF RANGE?\r
268 >\r
269         PUSH PDP,DEVDAT         ;SAVE ADR, OF DEV. DATA BLOCK\r
270         PUSH PDP,TAC            ;SAVE RETURN FROM ERRPNT\r
271         MOVE JDAT,JBTDAT(ITEM)  ;EVEN NULL JOB HAS JOB DATA AREA\r
272 IFN JDAT-PROG,<\r
273         MOVE PROG,JBTADR(ITEM)  ;JOB RELOCATION\r
274 >\r
275 IFE FTTTYSER,<  PUSHJ PDP,TTYFND        ;FIND TTY FOR THIS JOB(ITEM)>\r
276 IFN FTTTYSER,<  PUSHJ   PDP,TTYERP      ;FIND THIS TTY AND\r
277                                 ;SET MERTPO IN DDB\r
278 >\r
279         PUSHJ PDP,INLMES\r
280         ASCIZ /?\r
281 ERROR IN JOB /\r
282         PUSHJ PDP,PJOB          ;PRINT JOB NO.\r
283         JRST INLMES             ;PRINT MESSAGE SPECIFIED BY CALLER\r
284                                 ; AND RETRUN TO LOC. AFTER MESSAGE\r
285 \f;ROUTINE TO PRINT UUO PC AND STOP JOB\r
286 ;IF IN USER MODE PC WILL PRINT AS "AT USER LOC XXX"\r
287 ;IF IN EXEC MODE "AT EXEC LOC XXX; EXEC CALLED FROM EXEC/USER/ LOC YYY\r
288 \r
289 INTERNAL UUOPCP,UUOMES\r
290 EXTERNAL JOBPD1\r
291 \r
292 UUOMES: PUSHJ PDP,CONMES        ;PRINT MESSAGE POINTED TO BY TAC\r
293 UUOPCP: MOVE TAC1,JOBPD1(JDAT)  ;UUO PC STORED IN JOB DATA AREA\r
294                                 ; FIRST LOC ON PD LIST\r
295         SOJA TAC1,PCPNT         ;DECREMENT TO POINT TO UUO IN USER AREA\r
296 \r
297 ;ROUTINE TO PRINT ONE OF THREE MESSAGES AND STOP JOB\r
298 ;1) "AT EXEC LOC XXX; EXEC CALLED FROM EXEC LOC YYY"\r
299 ;2) "AT EXEC LOC XXX; EXEC CALLED FROM USER LOC YYY"\r
300 ;3) "AT USER LOC YYY"\r
301 \r
302 ;CALL:  MOVE TAC1, XXX          ;WITH PC FLAGS IN LH\r
303 \r
304 ;       PUSHJ PDP,PCPNT\r
305 ;       NEVER RETURN IF AT UUO LEVEL\r
306 \r
307 INTERNAL PCPNT\r
308 EXTERNAL TPOPJ\r
309 \r
310 PCPNT:  PUSHJ PDP,PCP           ;PRINT " AT EXEC XXX" OR "AT USER "\r
311         TLNE TAC1,USRMOD        ;WAS PC IN USER MODE?\r
312         JRST PCSTOP             ;YES, ENOUGH INFO.\r
313 \r
314 ;ROUTINE TO PRINT EITHER\r
315 ;1) "; EXEC CALLED FROM EXEC LOC YYY"\r
316 ;2) "; EXEC CALLED FROM USER LOC YYY"\r
317 ;AND STOP JOB\r
318 ;CALL:  PUSHJ PDP,EXCALP\r
319 ;       NEVER RETURNS IF AT UUO LEVEL\r
320 \r
321 INTERNAL EXCALP,PCSTOP\r
322 \r
323 EXCALP: PUSHJ PDP,INLMES\r
324         ASCIZ /; UUO/\r
325         MOVE TAC1,JOBPD1(JDAT)  ;UUO PC IN JOB DATA AREA\r
326         SUBI TAC1,1             ;BACK IT UP TO POINT TO UUO\r
327         PUSHJ PDP,PCP           ;PRINT "EXEC LOC " OF USER LOC\r
328 PCSTOP: PUSHJ PDP,HOLD          ;STOP JOB, START TTY AND SET JOB ERROR BIT\r
329         POP PDP,DEVDAT          ;RETURN ONLY IF AT INTERRUPT LEVEL\r
330         JRST TPOPJ              ;REMOVE ERROR CALL AND RETURN\r
331 \f;ROUTINE TO PRINT PC AS:\r
332 ;1) "EXEC LOC XXX" OR "USER LOC XXX"\r
333 ;CALL:  MOVE TAC1,PC TO PRINT(LH=PC FLAGS)\r
334 ;       PUSHJ PDP,PCP\r
335 \r
336 \r
337 XMODE:  ASCIZ / AT EXEC /\r
338 UMODE:  ASCIZ / AT USER /\r
339 \r
340 PCP:    MOVEI TAC,XMODE         ;ASSUME PC IN EXEC MODE\r
341         TLNE TAC1,USRMOD        ;IS IT?\r
342         MOVEI TAC,UMODE         ;NO, USER MODE\r
343         PUSHJ PDP,CONMES        ;PRINT ONE OR OTHER\r
344         HRRZ TAC,TAC1           ;PRINT RIGHT HALF IN OCTAL\r
345                                 ; FALL INTO OCTPNT\r
346 \r
347 INTERN OCTPNT\r
348 \r
349 ;ROUTINE TO PRINT 6 DIGIT OCTAL NUMBER\r
350 ;CALL:  MOVE DAT,TTY OUTPUT BYTE POINTER\r
351 ;       HRR TAC, OCTAL NUMBER\r
352 ;       PUSHJ PDP,OCTPNT\r
353 ;       RETURN TAC1,PRESERVED,TAC DESTROYED\r
354 \r
355 OCTPNT: HRLZ TAC,TAC            ;MOVE TO LH FOR ROTATING\r
356         TRO TAC,700000          ;SETUP AN END FLAG\r
357 \r
358 OCTP1:  ROT TAC,3               ;GET NEXT OCTAL DIGIT\r
359         TLNN TAC,777777         ;WAS THAT FLAG?\r
360         POPJ PDP,               ;YES, DO NOT PRINT IT\r
361         PUSHJ PDP,PRTNUM        ;NO, PRINT OCTAL DIGIT\r
362         HRRI TAC,0              ;CLEAR RH\r
363         JRST OCTP1              ;GET NEXT OCTAL DIGIT\r
364 \r
365 ;ROUTINE TO ADD 1 TO TAC AND PRINT DECIMAL\r
366 ;SAME CALL AS OCTPNT\r
367 \r
368         INTERN DECP1\r
369 \r
370 DECP1:  AOJA TAC,RADX10         ;ADD 1 AND GO PRINT\r
371 \r
372 ;ROUTINE TO PRINT DECIMAL\r
373 ;CALL:  SAME AS OCTPNT\r
374 ;TAC1:  PRESERVED\r
375 \r
376 INTERN RADX10\r
377 \r
378 RADX10: PUSH PDP,TAC1           ;SAVE TAC1\r
379         PUSHJ PDP,PRTDIG        ;PRINT DECIMAL DIGITS\r
380         POP PDP,TAC1            ;RESTORE TAC1\r
381         POPJ PDP,               ;AND RETURN\r
382 \r
383 ;RECURSIVE DECIMAL PRINT ROUTINE\r
384 ;CALL:  MOVE TAC,DECIMAL NO.\r
385 ;       PUSHJ PDP,PRTDIG\r
386 \r
387 PRTDIG: IDIVI TAC,12    ;DIVIDE BY 10\r
388         HRLM TAC1,(PDP)         ;RT ON PD LIST\r
389         JUMPE TAC,.+2           ;FINISHED?\r
390         PUSHJ PDP,PRTDIG        ;NO, CALL S OR F\r
391         HRLZ TAC,(PDP)          ;YES, GET LAST NUMBER\r
392 PRTNUM: ADDI TAC,"0"            ;CONVERT TO ASCIZ\r
393 IFN FTTTYSER,<\r
394 EXTERN OUTCHS\r
395         MOVE    TEM,TAC         ;PUT CHAR IN CHAR AC\r
396         JRST    OUTCHS          ;AND OUTPUT IN SCNSRF\r
397 >\r
398 IFE FTTTYSER,<\r
399 \r
400         IDPB    TAC,DAT         ;ADD CHAR TO HALGF DUPLEX OUTPUT STREAM\r
401         POPJ PDP,\r
402 >\r
403 \f;ROUTINE TO PRINT "DEVICE XXX"\r
404 ;CALL   MOVE DAT,ASCII OUTPUT BYTE POINTER\r
405 ;       PUSH PDP,DEVDAT\r
406 ;       PUSHJ PDP,ERNAM\r
407 \r
408 INTERNAL ERNAM\r
409 \r
410 ERNAM:  PUSHJ PDP,INLMES\r
411         ASCIZ /DEVICE /\r
412         SKIPE TAC1,-1(PDP)      ;IS DEVDAT = 0?\r
413         MOVE TAC1,DEVNAM(TAC1)  ;NO, GET DEVICE NAME\r
414 \r
415 ;ROUTINE TO PRINT SIXBIT NAME\r
416 ;CALL   MOVE DAT,ASCII OUTPUT BYTE POINTER\r
417 ;       MOVE TAC1,NAME\r
418 ;       PUSHJ PDP,PRNAME\r
419 \r
420 INTERNAL PRNAME\r
421 EXTERNAL CPOPJ\r
422 \r
423 PRNAME: MOVEI TAC,0\r
424         LSHC TAC,6              ;SHIFT IN NEXT CHAR.\r
425         JUMPE TAC,CPOPJ\r
426         MOVEI   TEM,40(TAC)     ;ASCII VERSION INTO CHREC FOR OUTCHS\r
427 IFN FTTTYSER,<\r
428 EXTERN OUTCHS\r
429         PUSHJ   PDP,OUTCHS\r
430 >\r
431 IFE FTTTYSER,<\r
432         IDPB    TEM,DAT\r
433 >\r
434         JRST PRNAME\r
435 \r
436 \r
437 ERREND: END\r
438 \f\r