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

📄 slfprg-abasaz.asm

📁 M68HC08及HCS08系列单片机bootloader引导程序源码/示例
💻 ASM
📖 第 1 页 / 共 2 页
字号:

    		BSR     GETADDR

    		JSR		EETEST			; go'n'check EEPROM address area
    		BCS		EEERASE
    		
    		LDHX	#ERASE_ALG		; LOAD ERASE ALGORITHM TO RAM
    		STHX    SOURCE
    		MOV		#ERASE_ALG_END-ERASE_ALG,STAT

    		BRA 	CPYPRNGORAM		; prepare FLCR & FLBPR address in RAM and JUMP to PRG then!
		
EEERASE:		
    		LDA		#%00010110	; block erase, EELAT & AUTO bit
    		LDHX	REECR
    		STA		,X			; EEPROM block erase
    		
    		LDHX	ADRS
    		STA		,X			; latch address

    		LDA		#%00010111	; EEPGM on now
    		LDHX	REECR
    		STA		,X			; EEPROM block erase

WAUTOE:
    		LDA		,X			; fetch EECR
    		AND		#%00000001	; mask EEPGM bit
    		BNE		WAUTOE
    							; A zeroed
    		STA		,X			; EECTL off completely

    		JMP		SUCC
;*******************************************************************************************
WR_DATA_COM:
    		BSR     GETADDR

    		BSR     READ
    		STA		LEN
    		STA		STAT
    		LDHX	#DAT
WR_DATA_L1:
    		BSR     READ
    		STA		,X
    		AIX		#1
    		DBNZ	STAT,WR_DATA_L1
    								; START OF SELF-PROGRAMMING

    		JSR		EETEST			; go'n'check EEPROM address area
    		BCS		WREEP

        TSX
        STHX    STACK           ; copy stack for later re-call

WR_BUF:
    		LDHX	#WR_ALG			; LOAD WRITE ALGORITHM TO RAM
    		STHX    SOURCE
    		MOV		#WR_ALG_END-WR_ALG,STAT

    		BRA 	CPYPRNGORAM		; copyprepare FLCR & FLBPR address in RAM and JUMP to PRG then!, or do EEPROM pgming!

WREEP:
        LDHX	#DAT            ; prepare addrs'
    		MOV		LEN,POM
EWR_ALG_L1:
    		LDA		,X
    		BSR 	EEWRITE
    		AIX		#1
    		DBNZ	POM,EWR_ALG_L1   ; copy desired block of data

    		JMP		SUCC


RETWR:  LDHX    STACK
        TXS                     ; restore stack
        
        JMP     SUCC      

;*******************************************************************************************
CPYPRNGORAM:
        TSX
        STHX    STACKCPY          ; copy stack for later re-call
        
    		LDHX	SOURCE			; LOAD WRITE ALGORITHM TO RAM
    		TXS
    		LDHX	#PRG
CPY_PRG_L1:
    		PULA
    		STA		,X
    		AIX		#1
    		DBNZ	STAT,CPY_PRG_L1
        
        LDHX    STACKCPY
        TXS                     ; restore stack

    		LDHX	#$8000
    		CPHX	ADRS			; FLASH1/FLASH2 boundary at $8000
    		
    		BHI		FL2SEL			; if 8000 < ADRS (ie. FLASH1, hi)
    		
    		LDHX	#FL1CR			; ADRS >= $8000
    		STHX	RFLCR
    		LDHX	#FL1BPR
    		BRA		GORAM
FL2SEL:			
    		LDHX	#FL2CR			; ADRS < $8000
    		STHX	RFLCR
    		LDHX	#FL2BPR
GORAM:	STHX	RFLBPR
    		JMP		PRG				; jump to RAM program

;*******************************************************************************************
EETEST:	
    		LDHX	ADRS
    		CPHX	#$0600
    		BLO		FLASH			; not eeprom
    								; ADRS >= $600
    		CPHX	#$0A00							
    		BHS		FLASH			; right in the middle
    								; ADRS < $A00
    		CPHX	#$0800
    		BLO		EE2SEL

    		LDHX	#EE1CR			; ADRS < $800
    		BRA		GORAM2
		
EE2SEL:	LDHX	#EE2CR		
GORAM2:	STHX	REECR			; prepare EECR addr into RAM

    		SEC
    		RTS						; set carry to indicate EEPROM

FLASH:	CLC
    		RTS						; carry clear for Flash
				
