JudgeName support. Not that we can actually write, yet...

This commit is contained in:
Kelvin Sherlock 2015-09-01 15:07:53 -04:00
parent 5c841816d9
commit 73577feb81
3 changed files with 330 additions and 2 deletions

View File

@ -2,7 +2,7 @@
SOURCES = main.aii volume.aii get_file_info.aii \
open.aii get_dir_entry.aii get_mark.aii set_mark.aii get_eof.aii \
close.aii read.aii flush.aii \
close.aii read.aii flush.aii judge_name.aii \
id_disk.aii stubs.aii tables.aii device.aii params.aii globals.aii \
debug.aii

329
judge_name.aii Normal file
View File

@ -0,0 +1,329 @@
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

View File

@ -10,7 +10,6 @@ stubs proc
export erase_disk
export format
export get_dev_num
export judge_name
export set_eof
export set_file_info
export write