*** empty log message ***
[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 ORG 0
94 *
95 * CONFIGURATION
96 LPP DEC 60 DATA LINES PER PAGE (WITHOUT HEADING ETC.)
97 LNW DEC 60 LINE LENGTH IN 2-CHAR WORDS
98 *
99 *
100 O$LA DAC **
101 LDA* O$LA BUFFER ADDRESS
102 STA LBUF STORE
103 LDA LINE LEFT LINE COUNTER
104 SZE LINES LEFT ON PAGE?
105 JMP PGOK YES, JUMP AWAY
106 JST FF CALL FORM FEED ROUTINE
107 PGOK LDA LPP LINES PER PAGE
108 TCA
109 CAS LINES ARE WE ON THE FIRST LINE?
110 JMP *+2 NO, WE ARE NOT.
111 JST NP MAKE HEADER, SPACING ETC.
112 NOP
113 IRS LINE BUMP COUNTER
114 NOP WE DON'T CONTROL THAT HERE ANYMORE
115 JST T1 PRINT THE LINE
116 LBUF DAC ** ADDRESS OF LINE BUFFER
117 JST T20 CARRIAGE RETURN
118 JST T30 LINE FEED
119 IRS O$LA MAKE RETURN ADDRESS
120 JMP* O$LA RETURN
121 *
122 *
123 O$LH DAC ** INIT HEADING
124 LDA* O$LH
125 STA P1 POINTER TO SOURCE
126 LDA HBUP
127 STA P2 POINTER TO TARGET
128 LDA LNW LINE LENGTH
129 TCA
130 STA CNT
131 HL1 LDA* P1
132 STA* P2
133 IRS P1
134 IRS P2
135 IRS CNT READY?
136 JMP HL1 NO
137 LDA LPP LINES PER PAGE
138 TCA RENEW
139 STA LINE THE LINE COUNTER
140 IRS O$LH ADJUST ADDRESS
141 CRA
142 STA LN1 CLEAR PAGE NUMBERING
143 STA LN2 CLEAR PAGE NUMBERING
144 STA LN3 CLEAR PAGE NUMBERING
145 JMP* O$LH RETURN
146 *
147 *
148 *
149 SKP1 DEC 1 EMPTY LINES BEFORE HEADING
150 SKP2 DEC 3 EMPTY LINES BETWEEN HEADING AND TEXT
151 NP DAC ** PREPARE NEW PAGE
152 LDA SKP1 SPACES BEFORE HEADING
153 SNZ SPACING REQUIRED?
154 JMP NHDS NO SPACE BEFORE HEADING
155 TCA
156 STA CNT
157 S1 JST T30 LINE FEED
158 IRS CNT
159 JMP S1
160 NHDS JST LNNR PREPARE LINE NUMBERING
161 JST T1 TYPE HBUF
162 HBUP DAC HBUF ADDRESS OF HEADER BUFFER
163 JST T20 CARRIAGE RETURN
164 JST T30 LINE FEED
165 LDA SKP2 NUMBER OF SPACES BEFORE TEXT
166 SNZ SPACING REQUIRED?
167 JMP NSPC NO, IT'S NOT.
168 TCA NEGATE
169 STA CNT TO COUNTER
170 SP1 JST T30 LINE FEED
171 IRS CNT DEC COUNTER, SKIP IF READY
172 JMP SP1 NOT READY
173 NSPC JMP* NP RETURN
174 *
175 * FORM FEED
176 FF DAC **
177 LDA LPP REFILL
178 TCA THE
179 STA LINE LINE COUNTER
180 *
181 LDA =12 FORM FEED
182 OTA 0 SEND FORMFEED
183 JMP *-1 WAIT
184 JMP* FF RETURN
185 *
186 *
187 * VARIABLES
188 XR DEC 0 THE CALLER'S X REGISTER
189 CNT DEC 0
190 HBP DAC HBUF
191 P1 DEC 0 POINTER 1
192 P2 DEC 0 POINTER 2
193 LINE DEC -40 NEG LINES LEFT ON PAGE
194 PGS BCI 5, PAGE XXX
195 PGSP DAC PGS POINTER TO PGS
196 *
197 *
198 ************************************************************
199 *
200 * OUTPUT LINE
201 T1 DAC **
202 STX XR SAVE CALLER'S INDEX REGISTER
203 LDA* T1
204 ADD LNW LINE WIDTH
205 ADD ='40000 SET TAG
206 STA T6
207 IRS T1
208 LDA LNW LINE WIDTH
209 TCA NEGATE
210 STA 0
211 T3 LDA* T6
212 CAS ='120240
213 JMP *+2
214 *
215 JMP T8
216 T4 JST T14
217 IRS 0
218 JMP T3
219 LDX XR RESTORE CALLER'S INDEX REGISTER
220 JMP* T1
221 T6 *** **
222 *
223 *
224 T8 LDA 0
225 STA T12
226 T10 IRS 0
227 JMP *+2
228 JMP* T1
229 LDA* T6
230 CAS ='120240
231 JMP *+2
232 JMP T10
233 LDA T12
234 STA 0
235 LDA ='120240
236 JMP T4
237 T12 *** **
238 *
239 *
240 T14 DAC **
241 ICA
242 OTA 0
243 JMP *-1
244 ICA
245 OTA 0
246 JMP *-1
247 JMP* T14
248 ****
249 *
250 * CARRIAGE RETURN
251 T20 DAC **
252 LDA =13 CR CHARACTER
253 OTA 0 OUTPUT
254 JMP *-1
255 JMP* T20 RETURN
256 *
257 * LINE FEED
258 T30 DAC **
259 LDA =10 LF CHARACTER
260 OTA 0 OUTPUT
261 JMP *-1 RETURN
262 JMP* T30
263 *
264 * PRINT LINE NUMBER TO BUFFER
265 LNNR DAC ** INCREMENT LINE NUMBER, PUT TO BUFFER
266 JST LNR INCREMENT DIGIT
267 LN1 DEC 0 LEAST SIGNIFICAND DIGIT
268 JMP RDY NO CARRY, COUNTING READY
269 JST LNR INCREMENT DIGIT
270 LN2 DEC 0 SECOND DIGIT
271 JMP RDY NO CARRY, COUNTING READY
272 JST LNR INCREMENT DIGIT
273 LN3 DEC 0 THIRT DIGIT
274 NOP NO CARRY, FINE
275 RDY NOP OVERFLOW, BUT WHAT SHOULD WE DO?
276 *
277 *
278 LDA LN3 LEFTMOST VALUE (100)
279 JST MDG CONVERT
280 LRR 8 SHIFT DOWN
281 LDA =32 SPACE
282 LLR 8 SHIFT BACK
283 STA PGS+3 STORE
284 *
285 LDA LN1 RIGHTMOST DIGIT (1)
286 ADD =48 ZERO CHARACTER
287 LRR 8 SHIFT AWAY
288 LDA LN2 MIDDLE VALUE (10)
289 JST MDG CONVERT
290 LLR 8 SHIFT UP AGAIN
291 STA PGS+4 STORE INTO POSITION
292 *
293 *
294 LDA HBP HEADER BUFFER ADDRESS
295 ADD LNW PAGE WIDTH
296 SUB RS RIGHT SPACING
297 ADD ='40000 SET INDEX BIT
298 STA P1 TO POINTER
299 LDA PGSP PAGE NUMBER BUFFER ADDRESS
300 ADD =5 ADD PAGE NUMBERING LENGTH
301 ADD ='40000 SET INDEX BIT
302 STA P2 TO POINTER
303 LDA =-5
304 STA 0
305 PP1 LDA* P2
306 STA* P1
307 IRS 0
308 JMP PP1
309 JMP* LNNR RETURN
310 RS DEC 1 RIGHT DISTANCE FOR PAGE NUMBERING (2-CHAR WORDS)
311 *
312 *
313 MDG DAC ** MAKE DIGIT FROM A
314 SZE
315 JMP NZ NO ZERO
316 LDA =32 IS ZERO->SPACE
317 JMP* MDG RETURN
318 NZ ADD =48 THE ZERO CHARACTER
319 JMP* MDG
320 *
321 *
322 LNR DAC ** DIGIT SERVICE
323 IRS* LNR INCREMENT DIGIT
324 LDA* LNR LOAD NEW VALUE OF DIGIT
325 SUB =10 TEST IF OVERFLOW
326 SZE OVERFLOW?
327 JMP NOFL NO, TAKE FIRST RETURN
328 STA* LNR YES, CLEAR DIGIT (A WAS ZERO)
329 IRS LNR TALLY RETURN ADDRESS
330 NOFL IRS LNR TALLY RETURN ADDRESS
331 JMP* LNR
332 *
333 HBUF BCI 20,
334 BCI 20,
335 BCI 20,
336 *
337 FIN WRITE OUT LITERALS
338 *
339 * PUH.....
340 *
341 END