; ***********************************************************************************************************************
;
;	Файл начальной загрузки. 
;	Необходимо использовать в проектах сгенерированных DAvE 2.2, в которых начальная инициализация выполняется в функции MAIN_vInit()
;	Также этот файл необходимо использовать при отладке программ в режиме BSL под управлением монитора
; 	В этом файле производится следующая настройка:
;	- 	отключение встроенного сторожевого таймера
;	- 	объявление и подключение системного стека
;	-	объявление трех стеков пользователя и подключение user stack в качестве рабочего
;	-	инициализиция регистров DPPx
;	-	объявление и инициализация регистрового банка 
;	-	объявление и инициализация блока констант для настроки интерфейса JTAG
;
; ***********************************************************************************************************************

SSTSZ    EQU    0x200 	 ; set System Stack Size to 200H Bytes.
USTSZ    EQU    0x200    ; set User Stack Size to 200H Bytes.
UST1SZ   EQU    0x20     ; set User Stack Size to 20H Bytes.
UST2SZ   EQU    0x20     ; set User Stack Size to 20H Bytes.

SP        DEFR   0FE12H
SPSEG     DEFR   0FF0CH
STKOV     DEFR   0FE14H
STKUN     DEFR   0FE16H
VECSEG    DEFR   0FF12H

STMEM0    DEFR   0F0A0H
ECCCON	  DEFR	 0F0A8H		
RSTCON0	  DEFR	 0F0B8H

$IF TINY
$SET (DPPUSE = 0)
$ENDIF

$IF NOT TINY
ASSUME  DPP3:SYSTEM
ASSUME  DPP2:NDATA
$ENDIF

NAME    ?C_STARTUP
PUBLIC  ?C_STARTUP

$IF MEDIUM OR LARGE OR HLARGE OR XLARGE
Model   LIT     'FAR'
$ELSE
Model   LIT     'NEAR'
$ENDIF

?C_MAINREGISTERS  REGDEF  R0 - R15

EXTRN   main:Model

; ***************** Define system, user, user1, user2 stack *********************
?C_USERSTACK    SECTION DATA PUBLIC 'NDATA'
?C_USRSTKBOT:
                DS      USTSZ           ; Size of User Stack
?C_USERSTKTOP:
?C_USERSTACK    ENDS
										; Define User Stack 1 area
?C_USERSTACK1   SECTION DATA PUBLIC 'NDATA'  
?C_USRSTKBOT1:
                DS      UST1SZ          ; Size of User Stack 1
?C_USERSTKTOP1:
?C_USERSTACK1   ENDS
										; Define User Stack 2 area
?C_USERSTACK2   SECTION DATA PUBLIC 'NDATA'	
?C_USRSTKBOT2:
                DS      UST2SZ          ; Size of User Stack 2
?C_USERSTKTOP2:
?C_USERSTACK2   ENDS

NDATA           DGROUP  ?C_USERSTACK, ?C_USERSTACK1, ?C_USERSTACK2

										; Define System Stack area
?C_SYSSTACK     SECTION DATA PUBLIC 'IDATA' 
$IF NOT TINY
SDATA           DGROUP  ?C_SYSSTACK
$ENDIF
_BOS:                                  
                DS      SSTSZ           ; Size of User Stack
_TOS:                                   
?C_SYSSTACK     ENDS

?C_SYSSTKBOT    EQU     _BOS
?C_SYSSTKTOP    EQU     _TOS

; ***************** End define system, user, user1, user2 stack ******************


?C_STARTUP_CODE SECTION CODE 'ICODE'


?C_RESET        PROC TASK C_STARTUP INTNO RESET = 0
?C_STARTUP:     LABEL   Model
    DISWDT             		    ; Disable watchdog timer

    MOV     STKUN,#SOF (_TOS)       ; INITIALIZE STACK UNFL REGISTER
    MOV     STKOV,#SOF (_BOS+6*2)   ; INITIALIZE STACK OVFL REGISTER
    MOV     SP,#SOF (_TOS)          ; INITIALIZE STACK POINTER
    MOV     SPSEG,#SEG (_TOS)       ; INITIALIZE STACK POINTER SEGMENT

$IF (BSL_MONITOR)
	MOV     VECSEG,#0000H
$ELSE  
	MOV     VECSEG,#00C0H
$ENDIF

$IF NOT TINY
	EXTRN   ?C_PAGEDPP0 : DATA16
	EXTRN   ?C_PAGEDPP1 : DATA16
	EXTRN   ?C_PAGEDPP2 : DATA16
	
$IF (DPPUSE = 1)
    MOV     DPP0,#?C_PAGEDPP0       ; INIT DPP0 VALUE
$ENDIF 
    MOV     DPP1,#?C_PAGEDPP1       ; DEFAULT NEAR CONST PAGE
    MOV     DPP2,#?C_PAGEDPP2       ; DEFAULT NEAR DATA  PAGE
$ENDIF

$IF NOT (BSL_MONITOR)
	MOV     R0,#STMEM0				; SET SFAR = 1 (sys. freq. above 80MHz)
	EXTR	#01H
	MOV		R1,[R0]
	OR		R1,#0020H
	EXTR	#01H
	MOV		[R0],R1

;******************************************************************************************
									; prepare and enable ECC for DPRAM, DSRAM, PSRAM, MultiCAN Memory				
	MOV     R0,#STMEM0				
	EXTR	#01H
	MOV		R1,[R0]
	JB		R1.15,next_step1		; if STMEM0.15 = 1 (RAM init. has been perfomed) -> jmp next_step1 								
	JNB		R1.4,next_step2			; if STMEM0.4 = 0 (functional reset) -> jmp next_step2	
									; if STMEM0.4 = 1 (Power-on - RAM Initialization is needed)
	
	MOV     R0,#STMEM0				; STMEM0 = 1011 1000 0010 0000b
	MOV		R1,#0B820H
	EXTR	#01H
	MOV		[R0],R1
	
	MOV     R0,#RSTCON0				; CPU reset type - application reset
	MOV		R1,#3000H
	EXTR	#01H
	MOV		[R0],R1
	SRST							; reset
	
next_step1:							
	AND		R1,#07FFH				; STMEM0.15 = 0 (clear RAM init. request)
	EXTR	#01H
	MOV		[R0],R1
	
next_step2:							; Enable ECC 
	MOV     R0,#ECCCON				; ECCCON = 0017h
	MOV		R1,#0017H
	EXTR	#01H
	MOV		[R0],R1
$ENDIF

	MOV     CP,#?C_MAINREGISTERS
	EINIT;               
	MOV     R0,#?C_USERSTKTOP

$IF TINY    
		JMP     main
$ELSE       
		JMP     FAR main
$ENDIF

?C_RESET        ENDP

?C_STARTUP_CODE ENDS

$IF NOT (BSL_MONITOR)
JTAG_CONST SECTION DATA AT 0C001F0H

  DW 03BFCH     
  DW 0C403H 

JTAG_CONST ENDS
$ENDIF


