⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tool.asm

📁 辞典 dict3.asm.grammar.asm,newword.asm 学习 learn.asm 名片 userinf.asm 备忘 userinf.asm 提醒 userinf
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; ***************************************************************************
; *     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 + -