📄 slfprg-s08dz.asm
字号:
;*********************************************************************
; HEADER_START
;
; $File Name: slfprg-s08dz.asm$
; Project: Developper's HC08 Bootloader Slave
; Description: S08DZ main bootloader file
; Platform: HCS08
; $Version: 9.0.12.0$
; $Date: Jun-13-2008$
; $Last Modified By: r30323$
; Company: Freescale Semiconductor
; Security: General Business
;
; ===================================================================
; Copyright (c): Freescale Semiconductor, 2007, All rights reserved.
;
; ===================================================================
; THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY
; EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FREESCALE OR
; ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
; OF THE POSSIBILITY OF SUCH DAMAGE.
; ===================================================================
;
; HEADER_END
; labels SCI, SIZE and IRQOPTION defined externally:
; SIZE = 16, 32, 48, 60 depending whether what memory size of DZ family is required
;
; if EEPROM is defined -> DZ family used (EEPROM support)
; if EEPROM is *NOT* defined, it defaults to DV family (no EEPROM support)
;
; IRQOPTION *NOT* defined >> regular version (bootloader starts always after POR)
; IRQOPTION defined >> using IRQ option (bootloading won't start if IRQ high)
;
; label SCI = 1, 2 selects what SCI channel is used
; label HISPEED => if defined, 38400Bd is used instead of 9600Bd
;!!!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;!!!
;!!! This S08DZ bootloader requires hc08sprg.exe of version 9.0.37.0 or higher
;!!!
;!!!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
include "mc9s08dz60.inc"
IFNDEF SCI
SCI EQU 1
ENDIF
PF equ 0
FE equ 1
NF equ 2
OR equ 3
IDLE equ 4
RDRF equ 5
TC equ 6
TDRE equ 7
IF SCI = 1
SCIBDH equ SCI1BDH
SCIBDL equ SCI1BDL
SCC1 equ SCI1C1
SCC2 equ SCI1C2
SCC3 equ SCI1C3
SCS1 equ SCI1S1
SCS2 equ SCI1S2
SCDR equ SCI1D
ENDIF
IF SCI = 2
SCIBDH equ SCI2BDH
SCIBDL equ SCI2BDL
SCC1 equ SCI2C1
SCC2 equ SCI2C2
SCC3 equ SCI2C3
SCS1 equ SCI2S1
SCS2 equ SCI2S2
SCDR equ SCI2D
ENDIF
RCS_ENA EQU 1 ; READ COMMAND SUPPORTED?
IF RCS_ENA = 1
RCS EQU $80 ; READ COMMAND SUPPORTED
ELSE
RCS EQU 0 ; READ COMMAND unSUPPORTED
ENDIF
VER_NUM EQU $06 ; FC protocol version number (S08 long)
; same as protocol version 2
; except that Erase block is not
; sized as power of two, just for compatibility
; reasons ie. this bootloader will abort if used
; with old version of hc08sprg.exe (that does not yet
; support this 'non-binary' page sizes)
; plus it has 24 bits addressing
IDENTS MACRO
DC.B 'DZ'
IF SIZE = 16
DC.B '16' ; 16kB string
ENDIF
IF SIZE = 32
DC.B '32' ; 32kB string
ENDIF
IF SIZE = 48
DC.B '48' ; 48kB string
ENDIF
IF SIZE = 60
DC.B '60' ; 60kB string
ENDIF
IFDEF IRQOPTION
DC.B '-irq' ; IRQ option used
ENDIF
DC.B 0
ENDM
ERBLK_LEN EQU 768
WRBLK_LEN EQU 32
ADDR24 MACRO
DC.B (\1) / $10000
DC.W (\1) & $0FFFF
ENDM
IFDEF EEPROM ; DZ family
EEPBLKS EQU 2 ; 2 EEPROM blocks here
IF SIZE = 16
FLS_BEG EQU $BE00 ; FLASH #0 block start
FLS_END EQU $F9C0 ; FLASH #0 block end
NFLBLKS EQU 1 ; one continuous block
EEP_BEG EQU $1700 ; EEPROM #0 block start
ENDIF
IF SIZE = 32
FLS_BEG EQU $7C00 ; FLASH #0 block start
FLS_END EQU $F9C0 ; FLASH #0 block end
NFLBLKS EQU 1 ; one continuous block
EEP_BEG EQU $1600 ; EEPROM #0 block start
ENDIF
IF SIZE = 48
FLS_BEG EQU $4000 ; FLASH #0 block start
FLS_END EQU $F9C0 ; FLASH #0 block end
NFLBLKS EQU 1 ; one continuous block
EEP_BEG EQU $1500 ; EEPROM #0 block start
ENDIF
IF SIZE = 60
FLS_BEG EQU $1080 ; FLASH #0 block start
FLS_END EQU $1400 ; FLASH #0 block end
FLS_BEG1 EQU $1900 ; FLASH #1 block start
FLS_END1 EQU $F9C0 ; FLASH #1 block end
NFLBLKS EQU 2 ; two continuous blocks
EEP_BEG EQU $1400 ; EEPROM #0 block start
ENDIF
EEP_END EQU $1800 ; EEPROM page 0 end
; EEPROM page 1 is $10000 higher
ELSE ; DV family
EEPBLKS EQU 0 ; no EEPROM blocks here
IF SIZE = 16
FLS_BEG EQU $BE00 ; FLASH #0 block start
FLS_END EQU $F9C0 ; FLASH #0 block end
NFLBLKS EQU 1 ; one continuous block
ENDIF
IF SIZE = 32
FLS_BEG EQU $7C00 ; FLASH #0 block start
FLS_END EQU $F9C0 ; FLASH #0 block end
NFLBLKS EQU 1 ; one continuous block
ENDIF
IF SIZE = 48
FLS_BEG EQU $4000 ; FLASH #0 block start
FLS_END EQU $F9C0 ; FLASH #0 block end
NFLBLKS EQU 1 ; one continuous block
ENDIF
IF SIZE = 60
FLS_BEG EQU $0C80 ; FLASH #0 block start
FLS_END EQU $1400 ; FLASH #0 block end
FLS_BEG1 EQU $1900 ; FLASH #1 block start
FLS_END1 EQU $F9C0 ; FLASH #1 block end
NFLBLKS EQU 2 ; two continuous blocks
ENDIF
ENDIF
REL_VECT EQU $F9C0 ; newly relocated int. vectors
INT_VECT EQU $FFC0 ; start of table of original vectros!
XDEF main
;*******************************************************************************************
WR_DATA EQU 'W'
RD_DATA EQU 'R'
ENDPRG EQU 'Q'
ERASE EQU 'E'
ACK EQU $FC
IDENT EQU 'I'
T100MS EQU 255
ILOP MACRO
DC.B $8d ; this is illegal operation code
ENDM
;*******************************************************************************************
MY_ZEROPAGE: SECTION SHORT
ADRS: DS.W 1
ADRR: DS.W 1
LEN: DS.B 1
STAT: DS.B 1
STACK: DS.W 1
DEFAULT_RAM: SECTION
DATA: DS.B WRBLK_LEN
;*******************************************************************************************
DEFAULT_ROM: SECTION
ID_STRING:
DC.B NFLBLKS+EEPBLKS ; number of Flash blocks (+2 EEPROM blocks)
ADDR24 FLS_BEG ; START ADDRESS OF FLASH
ADDR24 FLS_END ; END ADDRESS OF FLASH
IF NFLBLKS >= 2
ADDR24 FLS_BEG1 ; START ADDRESS OF FLASH #2
ADDR24 FLS_END1 ; END ADDRESS OF FLASH #2
ENDIF
IFDEF EEPROM
ADDR24 EEP_BEG ; START ADDRESS OF EEP0
ADDR24 EEP_END ; END ADDRESS OF EEP0
ADDR24 EEP_BEG + $10000 ; START ADDRESS OF EEP1
ADDR24 EEP_END + $10000 ; END ADDRESS OF EEP1
ENDIF
DC.W REL_VECT ; POINTER TO APPLICATION VECTOR TABLE
DC.W INT_VECT ; POINTER TO BEGINING OF FLASH INT. VECTORS
DC.W ERBLK_LEN ; ERASE BLCK LENGTH OF FLASH ALG.
DC.W WRBLK_LEN ; WRITE BLCK LENGTH OF FLASH ALG.
IDENTS
ID_STRING_END:
XDEF NVPROT
XDEF NVOPT
;*******************************************************************************************
NVPROT_ROM: SECTION
NVPROT DC.B %00111110 ; fpopen, flash protected (from 0xFE00)
NVOPT_ROM: SECTION
NVOPT DC.B %00100010 ; backdoor enable, redirection enable, (un)secured flash [last 10], 8 byte EEPROM
DEFAULT_ROM: SECTION
;*******************************************************************************************
main:
IFDEF IRQOPTION
BIH PVEC0 ; if IRQ high, jump directly to real app.
ENDIF
LDA SRS ; fetch RESET status reg.
TSTA ; check if zero (this happens if RESET pulse is too short)
BEQ slfprg ; if so, jump to self programming
AND #%11000000 ; mask only POR and PIN RESET source
BNE slfprg ; any of these sources, go to self programming
PVEC0:
LDHX #(REL_VECT|$00FF)&$FFFE ; there should be relocated reset vector of the new app.
LDA ,X
PSHA
AND 1,X
LDX 1,X
PULH
INCA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -