From 73577feb81cda8a0c22cff745e67eb3757d2510f Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Tue, 1 Sep 2015 15:07:53 -0400 Subject: [PATCH] JudgeName support. Not that we can actually write, yet... --- Makefile | 2 +- judge_name.aii | 329 +++++++++++++++++++++++++++++++++++++++++++++++++ stubs.aii | 1 - 3 files changed, 330 insertions(+), 2 deletions(-) create mode 100644 judge_name.aii diff --git a/Makefile b/Makefile index a78699b..e095b7c 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/judge_name.aii b/judge_name.aii new file mode 100644 index 0000000..e76bb83 --- /dev/null +++ b/judge_name.aii @@ -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 diff --git a/stubs.aii b/stubs.aii index 5d23cbf..fda8520 100644 --- a/stubs.aii +++ b/stubs.aii @@ -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