📄 main.asmbak
字号:
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
MOV ISPC, #0X81
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Success)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Success)
LCALL Debug_Str
Protect_Ret:
RET
;================================================================================
ShowRom:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_ShowRom)
MOV ?Debug_Str?BYTE+1, #LOW(Str_ShowRom)
LCALL Debug_Str
LCALL AreYouSure
JNC ShowRom_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
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 ?Debug_Rom?BYTE+0, R0
MOV ?Debug_Rom?BYTE+1, #0X00
MOV ?Debug_Rom?BYTE+2, #0x00
LCALL Debug_Rom
ShowRom_Ret:
RET
;================================================================================
Recv2Hex:
LCALL Debug_In
LCALL Ascii1ToHex
SWAP A
MOV R0, A
LCALL Debug_In
LCALL Ascii1ToHex
ADD A, R0
MOV R0, A
MOV A, R1
ADD A, R0
MOV R1, A
RET
;================================================================================
InputPageAddr:
InputPageAddr_L1:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_InputPageAddr)
MOV ?Debug_Str?BYTE+1, #LOW(Str_InputPageAddr)
LCALL Debug_Str
LCALL Debug_In
LCALL Debug_Byte
LCALL Ascii1ToHex
$IF 0
LCALL Debug_Byte_Hex
$ENDIF
SWAP A
MOV R0, A
$IF 0
LCALL Debug_Byte_Hex
$ENDIF
LCALL Debug_In
LCALL Debug_Byte
LCALL Ascii1ToHex
ADD A, R0
MOV R0, A
$IF 0
LCALL Debug_Byte_Hex
$ENDIF
MOV ?Debug_Str?BYTE+0, #HIGH(Str_LF)
MOV ?Debug_Str?BYTE+1, #LOW(Str_LF)
LCALL Debug_Str
LCALL AreYouSure
JC InputPageAddr_Ret
LJMP InputPageAddr_L1
InputPageAddr_Ret:
RET
;================================================================================
;AreYouSure : if you sure,C=1 else C=0
;================================================================================
AreYouSure:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_AreYouSure)
MOV ?Debug_Str?BYTE+1, #LOW(Str_AreYouSure)
LCALL Debug_Str
LCALL Debug_In
LCALL UpperChar
MOV B, A
LCALL Debug_Byte
MOV ?Debug_Str?BYTE+0, #HIGH(Str_LF)
MOV ?Debug_Str?BYTE+1, #LOW(Str_LF)
LCALL Debug_Str
CLR C
MOV A, B
XRL A, #'Y'
JNZ AreYouSure_RET
SETB C
AreYouSure_RET:
RET
;================================================================================
;IsInRange(R0,R1,R2) IF R1<=R0<=R2 RETRN TRUE ELSE RETURN FALSE
;CHANGE:A
;================================================================================
IsInRange:
CLR C
MOV A, R0
SUBB A, R1
JC IsInRange_RetF
CLR C
MOV A, R2
SUBB A, R0
JC IsInRange_RetF
SETB C
RET
IsInRange_RetF:
CLR C
RET
;================================================================================
;UpperChar(A)
;CHANGE:A
;================================================================================
UpperChar:
PUSH B
MOV B, R0
PUSH B
MOV B, R1
PUSH B
MOV B, R2
PUSH B
MOV B, A
MOV R0, A
MOV R1, #'a'
MOV R2, #'z'
LCALL IsInRange
JNC UpperChar_RetF
MOV A, B
CLR C
SUBB A, #'a'
ADD A, #'A'
MOV B, A
UpperChar_RetF:
MOV A, B
POP B
MOV R2, B
POP B
MOV R1, B
POP B
MOV R0, B
POP B
RET
;================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -