- 注册时间
- 2004-12-25
- 最后登录
- 1970-1-1
|
极速内核提速原理
改写了brk $0519(find_inode)中断函数
这个函数用于在整个分配表(大小为34K)中搜索指定文件号的分配表信息
在打开文件、修改文件、列出文件等方面被大量使用,可是原函数效率极为低下
原函数:
brk $0519
长度:292B
搜索整个分配表用时:约80ms
占用ram:
除出参和入参外
使用6个零页变量
2048B的缓冲($C000-$C800)和数个在$cc00-$cd00间的临时变量
QIQI重写:
将函数移到brk $060d
现函数:
brk $060d
长度:
127B
搜索整个分配表时间:约2ms
占用ram:除出参和入参外
4个零页变量
无缓冲
改写后的函数:
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
txa
asl
tax
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 ;$0949检查是否为要搜索的状态
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
改中断BRK $0519为 BRK $060D
A960: LDX #$00
A962: LDA $A970,X
A965: STA $0972,X
A968: INX
A969: CPX #$7F
A96B: BNE $A962
A96D: JMP $0972
0972: LDA $00
0974: PHA
0975: LDA #$00
0977: STA $DB
0979: LDX $DB
097B: LDA $088B,X
097E: STA $00
0980: TXA
0981: ASL
0982: TAX
0983: LDA $089C,X
0986: STA $E1
0988: LDA $089D,X
098B: STA $E2
098D: LDA #$00
098F: STA $DC
0991: LDY #$1E
0993: LDA ($E1),Y
0995: CMP #$AA
0997: BNE $09AB
0999: INY
099A: LDA ($E1),Y
099C: CMP #$AA
099E: BNE $09AB
09A0: INC $DB
09A2: LDA $DB
09A4: CMP #$11
09A6: BCS $09EC
09A8: JMP $0979
09AB: LDY #$00
09AD: LDA ($E1),Y
09AF: CMP $093F
09B2: BNE $09D6
09B4: INY
09B5: LDA ($E1),Y
09B7: CMP $0940
09BA: BNE $09D6
09BC: LDY #$04
09BE: LDA ($E1),Y
09C0: AND #$E0
09C2: CMP $0949
09C5: BNE $09D6
09C7: LDA $DB
09C9: STA $093D
09CC: LDA $DC
09CE: STA $093E
09D1: CLC
09D2: PLA
09D3: STA $00
09D5: RTS
09D6: LDA $E1
09D8: CLC
09D9: ADC #$20
09DB: STA $E1
09DD: BCC $09E1
09DF: INC $E2
09E1: INC $DC
09E3: LDA $DC
09E5: CMP #$40
09E7: BNE $0991
09E9: JMP $09A0
09EC: SEC
09ED: PLA
09EE: STA $00
09F0: RTS
06页:
A960-A200 BD70 A99D 7209
A968-E8E0 7FD0 F54C 7209
A970-A500 48A9 0085 DBA6
A978-DBBD 8B08 8500 8A0A
A980-AABD 9C08 85E1 BD9D
A988-0885 E2A9 0085 DCA0
A990-1EB1 E1C9 AAD0 12C8
A998-B1E1 C9AA D00B E6DB
A9A0-A5DB C911 B044 4C79
A9A8-09A0 00B1 E1CD 3F09
A9B0-D022 C8B1 E1CD 4009
A9B8-D01A A004 B1E1 29E0
A9C0-CD49 09D0 0FA5 DB8D
A9C8-3D09 A5DC 8D3E 0918
A9D0-6885 0060 A5E1 1869
A9D8-2085 E190 02E6 E2E6
A9E0-DCA5 DCC9 40D0 A84C
A9E8-A009 3868 8500 60FF
以上就是QIQI的高速内核了,好像只要改05页$6c68就可加速了,但我发现BRK $0520 和05页的一个子程序(入口$6b37)也有类似原brk $0519的代码,请各位高手确任一下它们是干什么用的,须不须要修改.(这两天要考试,没时间玩星星)
|
|