cleaned up typos
[retro-software/dec/tops10/v4.5.git] / src / disser.mac
1 IFNDEF T30,<T30=0>;ASSUME TYPE 30 DISPLAY IF T30 IS UNDEFINED\r
2 IFN T30,<\r
3 TITLE DIST30 - TYPE 30 DISPLAY SERVICE ROUTINES\r
4 ENTRY DIST30\r
5 DIST30:\r
6 >\r
7 IFE T30,<\r
8 TITLE DIS340 - TYPE 340 DISPLAY SERVICE ROUTINES\r
9 ENTRY DIS340\r
10 DIS340:\r
11 >\r
12 SUBTTL  R. GRUEN/RCC TS 03 JUN 69 V004\r
13 XP      VDISSR,004\r
14                 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
15 ;               THESE ROUTINES HANDLE INTERRUPTS FROM THE DISPLAY DATA\r
16 ;       CHANNEL.  THEY SEARCH THE COMMAND POINTER LIST SUPPLIED\r
17 ;       BY THE USER AND OUTPUT SECTIONS OF DATA AS SPECIFIED THEREIN.\r
18 ;       ALL OUTPUT IS DONE USING THE BLKO COMMAND.\r
19 \r
20 ;               THE FORMAT OF THE COMMAND POINTE RLIST IS AS FOLLOWS:\r
21 \r
22 ;       RH=0            END OF COMMAND POINTER LIST\r
23 ;\r
24 ;       RH=ADR LH=0     ADR IS ADDRESS OF THE NEXT SECTION OF THE\r
25 ;                       COMMAND POINTER LIST\r
26 ;       RH=L-1 LH=-N    OUTPUT TO DISPLAY THE N WORDS OF COMMANDS\r
27 ;                       BEGINNING AT LOCATION L.\r
28 \r
29 ;       NOTE THAT THE CHECK FOR END OF LIST IS MADE FIRST.\r
30 \r
31 ;       ALL ADDRESS ARE CHECKED FOR VALIDITY (I.E.. THEY MUST\r
32 ;       BE WITHIN USER ARE) BEFORE ANY MEM REF IS MAD.\r
33 \r
34 ;IF THE T30 SWITCH = 1 THIS IS THE ROUTINE FOR A DEC\r
35 ;TYPE 30 DISPLAY WITH A TYPE 348 INTERFACE.\r
36 ;OTHERWISE IT IS THE ROUTINE FOR A DEC TYPE 340.\r
37 \r
38 \r
39 \f\r
40 INTERNAL FTCHECK,FTMONP\r
41 IFN FTCHECK+FTMONP,<\r
42 EXTERNAL DISDDB,DISIOS,PENLOC,DISNT,DISBKO,DISHI,DISONE,DISAV,OFFDIS\r
43 EXTERNAL DISAV1,DISREL,DISCON,DISNXT\r
44 INTERNAL DISNX1\r
45 >\r
46 IFE FTCHECK+FTMONP,<\r
47 ;DIS DEVICE DATA BLOCK\r
48         INTERN  DISDDB\r
49 DISDDB: SIXBIT  /DIS/\r
50         XWD     ^D60*HUNGST,0\r
51 DISIOS: 0\r
52         EXP     DISDSP\r
53         XWD     DVDIS+DVOUT+DVIN+DVLNG,2000\r
54         0\r
55         0\r
56         XWD     PROG,0\r
57         0\r
58 PENLOC: 0\r
59 DISPNT: 0\r
60 DISBKO: 0\r
61 DISHI:  0\r
62 DISONE: 0\r
63 DISAV:  0\r
64 DISAV1: 0\r
65 DISREL: XWD     TAC,0\r
66         XP      OFFDIS,0\r
67 IFE T30,<\r
68 DISCON: EXP ONDIS>\r
69 IFN T30,<\r
70 DISCON: 0>\r
71 \r
72 XP PENDDR,0             ;TO SATISFY A REQUEST IN COMMON.\r
73                         ; THERE IS NOT REALLY A PEN DDB.\r
74 >\r
75 \f\r
76 IFN T30,<\r
77 DIS=134         ;TYPE 30 DISPLAY DEVICE NUMBER\r
78 >\r
79 DISTAR=100      ;CLOCK FINISHED BEFORE PICTURE\r
80 DISWAT=200      ;PICTURE FINISHED BEFORE CLOCK\r
81 DISCKR=400      ;CLOCK REQUEST IN CLOCK QUEU\r
82 DISUUI=1000\r
83 \r
84 IFE T30,<\r
85 DISBSY=77\r
86 PENON=7400\r
87 >\r
88 IFN T30,<\r
89 DISBSY=20000\r
90 PENON=10000\r
91 >\r
92 \r
93 EXTERN JOBPFI\r
94 \r
95 EXTERN DISSAV,DISBLK,DISJSR,PENSAV\r
96         EXTERN DISCHN,PENCHN\r
97         EXTERN  DISCHL,PENCHL\r
98         EXTERN  DISSAV,DISRET\r
99         EXTERN  DISPON,DISPOF\r
100 \r
101         EXTERN  ADRERR,SETIOD\r
102         EXTERN  PION,PIOFF,CLOCK\r
103         EXTERN CPOPJ1,UERROR,URREL,STOTAC,JOB,JBTSTS,JBTADR,PJOBN\r
104 IFE T30,<       EXTERN ONDIS,NONDIS>\r
105 \r
106 INTERN PENINT,DISINT,DISFIN\r
107 ENTRY DISDSP\r
108 \r
109         DEFINE ADRCHK(A)\r
110 <       \r
111                 CAILE   A,JOBPFI\r
112                 CAMLE   A,DISHI\r
113                 JRST    EXIT2\r
114 >\r
115 \f       JRST DISINI             ;INITIALIZATION\r
116         POPJ    PDP,            ;PRINT ERROR AND STOP JOB\r
117 DISDSP: JRST    DISSTP          ;RELEASE\r
118         JRST    DISSTP          ;CLOSE\r
119         JSP     DAT,UERROR      ;OUTPUT\r
120         JSP     DAT,UERROR      ;INPUT\r
121         JRST    CPOPJ1          ;ENTER\r
122         JRST    CPOPJ1          ;LOOKUP\r
123         JRST    DISOUT          ;DUMP OUPUT (THAT'S US)\r
124         JRST    DISIN           ;DUMP INPUT (AS IN PEN)\r
125         POPJ    PDP,            ;SETO\r
126         POPJ    PDP,            ;SETI\r
127         POPJ    PDP,            ;GETF\r
128         JRST    CPOPJ1          ;RENAME\r
129         POPJ    PDP,            ;CLOSE INPUT\r
130         POPJ    PDP,            ;DIRECTORY CLEAR\r
131         POPJ    PDP,            ;MTAPE\r
132 \f;DISINI IS CALLED FOR RELEASE, CLOSE, AND SUNDRY ILLEGAL CONDITIONS\r
133 ;       WHICH WANT TO TURN THE DISPLAY OFF.  IT FIRST CONVINCES\r
134 ;       THE INTERRUPT LEVEL ROUTINES TO GO BACK TO SLEEP AND THEN\r
135 ;       TELLS THE MONITOR THAT THE DEVICE IS INACTIVE, LASTLY,\r
136 ;       IT TUERNS OFF THE INTERRUPT ASSIGNMENTS OF THE DISPLAY\r
137 ;       AND THE PI CHANNEL ASSOCIATED WITH THE DIS BLKO. IT RETURNS\r
138 ;       WITH A POPJ , SOMETIMES TO ITS CALLING ROUTINE AND SOMETIMES\r
139 ;       TO THE CHANNLE'S DISMISS ROUTINE, THE ADDRESS OF WHICH\r
140 ;       WAS CLEVERLY PLACED ON THE PUSHDOWN LIST WHEN AC'S \r
141 ;       WERE SAVED.  THUS IT CAN BE CALLED WITH EITHER A\r
142 ;       PUSHJ PDP,DISINI   OR A  JRST  DISINI.\r
143 \r
144 DISINI:\r
145 IFE T30,<\r
146         CONO    DIS,100         ;PARAMETER MODE>\r
147 IFN T30,<\r
148         MOVEI   TAC,PENCHN      ;SET UP CONO WORD WITH PROPER\r
149         ASH     TAC,3           ;  CHANNEL ASSIGNMENTS\r
150         ADDI    TAC,DISCHN\r
151         TRO     TAC,4000        ;SET DISPLAY READY BIT IN CONO WORD\r
152         MOVEM   TAC,DISCON>\r
153         JRST    DISIN1\r
154 \r
155 DISSTP: MOVE ITEM,JOB           ;CLEAR NSHF SO JOB CAN BE SHUFFLED\r
156         MOVSI   TAC,NSHF+NSWP           ;CLEAR NSWP SO JOB CAN BE SWAPPED(IN CASE THIS IS A SWAPPING SYSTEM\r
157         ANDCAM  TAC,JBTSTS(ITEM)\r
158 \r
159 DISIN1: SETOM   PENLOC\r
160         MOVSI   TAC,DISWAT+DISUUI       ;IGNORE FURTHER TRAPS\r
161         HRRI    TAC,IOACT       ;INDICATED DEVICE INACTIVE\r
162         ANDCAM  TAC,DISIOS      ;INTO DEVICE DATA BLOCK\r
163 DISOFF: CONO    DIS,OFFDIS      ;REMOVE THE DISPLAY'S CHANNE; ASSIGNMENTS\r
164         HLLZS   PENINT          ;DON'T EXPECT ANY ON LITE PEN\r
165         CONO    PI,DISPOF       ;TURN OFF DISPLAY'S BLKO CHANNEL\r
166         POPJ    PDP,\r
167         \r
168 DISINT: JRST DISFIN\r
169         JRST    DISINT          ;...\r
170 \f\r
171 ;PENINT RECIEVES CONTROL ON INTERRUPTS ON THE DISPLAY NON-DATA\r
172 ;       CHANNEL (SPECIAL CHANNEL). IT DECIDES IF THE INTERRUPT\r
173 ;       WAS VALID, AND IF SO, TRANSFERS CONTROL TO AN APPROPRIATE ROUTINE\r
174 \r
175 IFE T30,<\r
176 PENINT: CONSO   DIS,0           ;CHECK FOR CONI FLAGS\r
177         JRST    PENINT          ;TO OTHER DEVICES ON SAME CHANNEL\r
178         CONSZ   DIS,400         ;STOP FLAG\r
179         JRST    STPFLG\r
180         CONSZ   DIS,2000        ;PEN FLAG?\r
181 PENFLG: DATAI   DIS,PENLOC      ;STORE CURRENT LITE PEN LOC\r
182         CONO    DIS,NONDIS      ;CLEAR FLAG\r
183         JEN     @PENCHL         ;DISMISS INTERRUPT\r
184 \r
185 ;STPFLG SERVICES STOP FLAGS (DISPLAY PROGRAMMED) BY DOING\r
186 ;       A CLOSE ON THE DISPLAY\r
187 \r
188 STPFLG: JSR     PENSAV          ;STOP FLAG, SAVE AC'S AND SETUP RETURN\r
189         JRST    DISDSP+DCL      ;DO A CLOSE AND DISMISS INTERRUPT\r
190 >\r
191 \r
192 IFN T30,<\r
193 PENINT: CONSO DIS,0             ;CHECK FOR CONI FLAGS\r
194         JRST PENINT             ;TO OTHER DEVICES ON SAME CHANNEL\r
195         DATAI DIS,PENLOC        ;CLEAR PEN INTERRUPT\r
196         MOVEM TAC,PENLOC        ;SAVE AC TAC\r
197         MOVE TAC,DISBKO         ;GET ABSOLUTE ADR OF NEXT DATA ELEMENT\r
198         SUB TAC,DISREL          ;MAKE ADDRESS RELATIVE\r
199         HRRZS   TAC             ;CLEAR OUT GARBAGE IN THE LEFT HALF\r
200         EXCH TAC,PENLOC         ;SAVE ADR IN PENLOC AND RESTORE TAC\r
201         JEN @PENCHL             ;DISMIS THE INTERRUPT\r
202 >\r
203 \f;DISNXT        IS CALLED WITH A   JSR DISNXT,  IT SETS UP THE NEXT\r
204 ;       POINTER FOR THE DISPLAY'S BLKO BY INTERPRETING A\r
205 ;       COMMAND LIST SUPPLIED BY THE USER,  THIS COMMAND LIST\r
206 ;       IS DESCRIBED AT THE BEGINNING OF THE PROGRAM.  IF THE\r
207 ;       DATA TO BE TRANSMITTED TO THE DISPLAY WOULD VIOLATE THE\r
208 ;       MEMORY PROTECTION, THEN THE ROUTINE RETURNS TO THE\r
209 ;       CALLING LOCATION +1. OTHERWISE, IF THERE\r
210 ;       IS NO FURRTHER DATA TO BE OUTPUT (AS INDICATED BY THE\r
211 ;       USER'S COMMAND LIST) THE ROUTINE RETURNS TO THE CALLING\r
212 ;       LOCATION +2. OTHERWISE, THE NEXT POINTER FOR THE BLKO\r
213 ;       IS PLACED IN DISBLKO AND THE ROUTINE RETURNS TO THE CALLING\r
214 ;       LOCATION +3.\r
215 \r
216 IFE FTCHECK+FTMONP,<\r
217 DISNXT: 0                       ;JSR AT INTERRUPT OF UUO LEVELS\r
218 >\r
219 DISNX1: AOS     TAC,DISPNT      ;GET NEXT POINTER FROM LIST\r
220 ILUP:   HRRZM   TAC,DISPNT      ;UPDATE POINTER POINTER\r
221         ADRCHK  TAC\r
222         MOVE    TAC,@DISREL     ;GET NEXT WORD IN POINTER LIST\r
223         MOVEM   TAC,DISBKO      ;PLACE IN BLOK POINTER\r
224         HLROM   TAC,DISAV1      ;GET NEGATIVE WORD COUNT(MAKE LH NEG. TOO)\r
225 IFN T30,<\r
226         JUMPE   TAC,EXIT1       ;END OF COMMAND LIST?\r
227         TRNN    TAC,-1          ;INTENSITY?\r
228         JRST    INTCHK          ;YES>\r
229 IFE T30,<\r
230         TRNN    TAC,-1  ;END OF COMMAND LIST?\r
231         JRST    EXIT1   ;YES>\r
232         TLZN    TAC,-1          ;NO. POINTER TO NEW LIST?\r
233         JRST    ILUP            ;YES.\r
234         CAIL    TAC,JOBPFI      ;NO. ADDRESS IN BOUNDS?\r
235         CAML    TAC,DISHI\r
236         JRST    EXIT2           ;NO\r
237         SUB     TAC,DISAV1      ;YES. ADR. OF LAST WORD IN BLOCK.\r
238         ADRCHK  TAC\r
239         HRRZ    TAC,DISREL      ;FORM ABSOLUTE ADDR\r
240         ADDM    TAC,DISBKO      ;IN THE BLKO POINTER WORD\r
241         AOS     DISNXT          ;RETURN 2,4\r
242 EXIT1:  AOS     DISNXT\r
243 EXIT2:  MOVE    TAC,DISAV\r
244         CONO    DIS,@DISCON     ;SET UP DISPLAY STATUS WORD\r
245         JRST    2,@DISNXT       ;...\r
246 \r
247 IFN T30,<\r
248 INTCHK: MOVSS   TAC             ;PLACE INTENSITY IN CONO WORD\r
249         DPB     TAC,INTPNT\r
250         JRST    DISNX1          ;GET NEXT POINTER\r
251 INTPNT: POINT 3,DISCON,29>\r
252 \f;DISFIN        RECEIVES CONTROL WHEN THE DISPLAY'S BLKO POINTER REACHES\r
253 ;       ZERO.  IT SAVES THE TWO AC'S WHICH DISNXT USES AND\r
254 ;       DOES A JRST TO DISNXT.  ON A NORMAL RETURN IT RESTORES THE\r
255 ;       AC'S AND DISMISSES THE INTERPUT. ON A "NO MORE DATA"\r
256 ;       RETURN IT TRANSFERS CONTROL TO OVT2 FOR FURTHER\r
257 ;       DECISION AS TO WHETHER OR NOT TO CONTINUE DISPLAYING.\r
258 \r
259 DISFIN: MOVEM   TAC,DISAV       ;SAVE AC'S\r
260         JSR     DISNXT          ;SETUP NEXT BLKO POINTER\r
261         JRST    ADRER\r
262         JRST    DVT2            ;RETURN HERE IF NO NEXT POINTER\r
263         JEN     @DISCHL         ;LET THE SCOPE DO THE REST\r
264 \r
265 ;DVT2   RECIVES CONTROL AT INTERRUPT LEVEL WHEN THE COMMAND LIST\r
266 ;       (SUPPLIED BY THE USER) RUNS OUT. IT SAVES THE AC'S FOR\r
267 ;       THIS CHANNEL AND IN THE PROCESS ENABLES REUTRNS BY POPJ\r
268 ;       AND SIMILAR GOOD THINGS SINCE IT ALSO STORES THE PC FROM\r
269 ;       THE JSR IN THE GENERAL PC LOCATION FOR THIS CHANNEL\r
270 ;       IF THE DISPLAY IS OFF. IT DOES NOT RESTART IT.\r
271 ;       IT CHECKS TO SEE IF THE CLOCK HAS RUN OUT BEFORE THE PICTURE;\r
272 ;       IF SO, IT CALLS DISBEG TO RESTART THE DISPLAY WITH A NEW\r
273 ;       COMMAND LIST.  IT TURNS OFF THE IO ACTIVE BIT WHICH WAS\r
274 ;       TURNED ON BY THE OUTPUT ROUTINE; THIS INSURES THAT ANY\r
275 ;       OUTPUT COMMAND WILL DISPLAY AT LEAST ONE PICTURE. IF\r
276 ;       THE JOB WAS IN AN IO-WAIT, IT IS RELEASED.\r
277 \r
278 DVT2:   JSR     DISSAV          ;ASK EXEC TO SAVE AC'S\r
279         MOVEI DEVDAT,DISDDB     ;SETUP ACS\r
280         MOVSI   TAC,SHF\r
281         MOVSI   DAT,NSHF\r
282         LDB     ITEM,PJOBN\r
283         PUSHJ   PDP,DISOFF\r
284         MOVSI   IOS,DISWAT      ;INDICATE PICTURES FINISHED\r
285         IORB    IOS,DISIOS      ;...\r
286         TLON    IOS,DISUUI      ;RESUME DISPLAY, NEW UUO.\r
287         JRST    DVT6            ;YES, STAY IN IO WAIT\r
288         TDNE    TAC,JBTSTS(ITEM)        ;DOES SYSTEM WANT TO SHUFFLE THIS JOB?>\r
289         JRST    DVT4            ;YES\r
290         TLNE    IOS,DISTAR      ;HAS CLOCK TRIGGERED?\r
291         PUSHJ   PDP,DISBEG      ;YES, RESTART DISPLAY\r
292         JRST DVT3\r
293 DVT4:   TLNE    IOS,DISTAR      ;DID CLOCK FINISH BEFORE PICTURE?\r
294         PUSHJ   PDP,CLKREQ      ;YES, PUT IN CLOCK REQUEST.\r
295 DVT5:   ANDCAM  DAT,JBTSTS(ITEM)        ;TURN OFF NSHF SO JOB CAN BE SHUFFLED\r
296 DVT3:   MOVE    IOS,DISIOS      ;BIT FIDDLING TIME\r
297         TRZ     IOS,IOACT       ;SIGNAL DISPLAY CAN BE CLOSED\r
298         TLZE    IOS,IOW         ;IS DISPLAY CAUSING AN IO-WAIT?\r
299         PUSHJ   PDP,SETIOD      ;UNWAIT THE JOB\r
300         MOVEM   IOS,DISIOS      ;RESTORE IO CONTROL WORD\r
301         JRST    DISRET          ;RESTORE AC'S AND DISMISS\r
302 DVT6:   MOVEM   IOS,DISIOS\r
303         PUSHJ   PDP,DISBEG      ;START NEW COMMAND LIST\r
304         JRST    DISRET\r
305 \f;DISREG        IS CALLED WITH A PUSHJ PDP,DISBEG,  IT DISABLES THE\r
306 ;       DISPLAY ITSELF (BY USING DISOFF) AND ALSO DISABLES THE\r
307 ;       CLOK RESTART AND RESETS THE POINTER TO THE USER'S\r
308 ;       COMMAND LIST TO THAT SPECIFIED ON THE LAST OUTPUT\r
309 ;       MINUS ONE.  IT ASKES DISNXT TO SET UP THE NEXT BLKO POINTER\r
310 ;       IF DISNXT IS UNSUCCESSFUL (I.E., IF THE USER COMMAND LIST\r
311 ;       IS NULL), THEN THE ROUTINE DOES A CLOSE. OTHERWISE, A\r
312 ;       REQUEST IS ENTERED FOR A CLOCK INTERRUPT AT THE END OF \r
313 ;       AT MOST TWO JIFFIES.  THIS CLOCK QUEUE REQUEST IS ENTERED\r
314 ;       ONLY IF THERE IS NONE ALREADY IN THE QUEUE.  THE PI\r
315 ;       CHANNELS FOR THE DISPLAY ARE TURNED ON AGAIN AND THE\r
316 ;       DISPLAY IS INITIALIZED BY A CONO.  IT SHOULD THEN REQUEST\r
317 ;       DATA AS SOON AS THE PI CHANNEL FOR THE BLKO IS TURNED ON.\r
318 ;       IT TURNS THIS CHANNEL ON AND RETURNS TO ITS CALLER.\r
319 \r
320 DISBEG: MOVSI   IOS,DISTAR+DISWAT       ;INDICATE FRESH DISPLAY\r
321         ANDCAM  IOS,DISIOS              ;...\r
322         HRRZ    TAC1,DISONE     ;GET POINTER LIST ADDR (-1)\r
323         HRRZM   TAC1,DISPNT     ;RESET POINTER POINTER WITH IT\r
324         JSR     DISNXT          ;ASK FOR FIRST WORD FOR BLKO\r
325         JRST    ADRER1\r
326         JRST    DISSTP          ;NULL LIST, CLOSE\r
327         PUSHJ   PDP,CLKREQ      ;ENTER CLOCK QUEUE REQUEST\r
328         CONO    DIS,@DISCON     ;INITIALIZE THE DISPLAY\r
329         MOVEI   TAC,PENON       ;ALLOW SPECIAL PI INTERRUPTS\r
330         HRRM    TAC,PENINT      ;...\r
331         CONO    PI,DISPON       ;ALLOW BLKO INTERRUPTS\r
332         POPJ    PDP,            ;RETURN\r
333 \r
334 CLKREQ: MOVSI   IOS,DISCKR      ;IF NO CLOCK INTERRUPT REQUESTED\r
335         MOVE    TAC,CLOKRT      ;RESET TIMER\r
336         CONO    PI,PIOFF        ;INHIBIT INTERRUPTS\r
337         TDON    IOS,DISIOS      ;ENTER ONLY A SINGLE CLOCK REQUEST\r
338         IDPB    TAC,CLOCK       ;PLACE REUQEST IN QUEUE\r
339         IORM    IOS,DISIOS      ;PROTECT AGAINST A DUPLICATE REQUEST\r
340         CONO    PI,PION         ;UNINHIBIT INTERRUPTS\r
341         POPJ    PDP,            ;RETURN\r
342 \r
343 CLOKRT: XWD     CLOK,2          ;CONTROL FOR CLOCK QUEUE: 2 JIFFIES\r
344                                 ;TWO JIFFIES\r
345 \f;CLOK  IS CALLED AT THE CLOCK LEVEL IN RESPONSE TO A REQUEST\r
346 ;       IN THE CLOCK QUEUE.  A BIT IS SET TO INDICATE THAT THE\r
347 ;       CLOCL PERIOD HAS ELAPSED.  IF THE DISPLAY IS STILL IN\r
348 ;       PROGRESS, CLOK RETURNS AT THIS POINT.  OTHERWISE, CLOK\r
349 ;       GOES TO DISBEG TO START UP THE DISPLAY.  DISBEG RETURNS\r
350 ;       WITH A POPJ PDP,\r
351 \r
352 CLOK:   MOVSI   IOS,DISCKR      ;INDICATE CLOCK REQUEST SERVICED\r
353         ANDCAB  IOS,DISIOS      ;...\r
354         TLOE IOS,DISUUI\r
355         MOVSI   IOS,DISTAR      ;ASK DISPLAY TO RESTART\r
356         IORB    IOS,DISIOS      ;...\r
357         TLNN    IOS,DISWAT      ;HAS DISPLAY FINISHED?\r
358         POPJ    PDP,            ;NO. WIAT FOR IT TO DO SO\r
359         MOVEI   DEVDAT,DISDDB\r
360         MOVSI   TAC,NSHF\r
361         LDB     ITEM,PJOBN\r
362         TDNE    TAC,JBTSTS(ITEM)        ;IS SHUFFLE LOCKED OUT?\r
363         JRST    DISBEG          ;YES, RESTART DISPLAY AND RETURN\r
364         IORM    TAC,JBTSTS(ITEM)        ;NO. LOCK IT OUT.\r
365         MOVE    TAC,JBTADR(ITEM)        ;RESET DISHI AND DISREL AFTER SHUFFLING\r
366         HLRZM   TAC,DISHI\r
367         HRRM    TAC,DISREL\r
368         JRST    DISBEG          ;RESART DISPLAY AND RETURN\r
369 \r
370 ;ADRER  SERVICES PROTECTION VIOLATIONS DISCOVERED BY DISNXT.\r
371 ;       IT DOES A CLOSE AND THEN CALLS THE MONITOR'S ERROR PRINTING\r
372 ;       ROUTINES TO INFORM THE USER.\r
373 \r
374 ADRER:  JSR     DISSAV          ;SAVE AC'S AGAIN\r
375 ADRER1: PUSHJ   PDP,DISDSP+DCL  ;DO A CLOSE\r
376         MOVEI   DEVDAT,DISDDB   ;TELL ERROR ROUTINE WHO'S UNHAPPY\r
377         JRST    ADRERR          ;GO GRIPE\r
378 ;DISIN  HANDLES LITE PEN UUO (INPUT) IN A RUDIMENTARY FASHION\r
379 ;       BY RETURNING (TO THE ADDR SPECIFIED BY THE ADDR FIELD\r
380 ;       OF THE INPUT UUO) THE LAST PEN COORIDNATES SEEN,\r
381 \r
382 DISIN:  MOVNI   TAC,1\r
383         EXCH    TAC,PENLOC      ;GET LATEST COORDINATES,\r
384         JRST    STOTAC          ;STORE AND RETURN\r
385 \f;DISOUT        DOES THE WORK OF THE OUTPUT UUO.  IT SETS A BIT TO\r
386 ;       INDICATE THAT THE DEVICE IS ACTIVE AND INHIBITS\r
387 ;       INTERUPTS WHICH MAY STILL BE IN PROGRESS. SINCE THE\r
388 ;       MONITOR CALLS WSYNCE BEFORE COMING HERE. THE USER IS\r
389 ;       GUARANTEED AT LEAST ONE PICTURE/OUTPUT.  THE USERS MEMORY\r
390 ;       BOUNDS ARE STORED FOR QUICK USE AT INTERRUPT LEVEL W/0\r
391 ;       SAVING AC'S.  THE LOCATION OF THE COMMAND LIST (-1) IS\r
392 ;       STORED FOR USE IN SETTING UP BLKO POINTERS.  THE PI\r
393 ;       LOCATIONS (40 + 2J) ARE INITIALIZED WITH A BLKO IN\r
394 ;       THE EVEN LOCATIONS AND A JSR TO DISFIN IN THE ODD LOCATION,\r
395 ;       THE NON-DATA CHANNEL CONSO IS SETUP TO BELIEVE IN THE\r
396 ;       A POPJ PDP, IT RETURNS ON BEHALF OF THE OUTPUT UUO.\r
397 \r
398 DISOUT: TLO     IOS,IO+DISWAT   ;INDICATE OUTPUT; REQUEST START UP\r
399         TRO     IOS,IOACT       ;INDICATE DEVICE ACTIVE\r
400         SUBI    UUO,1           ;ALLOW FOR INCREMENT AT INTERRUPT\r
401         MOVE    TAC,BLKLIT      ;FEEDS WORDS TO THE DISPLAY\r
402         MOVEM   TAC,DISBLK      ;FROM EVEN NUMBERED INTERRUPT LOC\r
403         MOVE    TAC,JSRLIT      ;SERVICE THE END OF BLKO\r
404         MOVEM   TAC,DISJSR      ;FROM ODD INTERRUPT LOC\r
405         MOVEI   TAC,PENON       ;SETUP CONSO BITS ON SPECIAL CHANNEL\r
406         HRRM    TAC,PENINT      ;...\r
407         IORB    IOS,DISIOS      ;SET IOACT ON; INDICATE OUTPUT\r
408         HRRZM   UUO,DISONE      ;SET NEW COMMAND LIST ORIGIN\r
409         MOVSI IOS,DISUUI\r
410         IORM    IOS,DISIOS      ;ALLOW DISPLAY\r
411         CONSZ   DIS,@DISCON     ;DISPLAY ALREADY IN USE\r
412         ANDCAM IOS,DISIOS\r
413         JRST    CLKREQ          ;ENTER CLOCK QUEUE REQUEST AND POPJ\r
414 \r
415 BLKLIT: BLKO    DIS,DISBKO\r
416 JSRLIT: JSR     DISCHL\r
417         END\r