2024-12-23 11:04:44 +08:00

103 lines
1.9 KiB
C

/*****************************************************
starts12z.c - startup code for S12Z (S12/L-ISA)
----------------------------------------------------
Copyright (c) Freescale Semiconductor
All rights reserved
*****************************************************/
#include "starts12z.h"
#ifdef __cplusplus
#define __EXTERN_C extern "C"
#else
#define __EXTERN_C
#endif
#if __ASM_DATA_ADDR_OPT__
const
#endif
struct _tagStartup _startupData
#if __ASM_DATA_ADDR_OPT__
#ifdef __cplusplus
= {}
#endif
#endif
; /* read-only: */
/* _startupData is allocated in ROM and */
/* initialized by the linker */
void main(void); /* prototype of main function */
static void DoZeroOut(void) {
__asm {
LD D6, _startupData.nofZeroOuts
BEQ end /* nothing to do */
LD X, _startupData.pZeroOut
zeroOutLoop:
LD Y, (0,X) /* X points to the first range */
LD D7, (3,X) /* D7 holds size */
doZeroOut:
CLR.b (Y+)
DBNE D7, doZeroOut
LEA X, (7,X)
DBNE D6, zeroOutLoop
end:
}
}
static void DoCopyDown(void) {
__asm {
LD Y, _startupData.toCopyDownBeg
BEQ end /* the pointer is NULL */
nextItemLoop:
LD D6, (Y+) /* load the size */
BEQ end
LD X, (Y+) /* load the destination */
copyLoop:
MOV.b (Y+), (X+) /* copy the data */
DBNE D6, copyLoop
BRA nextItemLoop
end:
}
}
#ifdef __cplusplus
static void __static_init(void) {
__asm {
LD D5, _startupData.nofInitBodies
BEQ end
LD X, _startupData.initBodies
initNextBody:
LD Y,(X+)
PSH ALL
JSR (Y+)
PUL ALL
DBNE D5, initNextBody
end:
}
}
#endif
extern int __SEG_END_SSTACK[];
__EXTERN_C void _Startup(void) {
__asm {
LD S, #__SEG_END_SSTACK-1 /* initialize SP */
#ifdef __ALIGN_STACK_OPT__
TFR S, D6 /* align SP to 4*/
AND D6, #-4
TFR D6, S
#endif
}
DoZeroOut();
DoCopyDown();
#ifdef __cplusplus
__static_init();
#endif
main();
}