📄 main.asm
字号:
;********************************************************************************
; main.asm *
;********************************************************************************
$include (Sm5964.h)
;================================================================================
STACKSIZE EQU 40H
W_TH1 EQU 0XFA
;================================================================================
WatchDog EQU P3.5
;================================================================================
ISPVECTOR EQU 0XF000
;================================================================================
MainIDseg SEGMENT IDATA
RSEG MainIDseg
Stack: DS STACKSIZE
;================================================================================
MainDSeg SEGMENT DATA
RSEG MainDSeg
DLCNT: DS 1
?Debug_Str?BYTE:
BYTE1: DS 1
BYTE2: DS 1
?Debug_Mem?BYTE:
?Debug_Rom?BYTE:
BYTE3: DS 1
BYTE4: DS 1
BYTE5: DS 1
StrPtr EQU BYTE1
MemPtr EQU BYTE3
MemLen EQU BYTE4
RomPtr EQU BYTE3
RomLen EQU BYTE5
;================================================================================
CSEG AT 0XF000
USING 0
;================================================================================
DownLoad:
MOV SP, #Stack-1
MOV PSW, #00000000B
MOV IE, #00000000B
MOV SCONF, #00000100B
MOV WDTC, #00000000B
LCALL InitDownLoadUart
DownLoad_L1:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Star)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Star)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Title1)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Title1)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Title2)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Title2)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select1)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select1)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select2)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select2)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select3)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select3)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select4)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select4)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select5)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select5)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select6)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select6)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Star)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Star)
LCALL Debug_Str
LCALL StartISP
LCALL Debug_In
MOV B, A
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Choice)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Choice)
LCALL Debug_Str
LCALL Debug_Byte
MOV ?Debug_Str?BYTE+0, #HIGH(Str_LF)
MOV ?Debug_Str?BYTE+1, #LOW(Str_LF)
LCALL Debug_Str
MOV A, B
XRL A, #'1'
JNZ DownLoad_L2
LCALL ChipErease
LJMP DownLoad_L1
DownLoad_L2:
MOV A, B
XRL A, #'2'
JNZ DownLoad_L3
LCALL PageErease
LJMP DownLoad_L1
DownLoad_L3:
MOV A, B
XRL A, #'3'
JNZ DownLoad_L4
LCALL Program
LJMP DownLoad_L1
DownLoad_L4:
MOV A, B
XRL A, #'4'
JNZ DownLoad_L5
LCALL Protect
LJMP DownLoad_L1
DownLoad_L5:
MOV A, B
XRL A, #'5'
JNZ DownLoad_L6
LJMP 0X0000
DownLoad_L6:
LCALL ShowRom
LJMP DownLoad_L1
RET
;================================================================================
InitDownLoadUart:
CLR ES
CLR TR1
MOV PCON, #80H
MOV SCON, #01110000B
MOV A, TMOD
ANL A, #00001111B
ORL A, #00100000B
MOV TMOD, A
MOV TL1, #W_TH1
MOV TH1, #W_TH1
CLR ET1
CLR PS
SETB TR1
CLR TI
CLR RI
SETB ES
RET
;================================================================================
StartISP:
MOV ISPFD, #0X55
MOV ISPFD, #0XAA
MOV ISPFD, #0X55
RET
;================================================================================
ChipErease:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_ChipErease)
MOV ?Debug_Str?BYTE+1, #LOW(Str_ChipErease)
LCALL Debug_Str
LCALL AreYouSure
JNC ChipErease_Ret
MOV ISPC, #0X83
MOV ISPC, #0X83
MOV ISPFAH, #HIGH(ISPVECTOR-1)
MOV ISPFAL, #LOW(ISPVECTOR-1)
ChipErease_L1:
CPL WatchDog
MOV DPH, ISPFAH
MOV DPL, ISPFAL
CLR A
MOVC A, @A+DPTR
XRL A, #0XFF
JZ ChipErease_L2
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Failure)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Failure)
LCALL Debug_Str
RET
ChipErease_L2:
MOV A, ISPFAH
JNZ ChipErease_L3
MOV A, ISPFAL
JNZ ChipErease_L3
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Success)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Success)
LCALL Debug_Str
RET
ChipErease_L3:
DEC ISPFAL
MOV A, ISPFAL
INC A
JNZ ChipErease_L4
DEC ISPFAH
ChipErease_L4:
JMP ChipErease_L1
ChipErease_Ret:
RET
;================================================================================
PageErease:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_PageErease)
MOV ?Debug_Str?BYTE+1, #LOW(Str_PageErease)
LCALL Debug_Str
LCALL AreYouSure
JNC PageErease_Ret
LCALL InputPageAddr
MOV ?Debug_Str?BYTE+0, #HIGH(Str_PageAddr)
MOV ?Debug_Str?BYTE+1, #LOW(Str_PageAddr)
LCALL Debug_Str
MOV A, R0
ANL A, #11111110B
MOV R0, A
LCALL Debug_Byte_Hex
MOV A, #0X00
LCALL Debug_Byte_Hex
MOV ?Debug_Str?BYTE+0, #HIGH(Str_LF)
MOV ?Debug_Str?BYTE+1, #LOW(Str_LF)
LCALL Debug_Str
MOV ISPFAH, R0
MOV ISPFAL, #0X00
MOV ISPC, #0X82
MOV ISPFAL, 0XFF
MOV A, R0
ADD A, #0X01
MOV ISPFAH, A
MOV A, ISPFAH
LCALL Debug_Byte_Hex
MOV A, ISPFAL
LCALL Debug_Byte_Hex
PageErease_L1:
MOV DPH, ISPFAH
MOV DPL, ISPFAL
CLR A
MOVC A, @A+DPTR
XRL A, #0XFF
JZ PageErease_L2
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Failure)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Failure)
LCALL Debug_Str
RET
PageErease_L2:
MOV A, R0
XRL A, ISPFAH
JNZ PageErease_L3
MOV A, #0X00
XRL A, ISPFAL
JNZ PageErease_L3
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Success)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Success)
LCALL Debug_Str
RET
PageErease_L3:
DEC ISPFAL
MOV A, ISPFAL
INC A
JNZ PageErease_L4
DEC ISPFAH
PageErease_L4:
JMP PageErease_L1
PageErease_Ret:
RET
;================================================================================
Program:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Program)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Program)
LCALL Debug_Str
LCALL AreYouSure
JC Program_L0
RET
Program_L0:
LCALL ChipErease
MOV DLCNT, #0X00
MOV ?Debug_Str?BYTE+0, #HIGH(Str_DownLoadHex)
MOV ?Debug_Str?BYTE+1, #LOW(Str_DownLoadHex)
LCALL Debug_Str
MOV R3, #0X00
Program_L1:
;R1:ChkSum,R2:Len
;Recieve Start Byte ':'
LCALL Debug_In
XRL A, #':'
JNZ Program_L1
INC DLCNT
MOV A, DLCNT
XRL A, #0X10
JNZ Program_L1_1
MOV A, #'>'
LCALL Debug_Byte
MOV DLCNT, #0X00
Program_L1_1:
;Init Chksum
MOV R1, #0X00
;Recieve Len
LCALL Recv2Hex
MOV R2, AR0
;Recieve ISPFAH,ISPFAL
LCALL Recv2Hex
MOV ISPFAH, R0
LCALL Recv2Hex
MOV ISPFAL, R0
;Recieve Type
LCALL Recv2Hex
MOV A, R0
JNZ Program_L2
;Type=0
SJMP Program_L4
Program_L2:
DEC A
JNZ Program_L3
;Type=1
LCALL Recv2Hex
MOV A, R1
JNZ Program_L2_6
LCALL Debug_In
$IF 0
MOV A, R3
LCALL Debug_Byte_Hex
$ENDIF
MOV R4, #0X00
MOV ISPFAH, #HIGH(ISPVECTOR-1)
MOV ISPFAL, #LOW(ISPVECTOR-1)
Program_L2_1:
MOV DPH, ISPFAH
MOV DPL, ISPFAL
CLR A
MOVC A, @A+DPTR
MOV R5, A
XRL A, #0XFF
JZ Program_L2_2
MOV A, R5
ADD A, R4
MOV R4, A
Program_L2_2:
MOV A, ISPFAH
JNZ Program_L2_3
MOV A, ISPFAL
JNZ Program_L2_3
SJMP Program_L2_5
Program_L2_3:
DEC ISPFAL
MOV A, ISPFAL
INC A
JNZ Program_L2_4
DEC ISPFAH
Program_L2_4:
JMP Program_L2_1
Program_L2_5:
$IF 0
MOV A, R4
LCALL Debug_Byte_Hex
$ENDIF
MOV A, R3
XRL A, R4
JNZ Program_L2_6
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Success)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Success)
LCALL Debug_Str
RET
Program_L2_6:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Failure)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Failure)
LCALL Debug_Str
RET
Program_L3:
;Type Is Error
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Failure)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Failure)
LCALL Debug_Str
RET
Program_L4:
MOV A, R2
JZ Program_L5
LCALL Recv2Hex
MOV ISPFD, R0
MOV ISPC, #0X80
MOV A, R0
XRL A, #0XFF
JZ Program_L4_0
MOV A, R3
ADD A, R0
MOV R3, A
Program_L4_0:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DEC R2
INC ISPFAL
MOV A, ISPFAL
JNZ Program_L4_1
INC ISPFAH
Program_L4_1:
LJMP Program_L4
Program_L5:
LCALL Recv2Hex
MOV A, R1
JNZ Program_L6
LJMP Program_L1
Program_L6:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Failure)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Failure)
LCALL Debug_Str
RET
;================================================================================
Protect:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Protect)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Protect)
LCALL Debug_Str
LCALL AreYouSure
JNC Protect_Ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -