;**************************************************************
;以下几段为84I9_PROG编程内部操作模块
;**************************************************************
;示例---在指定的扇区内依次写入00H-7FH共128个序列数据
;RR10---写入的扇区地址起始
;--------------------------------------------------------
PROGRAM_84I9_SECTOR:
        PUSH R11
        PUSH R0
   
        ;要写入新数据前必须进行扇区擦除
        CALL ERASE_84I9_SECTOR
        CALL START_84I9_PROG
        
        ;设置写入起始地址为指定扇区的最低地址
        CP R11,#80H
        JR ULT,SET_00H
        LD R11,#80H
        JR WB_ST
SET_00H:
        LD R11,#00H
WB_ST:
        LD R0,#00H
WB_LOOP:
        LDC @RR10,R0
        INC R11
        INC R0
        CP R0,#7FH
        JR ULE,WB_LOOP
        
        ;编程停止
        CALL END_84I9_PROG
        
        POP R0
        POP R11
        RET
;------------------------------------------------------
;擦除芯片内一个SECTOR
;RR10--要擦除的SECTOR地址高低位
;注意: 每个扇区被定义为(00H-7FH和80H-FFH)128个字节
;每个256字节段被分为2个扇区,由FMSECL的值来区分是高位和低位扇区
;若00H<=FMSECL<=7FH,则擦除低位扇区
;若80H<=FMSECL<=FFH,则擦除低位扇区
ERASE_84I9_SECTOR:
        SB1
        LD FMSECH,R10
        LD FMSECL,R11
        LD FMUSR,#0A5H
        LD FMCON,#0A1H
        LD BTCON,#0A0H
REPEAT:
        LD FMCON,#10100001B
        NOP
        NOP
        TM FMCON,#4
        JR NZ,REPEAT ;检测擦除成功否?
        
        LD FMUSR,#00H
        SB0
        RET
;-------------------------------------------------------
;扇区写功能启动初始化
;RR10---要写入的扇区地址起始
START_84I9_PROG:
        SB1
        LD FMSECH,R10
        LD FMSECL,R11
        LD FMUSR,#0A5H
        LD FMCON,#51H
        SB0
        RET
;-------------------------------------------------------
;编程结束
END_84I9_PROG:
        SB1
        AND FMCON,#0FEH
        LD FMUSR,#00H
        SB0
        RET
;*****************************************************************