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