-
Notifications
You must be signed in to change notification settings - Fork 82
/
hdlookup
394 lines (394 loc) · 7.33 KB
/
hdlookup
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
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
;OPTSCH OPTIMAL SEARCH FOR LOOKUP
; AND FNDFIL
.SKIP
OPTSCH LDA #0 ;DETERMINE OPTIMAL SEARCH
STA TEMP ;INIT DRIVE MASK
STA DRVFLG
PHA
LDX F2CNT
OS10 PLA
ORA TEMP
PHA
LDA #1
STA TEMP
DEX
BMI OS30
LDA FILDRV,X
BPL OS15 ;BR IF SPECIFIC DRIVE
ASL TEMP ;ELSE A REQ FOR EITHER
ASL TEMP
.SKIP
OS15 LSR A
BCC OS10
ASL TEMP
BNE OS10 ;(BRANCH)
.SKIP
OS30 PLA
TAX
STA TEMP ;SAVE ORIG CALC
LDA SCHTBL-1,X
PHA
AND #3
STA DRVCNT
PLA
ASL A
BPL OS40
LDA FILDRV
OS35 AND #1
PHA ;SAVE BEG DRIVE #
LDA #0
STA DRVNUM ;START AT DR 0
LDA #1 ;CHK IF DRIVE 0 SPECIFICALLY
BIT TEMP ;*
BEQ OS50 ;BR IF NOT SPECIFIC
JSR TRDY ;TEST IF DRIVE READY
BEQ OS50 ;BR IF DRIVE READY
OS51
LDA #DNRDY ;DRIVE NOT READY
JSR CMDERR ;GIVE THE ERROR
OS50
INC DRVNUM ;BUMP TO DRIVE 1
LDA #2 ;GET SET TO CHECK DRIVE 1
BIT TEMP ;CHK IT
BEQ OS52 ;BR IF NOT SPECIFIC REQUEST
JSR TRDY ;TEST IF DRIVE 1 READY
BNE OS51 ;BR IF NOT READY
OS52
PLA ;DRIVE #
STA DRVNUM ;*
TAX ;DRIVE #
LDA #$0C ;CHK IF REQ FOR EITHER DRIVE
BIT TEMP ;*
BEQ OX0000 ;EXIT IF NOT
TXA ;DRIVE #
PHA ;SAVE IT
LDX #0 ;START WITH DRIVE 0
STX DRVNUM ;*
STX TEMP ;RESET SWITCH
JSR TRDY ;TEST IF DRIVE 0 READY
BNE OS53 ;BR IF DRIVE 0 NOT RDY
INC TEMP ;BUMP SWITCH
OS53
INC DRVNUM ;DRIVE 1
JSR TRDY ;TEST IF DRIVE 1 IS READY
BNE OS54 ;BR IF NOT READY
CLC ;PREP FOR ADD
LDA TEMP ;SWITCH
ADC #$81 ;INCREMENT AND SET MINUS
STA TEMP ;*
OS54
LDX #0 ;DEFAULT DRIVE
LDA TEMP ;CHK IF ANY READY
BEQ OS51 ;BR IF NEITHER READY
CMP #$82 ;CHK IF BOTH READY
BEQ OS59 ;BR ITS OK
;ELSE ADJUST DRVNUM & COUNT
AND #$80 ;CHK IF DRIVE 1 IS THE RDY ONE
BEQ OS55 ;BR IF IT ISNT
INX ;BUMP TO DRIVE 1
OS55
STX DRVNUM ;DRIVE TO START WITH
LDA #0 ;# DRIVES = 1
STA DRVCNT ;*
PLA ;TOSS BEGINNING DRIVE
RTS ;EXIT
OS59
PLA ;GET DRIVE # TO START
STA DRVNUM ;*
OX0000 RTS ;EXIT
.SKIP
OS40 ROL A
JMP OS35
.SKIP
SCHTBL .BYT 0,$80,$41
.BYT 1,1,1,1
.BYT $81,$81,$81,$81
.BYT $42,$42,$42,$42
.PAGE 'LOOKUP/FNDFIL'
; LOOK UP ALL FILES IN STREAM
; AND FILL TABLES W/ INFO
.SKIP
LOOKUP JSR OPTSCH
LK05 LDA #0
STA DELIND
JSR SRCHST ;START SEARCH
BNE LK25
LK10 DEC DRVCNT
BPL LK15
RTS ;NO MORE DRIVE SEARCHES
LK15 LDA #1 ;TOGGLE DRIVE #
STA DRVFLG
JSR TOGDRV
JMP LK05
LK20 JSR SEARCH ;FIND VALID FN
BEQ LK30 ;END OF SEARCH
LK25 JSR COMPAR ;COMPARE DIR W/ TABLE
LDA FOUND ;FOUND FLAG
BEQ LK26 ;ALL FN'S NOT FOUND, YET
LK27
RTS
.SKIP
LK26
LDA PATFLG ;<HD>
BNE LK27
LDA ENTFND
BMI LK20
BPL LK25
.SKIP
LK30 LDA FOUND
BEQ LK10
RTS
.SKIP 2
; FIND NEXT FILE NAME MATCHING
; ANY FILE IN STREAM & RETURN
; WITH ENTRY FOUND STUFFED INTO
; TABLES
FFRE JSR SRRE ;FIND FILE RE-ENTRY
BEQ FF10
BNE FF25
.SKIP
FF15 LDA #1
STA DRVFLG
JSR TOGDRV
.SKIP
FFST LDA #0 ;FIND FILE START ENTRY
STA DELIND
JSR SRCHST
BNE FF25 ;BR IF ENTRY FOUND
EOR #255 ;<HD> FF => 00
STA FOUND
FF10 LDA FOUND
BNE FF40 ;BR IF MORE TO SEARCH
DEC DRVCNT ;MORE DRIVES TO CHK?
BPL FF15
RTS
.SKIP
FNDFIL JSR SEARCH ;FIND FILE CONTINUOUS...
BEQ FF10 ;... RE-ENTRY, NO CHANNEL ACTIVITY
FF25 JSR COMPAR ;COMPARE FILE NAMES
LDX ENTFND
BPL FF30
LDA FOUND
BEQ FNDFIL
BNE FF40
.SKIP
FF30 LDA TYPFLG
BEQ FF40 ;NO TYPE RESTRICTION
LDA PATTYP,X
AND #TYPMSK
CMP TYPFLG
BNE FNDFIL
FF40 RTS
.PAGE 'LOOKUP-COMPAR'
;COMPARE ALL FILENAMES IN STREAM TABLE
; WITH EACH VALID ENTRY IN THE
; DIRECTORY. MATCHES ARE TABULATED
.SKIP
COMPAR LDX #$FF
STX ENTFND
INX
STX PATFLG
JSR CMPCHK
BEQ CP10
CP02 RTS ;ALL ARE FOUND
.SKIP
CP05 JSR CC10
BNE CP02
CP10 LDA DRVNUM
EOR FILDRV,X
LSR A
BCC CP20 ;RIGHT DRIVE
AND #$40
BEQ CP05 ;NO DEFAULT
LDA #2
CMP DRVCNT
BEQ CP05 ;DON'T USE DEFAULT
.SKIP
CP20 LDA FILTBL,X ;GOOD DRIVE MATCH
TAX
JSR FNDLMT
LDY #3
JMP CP33
CP30
LDA CMDBUF,X
CMP (DIRBUF),Y
BEQ CP32 ;CHRS ARE =
CMP #'?
BNE CP05 ;NO SINGLE PATTERN
LDA (DIRBUF),Y
CMP #$A0
BEQ CP05 ;END OF FILENAME
CP32
INX
INY
CP33
CPX LIMIT
BCS CP34 ;END OF PATTERN
LDA CMDBUF,X
CMP #'* ;STAR MATCHES ALL
BEQ CP40 ;*
BNE CP30 ;KEEP CHECKING
CP34
CPY #19
BCS CP40 ;END OF FILENAME
LDA (DIRBUF),Y
CMP #$A0 ;END OF FILENAME
BNE CP05
.SKIP
CP40 LDX F2PTR ;FILENAMES MATCH
STX ENTFND
LDA PATTYP,X ;STORE INFO IN TABLES
AND #$80
STA PATFLG
LDA INDEX
STA ENTIND,X
LDA SECTOR
STA ENTSEC,X
LDA TRACK ;SAVE THE TRACK <HD>
STA ENTTRK,X ;<HD>
LDY #0
LDA (DIRBUF),Y
INY
PHA
AND #$40
STA TEMP
PLA
AND #$FF-$20 ;<FIX>
BMI CP42
;
ORA #$20
CP42
AND #$27
ORA TEMP
STA TEMP
LDA #$80
AND PATTYP,X
ORA TEMP
STA PATTYP,X
LDA FILDRV,X
AND #$80
ORA DRVNUM
STA FILDRV,X
;
LDA (DIRBUF),Y
STA FILTRK,X
INY
LDA (DIRBUF),Y
STA FILSEC,X
LDA REC
BNE CP50
LDY #21
LDA (DIRBUF)Y
STA REC
CP50
;JMP CMPCHK
;RTS
.SKIP
;CHECK TABLE FOR UNFOUND FILES
.SKIP
CMPCHK LDA #$FF
STA FOUND
LDA F2CNT
STA F2PTR
.SKIP
CC10 DEC F2PTR
BPL CC15
RTS ;TABLE EXHAUSTED
.SKIP
CC15 LDX F2PTR
LDA PATTYP,X
BMI CC20
LDA FILSEC,X ;<HD>
CMP #255 ;<HD>
BNE CC10
CC20 LDA #0
STA FOUND
RTS
.PAGE 'LOOKUP-SEARCH'
;SEARCH DIRECTORY
; RETURNS WITH VALID ENTRY W/ DELIND=0
; OR RETURNS W/ 1ST DELETED ENTRY
; W/ DELIND=1
;
; SRCHST WILL INITIATE A SEARCH
; SEARCH WILL CONTINUE A SEARCH
.SKIP
SRCHST LDY #255 ;<HD> INIT DELTD SECT
STY DELSEC
STY ENTFND
JSR HDLDTS ;GET T&S FOR DIR <HD>
CMP #255 ;CHK IF INIT'D
BNE SR5A ;BR IF OK
LDA #$29 ;DISK ID MISMATCH
JMP CMDERR ;BOMB
SR5A
STA LSTBUF
JSR OPNIRD ;OPEN INTERNAL READ CHNL
.SKIP
SR10 LDA LSTBUF ;LAST BUFFER ?
CMP #255 ;CHK EOL <HD>
BNE SR15
RTS ;(Z=1)
.SKIP
SR15 LDA #7
STA FILCNT
LDA #0 ;READ SECTOR # <HD>
JSR DRDBYT
STA LSTBUF ;UPDATE END FLAG
.SKIP
SR20 JSR GETPNT
DEC FILCNT
LDY #0
LDA (DIRBUF),Y ;READ FILE TYPE
BNE SR30
.SKIP
LDA DELSEC ;DELETED ENTRY FOUND
CMP #255 ;<HD>
BNE SEARCH ;DELETED ENTRY ALREADY FOUND
JSR CURBLK ;GET CURRENT SECTOR
LDA SECTOR
STA DELSEC
LDA TRACK ;SAVE TRACK ALSO <HD>
STA DELTRK ;<HD>
.SKIP
LDA DIRBUF ;GET CURRENT INDEX
LDX DELIND ;BIT1: WANT DELETED ENTRY
STA DELIND
BEQ SEARCH ;NEED VALID ENTRY
RTS ;(Z=0)
.SKIP
SR30 LDX #1
CPX DELIND ;?LOOKING FOR DELETED?
BNE SR50 ; NO!
BEQ SEARCH
.SKIP
SRRE LDA DIRTRK ;GET DIR TRACK <HD>
STA TRACK
LDA DIRSEC
STA SECTOR
JSR OPNIRD
LDA INDEX
JSR SETPNT
.SKIP
SEARCH LDA #$FF
STA ENTFND
LDA FILCNT ;ADJUST FILE COUNT
BMI SR40
LDA #32 ;INCR BY 32
JSR INCPTR
JMP SR20
.SKIP
SR40 JSR NXTBUF ;NEW BUFFER
JMP SR10 ;(BRANCH)
.SKIP
SR50 LDA DIRBUF ;FOUND VALID ENTRY
STA INDEX ;SAVE INDEX
JSR CURBLK ;GET SECTOR
LDA TRACK ;SAVE TRACK ALSO <HD>
STA DIRTRK ;<HD>
LDA SECTOR
STA DIRSEC
CMP #255 ;<HD>
RTS ;(Z=0)
.SKIP
.END