Fixed typos.
[retro-software/dec/tops10/v4.5.git] / src / lptser.mac
1 TITLE   LPTSER - LINE PRINTER SERVICE ROUTINE FOR MULTIPLE LINE PRINTERS - V405\r
2 SUBTTL  T. W. MCMANUS /TNM   TS   20 MAY 69\r
3         XP VLPTSR,405           ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP\r
4 \r
5 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN COMMON:\r
6 \r
7         EXTERNAL CPOPJ1, PION, PIOFF\r
8 \r
9 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN CLOCK1:\r
10 \r
11         EXTERNAL SETIOD, WAIT1\r
12 \r
13 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN ERRCON:\r
14 \r
15         EXTERNAL HNGSTP, ILLINP\r
16 \r
17 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN UUCON:\r
18 \r
19         EXTERNAL ADVBFE, IOSET, OUT, SETACT, STOIOS\r
20 \r
21 ;THE FOLLOWING SYMBOLS ARE REFERENCED OUTSIDE OF LPTSER:\r
22 \r
23         INTERN LPTINT, LPTNXT, LPTECM, LPTDON, LPTDSP\r
24         ENTRY LPTSER\r
25 \r
26 LPTSER:\r
27 \f;LINE PRINTER CONTROL REGISTER MNEMONIC DEFINITIONS\r
28 \r
29         LPTCLR=1B25                     ;CLEAR LINE PRINTER BUFFER\r
30         LPTLOV=1B26                     ;LINE OVERFLOW FLAG (PDP-6 ONLY)\r
31         LPTERR=1B27                     ;ERROR FLAG\r
32         LPTBSY=1B28                     ;BUSY FLAG\r
33         LPTDON=1B29                     ;DONE FLAG\r
34         LPTECM=7B32                     ;ERROR CHANNEL MASK\r
35         LPTDCM=7B35                     ;DONE CHANNEL MASK\r
36         LPTBDM=LPTBSY+LPTDON            ;BUSY/DONE FLAG MASK\r
37 \r
38 ;LINE PRINTER DEVICE DEPENDANT I/O STATUS MNEMONIC DEFINITIONS\r
39 \r
40         LPTEND=Z(1B10)                  ;CLOSE UUO HAS BEEN DONE\r
41         LPTSYN=Z(1B11)                  ;CREF AFTER CLOSE UUO HAS BEEN SENT\r
42 \r
43 ;LINE PRINTER DEVICE DATA BLOCK ADDRESSING MNEMNIC DEFINITIONS\r
44 \r
45         LPTCON=-4                       ;RH = SKIP CHAIN MASK REGISTER\r
46         LPTPTR= 7                       ;BLOCK OUTPUT POINTER\r
47         LPTCH= 11                       ;INTERRUPT CHANNEL ASSIGNMENTS\r
48         LPTSVE=12                       ;DDB ROUTINE TO SAVE AC'S\r
49         LPTEX1=16                       ;DDB EXIT ROUTINE IF AC'S NOT SAVED\r
50         LPTSV2=20                       ;TEMP. SAVE LOCN. FOR TAC\r
51         LPTECH=21                       ;CONSZ LP?,LPTECM\r
52         LPTDNE=22                       ;CONSO LP?,LPTDON\r
53         LPTCSO=23                       ;CONSO LP?,(TAC)\r
54         LPTCSZ=24                       ;CONSZ LP?,(TAC)\r
55         LPTCNI=25                       ;CONI  LP?,TAC\r
56         LPTCNO=26                       ;CONO  LP?,(TAC)\r
57         LPTDTO=27                       ;DATAO LP?,(TAC)\r
58         LPTBKO=30                       ;BLKO  LP?,LP?PTR\r
59 \r
60 ;LINE PRINTER SERVICE DISPATCH TABLE\r
61 \r
62         JRST LPTINI                     ;INITIALIZE\r
63         JRST LPTHNG                     ;HUNG DEVICE ERROR\r
64 LPTDSP: JRST LPTREL                     ;RELEASE\r
65         JRST LPTCLS                     ;CLOSE\r
66         JRST LPTOUT                     ;OUTPUT\r
67         JRST ILLINP                     ;INPUT\r
68 \f;LINE PRINTER INITIALIZATION, HUNG DEVICE AND RELEASE CODE\r
69 \r
70         ;LPTINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM\r
71         ;IOGO IN SYSINI WITH THE DDB ADDRESS IN DEVDAT\r
72         \r
73         ;LPTHNG IS CALLED FROM DEVCHK IN UUOCON (IOCSS) WITH\r
74         ;THE DDB ADDRESS IN DEVDAT WHENEVER A LINE PRINTER\r
75         ;HUNG DEVICE COUNT IS DECREMENTED TO ZERO\r
76 \r
77         ;LPTREL IS CALLED FROM RELEA1 IN UUOCON WITH THE DDB\r
78         ;ADDRESS IN DEVDAT WHENEVER A RELEASE UUO IS EXECUTED\r
79         ;FOR A LINE PRINTER\r
80 \r
81         ;EACH OF THE ABOVE ROUTINE MUST:\r
82         ;\r
83         ;       1.  CLEAR THE SPECIFIED LINE PRINTER\r
84         ;       2.  DEASSIGN BOTH THE ERROR AND DONE INTERRUPT\r
85         ;            CHANNELS FOR THE LINE PRINTER\r
86         ;       3.  CLEAR THE SKIP CHAIN INTERRUPT MASK FLAGS\r
87         ;            FOR THAT LINE PRINTER\r
88 \r
89         ;NOTE:  THE LPTINI CODE FORCES IOGO IN SYSINI TO INVOKE\r
90         ;       LPTINI FOR EACH LINE PRINTER ON THE SYSTEM RATHER\r
91         ;       THAN FOR THE NORMAL CASE WHERE IT INVOKES THE\r
92         ;       INITIALIZATION CODE ONCE FOR EACH DISPATCH TABLE.\r
93         ;\r
94         ;       THEREFORE, THE CORRECT OPERATION OF THE LPTINI CODE\r
95         ;       IS DEPENDANT UPON THE IOGO CODE WHICH SHOULD BE:\r
96         ;\r
97         ;               PUSHJ PDP,DINI(AC3)\r
98         ;               HRRZM AC3,SAVITM\r
99 \r
100 LPTHNG:\r
101 LPTREL:\r
102         SOS (PDP)                       ;COUNTERACT SKIP RETURN\r
103 LPTINI: MOVEI TAC,LPTCLR                ;CLEAR THE LINE PRINTER\r
104         XCT LPTCNO(DEVDAT)\r
105         HLLZS LPTCON(DEVDAT)            ;CLEAR SKIP CHAIN MASK FLAGS\r
106         JRST CPOPJ1                     ;SKIP RETURN IF ENTERED AT LPTINI\r
107                                         ; TO FORCE CALL FOR EACH LPT\r
108 \r
109 ;LINE PRINTER CLOSE UUO ROUTINE\r
110 \r
111 LPTCLS: TLO IOS,LPTEND                  ;TURN ON THE END FLAG\r
112         TLZ IOS,LPTSYN                  ;TURN OFF SYNCHRONIZATION FLAG\r
113         MOVEM IOS,DEVIOS(DEVDAT)        ;SAVE IOS IN THE DDB\r
114         JRST OUT                        ; AND RETURN TO UUOCON\r
115 \f;LINE PRINTER OUTPUT UUO ROUTINE\r
116 \r
117 LPTOUT: SETZ TAC,                       ;CLEAR ALL POSSIBLE\r
118         XCT LPTCNO(DEVDAT)              ; LINE PRINTER FLAGS\r
119         MOVEI TAC,LPTERR                ;SET MASK FOR ERROR FLAG\r
120         XCT LPTCSO(DEVDAT)              ;SKIP IF ERROR FLAG IS ON\r
121         JRST .+3                        ; LPT IS NOT OFF, NOT ON LOCAL\r
122         PUSHJ PDP,HNGSTP                ;STOP JOB AND PRINT REMINDER\r
123         JRST LPTOUT                     ;TRY AGAIN WHEN USER TYPES "CONT"\r
124         TLNE IOS,IOBEG                  ;IS THIS FIRST OUTPUT SINCE INIT?\r
125         JRST LPTNEW                     ; YES\r
126         PUSHJ PDP,LPTSET                ; NO, SET UP BLKO POINTER\r
127 LPTGO:  PUSHJ PDP,SETACT                ;SET I/O ACTIVE BIT, STORE IOS\r
128                                         ; AND SET HUNG DEVICE COUNT\r
129         MOVE TAC,LPTCH(DEVDAT)          ;GET CHANNEL ASSIGNMENTS FROM DDB\r
130         TLNE IOS,IOBEG                  ;IS THIS FIRST OUTPUT SINCE INIT?\r
131         IORI TAC,LPTCLR+LPTDON          ;SET LPTCLR IF IOBEG:=1, ELSE\r
132         XORI TAC,LPTDON                 ; SET LPTDON\r
133         HRLI TAC,LPTLOV+LPTERR+LPTDON   ;GET SKIP CHAIN MASK FLAGS\r
134         CONO PI,PIOFF                   ;TURN OFF PI TO PREVENT IMM. INT.\r
135         XCT LPTCNO(DEVDAT)              ;SEND CONDITIONS OUT TO LPT\r
136         HLRM TAC,LPTCON(DEVDAT)         ;SAVE SKIP CHAIN MASK FLAGS\r
137         CONO PI,PION                    ;REENABLE ALL INTERRUTPS\r
138         POPJ PDP,                       ; AND RETURN TO UUOCON\r
139 \r
140 LPTNEW: TLO IOS,IO                      ;SET I/O DIRECTION TO OUTPUT\r
141         SETZM LPTPTR(DEVDAT)            ;CLEAR BLKO POINTER\r
142         JRST LPTGO                      ;RETURN TO MAINSTREAM\r
143 \f;LINE PRINTER INTERRUPT SERVICE ROUTINE\r
144 \r
145 LPTINT: XCT LPTECH(DEVDAT)              ;SKIP IF NO ERROR CHANNEL ASSIGNED\r
146         XCT LPTDNE(DEVDAT)              ;SKIP IF DONE FLAG IS UP\r
147         JRST LPTER1                     ; BRANCH TO ERROR SERVICE ROUTINE\r
148         SKIPL LPTPTR(DEVDAT)            ;BLKO COUNT TO 0 ON PREV. INTERRUPT\r
149         JRST LPTSVE(DEVDAT)             ; YES, GO SAVE ORIGINAL AC'S\r
150         XCT LPTBKO(DEVDAT)              ; NO, SEND NEXT WORD FOR PRINTING\r
151         JRST LPTEX1(DEVDAT)             ;LAST WORD SENT BUT INTERRUPT PENDING\r
152         JRST LPTEX1(DEVDAT)             ;GO RESTORE DEVDAT AND RETURN\r
153 \r
154 LPTNXT:                                 ;ENTER HERE AFTER DDB ROUTINE SAVE\r
155                                         ; ORIGINAL AC'S IN PROPER CHANNEL\r
156                                         ; SAVE AREA AND SETS UP DEVDAT\r
157                                         ; TO POINT TO DDB AGAIN\r
158 \r
159         PUSHJ PDP,IOSET                 ;SET AC PROG:= JOB AREA ADDRESS AND\r
160                                         ; AC IOS:= DEVIOS IN THE DDB\r
161         TLZE IOS,IOBEG                  ;FIRST BUFFER SINCE INIT?\r
162         JRST LPTBG1                     ; YES, GO OUTPUT A CRFF\r
163         PUSHJ PDP,ADVBFE                ; NO, ADVANCE TO NEXT BUFFER\r
164         JRST LPTOFF                     ;CANNOT ADVANCE, BUFFER UNAVAILABLE\r
165         PUSHJ PDP,LPTSET                ;SET UP NEW BLKO POINTER\r
166 LPTWCK: TLZE IOS,IOW                    ;IS JOB WAITING FOR I/O COMPLETION?\r
167         PUSHJ PDP,SETIOD                ; YES, ARRANGE FOR JOB TO RUN AGAIN\r
168 LPTEX2: JRST STOIOS                     ;SAVE IOS, RESET HUNG DEVICE COUNT\r
169                                         ; AND DISMISS INTERRUPT\r
170 \r
171 LPTOFF: TLNN IOS,LPTEND                 ;SKIP IF CLOSE HAS BEEN DONE\r
172         JRST LPTOF1                     ; GO TURN PRINTER OFF UNTIL NEXT OUTPUT\r
173         TLON IOS,LPTSYN                 ;HAS FINAL CRFF BEEN OUTPUT?\r
174         JRST LPTBG2                     ; NO, SO GO DO IT\r
175         TLZ IOS,LPTEND                  ; YES, SO CLEAR END FLAG\r
176 LPTOF1: TRZ IOS,IOACT                   ;CLEAR I/O ACTIVE BIT\r
177         SETZ TAC,                       ;CLEAR TAC AND\r
178         XCT LPTCNO(DEVDAT)              ; TURN LPT OFF\r
179         HLLZS LPTCON(DEVDAT)            ;CLEAR SKIP CHAIN MASK FLAGS\r
180         JRST LPTWCK                     ; AND BRANCH\r
181 \r
182 LPTBG1: PUSHJ PDP,LPTSET                ;SET UP INITIAL BLKO POINTER *****\r
183 LPTBG2: MOVEI TAC,[EXP 15B6+14B13]      ;SEND OUT A CRFF\r
184         XCT LPTDTO(DEVDAT)\r
185         JRST LPTEX2                     ;GO DISMISS ITERRUPT\r
186 \f;LINE PRINTER ERROR HANDLING ROUTINE\r
187 \r
188 LPTER1: MOVEM TAC,LPTSV2(DEVDAT)        ;SAVE TAC IN DDB\r
189         MOVEI TAC,LPTLOV                ;GET LINE OVERFLOW ERROR MASK\r
190         XCT LPTCSO(DEVDAT)              ;SKIP IF LINE OVERFLOW FLAG IS ON\r
191         JRST LPTER2                     ; GO CHECK IF PREVIOUS ERROR OCCURRED\r
192         MOVN TAC,[EXP 100001]           ;DECREMENT BLK0 POINTER\r
193         ADDM TAC,LPTPTR(DEVDAT)\r
194         MOVE TAC,[EXP 15B6+12B13]       ;PRINT CRLF\r
195         XCT LPTDTO(DEVDAT)\r
196         JRST LPTER4\r
197 \r
198 LPTER2: XCT LPTECH(DEVDAT)              ;SKIP IF ERROR INTERRUPT NOT ASSIGNED\r
199         JRST LPTER5                     ; ERROR CONDITION DETECTED\r
200         MOVE TAC,LPTCH(DEVDAT)          ;GET INTERRUPT CHANNEL ASSIGNMENTS\r
201         ANDI TAC,LPTDCM                 ;MASK OUT ERROR CHANNEL\r
202         IORI TAC,LPTBSY                 ;SET THE BUSY FLAG\r
203         XCT LPTCNO(DEVDAT)              ;SEND IT OUT TO THE LPT\r
204         MOVEI TAC,LPTLOV+LPTERR+LPTDON  ;ENABLE FOR ALL INTERRUPTS\r
205 LPTER3: HRRM TAC,LPTCON(DEVDAT)         ;SAVE SKIP CHAIN MASK FLAGS\r
206 LPTER4: MOVE TAC,LPTSV2(DEVDAT)         ;RESTORE SAVED ACCUMULATOR\r
207         JRST LPTEX1(DEVDAT)             ; AND GO DISMISS INTERRUPT\r
208 \r
209 LPTER5: MOVE TAC,LPTCH(DEVDAT)          ;GET INTERRUPT CHANNEL ASSIGNMENTS\r
210         ANDI TAC,LPTDCM                 ;MASK OUT ERROR CHANNEL ASSIGNMENT\r
211         IORI TAC,LPTBSY                 ;SET BUSY FLAG\r
212         XCT LPTCNO(DEVDAT)              ;SEND IT OUT TO THE LPT\r
213         MOVEI TAC,LPTDON                ;ENABLE FOR DONE FLAG ONLY\r
214         JRST LPTER3\r
215 \f;LINE PRINTER BLKO POINTER SETUP ROUTINE\r
216 \r
217 LPTSET: MOVEI TAC,@DEVOAD(DEVDAT)       ;GET ABS. ADDR. OF CURRENT BUFFER\r
218         MOVN TAC1,1(TAC)                ;GET NEGATIVE WORD COUNT\r
219         HRL TAC,TAC1                    ;COMBINE NEG. WORD COUNT AND ADDR,\r
220         AOJ TAC,                        ;INCREMENT BUFFER ADDRESS TO FORM\r
221         MOVEM TAC,LPTPTR(DEVDAT)        ; LPTPTR:= -(WORD COUNT),(BUFF, ADDR, +1)\r
222         POPJ PDP,                       ; AND RETURN\r
223 \r
224 \r
225         END\r
226 \r
227 \r
228 \r
229 \r
230         \r
231 \0\0\0\0