Initial revision
[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 *
10 * AUTHOR
11 *
12 * PHILIPP HACHTMANN
13 *
14 *
15 * PURPOSE
16 *
17 * THESE ARE THE LIBRARY ROUTINES FOR HACHTI'S LINE PRINTER INTERFACE
18 *
19 *
20 * RESTRICTIONS
21 *
22 * DEPENDS ON HACHTI'S HARDWARE AND FORTRAN IV COMPILER TAPE
23 *
24 *
25 * STORAGE
26 *
27 * 420 (OCTAL)
28 * 271 (DECIMAL)
29 *
30 *
31 * USE
32 *
33 * CALL O$LA
34 * DAC (BUFFER ADDRESS)
35 * NORMAL
36 *
37 * THIS PRINTS ONE LINE OF LISING TEXT
38 * (60 2-CHAR WORDS MAX) TO THE LINE PRINTER.
39 *
40 *
41 * CALL O$LH
42 * DAC (HEADING ADDRESS)
43 * NORMAL RETURN
44 *
45 * SETUP THE LISTING HEADER
46 * RESETS THE PAGE COUNTER AND SPACES TO THE BEGINNING OF
47 * THE NEXT PAGE.
48 *
49 *
50 * CALL O$LP
51 * DAC (BUFFER ADDRESS)
52 * NORMAL RETURN
53 *
54 * PRINT TEXT FROM BUFFER. NO CR OR LF IS OUTPUT.
55 *
56 * CALL O$LC
57 * NORMAL RETURN
58 *
59 * PRODUCE A CARRIAGE RETURN ON THE LINE PRINTER.
60 *
61 *
62 * CALL O$LF
63 * NORMAL RETURN
64 *
65 * SEND A LINE FEED COMMAND TO THE PRINTER.
66 *
67 *
68 * CALL O$LE
69 * NORMAL RETURN
70 *
71 * EJECT CURRENT PAGE
72 * SPACES TO THE BEGINNING OF THE NEXT PAGE BY SENDING
73 * A FF CHARACTER TO THE PRINTER.
74 *
75 ********************************************************************************
76 *
77 SUBR O$LA TYPE A COMPLETE LINE WITH CR/LF, HEADING ETC.
78 SUBR O$LH INITIALISE HEADING
79 SUBR O$LP,T1 TYPE A LINE, NO CR
80 SUBR O$LC,T20 RETURN THE CARRIAGE
81 SUBR O$LF,T30 ADVANCE TO NEXT LINE
82 SUBR O$LE,FF EJECT PAGE
83 *
84 SUBR O$LSK1,SKP1 EMPTY LINES BETWEEN TOP OF PAGE AND HEADING
85 SUBR O$LSK2,SKP2 EMPTY LINES BETWEEN HEADING AND MAIN TEXT
86 SUBR O$LLPP,LPP PURE TEXT LINES PER PAGE
87 SUBR O$LRS,RS DISTANCE FROM PAGE NUMBERING TO RIGHT MARGIN
88 *
89 ********************************************************************************
90 *
91 REL RELOCATEABLE MODE
92 *
93 * CONFIGURATION
94 SKP1 DEC 1 EMPTY LINES BEFORE HEADING
95 SKP2 DEC 3 EMPTY LINES BETWEEN HEADING AND TEXT
96 LPP DEC 60 DATA LINES PER PAGE (WITHOUT HEADING ETC.)
97 LNW DEC 60 LINE LENGTH IN 2-CHAR WORDS
98 RS DEC 1 RIGHT DISTANCE FOR PAGE NUMBERING (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 TCA
131 STA CNT
132 HL1 LDA* P1
133 STA* P2
134 IRS P1
135 IRS P2
136 IRS CNT READY?
137 JMP HL1 NO
138 LDA LPP LINES PER PAGE
139 TCA RENEW
140 STA LINE THE LINE COUNTER
141 IRS O$LH ADJUST ADDRESS
142 CRA
143 STA LN1 CLEAR PAGE NUMBERING
144 STA LN2 CLEAR PAGE NUMBERING
145 STA LN3 CLEAR PAGE NUMBERING
146 JMP* O$LH RETURN
147 *
148 *
149 *
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 HBUF BCI 20,
191 BCI 20,
192 BCI 20,
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 PGSP DAC PGS POINTER TO PGS
198 *
199 *
200 ************************************************************
201 *
202 * OUTPUT LINE
203 T1 DAC **
204 STX XR SAVE CALLER'S INDEX REGISTER
205 LDA* T1
206 ADD LNW LINE WIDTH
207 ADD ='40000 SET TAG
208 STA T6
209 IRS T1
210 LDA LNW LINE WIDTH
211 TCA NEGATE
212 STA 0
213 T3 LDA* T6
214 CAS ='120240
215 JMP *+2
216 *
217 JMP T8
218 T4 JST T14
219 IRS 0
220 JMP T3
221 LDX XR RESTORE CALLER'S INDEX REGISTER
222 JMP* T1
223 T6 *** **
224 *
225 *
226 T8 LDA 0
227 STA T12
228 T10 IRS 0
229 JMP *+2
230 JMP* T1
231 LDA* T6
232 CAS ='120240
233 JMP *+2
234 JMP T10
235 LDA T12
236 STA 0
237 LDA ='120240
238 JMP T4
239 T12 *** **
240 *
241 *
242 T14 DAC **
243 ICA
244 OTA 0
245 JMP *-1
246 ICA
247 OTA 0
248 JMP *-1
249 JMP* T14
250 ****
251 *
252 * CARRIAGE RETURN
253 T20 DAC **
254 LDA =13 CR CHARACTER
255 OTA 0 OUTPUT
256 JMP *-1
257 JMP* T20 RETURN
258 *
259 * LINE FEED
260 T30 DAC **
261 LDA =10 LF CHARACTER
262 OTA 0 OUTPUT
263 JMP *-1 RETURN
264 JMP* T30
265 *
266 * PRINT LINE NUMBER TO BUFFER
267 LNNR DAC ** INCREMENT LINE NUMBER, PUT TO BUFFER
268 JST LNR INCREMENT DIGIT
269 LN1 DEC 0 LEAST SIGNIFICAND DIGIT
270 JMP RDY NO CARRY, COUNTING READY
271 JST LNR INCREMENT DIGIT
272 LN2 DEC 0 SECOND DIGIT
273 JMP RDY NO CARRY, COUNTING READY
274 JST LNR INCREMENT DIGIT
275 LN3 DEC 0 THIRT DIGIT
276 NOP NO CARRY, FINE
277 RDY NOP OVERFLOW, BUT WHAT SHOULD WE DO?
278 *
279 *
280 LDA LN3 LEFTMOST VALUE (100)
281 JST MDG CONVERT
282 LRR 8 SHIFT DOWN
283 LDA =32 SPACE
284 LLR 8 SHIFT BACK
285 STA PGS+3 STORE
286 *
287 LDA LN1 RIGHTMOST DIGIT (1)
288 ADD =48 ZERO CHARACTER
289 LRR 8 SHIFT AWAY
290 LDA LN2 MIDDLE VALUE (10)
291 JST MDG CONVERT
292 LLR 8 SHIFT UP AGAIN
293 STA PGS+4 STORE INTO POSITION
294 *
295 *
296 LDA HBP HEADER BUFFER ADDRESS
297 ADD LNW PAGE WIDTH
298 SUB RS RIGHT SPACING
299 ADD ='40000 SET INDEX BIT
300 STA P1 TO POINTER
301 LDA PGSP PAGE NUMBER BUFFER ADDRESS
302 ADD =5 ADD PAGE NUMBERING LENGTH
303 ADD ='40000 SET INDEX BIT
304 STA P2 TO POINTER
305 LDA =-5
306 STA 0
307 PP1 LDA* P2
308 STA* P1
309 IRS 0
310 JMP PP1
311 JMP* LNNR RETURN
312 *
313 *
314 MDG DAC ** MAKE DIGIT FROM A
315 SZE
316 JMP NZ NO ZERO
317 LDA =32 IS ZERO->SPACE
318 JMP* MDG RETURN
319 NZ ADD =48 THE ZERO CHARACTER
320 JMP* MDG
321 *
322 *
323 LNR DAC ** DIGIT SERVICE
324 IRS* LNR INCREMENT DIGIT
325 LDA* LNR LOAD NEW VALUE OF DIGIT
326 SUB =10 TEST IF OVERFLOW
327 SZE OVERFLOW?
328 JMP NOFL NO, TAKE FIRST RETURN
329 STA* LNR YES, CLEAR DIGIT (A WAS ZERO)
330 IRS LNR TALLY RETURN ADDRESS
331 NOFL IRS LNR TALLY RETURN ADDRESS
332 JMP* LNR
333 *
334 FIN WRITE OUT LITERALS
335 *
336 * PUH.....
337 *
338 END