-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy pathdos.parser
355 lines (355 loc) · 6.38 KB
/
dos.parser
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
345
346
347
348
349
350
351
352
353
354
355
.PAG 'DOS PARSER'
;******* DOSPAR **************
;*
;* -MGM 7/23/79-
;*
;* THIS IS THE PARSER ROUTINE
;* IT LOOKS AT LINES PASSED TO
;* IT AND MAKES SURE THAT THE
;* SYNTAX IS ALL PROPER.
;*
;* IT RETURNS WITH PARCHK
;* IN THE .ACC
;*
;* PARCHK IS THE
;* "PARSING CHECK BYTE".
;* FLAGS ARE SET ACCORDINGLY
;* AS VALUES ARE PARSED AND SET
;*
;* STRUCTURE OF PARCHK:
;*
;*I-I-I-I-I-I-I-I-I
;*I7+6+5+4+3+2+1+0I
;*I-I-I-I-I-I-I-I-I
;* ^ ^ ^ ^ ^ ^ ^ ^=> FN1: THIS BIT
;* ! ! ! ! ! ! ! IS SET WHEN THE FIRST
;* ! ! ! ! ! ! ! FILENAME IS PARSED
;* ! ! ! ! ! ! !=> FN2: " FOR SECOND FILENAME
;* ! ! ! ! ! !=> LA: BIT SET WHEN #L IS PARSED
;* ! ! ! ! !=> FA: BIT SET WHEN UNIT# 1S PARSED
;* ! ! ! !=> D1: BIT SET WHEN DRIVE1 PARSED
;* ! ! !=> D2: DITTO - WHEN DRIVE2 PARSED
;* ! !=> LRECL: SET WHEN LRECL PARSED
;* !=> @RPL: SET ON REPLCMNT OPERATOR IN FN1
;*
;* THE FOLLOWING ARE THE VALID BIT-
;* PATTERNS FOR PARCHK AFTER PARSING
;* FOR THE VARIOUS KEYWORDS:
;*
;* PARCHK
;* 7 6 5 4 3 2 1 0
;*(FORMAT)
;* HEADER 0 0 0 1 * 0 0 1
;* COLECT 0 0 0 * * 0 0 0
;* BACKUP 0 0 1 1 * 0 0 0
;* COPY 0 0 1 1 * 0 0 0
;* OR.. 0 0 * * * 0 1 1
;* CONCAT 0 0 * * * 0 1 1
;* DSAVE * 0 0 * * 0 0 1
;* DLOAD 0 0 0 * * 0 0 l
;* CATLOG 0 0 0 * * 0 0 0
;* RENAME 0 0 0 * * 0 1 1
;* APPEND 0 0 0 * * 1 0 1
;* SCRTCH 0 0 0 * * 0 0 1
;* DOPEN * * 0 * * 1 0 1
;* DCLOSE 0 0 0 0 * * 0 0
;* ^ ^ ^ ^ ^ ^ ^ ^
;* @ L D D F L F F
;* R R 2 1 A A N N
;* P E 2 1
;* L L
;* "1" BITS ARE REQ'D PARAMETERS
;* "*" BITS ARE OPTIONAL PARMS
;************************************
;
DOSPAR LDX #0
STX PARCHK
STX LA
STX LRECL ; INIT VARS
STX DRIVE1
STX DRIVE2
STX FNLEN
STX FNLEN2
STX DISKID
LDX #8
STX FA
JSR CHRGOT ; GET CURRENT CHR
BEQ DONE1 ; <CR> OR <:> => DONE
;
PARSEL CMP #'#
BEQ LOGADR
CMP #'W
BEQ RECLEN
CMP #'L
BEQ RECLEN
CMP #'R
BNE PARNXT
JSR CHRGET ;MOVE ON
JMP DELIM1
PARNXT CMP #'D
BEQ DRV1
CMP #ONTK ;"ON" TOKEN
BEQ ON1
CMP #'U
BEQ UNIT1
CMP #'I
BNE NEXT7
JMP IDENT
NEXT7 CMP #'"
BEQ NAME11
CMP #'(
BEQ NAME11
SNER1 JMP SNERR ;SNYTAX ERROR
; OF THE ABOVE
;
;
LOGADR LDA PARCHK ;CHK SYNTAX
AND #4
BNE SNER1 ;ONLY ONE LA ALLOWED
JSR GETVAL
CPX #0
BEQ QTYER2 ;ZERO NOT ALLOWED
STX LA
LDA PARCHK
ORA #4 ;SET LA FLAG &
STA PARCHK
JMP DELIM1 ;CONTINUE
;
;
RECLEN TAX ;SAVE CHAR
LDA PARCHK ;CHK SYNTAX
AND #$40
BNE SNER1 ;ONLY 1 LRECL ALLOWED
CPX #'W
BNE RECOO
JSR CHRGET
JMP RECON ;ONLY SET PARCHK
RECOO JSR GETVAL
CPX #0
BEQ QTYER2 ;ZERO ILLEGAL. LRECL
CPX #255
BEQ QTYER2 ;ILLEGAL LRECL
STX LRECL ;STORE PARCEL
RECON LDA PARCHK
ORA #$40 ;SET LRECL FLAG &
STA PARCHK
JMP DELIM1 ; CONTINUE
;
DONE1 JMP DONE
;
NAME11 JMP NAME1
ON1 JSR ON
JMP DELIM1
UNIT1 JSR UNIT ;DO UNIT# PARSING
JMP DELIM1
;
;
DRV1 LDA PARCHK
AND #$10
BNE SNER1 ;DRIVE1 ALLOWED ONCE
JSR GETVAL
CPX #2
BCS QTYER2 ;ILLEGAL DRV# IF >1
STX DRIVE1
STX DRIVE2
LDA PARCHK
ORA #$10
STA PARCHK ;SET DRIVE1 FLAG &
JMP DELIM1 ; CONTINUE
;
QTYER2 JMP QTYERR
;
IDENT LDA DIDCHK
AND #$FF
BEQ IDCON ;ONLY 1 DISKID ALLOWED
JMP SNERR
IDCON LDY #0
LDX #0
NEXT3 INC TXTPTR
BNE NEXT4
INC TXTPTR+1
NEXT4 LDA (TXTPTR),Y
STA DISKID,X ;M(TXTPTR => DISKID
INX
CPX #2
BCC NEXT3
LDA #$FF
STA DIDCHK ;SET DISKID FLAG &
JSR CHRGET ;CONTINUE
JMP DELIM1
;
;
NAME1 LDA PARCHK
AND #1 ;NAMEL ALLWD ONLY ONCE
JSR NEWNAM ;DO NAME PARSING
STA FNLEN
STA COUNT ;SAVE TEMP VALUE
LDA #<TBUF2
STA FNADR
LDA #>TBUF2
STA FNADR+1;RESET FNADR VALUE
LDY #0
LOOP6 LDA (INDEX1)Y ;TBUF2 XFER LOOP
CPY #0
BNE NAMCON
CMP #'@
BNE NAMCON
INC FNADR ;AND ERASE IT
DEC FNLEN
NAMCON STA TBUF2,Y
INY
CPY COUNT
BCC LOOP6
LDA PARCHK
ORA #1 ;SET NAPIE1 FLAG
STA PARCHK
;
DELIM1 JSR CHRGOT
BNE NXXX
JMP DONE1 ;<CR>/<:> => DONE
NXXX CMP #',
BNE NEXT6
JSR CHRGET
JMP PARSEL
NEXT6 CMP #ONTK
BNE NEXT6A
JMP ON1
NEXT6A CMP #TOTK ;"TO" TOKEN
BEQ PARSE2
SNER8 JMP SNERR ;SNTAX ERROR
;
;
PARSE2 JSR CHRGET
CMP #'D
BEQ DRV2
CMP #ONTK ;"ON" TOKEN
BEQ ON2
CMP #'U
BEQ UNIT2
CMP #'"
BEQ NAME2
CMP #'(
BEQ NAME2
SNER2 JMP SNERR ;ERROR
;
;
DRV2 LDA PARCHK
AND #$20
BNE SNER2 ;ONLY ONE DRIVE2 ALLWD
JSR GETVAL
CPX #2
BCS QTYERR ;ILLEGAL DRIVE #
STX DRIVE2
LDA PARCHK
ORA #$20
STA PARCHK ;GET DRIVE2 FLAG &
JMP DELIM2
;
;
ON2 JSR ON
JMP DELIM2
UNIT2 JSR UNIT ;DO UNIT# PARSING
JMP DELIM2
;
;
NAME2 LDA PARCHK
AND #2 ;NAME2 ALLOWED ONLY ONCE
JSR NEWNAM
STA FNLEN2
STX FNADR2
STY FNADR2+1
LDA PARCHK
ORA #2 ;SET FILENAME2 FLAG &
STA PARCHK
;CONTINUE
;
DELIM2 JSR CHRGOT
BEQ DONE ;DONE ON <CR>/<:>
CMP #',
BEQ PARSE2
CMP #ONTK ;"ON" TOKEN
BEQ ON2
CMP #'U
BEQ UNIT2
SNER3 JMP SNERR ;ERROR
;
;
DONE LDA PARCHK ;LOAD PARSER CHK
RTS ;BYTE FOR CALLING PROG TO CHECK
;
;***************************************
;* DOSPAR SUPPORT ROUTINES *
;***************************************
;
;
QTYERR LDX #ERRFC
JMP ERROR; "ILLEGAL QUANTITY"
;
;
ON JSR CHRGET
CMP #'U
BNE SNER3 ;NXT CHR MUST BE "U"
UNIT JSR GETVAL
CPX #32
BCS QTYERR ;ERROR IF >31
CPX #3
BCC QTYERR ;ERROR IF <3
STX FA
LDA PARCHK
ORA #8
STA PARCHK ;SET UNIT# FLAG
RTS
;
;
NEWNAM BNE SNER3
JSR FRMEVL
JSR FRESTR
TAX ;SAVE LENGTH IN .X
CMP #0
BEQ QTYERR ;0 LENGTH NOT ALLOWED
CMP #18
BCS ERRLEN
LDY #0
LDA (INDEX1)Y
CMP #'@
BNE LENCHK
LDA PARCHK
AND #$80 ;IF T => SNERR
BEQ NXXT5
JMP SNERR
LENCHK TXA
CMP #17 ;"STRING TOO LONG ?
BCS ERRLEN
JMP NXX5
ERRLEN LDX #ERRLS
JMP ERROR ;"STRING TOO LONG"
NXXT5 LDA PARCHK
ORA #$80 ;SET "@" FLAG
STA PARCHK
NEXT5 TXA ;.A = FNLEN NOW
NXX5 LDX INDEX1
LDY INDEX1+1
RTS
;
;
GETVAL ;GET NEXTVALUE ROUTINE
JSR CHRGET ;GET NXT CHR
GTVL2 BNE CONT
JMP SNERR ;CANT BE <CR>/<:>
CONT BCC NUMERC ;CAN BE NUMERIC
JSR CHKOPN ;OR A "("
JSR GETBYT ;ANYTHING ELSE IS AN ERROR
JMP CHKCLS ;NEED CLOSING ")"
NUMERC JMP GETBYT ;EVALUATE IT
;
CKSUMD .BYT 0 ; D-PAGE CHECKSUM BYT
;
PATCH5 STA SATUS
STA (DSDESC+1)Y
DEY
RTS
;
SIGNON .BYT '*** COMMODORE BASIC 4.0 ***'
.BYT 13,13,0
;
.FILE OA1SRC