mirror of
https://github.com/ksherlock/minix.fst.git
synced 2024-09-27 03:54:39 +00:00
330 lines
3.5 KiB
Plaintext
330 lines
3.5 KiB
Plaintext
|
|
string asis
|
|
|
|
;
|
|
; class 1 only.
|
|
;
|
|
; "Read-only FSTs return an invalidFSTop error ($65)."
|
|
;
|
|
;
|
|
|
|
include 'gsos.equ'
|
|
include 'minix.equ'
|
|
include 'records.equ'
|
|
|
|
include 'fst.equ'
|
|
|
|
include 'fst.macros'
|
|
|
|
include 'M16.Debug'
|
|
|
|
|
|
entry check_name
|
|
entry do_name_flags
|
|
entry do_max_len
|
|
entry do_syntax
|
|
|
|
import do_ignore
|
|
|
|
my_dp record dp.__end
|
|
|
|
name_type ds.w 1
|
|
name ds.l 1
|
|
name_flags ds.w 1
|
|
name_length ds.w 1
|
|
|
|
src ds.l 1
|
|
dest ds.l 1
|
|
|
|
IF *>=$d4 THEN
|
|
AERROR 'dp -- too large.'
|
|
ENDIF
|
|
endr
|
|
|
|
judge_name procname export
|
|
|
|
|
|
with fst_parms, dp, my_dp
|
|
|
|
; class 1 only.
|
|
|
|
check_class
|
|
|
|
lda call_class
|
|
bne @class_ok
|
|
|
|
lda #bad_system_call
|
|
sec
|
|
rtl
|
|
@class_ok
|
|
|
|
stz name_type
|
|
stz name
|
|
stz name+2
|
|
stz name_flags
|
|
|
|
ldy #JudgeNameRecGS.nameType
|
|
lda [param_blk_ptr],y
|
|
sta name_type
|
|
cmp #3+1
|
|
bcc @nt_ok
|
|
lda #parm_range_err
|
|
sec
|
|
rtl
|
|
|
|
@nt_ok
|
|
|
|
; out-of-order handling of nameFlags.
|
|
|
|
lda [param_blk_ptr] ; pCount
|
|
cmp #5
|
|
blt @skipname
|
|
|
|
jsr check_name
|
|
|
|
@skipname
|
|
|
|
|
|
dispatcher
|
|
|
|
lda [param_blk_ptr] ; pcount
|
|
dec a
|
|
asl a ; x 2
|
|
asl a ; x 4
|
|
tax
|
|
dispatch judge_name_dcb_1
|
|
|
|
|
|
lda tool_error
|
|
cmp #1
|
|
rtl
|
|
|
|
|
|
judge_name_dcb_1
|
|
with JudgeNameRecGS
|
|
;dc.w pCount, do_ignore
|
|
dc.w fileSysID, do_ignore
|
|
dc.w nameType, do_ignore
|
|
dc.w syntax, do_syntax
|
|
dc.w maxLen, do_max_len
|
|
dc.w name, do_ignore
|
|
dc.w nameFlags, do_name_flags
|
|
endwith
|
|
|
|
|
|
|
|
endp
|
|
|
|
check_name procname
|
|
|
|
with fst_parms, dp, my_dp
|
|
|
|
|
|
get_name
|
|
ldy #JudgeNameRecGS.name
|
|
lda [param_blk_ptr],y
|
|
sta name
|
|
iny
|
|
iny
|
|
lda [param_blk_ptr],y
|
|
and #$00ff
|
|
sta name+2
|
|
ora name
|
|
bne @ok
|
|
rts
|
|
@ok
|
|
|
|
|
|
; check the output buffer size.
|
|
; although maximum size is 30, we only require a max size of 1
|
|
; (if name was blank)
|
|
|
|
buffsize
|
|
|
|
lda [name]
|
|
cmp #3
|
|
bcc @bts
|
|
cmp #5+1
|
|
bcs @ok
|
|
lda #1
|
|
ldy #2
|
|
sta [name],y
|
|
@bts
|
|
lda #buff_too_small
|
|
sta tool_error
|
|
rts
|
|
@ok
|
|
|
|
|
|
; get the length...
|
|
ldy #2
|
|
lda [name],y
|
|
sta name_length
|
|
|
|
; check for and remove any invalid chars.
|
|
cleanup
|
|
ldx name_length
|
|
bne @ok
|
|
|
|
@null
|
|
; no name -> 'A'
|
|
ldy #2
|
|
lda #1
|
|
sta [name],y
|
|
iny
|
|
iny
|
|
short m
|
|
lda #'A'
|
|
sta [name],y
|
|
long m
|
|
|
|
lda #$2000
|
|
tsb name_flags
|
|
rts
|
|
|
|
@ok
|
|
; x = name length.
|
|
ldy #4
|
|
short m
|
|
@loop
|
|
lda [name],y
|
|
beq @bad
|
|
cmp #':'
|
|
beq @bad
|
|
cmp #'/'
|
|
beq @bad
|
|
bra @next
|
|
@bad
|
|
lda #'.'
|
|
sta [name],y
|
|
lda #$80
|
|
tsb name_flags+1
|
|
@next
|
|
iny
|
|
dex
|
|
bne @loop
|
|
@done
|
|
long m
|
|
|
|
length
|
|
|
|
|
|
lda name_length
|
|
cmp #30+1
|
|
bcs toolong
|
|
rts ; ok!
|
|
|
|
|
|
toolong
|
|
; $4000 - name is too long.
|
|
lda #$4000
|
|
tsb name_flags
|
|
|
|
ldy #2
|
|
lda #30
|
|
sta [name],y
|
|
|
|
; if < 40 chars, first 27 + '...'
|
|
lda name_length
|
|
cmp #40+1
|
|
bcs longlong
|
|
short m
|
|
lda #'.'
|
|
ldy #4+28-1
|
|
sta [name],y
|
|
iny
|
|
sta [name],y
|
|
iny
|
|
sta [name],y
|
|
long m
|
|
rts
|
|
|
|
longlong
|
|
; first 13 chars, ..., last 14 chars
|
|
|
|
|
|
clc
|
|
lda #4+17 ; gsos buffer overhead
|
|
adc name
|
|
sta dest
|
|
lda #0
|
|
adc name+2
|
|
sta dest+2
|
|
|
|
|
|
lda name_length
|
|
sec
|
|
sbc #14-4
|
|
clc
|
|
adc name
|
|
sta src
|
|
lda #0
|
|
adc name+2
|
|
sta src+2
|
|
|
|
|
|
ldy #14-2
|
|
@loop
|
|
lda [src],y
|
|
sta [dest],y
|
|
dey
|
|
dey
|
|
bpl @loop
|
|
|
|
ldy #4+14
|
|
short m
|
|
lda #'.'
|
|
sta [name],y
|
|
iny
|
|
sta [name],y
|
|
iny
|
|
sta [name],y
|
|
iny
|
|
long m
|
|
|
|
rts
|
|
|
|
endp
|
|
|
|
|
|
do_name_flags procname
|
|
with fst_parms, my_dp
|
|
|
|
lda name_flags
|
|
sta [param_blk_ptr],y
|
|
rts
|
|
endp
|
|
|
|
do_max_len proc
|
|
|
|
with fst_parms
|
|
|
|
lda #30
|
|
sta [param_blk_ptr],y
|
|
rts
|
|
|
|
endp
|
|
|
|
do_syntax procname
|
|
with fst_parms
|
|
|
|
lda #syntax_str
|
|
sta [param_blk_ptr],y
|
|
iny
|
|
iny
|
|
lda #^syntax_str
|
|
sta [param_blk_ptr],y
|
|
rts
|
|
|
|
syntax_str
|
|
dc.b ss_end-*
|
|
dc.b 'Minix names may contain any character except a colon (:), '
|
|
dc.b 'forward slash (/) and null. File names may be up to 30 '
|
|
dc.b 'characters long.'
|
|
ss_end equ *
|
|
|
|
endp
|
|
|
|
|
|
end
|