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