📄 main.asm
字号:
ERAERROR: ;******
ERE2F:
LDA ERA_ERR_MSG,X
CMP #$04
BEQ ERA2F_X
JSR OUTCH
INCX
BRA ERA2F
ERA2F_X: ;****
ERAX: RTS ;****
;*
ERAPAGE:
JSR PROG_BEGIN ;Erase A Page
LDA BUFF+2
ADD #$80
STA BUFF+2
LDA BUFF+1
ADC #0
STA BUFF+1
LDA BUFF+5
LDX BUFF+4
JMP ERAREP
ERA_ERR_MSG:
FCB "Error erased"
FCB #04
ERA_SUC_MSG: ;****
FCB "Successfully erased"
FCB $04
;*============================================================
;* Initisl Subroutines for FLASH-modify Routine
;*============================================================
;*============================================================
;* Sub To Erase Page Of Mass Flash Memory
;*============================================================
SUB_ERASE:
LDA #$FF
STA $FFFF ;$FFFF Is Cop Control Register
LDA #2 ;#6 To Erase Mass Flash Memory(To Be Modified
;*;#2 To Erase Page Flash Memory
STA FLCR
LDA FLBPR ;Read FLBPR
JSR BUFF ;Store Any Code To The PAge Erasing
LDHX C10USH ;Delay 10us
BSR NULLCYCLE
LDA #0E
STA FLCR ;Set HVEN
LDHX C1MSH ;Delay 1ms
BSR NULLSYCLE
LDA #0C ;Clear ERASE
STA FLCR
LDHX C5USH ;Delay 5us
BSR NULLCYCLE
CLRA
STA FLCR
LDHX C10USH ;Clear HVEN
BSR NULLCYCLE ;Delay 10us
RTS
;*=============================================================
;* Sub to Wait For Certain Cycles
;*=============================================================
SUB_WAIT:
LDHX C50USH ;Delay 10us
STA FLCR
NULLCYCLE:
AIX #1 ;2T
CPHX #0 ;3T
BNE NULLCYCLE ;3T
RTS ;4T
;*=============================================================
;* Sub To Progam
;* Input:(COUNTE1)=Count to Be Programed
;*=============================================================
SUB_PROGRAM:
LDA #$FF
STA $FFFF ;$FFFF Is Cop Control Register
MOV COUNTE1,COUNTE2 ;COUNTE1=COUNTE2
LDHX BUFFCOU
STHX TEMP
;*
LDA #1 ;Set PGM
STA FLCR
LDA FLBPR ;Read FLBPR
LDHX PRADDR ;H:X=PRADDR=Pagebegin
STA ,X ;Write Any Code To The Page
LDHX C10USH ;Delay 10us
BSR NULLCYCLE
LDA #9 ;Set HVEN
STA FLCR
LDHX C5USH ;Delay 5us
BSR NULLCYCLE
LDHX PRADDR
;*
CYCLE_PR: ;Repeat To White Code To The Page
PSHH
PSHX
LDHX BUFFCOU
LDA ,X
AIX #1
STHX BUFFCOU
PULX
PULH
STA ,X
AIX #1
PSHH
PSHX
LDHX C30USH
BSR NULLCYCLE
PULX
PULH
DEC COUNTE1
BNE CYCLE_PR
LDA #8 ;Clear PGM
STA FLCR
LDHX C5USH ;Delay 5us
BSR NULLCYCLE
CLRA ;Clear HVEN
STA FLCR
LDHX C10USH ;Delay 10us,Then The Page Be Read
BSR NULLCYCLE ;Used To End The RAM Program
JMP OUT_RAM
;*
OUT_RAM: ;Used To Check Whether The Writing Wrong
LDHX TEMP
STHX BUFFCOU
LDHX PRADDR
;*
VERIFY_PR:
;*
PSHX
PSHH
LDHX BUFFCOU
LDA ,X
AIX #1
STHX BUFFCOU
PULH
PULX
;*
CMP ,X ;RAM=?FLASH
BNE ERROR_PR
AIX #1
DEC COUNTE2
BNE VERIFY_PR
LDHX #0
RTS
;*
ERROR_PR:
BSET B_ERROR,FLASHFLAG ;Set B_ERROR As Error Flag
RTS
;*============================================================
;* Sub To Copy 80h Bytes To RAM Page Buffer
;* Input:(H:X)=Start Address
;* Page Length($80,Cannot Change From Out Of Sub)
;*============================================================
SUB_LOAD_80:
STHX TEMP
CLR COUNTE1
SL8_CONT:
LDA ,X
PSHH
PSHX
CLRH
LDX COUNTE1
STA PAGE_BEGIN,X ;PAGE_BEIGN=$0180
TXA
INCA
CMP #$80
BEQ SL8_EXIT
STA COUNTE1
PULX
PULH
AIX #1
BRA SL8_CONT
SL8_EXIT:
PULX
PULH
RTS
USER_PROGRAM: ;****
LDA NUFF+2
AND #$80
STA BUFF+2 ;Change With Referable Page Begin
;*=============================================================
;* Sub To Copy 80h Bytes Back To Flash
;* Input:(BUFF+1,BUFF+2)=Start Address
;* PAge Lenrth ($80,Cannot Change From Out Of Sub)
;*=============================================================
SUB_RESTORE_80:
JSR SET_TIME_TABLE
CLR FLASHFLAG ;FLASHFLAG=0
LDHX #PROG_BEGIN ;$0100
STHX TEMPH
LDHX #SUB_ERASE
SR8_NXTMOVE: ;Copy Program SUB_ERASE To RAM($0100)
MOV X+,TEMP2
PSHH
PSHX
LDHX TEMPH
MOV TEMP2,X+
SR8_NXT:
STHX TEMPH
PULX
PULH
CPHX #SUB_PROGRAM
BNE SR8_NXTMOVE
;*
LDA #$0C7 ;Decode of<STA>
STA BUFF+0
LDA #$81 ;Decode of<RTS>
STA BUFF+3
JSR PROG_BEGIN ;Erase The Flash Page
;*
LDHX #PROG_BEGIN
STHX TEMPH
LDHX #SUB_WAIT
SR8_NXTMOVE2: ;****Copy FLASH PROG To RAM
MOV X+,TEMP2
PSHH
PSHX
LDHX TEMPH
MOV TEMP2,X+
STHX TEMPH
PULX
PULH
CPHX #OUT_RAM
BNE SR8_NXTMOVE2
;*
MOV #$80,COUNTE1 ;COUNTE1=$80
LDHX #PAGE_BEGIN
STHX BUFFCOU ;BUFFCOU=$180
LDHX BUFF+1
STHX PRADDR ;PRADDR=Pagebegin
;*
JSR PROG_BEGIN2 ;Restore
RTS
;*============================================================
;* COMMAND 'P':Program FLASH
;* The Address To Store Is(BUFF+1,BUFF+2)
;*============================================================
PROGRAM: ;****
CLR FLASHFLAG ;FLASHFLAG=0
JSR SET_TIME_TABLE
LDHX #PROG_BEGIN ;Copy RAM Program($0100)
STHX TEMPH
LDHX #SUB_WAIT
NXTMOVE2:
MOV X+,TEMP2
PSHH
PSHX
LDHX TEMPH
MOV TEMP2,X+
STHX TEMPH
PULX
PULH
CPHX #OUT_RAM
BNE NXTMOVE2
;*
LDA FLAG
CMP #$FF
BEQ USERMEM3
MCIP: JSR CRLF ;****Output CR And LF
LDX BUFF+1
LDA BUFF+2
JSR OUT4H ;Output FLASH Address
JSR OUT1SP
LDA #$C6 ;Decode Of<LDA>
STA BUFF
JSR BUFF ;Output Code In The Address
JSR OUT2H
JSR OUTDOT ;'.'
JSR IN2H ;Receive The New Code
BCC CHANGEP ;If Input Code Right,CHANGEP
CMP #BKSP ;If Input Is '',Loop Again
BEQ MC1P
CMP #QUIT ;If Input Is '.',Quit
BNE FWDP
MCPX: RTS ;****
USERMEM3: ;****
LDA BUFF
CHANGEP: ;****
STA RAM50
LDHX BUFF+1
LDA BUFF+2
AND #$80
TAX
JSR SUB_LOAD_80 ;Move FLASH Page To RAM Starting From $180
LDHX #$0100
LDA BUFF+2
ORA #$80
TAX ;H:X Is "RAM Address" Of The FLASH Address
LDA RAM50
STA ,X ;Change In RAM
;*
LDHX BUFF+1
PSHH
PSHX
TXA
AND #$80
STA BUFF+2
JSR SUB_RESTORE_80 ;RAM->FLASH
PULX
PULH
STX BUFF+2
LDA FLAG
CLR FLAG
CMP #$FF
BEQ MCPX
JSR CRLF ;Output The Address And The New Code
LDA BUFF+2
JSR OUT4H
JSR OUT1SP
LDA #$C6 ;Opcode for<LDA Addr16>
STA BUFF
JSR BUFF
JSR OUT2H
FWDP: ;****
JSR INCADDRP
LDHX BUFF+1
CPHX #ROM_END
BNE MC1P
JMP M_INVALID_ADD
INCADDRP: ;****
LDA BUFF+2
INCA ;Increase The Address To Loop
BNE IA1P
LDX BUFF+1
INCX
STX BUFF+1
IA1P: STA BUFF+2 ;****
RTS
;*============================================================
;* COMMAND 'L':Download to FLASH
;*=============================================================
DOWNLDFLASH: ;****
CLR FLASHFLAG ;FLASHFLAG=0
JSR SET_TIME_TABLE
LDHX #PROG_BEGIN ;Copy Program To RAM
STHX TEMPH
LDHX #SUB_WAIT
NXTMOVE2F:
MOV X+,TEMP2
PSHH
PSHX
LDHX TEMPH
MOV TEMP2,X+
STHX TEMPH
PULX
PULH
CPHX #OUT_RAM
BNE NXTMOVE2F
;*
LDA #CR
JSR OUTCH
LDA #CF
JSR OUTCH
NLINEF: ;****
JSR INCH
CMP #'S' ;Check S-File
BNE NLINEF
JSR INCH
CMP #'1' ;S1-File
BEQ SIF
CMP #'9' ;S9-File
S9F: JSR INCH
CMP #$43 ;'C' Means S9-File Finished
BNE S9F
JSR CRLF
JMP DF_END
S1F: JSR IN2HNE ;****
BCS DLERRF
STA BUFF+4 ;Conunt of The Bytes->BUFF+4
STA COUNTE1
STA BUFF+5 ;Check Sum->BUFF+5
JSR IN4H
BCS DLERRF
STX BUFF+1 ;Beginning Address To Store The Code
STA BUFF+2
STX TEMP ;Temperory Location
ADD TEMP
ADD BUFF+5
STA BUFF+5
DEC BUFF+4
DEC BUFF+4
DEC COUNTE1
DEC COUNTE1
DEC COUNTE1 ;For Checking
;*
CLRH
CLRX
STHX TEMPH
DATAF: ;****
JSR IN2HNE
BCS DLERRF
DEC BUFF+4
BEQ ENDS1F
LDHX TEMPH
STA PROG_BUF,X
INCX
STHX TEMPH
ADD BUFF+5
STA BUFF+5
BRA DATAF
ENDS1F: ;****
PSHA
LDA #$0D
JSR OUTCH
PULA
COMA
CMP BUFF+5 ;Cheak If The Checksun Is Correct
BNE DLERRF
;*
LDHX #PROG_BUF
STHX BUFFCOU
LDHX BUFF+1
STHX PRADDR
JSR PROG_BEGIN2 ;RAM->FLASH
JMP NLINEF
;*
DLERRF: ;****
LDHX #$00
DE1F: LDA DEMSG,X ;****Output String MSG
CMP #$04
BEQ DLXF
JSR OUTCH
INCX
BRA DE1F
DF_END:
LDHX #0
BRSET B_ERROR,FLASHFLAG,DF_MSG_2
LDHX #{DF_MSG_SUC-DF_MSG_ERR}
DF_MSG_2:
LDA DF_MSG_ERR,X
CMP #$04
BEQ DF_MSG_2X
JSR OUTCH
INCX
BRA DF_MSG_2
DF_MSG_2X: ;****
DLXF: RTS
DEMSG: FCB CR,LF ;****
FCB "Error Loading S-Record File."
FCB $04
DF_MSG_ERR:
FCB "Error writing FLASH memory."
FCB $04
DF_MSG_SUC:
FCB "Successfully writing FLASH memory."
FCB $04
;*=============================================================
;* COMMAND 'H':Display Help Messages
;*=============================================================
HELP: LDHX #$00 ;****
HELP1: LDA HLPMSG,X ;Output String HLPMSG
CMP #$04
BEQ HELPX
JSR OUTCH
AIX #1
BRA HELP1
HELPX: RTS ;****
HLPMSG: ;****
FCB CR,LF
FCB "^A,^X,^C,^P:Register Change"
FCB "D xxxx-xxxx:Memory Display"
FCB CR,LF
FCB "R:Register Display"
FCB "E xxxx-xxxx:Erase Flash"
FCB CR,LF
FCB "L:Download S19 File To FLASH"
FCB "M xxxx:Memory Modify"
FCB CR,LF
FCB "G:Run Porgram"
FCB "B xxxx:Set Break Point"
FCB CR,LF
FCB "H:Display This Message"
FCB $04
;*=============================================================
;* SUBROUTINE: CHANGE PLL
;*=============================================================
INHEX: ;****Input aCode To A-Reg,And Display
JSR INCHE ;While Input '0~F',C=0
CMP #$30 ;Else,C=1
BLO NOTHEX
SUB #$30
CMP #$09
BLS ISHEX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -