*** 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
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* ******* 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
130 TCA
131 STA CNT
132HL1 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*
150SKP1 DEC 0 EMPTY LINES BEFORE HEADING
151SKP2 DEC 1 EMPTY LINES BETWEEN HEADING AND TEXT
152NP DAC ** PREPARE NEW PAGE
153 LDA SKP1 SPACES BEFORE HEADING
154 SNZ SPACING REQUIRED?
155 JMP NHDS NO SPACE BEFORE HEADING
156 TCA
157 STA CNT
158S1 JST T30 LINE FEED
159 IRS CNT
160 JMP S1
161NHDS JST LNNR PREPARE LINE NUMBERING
162 JST T1 TYPE HBUF
163HBUP DAC HBUF ADDRESS OF HEADER BUFFER
164 JST T20 CARRIAGE RETURN
165 JST T30 LINE FEED
166 LDA SKP2 NUMBER OF SPACES BEFORE TEXT
167 SNZ SPACING REQUIRED?
168 JMP NSPC NO, IT'S NOT.
169 TCA NEGATE
170 STA CNT TO COUNTER
171SP1 JST T30 LINE FEED
172 IRS CNT DEC COUNTER, SKIP IF READY
173 JMP SP1 NOT READY
174NSPC JMP* NP RETURN
175*
176* FORM FEED
177FF DAC **
178 LDA LPP REFILL
179 TCA THE
180 STA LINE LINE COUNTER
181*
182 LDA =12 FORM FEED
183 OTA 0 SEND FORMFEED
184 JMP *-1 WAIT
185 JMP* FF RETURN
186*
187*
188* VARIABLES
189XR DEC 0 THE CALLER'S X REGISTER
190CNT DEC 0
191HBP DAC HBUF
192P1 DEC 0 POINTER 1
193P2 DEC 0 POINTER 2
194LINE DEC -40 NEG LINES LEFT ON PAGE
195PGS BCI 5, PAGE XXX
196PGSP DAC PGS POINTER TO PGS
197*
198*
199************************************************************
200*
201* OUTPUT LINE
202T1 DAC **
203 STX XR SAVE CALLER'S INDEX REGISTER
204 LDA* T1
205 ADD LNW LINE WIDTH
206 ADD ='40000 SET TAG
207 STA T6
208 IRS T1
209 LDA LNW LINE WIDTH
210 TCA NEGATE
211 STA 0
212T3 LDA* T6
213 CAS ='120240
214 JMP *+2
215*
216 JMP T8
217T4 JST T14
218 IRS 0
219 JMP T3
220 LDX XR RESTORE CALLER'S INDEX REGISTER
221 JMP* T1
222T6 *** **
223*
224*
225T8 LDA 0
226 STA T12
227T10 IRS 0
228 JMP *+2
229 JMP* T1
230 LDA* T6
231 CAS ='120240
232 JMP *+2
233 JMP T10
234 LDA T12
235 STA 0
236 LDA ='120240
237 JMP T4
238T12 *** **
239*
240*
241T14 DAC **
242 ICA
243 OTA 0
244 JMP *-1
245 ICA
246 OTA 0
247 JMP *-1
248 JMP* T14
249****
250*
251* CARRIAGE RETURN
252T20 DAC **
253 LDA =13 CR CHARACTER
254 OTA 0 OUTPUT
255 JMP *-1
256 JMP* T20 RETURN
257*
258* LINE FEED
259T30 DAC **
260 LDA =10 LF CHARACTER
261 OTA 0 OUTPUT
262 JMP *-1 RETURN
263 JMP* T30
264*
265* PRINT LINE NUMBER TO BUFFER
266LNNR DAC ** INCREMENT LINE NUMBER, PUT TO BUFFER
267 JST LNR INCREMENT DIGIT
268LN1 DEC 0 LEAST SIGNIFICANT DIGIT
269 JMP RDY NO CARRY, COUNTING READY
270 JST LNR INCREMENT DIGIT
271LN2 DEC 0 SECOND DIGIT
272 JMP RDY NO CARRY, COUNTING READY
273 JST LNR INCREMENT DIGIT
274LN3 DEC 0 THIRD DIGIT
275 NOP NO CARRY, FINE
276RDY NOP OVERFLOW, BUT WHAT SHOULD WE DO?
277*
278*
279 LDA LN3 LEFTMOST VALUE (100)
280 JST MDG CONVERT
281 LRR 8 SHIFT DOWN
282 LDA =32 SPACE
283 LLR 8 SHIFT BACK
284 STA PGS+3 STORE
285*
286 LDA LN1 RIGHTMOST DIGIT (1)
287 ADD =48 ZERO CHARACTER
288 LRR 8 SHIFT AWAY
289*
290* MIDDLE VALUE CAN BE SPACE OR 0
291 LDA LN3 ASK LEFTMOST NUMBER
292 SNZ
293 JMP ZZ3
294 ADD =48
295 JMP ZZZ
296ZZ3 LDA LN2 MIDDLE VALUE (10)
297 JST MDG CONVERT
298ZZZ LLR 8 SHIFT UP AGAIN
299 STA PGS+4 STORE INTO POSITION
300*
301*
302 LDA HBP HEADER BUFFER ADDRESS
303 ADD LNW PAGE WIDTH
304 SUB RS RIGHT SPACING
305 ADD ='40000 SET INDEX BIT
306 STA P1 TO WRITE POINTER
307 LDA PGSP PAGE NUMBER BUFFER ADDRESS
308 ADD =5 ADD PAGE NUMBERING LENGTH
309 ADD ='40000 SET INDEX BIT
310 STA P2 TO READ POINTER
311 LDA =-5
312 STA 0
313PP1 LDA* P2
314 STA* P1
315 IRS 0
316 JMP PP1
317 JMP* LNNR RETURN
318RS DEC 0 RIGHT DISTANCE FOR PAGE NUMBERING (2-CHAR WORDS)
319*
320*
321MDG DAC ** MAKE DIGIT FROM A
322 SZE
323 JMP NZ NO ZERO
324 LDA =32 IS ZERO->SPACE
325 JMP* MDG RETURN
326NZ ADD =48 THE ZERO CHARACTER
327 JMP* MDG
328*
329*
330LNR DAC ** DIGIT SERVICE
331 IRS* LNR INCREMENT DIGIT
332 LDA* LNR LOAD NEW VALUE OF DIGIT
333 SUB =10 TEST IF OVERFLOW
334 SZE OVERFLOW?
335 JMP NOFL NO, TAKE FIRST RETURN
336 STA* LNR YES, CLEAR DIGIT (A WAS ZERO)
337 IRS LNR TALLY RETURN ADDRESS
338NOFL IRS LNR TALLY RETURN ADDRESS
339 JMP* LNR
340*
341HBUF BCI 20,
342 BCI 20,
343 BCI 20,
344*
345 FIN WRITE OUT LITERALS
346*
347* PUH.....
348*
349 END