;[GeneralFun.asm]通用子程序-------------------------------*
;本文件包含:                                              *
;    (1)DelayHX:延时约为HX*1000时钟周期(T)                *
;---------------------------------------------------------*
 
     INCLUDE 'MC9S08AW60.inc' 
 
;外部引用变量     
    XREF  dataLen
    XREF  dataBuffer 
    XREF  PGMInRAM
                         
;Flash擦写程序
 PGM:    FCB $87,$c6,$18,$25,$a5,$10,$27,$08,$c6,$18
 PGM1:   FCB $25,$aa,$10,$c7,$18,$25,$9e,$e6,$01,$f7
 PGM2:   FCB $a6,$40,$c7,$18,$26,$45,$18,$25,$f6,$aa
 PGM3:   FCB $80,$f7,$9d,$9d,$9d,$9d,$c6,$18,$25,$a5
 PGM4:   FCB $30,$27,$04,$a6,$01,$8A,$81,$c6,$18,$25
 PGM5:   FCB $a5,$40,$27,$f9,$4f,$8A,$81


    XDEF  FlashInit             ;Flash初始化
    XDEF  ErasePage             ;页擦除
    XDEF  WriteFlash            ;写入
 
;FlashInit:Flash初始化------------------------------------*
;功能:对Flash进行初始化，设置FCLK=200kHz                  *
;入口:无                                                  *
;出口:无                                                  *
;堆栈深度:2 + 1 = 3                                       *
;---------------------------------------------------------*
FlashInit:
    PSHA
    LDA  #$FF
    STA  FPROT
    LDA  #$76
    STA  FCDIV ;(FCLK)=200kHz(总线频率fBUS＝20MHz)
    PULA
  RTS
   
;ErasePage:Flash页擦除------------------------------------*
;功能:对Flash指定页进行擦除                               *
;入口:H:X=页中的任意地址                                  *
;出口:无                                                  *
;堆栈深度:2 + 3 = 5                                       *
;---------------------------------------------------------*   
ErasePage: 
        PSHH
        PSHX       
        ;将擦除程序PGM复制到内存PGMInRAM中
        LDA  #57          ;共57字节
        LDHX #0
Erase_Copy:
       PSHA
       LDA   PGM,X
       STA   PGMInRAM,X
       PULA
       INCX  
       DBNZA Erase_Copy 
       
       ;页擦除操作
       LDHX #21
       LDA  #$40        ;指定页擦除指令
       STA  PGMInRAM,X 
       
       LDA  #$31        ;给写入数据赋初值
       PULX
       PULH             ;擦除页地址
       JSR  PGMInRAM    ;调用擦除        
    RTS   

;WriteFlash:Flash写入程序---------------------------------*
;功能:对Flash指定页写入指定字节                           *
;入口:H:X       = 页地址                                  *
;     dataBuffer= 待写入数据字节                          *      
;     dataLen   = 待写入数据的字节个数                    *
;出口:无                                                  *
;堆栈深度:2 + 3 + 4 + 3 = 12                              *
;---------------------------------------------------------* 
WriteFlash:
        PSHA
        PSHX
        PSHH         ;写入地址入栈 
        AIS   #-4    ;临时变量空间
        
        ;将擦除程序PGM复制到内存PGMInRAM中
        LDA  #57     ;共57字节数据
        LDHX #0
Write_Copy:
       PSHA
       LDA   PGM,X
       STA   PGMInRAM,X
       PULA
       INCX  
       DBNZA Write_Copy 
       
       ;指定操作指令为写指令
       LDHX #21
       LDA  #$20       ;写入指令
       STA  PGMInRAM,X ;
       
       ;循环写入数据字节
       ;存放待写入的字节数
       LDA  dataLen
       STA  1,SP          ;待写入字节个数的高字节
       LDA  dataLen+1
       STA  2,SP          ;待写入字节个数的低字节
       ;存放待写入数据的数组下标指针  
       LDA  #0
       STA  3,SP          ;待写入数据数组的下标指针高字节
       LDA  #0
       STA  4,SP          ;待写入数据数组的下标指针低字节
Write_Bytes:
       ;取数据
       LDX   3,SP
       PSHX
       PULH               ;取数据数组下标指针高字节
       LDX   4,SP         ;取数据数组下标指针低字节
       LDA   dataBuffer,X ;取得数据=>A
      
       ;数据数组下标指针+1
       PSHA
       LDA  #1
       ADD  5,SP  ;数据指针低字节+1
       STA  5,SP
       LDA  #0
       ADC  4,SP
       STA  4,SP  ;数据指针高字节+C
       PULA
       
       ;取Flash写入地址
       LDX   5,SP  ;Flash写入地址的高字节
       PSHX
       PULH
       LDX   6,SP  ;Flash写入地址的低字节
       
       ;Flash地址+1 
       PSHH          ;H => 栈
       PSHX          ;X => 栈
       PSHA          ;A => 栈
       LDA  #1       ;
       ADD  9,SP 
       STA  9,SP     ;Flash地址低字节+1
       
       LDA  #0       ;
       ADC  8,SP
       STA  8,SP     ;Flash地址高字节+C
       PULA          ;A <= 栈
       PULX          ;X <= 栈
       PULH          ;H <= 栈
       
       JSR   PGMInRAM ;调用写入程序
      
       LDX   1,SP
       PSHX
       PULH
       LDX   2,SP    ;计数器(待写入的字节个数)=>H:X
       CPHX  3,SP    ;(H:X)-(SP+3)
       BPL   Write_Bytes     
       
       AIS   #4      ;恢复栈
       PULH
       PULX
       PULA
    RTS

              
     
    

   
   



