📄 start.ms
字号:
;****************************************************************************
; COPYRIGHT(C) 2003 RENESAS TECHNOLOGY CORPORATION AND RENESAS SOLUTIONS
; CORPORATION ALL RIGHTS RESERVED
;
; start.ms : cc32R startup and low-level-sample program
;
; [ Contents ]
; (1) Sample startup routine.
; (2) Stack memory area
; (3) Sample low-level routine.
; (4) Reset vector area
;
; [ NOTES ]
; * This startup sample never set addresses for all sections,
; expect RI (Reset Vector Table) section, then you have to
; set address by -SEC option by lnk32R (M32R linker) .
;
;****************************************************************************
;----------------------------------------------------------------------------
; HEAPSIZE definition
;----------------------------------------------------------------------------
.MACRO HEAPSIZE_DEF
HEAPSIZE .EQU \&__HEAPSIZE__
.ENDM
HEAPSIZE_DEF
;----------------------------------------------------------------------------
; STACKSIZE definition
;----------------------------------------------------------------------------
.MACRO STACKSIZE_DEF
USTACKSIZE .EQU \&__USTACKSIZE__
ISTACKSIZE .EQU \&__ISTACKSIZE__
.ENDM
STACKSIZE_DEF
;----------------------------------------------------------------------------
; STANDARDLIB definition
;----------------------------------------------------------------------------
.MACRO STANDARDLIB_DEF
STANDARDLIB .ASSIGNC "\&__STANDARD_IO__"
.ENDM
STANDARDLIB_DEF
;----------------------------------------------------------------------------
; (1) Startup routine
;----------------------------------------------------------------------------
.export STARTUP
.export HALT
.import $_c_main
.import $main
.section P,code,align=4
;
; Initialize PSW control-register.
;
STARTUP: LDI R0, #128
MVTC R0, PSW
;
; Setting the user and interrupt stack.
;
SETH R0, #HIGH(USTACK_BOTTOM)
OR3 R0, R0, #LOW(USTACK_BOTTOM)
MVTC R0, SPU
SETH R0, #HIGH(ISTACK_BOTTOM)
OR3 R0, R0, #LOW(ISTACK_BOTTOM)
MVTC R0, SPI
;
; Clear the B section to zero.
;
SETH R1, #HIGH(B)
OR3 R1, R1, #LOW(B)
SETH R2, #HIGH(sizeof(B))
OR3 R2, R2, #LOW(sizeof(B))
BLEZ R2, SKIP1
LDI R0, #0
LOOP1: STB R0, @R1
ADDI R1, #1
ADDI R2, #-1
BGTZ R2, LOOP1
SKIP1:
;
; Transfer the data in the ROM_D section in ROM area
; to the RAM area.
;
SETH R1, #HIGH(ROM_D)
OR3 R1, R1, #LOW(ROM_D)
SETH R2, #HIGH(D)
OR3 R2, R2, #LOW(D)
SETH R3, #HIGH(sizeof(ROM_D))
OR3 R3, R3, #LOW(sizeof(ROM_D))
BLEZ R3, SKIP2
LOOP2: LDB R0, @R1
STB R0, @R2
ADDI R1, #1
ADDI R2, #1
ADDI R3, #-1
BGTZ R3, LOOP2
SKIP2:
;
;Register definition yudongliu
;
;
; Call initialize standard library routine or
; main function.
;
.AIF \&STANDARDLIB
SETH R0, #HIGH($_c_main)
OR3 R0, R0, #LOW($_c_main)
JL R0
.AELSE
SETH R0, #HIGH($main)
OR3 R0, R0, #LOW($main)
JL R0
.AENDI
HALT: BRA HALT ; inifinity loop
;----------------------------------------------------------------------------
; (2) Stack memory area
;----------------------------------------------------------------------------
.section B,data,align=4
.RES.B USTACKSIZE
.align 4
USTACK_BOTTOM:
.RES.B ISTACKSIZE
.align 4
ISTACK_BOTTOM:
;----------------------------------------------------------------------------
; (3) Sample low-level routine.
;----------------------------------------------------------------------------
.AIF \&STANDARDLIB
.export $_exit
.export $_get_core
.export $write
.export $_rel_core
.export $_strerror
.export $close
.export $getuniqnum
.export $lseek
.export $open
.export $read
.export $getenv
.export $raise
.export $remove
.section P,code,align=4
;
; Terminate the program run.
;
$_exit: BRA HALT
;
; Get the heap memory routine.
;
$_get_core: MV R1, R4
SETH R2, #HIGH(HEAP_POINTER)
OR3 R2, R2, #LOW(HEAP_POINTER)
LD R0, @R2
ADD R1, R0
ST R1, @R2
JMP R14
;
; Write data to memory buffer routine.
;
$write: LDI R3, #0
BRA SKIP3
LOOP3: SETH R1, #HIGH(WRITE_POINTER)
OR3 R1, R1, #LOW(WRITE_POINTER)
LD R2, @R1
ADD3 R0, R2, #1
ST R0, @R1
MV R1, R5
LDI R0, #H'3FF
ADD R1, R3
REM R2, R0
SETH R0, #HIGH(WRITE_BUFFER)
OR3 R0, R0, #LOW(WRITE_BUFFER)
ADDI R3, #1
ADD R2, R0
LDB R1, @R1
STB R1, @R2
SKIP3: LD R0, @R15
CMP R3, R0
BC LOOP3
LD R0, @R15
JMP R14
;
; ( Not implemented routine )
;
$_rel_core:
$_strerror:
$close:
$getuniqnum:
$lseek:
$open:
$read:
$getenv:
$raise:
$remove: LDI R0, #0
JMP R14
;
; low-level routines use area.
;
.export WRITE_BUFFER
.section D,data,align=4
HEAP_POINTER: .DATA.W HEAP_TOP
WRITE_POINTER: .DATA.W 0
WRITE_BUFFER: .RES.B H'400
.section B,data,align=4
HEAP_TOP: .RES.B HEAPSIZE
.AENDI
;----------------------------------------------------------------------------
; (4) Reset vector area
;----------------------------------------------------------------------------
.section RI,code,locate=h'00000000
SETH R0, #HIGH(STARTUP)
OR3 R0, R0, #LOW(STARTUP)
JMP R0
.section C,data,align=4
.section D,data,align=4
.section ROM_D,data,align=4
.end STARTUP
;****************************************************************************
; COPYRIGHT(C) 2003 RENESAS TECHNOLOGY CORPORATION AND RENESAS SOLUTIONS
; CORPORATION ALL RIGHTS RESERVED
;****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -