📄 loadprogram.asm
字号:
;* *
;****************************************************
; DPTR = DPTR + A
; IF DPTR > 0FFFFH CY = 1
DPTRADDC: PUSH ACC ;
ADD A, DPL ; DPL + ACC
MOV DPL, A ;
MOV A, DPH ;
ADDC A, #000H ; DPH = DPH + CY
MOV DPH, A ;
POP ACC ;
RET
;
;
;****************************************************
;* *
;* PAUSE *
;* *
;****************************************************
MYPAUSE: JNB TIME500MS, $
LCALL WATDOG
JB TIME500MS, $
DEC A
JNZ MYPAUSE
RET
;
;
;============================================================================
;////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////
;============================================================================
; XMODEM 子程序
;
;****************************************************
;* *
;* XMODEM DOWNLOAD *
;* *
;****************************************************
; 以 XMODEM 协议接收数据
XMODEMDOWN: LCALL PUTENTER ;
CLR A ;
MOV DPLO, A ;
MOV DPHI, A ;
MOV R7, #XMODEMMXAERROR ; 最大错误次数
MOV RXBUFFTAIL, #XBUFFSTART ;
MOV RXBUFFHEAD, #XBUFFSTART ;
CLR RXCOMMOKFLAG ;
CLR A ;
MOV RXBUFFLEN, A ;
INC A ;
MOV BLKCHK, A ; 1: CRC 0: CheckSum
MOV R5, A ; 存包号
MOV R6, #CRC ; 发送字符 C 请求字符 CRC
SETB RXCOMMFLAG ; 起动 XMODEM 协议接收
XDOWNLOOP: MOV A, R6 ;
LCALL PUTCHAR ;
MOV B, #05H ; TIMEOUT
LCALL GETCHAR ; 读入字符
MOV R3, A ;
MOV A, B ;
JNZ XDOWNREAD ; 是否超时
MOV A, R7 ;
CLR C ;
SUBB A, #0AH ;
JNC XDOWNLOOPEND ; 继续发送 CRC 字符
MOV R6, #NAK ;
CLR A ;
MOV BLKCHK, A ; 发送 CheckSum 字符
XDOWNLOOPEND: DJNZ R7, XDOWNLOOP ;
XDOWNCAN: MOV A, #CAN ; 错误太多中断
LCALL PUTCHAR ;
CLR A ;
LJMP XDOWNEND2 ;
;
XDOWNEND1: LCALL PUTENTER ;
CLR A ;
DEC A ;
XDOWNEND2: CLR RXCOMMFLAG ; 起动 COMMAND 接收
MOV RXBUFFTAIL, #RXBUFFSTART;
MOV RXBUFFHEAD, #RXBUFFSTART;
MOV RXBUFFLEN, #00H ;
RET
;
XDOWNEND: MOV A, #ACK ;
LCALL PUTCHAR ;
LJMP XDOWNEND1 ;
;
XDOWNREAD: MOV R6, #NAK ;
MOV A, R3 ;
XRL A, #SOH ; 是否包头
JZ XDOWNPACK ;
MOV A, R3 ;
XRL A, #EOT ; 是否包结束
JZ XDOWNEND ;
MOV A, R3 ;
XRL A, #CAN ; 是否发送端中断
JZ XDOWNCAN ;
MOV A, #05H ;
LCALL MYPAUSE ;
LJMP XDOWNLOOPEND ;
;
XDOWNPACK: MOV A, #BLKSIZE ; 包处理
ADD A, BLKCHK ;
ADD A, #03H ;
MOV R4, A ; 计算包长度
XDOWNPACKLOOP: MOV B, #03H ;
LCALL GETCHAR ;
MOV A, B ;
JZ XDOWNLOOPEND ;
DJNZ R4, XDOWNPACKLOOP ; 读入一包数据
;
MOV R0, #XBUFFSTART ;
INC R0 ;
MOV A, @R0 ; 读入包号
MOV B, A ;
INC R0 ;
MOV A, @R0 ; 读入包号反值
ADD A, B ;
XRL A, #0FFH ; 校验包号
JNZ XDOWNLOOPEND ;
MOV A, B ; 是否当前包号
XRL A, R5 ;
JZ XDOWNCHECK ; 是转 CRC 计算
MOV A, R5 ;
DEC A ; 是否上次包号
XRL A, B ;
JNZ XDOWNLOOPEND ;
MOV R6, #ACK ; 是发握手信号
LJMP XDOWNLOOP ;
;
XDOWNCHECK: MOV A, BLKCHK ;
JZ XDOWNCHECKSUM ; CheckSum 处理
LCALL XCRCCHECK ; 计算 CRC
JNZ XDOWNLOOPEND ;
LJMP XDOWNNEXTPACK ; 是读下一包
;
XDOWNCHECKSUM: LCALL XCHECKSUM ; 计算 CheckSum
JNZ XDOWNLOOPEND ;
XDOWNNEXTPACK: MOV R6, #ACK ; 是发握手信号
LCALL PROGRAMCHIP ;
JZ XDOWNCAN1 ;
INC R5 ; 初始化
CLR A ;
MOV R7, #XMODEMMXAERROR ; 最大错误次数
MOV RXBUFFTAIL, #XBUFFSTART ;
MOV RXBUFFHEAD, #XBUFFSTART ;
CLR A ;
MOV RXBUFFLEN, A ;
CLR RXCOMMOKFLAG ;
LJMP XDOWNLOOP ;
;
XDOWNCAN1: LJMP XDOWNCAN ;
;
;
;***************************************************************************
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;***************************************************************************
; CRC16 子程序 16位 CRC CCITT - 12
; CheckSum 子程序
;
CRC16TBL: DW 00000H, 01021H, 02042H, 03063H, 04084H, 050A5H, 060C6H, 070E7H
DW 08108H, 09129H, 0A14AH, 0B16BH, 0C18CH, 0D1ADH, 0E1CEH, 0F1EFH
DW 01231H, 00210H, 03273H, 02252H, 052B5H, 04294H, 072F7H, 062D6H
DW 09339H, 08318H, 0B37BH, 0A35AH, 0D3BDH, 0C39CH, 0F3FFH, 0E3DEH
DW 02462H, 03443H, 00420H, 01401H, 064E6H, 074C7H, 044A4H, 05485H
DW 0A56AH, 0B54BH, 08528H, 09509H, 0E5EEH, 0F5CFH, 0C5ACH, 0D58DH
DW 03653H, 02672H, 01611H, 00630H, 076D7H, 066F6H, 05695H, 046B4H
DW 0B75BH, 0A77AH, 09719H, 08738H, 0F7DFH, 0E7FEH, 0D79DH, 0C7BCH
DW 048C4H, 058E5H, 06886H, 078A7H, 00840H, 01861H, 02802H, 03823H
DW 0C9CCH, 0D9EDH, 0E98EH, 0F9AFH, 08948H, 09969H, 0A90AH, 0B92BH
DW 05AF5H, 04AD4H, 07AB7H, 06A96H, 01A71H, 00A50H, 03A33H, 02A12H
DW 0DBFDH, 0CBDCH, 0FBBFH, 0EB9EH, 09B79H, 08B58H, 0BB3BH, 0AB1AH
DW 06CA6H, 07C87H, 04CE4H, 05CC5H, 02C22H, 03C03H, 00C60H, 01C41H
DW 0EDAEH, 0FD8FH, 0CDECH, 0DDCDH, 0AD2AH, 0BD0BH, 08D68H, 09D49H
DW 07E97H, 06EB6H, 05ED5H, 04EF4H, 03E13H, 02E32H, 01E51H, 00E70H
DW 0FF9FH, 0EFBEH, 0DFDDH, 0CFFCH, 0BF1BH, 0AF3AH, 09F59H, 08F78H
DW 09188H, 081A9H, 0B1CAH, 0A1EBH, 0D10CH, 0C12DH, 0F14EH, 0E16FH
DW 01080H, 000A1H, 030C2H, 020E3H, 05004H, 04025H, 07046H, 06067H
DW 083B9H, 09398H, 0A3FBH, 0B3DAH, 0C33DH, 0D31CH, 0E37FH, 0F35EH
DW 002B1H, 01290H, 022F3H, 032D2H, 04235H, 05214H, 06277H, 07256H
DW 0B5EAH, 0A5CBH, 095A8H, 08589H, 0F56EH, 0E54FH, 0D52CH, 0C50DH
DW 034E2H, 024C3H, 014A0H, 00481H, 07466H, 06447H, 05424H, 04405H
DW 0A7DBH, 0B7FAH, 08799H, 097B8H, 0E75FH, 0F77EH, 0C71DH, 0D73CH
DW 026D3H, 036F2H, 00691H, 016B0H, 06657H, 07676H, 04615H, 05634H
DW 0D94CH, 0C96DH, 0F90EH, 0E92FH, 099C8H, 089E9H, 0B98AH, 0A9ABH
DW 05844H, 04865H, 07806H, 06827H, 018C0H, 008E1H, 03882H, 028A3H
DW 0CB7DH, 0DB5CH, 0EB3FH, 0FB1EH, 08BF9H, 09BD8H, 0ABBBH, 0BB9AH
DW 04A75H, 05A54H, 06A37H, 07A16H, 00AF1H, 01AD0H, 02AB3H, 03A92H
DW 0FD2EH, 0ED0FH, 0DD6CH, 0CD4DH, 0BDAAH, 0AD8BH, 09DE8H, 08DC9H
DW 07C26H, 06C07H, 05C64H, 04C45H, 03CA2H, 02C83H, 01CE0H, 00CC1H
DW 0EF1FH, 0FF3EH, 0CF5DH, 0DF7CH, 0AF9BH, 0BFBAH, 08FD9H, 09FF8H
DW 06E17H, 07E36H, 04E55H, 05E74H, 02E93H, 03EB2H, 00ED1H, 01EF0H
RET
;
;
;****************************************************
;* *
;* 校验包的 CRC *
;* *
;****************************************************
; CRCHI AND CRCLO 内容为 0: OK ELSE: FAIL
XCRCCHECK: MOV R0, #XBUFFSTART ;
INC R0 ;
INC R0 ;
INC R0 ;
CLR A ;
MOV CRCLO, A ;
MOV CRCHI, A ;
MOV A, #BLKSIZE ;
INC A ;
INC A ;
MOV R4, A ; 计算包长度
XCRCLOOP: MOV A, @R0 ;
INC R0 ;
XRL A, CRCHI ;
MOV DPTR, #CRC16TBL ;
LCALL DPTRADDC ; 调整 DW 地址
LCALL DPTRADDC ;
CLR A ;
MOVC A, @A+DPTR ; 查表
XRL A, CRCLO ;
MOV CRCHI, A ; 获得高 CRC
CLR A ;
INC A ;
MOVC A, @A+DPTR ;
MOV CRCLO, A ; 获得低 CRC
DJNZ R4, XCRCLOOP ;
MOV A, CRCLO ;
JNZ XCRCERROR ;
MOV A, CRCHI ;
JNZ XCRCERROR ;
XCRCERROR: RET ;
;
;
;****************************************************
;* *
;* 校验包的 CheckSum *
;* *
;****************************************************
XCHECKSUM: MOV R0, #XBUFFSTART ;
INC R0 ;
INC R0 ;
INC R0 ;
CLR A ;
MOV CRCHI, A ;
MOV A, #BLKSIZE ;
MOV R4, A ; 计算包长度
XSUMLOOP: MOV A, @R0 ;
ADD A, CRCHI ;
MOV CRCHI, A ;
INC R0 ;
DJNZ R4, XSUMLOOP ;
MOV A, @R0 ;
XRL A, CRCHI ;
RET
;
;
;============================================================================
;////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////
;============================================================================
; IN-SYSTEM-PROGRAMMING 子程序
;
;****************************************************
;* *
;* ERASE CHIP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -