-
Notifications
You must be signed in to change notification settings - Fork 92
Expand file tree
/
Copy pathinterp
More file actions
344 lines (344 loc) · 5.17 KB
/
interp
File metadata and controls
344 lines (344 loc) · 5.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
.PAG 'INTERP'
;
;*SUBROUTINE TO FIND WIDTH OF
; FORMAT FIELD
;
; FIELD CHAR IN .A
; INDEX INTO FORMAT IN X
; RETURN WIDTH IN Y
; MAINTAIN FP & X
;
WIDTH LDY #0
WID10 CMP F,X
BNE WID20
INX
INC FP
INY
BNE WID10
WID20 RTS
.SKI 5
;
;*UPDOPT-UPDATE FIELD OPTIONS
; .A HAS BIT TO BE SET BY OR'ING
;
UPDOPT ORA OPT
STA OPT
RTS
.SKI 5
;
;*CONVERT ASCII CHARS IN X AND A
; TO DECIMAL VALUE IN A
;
ASCDEC PHA
TXA
AND #$F
ASL A ;MULTIPLY FIRST BY 10
STA DATA
ASL A
ASL A
ADC DATA
STA DATA
PLA
AND #$F
ADC DATA
RTS
.SKI 5
;
;*INCFP-UPDATE FP AND CHECK IF
; AT END OF FORMAT STRING. IF
; WE AREN'T, JUST RETURN. IF WE
; ARE AT THE END, EXIT TO THE ERROR
; ROUTINE.
INCFP INC FP ;UPDATE
LDX FP ;PAST END?
CPX FV
BCS INCFP5 ;IF CS, YES. USE ERROR EXIT
LDA F,X ;PICK UP THE CHAR
RTS
;
INCFP5 PLA ;DUMP RETURN ADDRESS
PLA
JMP FMT120 ;BAD FORMAT
.SKI 5
;
;*FORMATTER-THIS MODULE ROUTINE IS
; IS RESPONSIBLE FOR INTERPRETING
; THE FORMAT STRING, AND JUMPING
; TO THE APPROPRIATE FORMAT
; PROCESSING ROUTINE FOR EACH FIELD.
;
FORMAT LDX #0 ;RESET FORMAT PTR
STX FP
;
FMT10 LDX #0 ;RESET FIELD PARMS
STX OPT
STX LW
STX RW
;
FMT20 LDX FP ;AT END OF FMT?
CPX FV
BCC FMT21 ;IF CC, NO
JMP FINI20 ;WAIT FOR TERMINATOR
;
FMT21 LDA F,X
CMP #BLANK ;SKIP FIELD?
BNE FMT25
;
;*PROCESS LITERAL OR BLANK
;
FMT22 JSR INSERT
INC FP ;POINT AT NEXT FMT CHAR
BNE FMT10 ;BR ALWAYS
;
FMT25 TAY ;SAVE CHAR
AND #$40 ;LITERAL?
BEQ FMT30 ;IF EQ, NO
TYA ;RESTORE CHAR TO ASCII VALUE
CPY #$20 ;ALREADY ASCII?
BCS FMT22 ;IF CS, YES
ORA #$40 ;MAKE ASCII
BNE FMT22 ;BR ALWAYS
;
;*LOOK FOR ALPHA FIELD
;
FMT30 TYA
CMP #1 ;ALPHA FIELD?
BNE FMT40 ;IF NE, NO
JSR WIDTH ;FIND WIDTH OF ALPHA
STY LW ;SAVE IT
JMP ALPHA ;PROCESS ALPHA FLD
;
;*MUST BE NUMERIC FIELD OR A BAD
; CHARACTER IN FMT.
;
FMT40 CMP #19 ;SIGN FIELD?
BNE FMT50
;
;*FOUND SIGN FIELD IF HERE
;
LDA #PRTLS
JSR UPDOPT
JSR INCFP ;USE ERROR EXIT IF AT END OF FORMAT
;
FMT50 CMP #'$ ;DOLLARS FORMAT?
BEQ FMT51
CMP #28
BNE FMT90
LDA #PRTYEN
BNE FMT52
;
;*FOUND DOLLAR FIELD IF HERE.
;
FMT51 LDA #PRTDOL
FMT52 JSR UPDOPT
JSR INCFP
CMP #'$ ;FLOATING DOLLARS?
BEQ FMT54
CMP #28
BNE FMT90
JSR WIDTH
LDA #PRTFYN
BNE FMT99
;
;*FOUND FLOATING DOLLAR FIELD.
; SET WIDTH, THEN GO LOOK FOR RHS.
;
FMT54 JSR WIDTH
LDA #PRTFDL ;REMEMBER FLOATING DOLLARS
FMT99 JSR UPDOPT
BNE FMT60 ;BR ALWAYS
;
FMT90 CMP #26 ;LEADING ZEROS?
BNE FMT110
;
;*FOUND LEADING ZEROS IF HERE.
; SET WIDTH, THEN GO LOOK FOR RHS.
;
JSR WIDTH
LDA #PRTLZ
JSR UPDOPT
BNE FMT60 ;BR ALWAYS
;
;*COUNT STRAIGHT DIGITS.
;
FMT110 LDA #'9
JSR WIDTH
;
;*NOW TRY FOR A RHS
;
;
FMT60 STY LW
LDA F,X
CMP #'.
BNE FMT75
;
;*FOUND A DECIMAL POINT IF HERE
;
LDA #PRTDP
JSR UPDOPT
INX
INC FP
;
;*GET WIDTH OF RHS 9'S FIELD
;
LDA #'9
JSR WIDTH
STY RW
FMT75 LDA F,X
CMP #'- ;TRAILING SIGN?
BNE FMT80
;
;*FOUND TRAILING SIGN IF HERE
;
LDA OPT ;DISALLOW IF ALREADY SIGNED
AND #PRTLS ;ALREADY HAVE LEADING SIGN?
BNE FMT80 ;IF NE, YES. IGNORE TRAILING SIGN TILL LATER
INC FP
LDA #PRTTS ;REMEMBER TRAILING SIGN
JSR UPDOPT
;
;*DONE SETTING FLAGS AND SUCH.
; DID WE FIND A VALID OUTPUT FIELD?
;
FMT80 CLC
LDA LW
ADC RW
BNE NUMBER ;IF NE, WE DID
FMT120 LDY #'F
JMP FMTERR
.SKI 5
;
;*NUMBER-RECEIVES NUMBER FROM PET
; AND CONVERTS IT INTO AN INTERNAL FORM.
; IF THE NUMBER FROM THE PET IS GOOD,
; IT WILL CONTINUE IN THE FORMAT
; MODULE.
;
NUMBER LDX #9
LDA #'0
NUM10 STA FACC-1,X
DEX
BNE NUM10
STX SGN
STX EXP
BEQ NUM30
;
;*STRIP LEADING BLANKS
;
NUM20 JSR GET
BVS NUM125 ;IF VS, ERROR
NUM30 JSR TERML
BCC NUM37 ;IF CC, NO TERMINAL
NUM35 JMP FINI20 ;GO INSERT TERMINAL
NUM37 CMP #SKIP ;SKIP NUMERIC FIELD?
BNE NUM38 ;IF NE, NO
JMP SKPNUM ;GO SKIP NUMERIC FIELD
NUM38 CMP #$21 ;CONTROL JUNK OR BLANK?
BCC NUM20 ;IF CC, YES
;
;*FOUND SOMETHING NON-BLANK, AND
; NON-SKIP. IF IT IS A '0, THEN
; DELETE LEADING ZEROS.
;
CMP #'.
BNE NUM50
NUM45 ROR SGN ;SET BIT 0 (FOUND DECIMAL POINT)
SEC
ROL SGN
JSR GET
BVS NUM125 ;IF VS, ERROR
CMP #'0
BNE NUM95
LDA #NEGEXP
ORA SGN
STA SGN
INC EXP
BNE NUM45
NUM50 JSR GET20
BCS NUM60
CMP #'0
BEQ NUM90
STA FACC
INC EXP
INX
BNE NUM90
NUM60 CMP #'-
BEQ NUM80
NUM70 LDY #'M ;DATA-FORMAT MISMATCH
BNE NUM135
NUM80 LDA SGN
BMI NUM70
ORA #NEGMAN ;NEGATIVE MANTISSA
STA SGN
BMI NUM20 ;BR ALWAYS
NUM90 JSR GET
BVS NUM125 ;IF VS, ERROR
BCS NUM100
NUM95 STA FACC,X
INX
LDA SGN
LSR A
BCS NUM90
INC EXP
BNE NUM90
NUM100 CMP #'.
BNE NUM120
LDA SGN ;ALREADY HAVE A DP?
LSR A
BCS FMTNUM ;CS IF YES
ROR SGN ;NO, BUT NOW WE DO
SEC
ROL SGN
BNE NUM90 ;BR ALWAYS
;
;*SEE IF WE HAVE AN EXPONENT
;
NUM120 CMP #'E
BNE FMTNUM ;IF NE, NOPE
JSR GET
BVC NUM128 ;IF VC, NO ERROR
NUM125 JMP FINI90 ;NO TERMINATOR ERROR
NUM128 CMP #'+
BEQ NUM150
CMP #'-
BEQ NUM140
NUM130 LDY #'E ;EXPONENT ERROR
NUM135 JMP ERROR
NUM140 LDA #NEGEXP
ORA SGN
STA SGN
NUM150 JSR GET
BVS NUM125 ;IF VS, ERROR
BCS NUM130
TAX
JSR GET
BVS NUM125 ;IF VS, ERROR
BCS NUM130
JSR ASCDEC
TAX
BIT SGN ;NEG EXP?
BVC NUM160 ;IF VC, NO.
LDA EXP ;YES, SO NEGATE MAGNITUDE
EOR #$FF
STA EXP
INC EXP
NUM160 CLC
TXA
ADC EXP
BPL NUM170
EOR #$FF
CLC
ADC #1
NUM170 STA EXP
;
;*EAT TRAILING CR IF # IN
; EXPONENTIAL MODE
;
NUM180 JSR IEEE
BVS NUM125
JSR TERML
BCS ATEIT
CMP #$21
BCC NUM180
ATEIT
.END