From e1ede7aa2cb1840add9ba88901c7495deb2b37e3 Mon Sep 17 00:00:00 2001 From: Segher Boessenkool Date: Thu, 4 Jun 2009 09:17:38 +0200 Subject: [PATCH] LEGO Indiana Jones --- .gitignore | 11 -- Makefile | 103 +----------- lego/.gitignore | 5 + lego/Makefile | 117 ++++++++++++++ lego/README | 7 + lego/exploit.s | 31 ++++ lego/head.b | Bin 0 -> 32256 bytes lego/head.lds | 22 +++ lego/head.s | 26 +++ lego/lego.lds | 22 +++ lego/make-title-bin.pl | 16 ++ lego/pack.sh | 3 + lego/rli-banner.png | Bin 0 -> 21651 bytes lego/rli-banner.ppm | Bin 0 -> 36878 bytes lego/rlie-icon.png | Bin 0 -> 4508 bytes lego/rlie-icon.ppm | Bin 0 -> 6925 bytes lego/rlij-icon.png | Bin 0 -> 4416 bytes lego/rlij-icon.ppm | Bin 0 -> 6925 bytes lego/rlip-icon.png | Bin 0 -> 4431 bytes lego/rlip-icon.ppm | Bin 0 -> 6925 bytes titleid.pl => lego/titleid.pl | 0 lego/toc-rlie | 4 + lego/toc-rlij | 4 + lego/toc-rlip | 4 + loader/main.c | 6 +- twilight/.gitignore | 10 ++ twilight/Makefile | 148 ++++++++++++++++++ .../generic-banner.png | Bin .../generic-banner.ppm | Bin head.b => twilight/head.b | Bin .../make-title-bin.pl | 2 +- pack.sh => twilight/pack.sh | 0 rzde-icon.png => twilight/rzde-icon.png | Bin rzde-icon.ppm => twilight/rzde-icon.ppm | Bin rzdj-icon.png => twilight/rzdj-icon.png | Bin rzdj-icon.ppm => twilight/rzdj-icon.ppm | Bin rzdp-icon.png => twilight/rzdp-icon.png | Bin rzdp-icon.ppm => twilight/rzdp-icon.ppm | Bin start.S => twilight/start.S | 0 twilight/titleid.pl | 2 + toc-rzde-3.2 => twilight/toc-rzde-3.2 | 0 toc-rzde-3.3 => twilight/toc-rzde-3.3 | 0 toc-rzde-3.4 => twilight/toc-rzde-3.4 | 0 toc-rzdj-3.2 => twilight/toc-rzdj-3.2 | 0 toc-rzdj-3.3 => twilight/toc-rzdj-3.3 | 0 toc-rzdj-3.4 => twilight/toc-rzdj-3.4 | 0 toc-rzdp-3.2 => twilight/toc-rzdp-3.2 | 0 toc-rzdp-3.3 => twilight/toc-rzdp-3.3 | 0 toc-rzdp-3.4 => twilight/toc-rzdp-3.4 | 0 twilight.c => twilight/twilight.c | 0 twilight.lds => twilight/twilight.lds | 0 51 files changed, 432 insertions(+), 111 deletions(-) create mode 100644 lego/.gitignore create mode 100644 lego/Makefile create mode 100644 lego/README create mode 100644 lego/exploit.s create mode 100644 lego/head.b create mode 100644 lego/head.lds create mode 100644 lego/head.s create mode 100644 lego/lego.lds create mode 100755 lego/make-title-bin.pl create mode 100755 lego/pack.sh create mode 100644 lego/rli-banner.png create mode 100644 lego/rli-banner.ppm create mode 100644 lego/rlie-icon.png create mode 100644 lego/rlie-icon.ppm create mode 100644 lego/rlij-icon.png create mode 100644 lego/rlij-icon.ppm create mode 100644 lego/rlip-icon.png create mode 100644 lego/rlip-icon.ppm rename titleid.pl => lego/titleid.pl (100%) create mode 100644 lego/toc-rlie create mode 100644 lego/toc-rlij create mode 100644 lego/toc-rlip create mode 100644 twilight/.gitignore create mode 100644 twilight/Makefile rename generic-banner.png => twilight/generic-banner.png (100%) rename generic-banner.ppm => twilight/generic-banner.ppm (100%) rename head.b => twilight/head.b (100%) rename make-title-bin.pl => twilight/make-title-bin.pl (87%) rename pack.sh => twilight/pack.sh (100%) rename rzde-icon.png => twilight/rzde-icon.png (100%) rename rzde-icon.ppm => twilight/rzde-icon.ppm (100%) rename rzdj-icon.png => twilight/rzdj-icon.png (100%) rename rzdj-icon.ppm => twilight/rzdj-icon.ppm (100%) rename rzdp-icon.png => twilight/rzdp-icon.png (100%) rename rzdp-icon.ppm => twilight/rzdp-icon.ppm (100%) rename start.S => twilight/start.S (100%) create mode 100755 twilight/titleid.pl rename toc-rzde-3.2 => twilight/toc-rzde-3.2 (100%) rename toc-rzde-3.3 => twilight/toc-rzde-3.3 (100%) rename toc-rzde-3.4 => twilight/toc-rzde-3.4 (100%) rename toc-rzdj-3.2 => twilight/toc-rzdj-3.2 (100%) rename toc-rzdj-3.3 => twilight/toc-rzdj-3.3 (100%) rename toc-rzdj-3.4 => twilight/toc-rzdj-3.4 (100%) rename toc-rzdp-3.2 => twilight/toc-rzdp-3.2 (100%) rename toc-rzdp-3.3 => twilight/toc-rzdp-3.3 (100%) rename toc-rzdp-3.4 => twilight/toc-rzdp-3.4 (100%) rename twilight.c => twilight/twilight.c (100%) rename twilight.lds => twilight/twilight.lds (100%) diff --git a/.gitignore b/.gitignore index f63dbb7..3350594 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,3 @@ *.o .version - -rzd?-?.?.bin -rzd?.data - -rzd??.elf -rzd??.slot - -title.bin - -zero16k -FAILURE diff --git a/Makefile b/Makefile index 278c630..a5a5120 100644 --- a/Makefile +++ b/Makefile @@ -41,111 +41,22 @@ else endif -targets := rzde-3.2.bin rzde-3.3.bin rzde-3.4.bin -targets += rzdj-3.2.bin rzdj-3.3.bin rzdj-3.4.bin -targets += rzdp-3.2.bin rzdp-3.3.bin rzdp-3.4.bin -targets-short := rzde rzdj rzdp - -objs := twilight.o - -ppms := $(targets-short:%=%-icon.ppm) generic-banner.ppm -assets := title.bin $(ppms) - -loader := loader/loader.bin - - -titleid = $(shell perl titleid.pl $(1)) - - -# System menu 3.3 checks for the exploit, when a) you copy a save from SD, -# and b) when the menu starts up; but for a) it only looks at the first -# zeldaTp.dat file, and for b) it allows any file of non-aligned length. -# -# System menu 3.4 only looks at the last file in the wad when installing. -# -# System menu 4.0 finally avoids such silly bugs. - -define twintig - D=$(call titleid,$(1)); \ - $(TOOLS)/twintig $$D $@ toc-$1 -endef - - -all: $(targets) - -$(filter %-3.2.bin,$(targets)): %-3.2.bin: %.data -$(filter %-3.3.bin,$(targets)): %-3.3.bin: %.data zero16k -$(filter %-3.4.bin,$(targets)): %-3.4.bin: %.data FAILURE -$(targets): %.bin: toc-% $(assets) - @echo " TWINTIG $@" - $(Q)$(call twintig,$*) - -saves := $(targets-short:%=%.data) - -rzde.data: rzde0.slot rzde2.slot -rzdp.data: rzdp0.slot -rzdj.data: rzdj0.slot -$(saves): $(loader) - @echo " ZELDAPACK $@" - $(Q)./pack.sh $@ $(filter %.slot,$^) - $(Q)$(TOOLS)/zelda-cksum $@ - $(Q)cat $(loader) >> $@ - $(Q)printf '\0' >> $@ - -slots := rzde0.slot rzde2.slot rzdj0.slot rzdp0.slot - -$(slots): %.slot: %.elf - @echo " OBJCOPY $@" - $(Q)$(OBJCOPY) -Obinary $< $@ - -elfs := $(slots:.slot=.elf) - -rzde0.elf: baddr := 0x8046a3e0+0 -rzde2.elf: baddr := 0x804519e0+0x0a94 -rzdj0.elf: baddr := 0x8044f860+0 -rzdp0.elf: baddr := 0x804522e0+0 -$(elfs): %.elf: twilight.lds %.o $(objs) - @echo " LINK $@" - $(Q)$(LD) --defsym baddr=$(baddr) -T $^ -o $@ - -exploit-objs := $(elfs:.elf=.o) - -$(exploit-objs): slot-name := Twilight Hack -rzde0.o: slot-name := TwilightHack0 -rzde2.o: slot-name := TwilightHack2 -$(exploit-objs): %.o: start.S head.b - @echo " ASSEMBLE $@" - $(Q)$(CC) $(CFLAGS) -D NAME="$(slot-name)" -c $< -o $@ - -%.o: %.c - @echo " COMPILE $@" - $(Q)$(CC) $(CFLAGS) -c $< -o $@ - -title.bin: .version - @echo " TITLEBIN $@" - $(Q)perl make-title-bin.pl > $@ +all: .version: FORCE $(Q)./describe.sh > .$@-tmp $(Q)cmp -s $@ .$@-tmp || cp .$@-tmp $@ $(Q)rm .$@-tmp -$(ppms): %.ppm: %.png - @echo " PPM $@" - $(Q)convert $< $@ - -zero16k: - $(Q)dd if=/dev/zero bs=16384 count=1 2>/dev/null > $@ - -FAILURE: - $(Q)echo FAILURE > $@ - -$(loader): FORCE .version +all: FORCE .version $(Q)$(MAKE) -C loader + $(Q)$(MAKE) -C twilight + $(Q)$(MAKE) -C lego FORCE: clean: - -rm -f $(targets) $(saves) $(elfs) $(exploit-objs) $(objs) $(slots) - -rm -f .version title.bin zero16k FAILURE + -rm -f .version $(MAKE) -C loader clean + $(MAKE) -C twilight clean + $(MAKE) -C lego clean diff --git a/lego/.gitignore b/lego/.gitignore new file mode 100644 index 0000000..bcbbaf2 --- /dev/null +++ b/lego/.gitignore @@ -0,0 +1,5 @@ +rli?.bin +FILE_V28 +exploit.bin +exploit.elf +title.bin diff --git a/lego/Makefile b/lego/Makefile new file mode 100644 index 0000000..b1fe162 --- /dev/null +++ b/lego/Makefile @@ -0,0 +1,117 @@ +# Copyright 2008-2009 Segher Boessenkool +# This code is licensed to you under the terms of the GNU GPL, version 2; +# see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt + + +# Configuration: + +# What toolchain prefix should we use +CROSS ?= broadway- + +# Where are the tools (http://git.infradead.org/users/segher/wii.git) +TOOLS ?= $(HOME)/wii/segher + +# End of configuration. + + + +# Set CC, LD, OBJCOPY based on CROSS, unless they are set already + +ifeq ($(origin CC), default) + CC := $(CROSS)gcc -m32 +endif +ifeq ($(origin LD), default) + LD := $(CROSS)ld +endif +OBJCOPY ?= $(CROSS)objcopy + + +# The compiler flags we need. + +CFLAGS := -Wall -W -Os -ffreestanding -mno-eabi -mno-sdata -mcpu=750 + + +# Build with "V=1" to see the commands executed; be quiet otherwise. + +ifeq ($(V),1) + Q := +else + Q := @ + MAKEFLAGS += --no-print-directory +endif + + +targets := rlie.bin rlij.bin rlip.bin + +ppms := $(targets:%.bin=%-icon.ppm) rli-banner.ppm +assets := title.bin $(ppms) + +loader := ../loader/loader.bin + + +titleid = $(shell perl titleid.pl $(1)) + + +define twintig + D=$(call titleid,$(1)); \ + $(TOOLS)/twintig $$D $@ toc-$1 +endef + + +all: $(targets) + +$(targets): %.bin: toc-% FILE_V28 $(assets) + @echo " TWINTIG $@" + $(Q)$(call twintig,$*) + +FILE_V28: head.bin exploit.bin $(loader) + @echo " LEGOSTACK $@" + $(Q)./pack.sh $@ $^ + $(Q)$(TOOLS)/lego-cksum $@ 32688 + +head.bin: head.elf + @echo " OBJCOPY $@" + $(Q)$(OBJCOPY) -Obinary $< $@ + +exploit.bin: exploit.elf + @echo " OBJCOPY $@" + $(Q)$(OBJCOPY) -Obinary $< $@ + +exploit.elf: baddr := 0x903b0780 +exploit.elf: lego.lds exploit.o + @echo " LINK $@" + $(Q)$(LD) --defsym baddr=$(baddr) -T $^ -o $@ + +head.elf: head.lds head.o + @echo " LINK $@" + $(Q)$(LD) -T $^ -o $@ + +exploit.o: exploit.s + @echo " ASSEMBLE $@" + $(Q)$(CC) $(CFLAGS) -c $< -o $@ + +head.o: head.s head.b + @echo " ASSEMBLE $@" + $(Q)$(CC) $(CFLAGS) -c $< -o $@ + +title.bin: ../.version + @echo " TITLEBIN $@" + $(Q)perl make-title-bin.pl > $@ + +../.version: FORCE + $(Q)$(MAKE) -C .. .version + +$(ppms): %.ppm: %.png + @echo " PPM $@" + $(Q)convert $< $@ + +$(loader): FORCE + $(Q)$(MAKE) -C ../loader + +FORCE: + +clean: + -rm -f $(targets) FILE_V28 + -rm -f exploit.bin exploit.elf exploit.o + -rm -f head.bin head.elf head.o + -rm -f title.bin diff --git a/lego/README b/lego/README new file mode 100644 index 0000000..1fd8677 --- /dev/null +++ b/lego/README @@ -0,0 +1,7 @@ +Extremely short instructions: put this savegame on your Wii (if you have +one on there already that you want to keep, back it up first!), start the +game, walk to the "art room" (find some walkthrough on the intertubes if +you cannot find it), look at the second character, enjoy! + +Kudos to "roto" for finding the original buffer overflow, and many thanks +for doing lots of testing! diff --git a/lego/exploit.s b/lego/exploit.s new file mode 100644 index 0000000..acc423c --- /dev/null +++ b/lego/exploit.s @@ -0,0 +1,31 @@ +# Copyright 2008-2009 Segher Boessenkool +# This code is licensed to you under the terms of the GNU GPL, version 2; +# see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt + + .section .start,"ax" + +start: + # Set up a stack frame. + lis 1,0x8080 ; li 0,0 ; stwu 0,-64(1) + + # Stop audio and video. + lis 0,audio_stop@h ; ori 0,0,audio_stop@l ; mtctr 0 ; bctrl + lis 0,video_stop@h ; ori 0,0,video_stop@l ; mtctr 0 ; bctrl + + # Move code into place; a generous 32kB, starting at 64kB in + # the save file. + + lis 3,main@h ; ori 3,3,main@l ; addi 5,3,-4 + lis 4,0x806c ; lwz 4,0xdc48-0x10000(4) ; addi 4,4,-4 + addis 4,4,1 ; addi 4,4,end-start + li 0,0x2000 ; mtctr 0 +0: lwzu 0,4(4) ; stwu 0,4(5) ; bdnz 0b + + # Sync caches on it. + li 0,0x0400 ; mtctr 0 ; mr 5,3 +0: dcbst 0,5 ; sync ; icbi 0,5 ; addi 5,5,0x20 ; bdnz 0b + sync ; isync + + # Go for it! + mtctr 3 ; bctr +end: diff --git a/lego/head.b b/lego/head.b new file mode 100644 index 0000000000000000000000000000000000000000..1bcf35af7d8e4b952eb0c21684a0d9c0c462b802 GIT binary patch literal 32256 zcmeI*F-ikL6b9h8(X5gPR;COqf*wRI>;zA+ph%i6qF`&Khp_QNV(l@!fp1qKBtb+H zu<#ogW@hKjKkyaXPDB*3+;;QRIQw4q{%7BM`qjo*h0J&F8FpJ)a)2?)=5PzrJtrerp2% zUEs7%f#Tu0by#KIp8rML&)V6K?%RX+as2-JnD43Y#6i|?#AcQrMHz9{Tu$nyuFmh8 ho2sgo61wnyo;l1n*~i^o!^|l!Zl`r~eKq}Q`~ZE + This code is licensed to you under the terms of the GNU GPL, version 2; + see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt */ + +OUTPUT_FORMAT("elf32-powerpc") +OUTPUT_ARCH(powerpc:common) + +SECTIONS { +/* audio_stop = 0x800a3e80; + video_stop = 0x800b2120; + + main = 0x90000020; */ + + .head 0x805a909c : + { + head.o(.start) + *(.text) + *(.rodata .rodata.*) + *(.data) + *(.bss) + } +} diff --git a/lego/head.s b/lego/head.s new file mode 100644 index 0000000..0232fd0 --- /dev/null +++ b/lego/head.s @@ -0,0 +1,26 @@ + .section ".start", "ax" + + # FIXME + bptr = 0x806bdc48 + +0: + .incbin "head.b" + + # Smack the stack. + .long 0x11111111, 0x11111111, 0x11111111, 0x11111111 + .long 0x11111111, 0x11111111, 0x11111111, 0x11111111 + .long 0x11111111, 0x11111111, 0x11111111, 0x11111111 + .long 0x11111111, 0x11111111, 0x11111111, 0x11111111 + .long 0x11111111, 0x11111111, 0x11111111, 0x11111111 + .long 0x11111111, 0x11111111, 0x11111111, 0x11111111 + .long 0x11111111, 0x11111111, 0x11111111, 0x11111111 + .long 0x11111111, 0x11111111, 0x11111111, 0x11111111 + .long 0x11111111 + + # Return address; namely... + .long 0x805b0f30, 0x11111111, 0x11111111, 0x11111111 + + # Here. + lis 3,bptr@ha ; lwz 3,bptr@l(3) ; addis 3,3,1 ; mtctr 3 ; bctr + + .fill 0x10000 - (. - 0b) diff --git a/lego/lego.lds b/lego/lego.lds new file mode 100644 index 0000000..417f36a --- /dev/null +++ b/lego/lego.lds @@ -0,0 +1,22 @@ +/* Copyright 2008-2009 Segher Boessenkool + This code is licensed to you under the terms of the GNU GPL, version 2; + see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt */ + +OUTPUT_FORMAT("elf32-powerpc") +OUTPUT_ARCH(powerpc:common) + +SECTIONS { + audio_stop = 0x800a3e80; + video_stop = 0x800b2120; + + main = 0x90000020; + + .twilight baddr : + { + rli*.o(.start) + *(.text) + *(.rodata .rodata.*) + *(.data) + *(.bss) + } +} diff --git a/lego/make-title-bin.pl b/lego/make-title-bin.pl new file mode 100755 index 0000000..a91ae98 --- /dev/null +++ b/lego/make-title-bin.pl @@ -0,0 +1,16 @@ +#!/usr/bin/perl +sub printline { + my $x = shift; + chomp $x; + $x .= "\0" x 32; + $x = substr $x, 0, 32; + $x =~ s/(.)/\0$1/g; + + print $x; +} + +$name = "Indiana Pwns, by Team Twiizers"; +$version = `cat ../.version`; + +printline $name; +printline $version; diff --git a/lego/pack.sh b/lego/pack.sh new file mode 100755 index 0000000..57a388b --- /dev/null +++ b/lego/pack.sh @@ -0,0 +1,3 @@ +#!/bin/bash +TARGET=$1; shift +cat $* /dev/zero | dd bs=1024 count=128 2>/dev/null > $TARGET diff --git a/lego/rli-banner.png b/lego/rli-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..dfbea833064898e07436db20fff63aa6cce915e7 GIT binary patch literal 21651 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 N(|%}oU+jNj{u>(E?PLG| literal 0 HcmV?d00001 diff --git a/lego/rlie-icon.png b/lego/rlie-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..116c46693188220bc603c2dcf9f038c92521fc19 GIT binary patch literal 4508 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 BmW}`b literal 0 HcmV?d00001 diff --git a/lego/rlij-icon.png b/lego/rlij-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b17ed928a008e470c6843a4b9746f9c0d6fac5 GIT binary patch literal 4416 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 V)mHfaM8yCA002ovPDHLkV1kXcrUn22 literal 0 HcmV?d00001 diff --git a/lego/rlip-icon.ppm b/lego/rlip-icon.ppm new file mode 100644 index 0000000000000000000000000000000000000000..5cda2e7e6a458fcda80c40ae9819d668e3a2fcb9 GIT binary patch literal 6925 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 literal 0 HcmV?d00001 diff --git a/titleid.pl b/lego/titleid.pl similarity index 100% rename from titleid.pl rename to lego/titleid.pl diff --git a/lego/toc-rlie b/lego/toc-rlie new file mode 100644 index 0000000..6ae5c54 --- /dev/null +++ b/lego/toc-rlie @@ -0,0 +1,4 @@ +title.bin +rli-banner.ppm +rlie-icon.ppm +FILE_V28 FILE_V28 diff --git a/lego/toc-rlij b/lego/toc-rlij new file mode 100644 index 0000000..b7aeb08 --- /dev/null +++ b/lego/toc-rlij @@ -0,0 +1,4 @@ +title.bin +rli-banner.ppm +rlij-icon.ppm +FILE_V28 FILE_V28 diff --git a/lego/toc-rlip b/lego/toc-rlip new file mode 100644 index 0000000..c69f791 --- /dev/null +++ b/lego/toc-rlip @@ -0,0 +1,4 @@ +title.bin +rli-banner.ppm +rlip-icon.ppm +FILE_V28 FILE_V28 diff --git a/loader/main.c b/loader/main.c index 62f6aa6..223b26b 100644 --- a/loader/main.c +++ b/loader/main.c @@ -5,8 +5,8 @@ #include "loader.h" -u8 *code_buffer = (u8 *)0x90100000; -u8 *trampoline_buffer = (u8 *)0x80001800; +static u8 *const code_buffer = (u8 *)0x90100000; +static u8 *const trampoline_buffer = (u8 *)0x80001800; static void dsp_reset(void) { @@ -107,7 +107,7 @@ int main(void) video_init(); usbgecko_init(); - printf("Twilight Hack %s\n", version); + printf("savezelda %s\n", version); printf("\n"); printf("Copyright 2008,2009 Segher Boessenkool\n"); printf("Copyright 2008 Haxx Enterprises\n"); diff --git a/twilight/.gitignore b/twilight/.gitignore new file mode 100644 index 0000000..31b1b14 --- /dev/null +++ b/twilight/.gitignore @@ -0,0 +1,10 @@ +rzd?-?.?.bin +rzd?.data + +rzd??.elf +rzd??.slot + +title.bin + +zero16k +FAILURE diff --git a/twilight/Makefile b/twilight/Makefile new file mode 100644 index 0000000..315fd28 --- /dev/null +++ b/twilight/Makefile @@ -0,0 +1,148 @@ +# Copyright 2008-2009 Segher Boessenkool +# This code is licensed to you under the terms of the GNU GPL, version 2; +# see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt + + +# Configuration: + +# What toolchain prefix should we use +CROSS ?= broadway- + +# Where are the tools (http://git.infradead.org/users/segher/wii.git) +TOOLS ?= $(HOME)/wii/segher + +# End of configuration. + + + +# Set CC, LD, OBJCOPY based on CROSS, unless they are set already + +ifeq ($(origin CC), default) + CC := $(CROSS)gcc -m32 +endif +ifeq ($(origin LD), default) + LD := $(CROSS)ld +endif +OBJCOPY ?= $(CROSS)objcopy + + +# The compiler flags we need. + +CFLAGS := -Wall -W -Os -ffreestanding -mno-eabi -mno-sdata -mcpu=750 + + +# Build with "V=1" to see the commands executed; be quiet otherwise. + +ifeq ($(V),1) + Q := +else + Q := @ + MAKEFLAGS += --no-print-directory +endif + + +targets := rzde-3.2.bin rzde-3.3.bin rzde-3.4.bin +targets += rzdj-3.2.bin rzdj-3.3.bin rzdj-3.4.bin +targets += rzdp-3.2.bin rzdp-3.3.bin rzdp-3.4.bin +targets-short := rzde rzdj rzdp + +objs := twilight.o + +ppms := $(targets-short:%=%-icon.ppm) generic-banner.ppm +assets := title.bin $(ppms) + +loader := ../loader/loader.bin + + +titleid = $(shell perl titleid.pl $(1)) + + +# System menu 3.3 checks for the exploit, when a) you copy a save from SD, +# and b) when the menu starts up; but for a) it only looks at the first +# zeldaTp.dat file, and for b) it allows any file of non-aligned length. +# +# System menu 3.4 only looks at the last file in the wad when installing. +# +# System menu 4.0 finally avoids such silly bugs. + +define twintig + D=$(call titleid,$(1)); \ + $(TOOLS)/twintig $$D $@ toc-$1 +endef + + +all: $(targets) + +$(filter %-3.2.bin,$(targets)): %-3.2.bin: %.data +$(filter %-3.3.bin,$(targets)): %-3.3.bin: %.data zero16k +$(filter %-3.4.bin,$(targets)): %-3.4.bin: %.data FAILURE +$(targets): %.bin: toc-% $(assets) + @echo " TWINTIG $@" + $(Q)$(call twintig,$*) + +saves := $(targets-short:%=%.data) + +rzde.data: rzde0.slot rzde2.slot +rzdp.data: rzdp0.slot +rzdj.data: rzdj0.slot +$(saves): $(loader) + @echo " ZELDAPACK $@" + $(Q)./pack.sh $@ $(filter %.slot,$^) + $(Q)$(TOOLS)/zelda-cksum $@ + $(Q)cat $(loader) >> $@ + $(Q)printf '\0' >> $@ + +slots := rzde0.slot rzde2.slot rzdj0.slot rzdp0.slot + +$(slots): %.slot: %.elf + @echo " OBJCOPY $@" + $(Q)$(OBJCOPY) -Obinary $< $@ + +elfs := $(slots:.slot=.elf) + +rzde0.elf: baddr := 0x8046a3e0+0 +rzde2.elf: baddr := 0x804519e0+0x0a94 +rzdj0.elf: baddr := 0x8044f860+0 +rzdp0.elf: baddr := 0x804522e0+0 +$(elfs): %.elf: twilight.lds %.o $(objs) + @echo " LINK $@" + $(Q)$(LD) --defsym baddr=$(baddr) -T $^ -o $@ + +exploit-objs := $(elfs:.elf=.o) + +$(exploit-objs): slot-name := Twilight Hack +rzde0.o: slot-name := TwilightHack0 +rzde2.o: slot-name := TwilightHack2 +$(exploit-objs): %.o: start.S head.b + @echo " ASSEMBLE $@" + $(Q)$(CC) $(CFLAGS) -D NAME="$(slot-name)" -c $< -o $@ + +%.o: %.c + @echo " COMPILE $@" + $(Q)$(CC) $(CFLAGS) -c $< -o $@ + +title.bin: ../.version + @echo " TITLEBIN $@" + $(Q)perl make-title-bin.pl > $@ + +../.version: FORCE + $(Q)$(MAKE) -C .. .version + +$(ppms): %.ppm: %.png + @echo " PPM $@" + $(Q)convert $< $@ + +zero16k: + $(Q)dd if=/dev/zero bs=16384 count=1 2>/dev/null > $@ + +FAILURE: + $(Q)echo FAILURE > $@ + +$(loader): FORCE + $(Q)$(MAKE) -C ../loader + +FORCE: + +clean: + -rm -f $(targets) $(saves) $(elfs) $(exploit-objs) $(objs) $(slots) + -rm -f title.bin zero16k FAILURE diff --git a/generic-banner.png b/twilight/generic-banner.png similarity index 100% rename from generic-banner.png rename to twilight/generic-banner.png diff --git a/generic-banner.ppm b/twilight/generic-banner.ppm similarity index 100% rename from generic-banner.ppm rename to twilight/generic-banner.ppm diff --git a/head.b b/twilight/head.b similarity index 100% rename from head.b rename to twilight/head.b diff --git a/make-title-bin.pl b/twilight/make-title-bin.pl similarity index 87% rename from make-title-bin.pl rename to twilight/make-title-bin.pl index 4b6ec87..d252092 100755 --- a/make-title-bin.pl +++ b/twilight/make-title-bin.pl @@ -10,7 +10,7 @@ sub printline { } $name = "Twilight Hack by Team Twiizers"; -$version = `cat .version`; +$version = `cat ../.version`; printline $name; printline $version; diff --git a/pack.sh b/twilight/pack.sh similarity index 100% rename from pack.sh rename to twilight/pack.sh diff --git a/rzde-icon.png b/twilight/rzde-icon.png similarity index 100% rename from rzde-icon.png rename to twilight/rzde-icon.png diff --git a/rzde-icon.ppm b/twilight/rzde-icon.ppm similarity index 100% rename from rzde-icon.ppm rename to twilight/rzde-icon.ppm diff --git a/rzdj-icon.png b/twilight/rzdj-icon.png similarity index 100% rename from rzdj-icon.png rename to twilight/rzdj-icon.png diff --git a/rzdj-icon.ppm b/twilight/rzdj-icon.ppm similarity index 100% rename from rzdj-icon.ppm rename to twilight/rzdj-icon.ppm diff --git a/rzdp-icon.png b/twilight/rzdp-icon.png similarity index 100% rename from rzdp-icon.png rename to twilight/rzdp-icon.png diff --git a/rzdp-icon.ppm b/twilight/rzdp-icon.ppm similarity index 100% rename from rzdp-icon.ppm rename to twilight/rzdp-icon.ppm diff --git a/start.S b/twilight/start.S similarity index 100% rename from start.S rename to twilight/start.S diff --git a/twilight/titleid.pl b/twilight/titleid.pl new file mode 100755 index 0000000..f735f1d --- /dev/null +++ b/twilight/titleid.pl @@ -0,0 +1,2 @@ +#!/usr/bin/perl +print "00010000", map { sprintf "%02x", ord uc } split //, $ARGV[0]; diff --git a/toc-rzde-3.2 b/twilight/toc-rzde-3.2 similarity index 100% rename from toc-rzde-3.2 rename to twilight/toc-rzde-3.2 diff --git a/toc-rzde-3.3 b/twilight/toc-rzde-3.3 similarity index 100% rename from toc-rzde-3.3 rename to twilight/toc-rzde-3.3 diff --git a/toc-rzde-3.4 b/twilight/toc-rzde-3.4 similarity index 100% rename from toc-rzde-3.4 rename to twilight/toc-rzde-3.4 diff --git a/toc-rzdj-3.2 b/twilight/toc-rzdj-3.2 similarity index 100% rename from toc-rzdj-3.2 rename to twilight/toc-rzdj-3.2 diff --git a/toc-rzdj-3.3 b/twilight/toc-rzdj-3.3 similarity index 100% rename from toc-rzdj-3.3 rename to twilight/toc-rzdj-3.3 diff --git a/toc-rzdj-3.4 b/twilight/toc-rzdj-3.4 similarity index 100% rename from toc-rzdj-3.4 rename to twilight/toc-rzdj-3.4 diff --git a/toc-rzdp-3.2 b/twilight/toc-rzdp-3.2 similarity index 100% rename from toc-rzdp-3.2 rename to twilight/toc-rzdp-3.2 diff --git a/toc-rzdp-3.3 b/twilight/toc-rzdp-3.3 similarity index 100% rename from toc-rzdp-3.3 rename to twilight/toc-rzdp-3.3 diff --git a/toc-rzdp-3.4 b/twilight/toc-rzdp-3.4 similarity index 100% rename from toc-rzdp-3.4 rename to twilight/toc-rzdp-3.4 diff --git a/twilight.c b/twilight/twilight.c similarity index 100% rename from twilight.c rename to twilight/twilight.c diff --git a/twilight.lds b/twilight/twilight.lds similarity index 100% rename from twilight.lds rename to twilight/twilight.lds