ae62e0d853fade8cd7582abfdf8c80fced546d55
[h316.git] / lib / iolib / src / o$la.asm
1 * (O$LA)
2 *
3 *
4 * PROGRAM TITLE: O$LA (O$LA,O$LE,O$LH,O$LC,O$LF)
5 * LINE PRINTER ROUTINES
6 *
7 * REVISIONS:
8 * 1.0 (2005-02-04)
9 * 1.1 (2006-04-03) - GET IT SMALLER
10 *
11 * AUTHOR
12 *
13 * PHILIPP HACHTMANN
14 *
15 *
16 * PURPOSE
17 *
18 * THESE ARE THE LIBRARY ROUTINES FOR HACHTI'S LINE PRINTER INTERFACE
19 *
20 *
21 * RESTRICTIONS
22 *
23 * DEPENDS ON HACHTI'S HARDWARE AND FORTRAN IV COMPILER TAPE
24 *
25 *
26 * STORAGE
27 *
28 * 420 (OCTAL)
29 * 271 (DECIMAL)
30 *
31 *
32 * USE
33 *
34 * CALL O$LA
35 * DAC (BUFFER ADDRESS)
36 * NORMAL
37 *
38 * THIS PRINTS ONE LINE OF LISING TEXT
39 * (60 2-CHAR WORDS MAX) TO THE LINE PRINTER.
40 *
41 *
42 * CALL O$LH
43 * DAC (HEADING ADDRESS)
44 * NORMAL RETURN
45 *
46 * SETUP THE LISTING HEADER
47 * RESETS THE PAGE COUNTER AND SPACES TO THE BEGINNING OF
48 * THE NEXT PAGE.
49 *
50 *
51 * CALL O$LP
52 * DAC (BUFFER ADDRESS)
53 * NORMAL RETURN
54 *
55 * PRINT TEXT FROM BUFFER. NO CR OR LF IS OUTPUT.
56 *
57 * CALL O$LC
58 * NORMAL RETURN
59 *
60 * PRODUCE A CARRIAGE RETURN ON THE LINE PRINTER.
61 *
62 *
63 * CALL O$LF
64 * NORMAL RETURN
65 *
66 * SEND A LINE FEED COMMAND TO THE PRINTER.
67 *
68 *
69 * CALL O$LE
70 * NORMAL RETURN
71 *
72 * EJECT CURRENT PAGE
73 * SPACES TO THE BEGINNING OF THE NEXT PAGE BY SENDING
74 * A FF CHARACTER TO THE PRINTER.
75 *
76 ********************************************************************************
77 *
78 SUBR O$LA TYPE A COMPLETE LINE WITH CR/LF, HEADING ETC.
79 SUBR O$LH INITIALISE HEADING
80 SUBR O$LP,T1 TYPE A LINE, NO CR
81 SUBR O$LC,T20 RETURN THE CARRIAGE
82 SUBR O$LF,T30 ADVANCE TO NEXT LINE
83 SUBR O$LE,FF EJECT PAGE
84 *
85 SUBR O$LSK1,SKP1 EMPTY LINES BETWEEN TOP OF PAGE AND HEADING
86 SUBR O$LSK2,SKP2 EMPTY LINES BETWEEN HEADING AND MAIN TEXT
87 SUBR O$LLPP,LPP PURE TEXT LINES PER PAGE
88 SUBR O$LRS,RS DISTANCE FROM PAGE NUMBERING TO RIGHT MARGIN
89 *
90 ********************************************************************************
91 *
92 REL RELOCATEABLE MODE
93 *
94 * CONFIGURATION
95 LPP DEC 60 DATA LINES PER PAGE (WITHOUT HEADING ETC.)
96 LNW DEC 60 LINE LENGTH IN 2-CHAR WORDS
97 *
98 *
99 O$LA DAC **
100 LDA* O$LA BUFFER ADDRESS
101 STA LBUF STORE
102 LDA LINE LEFT LINE COUNTER
103 SZE LINES LEFT ON PAGE?
104 JMP PGOK YES, JUMP AWAY
105 JST FF CALL FORM FEED ROUTINE
106 PGOK LDA LPP LINES PER PAGE
107 TCA
108 CAS LINES ARE WE ON THE FIRST LINE?
109 JMP *+2 NO, WE ARE NOT.
110 JST NP MAKE HEADER, SPACING ETC.
111 NOP
112 IRS LINE BUMP COUNTER
113 NOP WE DON'T CONTROL THAT HERE ANYMORE
114 JST T1 PRINT THE LINE
115 LBUF DAC ** ADDRESS OF LINE BUFFER
116 JST T20 CARRIAGE RETURN
117 JST T30 LINE FEED
118 IRS O$LA MAKE RETURN ADDRESS
119 JMP* O$LA RETURN
120 *
121 *
122 O$LH DAC ** INIT HEADING
123 LDA* O$LH
124 STA P1 POINTER TO SOURCE
125 LDA HBUP
126 STA P2 POINTER TO TARGET
127 LDA LNW LINE LENGTH
128 TCA
129 STA CNT
130 HL1 LDA* P1
131 STA* P2
132 IRS P1
133 IRS P2
134 IRS CNT READY?
135 JMP HL1 NO
136 LDA LPP LINES PER PAGE
137 TCA RENEW
138 STA LINE THE LINE COUNTER
139 IRS O$LH ADJUST ADDRESS
140 CRA
141 STA LN1 CLEAR PAGE NUMBERING
142 STA LN2 CLEAR PAGE NUMBERING
143 STA LN3 CLEAR PAGE NUMBERING
144 JMP* O$LH RETURN
145 *
146 *
147 *
148 SKP1 DEC 1 EMPTY LINES BEFORE HEADING
149 SKP2 DEC 3 EMPTY LINES BETWEEN HEADING AND TEXT
150 NP DAC ** PREPARE NEW PAGE
151 LDA SKP1 SPACES BEFORE HEADING
152 SNZ SPACING REQUIRED?
153 JMP NHDS NO SPACE BEFORE HEADING
154 TCA
155 STA CNT
156 S1 JST T30 LINE FEED
157 IRS CNT
158 JMP S1
159 NHDS JST LNNR PREPARE LINE NUMBERING
160 JST T1 TYPE HBUF
161 HBUP DAC HBUF ADDRESS OF HEADER BUFFER
162 JST T20 CARRIAGE RETURN
163 JST T30 LINE FEED
164 LDA SKP2 NUMBER OF SPACES BEFORE TEXT
165 SNZ SPACING REQUIRED?
166 JMP NSPC NO, IT'S NOT.
167 TCA NEGATE
168 STA CNT TO COUNTER
169 SP1 JST T30 LINE FEED
170 IRS CNT DEC COUNTER, SKIP IF READY
171 JMP SP1 NOT READY
172 NSPC JMP* NP RETURN
173 *
174 * FORM FEED
175 FF DAC **
176 LDA LPP REFILL
177 TCA THE
178 STA LINE LINE COUNTER
179 *
180 LDA =12 FORM FEED
181 OTA 0 SEND FORMFEED
182 JMP *-1 WAIT
183 JMP* FF RETURN
184 *
185 *
186 * VARIABLES
187 XR DEC 0 THE CALLER'S X REGISTER
188 CNT DEC 0
189 HBP DAC HBUF
190 P1 DEC 0 POINTER 1
191 P2 DEC 0 POINTER 2
192 LINE DEC -40 NEG LINES LEFT ON PAGE
193 PGS BCI 5, PAGE XXX
194 PGSP DAC PGS POINTER TO PGS
195 *
196 *
197 ************************************************************
198 *
199 * OUTPUT LINE
200 T1 DAC **
201 STX XR SAVE CALLER'S INDEX REGISTER
202 LDA* T1
203 ADD LNW LINE WIDTH
204 ADD ='40000 SET TAG
205 STA T6
206 IRS T1
207 LDA LNW LINE WIDTH
208 TCA NEGATE
209 STA 0
210 T3 LDA* T6
211 CAS ='120240
212 JMP *+2
213 *
214 JMP T8
215 T4 JST T14
216 IRS 0
217 JMP T3
218 LDX XR RESTORE CALLER'S INDEX REGISTER
219 JMP* T1
220 T6 *** **
221 *
222 *
223 T8 LDA 0
224 STA T12
225 T10 IRS 0
226 JMP *+2
227 JMP* T1
228 LDA* T6
229 CAS ='120240
230 JMP *+2
231 JMP T10
232 LDA T12
233 STA 0
234 LDA ='120240
235 JMP T4
236 T12 *** **
237 *
238 *
239 T14 DAC **
240 ICA
241 OTA 0
242 JMP *-1
243 ICA
244 OTA 0
245 JMP *-1
246 JMP* T14
247 ****
248 *
249 * CARRIAGE RETURN
250 T20 DAC **
251 LDA =13 CR CHARACTER
252 OTA 0 OUTPUT
253 JMP *-1
254 JMP* T20 RETURN
255 *
256 * LINE FEED
257 T30 DAC **
258 LDA =10 LF CHARACTER
259 OTA 0 OUTPUT
260 JMP *-1 RETURN
261 JMP* T30
262 *
263 * PRINT LINE NUMBER TO BUFFER
264 LNNR DAC ** INCREMENT LINE NUMBER, PUT TO BUFFER
265 JST LNR INCREMENT DIGIT
266 LN1 DEC 0 LEAST SIGNIFICAND DIGIT
267 JMP RDY NO CARRY, COUNTING READY
268 JST LNR INCREMENT DIGIT
269 LN2 DEC 0 SECOND DIGIT
270 JMP RDY NO CARRY, COUNTING READY
271 JST LNR INCREMENT DIGIT
272 LN3 DEC 0 THIRT DIGIT
273 NOP NO CARRY, FINE
274 RDY NOP OVERFLOW, BUT WHAT SHOULD WE DO?
275 *
276 *
277 LDA LN3 LEFTMOST VALUE (100)
278 JST MDG CONVERT
279 LRR 8 SHIFT DOWN
280 LDA =32 SPACE
281 LLR 8 SHIFT BACK
282 STA PGS+3 STORE
283 *
284 LDA LN1 RIGHTMOST DIGIT (1)
285 ADD =48 ZERO CHARACTER
286 LRR 8 SHIFT AWAY
287 LDA LN2 MIDDLE VALUE (10)
288 JST MDG CONVERT
289 LLR 8 SHIFT UP AGAIN
290 STA PGS+4 STORE INTO POSITION
291 *
292 *
293 LDA HBP HEADER BUFFER ADDRESS
294 ADD LNW PAGE WIDTH
295 SUB RS RIGHT SPACING
296 ADD ='40000 SET INDEX BIT
297 STA P1 TO POINTER
298 LDA PGSP PAGE NUMBER BUFFER ADDRESS
299 ADD =5 ADD PAGE NUMBERING LENGTH
300 ADD ='40000 SET INDEX BIT
301 STA P2 TO POINTER
302 LDA =-5
303 STA 0
304 PP1 LDA* P2
305 STA* P1
306 IRS 0
307 JMP PP1
308 JMP* LNNR RETURN
309 RS DEC 1 RIGHT DISTANCE FOR PAGE NUMBERING (2-CHAR WORDS)
310 *
311 *
312 MDG DAC ** MAKE DIGIT FROM A
313 SZE
314 JMP NZ NO ZERO
315 LDA =32 IS ZERO->SPACE
316 JMP* MDG RETURN
317 NZ ADD =48 THE ZERO CHARACTER
318 JMP* MDG
319 *
320 *
321 LNR DAC ** DIGIT SERVICE
322 IRS* LNR INCREMENT DIGIT
323 LDA* LNR LOAD NEW VALUE OF DIGIT
324 SUB =10 TEST IF OVERFLOW
325 SZE OVERFLOW?
326 JMP NOFL NO, TAKE FIRST RETURN
327 STA* LNR YES, CLEAR DIGIT (A WAS ZERO)
328 IRS LNR TALLY RETURN ADDRESS
329 NOFL IRS LNR TALLY RETURN ADDRESS
330 JMP* LNR
331 *
332 HBUF BCI 20,
333 BCI 20,
334 BCI 20,
335 *
336 FIN WRITE OUT LITERALS
337 *
338 * PUH.....
339 *
340 END