255 lines
4.3 KiB
ArmAsm
255 lines
4.3 KiB
ArmAsm
/************************************************************************/
|
|
/* File Version: V1.10d */
|
|
/* Date Generated: 03/17/2025 */
|
|
/************************************************************************/
|
|
|
|
/*reset_program.asm*/
|
|
|
|
#ifdef CPPAPP
|
|
___dso_handle:
|
|
.global ___dso_handle
|
|
#endif
|
|
|
|
#if __clang_major__ <= 10
|
|
;; If you are using LLVM RL V10.0.0.202301 to V10.0.0.202312, please comment out the following three lines.
|
|
#define HIGHW(x) %hi16(x)
|
|
#define LOWW(x) x
|
|
#define LOW(x) x
|
|
#endif
|
|
|
|
.extern _HardwareSetup /*! external Sub-routine to initialise Hardware*/
|
|
.extern __data
|
|
.extern __mdata
|
|
.extern __ebss
|
|
.extern __bss
|
|
.extern __edata
|
|
.extern _main
|
|
.extern __stack
|
|
|
|
.text
|
|
|
|
.global _PowerON_Reset /*! global Start routine */
|
|
.type _PowerON_Reset,@function
|
|
/* call to _PowerON_Reset */
|
|
_PowerON_Reset:
|
|
/* initialise user stack pointer */
|
|
movw sp,#__stack /* Set stack pointer */
|
|
|
|
|
|
/* load data section from ROM to RAM */
|
|
;; block move to initialize .data
|
|
|
|
mov es, #LOW(HIGHW(__romdatastart))
|
|
movw bc, #LOWW(__romdatacopysize)
|
|
1:
|
|
movw ax, bc
|
|
cmpw ax, #0
|
|
bz $1f
|
|
decw bc
|
|
decw bc
|
|
movw ax, es:LOWW(__romdatastart)[bc]
|
|
movw LOWW(__datastart)[bc], ax
|
|
br $1b
|
|
|
|
;; if you used variables having initial value (far) then you would have to uncomment this.
|
|
;; For example: char __far variable = 1;
|
|
;1:
|
|
; mov es, #LOW(HIGHW(__romdatafstart))
|
|
; movw bc, #LOWW(__romdatafcopysize)
|
|
;1:
|
|
; movw ax, bc
|
|
; cmpw ax, #0
|
|
; bz $1f
|
|
; decw bc
|
|
; decw bc
|
|
; movw ax, es:LOWW(__romdatafstart)[bc]
|
|
; movw LOWW(__datafstart)[bc], ax
|
|
; br $1b
|
|
|
|
1:
|
|
mov es, #LOW(HIGHW(__romsdatastart))
|
|
movw bc, #LOWW(__romsdatacopysize)
|
|
1:
|
|
movw ax, bc
|
|
cmpw ax, #0
|
|
bz $1f
|
|
decw bc
|
|
decw bc
|
|
movw ax, es:LOWW(__romsdatastart)[bc]
|
|
movw LOWW(__sdatastart)[bc], ax
|
|
br $1b
|
|
|
|
;; block fill to .sbss
|
|
1:
|
|
#ifdef __OPTIMIZE_SIZE__
|
|
movw de, #LOWW(__sbsssize)
|
|
movw ax, #LOWW(__sbssstart)
|
|
clrw bc
|
|
call !!_memset
|
|
#else
|
|
movw bc, #LOWW(__sbsssize)
|
|
clrw ax
|
|
cmpw ax, bc
|
|
bz $_sbss_zero_done
|
|
1:
|
|
decw bc
|
|
decw bc
|
|
movw LOWW(__sbssstart)[bc], ax
|
|
cmpw ax, bc
|
|
bnz $1b
|
|
|
|
_sbss_zero_done:
|
|
#endif
|
|
|
|
;; block fill to .bss
|
|
|
|
#ifdef __OPTIMIZE_SIZE__
|
|
movw de, #LOWW(__bsssize)
|
|
movw ax, #LOWW(__bssstart)
|
|
clrw bc
|
|
call !!_memset
|
|
#else
|
|
movw bc, #LOWW(__bsssize)
|
|
clrw ax
|
|
cmpw ax, bc
|
|
bz $_bss_zero_done
|
|
1:
|
|
decw bc
|
|
decw bc
|
|
movw LOWW(__bssstart)[bc], ax
|
|
cmpw ax, bc
|
|
bnz $1b
|
|
|
|
_bss_zero_done:
|
|
#endif
|
|
|
|
;; block fill to .bssf
|
|
|
|
;; if you used variables which doesn't have initial value (far) then you would have to uncomment this'
|
|
;; For example: char __far variable;
|
|
;#ifdef __OPTIMIZE_SIZE__
|
|
; movw de, #LOWW(__bssfsize)
|
|
; movw ax, #LOWW(__bssfstart)
|
|
; clrw bc
|
|
; call !!_memset
|
|
;#else
|
|
;1:
|
|
; movw bc, #LOWW(__bssfsize)
|
|
; clrw ax
|
|
; cmpw ax, bc
|
|
; bz $_bssf_zero_done
|
|
;1:
|
|
; decw bc
|
|
; decw bc
|
|
; movw LOWW(__bssfstart)[bc], ax
|
|
; cmpw ax, bc
|
|
; bnz $1b
|
|
|
|
;_bssf_zero_done:
|
|
;#endif
|
|
|
|
call !!__rl78_init
|
|
|
|
|
|
/* call the hardware initialiser */
|
|
call !!_HardwareSetup
|
|
nop
|
|
|
|
|
|
/* start user program */
|
|
|
|
clrw ax /* argv */
|
|
clrw bc /* argc */
|
|
call !!_main
|
|
|
|
|
|
call !!__rl78_fini
|
|
|
|
.global _exit
|
|
.type _exit,@function
|
|
/* call to exit*/
|
|
_exit:
|
|
br $_exit
|
|
|
|
|
|
/* ;; HL = start of list
|
|
;; DE = end of list
|
|
;; BC = step direction (+2 or -2)
|
|
*/
|
|
.global _rl78_run_init_array
|
|
.type _rl78_run_init_array,@function
|
|
_rl78_run_init_array:
|
|
movw hl, #__init_array_start
|
|
movw de, #__init_array_end
|
|
#ifdef __RL78_MEDIUM__
|
|
movw bc, #4
|
|
#else
|
|
movw bc, #2
|
|
#endif
|
|
br $_rl78_run_inilist
|
|
|
|
.global _rl78_run_fini_array
|
|
.type _rl78_run_fini_array,@function
|
|
_rl78_run_fini_array:
|
|
movw hl, #__fini_array_start
|
|
movw de, #__fini_array_end
|
|
#ifdef __RL78_MEDIUM__
|
|
movw bc, #4
|
|
#else
|
|
movw bc, #2
|
|
#endif
|
|
/* fall through */
|
|
|
|
;; HL = start of list
|
|
;; DE = end of list
|
|
;; BC = step direction (+2 or -2)
|
|
_rl78_run_inilist:
|
|
next_inilist:
|
|
movw ax, hl
|
|
cmpw ax, de
|
|
bz $done_inilist
|
|
movw ax, [hl]
|
|
cmpw ax, #-1
|
|
bz $skip_inilist
|
|
cmpw ax, #0
|
|
bz $skip_inilist
|
|
push ax
|
|
push bc
|
|
push de
|
|
push hl
|
|
#ifdef __RL78_MEDIUM__
|
|
push ax
|
|
mov a, [hl+2]
|
|
mov cs, a
|
|
pop ax
|
|
#endif
|
|
call ax
|
|
pop hl
|
|
pop de
|
|
pop bc
|
|
pop ax
|
|
skip_inilist:
|
|
movw ax, hl
|
|
addw ax, bc
|
|
movw hl, ax
|
|
br $next_inilist
|
|
done_inilist:
|
|
ret
|
|
|
|
|
|
.global __rl78_init
|
|
.type __rl78_init,@function
|
|
__rl78_init:
|
|
call !!_rl78_run_init_array
|
|
ret
|
|
|
|
|
|
.global __rl78_fini
|
|
.type __rl78_fini,@function
|
|
__rl78_fini:
|
|
call !!_rl78_run_fini_array
|
|
ret
|
|
|
|
|
|
.end
|