diff --git a/common.mk b/common.mk index 70ccfaa..6a455fc 100644 --- a/common.mk +++ b/common.mk @@ -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 diff --git a/sh2.lds b/sh2.lds index 306ba56..54386eb 100644 --- a/sh2.lds +++ b/sh2.lds @@ -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; diff --git a/smpc.h b/smpc.h index df15caf..8cb9b67 100644 --- a/smpc.h +++ b/smpc.h @@ -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) +//}; diff --git a/start.cpp b/start.cpp new file mode 100644 index 0000000..7f2a869 --- /dev/null +++ b/start.cpp @@ -0,0 +1,34 @@ +#include + +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(*start++))(); + } + + main(); + + while (1); +} diff --git a/vdp2.h b/vdp2.h index e26a2db..c761ba9 100644 --- a/vdp2.h +++ b/vdp2.h @@ -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)