diff --git a/Makefile b/Makefile index 3b2b59406..780c0806d 100644 --- a/Makefile +++ b/Makefile @@ -126,92 +126,54 @@ lang: $(LANG_BIN_FILES) ################################################################################ # Boot -$(B_DIR)/boot.elf: $(O_FILES) - mkdir -p $(B_DIR) - $(TOOLCHAIN)-ld -T ld/boot.ld -o $@ - -$(B_DIR)/ucode/boot.bin: $(B_DIR)/boot.elf +$(B_DIR)/ucode/boot.bin: $(B_DIR)/stage1.bin mkdir -p $(B_DIR)/ucode - $(TOOLCHAIN)-objcopy $< /tmp/boot.tmp -O binary - dd if=/tmp/boot.tmp of="$@" bs=8272 count=1 - rm -f /tmp/boot.tmp + B_DIR=$(B_DIR) tools/extract-segment boot boot: $(B_DIR)/ucode/boot.bin ################################################################################ # Library -$(B_DIR)/library.elf: $(O_FILES) - mkdir -p $(B_DIR) - $(TOOLCHAIN)-ld -T ld/library.ld -o $@ - -$(B_DIR)/ucode/library.bin: $(B_DIR)/library.elf +$(B_DIR)/ucode/library.bin: $(B_DIR)/stage1.bin mkdir -p $(B_DIR)/ucode - $(TOOLCHAIN)-objcopy $< /tmp/library.tmp -O binary - dd if=/tmp/library.tmp of="$@" bs=356240 count=1 - rm -f /tmp/library.tmp + B_DIR=$(B_DIR) tools/extract-segment library library: $(B_DIR)/ucode/library.bin ################################################################################ # Game setup file -$(B_DIR)/setup.elf: $(O_FILES) - mkdir -p $(B_DIR) - $(TOOLCHAIN)-ld -T ld/setup.ld -o $@ - -$(B_DIR)/ucode/setup.bin: $(B_DIR)/setup.elf +$(B_DIR)/ucode/setup.bin: $(B_DIR)/stage1.bin mkdir -p $(B_DIR)/ucode - $(TOOLCHAIN)-objcopy $< /tmp/setup.tmp -O binary - dd if=/tmp/setup.tmp of="$@" bs=200256 count=1 - rm -f /tmp/setup.tmp + B_DIR=$(B_DIR) tools/extract-segment setup setup: $(B_DIR)/ucode/setup.bin ################################################################################ # Rarezip -$(B_DIR)/rarezip.elf: $(O_FILES) - mkdir -p $(B_DIR) - $(TOOLCHAIN)-ld -T ld/rarezip.ld -o $@ - -$(B_DIR)/ucode/rarezip.bin: $(B_DIR)/rarezip.elf +$(B_DIR)/ucode/rarezip.bin: $(B_DIR)/stage1.bin mkdir -p $(B_DIR)/ucode - $(TOOLCHAIN)-objcopy $< $@ -O binary + B_DIR=$(B_DIR) tools/extract-segment rarezip rarezip: $(B_DIR)/ucode/rarezip.bin ################################################################################ # Main game -$(B_DIR)/game.elf: $(O_FILES) - mkdir -p $(B_DIR) - $(TOOLCHAIN)-ld -T ld/game.ld -o $@ - -$(B_DIR)/gamerodata.elf: $(O_FILES) - mkdir -p $(B_DIR) - $(TOOLCHAIN)-ld -T ld/gamerodata.ld -o $@ - -$(B_DIR)/ucode/game.bin: $(B_DIR)/game.elf $(B_DIR)/gamerodata.elf +$(B_DIR)/ucode/game.bin: $(B_DIR)/stage1.bin mkdir -p $(B_DIR)/ucode - $(TOOLCHAIN)-objcopy $(B_DIR)/game.elf /tmp/game.tmp -O binary - $(TOOLCHAIN)-objcopy $(B_DIR)/gamerodata.elf /tmp/gamerodata.tmp -O binary - dd if=/tmp/game.tmp of="$@" bs=1734848 count=1 - dd if=/tmp/gamerodata.tmp of="$@" bs=74016 count=1 conv=notrunc oflag=append - rm -f /tmp/game.tmp /tmp/gamerodata.tmp + B_DIR=$(B_DIR) tools/extract-segment game game: $(B_DIR)/ucode/game.bin ################################################################################ # gVars -$(B_DIR)/gvars.elf: $(O_FILES) - mkdir -p $(B_DIR) - $(TOOLCHAIN)-ld -T ld/gvars.ld -o $@ - -$(B_DIR)/ucode/gvars.bin: $(B_DIR)/gvars.elf +$(B_DIR)/ucode/gvars.bin: $(B_DIR)/stage1.bin mkdir -p $(B_DIR)/ucode - $(TOOLCHAIN)-objcopy $< $@ -O binary + B_DIR=$(B_DIR) tools/extract-segment gvars gvars: $(B_DIR)/ucode/gvars.bin @@ -232,6 +194,14 @@ test: all python tools/asmpreproc/asm-processor.py -O2 $< | $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/cc -c $(CFLAGS) tools/asmpreproc/include-stdin.c -o $@ -O2 python tools/asmpreproc/asm-processor.py -O2 $< --post-process $@ --assembler "$(TOOLCHAIN)-as -march=vr4300 -mabi=32" --asm-prelude tools/asmpreproc/prelude.s +$(B_DIR)/stage1.elf: $(O_FILES) + mkdir -p $(B_DIR) + $(TOOLCHAIN)-ld -T ld/stage1.ld --print-map -o $@ > $(B_DIR)/stage1.map + +$(B_DIR)/stage1.bin: $(B_DIR)/stage1.elf + mkdir -p $(B_DIR)/ucode + $(TOOLCHAIN)-objcopy $< $@ -O binary + all: stagesetup lang boot library setup tiles rarezip game gvars rom: all diff --git a/ld/game.ld b/ld/game.ld deleted file mode 100644 index 380289b9f..000000000 --- a/ld/game.ld +++ /dev/null @@ -1,64 +0,0 @@ -/*OUTPUT_FORMAT ("elf32-bigmips")*/ -OUTPUT_ARCH (mips) - -SECTIONS -{ - .game 0x0f000000 : AT(0) { - src/game/game_000000.o (.text); - src/game/chr/chrai.o (.text); - src/game/chr/chraicommands.o (.text); - src/game/game_0601b0.o (.text); - } - - .gamerodata 0x7f000000 + SIZEOF(.game) : AT(SIZEOF(.game)) { - src/game/game_000000.o (.rodata); - src/game/chr/chrai.o (.rodata); - src/game/chr/chraicommands.o (.rodata); - src/game/game_0601b0.o (.rodata); - - src/game/game_000000.o (.data); - src/game/chr/chrai.o (.data); - src/game/chr/chraicommands.o (.data); - src/game/game_0601b0.o (.data); - } - - .library 0x00003050 : AT(SIZEOF(.game) + SIZEOF(.gamerodata)) { - src/library/library.o (.text); - src/library/library.o (.data); - } - - .setup 0x80059fe0 : AT(SIZEOF(.game) + SIZEOF(.gamerodata) + SIZEOF(.library)) { - src/setup/setup_000000.o (.data); - src/setup/inventory.o (.data); - src/setup/setup_0160b0.o (.data); - src/setup/ailists.o (.data); - src/setup/setup_020df0.o (.data); - } - - .gvars 0x8008ae20 : AT(SIZEOF(.game) + SIZEOF(.gamerodata) + SIZEOF(.library) + SIZEOF(.setup)) { - src/gvars/gvars.o (.data); - } - - .boot 0x00001000 : AT(SIZEOF(.game) + SIZEOF(.gamerodata) + SIZEOF(.library) + SIZEOF(.setup) + SIZEOF(.gvars)) { - src/boot/boot.o (.text); - src/boot/boot.o (.data); - } - - /* We don't really care about these values here */ - setupSegmentStart = 0; - setupSegmentRomStart = 0; - rarezipSegmentStart = 0; - rarezipSegmentRomStart = 0; - ziplistSegmentRomStart = 0; - - /DISCARD/ : { - * (.MIPS.abiflags); - * (.options); - * (.gnu.attributes); - * (.pdr); - * (.mdebug); - * (.gptab.bss); - * (.gptab.data); - * (.reginfo); - } -} diff --git a/ld/gamerodata.ld b/ld/gamerodata.ld deleted file mode 100644 index d48ac6075..000000000 --- a/ld/gamerodata.ld +++ /dev/null @@ -1,63 +0,0 @@ -/*OUTPUT_FORMAT ("elf32-bigmips")*/ -OUTPUT_ARCH (mips) - -SECTIONS -{ - .gamerodata 0x7f000000 + SIZEOF(.game) : AT(0) { - src/game/game_000000.o (.rodata); - src/game/chr/chrai.o (.rodata); - src/game/chr/chraicommands.o (.rodata); - src/game/game_0601b0.o (.rodata); - - src/game/game_000000.o (.data); - src/game/chr/chrai.o (.data); - src/game/chr/chraicommands.o (.data); - src/game/game_0601b0.o (.data); - } - - .game 0x7f000000 : AT(SIZEOF(.gamerodata)) { - src/game/game_000000.o (.text); - src/game/chr/chrai.o (.text); - src/game/chr/chraicommands.o (.text); - src/game/game_0601b0.o (.text); - } - - .library 0x7f003050 : AT(SIZEOF(.game) + SIZEOF(.gamerodata)) { - src/library/library.o (.text); - src/library/library.o (.data); - } - - .setup 0x80059fe0 : AT(SIZEOF(.game) + SIZEOF(.gamerodata) + SIZEOF(.library)) { - src/setup/setup_000000.o (.data); - src/setup/inventory.o (.data); - src/setup/setup_0160b0.o (.data); - src/setup/ailists.o (.data); - src/setup/setup_020df0.o (.data); - } - - .gvars 0x8008ae20 : AT(SIZEOF(.game) + SIZEOF(.gamerodata) + SIZEOF(.library) + SIZEOF(.setup)) { - src/gvars/gvars.o (.data); - } - - .boot 0x7f001000 : AT(SIZEOF(.game) + SIZEOF(.gamerodata) + SIZEOF(.library) + SIZEOF(.setup) + SIZEOF(.gvars)) { - src/boot/boot.o (.text); - src/boot/boot.o (.data); - } - - /* We don't really care about these values here */ - setupSegmentStart = 0; - setupSegmentRomStart = 0; - rarezipSegmentStart = 0; - rarezipSegmentRomStart = 0; - ziplistSegmentRomStart = 0; - /DISCARD/ : { - * (.MIPS.abiflags); - * (.options); - * (.gnu.attributes); - * (.pdr); - * (.mdebug); - * (.gptab.bss); - * (.gptab.data); - * (.reginfo); - } -} diff --git a/ld/gvars.ld b/ld/gvars.ld deleted file mode 100644 index 816079450..000000000 --- a/ld/gvars.ld +++ /dev/null @@ -1,22 +0,0 @@ -/*OUTPUT_FORMAT ("elf32-bigmips")*/ -OUTPUT_ARCH (mips) - -SECTIONS -{ - .gvars 0x8008ae20 : AT(0) { - src/gvars/gvars.o (.text); - src/gvars/gvars.o (.data); - } - - /DISCARD/ : { - * (.MIPS.abiflags); - * (.options); - * (.gnu.attributes); - * (.pdr); - * (.mdebug); - * (.gptab.bss); - * (.gptab.data); - * (.reginfo); - * (.setup.data); - } -} diff --git a/ld/library.ld b/ld/library.ld deleted file mode 100644 index 4d490a2dd..000000000 --- a/ld/library.ld +++ /dev/null @@ -1,58 +0,0 @@ -/*OUTPUT_FORMAT ("elf32-bigmips")*/ -OUTPUT_ARCH (mips) - -SECTIONS -{ - .library 0x00003050 : AT(0) { - src/library/library.o (.text); - src/library/library.o (.data); - } - - .setup 0x80059fe0 : AT(SIZEOF(.library)) { - src/setup/setup_000000.o (.data); - src/setup/inventory.o (.data); - src/setup/setup_0160b0.o (.data); - src/setup/ailists.o (.data); - src/setup/setup_020df0.o (.data); - } - - .gvars 0x8008ae20 : AT(SIZEOF(.library) + SIZEOF(.setup)) { - src/gvars/gvars.o (.data); - } - - .game 0x0f000000 : AT(SIZEOF(.library) + SIZEOF(.setup) + SIZEOF(.gvars)) { - src/game/game_000000.o (.text); - src/game/chr/chrai.o (.text); - src/game/chr/chraicommands.o (.text); - src/game/game_0601b0.o (.text); - - src/game/game_000000.o (.data); - src/game/chr/chrai.o (.data); - src/game/chr/chraicommands.o (.data); - src/game/game_0601b0.o (.data); - } - - .boot 0x1000 : AT(SIZEOF(.library) + SIZEOF(.setup) + SIZEOF(.gvars) + SIZEOF(.game)) { - src/boot/boot.o (.text); - src/boot/boot.o (.data); - } - - /* We don't really care about these values here */ - setupSegmentStart = 0; - setupSegmentRomStart = 0; - rarezipSegmentStart = 0; - rarezipSegmentRomStart = 0; - ziplistSegmentRomStart = 0; - - /DISCARD/ : { - * (.MIPS.abiflags); - * (.options); - * (.gnu.attributes); - * (.pdr); - * (.mdebug); - * (.gptab.bss); - * (.gptab.data); - * (.reginfo); - * (.setup.data); - } -} diff --git a/ld/rarezip.ld b/ld/rarezip.ld deleted file mode 100644 index ccfa8cf02..000000000 --- a/ld/rarezip.ld +++ /dev/null @@ -1,22 +0,0 @@ -/*OUTPUT_FORMAT ("elf32-bigmips")*/ -OUTPUT_ARCH (mips) - -SECTIONS -{ - .text 0x70200000 : AT(0x0000) { - src/rarezip/rarezip.o (.text); - src/rarezip/rarezip.o (.data); - } - - /DISCARD/ : { - * (.MIPS.abiflags); - * (.options); - * (.gnu.attributes); - * (.pdr); - * (.mdebug); - * (.gptab.bss); - * (.gptab.data); - * (.reginfo); - } -} - diff --git a/ld/setup.ld b/ld/setup.ld deleted file mode 100644 index d6121785d..000000000 --- a/ld/setup.ld +++ /dev/null @@ -1,57 +0,0 @@ -/*OUTPUT_FORMAT ("elf32-bigmips")*/ -OUTPUT_ARCH (mips) - -SECTIONS -{ - .setup 0x80059fe0 : AT(0) { - src/setup/setup_000000.o (.data); - src/setup/inventory.o (.data); - src/setup/setup_0160b0.o (.data); - src/setup/ailists.o (.data); - src/setup/setup_020df0.o (.data); - } - - .gvars 0x8008ae20 : AT(SIZEOF(.setup)) { - src/gvars/gvars.o (.data); - } - - .library 0x7e000000 : AT(SIZEOF(.setup) + SIZEOF(.gvars)) { - src/library/library.o (.text); - src/library/library.o (.data); - } - - .game 0x7f000000 : AT(SIZEOF(.setup) + SIZEOF(.gvars) + SIZEOF(.library)) { - src/game/game_000000.o (.text); - src/game/chr/chrai.o (.text); - src/game/chr/chraicommands.o (.text); - src/game/game_0601b0.o (.text); - - src/game/game_000000.o (.data); - src/game/chr/chrai.o (.data); - src/game/chr/chraicommands.o (.data); - src/game/game_0601b0.o (.data); - } - - .boot 0x7d001000 : AT(SIZEOF(.setup) + SIZEOF(.gvars) + SIZEOF(.library) + SIZEOF(.game)) { - src/boot/boot.o (.text); - src/boot/boot.o (.data); - } - - /* We don't really care about these values here */ - setupSegmentStart = 0; - setupSegmentRomStart = 0; - rarezipSegmentStart = 0; - rarezipSegmentRomStart = 0; - ziplistSegmentRomStart = 0; - - /DISCARD/ : { - * (.MIPS.abiflags); - * (.options); - * (.gnu.attributes); - * (.pdr); - * (.mdebug); - * (.gptab.bss); - * (.gptab.data); - * (.reginfo); - } -} diff --git a/ld/boot.ld b/ld/stage1.ld similarity index 80% rename from ld/boot.ld rename to ld/stage1.ld index e252a0b8e..9210c2641 100644 --- a/ld/boot.ld +++ b/ld/stage1.ld @@ -8,12 +8,12 @@ SECTIONS rarezipSegmentRomStart = 0x4e850; ziplistSegmentRomStart = 0x4fc40; - .boot 0x00001000 : AT(0) { + .boot 0x70001000 : AT(0) { src/boot/boot.o (.text); src/boot/boot.o (.data); } - .library 0x00003050 : AT(SIZEOF(.boot)) { + .library 0x70003050 : AT(SIZEOF(.boot)) { src/library/library.o (.text); src/library/library.o (.data); } @@ -30,7 +30,7 @@ SECTIONS src/gvars/gvars.o (.data); } - .game 0x0f000000 : AT(SIZEOF(.boot) + SIZEOF(.library) + SIZEOF(.setup) + SIZEOF(.gvars)) { + .game 0x7f000000 : AT(SIZEOF(.boot) + SIZEOF(.library) + SIZEOF(.setup) + SIZEOF(.gvars)) { src/game/game_000000.o (.text); src/game/chr/chrai.o (.text); src/game/chr/chraicommands.o (.text); @@ -47,6 +47,11 @@ SECTIONS src/game/game_0601b0.o (.rodata); } + .rarezip 0x70200000 : AT(SIZEOF(.boot) + SIZEOF(.library) + SIZEOF(.setup) + SIZEOF(.gvars) + SIZEOF(.game)) { + src/rarezip/rarezip.o (.text); + src/rarezip/rarezip.o (.data); + } + /DISCARD/ : { * (.MIPS.abiflags); * (.options); @@ -56,6 +61,5 @@ SECTIONS * (.gptab.bss); * (.gptab.data); * (.reginfo); - * (.setup.data); } } diff --git a/tools/extract-segment b/tools/extract-segment new file mode 100755 index 000000000..85d84d1fc --- /dev/null +++ b/tools/extract-segment @@ -0,0 +1,11 @@ +#!/bin/bash + +# Extracts a segment from the stage1 binary which has been built from source. + +segment=$1 + +pos=$(grep "^\.$segment" $B_DIR/stage1.map | awk '{print $6}') +len=$(grep "^\.$segment" $B_DIR/stage1.map | awk '{print $3}') + +dd if=$B_DIR/stage1.bin of=$B_DIR/ucode/$segment.bin skip=$(($pos)) iflag=skip_bytes bs=$(($len)) count=1 +