add start.cpp for C++ runtime

Previously static constructors were not being called.

This also improves a few bit definitions.
This commit is contained in:
Zack Buhman 2023-06-08 22:50:49 +00:00
parent 949116b285
commit 2e4d2775b7
5 changed files with 99 additions and 43 deletions

View File

@ -8,7 +8,7 @@ CARCH = -m2 -mb
CFLAGS += -falign-functions=4 -ffunction-sections -fdata-sections -fshort-enums -ffreestanding -nostdlib
CFLAGS += -Wall -Werror -Wfatal-errors -Wno-error=unused-variable -g -gdwarf-4 $(OPT)
LDFLAGS = --gc-sections --no-warn-rwx-segment --print-memory-usage --entry=_start
CXXFLAGS = -fno-exceptions -fno-rtti
CXXFLAGS = -fno-exceptions -fno-rtti -fno-threadsafe-statics
TARGET = sh2-none-elf-
CC = $(TARGET)gcc

14
sh2.lds
View File

@ -28,13 +28,27 @@ SECTIONS
*(.rodata)
} > work_ram_h
.ctors ALIGN(4) : SUBALIGN(4)
{
KEEP(*(.ctors))
KEEP(*(.ctors.*))
} > work_ram_h
.bss ALIGN(4) (NOLOAD) : SUBALIGN(4)
{
*(.bss)
} > work_ram_h
.bss.work_ram_l ALIGN(4) (NOLOAD) : SUBALIGN(4)
{
*(.bss.work_ram_l)
} > work_ram_l
__bss_link_start = ADDR(.bss);
__bss_link_end = ADDR(.bss) + SIZEOF(.bss);
__ctors_link_start = ADDR(.ctors);
__ctors_link_end = ADDR(.ctors) + SIZEOF(.ctors);
}
smpc = 0x20100000;

5
smpc.h
View File

@ -316,3 +316,8 @@ enum digital_bit {
DIGITAL__2__Z = (1 << 4),
DIGITAL__2__L = (1 << 3),
};
//enum keyboard_bit {
#define KEYBOARD__MAKE(oreg) (((oreg) & (0b1000)) != 0)
#define KEYBOARD__BREAK(oreg) (((oreg) & (0b0001)) != 0)
//};

34
start.cpp Normal file
View File

@ -0,0 +1,34 @@
#include <stdint.h>
extern "C" uint32_t __bss_link_start __asm("__bss_link_start");
extern "C" uint32_t __bss_link_end __asm("__bss_link_end");
typedef void(*init_t)(void);
extern "C" uint32_t __ctors_link_start __asm("__ctors_link_start");
extern "C" uint32_t __ctors_link_end __asm("__ctors_link_end");
extern void main();
extern "C"
void start(void)
{
uint32_t * start;
uint32_t * end;
start = &__bss_link_start;
end = &__bss_link_end;
while (start < end) {
*start++ = 0;
}
start = &__ctors_link_start;
end = &__ctors_link_end;
while (start < end) {
(reinterpret_cast<init_t>(*start++))();
}
main();
while (1);
}

87
vdp2.h
View File

@ -348,8 +348,8 @@ enum pncn0_bit {
PNCN0__N0CNSM = (1 << 14),
PNCN0__N0SPR = (1 << 9),
PNCN0__N0SCC = (1 << 8),
#define PNCN0__N0SPLT(n) (n << 5)
#define PNCN0__N0SCN(n) (n << 0)
#define PNCN0__N0SPLT(n) ((n) << 5)
#define PNCN0__N0SCN(n) ((n) << 0)
};
enum pncn1_bit {
@ -358,8 +358,8 @@ enum pncn1_bit {
PNCN1__N1CNSM = (1 << 14),
PNCN1__N1SPR = (1 << 9),
PNCN1__N1SCC = (1 << 8),
#define PNCN1__N1SPLT(n) (n << 5)
#define PNCN1__N1SCN(n) (n << 0)
#define PNCN1__N1SPLT(n) ((n) << 5)
#define PNCN1__N1SCN(n) ((n) << 0)
};
enum pncn2_bit {
@ -368,8 +368,8 @@ enum pncn2_bit {
PNCN2__N2CNSM = (1 << 14),
PNCN2__N2SPR = (1 << 9),
PNCN2__N2SCC = (1 << 8),
#define PNCN2__N2SPLT(n) (n << 5)
#define PNCN2__N2SCN(n) (n << 0)
#define PNCN2__N2SPLT(n) ((n) << 5)
#define PNCN2__N2SCN(n) ((n) << 0)
};
enum pncn3_bit {
@ -378,8 +378,8 @@ enum pncn3_bit {
PNCN3__N3CNSM = (1 << 14),
PNCN3__N3SPR = (1 << 9),
PNCN3__N3SCC = (1 << 8),
#define PNCN3__N3SPLT(n) (n << 5)
#define PNCN3__N3SCN(n) (n << 0)
#define PNCN3__N3SPLT(n) ((n) << 5)
#define PNCN3__N3SCN(n) ((n) << 0)
};
enum pncr_bit {
@ -388,8 +388,8 @@ enum pncr_bit {
PNCR__R0CNSM = (1 << 14),
PNCR__R0SPR = (1 << 9),
PNCR__R0SCC = (1 << 8),
#define PNCR__R0SPLT(n) (n << 5)
#define PNCR__R0SCN(n) (n << 0)
#define PNCR__R0SPLT(n) ((n) << 5)
#define PNCR__R0SCN(n) ((n) << 0)
};
enum plsz_bit {
@ -415,49 +415,49 @@ enum plsz_bit {
PLSZ__N0PLSZ__2x2 = (0b11 << 0),
};
// enum mpofn_bit {
#define MPOFN__N3MP(n) (n << 12)
#define MPOFN__N2MP(n) (n << 8)
#define MPOFN__N1MP(n) (n << 4)
#define MPOFN__N0MP(n) (n << 0)
#define MPOFN__N3MP(n) ((n) << 12)
#define MPOFN__N2MP(n) ((n) << 8)
#define MPOFN__N1MP(n) ((n) << 4)
#define MPOFN__N0MP(n) ((n) << 0)
// };
// enum mpofr_bit {
#define MPOFR__RBMP(n) (n << 4)
#define MPOFR__RAMP(n) (n << 0)
#define MPOFR__RBMP(n) ((n) << 4)
#define MPOFR__RAMP(n) ((n) << 0)
// };
// 4.8 Maps § Map Selection Register
// enum mpabn0_bit {
#define MPABN0__N0MPB(n) (n << 8)
#define MPABN0__N0MPA(n) (n << 0)
#define MPABN0__N0MPB(n) ((n) << 8)
#define MPABN0__N0MPA(n) ((n) << 0)
// };
// enum mpcdn0_bit {
#define MPABN0__N0MPD(n) (n << 8)
#define MPABN0__N0MPC(n) (n << 0)
#define MPABN0__N0MPD(n) ((n) << 8)
#define MPABN0__N0MPC(n) ((n) << 0)
// };
// enum mpabn1_bit {
#define MPABN1__N1MPB(n) (n << 8)
#define MPABN1__N1MPA(n) (n << 0)
#define MPABN1__N1MPB(n) ((n) << 8)
#define MPABN1__N1MPA(n) ((n) << 0)
// };
// enum mpcdn1_bit {
#define MPABN1__N1MPD(n) (n << 8)
#define MPABN1__N1MPC(n) (n << 0)
#define MPABN1__N1MPD(n) ((n) << 8)
#define MPABN1__N1MPC(n) ((n) << 0)
// };
// enum mpabn2_bit {
#define MPABN2__N2MPB(n) (n << 8)
#define MPABN2__N2MPA(n) (n << 0)
#define MPABN2__N2MPB(n) ((n) << 8)
#define MPABN2__N2MPA(n) ((n) << 0)
// };
// enum mpcdn2_bit {
#define MPABN2__N2MPD(n) (n << 8)
#define MPABN2__N2MPC(n) (n << 0)
#define MPABN2__N2MPD(n) ((n) << 8)
#define MPABN2__N2MPC(n) ((n) << 0)
// };
// enum mpabn3_bit {
#define MPABN3__N3MPB(n) (n << 8)
#define MPABN3__N3MPA(n) (n << 0)
#define MPABN3__N3MPB(n) ((n) << 8)
#define MPABN3__N3MPA(n) ((n) << 0)
// };
// enum mpcdn3_bit {
#define MPABN3__N3MPD(n) (n << 8)
#define MPABN3__N3MPC(n) (n << 0)
#define MPABN3__N3MPD(n) ((n) << 8)
#define MPABN3__N3MPC(n) ((n) << 0)
// };
// enum mpabra_bit {
// };
@ -622,20 +622,20 @@ enum bktau_bit {
// enum sfccmd_bit {
// };
// enum prisa_bit {
#define PRISA__S1PRIN(n) (n << 8)
#define PRISA__S0PRIN(n) (n << 0)
#define PRISA__S1PRIN(n) ((n) << 8)
#define PRISA__S0PRIN(n) ((n) << 0)
// };
// enum prisb_bit {
#define PRISA__S3PRIN(n) (n << 8)
#define PRISA__S2PRIN(n) (n << 0)
#define PRISA__S3PRIN(n) ((n) << 8)
#define PRISA__S2PRIN(n) ((n) << 0)
// };
// enum prisc_bit {
#define PRISA__S5PRIN(n) (n << 8)
#define PRISA__S4PRIN(n) (n << 0)
#define PRISA__S5PRIN(n) ((n) << 8)
#define PRISA__S4PRIN(n) ((n) << 0)
// };
// enum prisd_bit {
#define PRISA__S7PRIN(n) (n << 8)
#define PRISA__S6PRIN(n) (n << 0)
#define PRISA__S7PRIN(n) ((n) << 8)
#define PRISA__S6PRIN(n) ((n) << 0)
// };
// enum prina_bit {
// };
@ -681,5 +681,8 @@ enum bktau_bit {
// pattern name tables
//
#define PATTERN_NAME_TABLE_2WORD__CHARACTER(n) (n << 0)
#define PATTERN_NAME_TABLE_2WORD__PALETTE(n) (n << 16)
#define PATTERN_NAME_TABLE_2WORD__CHARACTER(n) ((n) << 0)
#define PATTERN_NAME_TABLE_2WORD__PALETTE(n) ((n) << 16)
#define PATTERN_NAME_TABLE_1WORD__PALETTE(n) (((n) & 0b1111) << 12)
#define PATTERN_NAME_TABLE_1WORD__CHARACTER(n) (((n) & 0x3ff) << 0)