- 注册时间
- 2004-11-2
- 最后登录
- 1970-1-1
|
改写了brk $0519(find_inode)中断函数。这个函数用于在整个分配表(大小为34K)中搜索指定文件号的分配表信息
在打开文件、修改文件、列出文件等方面被大量使用,可是原函数效率极为低下
原函数:
brk $0519
长度:292B
搜索整个分配表使用时间:约80ms
占用ram:
除出参和入参外
使用6个零页变量
2048B的缓冲($C000-$C800)和数个在$cc00-$cd00间的临时变量
QIQI重写:
将函数移到brk $060d
现函数:brk $060d
长度:126B
搜索整个分配表时间:约2ms (效率!)
占用ram:除出参和入参外
4个零页变量
无缓冲
改写后的函数:
;其实这个函数还真没什么技术含量,特简单,可是ggv...哈!
ldx #0
lp1:lda find_loc,x
sta NGFFS_BUFFER,x
inx
cpx #7e
bne lp1 ;将跨bank搜索代码复制到bus flash跨页读写的公用buffer
jmp NGFFS_BUFFER ;$0972
find_loc:
lda io_switch_bank ;$00
pha
lda #0
sta nor_block_ptr ;$db
next_block:ldx nor_block_ptr
lda inodebank,x ;$088b
sta io_switch_bank
tax
asl
txa
lda inodeaddr,x ;$089c
sta norbufptr ;$e1
lda inodeaddr+1,x
sta norbufptr+1
lda #0
sta inode_ptr ;$dc
if_not_finish:ldy #$1e
lda (norbufptr),y
cmp #$aa
bne not_empty
iny
lda (norbufptr),y
cmp #$aa
bne not_empty
go_next_block:inc nor_block_ptr ;如果该inode偏移1eH为AAAA说明该块以下为空,继续下一块
lda nor_block_ptr
cmp #17 ;若块数大于17,搜索结束
bcs end_fail
jmp next_block
not_empty:ldy #0
lda (norbufptr),y
cmp inodenum ;$093f
bne next_inode
iny
lda (norbufptr),y
cmp inodenum+1
bne next_inode ;比较是否是要搜索的inode序号
ldy #04
lda (norbufptr),y
and #$e0
cmp filestate ;检查是否为要搜索的状态
bne next_inode
lda nor_block_ptr
sta inodeslot ;$093d
lda inode_ptr
sta inodeslot+1 ;全部符合则把所在block和inode位置保存到出参
clc
pla
sta io_switch_bank
rts
next_inode:
lda norbufptr
clc
adc #$20 ;inode每个长度#$20
sta norbufptr
bcc pj1
inc norbufptr+1
pj1:inc inode_ptr
lda inode_ptr
cmp #$40 ;每个block有40h个inode
bne if_not_finish
jmp go_next_block ;40h个inode比较完后转到下个block
end_fail:
sec
pla
sta io_switch
rts
这段代码能直接输入吗?
在哪里输入?
|
|