diff --git a/Makefile b/Makefile index c334fa2..0639b66 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,16 @@ OPT = -Os -all: main.nds - -res/%.h: res/%.data - $(BUILD_BINARY_H) - -res/%.pal.h: res/%.data.pal - $(BUILD_BINARY_H) - -MAIN_OBJ = \ +OBJ = \ header.o \ - start.o \ - main.o \ - res/player.data.o \ - res/player.data.pal.o \ - res/bowser.data.o \ - res/bowser.data.pal.o + arm9/arm9.bin.o \ + arm7/arm7.bin.o -main.elf: $(MAIN_OBJ) +all: cartridge.bin -include arm9.mk +cartridge.elf: $(OBJ) + +TARGET = arm-none-eabi- +AARCH = -march=armv4t -mlittle-endian +OBJARCH = -O elf32-littlearm -B armv4t +LDSCRIPT = cartridge.lds include common.mk diff --git a/arm7/Makefile b/arm7/Makefile new file mode 100644 index 0000000..66dcf88 --- /dev/null +++ b/arm7/Makefile @@ -0,0 +1,11 @@ +OPT = -Os + +OBJ = \ + start.o + +all: arm7.bin + +arm7.elf: $(OBJ) + +include arm7.mk +include ../common.mk diff --git a/arm7/arm7.lds b/arm7/arm7.lds new file mode 100644 index 0000000..5c09ee8 --- /dev/null +++ b/arm7/arm7.lds @@ -0,0 +1,50 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +MEMORY +{ + ram : ORIGIN = 0x02000000, LENGTH = 4M +} +SECTIONS +{ + . = ORIGIN(ram) + 0x8000; + + .text ALIGN(4) : + { + KEEP(*(.text.start)) + *(.text) + *(.text.*) + *(.glue_7t) + *(.glue_7) + *(.vfp11_veneer) + *(.v4_bx) + } > ram + + .data ALIGN(4) : + { + *(.data) + *(.data.*) + } > ram + + .rodata ALIGN(4) : + { + *(.rodata) + *(.rodata.*) + } > ram + + .ctors ALIGN(4) : + { + KEEP(*(.ctors)) + KEEP(*(.ctors.*)) + } > ram + + .bss ALIGN(4) (NOLOAD) : + { + *(.bss) + *(.bss.*) + *(COMMON) + } > ram + + INCLUDE "../debug.lds" +} + +INCLUDE "../symbols.lds" diff --git a/arm7/arm7.mk b/arm7/arm7.mk new file mode 100644 index 0000000..86e64a5 --- /dev/null +++ b/arm7/arm7.mk @@ -0,0 +1,5 @@ +TARGET = arm-none-eabi- +AARCH = -march=armv4t -mlittle-endian +CARCH = -march=armv4t -mtune=arm7tdmi -mlittle-endian -mno-thumb-interwork +OBJARCH = -O elf32-littlearm -B armv4t +LDSCRIPT = arm7.lds diff --git a/arm7/start.s b/arm7/start.s new file mode 100644 index 0000000..62a5724 --- /dev/null +++ b/arm7/start.s @@ -0,0 +1,4 @@ + .section .text.start + .global _start +_start: + b _start diff --git a/arm9/Makefile b/arm9/Makefile new file mode 100644 index 0000000..85797a7 --- /dev/null +++ b/arm9/Makefile @@ -0,0 +1,18 @@ +OPT = -Os + +OBJ = \ + start.o \ + main.o \ + ../res/player.data.o \ + ../res/player.data.pal.o \ + ../res/bowser.data.o \ + ../res/bowser.data.pal.o + +all: arm9.bin + +arm9.elf: $(OBJ) + +CFLAGS += -I../include + +include arm9.mk +include ../common.mk diff --git a/addresses_arm9.lds b/arm9/addresses.lds similarity index 100% rename from addresses_arm9.lds rename to arm9/addresses.lds diff --git a/arm9.lds b/arm9/arm9.lds similarity index 58% rename from arm9.lds rename to arm9/arm9.lds index 9978cd9..e0832c2 100644 --- a/arm9.lds +++ b/arm9/arm9.lds @@ -2,63 +2,50 @@ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) MEMORY { - rom : ORIGIN = 0x00000000, LENGTH = 4M ram : ORIGIN = 0x02000000, LENGTH = 4M } SECTIONS { - . = ORIGIN(rom); - - .text.header ALIGN(4) : - { - KEEP(*(.text.header)) - } > rom - . = ORIGIN(ram); - .text.arm7 ALIGN(4) : - { - KEEP(*(.text.7start)) - } > ram AT> rom - .text ALIGN(4) : { - KEEP(*(.text.9start)) + KEEP(*(.text.start)) *(.text) *(.text.*) *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx) - } > ram AT> rom + } > ram .data ALIGN(4) : { *(.data) *(.data.*) - } > ram AT> rom + } > ram .rodata ALIGN(4) : { *(.rodata) *(.rodata.*) - } > ram AT> rom + } > ram .ctors ALIGN(4) : { KEEP(*(.ctors)) KEEP(*(.ctors.*)) - } > ram AT> rom + } > ram .bss ALIGN(4) (NOLOAD) : { *(.bss) *(.bss.*) *(COMMON) - } > ram AT> rom + } > ram - INCLUDE "debug.lds" + INCLUDE "../debug.lds" } -INCLUDE "symbols.lds" -INCLUDE "addresses_arm9.lds" +INCLUDE "../symbols.lds" +INCLUDE "addresses.lds" diff --git a/arm9.mk b/arm9/arm9.mk similarity index 100% rename from arm9.mk rename to arm9/arm9.mk diff --git a/main.c b/arm9/main.c similarity index 95% rename from main.c rename to arm9/main.c index 1e07c86..4a18f65 100644 --- a/main.c +++ b/arm9/main.c @@ -5,10 +5,10 @@ #include "obj.h" #include "oam.h" -#include "res/player.h" -#include "res/player.pal.h" -#include "res/bowser.h" -#include "res/bowser.pal.h" +#include "../res/player.data.h" +#include "../res/player.data.pal.h" +#include "../res/bowser.data.h" +#include "../res/bowser.data.pal.h" static inline uint16_t rgb565(const uint8_t * buf) { @@ -430,23 +430,23 @@ void main() | DISPCNT__character_obj_mapping_mode__1d_mapping ; - uint32_t pal_size = (uint32_t)&_binary_res_player_data_pal_size; - const uint8_t * pal = (const uint8_t *)&_binary_res_player_data_pal_start; + uint32_t pal_size = (uint32_t)&_binary_player_data_pal_size; + const uint8_t * pal = (const uint8_t *)&_binary_player_data_pal_start; // palette ram for (int i = 0; i < 15; i++) { palette_ram.a.bg.palette[0].color[i] = rgb565(&pal[i * 3]); } - uint32_t b_pal_size = (uint32_t)&_binary_res_bowser_data_pal_size; - const uint8_t * b_pal = (const uint8_t *)&_binary_res_bowser_data_pal_start; + uint32_t b_pal_size = (uint32_t)&_binary_bowser_data_pal_size; + const uint8_t * b_pal = (const uint8_t *)&_binary_bowser_data_pal_start; // bowser palette ram for (int i = 0; i < 16; i++) { palette_ram.b.obj.palette[0].color[i] = rgb565(&b_pal[i * 3]); } - const uint8_t * data = (const uint8_t *)&_binary_res_player_data_start; + const uint8_t * data = (const uint8_t *)&_binary_player_data_start; for (int y = 0; y < 48; y++) { uint8_t a = data[y * 8 + 7]; @@ -479,7 +479,7 @@ void main() bg_vram.a.screen.offset[0].block[31].u16[32 * 1 + 1] = 4; bg_vram.a.screen.offset[0].block[31].u16[32 * 2 + 1] = 5; - const uint8_t * b_data = (const uint8_t *)&_binary_res_bowser_data_start; + const uint8_t * b_data = (const uint8_t *)&_binary_bowser_data_start; for (int c_y = 0; c_y < 8; c_y++) { for (int c_x = 0; c_x < 8; c_x++) { diff --git a/start.s b/arm9/start.s similarity index 90% rename from start.s rename to arm9/start.s index d0783ae..a534ca5 100644 --- a/start.s +++ b/arm9/start.s @@ -22,7 +22,7 @@ _fill_loop.\@: _fill_break.\@: .endm - .section .text.9start + .section .text.start .global _start _start: /* @@ -52,14 +52,8 @@ _link_bss: _c_runtime: /* set stack pointer */ - ldr sp, =0x23ffffc + ldr sp, =__stack_end /* jump to main */ ldr r0, =main bx r0 - - .section .text.7start - .global _7start -_7start: - mov r1, #0x7 - b _7start diff --git a/cartridge.lds b/cartridge.lds new file mode 100644 index 0000000..6b5d256 --- /dev/null +++ b/cartridge.lds @@ -0,0 +1,51 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +MEMORY +{ + rom : ORIGIN = 0x00000000, LENGTH = 4M +} +SECTIONS +{ + . = 0x00000000; + + _start = .; + + .text.header ALIGN(4) : + { + KEEP(*(.text.header)) + } AT>rom + + . = 0x02000000; + + .text.arm9 ALIGN(4) : + { + KEEP(arm9/arm9.bin.o(*)) + } AT>rom + + . = 0x02000000 + 0x8000; + + .text.arm7 ALIGN(4) : + { + KEEP(arm7/arm7.bin.o(*)) + } AT>rom + + /DISCARD/ : + { + *(.glue_7) *(.glue_7t) *(.vfp11_veneer) *(.v4_bx) + *(.ARM.attributes) *(.iplt) *(.rel.iplt) *(.igot.plt) + } +} + +/* header symbols */ +_arm9_offset = LOADADDR(.text.arm9); +_arm9_entry = ADDR(.text.arm9); +_arm9_addr = ADDR(.text.arm9); +_arm9_size = SIZEOF(.text.arm9); + +_arm7_offset = LOADADDR(.text.arm7); +_arm7_entry = ADDR(.text.arm7); +_arm7_addr = ADDR(.text.arm7); +_arm7_size = SIZEOF(.text.arm7); + +_rom_size = SIZEOF(.text.header) + SIZEOF(.text.arm9) + SIZEOF(.text.arm7); +_header_size = SIZEOF(.text.header); diff --git a/common.mk b/common.mk index e8d8c27..aaba43c 100644 --- a/common.mk +++ b/common.mk @@ -80,6 +80,12 @@ endef -include $(shell find -type f -name '*.d') +clean: + find -P \ + -regextype posix-egrep \ + -regex '.*\.(nds|o|d|bin|elf|gch)$$' \ + -exec rm {} \; + .SUFFIXES: .INTERMEDIATE: .SECONDARY: diff --git a/header.s b/header.s index b8ebb76..01e9fff 100644 --- a/header.s +++ b/header.s @@ -1,7 +1,7 @@ .section .text.header - .fill 12,1,0x0 /* Game Title */ - .ascii "CODE" /* Game Code */ + .ascii "game title " /* Game Title */ + .ascii "NTR1" /* Game Code */ .ascii "00" /* Maker Code */ .byte 0x0 /* Unit Code */ .byte 0x0 /* Encryption Seed Select */ @@ -30,7 +30,7 @@ .long 0x00586000 /* 040001a4 setting for normal commands */ .long 0x001808F8 /* 040001a4 setting for KEY1 commands */ .long 0x00000000 /* Icon/Title offset */ - .short 0x8e6e /* Secure Area Checksum */ + .short 0x4bff /* Secure Area Checksum */ .short 0x0d7e /* Secure Area Delay */ .long 0x02000a58 /* ARM9 auto load list hook ram address */ .long 0x02380158 /* ARM7 auto load list hook ram address */ diff --git a/bg.h b/include/bg.h similarity index 100% rename from bg.h rename to include/bg.h diff --git a/bits.h b/include/bits.h similarity index 100% rename from bits.h rename to include/bits.h diff --git a/graphics_engine_a.h b/include/graphics_engine_a.h similarity index 100% rename from graphics_engine_a.h rename to include/graphics_engine_a.h diff --git a/graphics_engine_b.h b/include/graphics_engine_b.h similarity index 100% rename from graphics_engine_b.h rename to include/graphics_engine_b.h diff --git a/io_registers.h b/include/io_registers.h similarity index 100% rename from io_registers.h rename to include/io_registers.h diff --git a/oam.h b/include/oam.h similarity index 100% rename from oam.h rename to include/oam.h diff --git a/obj.h b/include/obj.h similarity index 100% rename from obj.h rename to include/obj.h diff --git a/palette.h b/include/palette.h similarity index 100% rename from palette.h rename to include/palette.h diff --git a/patch.py b/patch.py index 33819f4..2281d7e 100644 --- a/patch.py +++ b/patch.py @@ -43,11 +43,14 @@ assert buf[0x15c] == 0x56 assert buf[0x15d] == 0xcf logo_crc = crc16_modbus(buf[0x0c0:0xc0 + 0x9c]) -print(hex(logo_crc)) +print("logo", hex(logo_crc)) assert logo_crc == 0xcf56 header_crc = crc16_modbus(buf[0:0x15e]) -print(hex(header_crc)) +print("header", hex(header_crc)) + +secure_area_crc = crc16_modbus(buf[0x4000:0x8000]) +print("secure area", hex(secure_area_crc)) import struct header_crc_b = struct.pack(' ../graphics_engine_a.h -python format.py 0x04001000.txt graphics_engine_b 0 > ../graphics_engine_b.h +python format.py 0x04000000.txt graphics_engine_a 0x1000 > ../include/graphics_engine_a.h +python format.py 0x04001000.txt graphics_engine_b 0 > ../include/graphics_engine_b.h make graphics_engine_bits.csv -python format_bits.py graphics_engine_bits.csv > ../bits.h +python format_bits.py graphics_engine_bits.csv > ../include/bits.h diff --git a/res/Makefile b/res/Makefile new file mode 100644 index 0000000..953252e --- /dev/null +++ b/res/Makefile @@ -0,0 +1,18 @@ +OBJ += $(patsubst %.data,%.data.o,$(wildcard *.data)) +OBJ += $(patsubst %.data.pal,%.data.pal.o,$(wildcard *.data.pal)) + +HEADER += $(patsubst %.data,%.data.h,$(wildcard *.data)) +HEADER += $(patsubst %.data.pal,%.data.pal.h,$(wildcard *.data.pal)) + +TARGET=arm-none-eabi- +OBJARCH=-O elf32-littlearm -B armv5te + +all: $(OBJ) $(HEADER) + +include ../common.mk + +%.data.h: %.data + $(BUILD_BINARY_H) + +%.data.pal.h: %.data.pal + $(BUILD_BINARY_H) diff --git a/res/bowser.data.h b/res/bowser.data.h new file mode 100644 index 0000000..1133820 --- /dev/null +++ b/res/bowser.data.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_bowser_data_start __asm("_binary_bowser_data_start"); +extern uint32_t _binary_bowser_data_end __asm("_binary_bowser_data_end"); +extern uint32_t _binary_bowser_data_size __asm("_binary_bowser_data_size"); diff --git a/res/bowser.data.pal.h b/res/bowser.data.pal.h new file mode 100644 index 0000000..c134213 --- /dev/null +++ b/res/bowser.data.pal.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_bowser_data_pal_start __asm("_binary_bowser_data_pal_start"); +extern uint32_t _binary_bowser_data_pal_end __asm("_binary_bowser_data_pal_end"); +extern uint32_t _binary_bowser_data_pal_size __asm("_binary_bowser_data_pal_size"); diff --git a/res/bowser.h b/res/bowser.h deleted file mode 100644 index c7250fe..0000000 --- a/res/bowser.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include -extern uint32_t _binary_res_bowser_data_start __asm("_binary_res_bowser_data_start"); -extern uint32_t _binary_res_bowser_data_end __asm("_binary_res_bowser_data_end"); -extern uint32_t _binary_res_bowser_data_size __asm("_binary_res_bowser_data_size"); diff --git a/res/bowser.pal.h b/res/bowser.pal.h deleted file mode 100644 index 234d723..0000000 --- a/res/bowser.pal.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include -extern uint32_t _binary_res_bowser_data_pal_start __asm("_binary_res_bowser_data_pal_start"); -extern uint32_t _binary_res_bowser_data_pal_end __asm("_binary_res_bowser_data_pal_end"); -extern uint32_t _binary_res_bowser_data_pal_size __asm("_binary_res_bowser_data_pal_size"); diff --git a/res/player.data.h b/res/player.data.h new file mode 100644 index 0000000..430fcaa --- /dev/null +++ b/res/player.data.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_player_data_start __asm("_binary_player_data_start"); +extern uint32_t _binary_player_data_end __asm("_binary_player_data_end"); +extern uint32_t _binary_player_data_size __asm("_binary_player_data_size"); diff --git a/res/player.data.pal.h b/res/player.data.pal.h new file mode 100644 index 0000000..873735e --- /dev/null +++ b/res/player.data.pal.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_player_data_pal_start __asm("_binary_player_data_pal_start"); +extern uint32_t _binary_player_data_pal_end __asm("_binary_player_data_pal_end"); +extern uint32_t _binary_player_data_pal_size __asm("_binary_player_data_pal_size"); diff --git a/res/player.h b/res/player.h deleted file mode 100644 index 9e3857d..0000000 --- a/res/player.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include -extern uint32_t _binary_res_player_data_start __asm("_binary_res_player_data_start"); -extern uint32_t _binary_res_player_data_end __asm("_binary_res_player_data_end"); -extern uint32_t _binary_res_player_data_size __asm("_binary_res_player_data_size"); diff --git a/res/player.pal.h b/res/player.pal.h deleted file mode 100644 index 8e3ada5..0000000 --- a/res/player.pal.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include -extern uint32_t _binary_res_player_data_pal_start __asm("_binary_res_player_data_pal_start"); -extern uint32_t _binary_res_player_data_pal_end __asm("_binary_res_player_data_pal_end"); -extern uint32_t _binary_res_player_data_pal_size __asm("_binary_res_player_data_pal_size"); diff --git a/symbols.lds b/symbols.lds index 475a96e..d4e530d 100644 --- a/symbols.lds +++ b/symbols.lds @@ -17,17 +17,3 @@ __ctors_link_end = ADDR(.ctors) + SIZEOF(.ctors); __bss_link_start = ADDR(.bss); __bss_link_end = ADDR(.bss) + SIZEOF(.bss); - -/* header symbols */ -_arm9_offset = LOADADDR(.text); -_arm9_entry = ADDR(.text); -_arm9_addr = ADDR(.text); -_arm9_size = SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.rodata) + SIZEOF(.ctors); - -_arm7_offset = LOADADDR(.text.arm7); -_arm7_entry = ADDR(.text.arm7); -_arm7_addr = ADDR(.text.arm7); -_arm7_size = SIZEOF(.text.arm7); - -_rom_size = SIZEOF(.text.header) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.text.arm7); -_header_size = SIZEOF(.text.header);