summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2018-06-02 20:16:37 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2018-06-02 20:16:37 -0400
commit956d010d59ad225bea768aec172ccb56977b1775 (patch)
tree4385f7c50ebb09e747f9e2cac4bc900d925060d4
parent513028a98e6225e39c53ea64e4f9c483b3abd55b (diff)
Make the repository build all four ROMs
-rw-r--r--.gitignore1
-rw-r--r--Makefile49
-rw-r--r--README.md8
-rw-r--r--compare.sh8
-rw-r--r--config.mk22
-rw-r--r--data/items/names.asm4
-rw-r--r--data/pokemon/base_stats.asm502
-rw-r--r--data/pokemon/base_stats/kirinriki.inc4
-rw-r--r--data/predef_pointers.inc175
-rw-r--r--data/super_palettes.inc4
-rw-r--r--data/tileset_headers.asm4
-rw-r--r--data/trainers/parties.asm201
-rw-r--r--engine/predef.asm4
-rw-r--r--engine/title.asm4
-rw-r--r--gfx.asm15
-rw-r--r--gfx/sgb/sgb_border_gold.png (renamed from gfx/sgb/sgb_border.png)bin589 -> 589 bytes
-rw-r--r--gfx/sgb/sgb_border_silver.pngbin0 -> 679 bytes
-rw-r--r--gfx/title/title_gold.png (renamed from gfx/title/title.png)bin1511 -> 1511 bytes
-rw-r--r--gfx/title/title_silver.pngbin0 -> 1551 bytes
-rw-r--r--home/audio.asm4
-rw-r--r--home/bankswitch.asm4
-rw-r--r--home/clear_sprites.asm4
-rw-r--r--home/copy.asm4
-rw-r--r--home/copy_tilemap.asm4
-rw-r--r--home/farcall.asm4
-rw-r--r--home/init.asm12
-rw-r--r--home/math.asm41
-rw-r--r--home/pokemon.asm12
-rw-r--r--home/predef.asm4
-rw-r--r--home/rst.asm20
-rw-r--r--home/sram.asm4
-rw-r--r--home/unknown.asm87
-rw-r--r--hram.asm8
-rw-r--r--roms.md55
-rw-r--r--shim.sym111
-rw-r--r--shim_gold.sym179
-rw-r--r--shim_gold_debug.sym179
-rw-r--r--shim_silver.sym179
-rw-r--r--shim_silver_debug.sym179
-rw-r--r--tools/Makefile3
-rw-r--r--tools/make_shim.c163
-rw-r--r--tools/make_shim.py102
-rw-r--r--wram.asm5
43 files changed, 1775 insertions, 547 deletions
diff --git a/.gitignore b/.gitignore
index 82820fa..9ebac92 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,4 @@ tools/scan_includes
tools/pkmncompress
tools/gfx
build/
+.idea/
diff --git a/Makefile b/Makefile
index 86e4925..f9fc269 100644
--- a/Makefile
+++ b/Makefile
@@ -1,20 +1,27 @@
-BUILD := build
+include config.mk
+
+BUILDBASE := build
+BUILD := $(BUILDBASE)/$(BUILD_NAME)
MD5 := md5sum -c
PYTHON := python
+PYTHON3 := python3.6
-RGBASM := rgbasm
+RGBASM := rgbasm -D$(GAME_VERSION)=1 -DDEBUG=$(DEBUG)
RGBGFX := rgbgfx
RGBLINK := rgblink
RGBFIX := rgbfix
RGBASMFLAGS := -h -E -i $(BUILD)/
tools/gfx :=
+tools/make_shim :=
-ROMS := pokegold-spaceworld.gb
-BASEROM := baserom.gb
+ROM := poke$(BUILD_NAME)_spaceworld.gb
+ROMS := pokegold_spaceworld.gb pokesilver_spaceworld.gb pokegold_debug_spaceworld.gb pokesilver_debug_spaceworld.gb
+BASEROM := baserom_$(BUILD_NAME).gb
DIRS := home engine data audio
OBJS := $(addprefix $(BUILD)/, gfx.o sram.o wram.o hram.o shim.o)
+SHIM := shim_$(BUILD_NAME).sym
rwildcard = $(foreach d, $(wildcard $1*), $(filter $(subst *, %, $2), $d) $(call rwildcard, $d/, $2))
OBJS += $(patsubst %.asm, $(BUILD)/%.o, $(call rwildcard, $(DIRS), *.asm))
@@ -28,11 +35,7 @@ GFX := $(patsubst %.png, $(BUILD)/%.2bpp, \
.SECONDEXPANSION:
.PHONY: all
-all: $(ROMS) compare
-
-.PHONY: compare
-compare: $(ROMS)
- $(MD5) roms.md5
+all: $(ROM)
.PHONY: tools
tools tools/pkmncompress tools/gfx:
@@ -41,7 +44,7 @@ tools tools/pkmncompress tools/gfx:
# Remove files generated by the build process.
.PHONY: clean
clean:
- rm -rf $(ROMS) $(BUILD) $(ROMS:.gb=.sym) $(ROMS:.gb=.map)
+ rm -rf $(ROMS) $(BUILDBASE) $(ROMS:.gb=.sym) $(ROMS:.gb=.map)
make -C tools clean
# Remove files except for graphics.
@@ -49,12 +52,13 @@ clean:
mostlyclean:
rm -rf $(ROMS) $(OBJS) $(ROMS:.gb=.sym) $(ROMS:.gb=.map)
-$(ROMS): $(OBJS)
+$(ROM): $(OBJS)
$(RGBLINK) -d -n $(@:.gb=.sym) -m $(@:.gb=.map) -O $(BASEROM) -o $@ $^
- $(RGBFIX) -f lh -k 01 -l 0x33 -m 0x03 -p 0 -r 3 -t "POKEMON2GOLD" $@
+ $(RGBFIX) -f lh -k 01 -l 0x33 -m 0x03 -p 0 -r 3 -t "POKEMON2$(GAME_VERSION)" $@
+ -$(PYTHON3) sort_sym.py $(@:.gb=.sym)
-$(BUILD)/shim.asm: tools/make_shim.py shim.sym | $$(dir $$@)
- $(PYTHON) tools/make_shim.py -w -- $(filter-out $<, $^) > $@
+$(BUILD)/shim.asm: $(SHIM) | $$(dir $$@)
+ tools/make_shim -w $< > $@
$(BUILD)/gfx.o: | $(GFX)
$(BUILD)/%.o: $(BUILD)/%.asm | $$(dir $$@)
@@ -63,8 +67,10 @@ $(BUILD)/%.o: %.asm | $$(dir $$@)
$(RGBASM) $(RGBASMFLAGS) -M $(@:.o=.d) $(OUTPUT_OPTION) $<
$(BUILD)/gfx/sgb/sgb_border_alt.2bpp: tools/gfx += --trim-whitespace
-$(BUILD)/gfx/sgb/sgb_border.2bpp: tools/gfx += --trim-whitespace
-$(BUILD)/gfx/title/title.2bpp: tools/gfx += --trim-whitespace
+$(BUILD)/gfx/sgb/sgb_border_gold.2bpp: tools/gfx += --trim-whitespace
+$(BUILD)/gfx/sgb/sgb_border_silver.2bpp: tools/gfx += --trim-whitespace
+$(BUILD)/gfx/title/title_gold.2bpp: tools/gfx += --trim-whitespace
+$(BUILD)/gfx/title/title_silver.2bpp: tools/gfx += --trim-whitespace
$(BUILD)/gfx/trainer_card/leaders.2bpp: tools/gfx += --trim-whitespace
$(BUILD)/gfx/minigames/slots.2bpp: tools/gfx += --trim-whitespace
$(BUILD)/gfx/minigames/poker.2bpp: tools/gfx += --trim-whitespace
@@ -93,3 +99,14 @@ $(BUILD)/%.tilemap: %.png | $$(dir $$@)
mkdir -p $@
-include $(call rwildcard, $(BUILD)/, *.d)
+
+gold: ; @$(MAKE) GAME_VERSION=GOLD
+gold_debug: ; @$(MAKE) GAME_VERSION=GOLD DEBUG=1
+silver: ; @$(MAKE) GAME_VERSION=SILVER
+silver_debug: ; @$(MAKE) GAME_VERSION=SILVER DEBUG=1
+compare: ;
+ @$(MAKE) GAME_VERSION=GOLD COMPARE=1
+ @$(MAKE) GAME_VERSION=GOLD DEBUG=1 COMPARE=1
+ @$(MAKE) GAME_VERSION=SILVER COMPARE=1
+ @$(MAKE) GAME_VERSION=SILVER DEBUG=1 COMPARE=1
+ @$(MD5) roms.md5
diff --git a/README.md b/README.md
index 74a70b9..63aaedb 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,10 @@
WIP disassembly of the Spaceworld 1997 Gold proto
-baserom.gb is Gold_debug.sgb
+It attempts to build the following ROMs:
-md5sum `2eadbed83b775c097ff79e5128d1184f`
+pokegold_spaceworld.gb (MD5: 3c407114de28d17b7113a2c0cee9a37c)
+pokegold_debug_spaceworld.gb (MD5: 2eadbed83b775c097ff79e5128d1184f)
+pokesilver_spaceworld.gb (MD5: c52a677c35f15320d5b495e14809f00d)
+pokesilver_debug_spaceworld.gb (MD5: fa65d3759bb17c489de171a598ba4913)
+At this current stage, only pokegold_debug_spaceworld.gb builds a functioning ROM.
diff --git a/compare.sh b/compare.sh
new file mode 100644
index 0000000..928dea8
--- /dev/null
+++ b/compare.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+if [ -z ${1+x} ]
+then BUILD_NAME=gold_debug
+else BUILD_NAME=$1
+fi
+
+diff <(hexdump -C baserom_${BUILD_NAME}.gb) <(hexdump -C poke${BUILD_NAME}_spaceworld.gb) | less
diff --git a/config.mk b/config.mk
new file mode 100644
index 0000000..07859a9
--- /dev/null
+++ b/config.mk
@@ -0,0 +1,22 @@
+### Build Configuration ###
+
+# Default variables
+GAME_VERSION ?= GOLD
+DEBUG ?= 0
+COMPARE ?= 0
+
+# Version
+ifeq ($(GAME_VERSION), GOLD)
+ BUILD_NAME := gold
+else
+ifeq ($(GAME_VERSION), SILVER)
+ BUILD_NAME := silver
+else
+ $(error unknown version $(GAME_VERSION))
+endif
+endif
+
+# Debug
+ifeq ($(DEBUG), 1)
+ BUILD_NAME := $(BUILD_NAME)_debug
+endif
diff --git a/data/items/names.asm b/data/items/names.asm
index 4b45a63..a37acce 100644
--- a/data/items/names.asm
+++ b/data/items/names.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "ItemNames", ROMX[$6FEC], BANK[$01]
+else
+SECTION "ItemNames", ROMX[$6FE9], BANK[$01]
+endc
ItemNames::
db "マスターボール@" ; MASTER_BALL
diff --git a/data/pokemon/base_stats.asm b/data/pokemon/base_stats.asm
index 59715d5..7b3a07e 100644
--- a/data/pokemon/base_stats.asm
+++ b/data/pokemon/base_stats.asm
@@ -37,255 +37,255 @@ ENDM
BaseData::
MonBaseStats::
-INCLUDE "data/pokemon/base_stats/fushigidane.inc"
+BaseStats_Fushigidane:: INCLUDE "data/pokemon/base_stats/fushigidane.inc"
MonBaseStatsEnd::
-INCLUDE "data/pokemon/base_stats/fushigisou.inc"
-INCLUDE "data/pokemon/base_stats/fushigibana.inc"
-INCLUDE "data/pokemon/base_stats/hitokage.inc"
-INCLUDE "data/pokemon/base_stats/lizardo.inc"
-INCLUDE "data/pokemon/base_stats/lizardon.inc"
-INCLUDE "data/pokemon/base_stats/zenigame.inc"
-INCLUDE "data/pokemon/base_stats/kameil.inc"
-INCLUDE "data/pokemon/base_stats/kamex.inc"
-INCLUDE "data/pokemon/base_stats/caterpie.inc"
-INCLUDE "data/pokemon/base_stats/transel.inc"
-INCLUDE "data/pokemon/base_stats/butterfree.inc"
-INCLUDE "data/pokemon/base_stats/beedle.inc"
-INCLUDE "data/pokemon/base_stats/cocoon.inc"
-INCLUDE "data/pokemon/base_stats/spear.inc"
-INCLUDE "data/pokemon/base_stats/poppo.inc"
-INCLUDE "data/pokemon/base_stats/pigeon.inc"
-INCLUDE "data/pokemon/base_stats/pigeot.inc"
-INCLUDE "data/pokemon/base_stats/koratta.inc"
-INCLUDE "data/pokemon/base_stats/ratta.inc"
-INCLUDE "data/pokemon/base_stats/onisuzume.inc"
-INCLUDE "data/pokemon/base_stats/onidrill.inc"
-INCLUDE "data/pokemon/base_stats/arbo.inc"
-INCLUDE "data/pokemon/base_stats/arbok.inc"
-INCLUDE "data/pokemon/base_stats/pikachu.inc"
-INCLUDE "data/pokemon/base_stats/raichu.inc"
-INCLUDE "data/pokemon/base_stats/sand.inc"
-INCLUDE "data/pokemon/base_stats/sandpan.inc"
-INCLUDE "data/pokemon/base_stats/nidoran_f.inc"
-INCLUDE "data/pokemon/base_stats/nidorina.inc"
-INCLUDE "data/pokemon/base_stats/nidoqueen.inc"
-INCLUDE "data/pokemon/base_stats/nidoran_m.inc"
-INCLUDE "data/pokemon/base_stats/nidorino.inc"
-INCLUDE "data/pokemon/base_stats/nidoking.inc"
-INCLUDE "data/pokemon/base_stats/pippi.inc"
-INCLUDE "data/pokemon/base_stats/pixy.inc"
-INCLUDE "data/pokemon/base_stats/rokon.inc"
-INCLUDE "data/pokemon/base_stats/kyukon.inc"
-INCLUDE "data/pokemon/base_stats/purin.inc"
-INCLUDE "data/pokemon/base_stats/pukurin.inc"
-INCLUDE "data/pokemon/base_stats/zubat.inc"
-INCLUDE "data/pokemon/base_stats/golbat.inc"
-INCLUDE "data/pokemon/base_stats/nazonokusa.inc"
-INCLUDE "data/pokemon/base_stats/kusaihana.inc"
-INCLUDE "data/pokemon/base_stats/ruffresia.inc"
-INCLUDE "data/pokemon/base_stats/paras.inc"
-INCLUDE "data/pokemon/base_stats/parasect.inc"
-INCLUDE "data/pokemon/base_stats/kongpang.inc"
-INCLUDE "data/pokemon/base_stats/morphon.inc"
-INCLUDE "data/pokemon/base_stats/digda.inc"
-INCLUDE "data/pokemon/base_stats/dugtrio.inc"
-INCLUDE "data/pokemon/base_stats/nyarth.inc"
-INCLUDE "data/pokemon/base_stats/persian.inc"
-INCLUDE "data/pokemon/base_stats/koduck.inc"
-INCLUDE "data/pokemon/base_stats/golduck.inc"
-INCLUDE "data/pokemon/base_stats/mankey.inc"
-INCLUDE "data/pokemon/base_stats/okorizaru.inc"
-INCLUDE "data/pokemon/base_stats/gardie.inc"
-INCLUDE "data/pokemon/base_stats/windie.inc"
-INCLUDE "data/pokemon/base_stats/nyoromo.inc"
-INCLUDE "data/pokemon/base_stats/nyorozo.inc"
-INCLUDE "data/pokemon/base_stats/nyorobon.inc"
-INCLUDE "data/pokemon/base_stats/casey.inc"
-INCLUDE "data/pokemon/base_stats/yungerer.inc"
-INCLUDE "data/pokemon/base_stats/foodin.inc"
-INCLUDE "data/pokemon/base_stats/wanriky.inc"
-INCLUDE "data/pokemon/base_stats/goriky.inc"
-INCLUDE "data/pokemon/base_stats/kairiky.inc"
-INCLUDE "data/pokemon/base_stats/madatsubomi.inc"
-INCLUDE "data/pokemon/base_stats/utsudon.inc"
-INCLUDE "data/pokemon/base_stats/utsubot.inc"
-INCLUDE "data/pokemon/base_stats/menokurage.inc"
-INCLUDE "data/pokemon/base_stats/dokukurage.inc"
-INCLUDE "data/pokemon/base_stats/isitsubute.inc"
-INCLUDE "data/pokemon/base_stats/golone.inc"
-INCLUDE "data/pokemon/base_stats/golonya.inc"
-INCLUDE "data/pokemon/base_stats/ponyta.inc"
-INCLUDE "data/pokemon/base_stats/gallop.inc"
-INCLUDE "data/pokemon/base_stats/yadon.inc"
-INCLUDE "data/pokemon/base_stats/yadoran.inc"
-INCLUDE "data/pokemon/base_stats/coil.inc"
-INCLUDE "data/pokemon/base_stats/rarecoil.inc"
-INCLUDE "data/pokemon/base_stats/kamonegi.inc"
-INCLUDE "data/pokemon/base_stats/dodo.inc"
-INCLUDE "data/pokemon/base_stats/dodorio.inc"
-INCLUDE "data/pokemon/base_stats/pawou.inc"
-INCLUDE "data/pokemon/base_stats/jugon.inc"
-INCLUDE "data/pokemon/base_stats/betbeter.inc"
-INCLUDE "data/pokemon/base_stats/betbeton.inc"
-INCLUDE "data/pokemon/base_stats/shellder.inc"
-INCLUDE "data/pokemon/base_stats/parshen.inc"
-INCLUDE "data/pokemon/base_stats/ghos.inc"
-INCLUDE "data/pokemon/base_stats/ghost.inc"
-INCLUDE "data/pokemon/base_stats/gangar.inc"
-INCLUDE "data/pokemon/base_stats/iwark.inc"
-INCLUDE "data/pokemon/base_stats/sleepe.inc"
-INCLUDE "data/pokemon/base_stats/sleeper.inc"
-INCLUDE "data/pokemon/base_stats/crab.inc"
-INCLUDE "data/pokemon/base_stats/kingler.inc"
-INCLUDE "data/pokemon/base_stats/biriridama.inc"
-INCLUDE "data/pokemon/base_stats/marumine.inc"
-INCLUDE "data/pokemon/base_stats/tamatama.inc"
-INCLUDE "data/pokemon/base_stats/nassy.inc"
-INCLUDE "data/pokemon/base_stats/karakara.inc"
-INCLUDE "data/pokemon/base_stats/garagara.inc"
-INCLUDE "data/pokemon/base_stats/sawamular.inc"
-INCLUDE "data/pokemon/base_stats/ebiwalar.inc"
-INCLUDE "data/pokemon/base_stats/beroringa.inc"
-INCLUDE "data/pokemon/base_stats/dogars.inc"
-INCLUDE "data/pokemon/base_stats/matadogas.inc"
-INCLUDE "data/pokemon/base_stats/sihorn.inc"
-INCLUDE "data/pokemon/base_stats/sidon.inc"
-INCLUDE "data/pokemon/base_stats/lucky.inc"
-INCLUDE "data/pokemon/base_stats/monjara.inc"
-INCLUDE "data/pokemon/base_stats/garura.inc"
-INCLUDE "data/pokemon/base_stats/tattu.inc"
-INCLUDE "data/pokemon/base_stats/seadra.inc"
-INCLUDE "data/pokemon/base_stats/tosakinto.inc"
-INCLUDE "data/pokemon/base_stats/azumao.inc"
-INCLUDE "data/pokemon/base_stats/hitodeman.inc"
-INCLUDE "data/pokemon/base_stats/starmie.inc"
-INCLUDE "data/pokemon/base_stats/barrierd.inc"
-INCLUDE "data/pokemon/base_stats/strike.inc"
-INCLUDE "data/pokemon/base_stats/rougela.inc"
-INCLUDE "data/pokemon/base_stats/eleboo.inc"
-INCLUDE "data/pokemon/base_stats/boober.inc"
-INCLUDE "data/pokemon/base_stats/kailios.inc"
-INCLUDE "data/pokemon/base_stats/kentauros.inc"
-INCLUDE "data/pokemon/base_stats/koiking.inc"
-INCLUDE "data/pokemon/base_stats/gyarados.inc"
-INCLUDE "data/pokemon/base_stats/laplace.inc"
-INCLUDE "data/pokemon/base_stats/metamon.inc"
-INCLUDE "data/pokemon/base_stats/eievui.inc"
-INCLUDE "data/pokemon/base_stats/showers.inc"
-INCLUDE "data/pokemon/base_stats/thunders.inc"
-INCLUDE "data/pokemon/base_stats/booster.inc"
-INCLUDE "data/pokemon/base_stats/porygon.inc"
-INCLUDE "data/pokemon/base_stats/omnite.inc"
-INCLUDE "data/pokemon/base_stats/omstar.inc"
-INCLUDE "data/pokemon/base_stats/kabuto.inc"
-INCLUDE "data/pokemon/base_stats/kabutops.inc"
-INCLUDE "data/pokemon/base_stats/ptera.inc"
-INCLUDE "data/pokemon/base_stats/kabigon.inc"
-INCLUDE "data/pokemon/base_stats/freezer.inc"
-INCLUDE "data/pokemon/base_stats/thunder.inc"
-INCLUDE "data/pokemon/base_stats/fire.inc"
-INCLUDE "data/pokemon/base_stats/miniryu.inc"
-INCLUDE "data/pokemon/base_stats/hakuryu.inc"
-INCLUDE "data/pokemon/base_stats/kairyu.inc"
-INCLUDE "data/pokemon/base_stats/mewtwo.inc"
-INCLUDE "data/pokemon/base_stats/mew.inc"
-INCLUDE "data/pokemon/base_stats/happa.inc"
-INCLUDE "data/pokemon/base_stats/hanamogura.inc"
-INCLUDE "data/pokemon/base_stats/hanaryu.inc"
-INCLUDE "data/pokemon/base_stats/honoguma.inc"
-INCLUDE "data/pokemon/base_stats/volbear.inc"
-INCLUDE "data/pokemon/base_stats/dynabear.inc"
-INCLUDE "data/pokemon/base_stats/kurusu.inc"
-INCLUDE "data/pokemon/base_stats/aqua.inc"
-INCLUDE "data/pokemon/base_stats/aquaria.inc"
-INCLUDE "data/pokemon/base_stats/hoho.inc"
-INCLUDE "data/pokemon/base_stats/bobo.inc"
-INCLUDE "data/pokemon/base_stats/pachimee.inc"
-INCLUDE "data/pokemon/base_stats/mokoko.inc"
-INCLUDE "data/pokemon/base_stats/denryu.inc"
-INCLUDE "data/pokemon/base_stats/mikon.inc"
-INCLUDE "data/pokemon/base_stats/monja.inc"
-INCLUDE "data/pokemon/base_stats/jaranra.inc"
-INCLUDE "data/pokemon/base_stats/haneei.inc"
-INCLUDE "data/pokemon/base_stats/puku.inc"
-INCLUDE "data/pokemon/base_stats/shibirefugu.inc"
-INCLUDE "data/pokemon/base_stats/pichu.inc"
-INCLUDE "data/pokemon/base_stats/py.inc"
-INCLUDE "data/pokemon/base_stats/pupurin.inc"
-INCLUDE "data/pokemon/base_stats/mizuuo.inc"
-INCLUDE "data/pokemon/base_stats/naty.inc"
-INCLUDE "data/pokemon/base_stats/natio.inc"
-INCLUDE "data/pokemon/base_stats/gyopin.inc"
-INCLUDE "data/pokemon/base_stats/maril.inc"
-INCLUDE "data/pokemon/base_stats/manbo1.inc"
-INCLUDE "data/pokemon/base_stats/ikari.inc"
-INCLUDE "data/pokemon/base_stats/grotess.inc"
-INCLUDE "data/pokemon/base_stats/eksing.inc"
-INCLUDE "data/pokemon/base_stats/para.inc"
-INCLUDE "data/pokemon/base_stats/kokumo.inc"
-INCLUDE "data/pokemon/base_stats/twohead.inc"
-INCLUDE "data/pokemon/base_stats/yoroidori.inc"
-INCLUDE "data/pokemon/base_stats/animon.inc"
-INCLUDE "data/pokemon/base_stats/hinazu.inc"
-INCLUDE "data/pokemon/base_stats/sunny.inc"
-INCLUDE "data/pokemon/base_stats/paon.inc"
-INCLUDE "data/pokemon/base_stats/donphan.inc"
-INCLUDE "data/pokemon/base_stats/twinz.inc"
-INCLUDE "data/pokemon/base_stats/kirinriki.inc"
-INCLUDE "data/pokemon/base_stats/painter.inc"
-INCLUDE "data/pokemon/base_stats/kounya.inc"
-INCLUDE "data/pokemon/base_stats/rinrin.inc"
-INCLUDE "data/pokemon/base_stats/berurun.inc"
-INCLUDE "data/pokemon/base_stats/nyorotono.inc"
-INCLUDE "data/pokemon/base_stats/yadoking.inc"
-INCLUDE "data/pokemon/base_stats/annon.inc"
-INCLUDE "data/pokemon/base_stats/rediba.inc"
-INCLUDE "data/pokemon/base_stats/mitsuboshi.inc"
-INCLUDE "data/pokemon/base_stats/puchicorn.inc"
-INCLUDE "data/pokemon/base_stats/eifie.inc"
-INCLUDE "data/pokemon/base_stats/blacky.inc"
-INCLUDE "data/pokemon/base_stats/turban.inc"
-INCLUDE "data/pokemon/base_stats/betbaby.inc"
-INCLUDE "data/pokemon/base_stats/teppouo.inc"
-INCLUDE "data/pokemon/base_stats/okutank.inc"
-INCLUDE "data/pokemon/base_stats/gongu.inc"
-INCLUDE "data/pokemon/base_stats/kapoerer.inc"
-INCLUDE "data/pokemon/base_stats/pudie.inc"
-INCLUDE "data/pokemon/base_stats/haneko.inc"
-INCLUDE "data/pokemon/base_stats/poponeko.inc"
-INCLUDE "data/pokemon/base_stats/wataneko.inc"
-INCLUDE "data/pokemon/base_stats/baririna.inc"
-INCLUDE "data/pokemon/base_stats/lip.inc"
-INCLUDE "data/pokemon/base_stats/elebaby.inc"
-INCLUDE "data/pokemon/base_stats/booby.inc"
-INCLUDE "data/pokemon/base_stats/kireihana.inc"
-INCLUDE "data/pokemon/base_stats/tsubomitto.inc"
-INCLUDE "data/pokemon/base_stats/miltank.inc"
-INCLUDE "data/pokemon/base_stats/bombseeker.inc"
-INCLUDE "data/pokemon/base_stats/gift.inc"
-INCLUDE "data/pokemon/base_stats/kotora.inc"
-INCLUDE "data/pokemon/base_stats/raitora.inc"
-INCLUDE "data/pokemon/base_stats/madame.inc"
-INCLUDE "data/pokemon/base_stats/norowara.inc"
-INCLUDE "data/pokemon/base_stats/kyonpan.inc"
-INCLUDE "data/pokemon/base_stats/yamikarasu.inc"
-INCLUDE "data/pokemon/base_stats/happi.inc"
-INCLUDE "data/pokemon/base_stats/scissors.inc"
-INCLUDE "data/pokemon/base_stats/purakkusu.inc"
-INCLUDE "data/pokemon/base_stats/devil.inc"
-INCLUDE "data/pokemon/base_stats/helgaa.inc"
-INCLUDE "data/pokemon/base_stats/wolfman.inc"
-INCLUDE "data/pokemon/base_stats/warwolf.inc"
-INCLUDE "data/pokemon/base_stats/porygon2.inc"
-INCLUDE "data/pokemon/base_stats/nameil.inc"
-INCLUDE "data/pokemon/base_stats/haganeil.inc"
-INCLUDE "data/pokemon/base_stats/kingdra.inc"
-INCLUDE "data/pokemon/base_stats/rai.inc"
-INCLUDE "data/pokemon/base_stats/en.inc"
-INCLUDE "data/pokemon/base_stats/sui.inc"
-INCLUDE "data/pokemon/base_stats/nyula.inc"
-INCLUDE "data/pokemon/base_stats/houou.inc"
-INCLUDE "data/pokemon/base_stats/togepy.inc"
-INCLUDE "data/pokemon/base_stats/bulu.inc"
-INCLUDE "data/pokemon/base_stats/tail.inc"
-INCLUDE "data/pokemon/base_stats/leafy.inc"
+BaseStats_Fushigisou:: INCLUDE "data/pokemon/base_stats/fushigisou.inc"
+BaseStats_Fushigibana:: INCLUDE "data/pokemon/base_stats/fushigibana.inc"
+BaseStats_Hitokage:: INCLUDE "data/pokemon/base_stats/hitokage.inc"
+BaseStats_Lizardo:: INCLUDE "data/pokemon/base_stats/lizardo.inc"
+BaseStats_Lizardon:: INCLUDE "data/pokemon/base_stats/lizardon.inc"
+BaseStats_Zenigame:: INCLUDE "data/pokemon/base_stats/zenigame.inc"
+BaseStats_Kameil:: INCLUDE "data/pokemon/base_stats/kameil.inc"
+BaseStats_Kamex:: INCLUDE "data/pokemon/base_stats/kamex.inc"
+BaseStats_Caterpie:: INCLUDE "data/pokemon/base_stats/caterpie.inc"
+BaseStats_Transel:: INCLUDE "data/pokemon/base_stats/transel.inc"
+BaseStats_Butterfree:: INCLUDE "data/pokemon/base_stats/butterfree.inc"
+BaseStats_Beedle:: INCLUDE "data/pokemon/base_stats/beedle.inc"
+BaseStats_Cocoon:: INCLUDE "data/pokemon/base_stats/cocoon.inc"
+BaseStats_Spear:: INCLUDE "data/pokemon/base_stats/spear.inc"
+BaseStats_Poppo:: INCLUDE "data/pokemon/base_stats/poppo.inc"
+BaseStats_Pigeon:: INCLUDE "data/pokemon/base_stats/pigeon.inc"
+BaseStats_Pigeot:: INCLUDE "data/pokemon/base_stats/pigeot.inc"
+BaseStats_Koratta:: INCLUDE "data/pokemon/base_stats/koratta.inc"
+BaseStats_Ratta:: INCLUDE "data/pokemon/base_stats/ratta.inc"
+BaseStats_Onisuzume:: INCLUDE "data/pokemon/base_stats/onisuzume.inc"
+BaseStats_Onidrill:: INCLUDE "data/pokemon/base_stats/onidrill.inc"
+BaseStats_Arbo:: INCLUDE "data/pokemon/base_stats/arbo.inc"
+BaseStats_Arbok:: INCLUDE "data/pokemon/base_stats/arbok.inc"
+BaseStats_Pikachu:: INCLUDE "data/pokemon/base_stats/pikachu.inc"
+BaseStats_Raichu:: INCLUDE "data/pokemon/base_stats/raichu.inc"
+BaseStats_Sand:: INCLUDE "data/pokemon/base_stats/sand.inc"
+BaseStats_Sandpan:: INCLUDE "data/pokemon/base_stats/sandpan.inc"
+BaseStats_Nidoran_f:: INCLUDE "data/pokemon/base_stats/nidoran_f.inc"
+BaseStats_Nidorina:: INCLUDE "data/pokemon/base_stats/nidorina.inc"
+BaseStats_Nidoqueen:: INCLUDE "data/pokemon/base_stats/nidoqueen.inc"
+BaseStats_Nidoran_m:: INCLUDE "data/pokemon/base_stats/nidoran_m.inc"
+BaseStats_Nidorino:: INCLUDE "data/pokemon/base_stats/nidorino.inc"
+BaseStats_Nidoking:: INCLUDE "data/pokemon/base_stats/nidoking.inc"
+BaseStats_Pippi:: INCLUDE "data/pokemon/base_stats/pippi.inc"
+BaseStats_Pixy:: INCLUDE "data/pokemon/base_stats/pixy.inc"
+BaseStats_Rokon:: INCLUDE "data/pokemon/base_stats/rokon.inc"
+BaseStats_Kyukon:: INCLUDE "data/pokemon/base_stats/kyukon.inc"
+BaseStats_Purin:: INCLUDE "data/pokemon/base_stats/purin.inc"
+BaseStats_Pukurin:: INCLUDE "data/pokemon/base_stats/pukurin.inc"
+BaseStats_Zubat:: INCLUDE "data/pokemon/base_stats/zubat.inc"
+BaseStats_Golbat:: INCLUDE "data/pokemon/base_stats/golbat.inc"
+BaseStats_Nazonokusa:: INCLUDE "data/pokemon/base_stats/nazonokusa.inc"
+BaseStats_Kusaihana:: INCLUDE "data/pokemon/base_stats/kusaihana.inc"
+BaseStats_Ruffresia:: INCLUDE "data/pokemon/base_stats/ruffresia.inc"
+BaseStats_Paras:: INCLUDE "data/pokemon/base_stats/paras.inc"
+BaseStats_Parasect:: INCLUDE "data/pokemon/base_stats/parasect.inc"
+BaseStats_Kongpang:: INCLUDE "data/pokemon/base_stats/kongpang.inc"
+BaseStats_Morphon:: INCLUDE "data/pokemon/base_stats/morphon.inc"
+BaseStats_Digda:: INCLUDE "data/pokemon/base_stats/digda.inc"
+BaseStats_Dugtrio:: INCLUDE "data/pokemon/base_stats/dugtrio.inc"
+BaseStats_Nyarth:: INCLUDE "data/pokemon/base_stats/nyarth.inc"
+BaseStats_Persian:: INCLUDE "data/pokemon/base_stats/persian.inc"
+BaseStats_Koduck:: INCLUDE "data/pokemon/base_stats/koduck.inc"
+BaseStats_Golduck:: INCLUDE "data/pokemon/base_stats/golduck.inc"
+BaseStats_Mankey:: INCLUDE "data/pokemon/base_stats/mankey.inc"
+BaseStats_Okorizaru:: INCLUDE "data/pokemon/base_stats/okorizaru.inc"
+BaseStats_Gardie:: INCLUDE "data/pokemon/base_stats/gardie.inc"
+BaseStats_Windie:: INCLUDE "data/pokemon/base_stats/windie.inc"
+BaseStats_Nyoromo:: INCLUDE "data/pokemon/base_stats/nyoromo.inc"
+BaseStats_Nyorozo:: INCLUDE "data/pokemon/base_stats/nyorozo.inc"
+BaseStats_Nyorobon:: INCLUDE "data/pokemon/base_stats/nyorobon.inc"
+BaseStats_Casey:: INCLUDE "data/pokemon/base_stats/casey.inc"
+BaseStats_Yungerer:: INCLUDE "data/pokemon/base_stats/yungerer.inc"
+BaseStats_Foodin:: INCLUDE "data/pokemon/base_stats/foodin.inc"
+BaseStats_Wanriky:: INCLUDE "data/pokemon/base_stats/wanriky.inc"
+BaseStats_Goriky:: INCLUDE "data/pokemon/base_stats/goriky.inc"
+BaseStats_Kairiky:: INCLUDE "data/pokemon/base_stats/kairiky.inc"
+BaseStats_Madatsubomi:: INCLUDE "data/pokemon/base_stats/madatsubomi.inc"
+BaseStats_Utsudon:: INCLUDE "data/pokemon/base_stats/utsudon.inc"
+BaseStats_Utsubot:: INCLUDE "data/pokemon/base_stats/utsubot.inc"
+BaseStats_Menokurage:: INCLUDE "data/pokemon/base_stats/menokurage.inc"
+BaseStats_Dokukurage:: INCLUDE "data/pokemon/base_stats/dokukurage.inc"
+BaseStats_Isitsubute:: INCLUDE "data/pokemon/base_stats/isitsubute.inc"
+BaseStats_Golone:: INCLUDE "data/pokemon/base_stats/golone.inc"
+BaseStats_Golonya:: INCLUDE "data/pokemon/base_stats/golonya.inc"
+BaseStats_Ponyta:: INCLUDE "data/pokemon/base_stats/ponyta.inc"
+BaseStats_Gallop:: INCLUDE "data/pokemon/base_stats/gallop.inc"
+BaseStats_Yadon:: INCLUDE "data/pokemon/base_stats/yadon.inc"
+BaseStats_Yadoran:: INCLUDE "data/pokemon/base_stats/yadoran.inc"
+BaseStats_Coil:: INCLUDE "data/pokemon/base_stats/coil.inc"
+BaseStats_Rarecoil:: INCLUDE "data/pokemon/base_stats/rarecoil.inc"
+BaseStats_Kamonegi:: INCLUDE "data/pokemon/base_stats/kamonegi.inc"
+BaseStats_Dodo:: INCLUDE "data/pokemon/base_stats/dodo.inc"
+BaseStats_Dodorio:: INCLUDE "data/pokemon/base_stats/dodorio.inc"
+BaseStats_Pawou:: INCLUDE "data/pokemon/base_stats/pawou.inc"
+BaseStats_Jugon:: INCLUDE "data/pokemon/base_stats/jugon.inc"
+BaseStats_Betbeter:: INCLUDE "data/pokemon/base_stats/betbeter.inc"
+BaseStats_Betbeton:: INCLUDE "data/pokemon/base_stats/betbeton.inc"
+BaseStats_Shellder:: INCLUDE "data/pokemon/base_stats/shellder.inc"
+BaseStats_Parshen:: INCLUDE "data/pokemon/base_stats/parshen.inc"
+BaseStats_Ghos:: INCLUDE "data/pokemon/base_stats/ghos.inc"
+BaseStats_Ghost:: INCLUDE "data/pokemon/base_stats/ghost.inc"
+BaseStats_Gangar:: INCLUDE "data/pokemon/base_stats/gangar.inc"
+BaseStats_Iwark:: INCLUDE "data/pokemon/base_stats/iwark.inc"
+BaseStats_Sleepe:: INCLUDE "data/pokemon/base_stats/sleepe.inc"
+BaseStats_Sleeper:: INCLUDE "data/pokemon/base_stats/sleeper.inc"
+BaseStats_Crab:: INCLUDE "data/pokemon/base_stats/crab.inc"
+BaseStats_Kingler:: INCLUDE "data/pokemon/base_stats/kingler.inc"
+BaseStats_Biriridama:: INCLUDE "data/pokemon/base_stats/biriridama.inc"
+BaseStats_Marumine:: INCLUDE "data/pokemon/base_stats/marumine.inc"
+BaseStats_Tamatama:: INCLUDE "data/pokemon/base_stats/tamatama.inc"
+BaseStats_Nassy:: INCLUDE "data/pokemon/base_stats/nassy.inc"
+BaseStats_Karakara:: INCLUDE "data/pokemon/base_stats/karakara.inc"
+BaseStats_Garagara:: INCLUDE "data/pokemon/base_stats/garagara.inc"
+BaseStats_Sawamular:: INCLUDE "data/pokemon/base_stats/sawamular.inc"
+BaseStats_Ebiwalar:: INCLUDE "data/pokemon/base_stats/ebiwalar.inc"
+BaseStats_Beroringa:: INCLUDE "data/pokemon/base_stats/beroringa.inc"
+BaseStats_Dogars:: INCLUDE "data/pokemon/base_stats/dogars.inc"
+BaseStats_Matadogas:: INCLUDE "data/pokemon/base_stats/matadogas.inc"
+BaseStats_Sihorn:: INCLUDE "data/pokemon/base_stats/sihorn.inc"
+BaseStats_Sidon:: INCLUDE "data/pokemon/base_stats/sidon.inc"
+BaseStats_Lucky:: INCLUDE "data/pokemon/base_stats/lucky.inc"
+BaseStats_Monjara:: INCLUDE "data/pokemon/base_stats/monjara.inc"
+BaseStats_Garura:: INCLUDE "data/pokemon/base_stats/garura.inc"
+BaseStats_Tattu:: INCLUDE "data/pokemon/base_stats/tattu.inc"
+BaseStats_Seadra:: INCLUDE "data/pokemon/base_stats/seadra.inc"
+BaseStats_Tosakinto:: INCLUDE "data/pokemon/base_stats/tosakinto.inc"
+BaseStats_Azumao:: INCLUDE "data/pokemon/base_stats/azumao.inc"
+BaseStats_Hitodeman:: INCLUDE "data/pokemon/base_stats/hitodeman.inc"
+BaseStats_Starmie:: INCLUDE "data/pokemon/base_stats/starmie.inc"
+BaseStats_Barrierd:: INCLUDE "data/pokemon/base_stats/barrierd.inc"
+BaseStats_Strike:: INCLUDE "data/pokemon/base_stats/strike.inc"
+BaseStats_Rougela:: INCLUDE "data/pokemon/base_stats/rougela.inc"
+BaseStats_Eleboo:: INCLUDE "data/pokemon/base_stats/eleboo.inc"
+BaseStats_Boober:: INCLUDE "data/pokemon/base_stats/boober.inc"
+BaseStats_Kailios:: INCLUDE "data/pokemon/base_stats/kailios.inc"
+BaseStats_Kentauros:: INCLUDE "data/pokemon/base_stats/kentauros.inc"
+BaseStats_Koiking:: INCLUDE "data/pokemon/base_stats/koiking.inc"
+BaseStats_Gyarados:: INCLUDE "data/pokemon/base_stats/gyarados.inc"
+BaseStats_Laplace:: INCLUDE "data/pokemon/base_stats/laplace.inc"
+BaseStats_Metamon:: INCLUDE "data/pokemon/base_stats/metamon.inc"
+BaseStats_Eievui:: INCLUDE "data/pokemon/base_stats/eievui.inc"
+BaseStats_Showers:: INCLUDE "data/pokemon/base_stats/showers.inc"
+BaseStats_Thunders:: INCLUDE "data/pokemon/base_stats/thunders.inc"
+BaseStats_Booster:: INCLUDE "data/pokemon/base_stats/booster.inc"
+BaseStats_Porygon:: INCLUDE "data/pokemon/base_stats/porygon.inc"
+BaseStats_Omnite:: INCLUDE "data/pokemon/base_stats/omnite.inc"
+BaseStats_Omstar:: INCLUDE "data/pokemon/base_stats/omstar.inc"
+BaseStats_Kabuto:: INCLUDE "data/pokemon/base_stats/kabuto.inc"
+BaseStats_Kabutops:: INCLUDE "data/pokemon/base_stats/kabutops.inc"
+BaseStats_Ptera:: INCLUDE "data/pokemon/base_stats/ptera.inc"
+BaseStats_Kabigon:: INCLUDE "data/pokemon/base_stats/kabigon.inc"
+BaseStats_Freezer:: INCLUDE "data/pokemon/base_stats/freezer.inc"
+BaseStats_Thunder:: INCLUDE "data/pokemon/base_stats/thunder.inc"
+BaseStats_Fire:: INCLUDE "data/pokemon/base_stats/fire.inc"
+BaseStats_Miniryu:: INCLUDE "data/pokemon/base_stats/miniryu.inc"
+BaseStats_Hakuryu:: INCLUDE "data/pokemon/base_stats/hakuryu.inc"
+BaseStats_Kairyu:: INCLUDE "data/pokemon/base_stats/kairyu.inc"
+BaseStats_Mewtwo:: INCLUDE "data/pokemon/base_stats/mewtwo.inc"
+BaseStats_Mew:: INCLUDE "data/pokemon/base_stats/mew.inc"
+BaseStats_Happa:: INCLUDE "data/pokemon/base_stats/happa.inc"
+BaseStats_Hanamogura:: INCLUDE "data/pokemon/base_stats/hanamogura.inc"
+BaseStats_Hanaryu:: INCLUDE "data/pokemon/base_stats/hanaryu.inc"
+BaseStats_Honoguma:: INCLUDE "data/pokemon/base_stats/honoguma.inc"
+BaseStats_Volbear:: INCLUDE "data/pokemon/base_stats/volbear.inc"
+BaseStats_Dynabear:: INCLUDE "data/pokemon/base_stats/dynabear.inc"
+BaseStats_Kurusu:: INCLUDE "data/pokemon/base_stats/kurusu.inc"
+BaseStats_Aqua:: INCLUDE "data/pokemon/base_stats/aqua.inc"
+BaseStats_Aquaria:: INCLUDE "data/pokemon/base_stats/aquaria.inc"
+BaseStats_Hoho:: INCLUDE "data/pokemon/base_stats/hoho.inc"
+BaseStats_Bobo:: INCLUDE "data/pokemon/base_stats/bobo.inc"
+BaseStats_Pachimee:: INCLUDE "data/pokemon/base_stats/pachimee.inc"
+BaseStats_Mokoko:: INCLUDE "data/pokemon/base_stats/mokoko.inc"
+BaseStats_Denryu:: INCLUDE "data/pokemon/base_stats/denryu.inc"
+BaseStats_Mikon:: INCLUDE "data/pokemon/base_stats/mikon.inc"
+BaseStats_Monja:: INCLUDE "data/pokemon/base_stats/monja.inc"
+BaseStats_Jaranra:: INCLUDE "data/pokemon/base_stats/jaranra.inc"
+BaseStats_Haneei:: INCLUDE "data/pokemon/base_stats/haneei.inc"
+BaseStats_Puku:: INCLUDE "data/pokemon/base_stats/puku.inc"
+BaseStats_Shibirefugu:: INCLUDE "data/pokemon/base_stats/shibirefugu.inc"
+BaseStats_Pichu:: INCLUDE "data/pokemon/base_stats/pichu.inc"
+BaseStats_Py:: INCLUDE "data/pokemon/base_stats/py.inc"
+BaseStats_Pupurin:: INCLUDE "data/pokemon/base_stats/pupurin.inc"
+BaseStats_Mizuuo:: INCLUDE "data/pokemon/base_stats/mizuuo.inc"
+BaseStats_Naty:: INCLUDE "data/pokemon/base_stats/naty.inc"
+BaseStats_Natio:: INCLUDE "data/pokemon/base_stats/natio.inc"
+BaseStats_Gyopin:: INCLUDE "data/pokemon/base_stats/gyopin.inc"
+BaseStats_Maril:: INCLUDE "data/pokemon/base_stats/maril.inc"
+BaseStats_Manbo1:: INCLUDE "data/pokemon/base_stats/manbo1.inc"
+BaseStats_Ikari:: INCLUDE "data/pokemon/base_stats/ikari.inc"
+BaseStats_Grotess:: INCLUDE "data/pokemon/base_stats/grotess.inc"
+BaseStats_Eksing:: INCLUDE "data/pokemon/base_stats/eksing.inc"
+BaseStats_Para:: INCLUDE "data/pokemon/base_stats/para.inc"
+BaseStats_Kokumo:: INCLUDE "data/pokemon/base_stats/kokumo.inc"
+BaseStats_Twohead:: INCLUDE "data/pokemon/base_stats/twohead.inc"
+BaseStats_Yoroidori:: INCLUDE "data/pokemon/base_stats/yoroidori.inc"
+BaseStats_Animon:: INCLUDE "data/pokemon/base_stats/animon.inc"
+BaseStats_Hinazu:: INCLUDE "data/pokemon/base_stats/hinazu.inc"
+BaseStats_Sunny:: INCLUDE "data/pokemon/base_stats/sunny.inc"
+BaseStats_Paon:: INCLUDE "data/pokemon/base_stats/paon.inc"
+BaseStats_Donphan:: INCLUDE "data/pokemon/base_stats/donphan.inc"
+BaseStats_Twinz:: INCLUDE "data/pokemon/base_stats/twinz.inc"
+BaseStats_Kirinriki:: INCLUDE "data/pokemon/base_stats/kirinriki.inc"
+BaseStats_Painter:: INCLUDE "data/pokemon/base_stats/painter.inc"
+BaseStats_Kounya:: INCLUDE "data/pokemon/base_stats/kounya.inc"
+BaseStats_Rinrin:: INCLUDE "data/pokemon/base_stats/rinrin.inc"
+BaseStats_Berurun:: INCLUDE "data/pokemon/base_stats/berurun.inc"
+BaseStats_Nyorotono:: INCLUDE "data/pokemon/base_stats/nyorotono.inc"
+BaseStats_Yadoking:: INCLUDE "data/pokemon/base_stats/yadoking.inc"
+BaseStats_Annon:: INCLUDE "data/pokemon/base_stats/annon.inc"
+BaseStats_Rediba:: INCLUDE "data/pokemon/base_stats/rediba.inc"
+BaseStats_Mitsuboshi:: INCLUDE "data/pokemon/base_stats/mitsuboshi.inc"
+BaseStats_Puchicorn:: INCLUDE "data/pokemon/base_stats/puchicorn.inc"
+BaseStats_Eifie:: INCLUDE "data/pokemon/base_stats/eifie.inc"
+BaseStats_Blacky:: INCLUDE "data/pokemon/base_stats/blacky.inc"
+BaseStats_Turban:: INCLUDE "data/pokemon/base_stats/turban.inc"
+BaseStats_Betbaby:: INCLUDE "data/pokemon/base_stats/betbaby.inc"
+BaseStats_Teppouo:: INCLUDE "data/pokemon/base_stats/teppouo.inc"
+BaseStats_Okutank:: INCLUDE "data/pokemon/base_stats/okutank.inc"
+BaseStats_Gongu:: INCLUDE "data/pokemon/base_stats/gongu.inc"
+BaseStats_Kapoerer:: INCLUDE "data/pokemon/base_stats/kapoerer.inc"
+BaseStats_Pudie:: INCLUDE "data/pokemon/base_stats/pudie.inc"
+BaseStats_Haneko:: INCLUDE "data/pokemon/base_stats/haneko.inc"
+BaseStats_Poponeko:: INCLUDE "data/pokemon/base_stats/poponeko.inc"
+BaseStats_Wataneko:: INCLUDE "data/pokemon/base_stats/wataneko.inc"
+BaseStats_Baririna:: INCLUDE "data/pokemon/base_stats/baririna.inc"
+BaseStats_Lip:: INCLUDE "data/pokemon/base_stats/lip.inc"
+BaseStats_Elebaby:: INCLUDE "data/pokemon/base_stats/elebaby.inc"
+BaseStats_Booby:: INCLUDE "data/pokemon/base_stats/booby.inc"
+BaseStats_Kireihana:: INCLUDE "data/pokemon/base_stats/kireihana.inc"
+BaseStats_Tsubomitto:: INCLUDE "data/pokemon/base_stats/tsubomitto.inc"
+BaseStats_Miltank:: INCLUDE "data/pokemon/base_stats/miltank.inc"
+BaseStats_Bombseeker:: INCLUDE "data/pokemon/base_stats/bombseeker.inc"
+BaseStats_Gift:: INCLUDE "data/pokemon/base_stats/gift.inc"
+BaseStats_Kotora:: INCLUDE "data/pokemon/base_stats/kotora.inc"
+BaseStats_Raitora:: INCLUDE "data/pokemon/base_stats/raitora.inc"
+BaseStats_Madame:: INCLUDE "data/pokemon/base_stats/madame.inc"
+BaseStats_Norowara:: INCLUDE "data/pokemon/base_stats/norowara.inc"
+BaseStats_Kyonpan:: INCLUDE "data/pokemon/base_stats/kyonpan.inc"
+BaseStats_Yamikarasu:: INCLUDE "data/pokemon/base_stats/yamikarasu.inc"
+BaseStats_Happi:: INCLUDE "data/pokemon/base_stats/happi.inc"
+BaseStats_Scissors:: INCLUDE "data/pokemon/base_stats/scissors.inc"
+BaseStats_Purakkusu:: INCLUDE "data/pokemon/base_stats/purakkusu.inc"
+BaseStats_Devil:: INCLUDE "data/pokemon/base_stats/devil.inc"
+BaseStats_Helgaa:: INCLUDE "data/pokemon/base_stats/helgaa.inc"
+BaseStats_Wolfman:: INCLUDE "data/pokemon/base_stats/wolfman.inc"
+BaseStats_Warwolf:: INCLUDE "data/pokemon/base_stats/warwolf.inc"
+BaseStats_Porygon2:: INCLUDE "data/pokemon/base_stats/porygon2.inc"
+BaseStats_Nameil:: INCLUDE "data/pokemon/base_stats/nameil.inc"
+BaseStats_Haganeil:: INCLUDE "data/pokemon/base_stats/haganeil.inc"
+BaseStats_Kingdra:: INCLUDE "data/pokemon/base_stats/kingdra.inc"
+BaseStats_Rai:: INCLUDE "data/pokemon/base_stats/rai.inc"
+BaseStats_En:: INCLUDE "data/pokemon/base_stats/en.inc"
+BaseStats_Sui:: INCLUDE "data/pokemon/base_stats/sui.inc"
+BaseStats_Nyula:: INCLUDE "data/pokemon/base_stats/nyula.inc"
+BaseStats_Houou:: INCLUDE "data/pokemon/base_stats/houou.inc"
+BaseStats_Togepy:: INCLUDE "data/pokemon/base_stats/togepy.inc"
+BaseStats_Bulu:: INCLUDE "data/pokemon/base_stats/bulu.inc"
+BaseStats_Tail:: INCLUDE "data/pokemon/base_stats/tail.inc"
+BaseStats_Leafy:: INCLUDE "data/pokemon/base_stats/leafy.inc"
diff --git a/data/pokemon/base_stats/kirinriki.inc b/data/pokemon/base_stats/kirinriki.inc
index 400a807..30b2312 100644
--- a/data/pokemon/base_stats/kirinriki.inc
+++ b/data/pokemon/base_stats/kirinriki.inc
@@ -6,7 +6,11 @@
db TYPE_DARK, TYPE_NORMAL ; type
db 255 ; catch rate
db 100 ; base exp
+if DEBUG || def(SILVER)
db ITEM_BERRY, ITEM_TAG ; items
+else
+ db ITEM_APPLE, ITEM_TAG ; item
+endc
db GENDER_50_50 ; gender ratio
db 100, 4, 70 ; unknown
dn 7, 7 ; sprite dimensions
diff --git a/data/predef_pointers.inc b/data/predef_pointers.inc
index 22d14f9..ca710dd 100644
--- a/data/predef_pointers.inc
+++ b/data/predef_pointers.inc
@@ -3,7 +3,7 @@
add_predef: MACRO
\1Predef::
- dab \1
+ dba \1
ENDM
PredefPointers:: ; 1:62d3
@@ -11,90 +11,91 @@ PredefPointers:: ; 1:62d3
; Please be a peach and nuke the hell out of these:
; WE NEED LABELS!
; Thank youu~
- dbw 1, $6445 ; 0
- dbw 1, $5D27
- dbw 1, $6713
- dbw 1, $66B1
- dbw 1, $4031
- dbw 3, $4E10
- dbw 3, $4D6F
- dbw 3, $4DE3
- dbw 3, $4DE3 ; 8
- dbw 3, $4DE3
- dbw 3, $4DF9
- dbw 3, $4E10
- dbw 3, $4D33
- dbw 3, $366C
- dbw 3, $4E3C
- dbw 3, $5A28
- dbw 3, $5886 ; 10
- dbw 3, $5A4F
- dbw 3, $5AC8
- dbw 3, $5CFC
- dbw 3, $5C16
- dbw 3, $5D5C
- dbw 3, $5E79
- dbw 3, $4E7C
- dbw 3, $5F7D ; 18
- dbw 3, $5F91
- dbw 4, $528F
- dbw 4, $52C1
- dbw 10, $4C98
- dbw 11, $5663
- dbw 15, $55CE
- dbw 15, $7019
- dbw 15, $7068 ; 20
- dbw 15, $704A
- dbw 15, $508C
- dbw 15, $567C
- dbw 15, $61A4
- dbw 15, $6F19
- dbw 15, $6874
- dbw 15, $691E
- dbw 15, $6963 ; 28
- dbw 16, $61F8
- dbw 16, $6252
- dbw 16, $5FA1
- dbw 10, $4DA4
- dbw 10, $4D6E
- dbw 16, $4AC7
- dbw 16, $4000
- dbw 16, $4B5C ; 30
- dbw 20, $4000
- dbw 20, $4BFE
- dbw 20, $4BCD
- dbw 20, $4B92
- dbw 20, $48C4
- dbw 20, $4771
- dbw 20, $4774
- dbw 20, $481F ; 38
- dbw 20, $46D4
- dbw 20, $469E
- dbw 20, $42B5
- dbw 20, $4244
- dbw 20, $4248
- dbw 20, $40C6
- dbw 20, $40A0
- dbw 20, $4073 ; 40
- dbw 20, $4ED9
- dbw 50, $76FF
- dbw 50, $7710
- dbw 50, $7733
- dbw 5, $45B8
- dbw 5, $46DC
- dbw 5, $45DE
- dbw 50, $4000 ; 48
- dbw 5, $457A
- dbw 5, $43E0
- dbw 2, $5695
- dbw 2, $528B
- dbw 2, $4786
- dbw 35, $44BE
- dbw 35, $49C6
- dbw 35, $4940 ; 50
- dbw 51, $4001
- dbw 51, $4000
- dbw 51, $4000
- dbw 63, $5B66
- dbw 4, $640B
+ add_predef Function_6445
+ add_predef Function_5d27
+ add_predef Function_6713
+ add_predef Function_66b1
+ add_predef Function_4031
+ add_predef Function_ce10
+ add_predef Function_cd6f
+ add_predef Function_cde3
+ add_predef Function_cde3_2
+ add_predef Function_cde3_3
+ add_predef Function_cdf9
+ add_predef Function_ce10_2
+ add_predef Function_cd33
+Function_366cPredef::
+ dbw 3, Function_366c
+ add_predef Function_ce3c
+ add_predef Function_da28
+ add_predef Function_d886
+ add_predef Function_da4f
+ add_predef Function_dac8
+ add_predef Function_dcfc
+ add_predef Function_dc16
+ add_predef Function_dd5c
+ add_predef Function_de79
+ add_predef Function_ce7c
+ add_predef Function_df7d
+ add_predef Function_df91
+ add_predef Function_1128f
+ add_predef Function_112c1
+ add_predef Function_28c98
+ add_predef Function_2d663
+ add_predef Function_3d5ce
+ add_predef Function_3f019
+ add_predef Function_3f068
+ add_predef Function_3f04a
+ add_predef Function_3d08c
+ add_predef Function_3d67c
+ add_predef Function_3e1a4
+ add_predef Function_3ef19
+ add_predef Function_3e874
+ add_predef Function_3e91e
+ add_predef Function_3e963
+ add_predef Function_421f8
+ add_predef Function_42252
+ add_predef Function_41fa1
+ add_predef Function_28da4
+ add_predef Function_28d6e
+ add_predef Function_40ac7
+ add_predef Function_40000
+ add_predef Function_40b5c
+ add_predef Function_50000
+ add_predef Function_50bfe
+ add_predef Function_50bcd
+ add_predef Function_50b92
+ add_predef Function_508c4
+ add_predef Function_50771
+ add_predef Function_50774
+ add_predef Function_5081f
+ add_predef Function_506d4
+ add_predef Function_5069e
+ add_predef Function_502b5
+ add_predef Function_50244
+ add_predef Function_50248
+ add_predef Function_500c6
+ add_predef Function_500a0
+ add_predef Function_50073
+ add_predef Function_50ed9
+ add_predef Function_cb6ff
+ add_predef Function_cb710
+ add_predef Function_cb733
+ add_predef Function_145b8
+ add_predef Function_146dc
+ add_predef Function_145de
+ add_predef Function_c8000
+ add_predef Function_1457a
+ add_predef Function_143e0
+ add_predef Function_9695
+ add_predef Function_928b
+ add_predef Function_8786
+ add_predef Function_8c4be
+ add_predef Function_8c9c6
+ add_predef Function_8c940
+ add_predef Function_cc001
+ add_predef Function_cc000
+ add_predef Function_cc000_2
+ add_predef Function_fdb66
+ add_predef Function_1240b
dbw $ff, InexplicablyEmptyFunction
diff --git a/data/super_palettes.inc b/data/super_palettes.inc
index 632c844..052bcaf 100644
--- a/data/super_palettes.inc
+++ b/data/super_palettes.inc
@@ -38,7 +38,11 @@ SuperPalettes::
RGB 28,28,28, 30,26,15, 26,20,00, 04,04,04 ; YELLOWBAR
RGB 28,28,28, 30,26,15, 26,10,06, 04,04,04 ; REDBAR
RGB 28,28,28, 20,26,31, 17,23,10, 04,04,04 ; TOWN_MAP
+if def(GOLD)
RGB 28,28,28, 24,20,10, 21,00,04, 04,04,04 ; LOGO_1
+else
+ RGB 28,28,28, 18,18,18, 21,00,04, 04,04,04 ; LOGO_1
+endc
RGB 28,28,28, 31,20,10, 21,00,04, 04,04,04 ; LOGO_2
RGB 28,28,28, 30,26,16, 16,12,09, 04,04,04 ; GAME_FREAK
RGB 28,28,28, 15,28,26, 12,22,26, 03,16,14 ; INTRO_WATER
diff --git a/data/tileset_headers.asm b/data/tileset_headers.asm
index 5425b91..47b0c38 100644
--- a/data/tileset_headers.asm
+++ b/data/tileset_headers.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Tileset Headers", ROMX[$488D], BANK[$03]
+else
+SECTION "Tileset Headers", ROMX[$4875], BANK[$03]
+endc
Tileset_00: ; 0xc88d
db $06 ; bank
diff --git a/data/trainers/parties.asm b/data/trainers/parties.asm
index a74296e..d31c34c 100644
--- a/data/trainers/parties.asm
+++ b/data/trainers/parties.asm
@@ -3,10 +3,10 @@ INCLUDE "constants.asm"
; Trainer data structure:
; - db "NAME@", TRAINERTYPE_* constant
; - 1 to 6 Pokémon:
-; * for TRAINERTYPE_NORMAL: db level, species
-; * for TRAINERTYPE_ITEM: db level, species, item
-; * for TRAINERTYPE_MOVES: db level, species, 4 moves
-; * for TRAINERTYPE_ITEM_MOVES: db level, species, item, 4 moves
+; * for TRAINERTYPE_NORMAL: db level, species
+; * for TRAINERTYPE_ITEM: db level, species, item
+; * for TRAINERTYPE_MOVES: db level, species, 4 moves
+; * for TRAINERTYPE_ITEM_MOVES: db level, species, item, 4 moves
; - db -1 ; end
SECTION "Trainer Parties", ROMX[$5110], BANK[$E]
@@ -15,6 +15,7 @@ INCLUDE "data/trainers/party_pointers.inc"
; TODO: decode all data
+if def(GOLD)
SECTION "Trainer Parties 1 TEMPORARY", ROMX[$51BF],BANK[$E]
AkaneGroup::
BugCatcherBoyGroup::
@@ -205,3 +206,195 @@ SportsmanGroup::
db "しげき@", TRAINERTYPE_ITEM
db 8, DEX_DONPHAN, ITEM_NONE
db -1 ; end
+
+else
+
+
+SECTION "Trainer Parties 1 TEMPORARY", ROMX[$51BF],BANK[$E]
+AkaneGroup::
+BugCatcherBoyGroup::
+ ; BUG_CATCHER_BOY_KENJI
+ db "けんじ@", TRAINERTYPE_ITEM_MOVES
+ db 9, DEX_REDIBA, ITEM_NONE, MOVE_SCRATCH, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE
+ db -1 ; end
+
+ ; BUG_CATCHER_BOY_KEN
+ db "けん@", TRAINERTYPE_ITEM_MOVES
+ db 7, DEX_KONGPANG, ITEM_NONE, MOVE_STUN_SPORE, MOVE_LEECH_LIFE, MOVE_NONE, MOVE_NONE
+ db -1 ; end
+
+SECTION "Trainer Parties 2 TEMPORARY", ROMX[$52B4],BANK[$E]
+MikanGroup::
+
+SECTION "Trainer Parties 3 TEMPORARY", ROMX[$53BC],BANK[$E]
+OkidoGroup::
+
+SECTION "Trainer Parties 4 TEMPORARY", ROMX[$54BA],BANK[$E]
+WataruGroup::
+
+SECTION "Trainer Parties 5 TEMPORARY", ROMX[$54E0],BANK[$E]
+GerugeMemberMGroup::
+
+SECTION "Trainer Parties 6 TEMPORARY", ROMX[$54FE],BANK[$E]
+Trio1Group::
+BeautyGroup::
+
+SECTION "Trainer Parties 7 TEMPORARY", ROMX[$55EB],BANK[$E]
+FledglingGroup::
+
+SECTION "Trainer Parties 8 TEMPORARY", ROMX[$56CE],BANK[$E]
+PokeManiacGroup::
+
+SECTION "Trainer Parties 9 TEMPORARY", ROMX[$57BC],BANK[$E]
+GentlemanGroup::
+
+SECTION "Trainer Parties 10 TEMPORARY", ROMX[$57E0],BANK[$E]
+TeacherMGroup::
+
+SECTION "Trainer Parties 11 TEMPORARY", ROMX[$57EC],BANK[$E]
+TeacherFGroup::
+
+SECTION "Trainer Parties 12 TEMPORARY", ROMX[$57F2],BANK[$E]
+ManchildGroup::
+
+SECTION "Trainer Parties 13 TEMPORARY", ROMX[$58C3],BANK[$E]
+RockerGroup::
+
+SECTION "Trainer Parties 14 TEMPORARY", ROMX[$58F2],BANK[$E]
+HikerGroup::
+
+SECTION "Trainer Parties 15 TEMPORARY", ROMX[$5995],BANK[$E]
+KimonoGirlGroup::
+ ; KIMONO_GIRL_KOUME
+ db "こうめ@", TRAINERTYPE_ITEM_MOVES
+ db 9, DEX_DONPHAN, ITEM_NONE, MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_NONE, MOVE_NONE
+ db -1 ; end
+
+ ; KIMONO_GIRL_TAMAO
+ db "たまお@", TRAINERTYPE_ITEM_MOVES
+ db 10, DEX_PURIN, ITEM_NONE, MOVE_CHARM, MOVE_POUND, MOVE_ENCORE, MOVE_NONE
+ db -1 ; end
+
+SECTION "Trainer Parties 16 TEMPORARY", ROMX[$518A],BANK[$E]
+HayatoGroup::
+
+SECTION "Trainer Parties 17 TEMPORARY", ROMX[$5216],BANK[$E]
+TsukishiGroup::
+LassGroup::
+
+SECTION "Trainer Parties 18 TEMPORARY", ROMX[$526F],BANK[$E]
+EnokiGroup::
+
+SECTION "Trainer Parties 19 TEMPORARY", ROMX[$528F],BANK[$E]
+OkeraGroup::
+
+SECTION "Trainer Parties 20 TEMPORARY", ROMX[$533D],BANK[$E]
+GamaGroup::
+
+SECTION "Trainer Parties 21 TEMPORARY", ROMX[$5542],BANK[$E]
+Trio2Group::
+
+SECTION "Trainer Parties 22 TEMPORARY", ROMX[$5554],BANK[$E]
+Trio3Group::
+
+SECTION "Trainer Parties 23 TEMPORARY", ROMX[$5673],BANK[$E]
+ProfessionalMGroup::
+ProfessionalFGroup::
+
+SECTION "Trainer Parties 24 TEMPORARY", ROMX[$5812],BANK[$E]
+SwimmerMGroup::
+
+SECTION "Trainer Parties 25 TEMPORARY", ROMX[$5821],BANK[$E]
+SuperNerdGroup::
+
+SECTION "Trainer Parties 26 TEMPORARY", ROMX[$5833],BANK[$E]
+EngineerGroup::
+
+SECTION "Trainer Parties 27 TEMPORARY", ROMX[$5965],BANK[$E]
+JugglerGroup::
+
+SECTION "Trainer Parties 28 TEMPORARY", ROMX[$5971],BANK[$E]
+TwinsGroup::
+
+SECTION "Trainer Parties 29 TEMPORARY", ROMX[$5976],BANK[$E]
+SchoolboyGroup::
+ ; SCHOOLBOY_TETSUYA
+ db "てつや@", TRAINERTYPE_ITEM
+ db 8, DEX_YADOKING, ITEM_NONE
+ db -1 ; end
+
+SECTION "Trainer Parties 30 TEMPORARY", ROMX[$597F],BANK[$E]
+FirebreatherGroup::
+ ; FIREBREATHER_AKITO
+ db "あきと@", TRAINERTYPE_ITEM
+ db 8, DEX_BOOBY, ITEM_NONE
+ db -1 ; end
+
+SECTION "Trainer Parties 31 TEMPORARY", ROMX[$5320],BANK[$E]
+BlueGroup::
+
+SECTION "Trainer Parties 32 TEMPORARY", ROMX[$5375],BANK[$E]
+RivalGroup::
+
+SECTION "Trainer Parties 33 TEMPORARY", ROMX[$5404],BANK[$E]
+SakakiGroup::
+
+SECTION "Trainer Parties 34 TEMPORARY", ROMX[$5427],BANK[$E]
+ProtagonistGroup::
+
+SECTION "Trainer Parties 35 TEMPORARY", ROMX[$5433],BANK[$E]
+SibaGroup::
+KasumiGroup::
+FisherGroup::
+
+SECTION "Trainer Parties 36 TEMPORARY", ROMX[$5476],BANK[$E]
+KannaGroup::
+
+SECTION "Trainer Parties 37 TEMPORARY", ROMX[$555D],BANK[$E]
+RocketFGroup::
+
+SECTION "Trainer Parties 38 TEMPORARY", ROMX[$557E],BANK[$E]
+YoungsterGroup::
+
+SECTION "Trainer Parties 39 TEMPORARY", ROMX[$564F],BANK[$E]
+ProdigyGroup::
+
+SECTION "Trainer Parties 40 TEMPORARY", ROMX[$578C],BANK[$E]
+RocketMGroup::
+
+SECTION "Trainer Parties 41 TEMPORARY", ROMX[$5808],BANK[$E]
+SwimmerFGroup::
+
+SECTION "Trainer Parties 42 TEMPORARY", ROMX[$5817],BANK[$E]
+SailorGroup::
+
+SECTION "Trainer Parties 43 TEMPORARY", ROMX[$58FE],BANK[$E]
+BikerGroup::
+
+SECTION "Trainer Parties 44 TEMPORARY", ROMX[$594D],BANK[$E]
+RockClimberGroup::
+
+SECTION "Trainer Parties 45 TEMPORARY", ROMX[$5959],BANK[$E]
+BurglarGroup::
+
+SECTION "Trainer Parties 46 TEMPORARY", ROMX[$5969],BANK[$E]
+BlackbeltGroup::
+
+SECTION "Trainer Parties 47 TEMPORARY", ROMX[$596D],BANK[$E]
+PsychicGroup::
+KungFuMasterGroup::
+FortuneTellerGroup::
+HooliganGroup::
+SageGroup::
+MediumGroup::
+SoldierGroup::
+GerugeMemberFGroup::
+
+SECTION "Trainer Parties 48 TEMPORARY", ROMX[$5988],BANK[$E]
+SportsmanGroup::
+ ; SPORTSMAN_SHIGEKI
+ db "てつじ@", TRAINERTYPE_ITEM_MOVES
+ db 9, DEX_DONPHAN, ITEM_NONE, MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_NONE, MOVE_NONE
+ db -1 ; end
+
+endc
diff --git a/engine/predef.asm b/engine/predef.asm
index 8210266..14de69f 100644
--- a/engine/predef.asm
+++ b/engine/predef.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Predef pointers", ROMX[$62B0], BANK[$01]
+else
+SECTION "Predef pointers", ROMX[$62AD], BANK[$01]
+endc
GetPredefPointer:: ; 1:62b0
ld a, h
diff --git a/engine/title.asm b/engine/title.asm
index 2ddaa44..961b83b 100644
--- a/engine/title.asm
+++ b/engine/title.asm
@@ -6,7 +6,11 @@ IntroSequence:: ; 5d8c
; TODO
+if DEBUG
SECTION "Title screen TEMPORARY", ROMX[$62A5],BANK[1] ; TODO: merge this with the main section above
+else
+SECTION "Title screen TEMPORARY", ROMX[$62A2],BANK[1] ; TODO: merge this with the main section above
+endc
GameInit:: ; 62a5
call ClearWindowData
diff --git a/gfx.asm b/gfx.asm
index 5353dd3..20dd389 100644
--- a/gfx.asm
+++ b/gfx.asm
@@ -35,11 +35,19 @@ INCBIN "gfx/sgb/sgb_border_alt.2bpp"
SECTION "SGB Border GFX", ROMX[$6B1C], BANK[$02]
SGBBorderGFX::
-INCBIN "gfx/sgb/sgb_border.2bpp"
+if def(GOLD)
+INCBIN "gfx/sgb/sgb_border_gold.2bpp"
+else
+INCBIN "gfx/sgb/sgb_border_silver.2bpp"
+endc
SECTION "Title Screen GFX", ROMX[$47CF], BANK[$04]
TitleScreenGFX::
-INCBIN "gfx/title/title.2bpp"
+if def(GOLD)
+INCBIN "gfx/title/title_gold.2bpp"
+else
+INCBIN "gfx/title/title_silver.2bpp"
+endc
SECTION "Mail Icon GFX", ROMX[$5BB1], BANK[$04]
MailIconGFX::
@@ -51,9 +59,12 @@ INCBIN "gfx/trainer_card/trainer_card.2bpp"
TrainerCardLeadersGFX::
INCBIN "gfx/trainer_card/leaders.2bpp"
+if DEBUG
+; Not sure how to parse this from the non-debug ROM, so I'll leave this be for now
SECTION "Unused Leader", ROMX[$7BA3], BANK[$04]
UnusedLeaderNameGFX::
INCBIN "gfx/trainer_card/unused_leader_name.2bpp"
+endc
SECTION "Bank 6 Tilesets 00", ROMX[$4000], BANK[$06]
Tileset_00_GFX:
diff --git a/gfx/sgb/sgb_border.png b/gfx/sgb/sgb_border_gold.png
index 2fda111..2fda111 100644
--- a/gfx/sgb/sgb_border.png
+++ b/gfx/sgb/sgb_border_gold.png
Binary files differ
diff --git a/gfx/sgb/sgb_border_silver.png b/gfx/sgb/sgb_border_silver.png
new file mode 100644
index 0000000..312af38
--- /dev/null
+++ b/gfx/sgb/sgb_border_silver.png
Binary files differ
diff --git a/gfx/title/title.png b/gfx/title/title_gold.png
index 1b6ba5d..1b6ba5d 100644
--- a/gfx/title/title.png
+++ b/gfx/title/title_gold.png
Binary files differ
diff --git a/gfx/title/title_silver.png b/gfx/title/title_silver.png
new file mode 100644
index 0000000..f7f8f6b
--- /dev/null
+++ b/gfx/title/title_silver.png
Binary files differ
diff --git a/home/audio.asm b/home/audio.asm
index a983bf3..ede88d4 100644
--- a/home/audio.asm
+++ b/home/audio.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Audio interface", ROM0[$3CBF]
+else
+SECTION "Audio interface", ROM0[$3C83]
+endc
DisableAudio:: ; 3cbf
push hl
diff --git a/home/bankswitch.asm b/home/bankswitch.asm
index b8549bc..574fa64 100644
--- a/home/bankswitch.asm
+++ b/home/bankswitch.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Bankswitch", ROM0[$32C2]
+else
+SECTION "Bankswitch", ROM0[$3286]
+endc
; Moved to a rst vector in final US releases (not sure about JP)
; All rst vectors are unused at this point in development
diff --git a/home/clear_sprites.asm b/home/clear_sprites.asm
index c6ac3aa..90e8f38 100644
--- a/home/clear_sprites.asm
+++ b/home/clear_sprites.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Sprite clearing", ROM0[$32DC]
+else
+SECTION "Sprite clearing", ROM0[$32A0]
+endc
ClearSprites:: ; 32dc
ld hl, wVirtualOAM
diff --git a/home/copy.asm b/home/copy.asm
index b289aea..757da0d 100644
--- a/home/copy.asm
+++ b/home/copy.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Copy functions", ROM0[$32F7]
+else
+SECTION "Copy functions", ROM0[$32BB]
+endc
; Copy bc bytes from a:hl to de.
FarCopyBytes:: ; 32f7
diff --git a/home/copy_tilemap.asm b/home/copy_tilemap.asm
index fceef45..27c33c0 100644
--- a/home/copy_tilemap.asm
+++ b/home/copy_tilemap.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Tilemap copy/restore funcs", ROM0[$3355]
+else
+SECTION "Tilemap copy/restore funcs", ROM0[$3319]
+endc
BackUpTilesToBuffer:: ; 3355
hlcoord 0, 0
diff --git a/home/farcall.asm b/home/farcall.asm
index f7a97d0..32fcce5 100644
--- a/home/farcall.asm
+++ b/home/farcall.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Farcall", ROM0[$2FA8]
+else
+SECTION "FarCall", ROM0[$2F6C]
+endc
FarCall_hl:: ; 2fa8
push af
diff --git a/home/init.asm b/home/init.asm
index 0a31e69..5498b35 100644
--- a/home/init.asm
+++ b/home/init.asm
@@ -7,7 +7,19 @@ SECTION "Entry point", ROM0[$100]
SECTION "Global check value", ROM0[$14E]
; The ROM has an incorrect global check, so set it here
; It is not corrected by RGBFIX
+if def(GOLD)
+if DEBUG
db $21, $C6
+else
+ db $7e, $49
+endc
+else
+if DEBUG
+ db $c9, $2f
+else
+ db $b1, $7a
+endc
+endc
SECTION "Init", ROM0[$52F]
diff --git a/home/math.asm b/home/math.asm
new file mode 100644
index 0000000..2f3b408
--- /dev/null
+++ b/home/math.asm
@@ -0,0 +1,41 @@
+include "constants.asm"
+
+if DEBUG
+SECTION "Home Math", ROM0[$341F]
+else
+SECTION "Home Math", ROM0[$33E3]
+endc
+
+_341F:: ; 341f
+; Returns hl + a * 6
+ and a
+ ret z
+ ld bc, 6
+.loop:
+ add hl, bc
+ dec a
+ jr nz, .loop
+ ret
+
+AddAMulBC:: ; 3429
+; Returns hl + a * bc
+ and a
+ ret z
+.loop:
+ add hl, bc
+ dec a
+ jr nz, .loop
+ ret
+
+memcmp:: ; 3430
+; Compare c bytes at hl and de
+; Returns z if all equal, nz otherwise.
+.loop:
+ ld a, [de]
+ cp [hl]
+ ret nz
+ inc de
+ inc hl
+ dec c
+ jr nz, .loop
+ ret
diff --git a/home/pokemon.asm b/home/pokemon.asm
index 9b1eec2..1f51f8e 100644
--- a/home/pokemon.asm
+++ b/home/pokemon.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
-SECTION "3A4B", ROM0[$3a4b]
+if DEBUG
+SECTION "3A4B", ROM0[$3A4B]
+else
+SECTION "3A4B", ROM0[$3A0F]
+endc
; copies the base stat data of a pokemon to wMonHeader
; INPUT:
; [wcb5b] = pokemon ID in dex order
@@ -43,7 +47,11 @@ GetMonHeader:: ; 3a4b (0:3a4b)
pop bc
ret
-SECTION "3AED", ROM0[$3aed]
+if DEBUG
+SECTION "3AED", ROM0[$3AED]
+else
+SECTION "3AED", ROM0[$3AB1]
+endc
; Uncompresses the front or back sprite of the specified mon
; assumes the corresponding mon header is already loaded
diff --git a/home/predef.asm b/home/predef.asm
index 69620ce..a9ff091 100644
--- a/home/predef.asm
+++ b/home/predef.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Predef", ROM0[$2FDE]
+else
+SECTION "Predef", ROM0[$2FA2]
+endc
Predef:: ; 2fde
ld [wPredefID], a
diff --git a/home/rst.asm b/home/rst.asm
index 851775b..884f5a9 100644
--- a/home/rst.asm
+++ b/home/rst.asm
@@ -1,25 +1,29 @@
; rst vectors
SECTION "rst00", ROM0[$000]
- rst $38
+ rst $38
SECTION "rst08", ROM0[$008]
- rst $38
+ rst $38
SECTION "rst10", ROM0[$010]
- rst $38
+ rst $38
SECTION "rst18", ROM0[$018]
- rst $38
+ rst $38
SECTION "rst20", ROM0[$020]
- rst $38
+ rst $38
SECTION "rst28", ROM0[$028]
- rst $38
+ rst $38
SECTION "rst30", ROM0[$030]
- rst $38
+ rst $38
SECTION "rst38", ROM0[$038]
- jp $F080 ; Jumps in the middle of unmapped memory. Probably used to trigger a breakpoint of sorts.
+if DEBUG && def(SILVER)
+ rst $38
+else
+ jp $F080 ; Jumps in the middle of unmapped memory. Probably used to trigger a breakpoint of sorts.
+endc
diff --git a/home/sram.asm b/home/sram.asm
index 5f9cfe2..03d4411 100644
--- a/home/sram.asm
+++ b/home/sram.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "SRAM functions", ROM0[$32A7]
+else
+SECTION "SRAM functions", ROM0[$326B]
+endc
OpenSRAM:: ; 32a7
push af
diff --git a/home/unknown.asm b/home/unknown.asm
index e2046e3..c216f62 100644
--- a/home/unknown.asm
+++ b/home/unknown.asm
@@ -1,6 +1,10 @@
INCLUDE "constants.asm"
+if DEBUG
SECTION "Empty function", ROM0[$2F97]
+else
+SECTION "Empty function", ROM0[$2F5B]
+endc
InexplicablyEmptyFunction:: ; 2f97
REPT 16
@@ -34,3 +38,86 @@ _2007:: ; 2007
ld [wce5f], a
call CloseSRAM
ret
+
+SECTION "Unknown functions 2", ROM0[$2075]
+
+_2075:: ; 2075
+; Prepares a buffer for the clock display, which in the Debug ROM is displayed on the bottom of the screen.
+; This function is called every frame, and loads special tiles into the $66-$7a space.
+ ld hl, wcbd2
+ ld bc, $14
+ ld a, " "
+ call ByteFill
+
+if DEBUG
+ ld hl, $d153
+ bit 0, [hl]
+ jr z, ._209e
+ ld hl, $d65b
+ ld de, wcbd2 + 4
+ ld c, $01
+ call _20CD
+ ld hl, $d65a
+ ld de, wcbd2 + 8
+ ld c, $01
+ call _20CD
+ ret
+._209e:
+endc
+
+ ld hl, hHours
+ ld de, wcbd2
+ call _20DC
+ ld hl, hMinutes
+ ld de, wcbd2 + 3
+ call _20DC
+ ldh a, [hDays]
+ and 7
+ add $71 ; Sunday
+ ld [wcbd2 + 6], a
+ ld a, $78 ; power
+ ld [wcbd2 + 9], a
+ inc a ; mobile
+ ld [wcbd2 + 11], a
+ ldh a, [hSeconds]
+ and 1
+ ret z
+ ld a, $70 ; :
+ ld [wcbd2 + 2], a
+ ret
+
+_20CD:: ; 20cd
+; PrintAsHex
+ ld a, [hli]
+ ld b, a
+ swap a
+ call _20F1
+ ld a, b
+ call _20F1
+ dec c
+ jr nz, _20CD
+ ret
+
+_20DC:: ; 20dc
+; PrintAsDec
+ ld a, [hli]
+ ld b, 0
+._20df:
+ inc b
+ sub 10
+ jr nc, ._20df
+ dec b
+ add 10
+ push af
+ ld a, b
+ call _20F1
+ pop af
+ call _20F1
+ ret
+
+_20F1:: ; 20f1
+ and %1111
+ add $66 ; digit 0
+ ld [de], a
+ inc de
+ ret
diff --git a/hram.asm b/hram.asm
index 2d28b47..e5fbcf6 100644
--- a/hram.asm
+++ b/hram.asm
@@ -4,7 +4,13 @@ hOAMDMA:: ; ff80
ds 10
- ds 14 ; TODO
+ ds 3 ; TODO
+
+hHours:: db ; ff8d
+hMinutes:: db ; ff8e
+hSeconds:: db ; ff8f
+hDays:: db ; ff90
+ ds 7 ; TODO
hROMBank:: ; ff98
diff --git a/roms.md5 b/roms.md5
index f8f23f7..552fc21 100644
--- a/roms.md5
+++ b/roms.md5
@@ -1 +1,4 @@
-2eadbed83b775c097ff79e5128d1184f *pokegold-spaceworld.gb
+3c407114de28d17b7113a2c0cee9a37c *pokegold_spaceworld.gb
+2eadbed83b775c097ff79e5128d1184f *pokegold_debug_spaceworld.gb
+c52a677c35f15320d5b495e14809f00d *pokesilver_spaceworld.gb
+fa65d3759bb17c489de171a598ba4913 *pokesilver_debug_spaceworld.gb
diff --git a/shim.sym b/shim.sym
deleted file mode 100644
index 2bd959b..0000000
--- a/shim.sym
+++ /dev/null
@@ -1,111 +0,0 @@
-; ROM0
-00:0884 UpdateJoypad
-00:0d1a LoadFontExtra
-00:0d0a LoadFont
-00:0E2A ClearTileMap
-00:0e3d DrawTextBox
-00:0E93 PlaceString
-00:0E94 PlaceNextChar
-00:0E9D CheckDict
-00:10A6 PlaceHLTextAtBC
-00:10B7 DoTextUntilTerminator
-00:10C1 DoTextUntilTerminator.continue
-00:10E2 Text_TX
-00:120C TextCommands
-00:1d49 LoadMenuHeader
-00:1e58 OpenMenu
-00:1F9E ClearWindowData
-00:1FCC ClearWindowData.bytefill
-
-00:20ff RunMapScript
-00:232c LoadMapWarp
-00:23e5 OverworldFadeIn
-
-00:3270 Random
-00:3429 AddAMulBC
-00:3621 WaitBGMap
-00:362B SetPalettes
-00:3634 ClearPalettes
-00:363C GetMemSGBLayout
-00:363E GetSGBLayout
-00:3648 SetHPPal
-00:3655 SetHPPal.done
-00:36C8 NamesPointers
-00:36E0 GetName
-00:3D86 WaitSFX
-00:3D87 WaitSFX.wait
-00:3DA5 MaxVolume
-00:3DAB LowVolume
-00:3DB1 VolumeOff
-00:3DB6 UpdateSoundNTimes
-00:3DBE FadeToMapMusic
-00:3DDC FadeToMapMusic.dontfade
-00:3DE1 PlayMapMusic
-00:3E00 PlayMapMusic.dontplay
-00:3E05 SpecialMapMusic
-00:3E14 SpecialMapMusic.state2 ; ?
-00:3E19 SpecialMapMusic.normal
-00:3E1B GetMapMusic
-00:3E2E GetMapMusic.unk_3E2E
-00:3E32 Unk_3E32 ; What the f*** is this???
-
-01:53cc MainMenu
-
-02:4856 DecompTownMapTilemap
-02:48da DecompTownMapTilemap.tilemap ; compressed
-02:4f32 PokegearRadioGfx
-02:4c7c DrawMap
-02:4dc2 TownMapGfx
-02:5695 CheckSGB ; ?
-
-03:4791 DebugWarp
-03:479f DebugWarp.Destinations
-
-04:5677 DoPlayerMovement
-
-0e:4b78 LoadTrainerClassName
-0e:4ba0 LoadTrainerClassName.got_name
-0e:4ba9 LoadTrainerClass
-
-10:40A6 ShowPokedexMenu
-
-23:4349 OverworldFadeOut
-23:60cc MenuMonIconGfx
-
-30:4000 OverworldSpriteGfx
-
-3A:4D9D _PlayCryHeader
-3A:4E22 _PlaySFX
-3A:4F11 LoadChannel
-3A:4F6C LoadMusicByte
-3A:52C7 Music
-
-3f:64ce MonsterTest
-3f:654e PicTest
-3f:6750 PicTestMenu
-3f:6755 PicTestMenu.loop
-
-;00:BFFF sWindowStackTop
-
-00:c5e8 wMapScriptNumber
-00:ca22 wTrainerClass
-00:CBF2 wWindowData
-00:CBF2 wWindowStackPointer
-00:CC02 wMenuDataHeader
-00:CC12 wMenuData2
-00:CC22 wMenuData3
-00:cdbe wTargetMapUnk
-00:cdbf wTargetMapGroup
-00:cdc0 wTargetMapId
-00:CE62 wTextBoxFlags
-00:ce67 wPlayerName
-
-01:d165 wTMCounts
-01:d19e wItems
-01:d258 wRivalName
-01:D264 wPlayerBikeSurfState
-01:d656 wMapGroup
-01:d657 wMapId
-01:d66a wMapScriptPtr
-01:D7D2 wPartyMonOT
-01:DA3B wUnk_DA3B ; In final, $DE7D in NamesPointers (6th entry)
diff --git a/shim_gold.sym b/shim_gold.sym
new file mode 100644
index 0000000..cc7b9a7
--- /dev/null
+++ b/shim_gold.sym
@@ -0,0 +1,179 @@
+00:0884 UpdateJoypad
+00:0D0A LoadFont
+00:0D1A LoadFontExtra
+00:0E2A ClearTileMap
+00:0E3D DrawTextBox
+00:0E93 PlaceString
+00:0E94 PlaceNextChar
+00:0E9D CheckDict
+00:10A6 PlaceHLTextAtBC
+00:10B7 DoTextUntilTerminator
+00:10C1 DoTextUntilTerminator.continue
+00:10E2 Text_TX
+00:120C TextCommands
+00:1D49 LoadMenuHeader
+00:1E58 OpenMenu
+00:1F9E ClearWindowData
+00:1FCC ClearWindowData.bytefill
+00:20E1 RunMapScript
+00:230E LoadMapWarp
+00:23C7 OverworldFadeIn
+00:3234 Random
+00:3621 WaitBGMap
+00:362B SetPalettes
+00:3634 ClearPalettes
+00:363C GetMemSGBLayout
+00:363E GetSGBLayout
+00:360C SetHPPal
+00:3619 SetHPPal.done
+00:3630 Function_366c
+00:36C8 NamesPointers
+00:36E0 GetName
+00:3D86 WaitSFX
+00:3D87 WaitSFX.wait
+00:3DA5 MaxVolume
+00:3DAB LowVolume
+00:3DB1 VolumeOff
+00:3DB6 UpdateSoundNTimes
+00:3DBE FadeToMapMusic
+00:3DDC FadeToMapMusic.dontfade
+00:3DE1 PlayMapMusic
+00:3E00 PlayMapMusic.dontplay
+00:3E05 SpecialMapMusic
+00:3E14 SpecialMapMusic.state2
+00:3E19 SpecialMapMusic.normal
+00:3E1B GetMapMusic
+00:3E2E GetMapMusic.unk_3E2E
+00:3E32 Unk_3E32
+01:4031 Function_4031
+01:53CC MainMenu
+01:5D27 Function_5d27
+01:6442 Function_6445
+01:66AE Function_66b1
+01:6710 Function_6713
+02:4786 Function_8786
+02:4856 DecompTownMapTilemap
+02:48DA DecompTownMapTilemap.tilemap
+02:4C7C DrawMap
+02:4DC2 TownMapGfx
+02:4F32 PokegearRadioGfx
+02:528B Function_928b
+02:5695 CheckSGB
+02:5695 Function_9695
+03:4791 DebugWarp
+03:479F DebugWarp.Destinations
+03:4D1B Function_cd33
+03:4D57 Function_cd6f
+03:4DCB Function_cde3
+03:4DCB Function_cde3_2
+03:4DCB Function_cde3_3
+03:4DE1 Function_cdf9
+03:4DF8 Function_ce10
+03:4DF8 Function_ce10_2
+03:4E24 Function_ce3c
+03:4E64 Function_ce7c
+03:586E Function_d886
+03:5A10 Function_da28
+03:5A37 Function_da4f
+03:5AB0 Function_dac8
+03:5BFE Function_dc16
+03:5CE4 Function_dcfc
+03:5D44 Function_dd5c
+03:5E61 Function_de79
+03:5F65 Function_df7d
+03:5F79 Function_df91
+04:528F Function_1128f
+04:52C1 Function_112c1
+04:5677 DoPlayerMovement
+04:640B Function_1240b
+05:43E0 Function_143e0
+05:457A Function_1457a
+05:45B8 Function_145b8
+05:45DE Function_145de
+05:46DC Function_146dc
+0A:4C98 Function_28c98
+0A:4D6E Function_28d6e
+0A:4DA4 Function_28da4
+0B:5663 Function_2d663
+0E:4B78 LoadTrainerClassName
+0E:4BA0 LoadTrainerClassName.got_name
+0E:4BA9 LoadTrainerClass
+0F:508C Function_3d08c
+0F:55CE Function_3d5ce
+0F:567C Function_3d67c
+0F:61A4 Function_3e1a4
+0F:6874 Function_3e874
+0F:691E Function_3e91e
+0F:6963 Function_3e963
+0F:6F19 Function_3ef19
+0F:7019 Function_3f019
+0F:704A Function_3f04a
+0F:7068 Function_3f068
+10:4000 Function_40000
+10:40A6 ShowPokedexMenu
+10:4AC7 Function_40ac7
+10:4B5C Function_40b5c
+10:5FA1 Function_41fa1
+10:61F8 Function_421f8
+10:6252 Function_42252
+14:4000 Function_50000
+14:4073 Function_50073
+14:40A0 Function_500a0
+14:40C6 Function_500c6
+14:4244 Function_50244
+14:4248 Function_50248
+14:42B5 Function_502b5
+14:469E Function_5069e
+14:46D4 Function_506d4
+14:4771 Function_50771
+14:4774 Function_50774
+14:481F Function_5081f
+14:48C4 Function_508c4
+14:4B92 Function_50b92
+14:4BCD Function_50bcd
+14:4BFE Function_50bfe
+14:4ED9 Function_50ed9
+23:4349 OverworldFadeOut
+23:44BE Function_8c4be
+23:4940 Function_8c940
+23:49C6 Function_8c9c6
+23:60CC MenuMonIconGfx
+30:4000 OverworldSpriteGfx
+32:4000 Function_c8000
+32:76FF Function_cb6ff
+32:7710 Function_cb710
+32:7733 Function_cb733
+33:4000 Function_cc000
+33:4000 Function_cc000_2
+33:4001 Function_cc001
+3A:4D9D _PlayCryHeader
+3A:4E22 _PlaySFX
+3A:4F11 LoadChannel
+3A:4F6C LoadMusicByte
+3A:52C7 Music
+3F:5B66 Function_fdb66
+3F:64CE MonsterTest
+3F:654E PicTest
+3F:6750 PicTestMenu
+3F:6755 PicTestMenu.loop
+00:C5E8 wMapScriptNumber
+00:CA22 wTrainerClass
+00:CBF2 wWindowData
+00:CBF2 wWindowStackPointer
+00:CC02 wMenuDataHeader
+00:CC12 wMenuData2
+00:CC22 wMenuData3
+00:CDBE wTargetMapUnk
+00:CDBF wTargetMapGroup
+00:CDC0 wTargetMapId
+00:CE62 wTextBoxFlags
+00:CE67 wPlayerName
+01:D165 wTMCounts
+01:D19E wItems
+01:D258 wRivalName
+01:D264 wPlayerBikeSurfState
+01:D656 wMapGroup
+01:D657 wMapId
+01:D66A wMapScriptPtr
+01:D7D2 wPartyMonOT
+01:DA3B wUnk_DA3B
diff --git a/shim_gold_debug.sym b/shim_gold_debug.sym
new file mode 100644
index 0000000..8bcabbd
--- /dev/null
+++ b/shim_gold_debug.sym
@@ -0,0 +1,179 @@
+00:0884 UpdateJoypad
+00:0D0A LoadFont
+00:0D1A LoadFontExtra
+00:0E2A ClearTileMap
+00:0E3D DrawTextBox
+00:0E93 PlaceString
+00:0E94 PlaceNextChar
+00:0E9D CheckDict
+00:10A6 PlaceHLTextAtBC
+00:10B7 DoTextUntilTerminator
+00:10C1 DoTextUntilTerminator.continue
+00:10E2 Text_TX
+00:120C TextCommands
+00:1D49 LoadMenuHeader
+00:1E58 OpenMenu
+00:1F9E ClearWindowData
+00:1FCC ClearWindowData.bytefill
+00:20FF RunMapScript
+00:232C LoadMapWarp
+00:23E5 OverworldFadeIn
+00:3270 Random
+00:3621 WaitBGMap
+00:362B SetPalettes
+00:3634 ClearPalettes
+00:363C GetMemSGBLayout
+00:363E GetSGBLayout
+00:3648 SetHPPal
+00:3655 SetHPPal.done
+00:366C Function_366c
+00:36C8 NamesPointers
+00:36E0 GetName
+00:3D86 WaitSFX
+00:3D87 WaitSFX.wait
+00:3DA5 MaxVolume
+00:3DAB LowVolume
+00:3DB1 VolumeOff
+00:3DB6 UpdateSoundNTimes
+00:3DBE FadeToMapMusic
+00:3DDC FadeToMapMusic.dontfade
+00:3DE1 PlayMapMusic
+00:3E00 PlayMapMusic.dontplay
+00:3E05 SpecialMapMusic
+00:3E14 SpecialMapMusic.state2
+00:3E19 SpecialMapMusic.normal
+00:3E1B GetMapMusic
+00:3E2E GetMapMusic.unk_3E2E
+00:3E32 Unk_3E32
+01:4031 Function_4031
+01:53CC MainMenu
+01:5D27 Function_5d27
+01:6445 Function_6445
+01:66B1 Function_66b1
+01:6713 Function_6713
+02:4786 Function_8786
+02:4856 DecompTownMapTilemap
+02:48DA DecompTownMapTilemap.tilemap
+02:4C7C DrawMap
+02:4DC2 TownMapGfx
+02:4F32 PokegearRadioGfx
+02:528B Function_928b
+02:5695 CheckSGB
+02:5695 Function_9695
+03:4791 DebugWarp
+03:479F DebugWarp.Destinations
+03:4D33 Function_cd33
+03:4D6F Function_cd6f
+03:4DE3 Function_cde3
+03:4DE3 Function_cde3_2
+03:4DE3 Function_cde3_3
+03:4DF9 Function_cdf9
+03:4E10 Function_ce10
+03:4E10 Function_ce10_2
+03:4E3C Function_ce3c
+03:4E7C Function_ce7c
+03:5886 Function_d886
+03:5A28 Function_da28
+03:5A4F Function_da4f
+03:5AC8 Function_dac8
+03:5C16 Function_dc16
+03:5CFC Function_dcfc
+03:5D5C Function_dd5c
+03:5E79 Function_de79
+03:5F7D Function_df7d
+03:5F91 Function_df91
+04:528F Function_1128f
+04:52C1 Function_112c1
+04:5677 DoPlayerMovement
+04:640B Function_1240b
+05:43E0 Function_143e0
+05:457A Function_1457a
+05:45B8 Function_145b8
+05:45DE Function_145de
+05:46DC Function_146dc
+0A:4C98 Function_28c98
+0A:4D6E Function_28d6e
+0A:4DA4 Function_28da4
+0B:5663 Function_2d663
+0E:4B78 LoadTrainerClassName
+0E:4BA0 LoadTrainerClassName.got_name
+0E:4BA9 LoadTrainerClass
+0F:508C Function_3d08c
+0F:55CE Function_3d5ce
+0F:567C Function_3d67c
+0F:61A4 Function_3e1a4
+0F:6874 Function_3e874
+0F:691E Function_3e91e
+0F:6963 Function_3e963
+0F:6F19 Function_3ef19
+0F:7019 Function_3f019
+0F:704A Function_3f04a
+0F:7068 Function_3f068
+10:4000 Function_40000
+10:40A6 ShowPokedexMenu
+10:4AC7 Function_40ac7
+10:4B5C Function_40b5c
+10:5FA1 Function_41fa1
+10:61F8 Function_421f8
+10:6252 Function_42252
+14:4000 Function_50000
+14:4073 Function_50073
+14:40A0 Function_500a0
+14:40C6 Function_500c6
+14:4244 Function_50244
+14:4248 Function_50248
+14:42B5 Function_502b5
+14:469E Function_5069e
+14:46D4 Function_506d4
+14:4771 Function_50771
+14:4774 Function_50774
+14:481F Function_5081f
+14:48C4 Function_508c4
+14:4B92 Function_50b92
+14:4BCD Function_50bcd
+14:4BFE Function_50bfe
+14:4ED9 Function_50ed9
+23:4349 OverworldFadeOut
+23:44BE Function_8c4be
+23:4940 Function_8c940
+23:49C6 Function_8c9c6
+23:60CC MenuMonIconGfx
+30:4000 OverworldSpriteGfx
+32:4000 Function_c8000
+32:76FF Function_cb6ff
+32:7710 Function_cb710
+32:7733 Function_cb733
+33:4000 Function_cc000
+33:4000 Function_cc000_2
+33:4001 Function_cc001
+3A:4D9D _PlayCryHeader
+3A:4E22 _PlaySFX
+3A:4F11 LoadChannel
+3A:4F6C LoadMusicByte
+3A:52C7 Music
+3F:5B66 Function_fdb66
+3F:64CE MonsterTest
+3F:654E PicTest
+3F:6750 PicTestMenu
+3F:6755 PicTestMenu.loop
+00:C5E8 wMapScriptNumber
+00:CA22 wTrainerClass
+00:CBF2 wWindowData
+00:CBF2 wWindowStackPointer
+00:CC02 wMenuDataHeader
+00:CC12 wMenuData2
+00:CC22 wMenuData3
+00:CDBE wTargetMapUnk
+00:CDBF wTargetMapGroup
+00:CDC0 wTargetMapId
+00:CE62 wTextBoxFlags
+00:CE67 wPlayerName
+01:D165 wTMCounts
+01:D19E wItems
+01:D258 wRivalName
+01:D264 wPlayerBikeSurfState
+01:D656 wMapGroup
+01:D657 wMapId
+01:D66A wMapScriptPtr
+01:D7D2 wPartyMonOT
+01:DA3B wUnk_DA3B
diff --git a/shim_silver.sym b/shim_silver.sym
new file mode 100644
index 0000000..cc7b9a7
--- /dev/null
+++ b/shim_silver.sym
@@ -0,0 +1,179 @@
+00:0884 UpdateJoypad
+00:0D0A LoadFont
+00:0D1A LoadFontExtra
+00:0E2A ClearTileMap
+00:0E3D DrawTextBox
+00:0E93 PlaceString
+00:0E94 PlaceNextChar
+00:0E9D CheckDict
+00:10A6 PlaceHLTextAtBC
+00:10B7 DoTextUntilTerminator
+00:10C1 DoTextUntilTerminator.continue
+00:10E2 Text_TX
+00:120C TextCommands
+00:1D49 LoadMenuHeader
+00:1E58 OpenMenu
+00:1F9E ClearWindowData
+00:1FCC ClearWindowData.bytefill
+00:20E1 RunMapScript
+00:230E LoadMapWarp
+00:23C7 OverworldFadeIn
+00:3234 Random
+00:3621 WaitBGMap
+00:362B SetPalettes
+00:3634 ClearPalettes
+00:363C GetMemSGBLayout
+00:363E GetSGBLayout
+00:360C SetHPPal
+00:3619 SetHPPal.done
+00:3630 Function_366c
+00:36C8 NamesPointers
+00:36E0 GetName
+00:3D86 WaitSFX
+00:3D87 WaitSFX.wait
+00:3DA5 MaxVolume
+00:3DAB LowVolume
+00:3DB1 VolumeOff
+00:3DB6 UpdateSoundNTimes
+00:3DBE FadeToMapMusic
+00:3DDC FadeToMapMusic.dontfade
+00:3DE1 PlayMapMusic
+00:3E00 PlayMapMusic.dontplay
+00:3E05 SpecialMapMusic
+00:3E14 SpecialMapMusic.state2
+00:3E19 SpecialMapMusic.normal
+00:3E1B GetMapMusic
+00:3E2E GetMapMusic.unk_3E2E
+00:3E32 Unk_3E32
+01:4031 Function_4031
+01:53CC MainMenu
+01:5D27 Function_5d27
+01:6442 Function_6445
+01:66AE Function_66b1
+01:6710 Function_6713
+02:4786 Function_8786
+02:4856 DecompTownMapTilemap
+02:48DA DecompTownMapTilemap.tilemap
+02:4C7C DrawMap
+02:4DC2 TownMapGfx
+02:4F32 PokegearRadioGfx
+02:528B Function_928b
+02:5695 CheckSGB
+02:5695 Function_9695
+03:4791 DebugWarp
+03:479F DebugWarp.Destinations
+03:4D1B Function_cd33
+03:4D57 Function_cd6f
+03:4DCB Function_cde3
+03:4DCB Function_cde3_2
+03:4DCB Function_cde3_3
+03:4DE1 Function_cdf9
+03:4DF8 Function_ce10
+03:4DF8 Function_ce10_2
+03:4E24 Function_ce3c
+03:4E64 Function_ce7c
+03:586E Function_d886
+03:5A10 Function_da28
+03:5A37 Function_da4f
+03:5AB0 Function_dac8
+03:5BFE Function_dc16
+03:5CE4 Function_dcfc
+03:5D44 Function_dd5c
+03:5E61 Function_de79
+03:5F65 Function_df7d
+03:5F79 Function_df91
+04:528F Function_1128f
+04:52C1 Function_112c1
+04:5677 DoPlayerMovement
+04:640B Function_1240b
+05:43E0 Function_143e0
+05:457A Function_1457a
+05:45B8 Function_145b8
+05:45DE Function_145de
+05:46DC Function_146dc
+0A:4C98 Function_28c98
+0A:4D6E Function_28d6e
+0A:4DA4 Function_28da4
+0B:5663 Function_2d663
+0E:4B78 LoadTrainerClassName
+0E:4BA0 LoadTrainerClassName.got_name
+0E:4BA9 LoadTrainerClass
+0F:508C Function_3d08c
+0F:55CE Function_3d5ce
+0F:567C Function_3d67c
+0F:61A4 Function_3e1a4
+0F:6874 Function_3e874
+0F:691E Function_3e91e
+0F:6963 Function_3e963
+0F:6F19 Function_3ef19
+0F:7019 Function_3f019
+0F:704A Function_3f04a
+0F:7068 Function_3f068
+10:4000 Function_40000
+10:40A6 ShowPokedexMenu
+10:4AC7 Function_40ac7
+10:4B5C Function_40b5c
+10:5FA1 Function_41fa1
+10:61F8 Function_421f8
+10:6252 Function_42252
+14:4000 Function_50000
+14:4073 Function_50073
+14:40A0 Function_500a0
+14:40C6 Function_500c6
+14:4244 Function_50244
+14:4248 Function_50248
+14:42B5 Function_502b5
+14:469E Function_5069e
+14:46D4 Function_506d4
+14:4771 Function_50771
+14:4774 Function_50774
+14:481F Function_5081f
+14:48C4 Function_508c4
+14:4B92 Function_50b92
+14:4BCD Function_50bcd
+14:4BFE Function_50bfe
+14:4ED9 Function_50ed9
+23:4349 OverworldFadeOut
+23:44BE Function_8c4be
+23:4940 Function_8c940
+23:49C6 Function_8c9c6
+23:60CC MenuMonIconGfx
+30:4000 OverworldSpriteGfx
+32:4000 Function_c8000
+32:76FF Function_cb6ff
+32:7710 Function_cb710
+32:7733 Function_cb733
+33:4000 Function_cc000
+33:4000 Function_cc000_2
+33:4001 Function_cc001
+3A:4D9D _PlayCryHeader
+3A:4E22 _PlaySFX
+3A:4F11 LoadChannel
+3A:4F6C LoadMusicByte
+3A:52C7 Music
+3F:5B66 Function_fdb66
+3F:64CE MonsterTest
+3F:654E PicTest
+3F:6750 PicTestMenu
+3F:6755 PicTestMenu.loop
+00:C5E8 wMapScriptNumber
+00:CA22 wTrainerClass
+00:CBF2 wWindowData
+00:CBF2 wWindowStackPointer
+00:CC02 wMenuDataHeader
+00:CC12 wMenuData2
+00:CC22 wMenuData3
+00:CDBE wTargetMapUnk
+00:CDBF wTargetMapGroup
+00:CDC0 wTargetMapId
+00:CE62 wTextBoxFlags
+00:CE67 wPlayerName
+01:D165 wTMCounts
+01:D19E wItems
+01:D258 wRivalName
+01:D264 wPlayerBikeSurfState
+01:D656 wMapGroup
+01:D657 wMapId
+01:D66A wMapScriptPtr
+01:D7D2 wPartyMonOT
+01:DA3B wUnk_DA3B
diff --git a/shim_silver_debug.sym b/shim_silver_debug.sym
new file mode 100644
index 0000000..8bcabbd
--- /dev/null
+++ b/shim_silver_debug.sym
@@ -0,0 +1,179 @@
+00:0884 UpdateJoypad
+00:0D0A LoadFont
+00:0D1A LoadFontExtra
+00:0E2A ClearTileMap
+00:0E3D DrawTextBox
+00:0E93 PlaceString
+00:0E94 PlaceNextChar
+00:0E9D CheckDict
+00:10A6 PlaceHLTextAtBC
+00:10B7 DoTextUntilTerminator
+00:10C1 DoTextUntilTerminator.continue
+00:10E2 Text_TX
+00:120C TextCommands
+00:1D49 LoadMenuHeader
+00:1E58 OpenMenu
+00:1F9E ClearWindowData
+00:1FCC ClearWindowData.bytefill
+00:20FF RunMapScript
+00:232C LoadMapWarp
+00:23E5 OverworldFadeIn
+00:3270 Random
+00:3621 WaitBGMap
+00:362B SetPalettes
+00:3634 ClearPalettes
+00:363C GetMemSGBLayout
+00:363E GetSGBLayout
+00:3648 SetHPPal
+00:3655 SetHPPal.done
+00:366C Function_366c
+00:36C8 NamesPointers
+00:36E0 GetName
+00:3D86 WaitSFX
+00:3D87 WaitSFX.wait
+00:3DA5 MaxVolume
+00:3DAB LowVolume
+00:3DB1 VolumeOff
+00:3DB6 UpdateSoundNTimes
+00:3DBE FadeToMapMusic
+00:3DDC FadeToMapMusic.dontfade
+00:3DE1 PlayMapMusic
+00:3E00 PlayMapMusic.dontplay
+00:3E05 SpecialMapMusic
+00:3E14 SpecialMapMusic.state2
+00:3E19 SpecialMapMusic.normal
+00:3E1B GetMapMusic
+00:3E2E GetMapMusic.unk_3E2E
+00:3E32 Unk_3E32
+01:4031 Function_4031
+01:53CC MainMenu
+01:5D27 Function_5d27
+01:6445 Function_6445
+01:66B1 Function_66b1
+01:6713 Function_6713
+02:4786 Function_8786
+02:4856 DecompTownMapTilemap
+02:48DA DecompTownMapTilemap.tilemap
+02:4C7C DrawMap
+02:4DC2 TownMapGfx
+02:4F32 PokegearRadioGfx
+02:528B Function_928b
+02:5695 CheckSGB
+02:5695 Function_9695
+03:4791 DebugWarp
+03:479F DebugWarp.Destinations
+03:4D33 Function_cd33
+03:4D6F Function_cd6f
+03:4DE3 Function_cde3
+03:4DE3 Function_cde3_2
+03:4DE3 Function_cde3_3
+03:4DF9 Function_cdf9
+03:4E10 Function_ce10
+03:4E10 Function_ce10_2
+03:4E3C Function_ce3c
+03:4E7C Function_ce7c
+03:5886 Function_d886
+03:5A28 Function_da28
+03:5A4F Function_da4f
+03:5AC8 Function_dac8
+03:5C16 Function_dc16
+03:5CFC Function_dcfc
+03:5D5C Function_dd5c
+03:5E79 Function_de79
+03:5F7D Function_df7d
+03:5F91 Function_df91
+04:528F Function_1128f
+04:52C1 Function_112c1
+04:5677 DoPlayerMovement
+04:640B Function_1240b
+05:43E0 Function_143e0
+05:457A Function_1457a
+05:45B8 Function_145b8
+05:45DE Function_145de
+05:46DC Function_146dc
+0A:4C98 Function_28c98
+0A:4D6E Function_28d6e
+0A:4DA4 Function_28da4
+0B:5663 Function_2d663
+0E:4B78 LoadTrainerClassName
+0E:4BA0 LoadTrainerClassName.got_name
+0E:4BA9 LoadTrainerClass
+0F:508C Function_3d08c
+0F:55CE Function_3d5ce
+0F:567C Function_3d67c
+0F:61A4 Function_3e1a4
+0F:6874 Function_3e874
+0F:691E Function_3e91e
+0F:6963 Function_3e963
+0F:6F19 Function_3ef19
+0F:7019 Function_3f019
+0F:704A Function_3f04a
+0F:7068 Function_3f068
+10:4000 Function_40000
+10:40A6 ShowPokedexMenu
+10:4AC7 Function_40ac7
+10:4B5C Function_40b5c
+10:5FA1 Function_41fa1
+10:61F8 Function_421f8
+10:6252 Function_42252
+14:4000 Function_50000
+14:4073 Function_50073
+14:40A0 Function_500a0
+14:40C6 Function_500c6
+14:4244 Function_50244
+14:4248 Function_50248
+14:42B5 Function_502b5
+14:469E Function_5069e
+14:46D4 Function_506d4
+14:4771 Function_50771
+14:4774 Function_50774
+14:481F Function_5081f
+14:48C4 Function_508c4
+14:4B92 Function_50b92
+14:4BCD Function_50bcd
+14:4BFE Function_50bfe
+14:4ED9 Function_50ed9
+23:4349 OverworldFadeOut
+23:44BE Function_8c4be
+23:4940 Function_8c940
+23:49C6 Function_8c9c6
+23:60CC MenuMonIconGfx
+30:4000 OverworldSpriteGfx
+32:4000 Function_c8000
+32:76FF Function_cb6ff
+32:7710 Function_cb710
+32:7733 Function_cb733
+33:4000 Function_cc000
+33:4000 Function_cc000_2
+33:4001 Function_cc001
+3A:4D9D _PlayCryHeader
+3A:4E22 _PlaySFX
+3A:4F11 LoadChannel
+3A:4F6C LoadMusicByte
+3A:52C7 Music
+3F:5B66 Function_fdb66
+3F:64CE MonsterTest
+3F:654E PicTest
+3F:6750 PicTestMenu
+3F:6755 PicTestMenu.loop
+00:C5E8 wMapScriptNumber
+00:CA22 wTrainerClass
+00:CBF2 wWindowData
+00:CBF2 wWindowStackPointer
+00:CC02 wMenuDataHeader
+00:CC12 wMenuData2
+00:CC22 wMenuData3
+00:CDBE wTargetMapUnk
+00:CDBF wTargetMapGroup
+00:CDC0 wTargetMapId
+00:CE62 wTextBoxFlags
+00:CE67 wPlayerName
+01:D165 wTMCounts
+01:D19E wItems
+01:D258 wRivalName
+01:D264 wPlayerBikeSurfState
+01:D656 wMapGroup
+01:D657 wMapId
+01:D66A wMapScriptPtr
+01:D7D2 wPartyMonOT
+01:DA3B wUnk_DA3B
diff --git a/tools/Makefile b/tools/Makefile
index 6c49ccb..c591d9c 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -4,7 +4,8 @@ CFLAGS := -O3 -std=c99 -Wall -Wextra
tools := \
pkmncompress \
- gfx
+ gfx \
+ make_shim
all: $(tools)
diff --git a/tools/make_shim.c b/tools/make_shim.c
new file mode 100644
index 0000000..8fdd0e7
--- /dev/null
+++ b/tools/make_shim.c
@@ -0,0 +1,163 @@
+#include <stdio.h>
+#include <getopt.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+struct Section {
+ unsigned short end;
+ bool invalid;
+ char * name;
+ bool banked;
+};
+
+typedef struct Section section_t;
+
+// These functions are like strspn and strcspn, but from the right of the string rather than the left.
+size_t strrspn(const char *s1, const char *s2) {
+ const char * _s1 = s1;
+ const char * _s2;
+
+ while (*_s1++);
+ _s1--;
+ while (_s1 > s1) {
+ for (_s2 = s2; *_s2; _s2++) {
+ if (_s1[-1] == *_s2) {
+ break;
+ }
+ }
+ if (*_s2 == 0)
+ break;
+ _s1--;
+ }
+
+ return _s1 - s1;
+}
+
+size_t strrcspn(const char *s1, const char *s2) {
+ const char * _s1 = s1;
+ const char * _s2;
+
+ while (*_s1++);
+ _s1--;
+ while (_s1 > s1) {
+ for (_s2 = s2; *_s2; _s2++) {
+ if (_s1[-1] == *_s2)
+ break;
+ }
+ if (*_s2)
+ break;
+ _s1--;
+ }
+
+ return _s1 - s1;
+}
+
+#define RIP(errmsg) { \
+ errno = EIO; \
+ perror(errmsg); \
+ if (file) fclose(file); \
+ if (line) free(line); \
+ return 1; \
+}
+
+int main(int argc, char * argv[]) {
+ int ch;
+ size_t lsize = 0;
+ char * line = NULL;
+
+ section_t section_list[] = {
+ {0x4000, false, "ROM0", false},
+ {0x8000, false, "ROMX", true},
+ {0xA000, false, "VRAM", true},
+ {0xC000, false, "SRAM", true},
+ {0xD000, false, "WRAM0", false},
+ {0xE000, false, "WRAMX", true},
+ {0xFE00, true, "Echo RAM", false},
+ {0xFEA0, false, "OAM", false},
+ {0xFF80, true, "FEXX / IO", false},
+ {0xFFFF, false, "HRAM", false},
+ {}
+ };
+
+ while ((ch = getopt(argc, argv, "wdt")) != -1) {
+ switch (ch) {
+ case 'w':
+ case 'd':
+ section_list[4].end = 0xE000;
+ break;
+ case 't':
+ section_list[0].end = 0x8000;
+ break;
+ }
+ }
+
+ for (int arg_idx = optind; arg_idx < argc; arg_idx++) {
+ FILE * file = fopen(argv[arg_idx], "r");
+ if (file == NULL)
+ RIP("file io");
+ while (getline(&line, &lsize, file) > 0) {
+ unsigned short bank = 0;
+ unsigned short pointer = 0;
+ char * symbol = NULL;
+ char * end;
+ char * addr_p;
+
+ // line = line.split(";")[0].strip()
+ line += strspn(line, " \t\n");
+ end = strchr(line, ';');
+ if (end) *end = 0;
+ line[strrspn(line, " \t\n")] = 0;
+ if (!*line)
+ continue;
+
+ // Get the bank, address, and symbol
+ end = line + strcspn(line, " \t\n");
+ symbol = end + strspn(end, " \t\n");
+ if (!*symbol)
+ RIP("parse");
+ *end = 0;
+ addr_p = strchr(line, ':');
+ if (!addr_p)
+ RIP("parse");
+ *addr_p++ = 0;
+ pointer = strtoul(addr_p, &end, 16);
+ if (pointer == 0 && end == addr_p)
+ RIP("parse");
+ bank = strtoul(line, &end, 16);
+ if (bank == 0 && end == line)
+ RIP("parse");
+
+ // Main loop
+ const char * section = NULL;
+ section_t * section_type;
+
+ for (section_type = section_list; section_type->end; section_type++) {
+ if (pointer < section_type->end) {
+ if (section_type->invalid) {
+ fprintf(stderr, "Warning: cannot shim '%s' in section type '%s'\n", symbol, section_type->name);
+ } else {
+ section = section_type->name;
+ if (!section_type->banked)
+ bank = 0;
+ }
+ break;
+ }
+ }
+
+ if (section == NULL)
+ // Found section, but cannot shim it
+ continue;
+
+ printf("SECTION \"Shim for %s\", %s[$%04X]", symbol, section, pointer);
+ if (bank)
+ printf(", BANK[$%04X]", bank);
+ printf("\n%s::\n\n", symbol);
+ fflush(stdout);
+ }
+ fclose(file);
+ }
+ free(line);
+ return 0;
+}
diff --git a/tools/make_shim.py b/tools/make_shim.py
index d5e6e00..65d9362 100644
--- a/tools/make_shim.py
+++ b/tools/make_shim.py
@@ -1,60 +1,40 @@
#!/usr/bin/env python
from __future__ import print_function
-from sys import argv, stderr, exit
-
-
-section_list = [
- {'end': 0x4000, 'invalid': False, 'name': "ROM0", 'banked': False},
- {'end': 0x8000, 'invalid': False, 'name': "ROMX", 'banked': True},
- {'end': 0xA000, 'invalid': False, 'name': "VRAM", 'banked': True},
- {'end': 0xC000, 'invalid': False, 'name': "SRAM", 'banked': True},
- {'end': 0xD000, 'invalid': False, 'name': "WRAM0", 'banked': False},
- {'end': 0xE000, 'invalid': False, 'name': "WRAMX", 'banked': True},
- {'end': 0xFE00, 'invalid': True , 'name': "Echo RAM"},
- {'end': 0xFEA0, 'invalid': False, 'name': "OAM", 'banked': False},
- {'end': 0xFF80, 'invalid': True , 'name': "FEXX / IO"},
- {'end': 0xFFFF, 'invalid': False, 'name': "HRAM", 'banked': False}
-]
-
-
-argv_id = 1
-file_list = []
-options = []
-while argv_id < len(argv):
- arg = argv[argv_id]
-
- if arg[0] != '-':
- file_list.append(arg)
- argv_id += 1
- continue
-
- # An empty '--' stops parsing arguments
- if arg == '--':
- argv_id += 1
- break
-
- if arg[1] == '-':
- options.append(option[2:])
- elif arg[1] != '-':
- for option in arg[1:]:
- options.append(option)
-
- argv_id += 1
-
-# Add remaining files to the list
-for arg in argv[argv_id:]:
- file_list.append(arg)
-
-
-if 'w' in options or 'd' in options:
- section_list[4]['end'] = 0xE000
-
-if 't' in options:
- section_list[0]['end'] = 0x8000
-
-
-for file_name in file_list:
+import argparse
+from sys import stderr
+from collections import OrderedDict, namedtuple
+
+Section = namedtuple('Section', ('end', 'invalud', 'banked'))
+section_list = OrderedDict(
+ ROM0=Section(0x4000, False, False),
+ ROMX=Section(0x8000, False, True),
+ VRAM=Section(0xA000, False, True),
+ SRAM=Section(0xC000, False, True),
+ WRAM0=Section(0xD000, False, False),
+ WRAMX=Section(0xE000, False, True),
+ EchoRAM=Section(0xFE00, True, False),
+ OAM=Section(0xFEA0, False, False),
+ IO=Section(0xFF80, True, False),
+ HRAM=Section(0xFFFF, False, False)
+)
+
+parser = argparse.ArgumentParser()
+parser.add_argument('files', nargs='+', type=argparse.FileType())
+parser.add_argument('-w', action='store_true')
+parser.add_argument('-d', action='store_true')
+parser.add_argument('-t', action='store_true')
+args = parser.parse_args()
+
+
+if args.w or args.d:
+ section_list['WRAM0'].end = 0xE000
+
+if args.t:
+ section_list['ROM0'].end = 0x8000
+
+
+for file_name in args.files:
for line in open(file_name, "rt"):
# Strip out the comment
@@ -68,19 +48,19 @@ for file_name in file_list:
bank, pointer = address.split(":")
bank = int(bank, 16)
pointer = int(pointer, 16)
- except:
+ except ValueError:
print("Error: Cannot parse line: %s" % line, file=stderr)
- exit(1)
+ raise from None
section = None
- for section_type in section_list:
- if pointer < section_type['end']:
- if section_type['invalid']:
+ for name, section_type in section_list.items():
+ if pointer < section_type.end:
+ if section_type.invalid:
print("Warning: cannot shim '%s' in section type '%s'" % (symbol, section_type['name']), file=stderr)
section = False
else:
- section = section_type['name']
- if not section_type['banked']:
+ section = name
+ if not section_type.banked:
bank = None
break
else:
diff --git a/wram.asm b/wram.asm
index 001481f..745f71e 100644
--- a/wram.asm
+++ b/wram.asm
@@ -94,6 +94,11 @@ wVBCopyDoubleSize:: ds 1
wVBCopyDoubleSrc:: ds 2
wVBCopyDoubleDst:: ds 2
+
+SECTION "CBD2", WRAM0[$CBD2]
+wcbd2:: ; cbd2
+ ds $14
+
SECTION "CC33", WRAM0[$CC33] ; Please merge when more is disassembled
wVBlankOccurred: db