;--------------------------------------------------------------*
;工 程 名:Flash.mcp                                            *
;功    能:                                                     *
;    (1) 发送MCU方握手信号86                                   *
;    (2) 接收PC方握手信号56                                    *
;    (3) 等待接收N+1个数,并放入N和dataBuffer数组中             *
;    (4) 擦除以WrAddr为首地址的Flash一页,将N个数据写入         *
;    (5) 从以WrAddr为首址的Flash区读取N个数据,串口发送         *
;说    明: 使用SCI1,波特率为9600                               *
;--------------------------------------------------------------*

;包含总头文件
    INCLUDE 'Includes.inc'

    XDEF dataLen                  ;定义可以外部使用的变量
    XDEF dataBuffer
    XDEF PGMInRAM
    XDEF _Startup, main           ;定义可以被外部调用的函数
    XREF __SEG_END_SSTACK 

; 变量段
MY_ZEROPAGE: SECTION  SHORT       ;在此处定义变量

PGMInRAM:   DS.B  57 ;Flash擦写程序存放的内存
dataLen:    DS.W   1 ;待写入的数据长度
                     ;高字节在前，低字节在后
dataBuffer: DS.B 64  ;待写入的字节数据

WrAddr: DC.W $A000   ;擦除的页地址

; 代码段
MyCode:      SECTION  
 
;主程序 
main:
_Startup:
    SEI
    LDHX  #__SEG_END_SSTACK     ;初始化堆栈指针               
    TXS                     
    JSR MCUInit                 ;芯片初始化  
    JSR SCIInit                 ;串口初始化
    CLI                         ;开放总中断 

;主循环      
mainLoop:
    LDA  #86           ;发送握手信号86              
    JSR  SCISend1
    
    JSR  SCIRe1        ;等待接收握手信号56               
    CMP  #56                    
    BNE  mainLoop      ;不是56继续握手
    
    JSR  SCIRe1        ;接收要写入的字符个数(<=64)存到dataLen的低地址中
    STA  dataLen+1
    CLRA
    STA  dataLen       ;清空dataLen的高地址
    
    LDA  dataLen+1     ;接收dataLen个字节并存到以dataBuffer为首址的内存中
    LDHX #dataBuffer
    JSR  SCIReN
              
    LDHX #WrAddr       ;擦除以WrAddr为首地址的Flash的1页(AW60:512字节)
    JSR  ErasePage   
    
    ;将以dataBudder开始的dataLen个数写入以WrAddr为首址的Flash区
    LDHX #WrAddr     ;数据要写入的FLASH地址WrAddr              
    JSR  WriteFlash
    
    ;向PC机发送写入Flash区的dataLen个数据
    LDHX #WrAddr 
    LDA  dataLen+1
    JSR  SCISendN
    
    BRA mainLoop

