⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 STC单片机开Bootload起动程序,可以Flash下载程序,可仿真寄存器
💻 ASM
📖 第 1 页 / 共 4 页
字号:
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 + -