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