| 
 
注册时间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的代码,请各位高手确任一下它们是干什么用的,须不须要修改.(这两天要考试,没时间玩星星)
 
 | 
 |