;*******************************************************************************************
EEWRITE:
    		PSHH
    		PSHX
    		PSHA
    		
    		LDA		#%00000110	; byte write, EELAT
    		LDHX	REECR
    		STA		,X			; EEPROM block erase
    		
    		LDHX	ADRS
    		PULA
    		STA		,X			; latch address & store data into EEPROM

    		AIX		#1
    		STHX	ADRS

    		LDA		#%00000111	; EEPGM on now
    		LDHX	REECR
    		STA		,X			; EEPROM block erase

WAUTOW:
    		LDA		,X			; fetch EECR
    		AND		#%00000001	; mask EEPGM bit
    		BNE		WAUTOW
    							; A zeroed
    		STA		,X			; EECTL off completely
    		
    		PULX
    		PULH
    		RTS
;*******************************************************************************************
ERASE_ALG:

        LDA     #%00000010   
        LDHX	RFLCR
        STA     ,X              ; PGM bit on
        LDHX	RFLBPR
        LDA     ,X              ; dummy read FLBPR

    		LDHX	ADRS            ; write anything
    		STA		,X              ; to desired range
        D_US	#T10US			; wait 10us (tNVS)

        LDA     #%00001010
        LDHX	RFLCR
        STA     ,X              ; PGM bit on
    		D_MS	#T1MS			; wait 1ms (tERASE), modifies X!

        LDA     #%00001000
        LDHX	RFLCR
        STA     ,X              ; PGM bit on
    		D_US	#T5US			; wait 5us (tNVH)

        CLRA
        STA     ,X              ; PGM bit on
    		D_US	#T1US			; wait 1us (tRCV)
    	
    		JMP		SUCC            ; finish with ACK
ERASE_ALG_END:
;*******************************************************************************************
WR_ALG:
        LDA     #%00000001
        LDHX	RFLCR
        STA     ,X              ; PGM bit on
        LDHX	RFLBPR
        LDA     ,X              ; dummy read FLBPR

        LDHX	ADRS            ; prepare addrs'
        STA     ,X              ; and write to desired range
        D_US	#T10US			; wait 10us (tNVS)

        LDA     #%00001001
        LDHX	RFLCR
        STA     ,X              ; PGM bit on
    		D_US	#T5US			; wait 5us (tPGS)

        LDHX	#DAT            ; prepare addrs'
    		TXS
    		LDHX	ADRS
    		MOV		LEN,POM
WR_ALG_L1:
    		PULA
    		STA		,X
    		AIX		#1
    		D_US	#T30US			; wait 30us (tPROG)
    		DBNZ	POM,WR_ALG_L1   ; copy desired block of data

        LDA     #%00001000
        LDHX	RFLCR
        STA     ,X              ; PGM bit on
    		D_US	#T5US			; wait 5us (tNVH)

        CLRA
        STA     ,X              ; PGM bit on
    		D_US	#T1US			; wait 1us (tRCV)
    	
    		JMP		RETWR           ; finish with ACK (& restore STACK before)
WR_ALG_END:
;*******************************************************************************************
; SIZE = 60 END /all FLBPR, FLCR and EECR registers are stored in RAM (according to memory bank used)/
;*******************************************************************************************
	ELSE IF SIZE = 32
;*******************************************************************************************
ERASE_COM:

    		BSR     GETADDR

    		LDHX	ADRS
    		CPHX	#$0A00							

    		BLO 	EEERASE
    		
    		LDHX	#ERASE_ALG		; LOAD ERASE ALGORITHM TO RAM
    		STHX    SOURCE
    		MOV		#ERASE_ALG_END-ERASE_ALG,STAT

    		BRA 	CPYPRNGORAM		; prepare FLCR & FLBPR address in RAM and JUMP to PRG then!
    		
EEERASE:		
    		LDA		#%00010110	; block erase, EELAT & AUTO!
    		STA		EE1CR		; EEPROM block erase
    		
    		LDHX	ADRS
    		STA		,X			; latch address

    		LDA		#%00010111	; EEPGM on now
    		STA		EE1CR		; EEPROM block erase

WAUTOE:	LDA		EE1CR
    		AND		#%00000001	; mask EEPGM bit
    		BNE		WAUTOE
    							; A is zero	now		
    		STA		EE1CR		; EECTL off completely

    		JMP		SUCC
;*******************************************************************************************
WR_DATA_COM:
    		BSR     GETADDR

    		BSR     READ
    		STA		LEN
    		STA		STAT
    		LDHX	#DAT
WR_DATA_L1:
    		BSR     READ
    		STA		,X
    		AIX		#1
    		DBNZ	STAT,WR_DATA_L1
    								; START OF SELF-PROGRAMMING
    		LDHX	ADRS
    		CPHX	#$0A00							
    		BLO		WREEP

        TSX
        STHX    STACK           ; copy stack for later re-call

