4 * PROGRAM TITLE: O$LA (O$LA,O$LE,O$LH,O$LC,O$LF)
5 * LINE PRINTER ROUTINES
9 * 1.1 (2006-04-03) - GET IT SMALLER
10 * 1.2 (2007-01-15) - SOME FINE TUNING
18 * THESE ARE THE LIBRARY ROUTINES FOR HACHTI'S LINE PRINTER INTERFACE
20 * ******* SPECIAL VERSION CONFIGURED FOR 80*64 LASER PRINTER!
24 * DEPENDS ON HACHTI'S HARDWARE AND FORTRAN IV COMPILER TAPE
36 * DAC (BUFFER ADDRESS)
39 * THIS PRINTS ONE LINE OF LISING TEXT
40 * (60 2-CHAR WORDS MAX) TO THE LINE PRINTER.
44 * DAC (HEADING ADDRESS)
47 * SETUP THE LISTING HEADER
48 * RESETS THE PAGE COUNTER AND SPACES TO THE BEGINNING OF
53 * DAC (BUFFER ADDRESS)
56 * PRINT TEXT FROM BUFFER. NO CR OR LF IS OUTPUT.
61 * PRODUCE A CARRIAGE RETURN ON THE LINE PRINTER.
67 * SEND A LINE FEED COMMAND TO THE PRINTER.
74 * SPACES TO THE BEGINNING OF THE NEXT PAGE BY SENDING
75 * A FF CHARACTER TO THE PRINTER.
77 ********************************************************************************
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
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
91 ********************************************************************************
97 LPP DEC 60 DATA LINES PER PAGE (WITHOUT HEADING ETC.)
98 LNW DEC 40 LINE LENGTH IN 2-CHAR WORDS
102 LDA* O$LA BUFFER ADDRESS
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
110 CAS LINES ARE WE ON THE FIRST LINE?
111 JMP *+2 NO, WE ARE NOT.
112 JST NP MAKE HEADER, SPACING ETC.
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
120 IRS O$LA MAKE RETURN ADDRESS
124 O$LH DAC ** INIT HEADING
126 STA P1 POINTER TO SOURCE
128 STA P2 POINTER TO TARGET
130 SUB PGSL LENGTH OF PAGE NUMBERING
139 LDA LPP LINES PER PAGE
141 STA LINE THE LINE COUNTER
142 IRS O$LH ADJUST ADDRESS
144 STA LN1 CLEAR PAGE NUMBERING
145 STA LN2 CLEAR PAGE NUMBERING
146 STA LN3 CLEAR PAGE NUMBERING
151 SKP1 DEC 0 EMPTY LINES BEFORE HEADING
152 SKP2 DEC 1 EMPTY LINES BETWEEN HEADING AND TEXT
153 NP DAC ** PREPARE NEW PAGE
154 LDA SKP1 SPACES BEFORE HEADING
155 SNZ SPACING REQUIRED?
156 JMP NHDS NO SPACE BEFORE HEADING
162 NHDS JST LNNR PREPARE LINE NUMBERING
164 HBUP DAC HBUF ADDRESS OF HEADER BUFFER
165 JST T20 CARRIAGE RETURN
167 LDA SKP2 NUMBER OF SPACES BEFORE TEXT
168 SNZ SPACING REQUIRED?
169 JMP NSPC NO, IT'S NOT.
172 SP1 JST T30 LINE FEED
173 IRS CNT DEC COUNTER, SKIP IF READY
181 STA LINE LINE COUNTER
190 XR DEC 0 THE CALLER'S X REGISTER
195 LINE DEC -40 NEG LINES LEFT ON PAGE
197 PGSL DEC 5 LENGTH OF ABOVE
198 PGLN DEC -5 NEGATIVE OF ABOVE, ATTENTION!
199 PGSP DAC PGS POINTER TO PGS
200 RS DEC 0 RIGHT DISTANCE FOR PAGE NUMBERING (2-CHAR WORDS)
203 ************************************************************
207 STX XR SAVE CALLER'S INDEX REGISTER
224 LDX XR RESTORE CALLER'S INDEX REGISTER
269 * PRINT LINE NUMBER TO BUFFER
270 LNNR DAC ** INCREMENT LINE NUMBER, PUT TO BUFFER
271 JST LNR INCREMENT DIGIT
272 LN1 DEC 0 LEAST SIGNIFICANT DIGIT
273 JMP RDY NO CARRY, COUNTING READY
274 JST LNR INCREMENT DIGIT
275 LN2 DEC 0 SECOND DIGIT
276 JMP RDY NO CARRY, COUNTING READY
277 JST LNR INCREMENT DIGIT
278 LN3 DEC 0 THIRD DIGIT
280 RDY NOP OVERFLOW, BUT WHAT SHOULD WE DO?
283 LDA LN3 LEFTMOST VALUE (100)
290 LDA LN1 RIGHTMOST DIGIT (1)
291 ADD =48 ZERO CHARACTER
294 * MIDDLE VALUE CAN BE SPACE OR 0
295 LDA LN3 ASK LEFTMOST NUMBER
300 ZZ3 LDA LN2 MIDDLE VALUE (10)
302 ZZZ LLR 8 SHIFT UP AGAIN
303 STA PGS+4 STORE INTO POSITION
306 LDA HBP HEADER BUFFER ADDRESS
309 ADD ='40000 SET INDEX BIT
310 STA P1 TO WRITE POINTER
311 LDA PGSP PAGE NUMBER BUFFER ADDRESS
312 ADD PGSL ADD PAGE NUMBERING LENGTH
313 ADD ='40000 SET INDEX BIT
314 STA P2 TO READ POINTER
323 MDG DAC ** MAKE DIGIT FROM A
326 LDA =32 IS ZERO->SPACE
328 NZ ADD =48 THE ZERO CHARACTER
332 LNR DAC ** DIGIT SERVICE
333 IRS* LNR INCREMENT DIGIT
334 LDA* LNR LOAD NEW VALUE OF DIGIT
335 SUB =10 TEST IF OVERFLOW
337 JMP NOFL NO, TAKE FIRST RETURN
338 STA* LNR YES, CLEAR DIGIT (A WAS ZERO)
339 IRS LNR TALLY RETURN ADDRESS
340 NOFL IRS LNR TALLY RETURN ADDRESS
347 FIN WRITE OUT LITERALS