From 73e899f9a4e9e45514b3dd71caba08dd7ba0852a Mon Sep 17 00:00:00 2001 From: "JASON-6700K\\jandersen" Date: Sun, 21 Jan 2024 09:20:03 -0500 Subject: [PATCH] add mapper.h, and move some data out into physical memory --- Makefile | 6 ++- rickjr.ld | 129 +++++++++++++++++++++++++++++++++++++++++++++++++ src/dat_ents.c | 6 +-- src/dat_maps.c | 12 ++--- src/mapper.h | 25 ++++++++++ 5 files changed, 167 insertions(+), 11 deletions(-) create mode 100644 rickjr.ld create mode 100644 src/mapper.h diff --git a/Makefile b/Makefile index 70b1bdb..d880532 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ F256 = $(HOME)/code/f256 #SYSLIBDIR = $(SYSTEM)/lib #SYSINCDIR = $(SYSTEM)/include -TMPFLAGS = -D F256=1 -Wno-unknown-pragmas +TMPFLAGS = -D F256=1 -include src/mapper.h -Wno-unknown-pragmas INCCMD = -I$(SYSINCDIR) @@ -111,6 +111,7 @@ CFLAGS = -Os -Wall -Werror -Wa,-al -fno-common CXXFLAGS = -Os -Wall -Werror -Wa,-al -fno-common #ASFLAGS = -c -xassembler-with-cpp -Wa,-al #LDFLAGS = -Wl,-Map,$(TARGET).map $(LIBCMD) +LDFLAGS = -Trickjr.ld --verbose # Clear Default Suffixes .SUFFIXES: @@ -122,6 +123,7 @@ all: $(TARGET) $(TARGET): $(DEPS) $(OBJS) $(LIBS) ${CC} $(CFLAGS) $(TMPFLAGS) $(INCCMD) -c ${F256}/f256lib/f256.c -o $(OBJDIR)/f256.o > $(LSTDIR)/$*.lst $(LD) -o $@ $(addprefix $(OBJDIR)/,$(OBJS)) $(LIBS) $(LDFLAGS) + llvm-objdump -d --print-imm-hex $(TARGET).elf > $(TARGET).lst # Object Rules @@ -157,7 +159,7 @@ $(TARGET): $(DEPS) $(OBJS) $(LIBS) .PHONY: clean clean: - $(RM) $(OBJDIR) *.o $(DEPDIR) *.map $(LSTDIR) $(TARGET) $(TARGET).elf $(TARGET).pgz + $(RM) $(OBJDIR) *.o $(DEPDIR) *.map $(LSTDIR) $(TARGET) $(TARGET).elf $(TARGET).pgz $(TARGET).lst ######################################## diff --git a/rickjr.ld b/rickjr.ld new file mode 100644 index 0000000..f49d481 --- /dev/null +++ b/rickjr.ld @@ -0,0 +1,129 @@ +/* RickJr Linker Script + +*/ + +/* fake C Stack */ +PROVIDE(__stack = 0xA000); +/* entry point to my program */ +PROVIDE(__f256_start = 0x300); +/* page size of a block of memory */ +PROVIDE(__BLOCK_SIZE = 0x2000); + +/* f256k uses first 16 bytes of ZP for mmu control? */ +__rc0 = 0x10; +INCLUDE imag-regs.ld +ASSERT(__rc0 == 0x10, "Inconsistent zero page map.") +ASSERT(__rc31 == 0x2f, "Inconsistent zero page map.") + +MEMORY { + /* kernel uses 0xf0-0xff for parameter passing */ + zp : ORIGIN = __rc31 + 1, LENGTH = 0xF0 - (__rc31 + 1) + ram (rw) : ORIGIN = __f256_start, LENGTH = 0xA000-__f256_start +} + +/* LMAs */ +__fixed_lma = 0x0000a000; + +__block8_lma = 0x010000; +__block9_lma = 0x012000; +__block10_lma = 0x014000; +__block11_lma = 0x016000; +__block12_lma = 0x018000; +__block13_lma = 0x01A000; +__block14_lma = 0x01C000; +__block15_lma = 0x01E000; +__block16_lma = 0x020000; +__block17_lma = 0x022000; +__block18_lma = 0x024000; +__block19_lma = 0x026000; +__block20_lma = 0x028000; +__block21_lma = 0x02A000; +__block22_lma = 0x02C000; +__block23_lma = 0x02E000; + + +MEMORY { + block8 : ORIGIN = __block8_lma, LENGTH = __BLOCK_SIZE + block9 : ORIGIN = __block9_lma, LENGTH = __BLOCK_SIZE + block10 : ORIGIN = __block10_lma, LENGTH = __BLOCK_SIZE + block11 : ORIGIN = __block11_lma, LENGTH = __BLOCK_SIZE + block12 : ORIGIN = __block12_lma, LENGTH = __BLOCK_SIZE + block13 : ORIGIN = __block13_lma, LENGTH = __BLOCK_SIZE + block14 : ORIGIN = __block14_lma, LENGTH = __BLOCK_SIZE + block15 : ORIGIN = __block15_lma, LENGTH = __BLOCK_SIZE + + block16 : ORIGIN = __block16_lma, LENGTH = __BLOCK_SIZE + block17 : ORIGIN = __block17_lma, LENGTH = __BLOCK_SIZE + block18 : ORIGIN = __block18_lma, LENGTH = __BLOCK_SIZE + block19 : ORIGIN = __block19_lma, LENGTH = __BLOCK_SIZE + block20 : ORIGIN = __block20_lma, LENGTH = __BLOCK_SIZE + block21 : ORIGIN = __block21_lma, LENGTH = __BLOCK_SIZE + block22 : ORIGIN = __block22_lma, LENGTH = __BLOCK_SIZE + block23 : ORIGIN = __block23_lma, LENGTH = __BLOCK_SIZE + + fixed : ORIGIN = __fixed_lma, LENGTH = __BLOCK_SIZE +} + +REGION_ALIAS("c_writeable", ram) +/* REGION_ALIAS("c_readonly", fixed) */ +/* I want to use the lower 40k */ +REGION_ALIAS("c_readonly", ram) + +SECTIONS { + + INCLUDE c.ld + + .fixed : { *(.fixed .fixed.*) } >fixed + + .block8 : { *(.block8 .block8.*) } >block8 + .block9 : { *(.block9 .block9.*) } >block9 + .block10 : { *(.block10 .block10.*) } >block10 + .block11 : { *(.block11 .block11.*) } >block11 + .block12 : { *(.block12 .block12.*) } >block12 + .block13 : { *(.block13 .block13.*) } >block13 + .block14 : { *(.block14 .block14.*) } >block14 + .block15 : { *(.block15 .block15.*) } >block15 + .block16 : { *(.block16 .block16.*) } >block16 + .block17 : { *(.block17 .block17.*) } >block17 + .block18 : { *(.block18 .block18.*) } >block18 + .block19 : { *(.block19 .block19.*) } >block19 + .block20 : { *(.block20 .block20.*) } >block20 + .block21 : { *(.block21 .block21.*) } >block21 + .block22 : { *(.block22 .block22.*) } >block22 + .block23 : { *(.block23 .block23.*) } >block23 +} + +/* OUTPUT_FORMAT { FULL(cart_rom) } */ +OUTPUT_FORMAT { + FULL(block8) + FULL(block9) + FULL(block10) + FULL(block11) + FULL(block12) + FULL(block13) + FULL(block14) + FULL(block15) + FULL(block16) + FULL(block17) + FULL(block18) + FULL(block19) + FULL(block20) + FULL(block21) + FULL(block22) + FULL(block23) + FULL(fixed) +} + + +/* +__attribute__((section(".bank30.rodata"))) const char bank30_s[] = "bank thirty"; + +... + +__attribute__((noinline, section(".bank2.text"))) signed char bank2_fn(void) { + asm volatile("nop"); + puts(bank2_s); + asm volatile("nop"); + return 5; +} +*/ diff --git a/src/dat_ents.c b/src/dat_ents.c index 0378159..542166b 100644 --- a/src/dat_ents.c +++ b/src/dat_ents.c @@ -19,7 +19,7 @@ segment "dat"; #endif -entdata_t ent_entdata[ENT_NBR_ENTDATA] = { +RO_BLOCK(10) entdata_t ent_entdata[ENT_NBR_ENTDATA] = { {0000, 0000, 000000, 000000, 0000, 0000, 0x00}, {0x18, 0x15, 000000, 000000, 0000, 0000, 0x00}, {0000, 0000, 000000, 000000, 0000, 0000, 0x00}, @@ -101,7 +101,7 @@ entdata_t ent_entdata[ENT_NBR_ENTDATA] = { {0x18, 0x10, 0x000c, 0x0005, 0x04, 0x04, 0x14}, }; -U8 ent_sprseq[ENT_NBR_SPRSEQ] = { +RO_BLOCK(10) U8 ent_sprseq[ENT_NBR_SPRSEQ] = { 0000, 0x01, 0000, 0x02, 0x05, 0x03, 0x04, 0x03, 0x65, 0xff, 0x66, 0xff, 0x55, 0xff, 0000, 0x56, 0xff, 0000, 0x57, 0xff, 0000, 0x58, 0x59, 0xff, @@ -122,7 +122,7 @@ U8 ent_sprseq[ENT_NBR_SPRSEQ] = { 0xff, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xff, 0x00, }; -mvstep_t ent_mvstep[ENT_NBR_MVSTEP] = { +RO_BLOCK(10) mvstep_t ent_mvstep[ENT_NBR_MVSTEP] = { { 0x10, 0, 0 } , { 0x0c, 0, 4 } , { 0xfa, 0, 0 } , diff --git a/src/dat_maps.c b/src/dat_maps.c index 5dca6f9..c022735 100644 --- a/src/dat_maps.c +++ b/src/dat_maps.c @@ -19,7 +19,7 @@ segment "dat"; #include "system.h" #include "maps.h" -map_t map_maps[MAP_NBR_MAPS] = { +RO_BLOCK(11) map_t map_maps[MAP_NBR_MAPS] = { #ifdef IIGS {0x0008, 0x008b, 0x0008, 000000, &samerica_lz4}, {0x0008, 0x008b, 0x0068, 0x0009, &egypt_lz4}, @@ -35,7 +35,7 @@ map_t map_maps[MAP_NBR_MAPS] = { #endif }; -submap_t map_submaps[MAP_NBR_SUBMAPS] = { +RO_BLOCK(11) submap_t map_submaps[MAP_NBR_SUBMAPS] = { {000000, 000000, 000000, 000000}, {000000, 0x0078, 0x0003, 0x0005}, {000000, 0x0150, 0x0006, 0x0011}, @@ -85,7 +85,7 @@ submap_t map_submaps[MAP_NBR_SUBMAPS] = { {0x0001, 0x1f5a, 0x0096, 0x0202}, }; -connect_t map_connect[MAP_NBR_CONNECT] = { +RO_BLOCK(11) connect_t map_connect[MAP_NBR_CONNECT] = { /* map 0 */ @@ -1322,7 +1322,7 @@ U8 map_bnums[MAP_NBR_BNUMS] = { 0xc0, 0xc0, 0000, 0000, 0000, 0000, 0000, 0000, }; -block_t map_blocks[MAP_NBR_BLOCKS] = { +RO_BLOCK(11) block_t map_blocks[MAP_NBR_BLOCKS] = { {0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000}, {0x29, 0x2a, 0x2d, 0x2e, 0x2b, 0x2c, 0x2f, 0x30, @@ -1837,7 +1837,7 @@ block_t map_blocks[MAP_NBR_BLOCKS] = { 0x22, 0x2d, 0x2e, 0xe7, 0x28, 0x2b, 0x2c, 0xea}, }; -mark_t map_marks[MAP_NBR_MARKS] = { +RO_BLOCK(11) mark_t map_marks[MAP_NBR_MARKS] = { {0x18, 0x16, 0000, 0x08, 0x08}, /* 0 */ {0x18, 0x2a, 0x88, 0x01, 0x28}, {0x38, 0x04, 0xf0, 0x15, 0x29}, @@ -2363,7 +2363,7 @@ mark_t map_marks[MAP_NBR_MARKS] = { {0xff, 0000, 0000, 0000, 0000}, }; -U8 map_eflg_c[MAP_NBR_EFLGC] = { +RO_BLOCK(11) U8 map_eflg_c[MAP_NBR_EFLGC] = { 0x4d, 0000, 0x0e, 0x02, 0x04, 0x04, 0x57, 0x08, 0x08, 0x18, 0x03, 0x68, 0x3b, 0x48, 0x04, 0x80, 0x37, 0000, 0x04, 0x02, 0x04, 0x04, 0x90, 0x08, diff --git a/src/mapper.h b/src/mapper.h new file mode 100644 index 0000000..9d9d0af --- /dev/null +++ b/src/mapper.h @@ -0,0 +1,25 @@ +/* + Special mapper macros for the F256 + mos-llvm, so we can put code + anywhere in physical ram + + Currently only blocks 8-23 are defined in the linker file + + If you need to go beyond the 128k of extra code, just add more definitions + into rickjr.ld +*/ + +#if defined(F256) && F256 + +/* +$$JGA TODO, sort out how to mark an entire file +*/ + +#define RAM_BLOCK(index) __attribute__((noinline, section(".block"#index))) +#define RO_BLOCK(index) __attribute__((section(".block"#index))) + +#else + +#define RAM_BLOCK(index) +#define RO_BLOCK(index) + +#endif