WR_BUF:
    		LDHX	#WR_ALG			; LOAD WRITE ALGORITHM TO RAM
    		STHX    SOURCE
    		MOV		#WR_ALG_END-WR_ALG,STAT

    		BRA 	CPYPRNGORAM		; prepare FLCR & FLBPR address in RAM and JUMP to PRG then!

WREEP:
        LDHX	#DAT            ; prepare addrs'
    		MOV		LEN,POM
EWR_ALG_L1:
    		LDA		,X
    		BSR 	EEWRITE
    		AIX		#1
    		DBNZ	POM,EWR_ALG_L1   ; copy desired block of data

    		JMP		SUCC


RETWR:  LDHX    STACK
        TXS                     ; restore stack
        
        JMP     SUCC      

;*******************************************************************************************
CPYPRNGORAM:
        TSX
        STHX    STACKCPY          ; copy stack for later re-call
        
    		LDHX	SOURCE			; LOAD WRITE ALGORITHM TO RAM
    		TXS
    		LDHX	#PRG
CPY_PRG_L1:
    		PULA
    		STA		,X
    		AIX		#1
    		DBNZ	STAT,CPY_PRG_L1
        
        LDHX    STACKCPY
        TXS                     ; restore stack

    		JMP		PRG				; jump to RAM program

;*******************************************************************************************
EEWRITE:
    		PSHH
    		PSHX
    		PSHA
    		
    		LDA		#%00000110	; byte write, EELAT & AUTO
    		STA		EE1CR		; EEPROM block erase
    		
    		LDHX	ADRS
    		PULA
    		STA		,X			; latch address & store data into EEPROM

    		AIX		#1
    		STHX	ADRS

    		LDA		#%00000111	; EEPGM on now
    		STA		EE1CR		; EEPROM block erase

WAUTOW:	LDA		EE1CR
    		AND		#%00000001	; mask EEPGM bit
    		BNE		WAUTOW
    							; A is zero	now
    		STA		EE1CR		; EECTL off completely
    		
    		PULX
    		PULH
    		RTS
;*******************************************************************************************
ERASE_ALG:

        LDA     #%00000010   
        STA     FL1CR           ; ERASE bit on
        LDA     FL1BPR          ; dummy read FLBPR

    		LDHX	ADRS            ; write anything
    		STA		,X              ; to desired range
        D_US	#T10US			; wait 10us (tNVS)

        LDA     #%00001010
        STA     FL1CR           ; ERASE bit on, HVEN bit on
    		D_MS	#T1MS			; wait 1ms (tERASE), modifies X!

        LDA     #%00001000
        STA     FL1CR           ; ERASE bit on, HVEN bit off
    		D_US	#T5US			; wait 5us (tNVH), A zero on exit

        STA     FL1CR           ; ERASE bit off
    		D_US	#T1US			; wait 1us (tRCV)
	
    		JMP		SUCC            ; finish with ACK
ERASE_ALG_END:
;*******************************************************************************************
WR_ALG:
        LDA     #%00000001
        STA     FL1CR           ; PGM bit on
        LDA     FL1BPR          ; dummy read FLBPR

        LDHX	ADRS            ; prepare addrs'
        STA     ,X              ; and write to desired range
        D_US	#T10US			; wait 10us (tNVS)

        LDA     #%00001001
        STA     FL1CR           ; PGM bit on, HVEN bit on
    		D_US	#T5US			; wait 5us (tPGS)

        LDHX	#DAT            ; prepare addrs'
    		TXS
    		LDHX	ADRS
    		MOV		LEN,POM
WR_ALG_L1:
    		PULA
    		STA		,X
    		AIX		#1
    		D_US	#T30US			; wait 30us (tPROG)
    		DBNZ	POM,WR_ALG_L1   ; copy desired block of data

        LDA     #%00001000
        STA     FL1CR           ; PGM bit on, HVEN bit off
    		D_US	#T5US			; wait 5us (tNVH), A zero on exit

        STA     FL1CR           ; PGM bit off
    		D_US	#T1US			; wait 1us (tRCV)
	
    		JMP		RETWR           ; finish with ACK (& restore STACK before)
WR_ALG_END:
;*******************************************************************************************
; SIZE = 32 END /all FLBPR, FLCR and EECR registers are fixed to FLASH-1 or EEPROM-1/
;*******************************************************************************************
	ENDIF
END            

⌨️ 快捷键说明

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