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

📄 slfprg-s08dz128.asm

📁 M68HC08及HCS08系列单片机bootloader引导程序源码/示例
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	  ELSE
    		MOV	  	#13, SCIBDL				; BUS (8M)/(16 * 13) = 38400Bd
	  ENDIF
      	CLR     SCC3

; OPTIONAL DELAY - if your RS232 hardware is lazy, uncomment following delay

;        CLRX
;DLY2:   CLRA
;DLY1:   NOP
;        
;        DBNZA   DLY1
;        DBNZX   DLY2
;

      	LDA	    SCS1
      	MOV	    #ACK,SCDR

      	LDX	    #T100MS
L2:	    CLRA
L1:	    BRSET 	RDRF,SCS1,CAUGHT
      	DBNZA	  L1
      	DBNZX	  L2
ILOP:
;       timeout
        ILOP          ; generate RESET by doing illegal operation
;*******************************************************************************************
CAUGHT:			; CAUGHT IN SELF-PROGRAMMING?
      	BSR     READ
        CBEQA   #ACK, SUCC       ; Got ACK!

        ILOP          ; generate RESET by doing illegal operation
;*******************************************************************************************
       IFDEF EEPROM
EECHECK:
        DBNZA   EPAGE0
        LDA     #mFCNFG_EPGSEL        
        BRA     ECFG
EPAGE0: CLRA     
ECFG:   STA     FCNFG        
        RTS
       ENDIF
;*******************************************************************************************
; successful return from all write routines
SUCC:
        LDA     #ACK
      	BSR     WRITE

;fall thru to background
;*******************************************************************************************

; BEGIN OF BACKGROUND COMMAND LOOP
BCKGND:
      	BSR     READ
            
        CBEQA   #ERASE, ERASE_COM       ; Erase command
        CBEQA   #WR_DATA, WR_DATA_COM   ; Write (program) command
        CBEQA   #IDENT, IDENT_COM       ; Ident command
      IF RCS_ENA = 1
        CBEQA   #RD_DATA, RD_DATA_COM   ; Read command
      ENDIF

        ; if no valid command found (including Quit)
        ; generate reset too!
        ILOP          ; generate RESET by doing illegal operation
        
;*******************************************************************************************
IDENT_COM:                      ; TRANSFER OF IDENTIFICATION STRING
        LDA     #(VER_NUM | RCS)  ; version number & "Read command supported" flag
    		BSR	  	WRITE
    		LDA	  	SDIDH			; system device identification 1 register (high)
    		BSR	  	WRITE
    		LDA	  	SDIDL			; system device identification 1 register (low)
    		BSR	  	WRITE

        MOV     #ID_STRING_END-ID_STRING, LEN
    		LDHX  	#ID_STRING
        BSR     WRITE_LOOP
                 
        BRA     BCKGND          ; finish without ACK
;*******************************************************************************************
WRITE_LOOP:             ; start address in HX, length in LEN
      	LDA	    ,X
        BSR	    WRITE
      	AIX	    #1
        DBNZ    LEN, WRITE_LOOP
        RTS
;*******************************************************************************************
      IF RCS_ENA = 1
RD_DATA_COM:

      	BSR     READ
      	STA	    PPAGE   
       IFDEF EEPROM
      	BSR     EECHECK   
       ENDIF
      	BSR     READ
      	STA	    ADRS
      	BSR     READ
      	STA	    ADRS+1
      	BSR     READ
      	STA	    LEN
      	LDHX  	ADRS
        
        BSR     WRITE_LOOP

        BRA     BCKGND          ; finish without ACK
      ENDIF

;*******************************************************************************************
WRITE:	
        BRCLR 	TC,SCS1,WRITE
      	STA	    SCDR
      	RTS
READ:
        BRCLR	  RDRF,SCS1,READ
      	LDA	    SCDR
      	RTS
;*******************************************************************************************
ERASE_COM:
      	BSR     READ
      	STA	    PPAGE
       IFDEF EEPROM
      	BSR     EECHECK   
       ENDIF
      	BSR     READ
      	STA	    ADRS
      	BSR     READ
      	STA	    ADRS+1

       IFDEF EEPROM
    		LDHX	  ADRS			    ; any EEPROM page?
    		CPHX	  #EEP_END
    		BHI		  E_FLASH 			; if EEP_END < ADRS (ie. FLASH)

    		CPHX	  #EEP_BEG
    		BHI		  E_EEPROM 			; if EEP_BEG < ADRS (ie. EEPROM)
       ENDIF

E_FLASH:
    		lda   	#(mFSTAT_FPVIOL+mFSTAT_FACCERR) ;mask
    		sta   	FSTAT 				      ;abort any command and clear errors

    		mov	  	#EraseSubSize, STAT	;length of flash erase routine to STAT
    		tsx
    		sthx  	STACK
    		ldhx  	#EraseSubEnd-1 	    ;point at last byte to move to stack

    		bra   	DoOnStack 			    ;execute prog code from stack RAM
