-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparams.aii
494 lines (369 loc) · 5.53 KB
/
params.aii
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
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
string asis
include 'gsos.equ'
include 'minix.equ'
include 'records.equ'
include 'fst.equ'
include 'fst.macros'
include 'M16.MiscTool'
;
; routines used to store data in parameter blocks
;
; input:
; x - must be preserved.
; y - offset in param_blk_ptr to store the value.
;
; outputs:
; x - must be preserved.
; set tool_error if error.
;
import disk_inode:v1_inode
import disk_super:v1_super
do_ignore proc export
rts
endp
do_file_sys_id proc export
with dp
with fst_parms
lda #fst_id
sta [param_blk_ptr],y
rts
endp
; assumes disk_inode is valid.
do_storage_type proc export
with dp,fst_parms
phx ; save
lda disk_inode.mode
; check for directory. GS/OS doesn't have concepts for other types (yet).
and #S_IFMT ; $f000
xba
lsr a
lsr a
lsr a
tax
jmp (table,x)
table
dc.w unknown
dc.w fifo
dc.w chr
dc.w unknown
dc.w dir
dc.w unknown
dc.w blk
dc.w unknown
dc.w reg
dc.w unknown
dc.w lnk
dc.w unknown
dc.w sock
dc.w unknown
dc.w wht
dc.w unknown
unknown
lda #0
bra store
fifo:
chr:
blk:
lnk:
sock:
wht:
lda disk_inode.mode
and #S_IFMT
bra store
dir
; todo -- $d is for subdirectories. $f is for the volume root (inode 1)
; (however, we could have hard link to inode 1 which is not the root!)
lda inode
cmp #1
beq @root_dir
lda #$0d
bra store
@root_dir
lda #$0f
bra store
reg
lda #1 ; could base it on size but whatever!
; drop through
store
plx ; restore
sta [param_blk_ptr],y
rts
endp
; assume disk_inode is valid.
do_file_type proc export
with dp,fst_parms
lda disk_inode.mode
and #S_IFMT
cmp #S_IFREG
beq reg
cmp #S_IFDIR
beq dir
unknown
lda #$00
bra store
dir
lda #$0f
bra store
reg
lda #$06 ; binary
bra store
store
sta [param_blk_ptr],y
rts
endp
do_aux_type proc export
with dp,fst_parms
; chr and blk -- return the device type.
lda disk_inode.mode
and #S_IFMT
cmp #S_IFCHR
beq chr
cmp #S_IFBLK
beq blk
lda #0
sta [param_blk_ptr],y
iny
iny
sta [param_blk_ptr],y
rts
chr
blk
lda disk_inode.zone
sta [param_blk_ptr],y
iny
iny
lda #0
sta [param_blk_ptr],y
rts
endp
; assumes disk_inode is valid.
do_eof proc export
with dp,fst_parms
lda disk_inode.size
sta [param_blk_ptr],y
iny
iny
lda disk_inode.size+2
sta [param_blk_ptr],y
rts
endp
; file blocks, not disk blocks.
do_blocks proc export
with dp,fst_parms
with v1
; minix supports sparse blocks. Just guess based on size...
; size + 1023
lda disk_inode.size
clc
adc #1023
sta tmp
lda disk_inode.size+2
adc #0
sta tmp+2
; divided by 256
lda tmp+1
sta tmp
lda tmp+3
and #$00ff
sta tmp+2
; divide by 4
lsr a
ror tmp
lsr a
ror tmp
sta tmp+2
lda tmp
sta [param_blk_ptr],y
iny
iny
lda tmp+2
sta [param_blk_ptr],y
rts
tmp ds.l 1
ds.b 1
endp
do_r_eof proc export
with dp,fst_parms
export do_r_blocks
do_r_blocks
lda #0
sta [param_blk_ptr],y
iny
iny
sta [param_blk_ptr],y
rts
endp
do_option_list proc export
with dp,fst_parms
; if the option list is present, store my fst id.
lda [param_blk_ptr],y
sta ptr
iny
iny
lda [param_blk_ptr],y
sta ptr+2
ora ptr
beq exit
; check if the option list ptr is large enough.
lda [ptr]
cmp #4
bcc pre
; store the size of the option list.
ldy #2
lda #2
sta [ptr],y
lda [ptr]
cmp #6
bcc bts
bra ok
; less than 4 is a parm range error.
; less than the necessary option list size is a buf_too_small error.
; (but store the space required)
pre
lda #parm_range_err
sta tool_error
bra exit
bts
lda #buff_too_small
sta tool_error
bra exit
ok
ldy #4
lda #fst_id
sta [ptr],y
exit
rts
endp
do_create_date_time_0 proc export
with fst_parms
export do_mod_date_time_0
do_mod_date_time_0
with fst_parms
; minix has mod date but not create date.
; check if valid
lda disk_inode.mtime
ora disk_inode.mtime+2
beq null
phx ; save
phy ; save
pha ; result space
pha
pea 4 ; convert from seconds to ProDOS date/time.
; seconds + 0x7be5 1700 to convert from 1970 to 1904 ???
;
;
; 86400 * (365 * (1970 - 1904) + 17) [17 leap years]
; $7c25b080
;
lda disk_inode.mtime
clc
adc #$b080
tax
lda disk_inode.mtime+2
adc #$7c25
pha
phx
; date ptr
pea buffer>>16
pea buffer
_ConvSeconds
pla
pla
ply
lda buffer
sta [param_blk_ptr],y
iny
iny
lda buffer+2
sta [param_blk_ptr],y
plx
rts
null
lda #0
sta [param_blk_ptr],y
iny
iny
sta [param_blk_ptr],y
iny
iny
sta [param_blk_ptr],y
iny
iny
sta [param_blk_ptr],y
rts
; ConvSeconds needs an 8-byte buffer, even when the output is < 8
; bytes....
buffer ds.b 8
endp
do_create_date_time proc export
with fst_parms
export do_mod_date_time
do_mod_date_time
; minix has mod date but not create date.
; check if valid
lda disk_inode.mtime
ora disk_inode.mtime+2
beq null
phx ; save
pha ; result space
pha
pea 0 ; convert from seconds to read time hex.
; seconds + 0x7be5 1700 to convert from 1970 to 1904 ???
;
;
; 86400 * (365 * (1970 - 1904) + 17) [17 leap years]
; $7c25b080
;
lda disk_inode.mtime
clc
adc #$b080
tax
lda disk_inode.mtime+2
adc #$7c25
pha
phx
; date ptr
tya
clc
adc param_blk_ptr
tax
lda #0
adc param_blk_ptr+2
pha
phx
_ConvSeconds
pla
pla
plx
rts
null
lda #0
sta [param_blk_ptr],y
iny
iny
sta [param_blk_ptr],y
iny
iny
sta [param_blk_ptr],y
iny
iny
sta [param_blk_ptr],y
rts
endp
;
; fcr-based items.
;
do_refnum proc export
with fst_parms, dp
lda [<my_fcr]
sta [<param_blk_ptr],y
rts
endp
do_access proc export
with dp,fst_parms
lda disk_inode.mode
lda #$c3 ; ehh
sta [param_blk_ptr],y
rts
endp
end