*** empty log message ***
[h316.git] / lib / iolib / src / o$la-laser.asm
CommitLineData
1ddb3009 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
d85ce9a1 10* 1.2 (2007-01-15) - SOME FINE TUNING
1ddb3009 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
97LPP DEC 60 DATA LINES PER PAGE (WITHOUT HEADING ETC.)
98LNW DEC 40 LINE LENGTH IN 2-CHAR WORDS
99*
100*
101O$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
108PGOK 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
117LBUF 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*
124O$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
d85ce9a1 130 SUB PGSL LENGTH OF PAGE NUMBERING
1ddb3009 131 TCA
132 STA CNT
133HL1 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*
151SKP1 DEC 0 EMPTY LINES BEFORE HEADING
152SKP2 DEC 1 EMPTY LINES BETWEEN HEADING AND TEXT
153NP 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
159S1 JST T30 LINE FEED
160 IRS CNT
161 JMP S1
162NHDS JST LNNR PREPARE LINE NUMBERING
163 JST T1 TYPE HBUF
164HBUP 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
172SP1 JST T30 LINE FEED
173 IRS CNT DEC COUNTER, SKIP IF READY
174 JMP SP1 NOT READY
175NSPC JMP* NP RETURN
176*
177* FORM FEED
178FF 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
190XR DEC 0 THE CALLER'S X REGISTER
191CNT DEC 0
192HBP DAC HBUF
193P1 DEC 0 POINTER 1
194P2 DEC 0 POINTER 2
195LINE DEC -40 NEG LINES LEFT ON PAGE
196PGS BCI 5, PAGE XXX
d85ce9a1 197PGSL DEC 5 LENGTH OF ABOVE
198PGLN DEC -5 NEGATIVE OF ABOVE, ATTENTION!
1ddb3009 199PGSP DAC PGS POINTER TO PGS
d85ce9a1 200RS DEC 0 RIGHT DISTANCE FOR PAGE NUMBERING (2-CHAR WORDS)
1ddb3009 201*
202*
203************************************************************
204*
205* OUTPUT LINE
206T1 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
216T3 LDA* T6
217 CAS ='120240
218 JMP *+2
219*
220 JMP T8
221T4 JST T14
222 IRS 0
223 JMP T3
224 LDX XR RESTORE CALLER'S INDEX REGISTER
225 JMP* T1
226T6 *** **
227*
228*
229T8 LDA 0
230 STA T12
231T10 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
242T12 *** **
243*
244*
245T14 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
256T20 DAC **
257 LDA =13 CR CHARACTER
258 OTA 0 OUTPUT
259 JMP *-1
260 JMP* T20 RETURN
261*
262* LINE FEED
263T30 DAC **
264 LDA =10 LF CHARACTER
265 OTA 0 OUTPUT
266 JMP *-1 RETURN
267 JMP* T30
268*
269* PRINT LINE NUMBER TO BUFFER
270LNNR DAC ** INCREMENT LINE NUMBER, PUT TO BUFFER
271 JST LNR INCREMENT DIGIT
272LN1 DEC 0 LEAST SIGNIFICANT DIGIT
273 JMP RDY NO CARRY, COUNTING READY
274 JST LNR INCREMENT DIGIT
275LN2 DEC 0 SECOND DIGIT
276 JMP RDY NO CARRY, COUNTING READY
277 JST LNR INCREMENT DIGIT
278LN3 DEC 0 THIRD DIGIT
279 NOP NO CARRY, FINE
280RDY 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
300ZZ3 LDA LN2 MIDDLE VALUE (10)
301 JST MDG CONVERT
302ZZZ 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
d85ce9a1 312 ADD PGSL ADD PAGE NUMBERING LENGTH
1ddb3009 313 ADD ='40000 SET INDEX BIT
314 STA P2 TO READ POINTER
d85ce9a1 315 LDX PGLN
1ddb3009 316PP1 LDA* P2
317 STA* P1
318 IRS 0
319 JMP PP1
320 JMP* LNNR RETURN
1ddb3009 321*
322*
323MDG DAC ** MAKE DIGIT FROM A
324 SZE
325 JMP NZ NO ZERO
326 LDA =32 IS ZERO->SPACE
327 JMP* MDG RETURN
328NZ ADD =48 THE ZERO CHARACTER
329 JMP* MDG
330*
331*
332LNR 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
340NOFL IRS LNR TALLY RETURN ADDRESS
341 JMP* LNR
342*
343HBUF BCI 20,
344 BCI 20,
345 BCI 20,
346*
347 FIN WRITE OUT LITERALS
348*
349* PUH.....
350*
351 END