;*******************************************************************************************
WR_DATA_COM:
      	BSR     READ
      	STA	    PPAGE   
       IFDEF EEPROM
      	JSR     EECHECK   
       ENDIF
      	BSR     READ
      	STA	    ADRS
      	BSR     READ
      	STA	    ADRS+1
      	BSR     READ
      	STA	    STAT
        STA     LEN
        LDHX    #DATA
        STHX  	ADRR
WR_DATA_L1:
      	BSR     READ
        STA     ,X
        AIX     #1
        DBNZ    STAT,WR_DATA_L1
		
    		lda   	#(mFSTAT_FPVIOL+mFSTAT_FACCERR) ;mask
    		sta   	FSTAT 				;abort any command and clear errors

    		mov		  #ProgSubSize, STAT	;length of flash prog routine to STAT
    		tsx
    		sthx  	STACK
    		ldhx 	  #ProgSubEnd-1		;point at last byte to move to stack

;		bra 	DoOnStack 			;execute prog code from stack RAM
		; fallthru to this routine
;*******************************************************************************************
DoOnStack: 
    		lda   	,x 				;read from flash
    		psha 					;move onto stack
    		aix 	  #-1 			;next byte to move
    		dbnz  	STAT, DoOnStack
    		tsx 					;point to sub on stack
    		jmp 	  ,x 				;execute the sub on the stack (will return on it's own)		
;*******************************************************************************************
;*******************************************************************************************
       IFDEF EEPROM
E_EEPROM:			
        STA     ,X      ;latch the unprotected address from H:X
        NOP             ;brief delay to allow the command state machine to start
        STA     ,X      ;intentionally cause an access error to abort this command    		
        ; see errata
        
    		lda   	#(mFSTAT_FPVIOL+mFSTAT_FACCERR) ;mask
    		sta   	FSTAT 				      ;abort any command and clear errors

    		sta   	0,x 			   ;write to flash; latch addr and data
    		lda   	#mPageErase  ;get flash command
    		sta   	FCMD 			   ;write the flash command
    		lda   	#mFSTAT_FCBEF 		;mask to initiate command
    		sta   	FSTAT 			 ;[pwpp] register command
    		nop 					       ;[p] want min 4~ from w cycle to r
ChkDoneEErase: 
    		lda   	FSTAT 			 ;[prpp] so FCCF is valid
    		lsla 					       ;FCCF now in MSB
    		bpl   	ChkDoneEErase ;loop if FCCF = 0

        aix     #8
        
        cphx    #EEP_END
        blo     E_EEPROM
        
        jmp     SUCC		     ;refer status back to PC
       ENDIF
;*******************************************************************************************
;*******************************************************************************************
EraseSub: 	
    		ldhx  	ADRS		 	;get flash address
    		sta   	0,x 			;write to flash; latch addr and data
    		lda   	#mPageErase 	;get flash command
    		sta   	FCMD 			;write the flash command
    		lda   	#mFSTAT_FCBEF 		;mask to initiate command
    		sta   	FSTAT 			;[pwpp] register command
    		nop 					;[p] want min 4~ from w cycle to r
ChkDoneErase: 
    		lda   	FSTAT 			;[prpp] so FCCF is valid
    		lsla 					;FCCF now in MSB
    		bpl   	ChkDoneErase 	;loop if FCCF = 0

    		ldhx    STACK
    		txs
        jmp     SUCC		    ;refer status back to PC
EraseSubEnd: 
EraseSubSize: equ (*-EraseSub)
;*******************************************************************************************
ProgSub: 	
    		lda   	FSTAT 			;check FCBEF
    		and   	#mFSTAT_FCBEF 		;mask it
    		beq	  	ProgSub			;loop if not empty
    		
    		ldhx  	ADRR
    		lda	  	0,x
    		aix	  	#1
    		sthx  	ADRR
    		
    		ldhx  	ADRS		 	;get flash address
    		sta   	0,x 			;write to flash; latch addr and data
    		aix	  	#1
    		sthx  	ADRS
    		
    		lda   	#mBurstProg 	;get flash command
    		sta   	FCMD 			;write the flash command
    		lda   	#mFSTAT_FCBEF 		;mask to initiate command
    		sta   	FSTAT 			;[pwpp] register command
    		dbnz  	LEN,ProgSub		;all bytes in a row?
ChkDoneProg: 
    		lda   	FSTAT 			;[prpp] so FCCF is valid
    		lsla 					;FCCF now in MSB
    		bpl   	ChkDoneProg 	;loop if FCCF = 0
    		
    		ldhx	  STACK
    		txs
        jmp     SUCC	    	;refer status back to PC
ProgSubEnd: 
ProgSubSize: equ (*-ProgSub)
;*******************************************************************************************
END            

⌨️ 快捷键说明

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