Trailing-Edge
-
PDP-10 Archives
-
BB-P363B-SM_1985
-
mcb/drivers/le.lst
There are no other files named le.lst in the archive.
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26
LE.M11 30-DEC-82 03:53 TABLE OF CONTENTS
1516 Macro Calls & Dispatch Entries
1571 LE Data Base Offsets
1723 Start / Stop Device (FC.CTL)
1853 Timer handler (FC.TIM)
1897 Resource Return
1907 Message Received (FC.RCP)
2662 Support Routines
3251 Interrupt Service
3419 Miscellaneous Tables
3506 Tables
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 1
LE.M11 30-DEC-82 03:53
1 .ENABL LC
2 .title LE LP11 LLC and Driver
3 .ident "X02090"
4
5 ; COPYRIGHT (c) 1980, 1981, 1982
6 ; DIGITAL EQUIPMENT CORPORATION
7 ; Maynard, Massachusetts
8 ;
9 ; This software is furnished under a license and may be used
10 ; and copied only in accordance with the terms of such license
11 ; and with the inclusion of the above copyright notice. This
12 ; software or any other copies thereof may not be provided or
13 ; otherwise made available to any other person. No title to
14 ; and ownership of the software is hereby transferred.
15 ;
16 ; The information in this software is subject to change
17 ; without notice and should not be construed as a commitment
18 ; by DIGITAL EQUIPMENT CORPORATION.
19 ;
20 ; DIGITAL assumes no responsibility for the use or reliability
21 ; of its software on equipment which is not supplied by
22 ; DIGITAL.
23 ;
24 ;
25 ; Originally written by TOM POWERS
26 ; December, 1976
27 ;
28 ; X01010 thru X01100 omitted because following update constituted
29 ; such a major change that previous audit trail
30 ; was rendered meaningless - or at best useless.
31 ;
32 ; X02000 10-June-81 Buren Hoffman
33 ; Extensive modifications to correspond to MCB V3.0,
34 ; and a major facelift to aid maintainability.
35 ;
36 ; X02010 12-June-81 Buren Hoffman
37 ; Fixed old calls to $CCBGT and $CCBRT to use new
38 ; $CBBGT and $CBBRT.
39 ;
40 ; X02020 16-June-81 Buren Hoffman
41 ; Added NOOP dispatches for Power-Failure and Initialization
42 ; entries in the Timer Dispatch table.
43 ;
44 ; X02030 16-June-81 Buren Hoffman
45 ; Minor bug fixes (i.e., typos, ...)
46 ;
47 ; X02040 18-June-81 Buren Hoffman
48 ; Call TIMPIN routine for process initialization
49 ;
50 ; X02050 9-July-81 Buren Hoffman
51 ; Simplified interrupt handling routine by removing
52 ; compression-pair handling, and restructuring routine.
53 ;
54 ; X02060 12-July-81 Buren Hoffman
55 ; Fixed bug in interrupt handler - device was being force fed
56 ; whether it wanted it or not.
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 1-1
LE.M11 30-DEC-82 03:53
57 ;
58 ; X02070 15-July-81 Buren Hoffman
59 ; Corrected problem in context switch. Register was being
60 ; clobbered.
61 ;
62 ; X02080 5-August-81 Buren Hoffman
63 ; Reduced number of LPT physical buffers from 12 to 6.
64 ;
65 ; x02090 14-sept-81 Ron Platukis
66 ; Fix routine SN$ATT to not set overprint error if there
67 ; -was a page limit overflow.
68 ;
69
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 2
LE.M11 30-DEC-82 03:53 MACRO CALLS & DISPATCH ENTRIES
71 .sbttl Macro Calls & Dispatch Entries
72
73 .mcall NURDF$,CCBDF$,SYNDF$,SCDF$
74 .mcall PHD$B,DSP$,DSP$B,DSP$E,PUSH$S,POP$S,MAP$,SMAP$,DAT$,END$
75 000000' NURDF$
76 000000' CCBDF$
77 000000' SYNDF$
78 000000' SCDF$
79
80 ;+
81 ; Identify us to MCB
82 ;+
83 000000' PHD$B LE
84 000040' PHD$D LEMCB
85 000020' PHD$E
86
87 000000' .psect $PLIT$,D,RO
88
89 ;+
90 ; Dispatch tables
91 ;-
92 000000' LEMCB: DSP$B
93 000000' DSP$ ; Asynchronous trap
94 000002' DSP$ FC.XME ; Xmit enable
95 000004' DSP$ FC.RCE ; Receive enable
96 000006' DSP$ FC.KIL ; Kill
97 000010' DSP$ FC.CTL,LECTL ; Control (start / stop)
98 000012' DSP$ FC.TIM,LETIM ; Timeout (clock)
99 000014' DSP$ FC.XCP,LEDONE ; Xmit complete (resource ret)
100 000016' DSP$ FC.RCP,LEDSP ; Receive complete (arriving data)
101 000020' DSP$ FC.KCP ; Kill complete
102 000022' DSP$ FC.CCP ; Control complete
103 000024' DSP$E
104
105 ;+
106 ; Control dispatch
107 ;-
108 000024' LECTL: CALLR @1$(R3)
109 000030' 1$: DSP$B
110 000030' DSP$
111 000032' DSP$ FM.STR,DVOPEN ;Start device
112 000034' DSP$ FM.STP,DVCLOS ;Stop device
113 000036' DSP$E
114
115 ;+
116 ; Timer dispatch
117 ;-
118 000036' LETIM: CALLR @1$(R3)
119 000042' 1$: DSP$B
120 000042' DSP$ FM.STM ;Short timer
121 000044' DSP$ FM.LTM,CLOCK ;Long timer
122 000046' DSP$ FM.PWF,NOOP ;Power failure
123 000050' DSP$ FM.PIN,TIMPIN ;Initialization
124 000052' DSP$E
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 3
LE.M11 30-DEC-82 03:53 LE DATA BASE OFFSETS
126 .SBTTL LE Data Base Offsets
127
128 ; NURD LP11 Device driver Data Base
129
130 000052' DAT$ DSR
131 000000 000001 L.TIMC: .blkb 1 ; Timer byte
132 000001 000001 L.NRD: .blkb 1 ; NRD's PIX
133 000002 L.CSR: CSR$W ; One word CSR pointer
134 000020 DTXTSZ= 16. ; Data/features process context allocated
135 000004 000020 L.DTXT: .blkw DTXTSZ ; Context block for data/features process
136 000044 000001 L.DTXL: .blkb 1 ; Number of words on stack at sleep time
137 000046 .even
138 000046 000001 L.DFSP: .blkw 1 ; Stack origin
139 000050 L.SYN: SYN$X ; Synch block
140 000056 000001 L.ASTS: .blkw 1 ; Action status bit map
141 000001 LA.CLO== 1 ; Closed
142 000002 LA.PAU = 2 ; Paused
143 000004 LA.ADN = 4 ; Abort when done with DDM queue
144 000010 LA.ABO = 10 ; Aborting
145 000020 LA.ABE = 20 ; Clear abort on EOF (else on clear)
146 000040 LA.CPC = 40 ; Clear page counter enable
147 000100 LA.AKR = 100 ; Acknowledge requested
148 000200 LA.ERR = 200 ; An error has been noted
149 000400 LA.EOF = 400 ; Current message has EOF
150 001000 LA.EOR = 1000 ; End of record (EOR) encountered
151 002000 LA.CTL = 2000 ; Control message to return
152 004000 LA.TMO = 4000 ; Device time out
153 010000 LA.PLE = 10000 ; Page limit error occurred
154 020000 LA.INT = 20000 ; Interrupt in progress
155 000060 000002 L.PUBP: .blkw 2 ; Buffer pointer doubleword
156 000064 000001 L.PUBS: .blkw 1 ; Buffer size down counter
157 000066 L.DDMQ: LST$D ; CCBs queued for output
158 000072 000001 L.PGCT: .blkw 1 ; Physical page count
159 000074 000001 L.PGLM::.blkw 1 ; Page limit register
160 000076 000001 L.PLNC: .blkb 1 ; Physical line count
161 000077 000001 L.HUNG: .blkb 1 ; Device hung timer
162
163 ; Miscellaneous items
164 000100 000001 L.IOCN: .blkw 1 ; Outstanding I/O count
165 000102 000001 L.IOWT: .blkw 1 ; Close wait flag (close CCB address)
166
167 ; Control message processing data base
168 000104 L.CMSQ: LST$D ; Control message queue
169 000110 000001 L.RECO: .blkb 1 ; Control message resource error flag
170 000111 000001 L.RATT: .blkb 1 ; Pending attention message flag - reason code
171 000112 000001 L.CAPP: .blkb 1 ; Pending capabilities message flag
172
173 ; Data & features processing data base
174 000113 000001 L.LNCT: .blkb 1 ; Line counter
175 000114 000001 L.COCT: .blkb 1 ; Column counter
176 000116 .even
177 000116 L.DLCQ: LST$D ; CCBs queued into DLC
178 000122 000001 L.MFLG: .blkb 1 ; Current NURD message flags
179 000123 000001 L.DMSQ: .blkb 1 ; Last good/current data sequence numbers
180 000124 000001 L.DMSG: .blkb 1 ; Data message segment count byte
181 000125 000001 L.DMSS: .blkb 1 ; Data message current segment size
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 3-1
LE.M11 30-DEC-82 03:53 LE DATA BASE OFFSETS
182 000126 000001 L.CAPN: .blkb 1 ; Current index into capabilities list
183 000127 000001 L.NFSP: .blkb 1 ; No. feature specs in current message
184 .even
185 000130 000001 L.DMCR: .blkw 1 ; Char repeat count, 2 bytes used as word
186 000132 000002 L.DMAD: .blkw 2 ; Data message address doubleword
187 000136 000001 L.DMBS: .blkw 1 ; Data message buffer size
188 000140 L.PLBQ: LST$D ; Free physical buffer queue
189 000144 000002 L.PLBP: .blkw 2 ; Character pointer doubleword
190 000150 000001 L.PLBS: .blkw 1 ; Buffer size down counter
191 000152 000001 L.PBRC: .blkb 1 ; Temp byte
192 000154 .even
193 000154 L.MSGQ: LST$D ; Outgoing message queue
194 000160 000002 L.MSGA: .blkw 2 ; Current message buffer address doubleword
195 000164 000001 L.MSGS: .blkw 1 ; Current message buffer size
196
197 ; LP11 common feature list
198 000166 000001 L.CFET: .blkb 1 ; Number of common features
199 000167 000001 .blkb 1 ; FE.DAT supported
200 000170 000001 .blkb 1 ; FE.SER not supported
201 000171 000001 .blkb 1 ; FE.LCR supported
202 000172 000001 .blkb 1 ; FE.FWD supported
203 000173 000001 .blkb 1 ; FE.EOF not supported
204 000174 000001 .blkb 1 ; FE.DVT not supported
205 000175 000001 .blkb 1 ; FE.TRN supported
206 000176 000001 .blkb 1 ; FE.FNM not supported
207 000177 000001 .blkb 1 ; FE.DWD supported
208 000011 LCFETL== .-L.CFET-1
209
210 000200 000001 L.DFET: .blkb 1 ; Number of device specific features
211 000201 000001 .blkb 1 ; 129 not defined
212 000202 000001 .blkb 1 ; LP.HT supported
213 000203 000001 .blkb 1 ; LP.SFC supported
214 000204 000001 .blkb 1 ; LP.OVP not supported
215 000205 000001 .blkb 1 ; LP.CVF not supported
216 000206 000001 .blkb 1 ; LP.FCC supported
217 000207 000001 .blkb 1 ; LP.VFR not supported
218 000210 000001 .blkb 1 ; LP.CHS supported
219 000211 000001 .blkb 1 ; LP.PLE supported
220 000212 000001 .blkb 1 ; LP.OPV not supported
221 000012 LDFETL== .-L.DFET-1
222
223 ; Feature blocks
224 000000 F.FSB = 0 ; (BM) Features status byte
225 000000 FB.CL0 = 0 ; Class 0 feature => <bit> form
226 000001 FB.CL1== 1 ; Class 1 feature => <cnt><...> form
227 000002 FB.WRD = 2 ; Feature is a word and F.FCV is offset to it
228 000004 FB.STR = 4 ; Feature is a string and F.FCV is the length
229 ; current value begins at F.FCV+1
230 ; Std value(if any) begins at F.FCV+1+(F.FCV)
231 000010 FB.STE = 10 ; Standard value exists
232 000020 FB.SST = 20 ; Standard is set
233 000040 FB.CP = 40 ; Change pending
234 000100 FB.CA = 100 ; Change allowed
235 000001 F.FCV = 1 ; Feature current value byte
236 000002 F.FSV = 2 ; Feature standard value byte
237
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 3-2
LE.M11 30-DEC-82 03:53 LE DATA BASE OFFSETS
238 000213 000001 LE.DAT::.blkb 1 ; Data mode
239 000131 LEDATS== FB.CL1!FB.SST!FB.STE!FB.CA ; Initial status of LE.DOF & LE.DAT
240 000214 000001 .blkb 1 ; ASCII
241 000215 000001 .blkb 1 ; ASCII is standard
242 000216 000001 LE.LCR::.blkb 1 ; Lower case raise
243 000100 LELCRS== FB.CL0!FB.CA ; Initial status of LE.LCR
244 000217 000001 .blkb 1 ; Off
245 000220 000001 LE.FWD::.blkb 1 ; Form width
246 000221 000001 .blkb 1
247 000222 000001 LE.TRN::.blkb 1 ; Record truncation
248 000130 LETRNS== FB.CL0!FB.CA!FB.SST!FB.STE ; Initial status of LE.TRN
249 000223 000001 .blkb 1 ; Off
250 000224 000001 .blkb 1 ; Off is standard
251 000225 000001 LE.DWD::.blkb 1 ; Device width
252 000226 000001 .blkb 1 ; Standard width
253
254 ; Device specific features
255 000227 000001 LE.HT:: .blkb 1 ; Horizontal tab
256 000031 LEHTS== FB.CL1!FB.SST!FB.STE ; Initial status of LE.HT
257 000230 000001 .blkb 1 ; Standard tabs on
258 000231 000001 .blkb 1
259 000232 000001 LE.SFC::.blkb 1 ; Standard VFU
260 000030 LESFCS== FB.CL0!FB.SST!FB.STE ; Initial status of LE.SFC
261 000233 000001 .blkb 1 ; On
262 000234 000001 .blkb 1
263 000235 000001 LE.FCC::.blkb 1 ; Fortran carriage control
264 000130 LEFCCS== FB.CL0!FB.CA!FB.SST!FB.STE ; Initial status of LE.FCC
265 000236 000001 .blkb 1 ; Off
266 000237 000001 .blkb 1
267 000240 000001 LE.CHS::.blkb 1 ; Character set
268 000241 000001 .blkb 1 ; 96 Character ASCII
269 000242 000001 LE.PLE::.blkb 1 ; Page limit enforcement
270 000133 LEPLES== FB.CL1!FB.WRD!FB.CA!FB.SST!FB.STE ; Initial status of LE.PLE
271 000243 000001 .blkb 1 ; Page counter
272 000244 000002 .blkb 2 ; Standard = 0 => Off
273
274 000246 END$
275
276 000000' .psect $CODE$,I,RO
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 4
LE.M11 30-DEC-82 03:53 START / STOP DEVICE (FC.CTL)
278 .sbttl Start / Stop Device (FC.CTL)
279 ;+
280 ; Initialize unit
281 ; R4 CCB
282 ; R5 Database
283 ;-
284 000000' DVOPEN: PUSH$S R4 ; Save incoming CCB pointer
285 000002' 032765 000001 000056 BIT #LA.CLO,L.ASTS(R5) ; Closed?
286 000010' 001550 BEQ 101$ ; No, then how can it be opened?
287 000012' 116465 000011 000001 MOVB C.PIX(R4),L.NRD(R5) ; Remember NRD's PIX
288 000020' 005075 000002 CLR @L.CSR(R5) ; Be very pessimistic
289 000024' 005065 000056 CLR L.ASTS(R5) ; Zap the action status word
290 000030' 005065 000064 CLR L.PUBS(R5) ; Flush current print buffer
291 000034' 105065 000044 CLRB L.DTXL(R5) ; Nothing waiting
292 000040' 005065 000132 CLR L.DMAD(R5) ; Flush source buffer in use
293 000044' 005065 000134 CLR L.DMAD+2(R5)
294 000050' 005065 000136 CLR L.DMBS(R5)
295 000054' 105065 000123 CLRB L.DMSQ(R5) ; The data message sequence number
296 000060' 005065 000160 CLR L.MSGA(R5) ; Current out message
297 000064' 005065 000162 CLR L.MSGA+2(R5)
298 000070' 005065 000164 CLR L.MSGS(R5)
299 000074' 005065 000100 CLR L.IOCN(R5) ; OUTSTANDING IO COUNT
300 000100' 005065 000102 CLR L.IOWT(R5) ; CLOSE-WAIT FLAG
301 000104' 105065 000077 CLRB L.HUNG(R5) ; HUNG DEVICE TIMER
302 000110' 105065 000110 CLRB L.RECO(R5) ; CONTROL RESOURCE ERROR FLAG
303 000114' 105065 000111 CLRB L.RATT(R5) ; PENDING ATTENTION MESSAGE FLAG
304 000120' 105065 000112 CLRB L.CAPP(R5) ; PENDING CAPABILITIES MESSAGE FLAG
305 000124' 005065 000072 CLR L.PGCT(R5) ; THE PAGE COUNTER
306 000130' 012700 000177 MOV #DEL,R0 ; INITIALIZE LP11 XLATION TABLE
307 000134' 105060 007720' CLRB LEASC(R0) ; SUPPRESS DEL
308 000140' 005300 DEC R0
309
310 000142' 110060 007720' 10$: MOVB R0,LEASC(R0) ; MOST OF TABLE IS ASCII TO ASCII
311 000146' 077003 SOB R0,10$
312 000150' 012700 000037 MOV #US,R0 ; SUPPRESS CONTROL CODES
313
314 000154' 105060 007720' 12$: CLRB LEASC(R0)
315 000160' 077003 SOB R0,12$
316 000162' 105067 007532 CLRB LEASC ; SUPPRESS NUL
317 000166' 012700 010120' MOV #FCXTB,R0 ; GET ADDRESS OF EXCEPTION TABLE
318 000172' 112001 15$: MOVB (R0)+,R1 ; GET LEASC OFFSET
319 000174' 100403 BMI 20$ ; DONE IF BYTE NEGATIVE
320 000176' 112061 007720' MOVB (R0)+,LEASC(R1) ; STUFF IN REPLACEMENT DATA
321 000202' 000773 BR 15$
322
323 ; Set all features with standards to standard
324 000204' 012700 000166 20$: MOV #L.CFET,R0 ; COMMON FEATURES
325 000210' 004767 000126 CALL 200$ ; DO ALL
326 000214' 012700 000200 MOV #L.DFET,R0 ; DEVICE SPECIFIC FEATURES
327 000220' 004767 000116 CALL 200$ ; ALL OF THEM TOO
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 5
LE.M11 30-DEC-82 03:53 START / STOP DEVICE (FC.CTL)
329 ; INIT PHYSICAL BUFFER POOL
330 000224' 012700 000006 MOV #LEPBFS,R0 ; RESERVE SEVERAL
331 000230' 004767 000000G 55$: CALL $RDBGT ; GET A PHYSICAL BUFFER
332 000234' 103414 BCS 70$ ; LOSE
333 000236' 005064 000014 CLR C.STS(R4) ; INIT STATUS
334 000242' 005064 000004 CLR C.STK(R4) ; CLEAR CCB POINTER
335 000246' 105064 000011 CLRB C.PIX(R4) ; MARK THE CCB AS STRICTLY LOCAL
336 000252' ENQ$ L.PLBQ ; QUEUE THE BUFFER TO THE FREE LIST
337 000264' 077017 SOB R0,55$
338
339 000266' 005765 000140 70$: TST L.PLBQ(R5) ; FAIL TO OPEN IF NONE AVAILABLE
340 000272' 001414 BEQ 100$
341 000274' 005065 000144 CLR L.PLBP(R5) ; INIT PHYSICAL BUFFER IN USE
342 000300' 005065 000146 CLR L.PLBP+2(R5)
343 000304' 005065 000150 CLR L.PLBS(R5)
344 000310' 012703 000001 MOV #S.SSUC,R3 ; RETURN SUCCESS
345 000314' 105215 INCB (R5) ; START THE TIMER
346 000316' 004767 000000G CALL $LTMEN ; ...
347 000322' 000405 BR 104$
348
349 000324' 052765 000001 000056 100$: BIS #LA.CLO,L.ASTS(R5) ; NOTE REMAINING CLOSED
350 000332' 012703 177754 101$: MOV #S.ERBO,R3 ; FAILED TO OPEN
351
352 000336' 104$: POP$S R4 ; RESTORE POINTER FOR COMMAND CCB
353 000340' 000474 BR CTLXIT ; Leave
354
355
356 ; Feature setting routine
357 000342' 060500 200$: ADD R5,R0 ; R0/FEATURE LIST OFFSET
358 000344' 005001 CLR R1
359 000346' 152001 BISB (R0)+,R1 ; GET NO. OF FEATURES
360 000350' 005003 210$: CLR R3
361 000352' 152003 BISB (R0)+,R3 ; GET ADDRESS OF FEATURE BLOCK
362 000354' 001403 BEQ 220$ ; EMPTY SLOT
363 000356' 060503 ADD R5,R3
364 000360' 004767 003320 CALL SETSTD ; SET IT TO STANDARD
365 000364' 077107 220$: SOB R1,210$
366 000366' NOOP: RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 6
LE.M11 30-DEC-82 03:53 START / STOP DEVICE (FC.CTL)
368 ;+
369 ; Stop unit
370 ;
371 ; R4 CCB
372 ; R5 Database
373 ;-
374
375 000370' DVCLOS: PUSH$S R4 ; SAVE COMMAND CCB POINTER
376 000372' 004767 006324 CALL $LESTP ; CLEAR PRINTER (SCREECHING HALT)
377 000376' 105015 CLRB (R5) ; Stop timer
378 000400' 052765 000001 000056 BIS #LA.CLO,L.ASTS(R5) ; MARK AS CLOSED
379 000406' 004767 005020 CALL Q$PURG ; FLUSH THE QUEUES
380
381 000412' 10$: DEQ$ L.PLBQ,20$ ; Get next physical buffer from queue
382 000432' 004767 000000G CALL $RDBRT ; Return it to system
383 000436' 000765 BR 10$ ; Continue
384
385 000440' 20$: DEQ$ L.CMSQ,30$ ; FLUSH ANY OUTSTANDING CONTROL MESSAGES
386 000460' 112764 000004 000012 MOVB #FC.RCE,C.FNC(R4) ; and return them
387 000466' 004767 000000G CALL $SCHED ; ...
388 000472' 000762 BR 20$
389
390 000474' 30$: POP$S R4 ; RESTORE COMMAND CCB POINTER
391 000476' 010465 000102 MOV R4,L.IOWT(R5) ; SET CLOSE WAIT FLAG
392
393 ; Complete close only when all CCB'S returned
394 000502' 005765 000100 STOPWT: TST L.IOCN(R5)
395 000506' 001402 BEQ 10$
396 000510' 105215 INCB (R5) ; Restart timer
397 000512' RETURN
398
399 000514' 105015 10$: CLRB (R5) ; STOP THE CLOCK
400 000516' 016504 000102 MOV L.IOWT(R5),R4 ; GET THE CLOSE CCB BACK
401 000522' 005065 000102 CLR L.IOWT(R5) ; COVER OUR TRACKS
402 000526' 012703 000001 MOV #S.SSUC,R3
403
404 000532' 010364 000014 CTLXIT: MOV R3,C.STS(R4) ; Set status
405 000536' 112764 000022 000012 MOVB #FC.CCP,C.FNC(R4) ; and function for completion
406 000544' CALLR $SCHED ; Leave
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 7
LE.M11 30-DEC-82 03:53 TIMER HANDLER (FC.TIM)
408 .sbttl Timer handler (FC.TIM)
409 ;+
410 ; R5 Database address
411 ;-
412
413 000550' 005765 000102 CLOCK: TST L.IOWT(R5) ; CHECK FOR CLOSE WAIT
414 000554' 001352 BNE STOPWT ; PREEMPTS ALL ELSE
415 000556' 105765 000110 TSTB L.RECO(R5) ; CHECK CONTROL RESOURCE ERROR
416 000562' 001404 BEQ 10$
417 000564' 105065 000110 CLRB L.RECO(R5) ; YES - FLUSH THE FLAG
418 000570' 004767 001012 CALL MSGFIN ; RESTART THE PROCESS
419
420 000574' 105765 000044 10$: TSTB L.DTXL(R5) ; Anything waiting for tick?
421 000600' 001402 BEQ 20$ ; Appears not
422 000602' 004767 006002 CALL ZZ$WAK ; Yes, resume it - it will return here
423
424 000606' 032765 000200 000056 20$: BIT #LA.ERR,L.ASTS(R5) ; CHECK DEVICE PROBLEMS
425 000614' 001411 BEQ 30$ ; NOT BECAUSE OF DEVICE ERROR
426 000616' 005775 000002 TST @L.CSR(R5) ; DEVICE ERROR WAS REASON
427 000622' 100406 BMI 30$ ; STILL HAVING PROBLEMS
428 000624' 004767 005244 CALL SN$ALR ; CURE HAS BEEN EFFECTED, NOTIFY USER
429 000630' 103403 BCS 30$ ; COULDN'T SEND ONE, COME BACK LATER
430 000632' 042765 000200 000056 BIC #LA.ERR,L.ASTS(R5) ; FLUSH ERROR BUT LEAVE LA.PAU
431 ; USER MUST RESUME
432
433 000640' 105765 000077 30$: TSTB L.HUNG(R5) ; CHECK HUNG TIMER
434 000644' 001414 BEQ 50$ ; NOT SET
435 000646' 105365 000077 DECB L.HUNG(R5) ; COUNT THE TOCK
436 000652' 001011 BNE 50$ ; STILL OK
437 000654' 052765 004000 000056 BIS #LA.TMO,L.ASTS(R5) ; DEVICE IS COMATOSE
438 000662' 105765 000111 TSTB L.RATT(R5) ; CHECK PENDING ATTENTION MESSAGE
439 000666' 001006 BNE 55$ ; YES - DON'T GENERATE ANOTHER
440 000670' 112765 000001 000111 MOVB #N.ASTC,L.RATT(R5) ; SET PENDING ATTENTION FLAG
441 ; (REASON CODE)
442
443 000676' 105765 000111 50$: TSTB L.RATT(R5) ; CHECK PENDING ATTENTION MESSAGE
444 000702' 001402 BEQ 60$
445 000704' 004767 005232 55$: CALL SN$ATT ; TRY TO SEND ONE
446 000710' 105765 000112 60$: TSTB L.CAPP(R5) ; CHECK PENDING CAPABILITIES MESSAGE
447 000714' 001402 BEQ 70$
448 000716' 004767 005456 CALL SN$CAP ; TRY TO SEND ONE
449 000722' 105215 70$: INCB (R5) ; RESET THE CLOCK FOR NEXT TOCK
450 000724' RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 8
LE.M11 30-DEC-82 03:53 RESOURCE RETURN
452 .sbttl Resource Return
453 ;+
454 ; Resource return
455 ;-
456 000726' 005365 000100 LEDONE: DEC L.IOCN(R5) ; COUNT THE RETURNED RESOURCE
457 000732' 002002 BGE 10$
458 000734' 005065 000100 CLR L.IOCN(R5) ; BLEW IT SOMEWHERE
459 000740' 012701 000120 10$: MOV #80.,R1 ; SET SIZE OF RETURNING BUFFER
460 000744' CALLR $CBBRT ; SEND IT BACK, AND CCB TOO
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 9
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
462 .sbttl Message Received (FC.RCP)
463 ;+
464 ; Dispatch according to the type of NURD message connected to the
465 ; current CCB chain, which consists of but a single message.
466 ;
467 ; Inputs: R4 - Points to first (or only) CCB in chain
468 ; R5 - Points to LE data base
469 ;
470 ; Outputs: Dispatches to message handler, or returns an
471 ; error if the type is illegal or out of range.
472 ; The called routine is responsible for queuing
473 ; messages to be returned to the higher level.
474 ;
475 ; Message Format: <msgtype><msgflgs><msgtxt.....>
476 ;-
477
478 000750' 032765 000001 000056 LEDSP: BIT #LA.CLO,L.ASTS(R5) ; DEVICE CLOSED?
479 000756' 001031 BNE 60$ ; YES, HENCE INACCESSIBLE
480 000760' MAP$ C.BUF(R4) ; GET MAPPING
481 000766' 016400 000020 MOV C.BUF+2(R4),R0 ; POINT TO CCB DATA BUFFER
482 000772' 111001 MOVB (R0),R1 ; GET NURD MESSAGE TYPE
483 000774' 042701 177760 BIC #^C<NM.TYP>,R1 ; ISOLATE JUST MESSAGE TYPE
484 001000' 020127 000004 CMP R1,#NRDOTR ; TYPE OUT OF RANGE?
485 001004' 103402 BLO 30$ ; NO, OKAY TO DISPATCH
486 001006' 012701 000004 MOV #NRDOTR,R1 ; YES, SPECIFY ILLEGAL NURD HANDLER
487 001012' 006301 30$: ASL R1 ; GET WORD OFFSET
488 001014' CALLR @40$(R1) ; DISPATCH TO MESSAGE PROCESSOR
489 ; AND RETURN
490
491
492 001020' 40$: DSP$B
493 001020' DSP$ ,MSGDAT ; 0 - DATA MESSAGE
494 001022' DSP$ ,50$ ; 1 - ATTENTION (ILLEGAL IF REC'D)
495 001024' DSP$ ,MSGDAT ; 2 - FEATURES MESSAGE
496 001026' DSP$ ,MSGCTL ; 3 - CONTROL MESSAGE
497 000004 NRDOTR = <.-40$>/2
498 001030' DSP$ ,50$ ; N - ILLEGAL NURD TYPE SPEC
499 001032' DSP$E
500
501 001032' 012764 177762 000014 50$: MOV #S.EIDM,C.STS(R4)
502 001040' 000403 BR 70$
503 001042' 012764 177767 000014 60$: MOV #S.EABO,C.STS(R4)
504 001050' 112764 000004 000012 70$: MOVB #FC.RCE,C.FNC(R4)
505 001056' CALLR $SCHED
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 10
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
507 ;+
508 ; Queue Incoming NURD Data, Control and Features Messages
509 ;
510 ; R4 CCB to queue
511 ; R5 Database address
512 ;-
513
514 001062' 032765 000010 000056 MSGDAT: BIT #LA.ABO,L.ASTS(R5) ; Check for abort state
515 001070' 001410 BEQ MSGQUE ; Ok to proceed
516 001072' 012764 177767 000014 MOV #S.EABO,C.STS(R4) ; Aborting
517 001100' 112764 000004 000012 MSGX: MOVB #FC.RCE,C.FNC(R4) ; ...
518 001106' CALLR $SCHED
519
520 001112' MSGQUE: ENQ$ L.DLCQ
521 001124' 020465 000116 CMP R4,L.DLCQ(R5) ; Was queue empty ?
522 001130' 001022 BNE 35$ ; No, routines of interest are working
523 001132' 105765 000044 TSTB L.DTXL(R5) ; Maybe waiting for packet ?
524 001136' 001017 BNE 35$ ; Could be
525
526 001140' 010665 000046 30$: MOV SP,L.DFSP(R5) ; Set the stack origin for this process
527 001144' 004767 004466 CALL RD$BYT ; Extract message type
528 001150' 010001 MOV R0,R1
529 001152' 004767 004460 CALL RD$BYT ; Extract message flags
530 001156' 010065 000122 MOV R0,L.MFLG(R5)
531 001162' 006301 ASL R1 ; Make a dispatch
532 001164' 004771 001200' CALL @40$(R1) ; and go
533 001170' 016504 000116 MOV L.DLCQ(R5),R4 ; Get next message
534 001174' 001361 BNE 30$ ; ...
535 001176' 35$: RETURN ; Done
536
537 001200' 40$: DSP$B
538 001200' DSP$ ,DATSYN ; 0 - Data message
539 001202' DSP$ ,MSGX ; 1 - Attention (illegal if rec'd)
540 001204' DSP$ ,FTRSYN ; 2 - Features message
541 001206' DSP$ ,CTLSYN ; 3 - Control message
542 001210' DSP$E
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 11
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
544 ;+
545 ; NURD Data Message Handler
546 ;
547 ; Virtual (NURD) to physical (LP11) data translation.
548 ; Unload NURD buffer into physical buffer and ship physical buffers
549 ; down to driver as they are filled, saving virtual machine buffer
550 ; address in C.PRM5 of the physical buffer until the corresponding
551 ; physical data has been output or aborted.
552 ;
553 ; This routine is called from MSGDAT at the main entry, and entered at
554 ; various recovery points, depending upon the nature of the failure
555 ; which caused the suspension.
556 ;
557 ; Source buffer has been set up and NURD type and message flag bytes
558 ; (1st & 2nd bytes) have been extracted.
559 ;
560 ; R4 CCB
561 ; R5 Database address
562 ;
563 ; Data message format: <seq no.><flgs><seg cnt><segs......>
564 ; Data seg format: <cnt><txt....> or <sign+cnt><repeat char>
565 ;-
566
567 001210' 004767 004422 DATSYN: CALL RD$BYT ; GET SEQUENCE NUMBER
568 001214' 110065 000123 MOVB R0,L.DMSQ(R5) ; SAVE THE CURRENT SEQ NUMBER
569 001220' 004767 004412 CALL RD$BYT ; GET THE FLAGS BYTE
570 001224' 032700 000001 BIT #ND.ACK,R0 ; CHECK FOR ACK REQ'D
571 001230' 001403 BEQ 14$ ; NO ACK REQUEST
572 001232' 052765 000100 000056 BIS #LA.AKR,L.ASTS(R5) ; NOTE ACK REQUESTED
573 001240' 032700 000004 14$: BIT #ND.EOF,R0 ; CHECK FOR EOF
574 001244' 001403 BEQ 16$
575 001246' 052765 000400 000056 BIS #LA.EOF,L.ASTS(R5) ; SET THIS MESSAGE HAS EOF
576 001254' 004767 004356 16$: CALL RD$BYT ; GET SEGMENT COUNT BYTE
577 001260' 110065 000124 MOVB R0,L.DMSG(R5) ; SAVE THE SEGMENT COUNT OF MESSAGE
578 001264' 001500 BEQ 60$ ; EMPTY MESSAGE, SKIP DATA PROCESSING
579
580 ; Process message data
581 001266' 004767 004344 20$: CALL RD$BYT ; GET NEXT SEGMENT HDR BYTE
582 001272' 105700 TSTB R0 ; DISPATCH BASED ON SEGMENT TYPE
583 001274' 100410 BMI 28$ ; THIS IS A COMPRESSED SEGMENT
584 001276' 003017 BGT 32$ ; THIS IS A NORMAL DATA SEGMENT
585 ; This is an EOR
586 001300' 105765 000236 TSTB LE.FCC+F.FCV(R5) ; IS FORTRAN CARRIAGE CONTROL SET?
587 001304' 001403 BEQ 24$ ; NO, EOR IS THEN NOT SIGNIFICANT
588 001306' 052765 001000 000056 BIS #LA.EOR,L.ASTS(R5) ; YES, SET EOR TO FLAG NEXT CHAR AS CC
589 001314' 000461 24$: BR 56$ ; PROCESS END OF SEGMENT
590
591 ; Process compressed data segment
592 001316' 112765 000001 000125 28$: MOVB #1,L.DMSS(R5) ; Set segment size to one character
593 001324' 042700 177600 BIC #177600,R0 ; Isolate repeat count
594 001330' 010065 000130 MOV R0,L.DMCR(R5) ; and save it
595 001334' 000404 BR 36$ ; Process data in normal way
596
597 ; Process normal data segment
598 001336' 110065 000125 32$: MOVB R0,L.DMSS(R5) ; Set segment size
599 001342' 005065 000130 CLR L.DMCR(R5) ; No repeat count
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 11-1
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
600
601 ;Normal segment processor
602 001346' 004767 004264 36$: CALL RD$BYT ; Get character data byte from message
603 001352' 042700 177600 BIC #^C177,R0 ; SAVE ONLY LOW SEVEN BITS OF CHARACTER
604 001356' 116000 007720' MOVB LEASC(R0),R0 ; GET MAPPED VALUE OF THE CHARACTER
605 001362' 110065 000152 MOVB R0,L.PBRC(R5) ; SAVE A COPY OF THE CHARACTER
606
607 001366' 005000 40$: CLR R0 ; GET THE BYTE BACK
608 001370' 156500 000152 BISB L.PBRC(R5),R0
609 001374' 032765 001000 000056 BIT #LA.EOR,L.ASTS(R5) ; END OF RECORD ON?
610 001402' 001406 BEQ 42$ ; NO, PROCEED WITHOUT INCIDENT
611 ; YES, BYTE IS FORTRAN CARRIAGE CHAR
612 001404' 004767 002562 CALL FORM$F ; HANDLE FORTRAN CARRIAGE CONTROL
613 001410' 042765 001000 000056 BIC #LA.EOR,L.ASTS(R5) ; FLUSH END OF RECORD
614 001416' 000410 BR 52$ ; OKAY, DO NEXT BYTE
615
616 001420' 105700 42$: TSTB R0 ; CHECK FOR CHARACTER TYPE
617 001422' 001411 BEQ 54$ ; IGNORE CHARACTERS MAPPED TO ZERO
618 001424' 100003 BPL 44$ ; DIRECTLY TRANSMIT PRINTING CHARACTERS
619
620 ; MANIPULATIONS REQ'D ON FORMS CONTROL CHARS
621 001426' 004767 003110 CALL FORM$X ; DO FORMS CONTROL TRANSLATION
622 001432' 000402 BR 52$ ; SUCCEEDED, CONTINUE CURRENT PROCESSING
623
624 001434' 004767 003274 44$: CALL PR$CHR ; STUFF RESULTING CHAR TO OUTPUT
625 001440' 005365 000130 52$: DEC L.DMCR(R5) ; DECREMENT CHAR REPEAT COUNT
626 001444' 003350 BGT 40$ ; MORE TO DO ON CURRENT CHAR
627
628 001446' 005065 000130 54$: CLR L.DMCR(R5) ; KEEP REPEAT CNT = 0
629 001452' 105365 000125 DECB L.DMSS(R5) ; DECREMENT SEGMENT SIZE
630 001456' 001333 BNE 36$ ; SEGMENT NOT EMPTY, GET NEXT CHAR
631
632 ; SEGMENT FINISHED, CLEAN UP
633 001460' 105365 000124 56$: DECB L.DMSG(R5) ; DECREMENT COUNT OF SEGMENTS
634 001464' 001300 BNE 20$ ; NOT DONE, GO BACK FOR NEXT SEGMENT
635
636 ; Message complete, drop into end-of-message code
637 001466' 016504 000140 60$: MOV L.PLBQ(R5),R4 ; GET PHYSICAL BUFFER CCB ADDRESS
638 001472' 001403 BEQ 86$
639 001474' 016564 000056 000014 MOV L.ASTS(R5),C.STS(R4) ; MARK PHYSICAL BUF
640 001502' 004767 004274 86$: CALL RD$DQX ; PURGE
641 001506' 042765 000500 000056 BIC #LA.EOF!LA.AKR,L.ASTS(R5) ; CLEAR SAVED DATA FLAGS
642 001514' RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 12
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
644 ;+
645 ; NURD Control Message Handler
646 ;
647 ; Called from LEDSP
648 ;
649 ; R0 Buffer pointer to NURD message type
650 ; R4 CCB
651 ; R5 Database
652 ; KISAR6 Mapped to buffer
653 ;
654 ; Control message format: <seq no.><command><result>
655 ;-
656
657 .enabl lsb
658
659 001516' 122764 000004 000013 MSGCTL: CMPB #S$INT,C.MOD(R4) ; CHECK FOR INTERRUPT MESSAGE
660 001524' 001402 BEQ 10$ ; Tis
661 001526' CALLR MSGQUE ; OTHERS ARE SYNCH'D WITH DATA STREAM
662
663 001532' 10$: ENQ$ L.CMSQ ; QUEUE THE CCB FOR LATER
664 001544' 022764 000004 000022 CMP #N.CCMD+1,C.CNT(R4) ; CHECK TO SEE IF ENOUGH SENT
665 001552' 003074 BGT 100$ ; NOT EVEN 4 LOUSY BYTES!
666 001554' 116001 000003 MOVB N.CCMD(R0),R1 ; GET CONTROL COMMAND BYTE
667 001560' 003471 BLE 100$ ; SKIP OUT ON ILLEGAL CODE
668 001562' 022701 000012 CMP #CTLLEN,R1 ; CHECK RANGE OF COMMAND
669 001566' 101466 BLOS 100$ ; OUT OF RANGE, SKIP OUT
670 001570' 006301 ASL R1 ; IN RANGE, GET AS WORD OFFSET
671 001572' 005000 CLR R0 ; INIT COMPLETION CODE
672 001574' 004771 002024' CALL @CTLDSP(R1) ; EXECUTE DETAILED CONTROL ROUTINE
673 001600' 020027 177777 CMP R0,#-1 ; MORE TO DO ?
674 001604' 001405 BEQ 15$ ; NO
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 13
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
676 ;+
677 ; Here when finished, or when performing a retry to get a resource
678 ;-
679 001606' 004767 002304 MSGFIN: CALL BF$SDB ; GET A RESPONSE BUFFER
680 001612' 103003 BCC 20$ ; OK
681 001614' 105265 000110 INCB L.RECO(R5)
682 001620' 15$: RETURN
683 001622' 20$: PUSH$S R4 ; SAVE THE RESPONSE CCB
684 001624' DEQ$ L.CMSQ ; GET THE MESSAGE CCB BACK
685 001642' MAP$ C.BUF(R4) ; R0/RESULT
686 001650' 016401 000020 MOV C.BUF+2(R4),R1
687 001654' 116102 000003 MOVB N.CCMD(R1),R2 ; R2/COMMAND
688 001660' 116101 000002 MOVB N.CSEQ(R1),R1 ; R1/SEQ NO. OF CONTROL MESSAGE
689 001664' 112764 000004 000012 MOVB #FC.RCE,C.FNC(R4) ; ACK the control message
690 001672' 004767 000000G CALL $SCHED ; ...
691 001676' POP$S R4 ; GET THE RESPONSE CCB BACK
692 001700' MAP$ C.BUF(R4) ; MAP TO THE BUFFER
693 001706' 016403 000020 MOV C.BUF+2(R4),R3 ; GET BUF PTR
694 001712' 112723 000003 MOVB #NM.CTL,(R3)+ ; FORMAT A NURD CONTROL MESSAGE
695 001716' 105023 CLRB (R3)+ ; NO MESSAGE FLAGS
696 001720' 110123 MOVB R1,(R3)+ ; SEQ NO.
697 001722' 110223 MOVB R2,(R3)+ ; COMMAND
698 001724' 110013 MOVB R0,(R3) ; RESULT
699 001726' 012764 000005 000022 MOV #N.CRES+1,C.CNT(R4) ; SET THE BUFFER COUNT
700 001734' 005265 000100 INC L.IOCN(R5) ; Count the I/O
701 001740' CALLR $SCHED ; Queue it and return
702
703 ; Illegal function
704 001744' 100$: DEQ$ L.CMSQ ; Get the CCB back
705 001762' 012764 177754 000014 MOV #S.ERBO,C.STS(R4) ; Reject this one
706 001770' 112764 000004 000012 MOVB #FC.RCE,C.FNC(R4) ; ...
707 001776' 004767 000000G CALL $SCHED ; ...
708 002002' 004767 004714 CALL $LESTP ; Turn off the device
709 002006' 052765 000004 000056 BIS #LA.ADN,L.ASTS(R5) ; Abort when print queue done
710 002014' 012700 177777 MOV #-1,R0 ; Say we were here
711 002020' CALLR $LESTR ; Turn on printer so it can die
712
713 ;+
714 ; The NURD control dispatch table
715 ;-
716 002024' 001744' CTLDSP: .word 100$ ; 0 - CODE ZERO IS RESERVED
717 002026' 002322' .word CTLABE ;* 1 - ABORT TO END OF FILE
718 002030' 002330' .word CTLABT ;* 2 - ABORT ALL
719 002032' 002274' .word CTLABC ; 3 - ABORT CLEAR
720 002034' 002566' .word CTLSTS ; 4 - STATUS REQUESTED, SEND ATTENTION
721 002036' 002406' .word CTLDMP ; 5 - DUMP OUTPUT BUFFERS
722 002040' 002436' .word CTLPAU ;* 6 - PAUSE
723 002042' 002512' .word CTLRSM ;* 7 - RESUME FROM ERROR OR PAUSE
724 002044' 001744' .word 100$ ; 8 - UNDEFINED
725 002046' 002400' .word CTLCPB ; 9 - SEND CAPABILITIES MESSAGE
726 000012 CTLLEN = <. - CTLDSP>/2 ;* = special action taken
727 .dsabl lsb
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 14
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
729 ;+
730 ; Non-interrupt control message processing
731 ;-
732 002050' 004767 003562 CTLSYN: CALL RD$BYT ; GET SEQ NO.
733 002054' 110065 000123 MOVB R0,L.DMSQ(R5) ; SAVE IT FOR RESPONSE
734 002060' 004767 003552 CALL RD$BYT ; GET COMMAND
735 002064' 010001 MOV R0,R1
736 002066' 022701 000012 CMP #CTLLEN,R1 ; CHECK RANGE OF COMMAND
737 002072' 101470 BLOS 50$ ; OUT OF RANGE, SKIP OUT
738 002074' PUSH$S R1 ; SAVE COMMAND CODE FOR RESPONSE
739 002076' 006301 ASL R1 ; IN RANGE, GET AS WORD OFFSET
740 002100' 005000 CLR R0 ; INIT COMPLETION FLAG
741 002102' 004771 002024' CALL @CTLDSP(R1) ; Do it - return with R0 = result code
742 002106' POP$S R1 ; GET COMMAND CODE BACK
743 002110' 020027 177777 CMP R0,#-1 ; MORE TO DO ?
744 002114' 001466 BEQ 60$ ; NO
745 002116' PUSH$S R0 ; SAVE RESPONSE CODE
746 002120' 004767 003656 CALL RD$DQX ; Complete the message
747 002124' 012700 000003 MOV #NM.CTL,R0 ; CONSTRUCT A CONTROL MESSAGE
748 002130' 004767 002414 CALL MS$BYT ; CONTROL CODE
749 002134' 005000 CLR R0
750 002136' 004767 002406 CALL MS$BYT ; NULL MESSAGE FLAGS
751 002142' 116500 000123 MOVB L.DMSQ(R5),R0
752 002146' 004767 002376 CALL MS$BYT ; SEQ NO. OF ORIGINAL COMMAND
753 002152' 010100 MOV R1,R0
754 002154' 004767 002370 CALL MS$BYT ; COMMAND
755 002160' POP$S R0
756 002162' 004767 002362 CALL MS$BYT ; RESPONSE CODE
757 002166' DEQ$ L.MSGQ ; GET BUFFER OFF QUEUE
758 002204' 166564 000164 000022 SUB L.MSGS(R5),C.CNT(R4) ; SET MESSAGE SIZE
759 002212' 005265 000100 INC L.IOCN(R5) ; ONE MORE OUTSTANDING I/O
760 002216' 004767 000000G CALL $SCHED ; SEND IT
761 002222' 005065 000164 CLR L.MSGS(R5) ; CLEAN UP TRACKS
762 002226' 105765 000111 TSTB L.RATT(R5) ; CHECK FOR OTHER MESSAGES TO GO OUT
763 002232' 001402 BEQ 20$ ; NO ATTENTION MESSAGES
764 002234' 004767 003702 CALL SN$ATT ; PENDING ATTENTION MESSAGE
765
766 002240' 105765 000112 20$: TSTB L.CAPP(R5) ; TRY CAPABILITIES MESSAGE
767 002244' 001001 BNE 30$
768 002246' RETURN
769 002250' 30$: CALLR SN$CAP ; PENDING CAPABILITIES MESSAGE
770
771 002254' 004767 004442 50$: CALL $LESTP ; FLUSH THE DEVICE INTERRUPTS
772 002260' 052765 000004 000056 BIS #LA.ADN,L.ASTS(R5) ; ABORT LINK WHEN PRINT QUEUE DONE
773 002266' 004767 003510 CALL RD$DQX ; Ack the message
774 002272' 60$: RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 15
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
776 ;+
777 ; Clear ABORT status
778 ;-
779 002274' 032765 000030 000056 CTLABC: BIT #LA.ABE!LA.ABO,L.ASTS(R5) ; ABORT SET?
780 002302' 001404 BEQ 10$ ; NO
781 002304' 042765 000030 000056 BIC #LA.ABE!LA.ABO,L.ASTS(R5) ; CLEAR ABORTING
782 002312' RETURN
783
784 002314' 012700 000001 10$: MOV #NR.ACN,R0 ; NOT IN ABORT STATE
785 002320' RETURN
786
787 ;+
788 ; Abort to end of file
789 ;-
790 002322' 012700 000002 CTLABE: MOV #NR.NOE,R0 ; EOF NOT DEFINED FOR OUTPUT DEVICE
791 002326' RETURN
792
793 ;+
794 ; Abort until clear received
795 ;-
796 002330' 004767 004366 CTLABT: CALL $LESTP ; FLUSH THE DEVICE
797 002334' 052765 000010 000056 BIS #LA.ABO,L.ASTS(R5) ; NOTE ABORTING
798 002342' 016501 000066 MOV L.DDMQ(R5),R1 ; CHECK ALL QUEUES
799 002346' 056501 000146 BIS L.PLBP+2(R5),R1
800 002352' 056501 000116 BIS L.DLCQ(R5),R1
801 002356' 056501 000154 BIS L.MSGQ(R5),R1
802 002362' 156501 000044 BISB L.DTXL(R5),R1 ; CHECK SUSPENDED PROCESSES
803 002366' 001002 BNE 10$ ; NR.ABS (ABORT STARTED)
804 002370' 012700 000001 MOV #NR.NAB,R0 ; NOTHING TO ABORT
805 002374' 10$: CALLR Q$PURG ; CLEAR THE WORLD
806
807 ;+
808 ; Request capabilities
809 ;-
810 002400' 105265 000112 CTLCPB: INCB L.CAPP(R5) ; SET CAPABILITIES PENDING FLAG
811 002404' RETURN
812
813 ;+
814 ; Dump output buffers
815 ;-
816 002406' 105765 000111 CTLDMP: TSTB L.RATT(R5) ; PENDING ATTENTION?
817 002412' 001010 BNE 10$ ; YES
818 002414' 105765 000112 TSTB L.CAPP(R5) ; PENDING CAPABILITIES?
819 002420' 001005 BNE 10$ ; YES
820 002422' 005765 000066 TST L.DDMQ(R5) ; NOT TO DLC, CHECK ON PHYSICAL QUEUE
821 002426' 001002 BNE 10$ ; IT'S THERE, OKAY
822 002430' 012700 000001 MOV #NR.NOB,R0 ; NOTHING TO DUMP
823 002434' 10$: RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 16
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
825 ;+
826 ; Pause output
827 ;-
828 002436' 032765 000006 000056 CTLPAU: BIT #LA.PAU!LA.ADN,L.ASTS(R5) ; ALREADY PAUSED/PAUSING?
829 002444' 001017 BNE 20$ ; YES
830 002446' 005765 000116 TST L.DLCQ(R5) ; ANYTHING QUEUED?
831 002452' 001005 BNE 10$ ; YES, OKAY TO PAUSE
832 002454' 005765 000066 TST L.DDMQ(R5) ; NONE IN VIRTUAL, CHECK PHYSICAL
833 002460' 001002 BNE 10$
834 002462' 012700 000002 MOV #NR.NDP,R0 ; NOTHING TO PAUSE
835 002466' 004767 004230 10$: CALL $LESTP ; ENSURE ONLY ONE ATTENTION MESSAGE
836 002472' 052765 000002 000056 BIS #LA.PAU,L.ASTS(R5) ; PAUSE NO MATTER WHAT
837 002500' CALLR $LEGO ; MAKE SURE IT HAPPENS
838
839 002504' 012700 000001 20$: MOV #NR.PAU,R0 ; ALREADY PAUSED
840 002510' RETURN
841
842
843 ;+
844 ; RESUME OUTPUT
845 ;-
846 002512' 032765 000006 000056 CTLRSM: BIT #LA.PAU!LA.ADN,L.ASTS(R5) ; CHECK PAUSEDNESS
847 002520' 001417 BEQ 20$ ; NOTHING HUNG
848 002522' 042765 010206 000056 BIC #LA.PAU!LA.ADN!LA.ERR!LA.PLE,L.ASTS(R5) ; No pause conditions
849 002530' 005765 000066 TST L.DDMQ(R5) ; CHECK FOR ANY CURRENT DATA XFER'S
850 002534' 001403 BEQ 10$ ; SOMETHING IN PRINT Q
851 002536' 004767 004142 CALL $LEGO ; TURN ON DEVICE AGAIN
852 002542' 000410 BR 30$
853 002544' 005765 000116 10$: TST L.DLCQ(R5) ; RESUME NON-INTERRUPT MESSAGE PROCESSING
854 002550' 001005 BNE 30$ ; SOMETHING WAITING TO PROCESSED
855 002552' 012700 000002 MOV #NR.NDR,R0 ; NOTHING TO RESUME
856 002556' 000402 BR 30$
857
858 002560' 012700 000001 20$: MOV #NR.NPS,R0 ; NOT PAUSED
859 002564' 30$: RETURN
860
861 ;+
862 ; Status request
863 ;-
864 002566' 105765 000111 CTLSTS: TSTB L.RATT(R5) ; CHECK ATTENTION ALREADY PENDING
865 002572' 001003 BNE 10$ ; DON'T MUNG ORIGNAL REASON
866 002574' 112765 000003 000111 MOVB #N.ARQS,L.RATT(R5) ; SET ATTENTION PENDING FLAG
867 002602' 10$: RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 17
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
869 ;+
870 ; NURD Features message handlers
871 ;
872 ; Feature message format:
873 ; <seq no.><no. feature specs><...feature specs...>
874 ;
875 ; Feature spec format:
876 ; <feature id><feature flags><class><response>[<feature data>]
877 ;
878 ; Feature data format:
879 ; <cnt><...data...>
880 ;
881 ; NOTE: Incoming message has only one feature spec.
882 ;
883 ; Buffer has been set up and NURD type and flags bytes
884 ; (1st & 2nd bytes) have been extracted.
885 ;
886 ; R4 CCB at top of L.DLCQ
887 ; R5 Database address
888 ; KISAR6 Mapped to data buffer
889 ;-
890 .enabl lsb
891
892 002604' 012700 000002 FTRSYN: MOV #NM.FTR,R0 ; BEGIN A REPLY
893 002610' 004767 001734 CALL MS$BYT ; INSERT NURD MESSAGE TYPE
894 002614' 005000 CLR R0
895 002616' 004767 001726 CALL MS$BYT ; INSERT MESSAGE FLAGS
896 002622' 004767 003010 CALL RD$BYT ; GET SEQ NO.
897 002626' 110065 000123 MOVB R0,L.DMSQ(R5)
898 002632' 004767 001712 CALL MS$BYT ; SEND IT BACK
899 002636' 004767 002774 CALL RD$BYT ; GET NO. FEATURE SPECS
900 002642' 005000 CLR R0 ; BUT IGNORE IT
901 002644' 110065 000127 MOVB R0,L.NFSP(R5) ; SAVE IT FOR SOMTHING
902 002650' 004767 001674 CALL MS$BYT ; STUFF IT IN REPLY
903 002654' 004767 002756 CALL RD$BYT ; GET FEATURE ID
904 002660' 010002 MOV R0,R2
905 002662' 004767 002750 CALL RD$BYT ; GET FEATURE FLAGS
906 002666' 010001 MOV R0,R1
907 002670' 004767 002742 CALL RD$BYT ; GET CLASS
908 002674' 000301 SWAB R1
909 002676' 050001 BIS R0,R1 ; R1/FLAGS,,CLASS
910 002700' 004767 002732 CALL RD$BYT ; READ THE RESPONSE FIELD AND IGNORE IT
911
912 002704' 105065 000126 CLRB L.CAPN(R5) ; INIT INDEX INTO CAPABILITIES LIST
913 002710' 122702 000377 CMPB #FE.ALL,R2 ; CHECK FOR ALLNESS
914 002714' 001036 BNE 30$ ; SINGLE FEATURE
915 002716' 005002 CLR R2 ; INIT COMMON FID'S
916 002720' 116565 000166 000126 MOVB L.CFET(R5),L.CAPN(R5) ; GET COUNT OF COMMON ENTRIES
917 002726' 032701 000400 BIT #NF.CMD*400,R1 ; ALL FEATURES - CHECK READ/SET
918 002732' 001403 BEQ 10$ ; READ - CONTINUE
919 002734' 122701 000002 CMPB #FC.SST,R1 ; SET - CHECK SET TO STANDARD
920 002740' 001107 BNE FERERR ; NO - ILLEGAL COMBINATION
921
922 002742' 105202 10$: INCB R2 ; ADVANCE THRU LIST
923 002744' 100410 BMI 15$ ; GRUBBLING THRU DEVICE FEATURES
924 002746' 120265 000126 CMPB R2,L.CAPN(R5) ; CHECK RANGE
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 17-1
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
925 002752' 101413 BLOS 20$ ; OK
926 002754' 116565 000200 000126 MOVB L.DFET(R5),L.CAPN(R5) ; INIT FOR DEVICE SPECFIC FEATURES
927 002762' 012702 000201 MOV #201,R2
928 002766' 010200 15$: MOV R2,R0 ; DEVICE FEATURE - HACK OFF SIGN
929 002770' 042700 177600 BIC #^C177,R0
930 002774' 120065 000126 CMPB R0,L.CAPN(R5) ; CHECK RANGE
931 003000' 101022 BHI 70$ ; DONE
932 003002' 004767 001026 20$: CALL FTRFND ; LOOK IT UP
933 003006' 103004 BCC 40$ ; SUPPORTED FEATURE
934 003010' 000754 BR 10$ ; TRY NEXT ONE
935
936 003012' 004767 001016 30$: CALL FTRFND ; LOOK UP FEATURE
937 003016' 103447 BCS FERUSF ; UNSUPPORTED FEATURE
938
939 ; AT THIS POINT:
940 ; R1 Feature message-flags(hi) + class(lo)
941 ; R2 Feature id (byte)
942 ; R3 Points to feature status byte
943 ; R5 Database address
944 ; L.DMSQ Sequence no.
945 ; L.NFSP Number of specs
946
947 003020' 132713 000040 40$: BITB #FB.CP,(R3) ; CHECK FOR CHANGE PENDING
948 003024' 001060 BNE FERCPN ; CAN'T READ OR SET IF SO
949 003026' 032701 000400 BIT #NF.CMD*400,R1 ; FEATURE READ OR FEATURE SET?
950 003032' 001505 BEQ FTRSHO ; READ - GO PROCESS FEATURE READ
951 003034' CALLR FTRSET ; SET - GO PROCESS IN FEATURE SET
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 18
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
953 003040' 105765 000126 FTRCON: TSTB L.CAPN(R5) ; CHECK FOR ALLNESS
954 003044' 001336 BNE 10$ ; YES
955
956 003046' 016504 000154 70$: MOV L.MSGQ(R5),R4 ; GET BEG OF MESSAGE
957 003052' MAP$ C.BUF(R4)
958 003060' 016400 000020 MOV C.BUF+2(R4),R0 ; GET THE PTR
959 003064' 116560 000127 000003 MOVB L.NFSP(R5),N.NSPC(R0) ; SET IN THE FINAL SPEC COUNT
960 003072' 004767 002704 CALL RD$DQX ; RETURN ORGINAL MESSAGE TO NRD
961 003076' DEQ$ L.MSGQ ; GET BUFFER OFF QUEUE
962 003114' 166564 000164 000022 SUB L.MSGS(R5),C.CNT(R4) ; SET MESSAGE SIZE
963 003122' 005265 000100 INC L.IOCN(R5) ; ONE MORE OUTSTANDING I/O
964 003126' 005065 000164 CLR L.MSGS(R5) ; CLEAN UP TRACKS
965 003132' CALLR $SCHED ; SEND IT
966
967 003136' FERUSF: PUSH$S #FR.USF
968 003142' 000421 BR 100$
969 003144' FERBCL: PUSH$S #FR.BCL
970 003150' 000416 BR 100$
971 003152' FERNST: PUSH$S #FR.NST
972 003156' 000413 BR 100$
973 003160' FERERR: PUSH$S #FR.ERR
974 003164' 000410 BR 100$
975 003166' FERCPN: PUSH$S #FR.CPN
976 003172' 000405 BR 100$
977 003174' FERNEB: PUSH$S #FR.NEB
978 003200' 000402 BR 100$
979 003202' FERDNP: PUSH$S #FR.DNP
980 003206' 010200 100$: MOV R2,R0 ; Insert <fid><flags><class><error>
981 003210' 004767 001334 CALL MS$BYT ; FID
982 003214' 010100 MOV R1,R0
983 003216' 000300 SWAB R0
984 003220' 004767 001324 CALL MS$BYT ; Flags
985 003224' 010100 MOV R1,R0
986 003226' 004767 001316 CALL MS$BYT ; Class
987 003232' POP$S R0
988 003234' 004767 001310 CALL MS$BYT ; Error
989 003240' 105265 000127 INCB L.NFSP(R5) ; Count the spec
990 003244' 000675 BR FTRCON
991
992 .dsabl lsb
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 19
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
994 ;+
995 ; Features Read
996 ;
997 ; R1 Feature message-flags(hi) + class(lo)
998 ; R2 Feature id (byte)
999 ; R3 Points to feature status byte
1000 ; R5 Database address
1001 ;
1002 ; Reply has been formatted thru <no. specs>
1003 ; Insert in message:
1004 ; <fid><flgs><class><resp><data>
1005 ;-
1006
1007 003246' 010200 FTRSHO: MOV R2,R0
1008 003250' 004767 001274 CALL MS$BYT ; INSERT FID
1009 003254' 010100 MOV R1,R0 ; GET READ/SET BIT
1010 003256' 000300 SWAB R0
1011 003260' 042700 177776 BIC #^C<NF.CMD>,R0 ; NOW ISOLATED
1012 003264' 132713 000020 BITB #FB.SST,(R3) ; FEATURE SET TO STANDARD?
1013 003270' 001402 BEQ 10$ ; NO
1014 003272' 052700 000002 BIS #NF.STD,R0 ; SET TO STANDARD
1015 003276' 004767 001246 10$: CALL MS$BYT ; INSERT FLAGS
1016
1017 003302' 105001 CLRB R1 ; SET FEATURE CLASS IN R1(LO)
1018 003304' 132713 000001 BITB #FB.CL1,(R3) ; CHECK CLASS 1
1019 003310' 001402 BEQ 15$ ; CLASS 0
1020 003312' 152701 000001 BISB #FC.CL1,R1 ; SET CLASS 1
1021 003316' 010100 15$: MOV R1,R0
1022 003320' 004767 001224 CALL MS$BYT ; INSERT CLASS
1023
1024 003324' 005000 CLR R0
1025 003326' 004767 001216 CALL MS$BYT ; RESP - NO ERRORS
1026
1027 003332' 105701 TSTB R1 ; CHECK CLASS FOR LENGTH OF DATA
1028 003334' 001406 BEQ 20$ ; 1 BIT
1029 ; FEATURE DEPENDENT
1030 003336' 132713 000006 BITB #FB.WRD!FB.STR,(R3) ; LOOK FOR THOSE MORE THAN 1 BYTE
1031 003342' 001012 BNE 50$ ; YES
1032 ; NOT MULTIPLE BYTE DATA, SO 1 BYTE
1033 003344' 005200 INC R0 ; COUNT = 1
1034 003346' 004767 001176 CALL MS$BYT ; INSERT COUNT
1035
1036 003352' 116300 000001 20$: MOVB 1(R3),R0 ; COPY FEATURE TABLE DATA ENTRY
1037 003356' 004767 001166 30$: CALL MS$BYT ; INSERT DATA
1038
1039 003362' 105265 000127 40$: INCB L.NFSP(R5) ; COUNT THE SPEC
1040 003366' 000624 BR FTRCON ; CONTINUE FEATURE HACKING
1041
1042 003370' 132713 000004 50$: BITB #FB.STR,(R3) ; WORD OR STRING ?
1043 003374' 001015 BNE 60$ ; STRING
1044 ; WORD, F.FCV = DB OFFSET TO WORD
1045 003376' 012700 000002 MOV #2,R0 ; 2 BYTE VALUE
1046 003402' 004767 001142 CALL MS$BYT ; INSERT CNT
1047
1048 003406' 005000 CLR R0
1049 003410' 156300 000001 BISB F.FCV(R3),R0
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 19-1
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
1050 003414' 060500 ADD R5,R0
1051 003416' 011000 MOV (R0),R0 ; YES, READ SETTING FROM THE Database
1052 003420' 004767 001124 CALL MS$BYT ; INSERT LO BYTE
1053
1054 003424' 000300 SWAB R0
1055 003426' 000753 BR 30$ ; INSERT HI BYTE
1056
1057 ; STRING - F.FCV HAS THE LENGTH, CURRENT VALUE BEGINS AT F.FCV+1
1058 003430' 005203 60$: INC R3 ; THIS DEPENDS ON F.FCV=1
1059 003432' 112300 MOVB (R3)+,R0 ; GET THE LENGTH
1060 003434' 004767 001110 CALL MS$BYT ; INSERT IN MESSAGE
1061 003440' 010004 MOV R0,R4 ; SAVE IT
1062 003442' 112300 70$: MOVB (R3)+,R0 ; INSERT THE STRING IN MESSAGE
1063 003444' 004767 001100 CALL MS$BYT
1064 003450' 105304 DECB R4 ; COUNT THE BYTE
1065 003452' 001373 BNE 70$
1066 003454' 000742 BR 40$
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 20
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
1068 ;+
1069 ; Features set
1070 ;
1071 ; R1 Feature message-flags(hi) + class(lo)
1072 ; R2 Feature id (byte)
1073 ; R3 Points to the feature status byte
1074 ; R5 Database address
1075 ;
1076 ; Reply has been formatted thru <no. specs=1>
1077 ;-
1078
1079 003456' 122701 000002 FTRSET: CMPB #FC.SST,R1 ; CHECK STANDARDNESS
1080 003462' 001501 BEQ 80$ ; STANDARD RESULT
1081 003464' 132713 000100 BITB #FB.CA,(R3) ; REAL SET - CHECK IF SETABLE
1082 003470' 001633 BEQ FERERR ; NO
1083 003472' 111300 MOVB (R3),R0 ; FEATURE IS SETTABE
1084 003474' 074100 XOR R1,R0 ; CHECK CLASS SPEC
1085 003476' 042700 177776 BIC #^C<FB.CL1>,R0 ; R0/ <CLASS SPEC'D>.NOT.EQUIV. <FEATURE CLASS>
1086 003502' 001220 BNE FERBCL ; RESULT SHOULD BE 0
1087 003504' 122701 000001 CMPB #FC.CL1,R1 ; CHECK DATA CLASS
1088 003510' 001010 BNE 10$ ; CLASS 0
1089
1090 ; CLASS 1 - FEATURE DEPENDENT
1091 003512' 004767 002120 CALL RD$BYT ; FEATURE DEPENDENT DATA - GET LENGTH
1092 003516' 132713 000006 BITB #FB.WRD!FB.STR,(R3) ; CHECK MULTIPLE BYTE DATA
1093 003522' 001012 BNE 30$ ; GO DO IT
1094 003524' 122700 000001 CMPB #1,R0 ; ONE BYTER ?
1095 003530' 001213 BNE FERERR ; NO
1096 003532' 004767 002100 10$: CALL RD$BYT ; CLASS 0 OR CLASS 1(1 BYTE), GET BYTE
1097 003536' 110063 000001 MOVB R0,1(R3) ; SET FEATURE CURRENT VALUE
1098 003542' 142713 000020 20$: BICB #FB.SST,(R3) ; NOT SET TO STANDARD
1099 003546' 000637 BR FTRSHO ; NOW READ THE FEATURE
1100
1101 003550' 132713 000004 30$: BITB #FB.STR,(R3) ; Word or string ?
1102 003554' 001023 BNE 40$ ; String
1103 003556' 122700 000002 CMPB #2,R0 ; 2 BYTE LENGTH
1104 003562' 001025 BNE 50$ ; SCREWED IT UP
1105 003564' 004767 002046 CALL RD$BYT ; GET THE PAGE LIMIT
1106 003570' 110065 000152 MOVB R0,L.PBRC(R5) ; HIDE THE LO PART
1107 003574' 004767 002036 CALL RD$BYT ; GET THE HI PART
1108 003600' 000300 SWAB R0
1109 003602' 156500 000152 BISB L.PBRC(R5),R0 ; R0/NEW WORD VALUE
1110 003606' 010046 MOV R0,-(SP)
1111 003610' 005000 CLR R0
1112 003612' 156300 000001 BISB F.FCV(R3),R0
1113 003616' 060500 ADD R5,R0
1114 003620' 012610 MOV (SP)+,(R0) ; SET THE NEW VALUE IN WORD
1115 003622' 000747 BR 20$
1116
1117 ; STRING - F.FCV HAS THE LENGTH, CURRENT VALUE BEGINS AT F.FCV+1
1118 003624' 40$: PUSH$S R3 ; SAVE THE FEATURE BLOCK PTR
1119 003626' 005203 INC R3 ; THIS DEPENDS ON F.FCV=1
1120 003630' 120023 CMPB R0,(R3)+ ; CHECK THE LENGTH
1121 003632' 001403 BEQ 60$ ; OK
1122 003634' POP$S R3 ; LENGTH ERROR - TO BEGINNING OF BLOCK
1123 003636' 50$: CALLR FERERR ; AND REPORT THE ERROR
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 20-1
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
1124 003642' 60$: PUSH$S R1 ; SAVE THE VARIABLES
1125 003644' 010001 MOV R0,R1 ; R1/COUNT, R3/PTR TO CURRENT VALUE
1126 003646' 004767 001764 70$: CALL RD$BYT ; XFER NEW TO CURRENT VALUE
1127 003652' 110023 MOVB R0,(R3)+ ; STUFF THE BYTE
1128 003654' 077104 SOB R1,70$ ; AND COUNT IT
1129 003656' POP$S <R1,R3>
1130 003662' CALLR FTRSHO ; NOW READ THE FEATURE
1131
1132 003666' 004767 000012 80$: CALL SETSTD ; SET FEATURE TO STANDARD
1133 003672' 103002 BCC 90$
1134 003674' CALLR FERNST ; NO STANDARD TO SET
1135 003700' 90$: CALLR FTRCON ; DON'T READ IT
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 21
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
1137 ;+
1138 ; Set feature to its standard value
1139 ;
1140 ; R3 Pointer to feature block in database
1141 ; R5 Database address
1142 ;-
1143
1144 003704' 132713 000010 SETSTD: BITB #FB.STE,(R3) ; SEE IF IT HAS ONE
1145 003710' 001002 BNE 10$ ; YES
1146 003712' 000261 SEC ; NO STANDARD TO SET
1147 003714' RETURN
1148
1149 003716' 132713 000006 10$: BITB #FB.WRD!FB.STR,(R3) ; CHECK MULTIPLE BYTE VALUES
1150 003722' 001006 BNE 20$ ; YES
1151 ; SINGLE BYTE VALUE
1152 003724' 116363 000002 000001 MOVB F.FSV(R3),F.FCV(R3) ; SET CURRENT VALUE = STANDARD VALUE
1153 003732' 152713 000020 BISB #FB.SST,(R3) ; MARK FEATURE AS SET TO STANDARD
1154 003736' 000415 BR 30$
1155
1156 ; MULTIPLE BYTE VALUE
1157 003740' 132713 000004 20$: BITB #FB.STR,(R3) ; Word or string ?
1158 003744' 001014 BNE 40$ ; STRING
1159 003746' PUSH$S R5 ; WORD VALUE
1160 003750' 005046 CLR -(SP)
1161 003752' 116316 000001 MOVB F.FCV(R3),(SP)
1162 003756' 062605 ADD (SP)+,R5 ; R5 /PTR TO CURRENT VALUE
1163 003760' 116325 000002 MOVB F.FSV(R3),(R5)+ ; XFER LO BYTE
1164 003764' 116315 000003 MOVB F.FSV+1(R3),(R5) ; XFER HI BYTE
1165 003770' POP$S R5
1166
1167 003772' 000241 30$: CLC
1168 003774' RETURN
1169
1170 003776' 40$: PUSH$S <R0,R1,R3> ; STRING - F.FCV HAS THE LENGTH
1171 ; CURRENT VALUE BEGINS AT F.FCV+1
1172 ; STANDARD VALUE BEGINS AT F.FCV+1+(F.FCV)
1173 004004' 005203 INC R3 ; DEPENDS ON F.FCV=1
1174 004006' 005000 CLR R0
1175 004010' 152300 BISB (R3)+,R0 ; GET THE COUNT
1176 004012' 010001 MOV R0,R1
1177 004014' 060301 ADD R3,R1 ; R0/COUNT,R1/SOURCE ADDR,R3/DEST ADDR
1178 004016' 112123 45$: MOVB (R1)+,(R3)+ ; XFER THE STANDARD VALUE
1179 004020' 077002 SOB R0,45$ ; COUNT IT
1180 004022' POP$S <R3,R1,R0>
1181 004030' 000241 CLC
1182 004032' RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 22
LE.M11 30-DEC-82 03:53 MESSAGE RECEIVED (FC.RCP)
1184 ;+
1185 ; Feature finder
1186 ;
1187 ; FTRFND looks for a feature with FID in R2 and returns a pointer
1188 ; to the feature block in R3, if successful. Normal carry flag
1189 ; condition for success or failure.
1190
1191 004034' 012703 000166 FTRFND: MOV #L.CFET,R3 ; TRY COMMON FEATURE 1ST
1192 004040' PUSH$S R2 ; SAVE FID CAUSE IT WILL BE MANGLED
1193 004042' 105702 TSTB R2 ; CHECK IF DEVICE SPECIFIC FTR
1194 004044' 100004 BPL 10$ ; COMMON, SKIP
1195 004046' 012703 000200 MOV #L.DFET,R3 ; DEVICE SPECIFIC, GET POINTER
1196 004052' 042702 177600 BIC #177600,R2 ; TRUNCATE TO JUST OFFSET ABOVE 128
1197
1198 004056' 001414 10$: BEQ 20$ ; ZERO IS AN ILLEGAL FEATURE CODE
1199 004060' 060503 ADD R5,R3 ; R3 -> FEATURE LIST IN DATABASE
1200 004062' 020213 CMP R2,(R3) ; CHECK ON ID RANGE
1201 004064' 103011 BHIS 20$ ; SKIP IF OUT OF RANGE
1202 ; R3 POINTS TO BASE OF FEATURES LIST,
1203 ; WHICH HOLDS HIGHEST STORED CODE
1204 004066' 060203 ADD R2,R3 ; ADD FID TO POINT TO ADDR OF BLOCK
1205 004070' 111303 MOVB (R3),R3 ; ENTRY IS DB OFFSET TO FEATURE BLOCK
1206 004072' 001406 BEQ 20$ ; UNSUPPORTED FEATURE
1207 004074' 042703 177400 BIC #^C377,R3 ; FLUSH SIGN EXTENSION
1208 004100' 060503 ADD R5,R3 ; R3 -> FEATURE BLOCK
1209 004102' POP$S R2
1210 004104' 000241 CLC
1211 004106' RETURN
1212
1213 004110' 20$: POP$S R2 ; UNSUPPORTED FEATURE
1214 004112' 000261 SEC
1215 004114' RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 23
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1217 .sbttl Support Routines
1218 ;+
1219 ; The following pages, up to start of interrupt handler code,
1220 ; contain the various support routines needed in LE.
1221 ;
1222 ; The routines are arranged in alphabetical order.
1223 ;-
1224
1225
1226
1227
1228 ;+
1229 ; Physical Buffer Management
1230 ;-
1231 004116' BF$SDB: PUSH$S R1 ; Save R1
1232 004120' 012701 000120 MOV #80.,R1 ; Size of buffer wanted
1233 004124' 004767 000000G CALL $CBBGT ; Get a message buffer
1234 004130' 103416 BCS 10$ ; Oops
1235 004132' 010164 000022 MOV R1,C.CNT(R4) ; Set size
1236 004136' 112764 000004 000025 MOVB #S$PEOM,C.PRM1+1(R4) ; Init as a whole message
1237 004144' 112764 000002 000012 MOVB #FC.XME,C.FNC(R4) ; Set function code
1238 004152' 112764 000006 000013 MOVB #S$SND,C.MOD(R4) ; Assume normal data
1239 004160' 116564 000001 000011 MOVB L.NRD(R5),C.PIX(R4) ; Set PIX
1240 004166' 10$: POP$S R1 ; Restore R1
1241 004170' RETURN ; and leave
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 24
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1243 ;+
1244 ; Fortran carriage control processing
1245 ;
1246 ; Maps the first character of each "record" into one or more
1247 ; forms control characters:
1248 ; ** INPUT ** ** OUTPUT **
1249 ; Space LF
1250 ; * DC3
1251 ; + CR
1252 ; - DC3,DC3,LF
1253 ; / DC4
1254 ; 0 DC3,LF
1255 ; 1 FF
1256 ; 2 DLE
1257 ; 3 VT
1258 ; Other Space
1259 ;-
1260 004172' 012701 004314' FORM$F: MOV #FCCTBL,R1 ; SCAN TABLE FOR 1 CHARACTER XLATIONS
1261 004176' 012702 000007 MOV #FCCTBN,R2
1262 004202' 122100 10$: CMPB (R1)+,R0
1263 004204' 001436 BEQ 100$ ; FOUND IT
1264 004206' 005201 INC R1 ; SKIP EQUIVALENT
1265 004210' 077204 SOB R2,10$
1266 004212' 122700 000055 CMPB #'-,R0 ; CHECK MULTIPLE CHARACTER XLATIONS
1267 004216' 001407 BEQ 20$
1268 004220' 122700 000060 CMPB #'0,R0
1269 004224' 001414 BEQ 30$
1270 004226' 012700 000040 MOV #SPA,R0 ; NOT AN FCC CHARACTER
1271 004232' CALLR PR$CHR ; JUST PRINT A SPACE
1272 004236' 012700 000003 20$: MOV #3,R0 ; CHECK FOR ROOM IN CURRENT BUFFER
1273 004242' 004767 001136 CALL PR$SPC ; GET RID OF THIS BUFFER IF NOT ENOUGH
1274 004246' 012700 000023 25$: MOV #DC3,R0 ; DO DC3,DC3,LF
1275 004252' 004767 000026 CALL 110$ ; PRINT THW DC3
1276 004256' 012700 000002 30$: MOV #2,R0 ; CHECK FOR ROOM IN CURRENT BUFFER
1277 004262' 004767 001116 CALL PR$SPC ; GET RID OF THIS BUFFER IF NOT ENOUGH
1278 004266' 012700 000023 35$: MOV #DC3,R0 ; DO DC3,LF
1279 004272' 004767 000006 CALL 110$ ; PRINT THE DC3
1280 004276' CALLR PR$LF ; DO A LINE FEED
1281
1282 004302' 111100 100$: MOVB (R1),R0 ; GET SINGLE CHARACTER EQUIVALENT
1283 004304' 116000 007720' 110$: MOVB LEASC(R0),R0 ; Map the character to our set
1284 004310' CALLR FORM$X
1285
1286 004314' 040 012 FCCTBL: .byte ' ,LF
1287 004316' 052 023 .byte '*,DC3
1288 004320' 053 015 .byte '+,CR
1289 004322' 057 024 .byte '/,DC4
1290 004324' 061 014 .byte '1,FF
1291 004326' 062 020 .byte '2,DLE
1292 004330' 063 013 .byte '3,VT
1293 000007 FCCTBN=<.-FCCTBL>/2
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 25
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1295 ;+
1296 ; Horizontal forms control translation
1297 ;
1298 ; R0/2*<translated character>
1299 ;-
1300 004332' 106300 FORM$H: ASLB R0 ; TEST FOR TAB OR CR
1301 004334' 100006 BPL 10$ ; HT
1302 004336' 105065 000114 CLRB L.COCT(R5) ; CLEAR COLUMN COUNT, A CARRIAGE RETURN
1303 004342' 112700 000015 MOVB #CR,R0 ; SET CR CODE
1304 004346' CALLR PR$BYT ; PUT IT DOWN
1305
1306 004352' 116500 000114 10$: MOVB L.COCT(R5),R0 ; GET CURRENT COLUMN COUNT
1307 004356' 110003 MOVB R0,R3 ; NO REAL LIST EXISTS, TAB BY 8'S
1308 004360' 152703 000007 BISB #7,R3 ; SET COUNT TO NEXT TAB STOP
1309 004364' 105203 INCB R3 ; PLUS 1
1310 004366' 120365 000221 CMPB R3,LE.FWD+F.FCV(R5) ; STOP PAST FORM WIDTH?
1311 004372' 101410 BLOS 30$ ; NO (BYTES ARE ALL UNSIGNED NUMBERS)
1312 004374' 105765 000223 TSTB LE.TRN+F.FCV(R5) ; YES, LINE TRUNCATION ON?
1313 004400' 001003 BNE 20$ ; YES, TAB TO JUST EOL
1314 004402' 004767 000656 CALL PR$LF ; NO, WRAP TO NEXT LINE
1315 004406' 000761 BR 10$ ; NOW DO TAB
1316
1317 004410' 116503 000221 20$: MOVB LE.FWD+F.FCV(R5),R3 ; SET TAB STOP JUST AT FORMS WIDTH
1318 004414' 110302 30$: MOVB R3,R2 ; SAVE NEW COLUMN COUNT
1319 004416' 160002 SUB R0,R2 ; COMPUTE NUMBER OF
1320 004420' 112700 000040 MOVB #SPA,R0 ; SPACES TO DO
1321 004424' 042702 177400 BIC #177400,R2 ; PREVENT SIGN PROBLEMS
1322 004430' 001405 BEQ 60$ ; NONE! (CAN HAPPEN IF TRUNC ON AT EOL)
1323
1324 004432' 004767 000224 40$: CALL PR$BYT ; Output a space
1325 004436' 077203 SOB R2,40$ ; DO UNTIL DONE
1326
1327 004440' 110365 000114 50$: MOVB R3,L.COCT(R5) ; TAB STOP VALUE IS NEW COLUMN COUNT
1328 004444' 60$: RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 26
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1330 ;+
1331 ; Vertical forms control translation
1332 ;
1333 ; R0/2*<translated character>
1334 ; FCXTB has translation image of all forms control characters.
1335 ;-
1336 004446' 105065 000114 FORM$V: CLRB L.COCT(R5) ; CLEAR COL COUNTER ON ALL VFE'S
1337 004452' 042700 177400 BIC #177400,R0 ; CLEAR HIGH BYTE OF R0
1338 004456' 001002 BNE 10$ ; NOT AN EXPLICIT FORM FEED
1339 004460' CALLR PR$FF ; EXPLICIT FORM FEED
1340
1341 004464' 016000 007660' 10$: MOV CHMAP(R0),R0 ; GET CHANNEL MAP
1342 004470' 116501 000113 MOVB L.LNCT(R5),R1 ; GET THE LINE COUNTER
1343 004474' 006301 ASL R1 ; AS A WORD OFFSET
1344 004476' 062701 007454' ADD #VFU66,R1 ; Calculate position in VFU
1345 004502' 005002 CLR R2 ; Clear a line spacing counter
1346
1347 004504' 005721 20$: TST (R1)+ ; UP LINE POINTER, CHECK FOR END OF VFU
1348 004506' 100002 BPL 30$ ; NOT AT END OF VFU (MARKED AS MINUS)
1349 004510' CALLR PR$FF ; JUST DO AN FF AND QUIT
1350
1351 004514' 005202 30$: INC R2 ; UP THE LINE SPACING COUNTER
1352 004516' 030011 BIT R0,(R1) ; STOP MATCH AT CURRENT LINE LOCATION?
1353 004520' 001771 BEQ 20$ ; NOT YET
1354 004522' 112700 000012 MOVB #LF,R0 ; SET LF CODE IN TO R0
1355
1356 004526' 004767 000130 40$: CALL PR$BYT ; Print a line feed
1357 004532' 105265 000113 INCB L.LNCT(R5) ; Count lines as we go
1358 004536' 077205 SOB R2,40$
1359 004540' RETURN
1360
1361
1362 ;+
1363 ; Forms control translation
1364 ;-
1365 004542' 106300 FORM$X: ASLB R0 ; Horizontal or vertical ?
1366 004544' 100340 BPL FORM$V ; Vertical
1367 004546' 000671 BR FORM$H ; Horizontal
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 27
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1369 ;+
1370 ; NURD message builder
1371 ;
1372 ; R0 Byte to put into buffer
1373 ; R5 Database address
1374 ;-
1375 004550' 005365 000164 MS$BYT: DEC L.MSGS(R5) ; COUNT IT
1376 004554' 002410 BLT 20$ ; BUFFER ALREADY FULL
1377 004556' MAP$ L.MSGA(R5) ; MAP TO BUFFER
1378 004564' 110075 000162 MOVB R0,@L.MSGA+2(R5) ; INSERT CHAR
1379 004570' 005265 000162 INC L.MSGA+2(R5) ; ADVANCE PTR
1380 004574' RETURN
1381
1382 004576' 005065 000164 20$: CLR L.MSGS(R5) ; RESET THE COUNT
1383 004602' 25$: PUSH$S R4
1384 004604' 004767 177306 CALL BF$SDB ; GET A BUFFER
1385 004610' 103420 BCS 30$ ; Oops
1386 004612' 016465 000016 000160 MOV C.BUF(R4),L.MSGA(R5) ; MAKE IT THE CURRENT BUFFER
1387 004620' 016465 000020 000162 MOV C.BUF+2(R4),L.MSGA+2(R5)
1388 004626' 016465 000022 000164 MOV C.CNT(R4),L.MSGS(R5)
1389 004634' ENQ$ L.MSGQ ; ADD IT TO END OF LIST
1390 004646' POP$S R4
1391 004650' 000737 BR MS$BYT ; NOW STUFF THE CHAR
1392
1393 004652' 30$: POP$S R4
1394 004654' 004767 001652 CALL ZZ$SLP ; WAIT A SEC AND TRY AGAIN
1395 004660' 000750 BR 25$
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 28
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1397 ;+
1398 ; Put a byte into the physical output buffer
1399 ;-
1400 004662' 005365 000150 PR$BYT: DEC L.PLBS(R5) ; Decrement the counter
1401 004666' 002410 BLT 10$ ; Buffer, if any, is full already
1402 004670' MAP$ L.PLBP(R5) ; Map it
1403 004676' 110075 000146 MOVB R0,@L.PLBP+2(R5) ; Stash byte in physical buffer
1404 004702' 005265 000146 INC L.PLBP+2(R5) ; Advance the pointer
1405 004706' RETURN
1406
1407 004710' 005065 000150 10$: CLR L.PLBS(R5) ; CORRECT DECREMENT OVERRUN
1408 004714' 005765 000146 TST L.PLBP+2(R5) ; PHYSICAL BUFFER IN PROCESS?
1409 004720' 001402 BEQ 20$ ; NO, GO GET ONE
1410 004722' 004767 000062 CALL PR$DQX ; STUFF THE LP
1411
1412 004726' 004767 000406 20$: CALL PR$NEW ; SET UP A NEW BUFFER
1413 004732' 000753 BR PR$BYT ; TRY AGAIN
1414
1415
1416 ;+
1417 ; Put a printing character into the physical output buffer.
1418 ;-
1419 004734' 126565 000114 000221 PR$CHR: CMPB L.COCT(R5),LE.FWD+F.FCV(R5) ; COL CT LE FORM WIDTH?
1420 004742' 103405 BLO 28$ ; YES, OKAY (UNSIGNED COMPARISON)
1421 004744' 105765 000223 TSTB LE.TRN+F.FCV(R5) ; LINE TRUNCATION ON?
1422 004750' 001016 BNE 35$ ; IF SO, EAT CHARACTERS TIL FC COMES
1423 004752' 004767 000306 CALL PR$LF ; FORCE WRAP TO NEXT LINE
1424
1425 004756' 105765 000217 28$: TSTB LE.LCR+F.FCV(R5) ; UPPER CASE ONLY ON?
1426 004762' 001405 BEQ 30$ ; NO
1427 004764' 120027 000140 CMPB R0,#140 ; YES, IS CHAR LOWER CASE?
1428 004770' 103402 BLO 30$ ; NO
1429 004772' 042700 000040 BIC #40,R0 ; YES, CLEAR UNSHIFT BIT
1430
1431 004776' 004767 177660 30$: CALL PR$BYT ; PUT CURRENT CHARACTER TO BUFFER
1432 005002' 105265 000114 INCB L.COCT(R5) ; COUNT THE COLUMN
1433 005006' 35$: RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 29
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1435 ;+
1436 ; Dequeue and transmit physical buffer.
1437 ;-
1438 005010' PR$DQX: DEQ$ L.PLBQ ; Dequeue the physical buffer
1439 005026' 016764 000000G 000022 MOV .RDBSZ,C.CNT(R4) ; Buffer is originally this big
1440 005034' 166564 000150 000022 SUB L.PLBS(R5),C.CNT(R4) ; Subtract unused count
1441 005042' 005065 000146 CLR L.PLBP+2(R5) ; Clear current buffer
1442 005046' 005065 000150 CLR L.PLBS(R5) ; and size
1443 005052' CALLR $LEQUE ; Send it
1444
1445
1446
1447
1448 ;+
1449 ; Print a form feed, and adjust counters
1450 ;-
1451 005056' PR$FF: PUSH$S R0
1452 005060' 112700 000014 MOVB #FF,R0 ; SET FF CHAR
1453 005064' 004767 177572 CALL PR$BYT ; TRY TO PUT IT
1454 005070' POP$S R0
1455 005072' 105065 000113 CLRB L.LNCT(R5) ; CLEAR LINE COUNT
1456 005076' 105065 000114 CLRB L.COCT(R5) ; CLEAR COLUMN COUNTER
1457 005102' RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 30
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1459 ;+
1460 ; Called to return a data CCB.
1461 ; R4 CCB
1462 ; R5 Database address
1463 ;
1464 ; The CCB may be a physical buffer that has been printed and may
1465 ; have a source buffer pointer in C.STK (to be returned). The
1466 ; CCB may be other than a physical buffer, being circulated through
1467 ; the driver queue to synchronize its transmission with the printed
1468 ; data.
1469 ;-
1470 005104' 105764 000011 PR$FIN: TSTB C.PIX(R4) ; Physical buffer?
1471 005110' 001046 BNE 100$ ; No, a source buffer in disguise
1472 005112' PUSH$S R4 ; Yes, save its address
1473 005114' 016404 000004 MOV C.STK(R4),R4 ; Get source buffer address
1474 005120' 001402 BEQ 26$ ; None here
1475 005122' 004767 000100 CALL 100$ ; Return source buf to owner
1476
1477 005126' 26$: POP$S R4 ; Restore physical buffer address
1478 005130' 005064 000004 CLR C.STK(R4) ; Assure no pointer left here
1479 005134' 032764 000400 000014 BIT #LA.EOF,C.STS(R4) ; Check this buffer for eof condition
1480 005142' 001403 BEQ 30$
1481 005144' 052765 000040 000056 BIS #LA.CPC,L.ASTS(R5) ; IF SO, SET FLAG TO CLEAR PAGE COUNT
1482 ; BEFORE NEXT OUTPUT
1483 005152' 032764 000100 000014 30$: BIT #LA.AKR,C.STS(R4) ; MARKED TO ACKNOWLEDGE DATA MESSAGE?
1484 005160' 001414 BEQ 45$ ; NO
1485 005162' 105765 000111 TSTB L.RATT(R5) ; ATTENTION PENDING?
1486 005166' 001404 BEQ 40$ ; NO, SET UP TO ACK
1487 005170' 126527 000111 000002 CMPB L.RATT(R5),#N.AACK ; IS CURRENT REASON MORE IMPORTANT?
1488 005176' 101005 BHI 45$ ; YES, LET THE PENDING REASON STAND
1489 005200' 112765 000002 000111 40$: MOVB #N.AACK,L.RATT(R5) ; NO, USE ACKNOWLEDGE AS THE REASON
1490 005206' 004767 000730 CALL SN$ATT ; TRY TO SEND AN ATTENTION
1491
1492 005212' 45$: ENQ$ L.PLBQ ; Queue physical buffer for future use
1493 005224' RETURN
1494
1495 ; Return a source buffer to NRD
1496 005226' 012764 000001 000014 100$: MOV #S.SSUC,C.STS(R4) ; ACK A NRD message
1497 005234' 032765 000010 000056 BIT #LA.ABO,L.ASTS(R5) ; Abort in progress ?
1498 005242' 001403 BEQ 101$ ; No, serenity
1499 005244' 012764 177767 000014 MOV #S.EABO,C.STS(R4) ; Indicate purge
1500 005252' 112764 000004 000012 101$: MOVB #FC.RCE,C.FNC(R4) ; Return it
1501 005260' CALLR $SCHED ; ...
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 31
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1503 ;+
1504 ; Print a line feed
1505 ;-
1506 005264' 005001 PR$LF: CLR R1
1507 005266' 156501 000113 BISB L.LNCT(R5),R1 ; GET LINE COUNTER BYTE
1508 005272' 006301 ASL R1 ; AS WORD OFFSET
1509 005274' 062701 007454' ADD #VFU66,R1 ; POINT INTO CURRENT VFU
1510 005300' 005721 TST (R1)+ ; UP LINE POINTER
1511 005302' 100665 BMI PR$FF ; SKIP IF PAST END OF TABLE
1512 005304' 032711 000200 BIT #VFBP8,(R1) ; ***TABLE SPECIFIC HACK
1513 005310' 001662 BEQ PR$FF ; APPARENTLY IN MARGIN, GO DO TOF
1514 005312' PUSH$S R0
1515 005314' 112700 000012 MOVB #LF,R0 ; SET CHAR
1516 005320' 004767 177336 CALL PR$BYT ; DO IT
1517 005324' POP$S R0
1518 005326' 105265 000113 INCB L.LNCT(R5) ; UP LINE COUNTER
1519 005332' 105065 000114 CLRB L.COCT(R5) ; CLEAR COL CTR WHEN GOING TO NEW LINE
1520 005336' RETURN ; CARRY STAYS AS SET BY LAST CALL
1521
1522
1523 ;+
1524 ; Set up new physical output buffer
1525 ;-
1526 005340' 016504 000140 PR$NEW: MOV L.PLBQ(R5),R4 ; IS ONE ENQUEUED?
1527 005344' 001414 BEQ 10$ ; NO
1528 005346' 005064 000014 CLR C.STS(R4) ; INIT STATUS
1529 005352' 016465 000016 000144 MOV C.BUF(R4),L.PLBP(R5) ; SET NEW ADDRESS DOUBLEWORD
1530 005360' 016465 000020 000146 MOV C.BUF+2(R4),L.PLBP+2(R5)
1531 005366' 016765 000000G 000150 MOV .RDBSZ,L.PLBS(R5) ; SET BUFFER MAX SIZE
1532 005374' RETURN
1533
1534 005376' 004767 001130 10$: CALL ZZ$SLP ; SLEEP TIL A BUFFER MEANDERS BACK
1535 005402' 000756 BR PR$NEW
1536
1537
1538 ;+
1539 ; Check for room in current buffer. Start new buffer if needed.
1540 ; R0 Number of bytes of space needed
1541 ;-
1542 005404' 005765 000146 PR$SPC: TST L.PLBP+2(R5) ; BUFFER IN USE ?
1543 005410' 001406 BEQ 20$ ; NOPE - GO GET ONE
1544 005412' 020065 000150 CMP R0,L.PLBS(R5) ; ROOM ?
1545 005416' 003001 BGT 10$
1546 005420' RETURN
1547
1548 005422' 004767 177362 10$: CALL PR$DQX ; NO ROOM - FLUSH CURRENT
1549 005426' 20$: CALLR PR$NEW ; AND GET NEW ONE
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 32
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1551 ;+
1552 ; Purge the queues
1553 ;
1554 ; Abort all from <DDMQ>, <DLCQ>, and <MSGQ> (in that order).
1555 ; Assumes that printer is stopped.
1556 ;-
1557 005432' Q$PURG: PUSH$S <R0,R1,R3,R4> ; SAVE CURRENT CCB, DATABASE ADDR, ETC.
1558
1559 005442' 10$: DEQ$ L.DDMQ,20$ ; RETURN PHYSICAL BUFFERS TO THE PB Q
1560 005462' 004767 177416 CALL PR$FIN ; RETURN ANY MESSAGE BUFS
1561 005466' 000765 BR 10$ ; AND RESTORE PHYSICAL BUFS TO LIST
1562
1563 005470' 20$: DEQ$ L.DLCQ,30$ ; Abort messages waiting to be done
1564 005510' 012764 177767 000014 MOV #S.EABO,C.STS(R4) ; ...
1565 005516' 112764 000004 000012 MOVB #FC.RCE,C.FNC(R4) ; ...
1566 005524' 004767 000000G CALL $SCHED ; ...
1567 005530' 000757 BR 20$ ; Look on
1568
1569 005532' 30$: DEQ$ L.MSGQ,40$ ; FLUSH ANYTHING GOING OUT
1570 005552' 012701 000120 MOV #80.,R1 ; SET SIZE OF BUFFER
1571 005556' 004767 000000G CALL $CBBRT ; RETURN IT
1572 005562' 000763 BR 30$
1573
1574 005564' 105065 000044 40$: CLRB L.DTXL(R5) ; FLUSH ANY SUSPENDED PROCESSING
1575 005570' 005065 000064 CLR L.PUBS(R5) ; NO CURRENT PRINT BUFFER
1576 005574' 005065 000146 CLR L.PLBP+2(R5) ; NO PHYSICAL BUFFER IN USE
1577 005600' 005065 000150 CLR L.PLBS(R5)
1578 005604' 005065 000134 CLR L.DMAD+2(R5) ; NO CURRENT SOURCE BUFFER
1579 005610' 005065 000132 CLR L.DMAD(R5)
1580 005614' 005065 000136 CLR L.DMBS(R5) ; MAY HAVE BEEN A BUFFER IN PROGRESS
1581 005620' 005065 000164 CLR L.MSGS(R5) ; ...
1582 005624' POP$S <R4,R3,R1,R0>
1583 005634' RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 33
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1585 ;+
1586 ; Read a data byte.
1587 ;-
1588 005636' 005365 000136 RD$BYT: DEC L.DMBS(R5) ; Decrement counter
1589 005642' 002411 BLT 5$ ; Buffer, if any, is drained
1590 005644' MAP$ L.DMAD(R5) ; Map it
1591 005652' 005000 CLR R0 ; Get a byte from buffer
1592 005654' 157500 000134 BISB @L.DMAD+2(R5),R0 ; ...
1593 005660' 005265 000134 INC L.DMAD+2(R5) ; Advance source pointer
1594 005664' RETURN ; Done
1595
1596 005666' 005765 000134 5$: TST L.DMAD+2(R5) ; IS A BUFFER IN PROCESS?
1597 005672' 001423 BEQ 10$ ; NO BUFFER IN USE
1598 005674' 016504 000116 MOV L.DLCQ(R5),R4 ; CHECK FOR MESSAGE CONTINUITY
1599 005700' 132764 000004 000025 BITB #S$PEOM,C.PRM1+1(R4)
1600 005706' 001405 BEQ 9$
1601
1602 ; A message fragment, can't continue
1603 005710' 004767 001006 CALL $LESTP ; Stop printer interrupts
1604 005714' 052765 000004 000056 BIS #LA.ADN,L.ASTS(R5) ; ABORT LINK WHEN DDM QUEUE IS EMPTY
1605
1606 005722' 004767 000054 9$: CALL RD$DQX ; EMPTIED BUFFER ON TOP
1607 005726' 032700 000004 BIT #S$PEOM,R0 ; CHECK IF EOM
1608 005732' 001403 BEQ 10$ ; NO
1609 005734' 016506 000046 MOV L.DFSP(R5),SP ; YES, RECOVER STACK POINTER
1610 005740' RETURN ; SO WE CAN QUIT
1611
1612 ; No buffer, so set one up
1613 005742' 016504 000116 10$: MOV L.DLCQ(R5),R4 ; IS THERE A QUEUED ENTRY?
1614 005746' 001003 BNE 15$ ; YES
1615 005750' 004767 000556 CALL ZZ$SLP ; WAIT TIL NEXT SEGMENT ARRIVES
1616 005754' 000772 BR 10$
1617
1618 005756' 016465 000016 000132 15$: MOV C.BUF(R4),L.DMAD(R5) ; GET ADDRESS DOUBLEWORD AS PTR
1619 005764' 016465 000020 000134 MOV C.BUF+2(R4),L.DMAD+2(R5); ...
1620 005772' 016465 000022 000136 MOV C.CNT(R4),L.DMBS(R5) ; GET BUFFER COUNT AS SIZE COUNTER
1621 006000' 000716 BR RD$BYT ; TRY AGAIN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 34
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1623 ;+
1624 ; Dequeue and return a source buffer to NRD
1625 ;-
1626 006002' 005065 000134 RD$DQX: CLR L.DMAD+2(R5) ; Indicate "no buffer in use"
1627 006006' 005065 000136 CLR L.DMBS(R5) ; ...
1628 006012' DEQ$ L.DLCQ ; Dequeue message just don
1629 006030' 116400 000025 MOVB C.PRM1+1(R4),R0 ; Remember EOM status
1630 006034' 005765 000146 TST L.PLBP+2(R5) ; Physical buffer in use ?
1631 006040' 001407 BEQ 10$ ; No, have to make do without one
1632 006042' PUSH$S R4 ; Yes, save the buffer address
1633 006044' 016504 000140 MOV L.PLBQ(R5),R4 ; Get current physical buffer address
1634 006050' 005764 000004 TST C.STK(R4) ; Already have a stacked message?
1635 006054' 001403 BEQ 20$ ; No, so go ahead and stack on it
1636 006056' POP$S R4 ; Yes, so just stick it directly on que
1637 006060' 10$: CALLR $LEQUE ; ...
1638
1639 006064' 20$: POP$S C.STK(R4) ; Ok, tie it to physical buffer
1640 006070' CALLR PR$DQX ; Queue physical buffer to printer
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 35
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1642 ;+
1643 ; Send alert message
1644 ;-
1645 006074' 004767 176016 SN$ALR: CALL BF$SDB ; Get a message buffer
1646 006100' 103417 BCS 10$ ; Oops
1647 006102' 016401 000020 MOV C.BUF+2(R4),R1 ; Get buffer pointer
1648 006106' 112721 000004 MOVB #NM.ALR,(R1)+ ; Complete alert message (1 word)
1649 006112' 105021 CLRB (R1)+ ; Clear NURD message flags
1650 006114' 012764 000002 000022 MOV #2,C.CNT(R4) ; Set message length
1651 006122' 112764 000014 000013 MOVB #S$SNI,C.MOD(R4) ; Alert is an interrupt message
1652 006130' 005265 000100 INC L.IOCN(R5) ; Count the I/O
1653 006134' 004767 000000G CALL $SCHED ; and send it
1654 006140' 10$: RETURN
1655
1656
1657
1658
1659 ;+
1660 ; Send attention message
1661 ;
1662 ; Allocate an SDB and build attention message.
1663 ; Reason code is in L.RATT.
1664 ;-
1665 006142' SN$ATT: PUSH$S <R0,R1,R2,R3,R4> ; Preserve registers
1666 006154' 116502 000111 MOVB L.RATT(R5),R2 ; GET EXCUSE CODE FOR ATTENTION MESSAGE
1667 006160' 001501 BEQ 110$ ; NO ATTENTION IS PENDING, LEAVE
1668 ; BUILD AND SEND AN ATTENTION MESSAGE
1669 006162' 004767 175730 CALL BF$SDB ; GET A MESSAGE BUFFER
1670 006166' 103476 BCS 110$ ; FAILED, EXIT - WE'LL BE BACK
1671 006170' 016401 000020 MOV C.BUF+2(R4),R1 ; GET POINTER TO START OF BUFFER
1672 006174' 112721 000001 MOVB #NM.ATT,(R1)+ ; LOAD MESSAGE TYPE TO BUFFER
1673 006200' 105021 CLRB (R1)+ ; CLEAR NURD MESSAGE FLGS
1674 006202' 116521 000123 MOVB L.DMSQ(R5),(R1)+ ; STORE LAST GOOD SEQUENCE NUMBER
1675 006206' 110221 MOVB R2,(R1)+ ; LOAD ATTENTION CODE
1676 006210' 005002 CLR R2 ; CLEAR FLAGS ACCUMULATOR
1677 006212' 016500 000056 MOV L.ASTS(R5),R0 ; GET DEVICE STATUS
1678 006216' 032700 000004 BIT #LA.ADN,R0 ; ABORT WHEN DONE ?
1679 006222' 001402 BEQ 10$
1680 006224' 052702 000001 BIS #NA.FAT,R2 ; SOME FATAL ERROR - USUALLY USER'S
1681
1682 006230' 032700 000200 10$: BIT #LA.ERR,R0 ; PRINTER ERROR ON?
1683 006234' 001402 BEQ 11$ ; NO
1684 006236' 052702 000002 BIS #NA.OFL,R2 ; YES, NOTE OFFLINE
1685
1686 006242' 032700 000002 11$: BIT #LA.PAU,R0 ; PAUSED?
1687 006246' 001402 BEQ 20$ ; NO
1688 006250' 052702 000004 BIS #NA.PAU,R2 ; YES
1689
1690 006254' 052702 000200 20$: BIS #200,R2 ; TENTATIVELY SET EXTEND FLAG
1691 006260' 110221 MOVB R2,(R1)+ ; THAT'S IT FOR BYTE 1 FLAGS
1692 006262' 005002 CLR R2 ; CLEAR FOR BYTE 2 FLAGS
1693 006264' 032700 004000 BIT #LA.TMO,R0 ; HUNG?
1694 006270' 001402 BEQ 30$ ; NO
1695 006272' 052702 000004 BIS #NA.DTO,R2 ; YES
1696
1697 006276' 052702 000200 30$: BIS #200,R2 ; TENTATIVELY SET EXTEND FLAG
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 35-1
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1698 006302' 110221 MOVB R2,(R1)+ ; THAT'S IT FOR BYTE 2
1699 006304' 005002 CLR R2 ; CLEAR FOR BYTE 3 FLAGS
1700
1701 006306' 110211 40$: MOVB R2,(R1) ; THAT'S IT FOR BYTE 3 FLAGS
1702 006310' 001005 BNE 50$ ; 3 BYTE FEILD
1703 006312' 142741 000200 BICB #200,-(R1) ; NOT MORE THAN 2 BYTES
1704 006316' 001002 BNE 50$ ; 2 BYTER
1705 006320' 142741 000200 BICB #200,-(R1) ; ONLY 1 BYTE
1706
1707 006324' 005201 50$: INC R1 ; ADVANCE R1 TO NEXT AVAILABLE BYTE
1708 006326' 016503 000072 MOV L.PGCT(R5),R3 ; GET PAGE COUNT ACCUMULATOR
1709 006332' 110321 MOVB R3,(R1)+ ; STORE LOW BYTE OF COUNT
1710 006334' 000303 SWAB R3 ; GET HIGH BYTE
1711 006336' 110321 MOVB R3,(R1)+ ; STORE IT TOO
1712 006340' 166401 000020 SUB C.BUF+2(R4),R1 ; COMPUTE MESSAGE SIZE
1713 006344' 010164 000022 MOV R1,C.CNT(R4) ; STUFF IT INTO CCB
1714 006350' 005265 000100 INC L.IOCN(R5) ; Count the I/O
1715 006354' 004767 000000G CALL $SCHED ; and send it
1716 006360' 105065 000111 CLRB L.RATT(R5) ; CLEAR PENDING REQUEST FOR ATTENTION
1717 006364' 110$: POP$S <R4,R3,R2,R1,R0> ; RESTORE REGS
1718 006376' RETURN ; EXIT SEND ATTENTION
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 36
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1720 ;+
1721 ; Send capabilities message
1722 ;
1723 ; Message Format: <no. features><...fid's...>
1724 ;-
1725 006400' 004767 175512 SN$CAP: CALL BF$SDB ; GET A MESSAGE BUFFER
1726 006404' 103451 BCS 100$
1727 006406' 016403 000020 MOV C.BUF+2(R4),R3 ; GET BUFFER ADDRESS
1728 ; FORMAT A NURD MESSAGE
1729 006412' 112723 000005 MOVB #NM.CAP,(R3)+ ; NURD MESSAGE TYPE = CAPABILITIES
1730 006416' 105023 CLRB (R3)+ ; NO FLAGS
1731 006420' PUSH$S R3 ; SAVE PTR TO CNT
1732 006422' 105023 CLRB (R3)+ ; INIT CNT
1733 006424' 012764 000003 000022 MOV #3,C.CNT(R4) ; SET BUFFER CNT = BYTES INSERTED
1734 006432' PUSH$S R5 ; SAVE THE DATABASE PTR
1735 006434' 062705 000166 ADD #L.CFET,R5 ; GET R5 -> COMMON FEATURES LIST
1736 006440' 005001 CLR R1 ; INIT THE FID
1737
1738 006442' 005000 10$: CLR R0 ; GET LENGTH OF FEATURE LIST
1739 006444' 152500 BISB (R5)+,R0
1740 006446' 001407 BEQ 31$ ; NO FEATURES!!
1741
1742 006450' 005201 20$: INC R1 ; ADVANCE THE FID
1743 006452' 105725 TSTB (R5)+ ; CHECK FOR SUPPORT OF IT
1744 006454' 001403 BEQ 30$ ; NOPE
1745 006456' 110123 MOVB R1,(R3)+ ; YES - STORE FID IN MESSAGE
1746 006460' 005264 000022 INC C.CNT(R4) ; COUNT IT
1747 006464' 077007 30$: SOB R0,20$
1748 006466' 105701 31$: TSTB R1 ; CHECK WHICH FEATURE LIST
1749 006470' 100403 BMI 40$ ; DEVICE SPECIFIC - DONE
1750 006472' 012701 000200 MOV #200,R1 ; INIT FID FOR DEVICE SPECIFIC FEATURES
1751 006476' 000761 BR 10$ ; PROCESS THAT LIST
1752
1753 006500' 40$: POP$S R5 ; GET THE DATABASE PTR BACK
1754 006502' 016400 000022 MOV C.CNT(R4),R0 ; GET THE BUFFER CNT
1755 006506' 162700 000003 SUB #3,R0 ; CALC NO. FEATURES FOUND
1756 006512' 110036 MOVB R0,@(SP)+ ; STORE CNT IN CNT BYTE OF MESSAGE
1757 006514' 005265 000100 INC L.IOCN(R5) ; Count the I/O
1758 006520' 004767 000000G CALL $SCHED ; and send it
1759 006524' 105065 000112 CLRB L.CAPP(R5) ; FLUSH THE FLAG
1760 006530' 100$: RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 37
LE.M11 30-DEC-82 03:53 SUPPORT ROUTINES
1762 ;+
1763 ; Data / Features HIBER Function
1764 ;
1765 ; Called by process to wait for a clock tick.
1766 ;-
1767 006532' 010065 000004 ZZ$SLP: MOV R0,L.DTXT(R5) ; STORE THE REGISTERS 1ST
1768 006536' 012700 000006 MOV #L.DTXT+2,R0
1769 006542' 060500 ADD R5,R0 ; R0 -> R1 SLOT
1770 006544' 010120 MOV R1,(R0)+
1771 006546' 010220 MOV R2,(R0)+
1772 006550' 010320 MOV R3,(R0)+
1773 006552' 010420 MOV R4,(R0)+
1774 006554' 105065 000044 CLRB L.DTXL(R5) ; INIT THE COUNT
1775
1776 006560' 122765 000013 000044 10$: CMPB #DTXTSZ-5,L.DTXL(R5) ; CHECK INCIPIENT OVERFLOW
1777 006566' 101001 BHI 20$
1778 006570' 000003 BPT ; PROGRAM BUG
1779 006572' 012620 20$: MOV (SP)+,(R0)+ ; XFER NEXT STACK WORD
1780 006574' 105265 000044 INCB L.DTXL(R5) ; COUNT IT
1781 006600' 026506 000046 CMP L.DFSP(R5),SP ; CHECK ORIGIN
1782 006604' 001365 BNE 10$ ; MORE
1783 006606' RETURN
1784
1785
1786 ;+
1787 ; Clock has ticked.
1788 ;-
1789 006610' 010665 000046 ZZ$WAK: MOV SP,L.DFSP(R5) ; SET THE NEW STACK ORIGIN
1790 006614' 005000 CLR R0
1791 006616' 156500 000044 BISB L.DTXL(R5),R0 ; GET NO. OF WORDS TO RETURN TO STACK
1792 006622' 006300 ASL R0
1793 006624' 062700 000016 ADD #L.DTXT+12,R0
1794 006630' 060500 ADD R5,R0 ; R0 -> 1ST WORD TO RETURN TO STACK
1795
1796 006632' 014046 10$: MOV -(R0),-(SP) ; XFER THE STACK CONTENTS
1797 006634' 105365 000044 DECB L.DTXL(R5) ; COUNT THEM
1798 006640' 001374 BNE 10$
1799 006642' 014004 MOV -(R0),R4 ; RESTORE THE REGISTERS
1800 006644' 014003 MOV -(R0),R3
1801 006646' 014002 MOV -(R0),R2
1802 006650' 014001 MOV -(R0),R1
1803 006652' 014000 MOV -(R0),R0
1804 006654' RETURN ; Return to original caller of ZZ$SLP
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 38
LE.M11 30-DEC-82 03:53 INTERRUPT SERVICE
1806 .sbttl Interrupt Service
1807 ;+
1808 ; Configuration stuff
1809 ;-
1810 000006 LEPBFS = 6 ; NUMBER OF PHYSICAL BUFFERS TO HOARD
1811 000005 LEHNG = 5 ; HUNG DEVICE TIME CONSTANT
1812
1813
1814 ;+
1815 ; LP11 hardware device register definitions
1816 ;-
1817 000000 LPS = 0 ; LINE PRINTER STATUS REGISTER
1818 100000 ERROR = 100000 ; GENERAL (ONLY KNOWN) ERROR BIT
1819 000200 DONE = 200 ; CHARACTER DONE/PRINTER READY
1820 000100 INTENB = 100 ; INTERRUPT ENABLE
1821 000002 LPB = 2 ; LINE PRINTER DATA BUFFER REGISTER
1822 ; SEVEN BIT ASCII, WRITE ONLY
1823 000004 LESZ = 4 ; SIZE OF LP11 REGISTER BLOCK IN BYTES
1824
1825
1826 ;+
1827 ; Queue output image buffers to be sent to LPT.
1828 ; Start interrupt processing if appropriate
1829 ;
1830 ; R4 CCB
1831 ; R5 Database address
1832 ;-
1833 .enabl LSB
1834
1835 006656' 004767 000040 $LEQUE: CALL $LESTP ; FLUSH INTERRUPTS WHILE WE DIDDLE Q'S
1836 006662' ENQ$ L.DDMQ ; QUEUE UP INCOMING OUTPUT BUFFER
1837
1838 ; START THE DEVICE IF IT SHOULD BE
1839 006674' 032765 000002 000056 $LESTR: BIT #LA.PAU,L.ASTS(R5) ; ARE WE PAUSED?
1840 006702' 001006 BNE 10$ ; EVERYTHING IS QUIESENT
1841
1842
1843 006704' 112765 000005 000077 $LEGO: MOVB #LEHNG,L.HUNG(R5) ; SET THE HUNG TIMER
1844 006712' 012775 000100 000002 MOV #INTENB,@L.CSR(R5) ; GOOSE IT
1845 006720' 10$: RETURN
1846 .DSABL LSB
1847
1848
1849 006722' 005075 000002 $LESTP: CLR @L.CSR(R5) ; STOP THE INTERRUPTS
1850 006726' 105065 000077 CLRB L.HUNG(R5) ; AND FLUSH THE HUNG TIMER
1851 006732' RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 39
LE.M11 30-DEC-82 03:53 INTERRUPT SERVICE
1853 ;+
1854 ; Field interrupts:
1855 ; Dispatch to error if error set,
1856 ; alternate error if pause set,
1857 ; else output next character.
1858 ; If last character of buffer sent, go to interrupt on done
1859 ; to return used buffer and start next one.
1860 ;
1861 ; R5 Database address
1862 ;-
1863
1864 006734' 032765 020000 000056 $LEINT::BIT #LA.INT,L.ASTS(R5) ; Already handling interrupt ?
1865 006742' 001401 BEQ 1$ ; No, so go to it
1866 006744' RETURN ; Yes, so dismiss this one
1867 006746' 052765 020000 000056 1$: BIS #LA.INT,L.ASTS(R5) ; Say we are processing an interrupt
1868 006754' 105065 000077 CLRB L.HUNG(R5) ; Reset the hung timer
1869 006760' 010504 MOV R5,R4 ; Build pointer to SYNCH block
1870 006762' 062704 000050 ADD #L.SYN,R4 ; ...
1871 006766' 012764 007000' 000004 MOV #5$,S.DSP(R4) ; Set return address
1872 006774' CALLR $SYNCH ; Go
1873
1874 ; Here at synch level
1875 007000' 042765 020000 000056 5$: BIC #LA.INT,L.ASTS(R5) ; Clear interrupt level stuff
1876 007006' 016503 000002 MOV L.CSR(R5),R3 ; Get CSR address
1877 007012' 005013 CLR (R3) ; Turn off printer
1878 007014' 032765 000002 000056 BIT #LA.PAU,L.ASTS(R5) ; Ought we pause?
1879 007022' 001131 BNE INXPAU ; Yes
1880 007024' MAP$ L.PUBP(R5) ; Set mapping for present output
1881 007032' 016502 000062 MOV L.PUBP+2(R5),R2 ; R2 / Buffer pointer
1882 007036' 016501 000064 MOV L.PUBS(R5),R1 ; R1 / Buffer count
1883 007042' 001451 BEQ 40$ ; An empty one !
1884
1885 007044' 005713 10$: TST (R3) ; Check the printer status
1886 007046' 003016 BGT 15$ ; All is ok
1887 007050' 010165 000064 MOV R1,L.PUBS(R5) ; Some problem, we will wait a bit
1888 007054' 010265 000062 MOV R2,L.PUBP+2(R5) ; Save the state
1889 007060' 012700 000200 MOV #LA.ERR,R0 ; Assume an error
1890 007064' 005713 TST (R3) ; Ehh ?
1891 007066' 100503 BMI INTPAU ; An error
1892 007070' 112765 000005 000077 MOVB #LEHNG,L.HUNG(R5) ; Full up, so reset the hung timer
1893 007076' 012713 000100 MOV #INTENB,(R3) ; Restart the device
1894 007102' 000511 BR LEXIT ; Wait till later
1895
1896 007104' 112200 15$: MOVB (R2)+,R0 ; Printer is ready, get next character
1897 007106' 004767 000216 CALL LEPRT ; and print it
1898 007112' 103013 BCC 20$ ; Jump ahead if it went ok
1899 007114' 005301 DEC R1 ; Page-limit exceeded. FF went out
1900 007116' 010165 000064 MOV R1,L.PUBS(R5) ; Save state information
1901 007122' 010265 000062 MOV R2,L.PUBP+2(R5) ; ...
1902 007126' 112765 000005 000111 MOVB #N.APLE,L.RATT(R5) ; Request attention message
1903 007134' 012700 010000 MOV #LA.PLE,R0 ; Set status correctly
1904 007140' 000456 BR INTPAU ; Get on out
1905
1906 007142' 077140 20$: SOB R1,10$ ; Keep going while printer is hungry
1907
1908 007144' 30$: DEQ$ L.DDMQ ; Take just-finished buffer off queue
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 39-1
LE.M11 30-DEC-82 03:53 INTERRUPT SERVICE
1909 007162' 004767 175716 CALL PR$FIN ; Return buffer
1910 007166' 016504 000066 40$: MOV L.DDMQ(R5),R4 ; Get address of top element of queue
1911 007172' 001432 BEQ 60$ ; None there, exit
1912 007174' 105764 000011 TSTB C.PIX(R4) ; Check for circulating source buffer
1913 007200' 001361 BNE 30$ ; If so, just return it
1914 007202' 032765 000040 000056 BIT #LA.CPC,L.ASTS(R5) ; Check if last buffer had EOF
1915 007210' 001405 BEQ 50$ ; No
1916 007212' 005065 000072 CLR L.PGCT(R5) ; Yes - clear page counter
1917 007216' 042765 000040 000056 BIC #LA.CPC,L.ASTS(R5) ; Reset the flag
1918
1919 007224' 50$: MAP$ C.BUF(R4) ; Set mapping
1920 007232' 016465 000016 000060 MOV C.BUF(R4),L.PUBP(R5) ; and save it too
1921 007240' 016402 000020 MOV C.BUF+2(R4),R2 ; Buffer pointer
1922 007244' 016401 000022 MOV C.CNT(R4),R1 ; Buffer length
1923 007250' 001735 BEQ 30$ ; Empty buffers are empty
1924 007252' 016503 000002 MOV L.CSR(R5),R3 ; Get CSR address again
1925 007256' 000672 BR 10$ ; Continue where we left off
1926
1927 007260' 005065 000064 60$: CLR L.PUBS(R5) ; Clear L.PUBS for next startup
1928 007264' 032765 000004 000056 BIT #LA.ADN,L.ASTS(R5) ; Check for auto death
1929 007272' 001415 BEQ LEXIT ; Nope
1930 007274' 005000 CLR R0 ; Yes - pause now
1931 ; BR INTPAU ; ...
1932
1933
1934 007276' 052700 000002 INTPAU: BIS #LA.PAU,R0 ; Always have this bit lit
1935 007302' 050065 000056 BIS R0,L.ASTS(R5) ; Put whole thing into database
1936 007306' 105765 000111 INXPAU: TSTB L.RATT(R5) ; Attention already pending?
1937 007312' 001005 BNE LEXIT ; Yes, don't overwrite reason code
1938 007314' 112765 000001 000111 MOVB #N.ASTC,L.RATT(R5) ; No, note status change
1939 007322' 004767 176614 CALL SN$ATT ; Build and send attention message
1940
1941 007326' LEXIT: RETURN ; Leave
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 40
LE.M11 30-DEC-82 03:53 INTERRUPT SERVICE
1943 ; Printer output routine
1944 007330' 122700 000012 LEPRT: CMPB #LF,R0 ; CHECK FOR LF'S AND FF'S
1945 007334' 001025 BNE 30$
1946 007336' 110063 000002 MOVB R0,2(R3) ; LF - PRINT IT
1947 007342' 105265 000076 INCB L.PLNC(R5) ; COUNT IT
1948 007346' 122765 000102 000076 CMPB #PGLEN,L.PLNC(R5) ; CHECK FOR PAGE BOUNDARY
1949 007354' 003035 BGT 50$ ; OK
1950
1951 007356' 105065 000076 20$: CLRB L.PLNC(R5) ; PAGE - CLEAR LINE COUNT
1952 007362' 005265 000072 INC L.PGCT(R5) ; COUNT THE PAGE
1953 007366' 005765 000074 TST L.PGLM(R5) ; CHECK PAGE LIMIT
1954 007372' 001426 BEQ 50$ ; NOT SET
1955 007374' 026565 000072 000074 CMP L.PGCT(R5),L.PGLM(R5) ; COMPARE COUNT TO LIM
1956 007402' 003422 BLE 50$ ; STILL OK
1957 007404' 000261 SEC ; TOO BAD
1958 007406' RETURN
1959
1960 007410' 122700 000014 30$: CMPB #FF,R0 ; CHECK FF
1961 007414' 001013 BNE 40$ ; NOT A CRITICAL CHARACTER
1962 007416' 122765 000101 000076 CMPB #PGLEN-1,L.PLNC(R5) ; CHECK FOR LAST LINE
1963 007424' 003403 BLE 35$ ; BOF - FF IS SPECIAL CASE
1964 007426' 110063 000002 MOVB R0,2(R3) ; Not BOF - Print FF and count page
1965 007432' 000751 BR 20$
1966
1967 007434' 112763 000012 000002 35$: MOVB #LF,2(R3) ; LINE FEED AT BOF TO AVOID BLANK PAGE
1968 007442' 000745 BR 20$ ; COUNT THE PAGE
1969
1970 007444' 110063 000002 40$: MOVB R0,2(R3) ; JUST PRINT THE CHARACTER
1971 007450' 000241 50$: CLC
1972 007452' RETURN
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 41
LE.M11 30-DEC-82 03:53 MISCELLANEOUS TABLES
1974 .sbttl Miscellaneous Tables
1975 ;+
1976 ; The following table defines the default contents for the LP11
1977 ; vertical format unit (VFU) for a 66 line page.
1978 ; NOTE: All VFU actions also perform carriage return action.
1979 ;
1980 ; Channel 1 - (top of form) line 1 only
1981 ; Channel 2 - half of form stop
1982 ; Channel 3 - every other line from line 1 up to and including line 59
1983 ; Channel 4 - every third line from line 1 up to and including line 58
1984 ; Channel 5 - every line
1985 ; Channel 6 - every tenth line from line 1 up to and including line 51
1986 ; Channel 7 - every 20th line from line 1 up to and including line 41
1987 ; Channel 8 - next line in form
1988 ;
1989 ; Standard extension to standard vertical format unit
1990 ; Channel 9 - every fifth line from line 1 up to and including line 56
1991 ; Channel 10 - quarter of form stops
1992 ; Channel 11 - alternate top of form
1993 ; Channel 12 - (bottom of form) line 60 at 6 lpi
1994 ;-
1995
1996 ; Set forms info
1997 000102 PGLEN = 66. ; 66 lines per page
1998 000074 FRMLEN = 60. ; 60 lines of form
1999
2000 ; Name the FCXTB flags
2001 000200 FCCHR = 200 ; CHARACTER IS A FORMS CONTROL CHARACTER
2002 000100 HFCHR = 100 ; CHARACTER IS A HORIZONTAL CONTROL CHARACTER
2003 000040 HFCCR = 40 ; CHARACTER IS A CARRIAGE RETURN CHARACTER
2004
2005
2006 ; Support Macros
2007 .macro .ZER $$
2008 .P'$$=0
2009 .endm .ZER
2010
2011 .macro SETCHN A,B ; 'OR' new channel setting into map word
2012 .P'B = .P'B ! A
2013 .endm SETCHN
2014
2015 .macro WRDVFU X
2016 .word .P'X
2017 .endm WRDVFU
2018
2019 .macro DEFPAR CHN,LINC,LAST
2020 $$ = 1
2021 .rept LAST/LINC ; Number of stops in channel
2022 SETCHN CHN,\$$ ; 'OR' in next stop
2023 $$ = $$ + LINC
2024 .endr
2025 .endm DEFPAR
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 42
LE.M11 30-DEC-82 03:53 MISCELLANEOUS TABLES
2027 001 .if ndf VCH1 ; DEFINE VFU CHANNEL TAGS
2028 $$ = 1
2029 .irp X,<1,2,3,4,5,6,7,8,9,10,11,12>
2030 VCH'X = X'. - 1 ; NUMERIC CHANNEL TAGS
2031 VFBP'X = $$ ; POSITIONAL CHANNEL TAGS
2032 $$ = $$*2
2033 .endr
2034 000 .endc
2035
2036
2037 001 .if ndf .P1
2038 $$=0 ; INIT THE LINE SYMBOLS .P<NN>
2039 .rept PGLEN
2040 $$=$$+1
2041 .ZER \$$
2042 .endr
2043
2044 ; SET THE MASK BITS IN THE PARTITION WORDS ACCORDING TO
2045 ; THE FORMULA DEFINED IN THE ARGUMENTS TO DEFPAR
2046 DEFPAR VFBP1,1,1 ; TOP OF FORM
2047 DEFPAR VFBP2,<<FRMLEN/2>>,FRMLEN ; HALF OF FORM STOPS
2048 DEFPAR VFBP3,2.,FRMLEN ; EVERY OTHER LINE
2049 DEFPAR VFBP4,3.,FRMLEN ; EVERY THIRD LINE
2050 DEFPAR VFBP5,1.,PGLEN ; EVERY LINE TO END
2051 DEFPAR VFBP6,10.,FRMLEN ; EVERY TENTH LINE
2052 DEFPAR VFBP7,20.,FRMLEN ; EVERY TWENTIETH LINE
2053 DEFPAR VFBP8,1.,FRMLEN ; SINGLE SPACE IN FORM
2054 DEFPAR VFBP9,5.,FRMLEN ; EVERY FIFTH LINE
2055 DEFPAR VFBP10,<<FRMLEN/4>>,FRMLEN ; QUARTER OF FORM STOPS
2056 DEFPAR VFBP11,1,1 ; ALTERNATE TOP OF FORM
2057 .P75 = .P75 ! VFBP12 ; SPECIAL CASE FOR BOF
2058 .P102 = .P102 ! 100000 ; FLAG LAST WORD OF VFU IMAGE TABLE
2059 000 .endc
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 43
LE.M11 30-DEC-82 03:53 TABLES
2061 .sbttl Tables
2062 ;*******
2063 ; USE THE DEFINED PARTITION WORDS TO BUILD A COMPLETE VFU IMAGE, AND
2064 ; ASSIGN PARTITIONS FOR THE WHOLD PAGE.
2065 007454' 000000 VFU66: $$ = 0
2066 000102 .rept PGLEN
2067 $$=$$+1
2068 WRDVFU \$$
2069 .endr ; R PGLEN
2070 000204 VFU66S = .-VFU66 ; SIZE OF VFU IMAGE
2071
2072 ; $LERAM FCT INDEX TO CHANNEL MAP
2073 007660' 000001 CHMAP: .word VFBP1 ; 0
2074 007662' 000002 .word VFBP2 ; 1
2075 007664' 000004 .word VFBP3 ; 2
2076 007666' 000010 .word VFBP4 ; 3
2077 007670' 000020 .word VFBP5 ; 4
2078 007672' 000040 .word VFBP6 ; 5
2079 007674' 000100 .word VFBP7 ; 6
2080 007676' 000200 .word VFBP8 ; 7
2081 007700' 000400 .word VFBP9 ; 8
2082 007702' 001000 .word VFBP10 ; 9
2083 007704' 002000 .word VFBP11 ; 10
2084 007706' 004000 .word VFBP12 ; 11
2085 007710' 000000 .word 0 ; 12 UNUSED ENTRY (NO STOPS SET)
2086 007712' 000000 .word 0 ; 13 UNUSED ENTRY (NO STOPS SET)
2087 007714' 000000 .word 0 ; 14 UNUSED ENTRY (NO STOPS SET)
2088 007716' 000000 .word 0 ; 15 UNUSED ENTRY (NO STOPS SET)
2089
2090
2091 ; LP11 CHARACTER TRANSLATION MAP, INITIALIZED TO NURD ASCII BY OPEN.
2092 ; POTENTIALLY CHANGED BY FEATURES SETS. ROOM FOR A FULL SEVEN-BIT CODE.
2093 007720' 000200 LEASC: .blkb 128.
2094 .even
2095
2096
2097 ; FORMS CONTROL EXCEPTION TABLE
2098 ; FORMAT: .byte <LEASC OFFSET>,<TRANS CONTENTS>
2099 010120' 011 300 FCXTB: .byte HT,FCCHR!HFCHR
2100 010122' 012 207 .byte LF,FCCHR!VCH8
2101 010124' 013 206 .byte VT,FCCHR!VCH7
2102 010126' 014 200 .byte FF,FCCHR!0
2103 010130' 015 340 .byte CR,FCCHR!HFCHR!HFCCR
2104 010132' 020 201 .byte DLE,FCCHR!VCH2
2105 010134' 021 202 .byte DC1,FCCHR!VCH3
2106 010136' 022 203 .byte DC2,FCCHR!VCH4
2107 010140' 023 204 .byte DC3,FCCHR!VCH5
2108 010142' 024 205 .byte DC4,FCCHR!VCH6
2109 ; .byte FS,FCCHR!VCH9 ; Channels 9-12 not supported
2110 ; .byte GS,FCCHR!VCH10
2111 ; .byte RS,FCCHR!VCH11
2112 ; .byte US,FCCHR!VCH12
2113 010144' 177777 .word -1 ; Table ends on negative offset byte
2114
2115 000001 .end
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
BF$SDB 004116R 003 679* 1231# 1384* 1645* 1669* 1725*
CD.CWD= 000202 75#
CE.ABO= 177770 76#
CE.BUF= 177600 76#
CE.DCR= 177570 76#
CE.DEV= 177532 76#
CE.DIS= 177520 76#
CE.ERR= 177760 76#
CE.HFE= 177560 76#
CE.MOP= 177750 76#
CE.MTL= 177550 76#
CE.NTE= 177720 76#
CE.ROV= 177540 76#
CE.RTE= 177730 76#
CE.SRC= 177740 76#
CE.TMO= 177710 76#
CE.UDR= 177510 76#
CHMAP 007660R 003 1341 2073#
CH.64 = 000001 75#
CH.96 = 000002 75#
CLOCK 000550R 003 121 413#
CR = 000015 1288 1303 2103
CS.SUC= 000001 76#
CTLABC 002274R 003 719 779#
CTLABE 002322R 003 717 790#
CTLABT 002330R 003 718 796#
CTLCPB 002400R 003 725 810#
CTLDMP 002406R 003 721 816#
CTLDSP 002024R 003 672* 716# 726 741*
CTLLEN= 000012 668 726# 736
CTLPAU 002436R 003 722 828#
CTLRSM 002512R 003 723 846#
CTLSTS 002566R 003 720 864#
CTLSYN 002050R 003 541 732#
CTLXIT 000532R 003 353 404#
C.BUF 000016 76# 480 481 685 686 692 693 957 958 1386 1387 1529 1530
1618 1619 1647 1671 1712 1727 1919 1920 1921
C.CHN 000002 76#
C.CNT 000022 76# 664 699* 758* 962* 1235* 1388 1439* 1440* 1620 1650* 1713* 1733*
1746* 1754 1922
C.FNC 000012 76# 386* 405* 504* 517* 689* 706* 1237* 1500* 1565*
C.LIN 000010 76#
C.LIX 000010 76#
C.LNK 000000 76#
C.MOD 000013 76# 659 1238* 1651*
C.OWN 000006 76#
C.PIX 000011 76# 287 335* 1239* 1470 1912
C.PRM 000024 76#
C.PRM1 000024 76# 1236* 1599 1629
C.PRM2 000026 76#
C.PRM3 000030 76#
C.PRM4 000032 76#
C.PRM5 000034 76#
C.STK 000004 76# 334* 1473 1478* 1634 1639*
C.STS 000014 76# 333* 404* 501* 503* 516* 639* 705* 1479 1483 1496* 1499* 1528*
1564*
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-1
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
DATSYN 001210R 003 538 567#
DC1 = 000021 2105
DC2 = 000022 2106
DC3 = 000023 1274 1278 1287 2107
DC4 = 000024 1289 2108
DEL = 000177 306
DLE = 000020 1291 2104
DM.ASC= 000001 75#
DM.AS8= 000005 75#
DM.AUG= 000004 75#
DM.CLI= 000002 75#
DM.EBC= 000003 75#
DONE = 000200 1819#
DTXTSZ= 000020 134# 135 1776
DVCLOS 000370R 003 112 375#
DVOPEN 000000R 003 111 284#
EOFASC= 007417 75#
EO.ASC= 000001 75#
EO.IMG= 000002 75#
ERROR = 100000 1818#
FB.CA = 000100 234# 239 243 248 264 270 1081
FB.CL0= 000000 225# 243 248 260 264
FB.CL1= 000001 G 226# 239 256 270 1018 1085
FB.CP = 000040 233# 947
FB.SST= 000020 232# 239 248 256 260 264 270 1012 1098 1153
FB.STE= 000010 231# 239 248 256 260 264 270 1144
FB.STR= 000004 228# 1030 1042 1092 1101 1149 1157
FB.WRD= 000002 227# 270 1030 1092 1149
FCCHR = 000200 2001# 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108
FCCTBL 004314R 003 1260 1286# 1293
FCCTBN= 000007 1261 1293#
FCXTB 010120R 003 317 2099#
FC.AST= 000000 76#
FC.CCP= 000022 76# 102 405
FC.CLM= 000003 75#
FC.CL0= 000000 75#
FC.CL1= 000001 75# 1020 1087
FC.CTL= 000010 76# 97
FC.KCP= 000020 76# 101
FC.KIL= 000006 76# 96
FC.RCE= 000004 76# 95 386 504 517 689 706 1500 1565
FC.RCP= 000016 76# 100
FC.SST= 000002 75# 919 1079
FC.SYS= 000012 76#
FC.TIM= 000012 76# 98
FC.XCP= 000014 76# 99
FC.XME= 000002 76# 94 1237
FD.AST= 000000 76#
FD.CCP= 000014 76#
FD.CTL= 000014 76#
FD.KCP= 000004 76#
FD.KIL= 000004 76#
FD.RCE= 000004 76#
FD.RCP= 000004 76#
FD.SYS= 000012 76#
FD.TIM= 000012 76#
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-2
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
FD.XCP= 000000 76#
FD.XME= 000000 76#
FERBCL 003144R 003 969# 1086
FERCPN 003166R 003 948 975#
FERDNP 003202R 003 979#
FERERR 003160R 003 920 973# 1082 1095 1123
FERNEB 003174R 003 977#
FERNST 003152R 003 971# 1134
FERUSF 003136R 003 937 967#
FE.ALL= 000377 75# 913
FE.DAT= 000001 75#
FE.DVT= 000006 75#
FE.DWD= 000011 75#
FE.EOF= 000005 75#
FE.ESC= 000000 75#
FE.FNM= 000010 75#
FE.FWD= 000004 75#
FE.LCR= 000003 75#
FE.SER= 000002 75#
FE.TRN= 000007 75#
FF = 000014 1290 1452 1960 2102
FM.CCB= 000010 76#
FM.CRA= 000002 76#
FM.DAT= 000000 76#
FM.GET= 000014 76#
FM.KIL= 000000 76#
FM.LTM= 000002 76# 121
FM.NM = 000006 76#
FM.PIN= 000006 76# 123
FM.PWF= 000004 76# 122
FM.RDB= 000012 76#
FM.RTN= 000002 76#
FM.SET= 000012 76#
FM.STM= 000000 76# 120
FM.STP= 000004 76# 112
FM.STR= 000002 76# 111
FM.SYN= 000004 76#
FM.XKL= 000004 76#
FORM$F 004172R 003 612* 1260#
FORM$H 004332R 003 1300# 1367
FORM$V 004446R 003 1336# 1366
FORM$X 004542R 003 621* 1284 1365#
FRMLEN= 000074 1998#
FR.BCL= 000002 75# 969
FR.CPN= 000005 75# 975
FR.DNP= 000007 75# 979
FR.ERR= 000004 75# 973
FR.NEB= 000006 75# 977
FR.NST= 000003 75# 971
FR.USF= 000001 75# 967
FTRCON 003040R 003 953# 990 1040 1135
FTRFND 004034R 003 932* 936* 1191#
FTRSET 003456R 003 951 1079#
FTRSHO 003246R 003 950 1007# 1099 1130
FTRSYN 002604R 003 540 892#
F.FCV = 000001 235# 586 1049 1112 1152* 1161 1310 1312 1317 1419 1421 1425
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-3
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
F.FSB = 000000 224#
F.FSV = 000002 236# 1152 1163 1164
HFCCR = 000040 2003# 2103
HFCHR = 000100 2002# 2099 2103
HT = 000011 2099
INTENB= 000100 1820# 1844 1893
INTPAU 007276R 003 1891 1904 1934#
INXPAU 007306R 003 1879 1936#
KISAR6= ****** G 480#* 685#* 692#* 957#* 1377#* 1402#* 1590#* 1880#* 1919#*
K.ACNT 000114 78#
K.ACTL 000112 78#
K.DES 000002 78#
K.DFMT 000006 78#
K.DGRP 000010 78#
K.DOBJ 000007 78#
K.DPL1 000010 78#
K.DPL2 000014 78#
K.DPR1 000012 78#
K.DPR2 000016 78#
K.DST 000010 78#
K.DUSR 000012 78#
K.ENDD 000156 78#
K.FMT 000000 78#
K.GRP 000002 78#
K.LEN 000002 78#
K.LN2 000006 78#
K.NAM 000004 78#
K.NM2 000010 78#
K.NODE 000000 78#
K.OBJ 000001 78#
K.OPDL 000134 78#
K.OPTD 000136 78#
K.PASL 000100 78#
K.PASW 000102 78#
K.RQDL 000056 78#
K.RQID 000060 78#
K.SFMT 000032 78#
K.SGRP 000034 78#
K.SIZE 000156 78#
K.SOBJ 000033 78#
K.SPL1 000034 78#
K.SPL2 000040 78#
K.SPR1 000036 78#
K.SPR2 000042 78#
K.SRC 000034 78#
K.SUSR 000036 78#
K.USR 000004 78#
LA.ABE= 000020 145# 779 781
LA.ABO= 000010 144# 514 779 781 797 1497
LA.ADN= 000004 143# 709 772 828 846 848 1604 1678 1928
LA.AKR= 000100 147# 572 641 1483
LA.CLO= 000001 G 141# 285 349 378 478
LA.CPC= 000040 146# 1481 1914 1917
LA.CTL= 002000 151#
LA.EOF= 000400 149# 575 641 1479
LA.EOR= 001000 150# 588 609 613
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-4
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
LA.ERR= 000200 148# 424 430 848 1682 1889
LA.INT= 020000 154# 1864 1867 1875
LA.PAU= 000002 142# 828 836 846 848 1686 1839 1878 1934
LA.PLE= 010000 153# 848 1903
LA.TMO= 004000 152# 437 1693
LCFETL= 000011 G 208#
LDFETL= 000012 G 221#
LEASC 007720R 003 307* 310* 314* 316* 320* 604 1283 2093#
LECTL 000024R 002 97 108#
LEDATS= 000131 G 239#
LEDONE 000726R 003 99 456#
LEDSP 000750R 003 100 478#
LEFCCS= 000130 G 264#
LEHNG = 000005 1811# 1843 1892
LEHTS = 000031 G 256#
LELCRS= 000100 G 243#
LEMCB 000000R 002 84 92#
LEPBFS= 000006 330 1810#
LEPLES= 000133 G 270#
LEPRT 007330R 003 1897* 1944#
LESFCS= 000030 G 260#
LESZ = 000004 1823#
LETIM 000036R 002 98 118#
LETRNS= 000130 G 248#
LEXIT 007326R 003 1894 1929 1937 1941#
LE.CHS 000240 G 267#
LE.DAT 000213 G 238#
LE.DWD 000225 G 251#
LE.FCC 000235 G 263# 586
LE.FWD 000220 G 245# 1310 1317 1419
LE.HT 000227 G 255#
LE.LCR 000216 G 242# 1425
LE.PLE 000242 G 269#
LE.SFC 000232 G 259#
LE.TRN 000222 G 247# 1312 1421
LF = 000012 1286 1354 1515 1944 1967 2100
LPB = 000002 1821#
LPS = 000000 1817#
LP.CHS= 000210 75#
LP.CVF= 000205 75#
LP.FCC= 000206 75#
LP.HT = 000202 75#
LP.OPV= 000212 75#
LP.OVP= 000204 75#
LP.PLE= 000211 75#
LP.SFC= 000203 75#
LP.VFR= 000207 75#
L.ASTS 000056 140# 285 289* 349* 378* 424 430* 437* 478 514 572* 575* 588*
609 613* 639 641* 709* 772* 779 781* 797* 828 836* 846 848*
1481* 1497 1604* 1677 1839 1864 1867* 1875* 1878 1914 1917* 1928 1935*
L.CAPN 000126 182# 912* 916* 924 926* 930 953
L.CAPP 000112 171# 304* 446 766 810* 818 1759*
L.CFET 000166 198# 208 324 916 1191 1735
L.CMSQ 000104 168# 385 663* 684 704
L.COCT 000114 175# 1302* 1306 1327* 1336* 1419 1432* 1456* 1519*
L.CSR 000002 133# 288* 426 1844* 1849* 1876 1924
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-5
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
L.DDMQ 000066 157# 798 820 832 849 1559 1836* 1908 1910
L.DFET 000200 210# 221 326 926 1195
L.DFSP 000046 138# 526* 1609 1781 1789*
L.DLCQ 000116 177# 520* 521 533 800 830 853 1563 1598 1613 1628
L.DMAD 000132 186# 292* 293* 1578* 1579* 1590 1592 1593* 1596 1618* 1619* 1626*
L.DMBS 000136 187# 294* 1580* 1588* 1620* 1627*
L.DMCR 000130 185# 594* 599* 625* 628*
L.DMSG 000124 180# 577* 633*
L.DMSQ 000123 179# 295* 568* 733* 751 897* 1674
L.DMSS 000125 181# 592* 598* 629*
L.DTXL 000044 136# 291* 420 523 802 1574* 1774* 1776 1780* 1791 1797*
L.DTXT 000004 135# 1767* 1768 1793
L.HUNG 000077 161# 301* 433 435* 1843* 1850* 1868* 1892*
L.IOCN 000100 164# 299* 394 456* 458* 700* 759* 963* 1652* 1714* 1757*
L.IOWT 000102 165# 300* 391* 400 401* 413
L.LNCT 000113 174# 1342 1357* 1455* 1507 1518*
L.MFLG 000122 178# 530*
L.MSGA 000160 194# 296* 297* 1377 1378* 1379* 1386* 1387*
L.MSGQ 000154 193# 757 801 956 961 1389* 1569
L.MSGS 000164 195# 298* 758 761* 962 964* 1375* 1382* 1388* 1581*
L.NFSP 000127 183# 901* 959 989* 1039*
L.NRD 000001 132# 287* 1239
L.PBRC 000152 191# 605* 608 1106* 1109
L.PGCT 000072 158# 305* 1708 1916* 1952* 1955
L.PGLM 000074 G 159# 1953 1955
L.PLBP 000144 189# 341* 342* 799 1402 1403* 1404* 1408 1441* 1529* 1530* 1542 1576*
1630
L.PLBQ 000140 188# 336* 339 381 637 1438 1492* 1526 1633
L.PLBS 000150 190# 343* 1400* 1407* 1440 1442* 1531* 1544 1577*
L.PLNC 000076 160# 1947* 1948 1951* 1962
L.PUBP 000060 155# 1880 1881 1888* 1901* 1920*
L.PUBS 000064 156# 290* 1575* 1882 1887* 1900* 1927*
L.RATT 000111 170# 303* 438 440* 443 762 816 864 866* 1485 1487 1489* 1666
1716* 1902* 1936 1938*
L.RECO 000110 169# 302* 415 417* 681*
L.SYN 000050 139# 1870
L.TIMC 000000 131#
MCB$V0= ****** G 83#
MCB$V1= ****** G 83#
MSGCTL 001516R 003 496 659#
MSGDAT 001062R 003 493 495 514#
MSGFIN 001606R 003 418* 679#
MSGQUE 001112R 003 515 520# 661
MSGX 001100R 003 517# 539
MS$BYT 004550R 003 748* 750* 752* 754* 756* 893* 895* 898* 902* 981* 984* 986* 988*
1008* 1015* 1022* 1025* 1034* 1037* 1046* 1052* 1060* 1063* 1375# 1391
NA.DTO= 000004 75# 1695
NA.FAT= 000001 75# 1680
NA.INK= 000040 75#
NA.IVP= 000001 75#
NA.JAM= 000020 75#
NA.NAC= 000002 75#
NA.NOE= 000100 75#
NA.OFL= 000002 75# 1684
NA.OMD= 000010 75#
NA.OOF= 000040 75#
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-6
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
NA.OUF= 000001 75#
NA.OVP= 000001 75#
NA.PAU= 000004 75# 1688
NA.PF = 000020 75#
NA.PSE= 000020 75#
NA.RAP= 000040 75#
NA.REG= 000100 75#
NA.RNA= 000010 75#
NC.AUC= 000002 75#
NC.AUE= 000001 75#
NC.CAB= 000003 75#
NC.DMP= 000005 75#
NC.PAU= 000006 75#
NC.RES= 000007 75#
NC.RQC= 000011 75#
NC.RQS= 000004 75#
ND.ACK= 000001 75# 570
ND.CMP= 000200 75#
ND.EOF= 000004 75# 573
ND.IER= 000002 75#
NF.CMD= 000001 75# 917 949 1011
NF.STD= 000002 75# 1014
NM.ALR= 000004 75# 1648
NM.ATT= 000001 75# 1672
NM.CAP= 000005 75# 1729
NM.CTL= 000003 75# 694 747
NM.DAT= 000000 75#
NM.FTR= 000002 75# 892
NM.OTR= 000006 75#
NM.TYP= 000017 75# 483
NOOP 000366R 003 122 366#
NRDOTR= 000004 484 486 497#
NR.ABS= 000000 75#
NR.ACC= 000000 75#
NR.ACN= 000001 75# 784
NR.ATT= 000000 75#
NR.CAP= 000000 75#
NR.DMP= 000000 75#
NR.DPS= 000000 75#
NR.NAB= 000001 75# 804
NR.NDP= 000002 75# 834
NR.NDR= 000002 75# 855
NR.NOB= 000001 75# 822
NR.NOE= 000002 75# 790
NR.NPS= 000001 75# 858
NR.PAU= 000001 75# 839
NR.RES= 000000 75#
N.AABC= 000004 75#
N.AACK= 000002 75# 1487 1489
N.ACOD= 000003 75#
N.AFLG= 000004 75#
N.ALGD= 000002 75#
N.APLE= 000005 75# 1902
N.ARQS= 000003 75# 866
N.ASTC= 000001 75# 440 1938
N.CCMD= 000003 75# 664 666 687
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-7
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
N.CRES= 000004 75# 699
N.CSEQ= 000002 75# 688
N.DDAT= 000005 75#
N.DFLG= 000003 75#
N.DSEQ= 000002 75#
N.DSGC= 000004 75#
N.FCLS= 000002 75#
N.FDAT= 000004 75#
N.FFLG= 000001 75#
N.FID = 000000 75#
N.FRSP= 000003 75#
N.FSEQ= 000002 75#
N.FSPC= 000004 75#
N.MFL = 000001 75#
N.NSPC= 000003 75# 959*
N.PCAP= 000003 75#
N.PCNT= 000002 75#
N.TYP = 000000 75#
PGLEN = 000102 1948 1962 1997# 2066
PHD$A 000000R 83# 84 85
PR$BYT 004662R 003 1304 1324* 1356* 1400# 1413 1431* 1453* 1516*
PR$CHR 004734R 003 624* 1271 1419#
PR$DQX 005010R 003 1410* 1438# 1548* 1640
PR$FF 005056R 003 1339 1349 1451# 1511 1513
PR$FIN 005104R 003 1470# 1560* 1909*
PR$LF 005264R 003 1280 1314* 1423* 1506#
PR$NEW 005340R 003 1412* 1526# 1535 1549
PR$SPC 005404R 003 1273* 1277* 1542#
Q$PURG 005432R 003 379* 805 1557#
RD$BYT 005636R 003 527* 529* 567* 569* 576* 581* 602* 732* 734* 896* 899* 903* 905*
907* 910* 1091* 1096* 1105* 1107* 1126* 1588# 1621
RD$DQX 006002R 003 640* 746* 773* 960* 1606* 1626#
SETSTD 003704R 003 364* 1132* 1144#
SN$ALR 006074R 003 428* 1645#
SN$ATT 006142R 003 445* 764* 1490* 1665# 1939*
SN$CAP 006400R 003 448* 769 1725#
SPA = 000040 1270 1320
STOPWT 000502R 003 394# 414
S$ABO = 000022 78#
S$ACC = 000002 78#
S$CNR = 000000 78#
S$CON = 000000 78#
S$DAT = 000002 78#
S$DIS = 000020 78#
S$DRQ = 000012 78#
S$DSR = 000006 78#
S$GLN = 000024 78#
S$INT = 000004 78# 659
S$IRQ = 000016 78#
S$MRQ = 000010 78#
S$PBOM= 000001 78#
S$PEOM= 000004 78# 1236 1599 1607
S$PMOM= 000002 78#
S$PMSG= 000002 78#
S$PSEG= 000001 78#
S$REJ = 000004 78#
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-8
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
S$SND = 000006 78# 1238
S$SNI = 000014 78# 1651
S.DSP 000004 77# 1871*
S.EABL= 177755 78#
S.EABM= 177770 78#
S.EABO= 177767 78# 503 516 1499 1564
S.EABS= 177771 78#
S.EACR= 177736 78#
S.ECBE= 177764 78#
S.EDBO= 177754 78#
S.EERR= 177763 78#
S.EIDM= 177762 78# 501
S.EINF= 177766 78#
S.EIOF= 177773 78#
S.ELNS= 177765 78#
S.ELST= 177761 78#
S.ELWS= 177760 78#
S.EMTL= 177757 78#
S.ENOF= 177732 78#
S.ENRO= 177732 78#
S.ENSL= 177756 78#
S.ENUR= 177731 78#
S.EOTB= 177772 78#
S.ERBO= 177754 78# 350 705
S.ERES= 177777 78#
S.ERNS= 177775 78#
S.ETMI= 177753 78#
S.EUNN= 177776 78#
S.EURO= 177774 78#
S.LNK 000000 77#
S.PDB 000002 77#
S.SEOM= 000002 78#
S.SSUC= 000001 78# 344 402 1496
TIMPIN= ****** GX 123
US = 000037 312
VCH1 = 000000 2027
VCH2 = 000001 2104
VCH3 = 000002 2105
VCH4 = 000003 2106
VCH5 = 000004 2107
VCH6 = 000005 2108
VCH7 = 000006 2101
VCH8 = 000007 2100
VFBP1 = 000001 2073
VFBP10= 001000 2082
VFBP11= 002000 2083
VFBP12= 004000 2084
VFBP2 = 000002 2074
VFBP3 = 000004 2075
VFBP4 = 000010 2076
VFBP5 = 000020 2077
VFBP6 = 000040 2078
VFBP7 = 000100 2079
VFBP8 = 000200 1512 2080
VFBP9 = 000400 2081
VFU66 007454R 003 1344 1509 2065# 2070
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-9
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
VFU66S= 000204 2070#
VF.6LI= 000001 75#
VF.8LI= 000002 75#
VT = 000013 1292 2101
ZZ$SLP 006532R 003 1394* 1534* 1615* 1767#
ZZ$WAK 006610R 003 422* 1789#
$CBBGT= ****** GX 1233*
$CBBRT= ****** GX 460 1571*
$CMQRM= ****** GX 381 385 684 704 757 961 1438 1559 1563 1569 1628 1908
$DSPCR= ****** G 93# 94# 95# 96# 101# 102# 110# 120#
$LEGO 006704R 003 837 851* 1843#
$LEINT 006734RG 003 1864#
$LEQUE 006656R 003 1443 1637 1835#
$LESTP 006722R 003 376* 708* 771* 796* 835* 1603* 1835* 1849#
$LESTR 006674R 003 711 1839#
$LTMEN= ****** GX 346*
$RDBGT= ****** GX 331*
$RDBRT= ****** GX 382*
$SCHED= ****** GX 387* 406 505 518 690* 701 707* 760* 965 1501 1566* 1653* 1715*
1758*
$SYNCH= ****** GX 1872
$$ = 000102 2065# 2069#
$$DAT = 000000 130# 274
$$LVL = 000000 130# 274
$$TABG= 001200R 003 92# 94 95 96 97 98 99 100 101 102 109# 111 112
119# 120 121 122 123 492# 537#
. = 010146R 003 76# 77# 78# 84# 85# 92 94 95 96 97 98 99 100
101 102 109 111 112 119 120 121 122 123 130# 131# 132#
133# 135# 136# 137# 138# 139# 140# 155# 156# 157# 158# 159# 160#
161# 164# 165# 168# 169# 170# 171# 174# 175# 176# 177# 178# 179#
180# 181# 182# 183# 185# 186# 187# 188# 189# 190# 191# 192# 193#
194# 195# 198# 199# 200# 201# 202# 203# 204# 205# 206# 207# 208
210# 211# 212# 213# 214# 215# 216# 217# 218# 219# 220# 221 238#
240# 241# 242# 244# 245# 246# 247# 249# 250# 251# 252# 255# 257#
258# 259# 261# 262# 263# 265# 266# 267# 268# 269# 271# 272# 274#
492 497 537 726 1293 2070 2093#
.DSPCR= ****** G 84#
.P1 = 003777 2037 2069
.P10 = 000220 2069
.P100 = 000020 2069
.P101 = 000020 2069
.P102 = 100020 2069
.P11 = 000224 2069
.P12 = 000230 2069
.P13 = 000664 2069
.P14 = 000220 2069
.P15 = 000234 2069
.P16 = 000220 2069
.P17 = 000224 2069
.P2 = 000220 2069
.P20 = 001630 2069
.P21 = 000224 2069
.P22 = 000220 2069
.P23 = 000234 2069
.P24 = 000220 2069
.P25 = 000764 2069
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 44-10
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- USER SYMBOLS
.P26 = 000230 2069
.P27 = 000224 2069
.P3 = 000224 2069
.P30 = 000220 2069
.P31 = 000234 2069
.P32 = 000620 2069
.P33 = 000224 2069
.P34 = 000230 2069
.P35 = 000224 2069
.P36 = 000220 2069
.P37 = 001676 2069
.P4 = 000230 2069
.P40 = 000220 2069
.P41 = 000224 2069
.P42 = 000230 2069
.P43 = 000224 2069
.P44 = 000620 2069
.P45 = 000234 2069
.P46 = 000220 2069
.P47 = 000224 2069
.P5 = 000224 2069
.P50 = 000230 2069
.P51 = 000764 2069
.P52 = 000220 2069
.P53 = 000234 2069
.P54 = 000220 2069
.P55 = 000224 2069
.P56 = 001630 2069
.P57 = 000224 2069
.P6 = 000620 2069
.P60 = 000220 2069
.P61 = 000234 2069
.P62 = 000220 2069
.P63 = 000664 2069
.P64 = 000230 2069
.P65 = 000224 2069
.P66 = 000220 2069
.P67 = 000234 2069
.P7 = 000234 2069
.P70 = 000620 2069
.P71 = 000224 2069
.P72 = 000230 2069
.P73 = 000224 2069
.P74 = 000220 2069
.P75 = 004020 2069
.P76 = 000020 2069
.P77 = 000020 2069
.RDBSZ= ****** GX 1439 1531
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 45
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- MACRO NAMES
CALLR 108 118 406 460 488 505 518 661 701 711 769 805 837 951 965
1123 1130 1134 1135 1271 1280 1284 1304 1339 1349 1443 1501 1549 1637 1640
1872
CCBDF$ 73# 76
CHR$B 130#
CHR$W 130#
COR$D 130#
CSR$W 130# 133
CTL$B 130#
CTL$W 130#
DAT$ 74# 130
DAT$DF 130#
DEFPAR 2019#
DEQ$ 381 385 684 704 757 961 1438 1559 1563 1569 1628 1908
DSP$ 74# 92# 93 94 95 96 97 98 99 100 101 102 109# 110 111
112 119# 120 121 122 123 492# 493 494 495 496 498 537# 538 539
540 541
DSP$B 74# 92 109 119 492 537
DSP$E 74# 92# 103 109# 113 119# 124 492# 499 537# 542
DSR$W 130#
END$ 74# 130# 274
ENQ$ 336 520 663 1389 1492 1836
LIX$B 130#
LIX$W 130#
LST$D 130# 157 168 177 188 193
MAP$ 74# 480 685 692 957 1377 1402 1590 1880 1919
NURDF$ 73# 75
PHD$B 74# 83
PHD$D 83# 84
PHD$E 83# 85
PHD$I 83#
PHD$S 83#
POP$S 74# 352 390 691 742 755 987 1122 1129 1165 1180 1209 1213 1240 1390
1393 1454 1477 1517 1582 1636 1639 1717 1753
PUSH$S 74# 284 375 683 738 745 967 969 971 973 975 977 979 1118 1124
1159 1170 1192 1231 1383 1451 1472 1514 1557 1632 1665 1731 1734
RETURN 366 397 450 535 642 682 768 774 782 785 791 811 823 840 859
867 1147 1168 1182 1211 1215 1241 1328 1359 1380 1405 1433 1457 1493 1520
1532 1546 1583 1594 1610 1654 1718 1760 1783 1804 1845 1851 1866 1941 1958
1972
SCDF$ 73# 78
SETCHN 2011#
SMAP$ 74#
STA$B 130#
STA$W 130#
SYNDF$ 73# 77
SYN$X 130# 139
TMB$X 130#
TRB$B 130#
TRB$W 130#
UNT$B 130#
UNT$W 130#
VFY$ 130#
WRDVFU 2015# 2069
.ZER 2007#
LE LP11 LLC AND DRIVER DNMAC X24.07-563 04-JAN-83 16:26 PAGE 45-1
LE.M11 30-DEC-82 03:53 CROSS REFERENCE TABLE -- MACRO NAMES
. ABS. 000246 000 OVR RW REL LCL D
000040 001 CON RW REL LCL I
$PLIT$ 000052 002 CON RO REL LCL D
$CODE$ 010146 003 CON RO REL LCL I
ERRORS DETECTED: 0
DEFAULT GLOBALS GENERATED: 10
LE,LE/CRF=MCB:MCBLIB.M11/PA:1,MCB:SCLIB.M11/PA:1,DSK:URDLIB.M11/PA:1,LE
RUN-TIME: 6 6 1 SECONDS
RUN-TIME RATIO: 92/15=6.0
CORE USED: 14K (27 PAGES)