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