d100b3f692454b9033594b87937088cbb942df39
[h316.git] / lib / hachti / src / pl$txt.asm
1 * PLOTTER TEXT OUTPUT
2 *
3 *
4 *
5 SUBR PL$TXT,FPTX
6 SUBR PL$TNL,NEWL
7 *
8 *
9 REL
10 ORG '0
11 *
12 *
13 ********************************************************************************
14 *
15 NEWL DAC **
16 LDA* FONT LOAD VERTICAL SPACING FROM FONT
17 TCA
18 STA GPTR
19 LDA TWDH LAST TEXT WIDTH
20 TCA
21 STA PPTR
22 CALL PL$MVR MOVE RELATIVELY
23 DAC PPTR
24 DAC GPTR
25 DAC 0
26 JMP* NEWL RETURN
27 *
28 *
29 ********************************************************************************
30 *
31 *
32 **** PL$TXT - TEXT OUTPUT ROUTINE
33 *
34 FPTX DAC ** FORTRAN TEXT OUTPUT ROUTINE
35 *
36 LDA* FPTX LOAD STACK DATA POINTER
37 STA SDA1 SAVE
38 STA SDA2
39 IRS FPTX
40 *
41 LDA* FPTX ARGUMENT TRANSFER
42 STA BUFP
43 IRS FPTX
44 *
45 LDA* FPTX PLEN IS INVERTED IMMEDIATELY
46 STA BLEN
47 LDA* BLEN
48 TCA
49 STA BLEN
50 IRS FPTX
51 IRS FPTX
52 *
53 CALL PL$PU DON'T KNOW WHAT HAS HAPPENED BEFORE: PEN UP!
54 *
55 CRA
56 STA TWDH TEXT WIDTH
57 *
58 JST TXIN EXECUTE INTERNAL TEXT ROUTINE
59 *
60 LDA TWDH
61 JMP* FPTX RETURN TO CALLER
62 *
63 * TXTP DAC TXTT
64 * TXTT BCI 10,Philipp VOID
65 * DAC 0
66 ********************************************************************************
67 *
68 *
69 BUFP DEC 0 POINTER TO TEXT BUFFER IN FORTRAN PROGRAM
70 BLEN DEC 0 LENGTH OF TEXT TO OUTPUT
71 *
72 *
73 ********************************************************************************
74 *
75 *
76 TXIN DAC ** INTERNAL TEXT WRITE ROUTINE
77 *
78 CALL PL$PUS PUSH GRAPHIC CONTEXT ONTO STACK
79 SDA1 DAC **
80 CALL PL$RST RESET COORDINATE SYSTEM. NOW WE MENTALLY PLOT FROM 0,0!
81 *
82 TLOP LDA BLEN CHARACTER LOOP, FIRST TEST CHAR COUNTER
83 SNZ
84 JMP TFIN NO MORE CHARACTERS LEFT, GO HOME
85 *
86 LDA* BUFP NOW TEST TEXT FOR ZERO-TERMINATION
87 SNZ
88 JMP TFIN ZERO-TERMINATION, GO HOME
89 *
90 TEGO LGR 8 TAKE DOWN UPPER CHARACTER
91 ANA ='177 MASK OUT PARITY BIT
92 JST PLG DRAW GLYPH
93 ADD TWDH
94 STA TWDH
95 *
96 IRS BLEN INCREMENT CHARACTER COUNTER
97 SKP
98 JMP TFIN NO MORE CHARACTERS LEFT, GO HOME.
99 *
100 LDA* BUFP NOW DO THE SECOND CHARACTER OF THE WORD.
101 ANA ='177 MASK OUT UPPER BITS AND PARITY.
102 *
103 JST PLG LIKE ABOVE
104 ADD TWDH
105 STA TWDH
106 *
107 *
108 IRS BLEN
109 NOP
110 *
111 IRS BUFP INCREMENT BUFFER POINTER TO NEXT LOCATION
112 JMP TLOP JUMP BACK IN CHARACTER LOOP
113 *
114 *
115 TFIN CALL PL$POP GET OLD GRAPHIC CONTEXT AND BE HAPPY
116 SDA2 DAC **
117 CALL PL$MVR
118 DAC TWDH
119 DAC ZERO
120 DAC *
121 *
122 JMP* TXIN THAT'S IT, WE GO HOME.
123 *
124 *
125 *
126 **********************************************************
127 *
128 *
129 PLG DAC ** GLYPH DRAWING ROUTINE
130 STA ARG SAVE ARGUMENT
131 LDX FONT POINTER TO BEGINNING OF FONT FILE
132 LDA 4,1 LOAD POINT COUNT FROM (*FONT)+4
133 TCA NEGATE
134 STA LEFT STORE AS NEGATIVE COUNTER
135 LDA FONT
136 ADD =5 CALCULATE FIRST GLYPH'S ADDRESS
137 STA GPTR SAVE TO GLYPH POINTER
138 *
139 *
140 FIND LDA LEFT SEARCH LOOP ENTRY
141 SZE
142 JMP FGOO WE STILL HAVE GLYPHS TO TEST, THERE IS HOPE!
143 *
144 CRA FAILED. WE HAVE NOT GENERATED AN OFFSET.
145 JMP* PLG RETURN
146 *
147 FGOO LDA* GPTR LOAD GLYPH NUMBER
148 SUB ARG SUBSTRACT WANTED GLYPH NUMBER
149 SNZ
150 JMP PGLP FOUND, TAKE GLYPH TO THE PLOTTING ROUTINE!
151 *
152 IRS LEFT INCREMENT LOOP COUNTER
153 LDX GPTR UPDATE
154 LDA GPTR GLYPH
155 ADD =2 POINTER TO
156 ADD 1,1 NEXT
157 STA GPTR GLYPH
158 JMP FIND SEARCH AGAIN
159 *
160 *
161 PGLP LDX GPTR LOAD CURRENT GLYPH'S ADDRESS TO INDEX REGISTER
162 *
163 LDA 2,1 LOAD OUR GLYPH'S LEFT AND RIGHT MARGINS
164 LGR 8 USE UPPER BITS FIRST
165 SUB =82 SUBSTRACT LETTER R - ASK HERSHEY, WHY IT'S THAT WAY!
166 TCA WE WANT THE LEFT MARGIN NEGATED FOR LATER USE.
167 STA XMIN STORE
168 LDA 2,1 LOAD THE MARGINS AGAIN
169 CAL CLEAR UPPER BITS OF A
170 SUB =81 THAT'S CORRECT, ONE LESS FOR NOT OVERLAPPING GLYPHS!
171 STA XNEX SAVE RIGHT MARGIN
172 *
173 LDA 1,1 LOAD POINT COUNT
174 * CALL OCT
175 TCA COMPLEMENT
176 AOA INCREMENT - FIRST "POINT" WERE THE MARGINS.
177 STA LEFT SET UP THE WELL KNOWN COUNTER.
178 *
179 CALL PL$RMR MOVE ORIGIN
180 DAC XMIN
181 DAC ZERO Y STAYS UNCHANGED.
182 DAC 0
183 *
184 LDA GPTR
185 ADD =3 ADD OFFSET IN GLYPH DATA
186 STA PPTR SAVE POINTER TO FIRST POINT DATA WORD.
187 *
188 *
189 MLOP LDA LEFT DRAWING LOOP ENTRY
190 SNZ
191 JMP MFIN FINISHED DRAWING THAT GLYPH. GO, CLEAN UP.
192 *
193 MOGO LDA* PPTR
194 *
195 SUB ='20122 TEST FOR OBSCURE PEN UP CONDITION - ASK HERSHEY..
196 SNZ
197 JMP PUP THIS WORD CONTAINS ONLY A PEN UP COMMAND.
198 *
199 LDA* PPTR MAKE POINT'S X VALUE
200 LGR 8 SHIFT DOWN
201 SUB =82 SUBSTRACT LETTER R - ASK HERSHEY
202 STA X STORE
203 *
204 LDX FONT WE WILL NEED THE BASELINE HEIGHT FROM THERE
205 LDA* PPTR LOAD AGAIN, FOR Y POSITION
206 CAL CLEAR UPPER BITS
207 SUB =82 THE SUBSTRACTION..
208 TCA HERSHEY LIVED IN THE 4TH QUADRANT - WE IN THE 1ST.
209 SUB 1,1 SUBTRACT BASELINE OFFSET
210 STA Y SAVE
211 *
212 *
213 CALL PL$MV MOVE TO POINT
214 DAC X
215 DAC Y
216 DAC 0
217 CALL PL$PD AND THEN PEN DOWN. ASK HERSHEY..
218 *
219 PEND IRS PPTR INCREMENT POINT POINTER
220 IRS LEFT INCREMENT POINT COUNTER
221 NOP
222 JMP MLOP LOOP AGAIN.
223 *
224 *
225 PUP CALL PL$PU PEN UP
226 JMP PEND GET BACK TO THE LOOP END
227 *
228 *
229 MFIN CALL PL$PU END OF GLYPH, PEN UP!
230 *
231 CALL PL$RMR FUZZ COORDINATES AGAIN.
232 DAC XNEX THE 81 ABOVE SAVES AN ADDITION OF 1 HERE.
233 DAC ZERO Y UNTOUCHED. ZERO IS ZERO.
234 DAC 0
235 *
236 * CALL PL$MV MOVE PEN TO BEGINNING OF NEXT GLYPH - JUST IN CASE...
237 * DAC ZERO
238 * DAC ZERO
239 * DAC 0
240 LDA XMIN RETURN WITH CORRECT WIDTH VALUE
241 ADD XNEX
242 JMP* PLG RETURN TO CALLER.
243 *
244 *
245 ****************************************************************
246 *
247 *
248 *
249 ********************************************************************
250 ARG DEC 0
251 LEFT DEC 0
252 GPTR DEC 0
253 PPTR DEC 0
254 X DEC 0
255 Y DEC 0
256 XMIN DEC 0
257 XNEX DEC 0
258 ZERO DEC 0
259 TWDH DAC ** GENERATED TEXT WIDTH
260 *
261 FONT XAC PL$FNT
262 *
263 *
264 END