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