📄 tool.asm
字号:
; ***************************************************************************
; * Project : Electronic Dictionary *
; * Date : 2003.9 *
; * File Name : TOOL.ASM *
; ***************************************************************************
pw 128
case off
externs on
include st2202.def ;; Include ST2100 I/O define.
include Data.def ;; Data RAM define.
include graphics.h
include Bios.h
public ImportantJob
public ToolBank
public DealInputBuffToSave
public FillFillInputBuff
public ReadSecretCodeToBuff
Temp1 equ CData+3
INSLBak equ CData+4
INSHBak equ CData+5
MinOffset equ CData+6
DataBank equ CData+7
Temp2 equ CData+8
FileStru equ CData+9
DirFlag equ CData+9
FileClas equ CData+10
FileName1 equ CData+11
FileName2 equ CData+12
FileLenL equ CData+13
FileLenH equ CData+14
FileSec equ CData+15
FileOff equ CData+16
TempI equ CData+17
TempII equ CData+18
WriFlag equ CData+19
SectorBak equ CData+20
;Minu3 equ 0b4h ;have defined in bios
DS0 .SECTION ;; Program ROM location 0080h
FdataToInputBPos:
db 0,1,2,3,6,7,8,9
db 12,13,14,15,18,19,20,21
db 24,25,26,27,30,31,32,33
db 36,37,38,39,42,43,44,45
db 48,49,50,51,54,55,56,57
db 60,61,61,63,66,67,68,69
db 72,73,74,75,78,79,80,81
PS2 .SECTION ;; Program ROM location 0080h
BANKNO EQU ToolBank
;;[s]--------------------------------------[s]
;; Search One File Had Been Deleted
;;Input:No
;;Output:C
;;{if(c=1) Found DeletedFile Output FileStru;;
;;else Not Found Deleted file;;}
;;[s]--------------------------------------[s]
ToFindDelFile:
lda #DirAddrH
sta <INSH
lda #DirAddrL
sta <INSL
lda #FlashBank
sta <DRR
NextDirStruct:
lda (<INS) ;;
and #00000010b ;;02-3-22 10:56 su
;;cmp #1 ;;if (ins==1)文件已被删除
beq FindOne ;;
lda <INSL
clc
adc #8
sta <INSL
lda <INSH
adc #0
sta <INSH
cmp #FatEndPointH ;0b0h
bcc NextDirStruct
clc
rts
FindOne:
ldy #0
FindOne_0:
lda (<INS),y
sta FileStru,y ;;读目录结构到FileStru
iny
cpy #8
bcc FindOne_0
rts
;;[s]----------------------------------------[s]
;; 寻找同一扇区最靠近删除文件的文件
;;INPUT:1.FILESEC,2.FILEOFF
;;Output:1.MinOffset,2.SectorBak
;;[s]----------------------------------------[s]
SearchMinOffset:
lda <FileOff
sta <MinOffset
lda #DirAddrH
sta <INSH
lda #DirAddrL
sta <INSL
lda #FlashBank
sta <DRR
ldy <FileSec ;;File SectorNo
?2: lda $8010,y
bpl ?1
iny
bra ?2
?1: sty <SectorBak ;;>4k,the last SectorNo waiting to deal
;;FileSec <= SectorBak
SMO_0:
lda (<INS)
cmp #0ffh
beq SMO_2
ldy #6
lda (<INS),y
;;cmp <FileSec
cmp <SectorBak
bne SMO_2 ;;须一定在同一扇区
ldy #7
lda (<INS),y
cmp <FileOff
bcc SMO_2 ;;须一定在已删文件的后面
beq SMO_2 ;;须一定在已删文件的后面
lda <MinOffset
cmp <FileOff
bne SMO_1
ldy #7
lda (<INS),y
sta <MinOffset
bra SMO_2
SMO_1:
lda (<INS),y
cmp <MinOffset
bcs SMO_2
sta <MinOffset ;;一定要最小的
SMO_2:
lda <INSL
clc
adc #8
sta <INSL
lda <INSH
adc #0
sta <INSH
cmp #FatEndPointH ;0b0h
bcc SMO_0
rts
;;[s]----------------------------------------[s]
;; 擦除FLASH DATA区的已删除文件
;;INPUT:1.SectorBak,2.FileOff,3.MinOffset
;;Output:Data In Flash
;;[s]----------------------------------------[s]
;;Input: SectorNo
RefreshTheRightSector:
jsr LJSR
dw RemarkBank
dw EraseFlashBuffor-1
lda #0b0h
sta <INDH
stz <INDL
;;lda <FileSec ;;
lda <SectorBak
lsr ;;
lsr ;;
lsr ;;
clc ;;
adc #FlashBank ;;
;;sta <DRR ;;<DRR=SectorNo/8 + FlashBank
sta <DataBank
;; lda #FlashBank
;; sta <DRR
;; ldy <FileSec ;;
;;?1:
;; lda $8010,y
;; bpl NormalFile
;; iny
;; bra ?1
;;NormalFile:
;;lda <FileSec ;;
lda <SectorBak
and #00000111b ;;a=a%8
asl
asl
asl
asl ;;高位*10H
ora #80h
sta <INSH
clc
adc #10h
sta <INSHBak ;;Next SectorNo
stz <INSL ;;
stz <Temp1
stz <Temp2
RTRS_0:
lda <Temp1
cmp <FileOff
bne RTRS_1 ;;IS DATA SHOULD BE SAVED
lda <MinOffset
cmp <FileOff
beq RTRS_4 ;;IS DATA SHOULD BE SAVED
;;FileOff <= 应该删除的数据 >MinOffSet
;;以下为计算下一文件的首地址
stz <INSL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lda <INSH
and #0f0h
sta <INSH
lda <MinOffset
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
asl
asl
rol <INSL
asl
rol <INSL
asl
rol <INSL
asl
rol <INSL
;; asl
;; rol <INSL ;;
pha
lda <INSL ;;
ora <INSH ;;(INSH,INSL)=SectorOff*32+(SectorNo%8)*1000h
ora #80h ;; +8000h
sta <INSH ;;
pla ;;
sta <INSL ;;
RTRS_1: ;;备份数据
lda <DataBank
sta <DRR
lda (<INS)
tax
lda #FlashBank
sta <DRR
WriteByte_X
inc <INSL
bne RTRS_2
inc <INSH
RTRS_2:
lda <INSH
cmp <INSHBak
beq RTRS_4
inc <Temp2
lda <Temp2
cmp #32 ;;每块字节数=32
bcc RTRS_1
stz <Temp2
inc <Temp1
RTRS_3:
bra RTRS_0
RTRS_4: ;;4K内该备份的数据已备份完毕
lda <DataBank
sta <DRR
lda <INSHBak
sec
sbc #10h
sta <INDH
;; lda #10h
;; sta <INDL
stz <INDL
jsr LJSR
dw biosbank
dw SectorErase-1
stz <INSL
lda #0b0h
sta <INSH
RTRS_5:
lda #FlashBank
sta <DRR
lda (<INS)
tax
lda <DataBank ;;
sta <DRR ;;
WriteByte_X
inc <INSL
bne RTRS_5
inc <INSH
lda <INSH
cmp #0c0h
bcc RTRS_5
rts
;;********************************************************
;;Input: SectorNo, SectorOff
;;[s]-----------------------------------------------[s]
;;改写DIR、FAT,同时把大于4K的已删除文件的FLASHDATA 区清掉
;;Input:1.SectorNo(FileSec,SectorBak)
;; 2.FileOff,3.FileLenH&L
;;OutPut:DATA
;;[s]-----------------------------------------------[s]
DoTheDeletedFile:
lda #80h
sta <INSH
stz <INSL
lda #FlashBank
sta <DRR
;stz <TempII
jsr LJSR
dw RemarkBank
dw Read1kDataToRam-1
jsr LJSR
dw RemarkBank
dw EraseFlashBuffor-1
lda #>FData
sta <INSH
;;lda #10h ;;????
lda #FatAddrL ;;02-3-25 13:40 su
sta <INSL
ldy <FileSec
lda <FileLenL
sta <TempI
lda <FileLenH
lsr
ror <TempI
lsr
ror <TempI
lsr
ror <TempI
lsr
ror <TempI
lsr
ror <TempI
;; lsr
;; ror <TempI
inc <TempI
lda <TempI
cmp #128 ;;每扇区块数=128 4k=32*128
bne DTDF_0x
lda #0ffh
sta (<INS),y
bra DTDF_2
DTDF_0x:
and #07fh
sta <TempI
DTDF_0:
lda (<INS),y
;;bpl NextCluseter
bmi NextCluseter ;;>4k
cmp #0 ;;#0fdh
beq DTDF_1 ;;<4k且此扇区已用完
clc ;;<4k且此扇区未用完
adc <TempI
cmp #128
bcc DTDF_01 ;;此扇区有别的文件
lda #0ffh ;;肯定等于128,即此扇区无别的文件
DTDF_01:
sta (<INS),y
bra DTDF_2
DTDF_1: ;;<4k且此扇区已用完
lda <TempI
;; clc
;; adc #127
sta (<INS),y
bra DTDF_2
NextCluseter: ;;>4k
and #7fh
tax
lda #0ffh
sta (<INS),y
jsr EraseThisSec
txa
tay
bra DTDF_0
;;---------------
;;---------------
DTDF_2: ;;至此,FAT FLAG 搞定
lda #>FData
sta <INSH
lda #90h
sta <INSL
stz <TempII ;Can Get FlashBuff Addr
lda #1
sta <WriFlag ;To Write Flash When WriFlag[0]=1
DTDF_3:
ldy #6
lda (<INS),y
cmp <FileSec
beq CmpFileoff ;;目录登记项置空
lda <FileSec
cmp <SectorBak
bne ?1
lda (<INS),y
cmp <FileSec
bne DTDF_6
bra cmpfileoff
?1: lda (<INS),y
cmp <SectorBak
bne DTDF_6
cmpfileoff:
ldy #7
lda (<INS),y
cmp <FileOff
bcc DTDF_6
lda #1
sta <WriFlag
lda (<INS),y
cmp <FileOff
beq DTDF_4 ;;why? i cann't understand?
sec
sbc <MinOffset
clc
adc <FileOff
sta (<INS),y ;;a=Sectoroff-(minoffset-FileOff)
bra DTDF_6
DTDF_4: lda #0ffh
ldy #0
DTDF_5:
sta (<INS),y
iny
cpy #8 ;;目录登记项置空
bcc DTDF_5
DTDF_6:
lda <INSL
clc
adc #8
sta <INSL
lda <INSH
adc #0
sta <INSH
;;cmp #0eh ;;02-3-25 15:02 su Del
cmp #(>FData)+4 ;8h ;;02-3-25 15:04 su Add
bcc DTDF_3 ;;In 1k Ram
;;Out of 1k Ram
ldy <TempII
lda FlashBufADD,y
sta <INDH
stz <INDL
jsr LJSR
dw RemarkBank
dw Write1kDataToFlash-1
bbr0 <TempII,DTDF_7
bbr1 <TempII,DTDF_7 ;must = xx11b
bbr0 <WriFlag,DTDF_27
;-----Write FlashBuff to Flash -----
ldy <TempII
lda StartINSH,y
sta <INDH
lda #10h
sta <INDL
jsr LJSR
dw biosbank
dw SectorErase-1
stz <WriFlag
lda StartINSH,y
and #0f0h
sta <INDH
stz <INDL
lda #0b0h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -