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

📄 main.asm

📁 STC单片机开Bootload起动程序,可以Flash下载程序,可仿真寄存器
💻 ASM
📖 第 1 页 / 共 4 页
字号:
        
        
;*
USERMEM2:                            ;****
        LDA      #$81                ;Decode For<RTS>
        STA      BUFF+3
        LDHX     BUFF+1
        CPHX     #RAM_END            ;RAM_END=$0240
        BHS      M_NOT_RAM
        BRA      MC1                 ;Inputed Address Is RAM Address
;*
M_INVALID_ADD:
        JSR      CRLF
        LDHX     #$00
M_IA_MSG:
        LDA      MIA_MSG,X           ;Output String MIA_MSG
        CMP      #$04
        BEQ      MCX
        JSR      OUTCH
        AIX      #1
        BRA      M_IA_MSG
MC1:    JSR      CRLF                ;****
        LDA      FLAG
        CMP      #$FF
        BEQ      MEMUSER1
        LDX      BUFF+1
        LDA      BUFF+2
        JSR      OUT4H               ;Output The Address
        JSR      OUT1SP              ;Output '.'
        LDA      #$C6                ;Opcode for<LDA addr16>
        STA      BUFF
        JSR      BUFF
        JSR      OUT2H               ;Output What In The Address
        JSR      OUTDOT              ;Output '.'
        JSR      IN2H                ;Input The New Code 
        BCC      CHANGE              ;While C=0,Change 
        CMP      #BKSP               ;While <BACKSPACE>,To Repeat
        BEQ      MC1
        CMP      #QUIT               ;While '.',To Quit
        BNE      FWD
MCX:    RTS 
MEMUSER1:                            ;****
        LDA      BUFF
CHANGE: LDX      #$C7                ;****Opcode for<STA addr16>
        STX      BUFF
        JSR      BUFF                ;Change The Code In The Address 
        LDA      FLAG
        CLR      FLAG
        CMP      #$FF
        BEQ      MCX
        JSR      CRLF
        LDX      BUFF+1              ;Display 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
        
;*
FWD:    JSR      INCADDR             ;****
        LDHX     BUFF+1
        CPHX     #RAM_END
        BEQ      M_INVALID_ADD
        BRA      MC1
        
;*
INCADDR: 
        LDA      BUFF+2
        INCA
        BNE      IA1
        LDX      BUFF+1
        INCX
        STX      BUFF+1
IA1:    STA      BUFF+2              ;****
INCADDR_X:
        RTS
MIA_MSG:
        FCB      "Address Invalid (Not in RAM or FLASH)'
        FCB      $4
       
;***************************************************************
;* COMMAND 'B':Set BreakPoint
;***************************************************************
IN_BKPT:
        JSR      IN4H
        BCS      CL_BKPT
        STX      BRKH
        STA      BRKH+1
        LDA      #%10000000
        STA      BRKSCR
        CLI
        RTS
CL_BKPT:
        LDA      #0
        STA      BRKSCR
        RTS
        
;**************************************************************
;* COMMAND 'G':Execute Program From Address Specified By PC
;**************************************************************
CMD_GO:                              ;****
        JSR      FINDSP              ;#TEMP=SP0
        LDA      #$FF
        STA      FLAG                ;FLAG=#FF
        STA      GO_FLAG             ;GO_FLAG=$FF
        SWI                          ;Take A Software Interrupt
GO1:    LDA      #$00                ;****
        STA      GO_FLAG
        LDHX     TEMP                ;Change The Code In The Stack
        AIX      #-3                 ;Change PC To Execute Program
        LDA      MIRR_PC+1
        STA      4,X
        LDA      MIRR_PC
        STA      3,X
        LDA      MIRR_X
        STA      2,X
        LDA      MIRR_A
        STA      1,X
        LDA      MIRR_CC
        STA      0,X
        JSR      FINDSP              ;****
        LDHX     TEMP
        AIX      #2
        TXS
NOBKPT:                              ;****
        LDHX     MIRR_H              ;Restore H:X,And Return
        RTI
;*==============================================================
;* Routine To Find Out Position Of The Stack Pointer
;* Return Value:(H:X)=TEMP =SP
;*==============================================================
FINDSP:                              ;****
        TSX                          ;H:X<-(SP)+0001 
        AIX      #2
        STHX     TEMP
        RTS
PRT_A:  LDHX     #$00 
PA1:    LDA      MSG2,X              ;****Output String MSG2
        CMP      #$04
        BEQ      PA2
        JSR      OUTCH
        INCX
        BRA      PA1
PA2:    LDA      MIRR_A 
        JMP      OUT2H
PRT_X:  LDHX     #$00                ;****
PX1:    LDA      MSG3,X              ;****Output String MSG3
        CMP      #$04
        BEQ      PX2
        JSR      OUTCH
        INCX
        BRA      PX1
PX2:    LDA      MIRR_H
        LDA      MIRR_X
        JMP      OUT4H
;*
PRT_PC: LDHX     #$00                ;****
PPC1:   LDA      MSG4,X              ;****Output String MSG4
        CMP      #$04
        BEQ      PPC2
        JSR      OUTCH
        INCX
        BRA      PPC1
PPC2:   LDX      MIRR_PC
        LDA      MIRR_PC+1
        JMP      OUT4H
;*
PRT_CC: LDHX     #$00                ;****
PCC1:   LDA      MSG5,X              ;Output String MSG5
        CMP      #$04
        BEQ      PCC2
        JSR      OUTCH
        INCX
        BRA      PCC1
PCC2:   LDA      MIRR_PC             ;****
        JMP      OUT2H
;*
PRT_SP: LDHX     #$00                ;****
PSP1:   LDA      MSG6,X              ;****Output String MSG6
        CMP      #$04
        BEQ      PSP2
        JSR      OUTCH
        INCX 
        BRA      PSP1
PSP2:   LDX      MIRR_SP             ;****
        LDA      MIRR_SP+1
        JMP      OUT4H
;*
MSG2:   FCB      "A="                ;****
        FCB      $04
MSG3:   FCB      "H:X="              ;****
        FCB      $04
MSG4:   FCB      "PC="               ;****
        FCB      $04 
MSG5:   FCB      "CC="               ;****
        FCB      $04
MSG6:   FCB      "SP="
        FCB      $04
     
;*=============================================================
;* COMMAND'R': Display Value Of Registers
;*=============================================================
REGDSP:
        JSR      CRLF                ;CR And LF
        JSR      PRT_A               ;Output 'A=*'
        JSR      PRT_X               ;Output 'H:X=*'
        JSR      PRT_PC              ;Output 'PC=*'
        JSR      PRT_CC              ;Output 'CC=*'
        BRA      PRT_SP              ;Output 'SP=*'

;*============================================================
;* COMMAND 'D':Dump Memory in HEX and ASCII
;*============================================================
MDUMP:  JSR      IN4H                ;Receive Lower Address
        BCS      MDX
        STX      BUFF+1
        STA      BUFF+2
        LDHX     BUFF+1
        CPHX     #ROM_END            ;ROM_END=$E000
        BHS      D_INVALID_ADD
        LDA      #'-'
        JSR      OUTCH
        JSR      IN4H                ;Receive Higher Address
        BCS      MDX
        STX      BUFF+4
        STA      BUFF+5
        LDHX     BUFF+4
        CPHX     #ROM_END
        BHS      D_INVALID_ADD
        LDX      BUFF+4
        CMPX     BUFF+1              ;Check The Lower Address Lower Than The Higher
        BEQ      LOWDG1
        BCC      ADJ
        BRA      MDX
LOWDG1:
        CMP      BUFF+2
        BCC      ADJ
MDX:    RTS 
;*
D_INVALID_ADD:
        JSR      CRLF                ;CR And LF
        LDHX     #$00
D_IA_MSG:
        LDA      MIA_MSG,X           ;Output String MSG
        CMP      #$04
        BEQ      MDX
        JSR      OUTCH
        AIX      #1
        BRA      D_IA_MSG
;*
ADJ:    ADD      #$10                ;Adjust Higher Address To
        AND      #$F0                ;The First Address Of Next Page
        STA      BUFF+5
        LDA      BUFF+4
        ADC      #$00
        STA      BUFF+4
        LDA      BUFF+2              ;Adjust Lower Address To
        AND      #$F0                ;The First Address Of This Page
        STA      BUFF+2
;*
        LDA      #$D6                ;Opcode For<LDA X,Addr16>
        STA      BUFF+0
        LDA      #$81                ;Opcode For<RTS>
        STA      BUFF+3
DLINE:                               ;****
        JSR      CRLF
        LDX      BUFF+1              ;Display Address
        LDA      NUFF+2
        JSR      OUT4H
        JSR      OUT4SP
        CLRX
        CLRH
DHEX:                                ;****Display Code inthe Next 16 Addresses Using HEX 
        JSR      BUFF
        JSR      OUT2H
        JSR      OUT1SP
        INCX 
        CMPX     #$10
        BNE      DHEX
        JSR      OUT4SP
        CLRX
        CLRH
DASC:                                ;Display Code In The Next 16 Addresses Using ASCII
        JSR      BUFF
        JSR      OUTASC
        INCX
        CMPX     #$10                ;Add $10, If Lower Than Higher Address,Loop
        ADD      BUFF+2
        STA      BUFF+2
        LDA      #$00
        ADC      BUFF+1
        STA      BUFF+1
        CMP      BUFF+4
        BCS      DLINE
        BEQ      LOWDG2
LOWDG2:
        LDA      BUFF+2
        CMP      BUFF+5
        BCC      MDX
        BRA      DLINE
;*===============================================================
;* Display Contents In A ASCII
;*===============================================================

OUTASC:                              ;If <=$20 Or>=$7E,Display '.'
        CMP      #$20
        BCS      PERIOD
        CMP      #$7E
        BLS      PRTASC
PERIOD:                              ;****
        LDA      #'.'
PRTASC:                              ;****
        JSR      OUTCH
        RTS
        
;*===============================================================
;* COMMAND 'E':Erase A Range Of FLASH
;*===============================================================
ERASE:
        JSR      IN4H                ;Receive Lower Addres
        BCS      MIDJMP_ERAX         
        STX      BUFF+1
        STA      BUFF+2
        LDHX     BUFF+1
        CPHX     #ROM_END
        BHS      E_INVALID_ADD
        LDA      #'-'
        JSR      OUTCH
        JSR      IN4H                ;Receive Higher Address
        BCS      MIDJMP_ERAX
        STX      BUFF+4
        STA      BUFF+5
;*
USER_ERASE:
        JSR      SET_TIME_TABLE
        CLR      FLASHFLAG           ;FLASHFLAG=0
        LDA      #$C7                ;Opcode For<STA Addr16>
        STA      BUFF+0
        LDA      #$81                ;Opcode For<RTS>
        STA      BUFF+3
        LDX      BUFF+1
        STX      ERASEBEGIN
        LDA      BUFF+2
        STA      ERASEBEGIN+1
        AND      #%10000000          ;Change BUFF+2 To Begin Of Each Erasing
                                     ;Page xx00 or xx80
        STA      BUFF+2
        LDHX     BUFF+1
        CPHX     #ROM_END
        BHS      E_INVALID_ADD
                                     ;Make Sure Lower Address Lower Than The Higher
        LDHX     BUFF+4
        CPHX     #ROM_END
        BHS      E_INVALID_ADD
;*
        LDX      BUFF+4
        CMPX     BUFF+1
        BLO      MIDJMP_ERAX
        BHI      INPUTVALID
        LDA      BUFF+5
        CMP      ERASEBEGIN+1
        BLO      MIDJMP_ERAX
        BRA      INPUTVALID
MIDJMP_ERAX:
        JMP      ERAX
E_INVALID_ADD:
        JSR      CRLF
        LDHX     #$00
E_IA_MSG:
        LDA      MIA_MSG,X           ;Output String 'Address Invalid
                                     ;(Not in RAM or FLASH'
        CMP      #$04
        BEQ      MEX
        JSR      OUTCH
        AIX      #1
        BRA      E_IA_MAG
MEX:    RTS
INPUTVALID:                          ;ERASE THE FIRST PAGE
        LDHX     BUFF+1
        JSR      SUB_LOAD_80         ;FLASH->RAM
        MOV      #$FF,TEMP           ;While Not In The Same Page
        LDA      BUFF+4
        CMP      BUFF+1
        BNE      E_END_FF
;*;Whether The Two Addresses In The Same Page
        LDA      BUFF+2
        ORA      #$7F
        CMP      BUFF+5
        BLS      E_END_FF
        LDA      BUFF+5
        ORA      #$80
        STA      TEMP                ;While In The Same Page
E_END_FF:
        LDA      ERASEBEGIN+1
        ORA      #$80
        LDHX     #0100
        TAX   
        LDA      #$FF
E_CLR_RAM:                           ;Store $FF To The RAM Area To Erase
        STA      ,X
        AIX      #1
        CPX      #0
        BEQ      E_OVERFLOW
        CPX      TEMP
        BLS      E_CLR_RAM
E_OVERFLOW:
        JSR      BUB_RESTORE_80      ;RAM->FLASH
;*
        LDA      BUFF+2
        ADD      #$80                ;Prepare To Erase Next Page
        STA      BUFF+2
        LDA      BUFF+1
        ADC      #0
        STA      BUFF+1
        LDA      BUFF+5
        LDX      BUFF+4
;*
        LDHX     #PROG_BEGIN
        STHX     TEMPHX
        LDHX     #SUB_ERASE          ;Move The Program From Flash To RAM
NXTMOVE:                             ;****
        MOV      X+,TEMP2
        PSHH
        PSHX 
        LDHX     TEMPH
        MOV      TEMP2,X+
NXT:    STHX     TEMPH               ;****
        PULX     
        PULH
        CPHX     #SUB_PROGRAM
        BNE      NXTMOVE
;*
        LDA      BUFF+5
        LDX      BUFF+4
ERAREP:                              ;Whether The Two Addresses In The Same Page
        CMPX     BUFF+1
        BEQ      LOWBYTE
        BCC      ERAPAGE
        BRA      ERAX1               ;If Lower>Higher,Return,(X=BUFF+4)
LOWBYTE:
        AND      #$80
        CMP      BUFF+2
        BLO      ERAX1
        BHI      ERAPAGE             ;If Not In The Same Page,ERAPAGE 
;*
        LDHX     BUFF+1              ;If In The Same Page
        JSR      SUB_LOAD_80         ;FLASH->RAM
        LDA      BUFF+5
        ORA      #$80
        STA      TEMP
        LDHX     #$0180
        LDA      #$FF
E_ERA_RAM:
        STA      ,X
        AIX      #1
        CPX      #0
        BEQ      E_OVERFLOW_1
        BLS      E_ERA_RAM
;*
E_OVERFLOW_1:
        JSR      SUB_RESTORE_80      ;RAM->FLASH
;*
ERAX1:  JSR      CRLF                ;Display '****-****'
        LDX      ERASEBEGIN
        LDA      ERASEBEGIN+1
        JSR      OUT4H
        LDA      #'-'
        JSR      OUTCH
        LDX      BUFF+4
        LDA      BUFF+5
        JSR      OUT4H
;*  
        LDHX     ERASEBEGIN
E_CON_VR:                            ;Check Erasing Is Successful
        LDA      ,X
        COMA                         ;If Every Code In The Area Is $FF
        BNE      E_ERROR_ERA         ;It Is Successful
        AIX      #1
        CPHX     BUFF+4
        BLS      E_CON_VR
        BRA      E_DISP_RESULT
        
E_ERROR_ERA:
        BSET     B_ERROR,FLASHFLAG   ;Wrong,Set B_ERROR Of FLASGFLAG
;*
E_DISP_RESULT:                       ;Display MSG
        LDHX     #0
        BRSET    B_ERROR,FLASHFLAG,ERAERROR
        LDHX     #{ERA_SUC_MSG-ERA_ERR_MSG}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -