diff options
47 files changed, 1334 insertions, 521 deletions
@@ -13,7 +13,7 @@ *.pic *.pcm *.map -pokegold-spaceworld.sym +poke*_spaceworld.sym shim.asm *~ @@ -25,6 +25,7 @@ tools/pkmncompress tools/gfx *.pyc build/ +.idea/ coverage.png coverage.log @@ -1,20 +1,31 @@ -BUILD := build +include config.mk + +BUILDBASE := build +BUILD := $(BUILDBASE) 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 := +sort_sym := tools/sort_symfile.sh +#sort_sym := $(PYTHON3) tools/sort_sym.py -ROMS := pokegold-spaceworld.gb +ROM := poke$(BUILD_NAME)-spaceworld.gb +ROMS := $(foreach r, gold gold_debug silver silver_debug, poke$(r)-spaceworld.gb) +# Pokemon Gold Debug BASEROM := baserom.gb DIRS := home engine data audio OBJS := $(addprefix $(BUILD)/, gfx.o sram.o wram.o hram.o shim.o) +SHIM := shim.sym +CORRECTEDROM := $(ROM:%.gb=%-correctheader.gb) CORRECTEDROMS := $(ROMS:%.gb=%-correctheader.gb) rwildcard = $(foreach d, $(wildcard $1*), $(filter $(subst *, %, $2), $d) $(call rwildcard, $d/, $2)) @@ -30,7 +41,7 @@ GFX := $(patsubst %.png, $(BUILD)/%.2bpp, \ .SECONDEXPANSION: .PHONY: all -all: $(ROMS) $(CORRECTEDROMS) compare +all: $(ROM) $(CORRECTEDROM) compare .PHONY: compare compare: $(ROMS) @@ -41,13 +52,13 @@ tools tools/pkmncompress tools/gfx: $(MAKE) -C tools/ .PHONY: coverage -coverage: tools/disasm_coverage.py $(ROMS) - $(PYTHON) $< -m $(ROMS:.gb=.map) -b 0x40 +coverage: tools/disasm_coverage.py $(ROM) + $(PYTHON3) $< -m $(ROM:.gb=.map) -b 0x40 # Remove files generated by the build process. .PHONY: clean clean: - rm -rf $(ROMS) $(BUILD) $(ROMS:.gb=.sym) $(ROMS:.gb=.map) $(CORRECTEDROMS) + rm -rf $(ROMS) $(CORRECTEDROMS) $(BUILDBASE) $(ROMS:.gb=.sym) $(ROMS:.gb=.map) $(CORRECTEDROMS) make -C tools clean # Remove files except for graphics. @@ -56,21 +67,20 @@ mostlyclean: rm -rf $(ROMS) $(OBJS) $(ROMS:.gb=.sym) $(ROMS:.gb=.map) $(CORRECTEDROMS) find . \( -iname '*.d' \) -exec rm {} + -$(ROMS): $(OBJS) | baserom.gb +$(ROM): $(OBJS) | $(BASEROM) $(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" $@ - tools/sort_symfile.sh $(@:.gb=.sym) + $(RGBFIX) -f lh -k 01 -l 0x33 -m 0x03 -p 0 -r 3 -t "POKEMON2$(GAME_VERSION)" $@ + $(sort_sym) $(@:.gb=.sym) -baserom.gb: +$(BASEROM): @echo "Please obtain a copy of Gold_debug.sgb and put it in this directory as $@" @exit 1 -$(CORRECTEDROMS): %-correctheader.gb: %.gb +$(BUILD)/shim.asm: tools/make_shim $(SHIM) tools/make_shim | $$(dir $$@) + tools/make_shim -w $(filter-out $<, $^) > $@ +$(CORRECTEDROM): %-correctheader.gb: %.gb cp $< $@ - $(RGBFIX) -f h -m 0x10 $@ - -$(BUILD)/shim.asm: tools/make_shim.py shim.sym | $$(dir $$@) - $(PYTHON) tools/make_shim.py -w -- $(filter-out $<, $^) > $@ + $(RGBFIX) -f hg -m 0x10 $@ $(BUILD)/gfx.o: | $(GFX) $(BUILD)/%.o: $(BUILD)/%.asm | $$(dir $$@) @@ -79,8 +89,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/trainer_card/trainer_card.2bpp: tools/gfx += --trim-whitespace $(BUILD)/gfx/minigames/slots.2bpp: tools/gfx += --trim-whitespace @@ -110,3 +122,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 @@ -1,6 +1,8 @@ WIP disassembly of the Spaceworld 1997 Gold proto -baserom.gb is Gold_debug.sgb - -md5sum `2eadbed83b775c097ff79e5128d1184f` +It attempts to build the following ROMs: +pokegold_spaceworld.gb (MD5: 3c407114de28d17b7113a2c0cee9a37c) +pokegold_debug_spaceworld.gb (MD5: 2eadbed83b775c097ff79e5128d1184f) +pokesilver_spaceworld.gb (MD5: c52a677c35f15320d5b495e14809f00d) +pokesilver_debug_spaceworld.gb (MD5: fa65d3759bb17c489de171a598ba4913) diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..7f52d90 --- /dev/null +++ b/config.mk @@ -0,0 +1,25 @@ +### Build Configuration ### + +# Default variables +GAME_VERSION ?= GOLD +DEBUG ?= 1 +COMPARE ?= 1 + +# For now, only support building Gold Debug. +# Uncomment these to support other ROMs. + +## 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 a48579c..942af41 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 8dd6d54..0cc8d67 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 + 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 +GiveItemPredef:: dbw 3, GiveItem - 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_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 39d115b..cf654c3 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 ; YELLOW_BAR RGB 28,28,28, 30,26,15, 26,10,06, 04,04,04 ; RED_BAR 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 c264733..4514b38 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) HayatoGroup:: ; Leftover Youngster data from Red/Blue db 11, MON_KORATTA, MON_ARBO, 0 @@ -399,3 +400,194 @@ KimonoGirlGroup:: db "こうめ@", TRAINERTYPE_ITEM_MOVES db 10, DEX_PIPPI, ITEM_NONE, MOVE_CHARM, MOVE_SWEET_KISS, MOVE_POUND, MOVE_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/data/wild.asm b/data/wild.asm index d827686..515985d 100644 --- a/data/wild.asm +++ b/data/wild.asm @@ -7,9 +7,15 @@ GrassWildMons:: ; f:6a3c db $01, $01 ; map group, map id db 8 percent, 8 percent, 8 percent ; encounter rates: morn/day/nite ; morn +if def(GOLD) db 7, DEX_SUNNY db 3, DEX_SUNNY db 5, DEX_SUNNY +else + db 8, DEX_POPPO + db 8, DEX_POPPO + db 7, DEX_POPPO +endc db 5, DEX_PIKACHU db 5, DEX_POPPO db 5, DEX_POPPO @@ -17,23 +23,38 @@ GrassWildMons:: ; f:6a3c db 4, DEX_KORATTA db 6, DEX_KIRINRIKI db 4, DEX_KIRINRIKI +if def(GOLD) db 4, DEX_HANEKO +else + db 4, DEX_MARIL +endc db 4, DEX_POPPO db 8, DEX_KORATTA ; nite db 7, DEX_KORATTA db 5, DEX_KORATTA db 5, DEX_KORATTA +if def(GOLD) db 7, DEX_KORATTA db 8, DEX_KORATTA +else + db 5, DEX_HOHO + db 3, DEX_HOHO +endc db 5, DEX_PIKACHU db $01, $02 ; map group, map id db 8 percent, 8 percent, 8 percent ; encounter rates: morn/day/nite ; morn +if def(GOLD) db 6, DEX_SUNNY db 6, DEX_SUNNY db 6, DEX_SUNNY +else + db 8, DEX_POPPO + db 8, DEX_POPPO + db 6, DEX_POPPO +endc db 5, DEX_PIKACHU db 4, DEX_ARBO db 5, DEX_KORATTA @@ -41,13 +62,21 @@ GrassWildMons:: ; f:6a3c db 5, DEX_POPPO db 7, DEX_YOROIDORI db 5, DEX_KORATTA +if def(GOLD) db 8, DEX_HANEKO +else + db 8, DEX_MARIL +endc db 4, DEX_POPPO db 7, DEX_KORATTA ; nite db 7, DEX_KORATTA db 6, DEX_ARBO +if def(GOLD) db 6, DEX_KORATTA +else + db 6, DEX_HOHO +endc db 7, DEX_ARBO db 8, DEX_KORATTA db 5, DEX_PIKACHU @@ -593,13 +622,21 @@ GrassWildMons:: ; f:6a3c db 6, DEX_POPPO db 4, DEX_CATERPIE db 6, DEX_CATERPIE +if def(GOLD) db 6, DEX_HANEKO +else + db 6, DEX_MARIL +endc db 5, DEX_CATERPIE db 8, DEX_REDIBA ; nite db 4, DEX_TRANSEL db 6, DEX_KORATTA +if def(GOLD) db 6, DEX_CATERPIE +else + db 5, DEX_HOHO +endc db 6, DEX_REDIBA db 5, DEX_TRANSEL db 5, DEX_PIKACHU 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 @@ -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:: @@ -50,11 +58,17 @@ TrainerCardGFX:: INCBIN "gfx/trainer_card/trainer_card.2bpp" TrainerCardColonGFX:: INCBIN "gfx/trainer_card/colon.2bpp" ; 0x013381--0x013391 TrainerCardIDNoGFX:: INCBIN "gfx/trainer_card/id_no.2bpp" ; 0x013391--0x0133B1 TrainerCardIDNoGFXEnd:: -TrainerCardLeadersGFX:: INCBIN "gfx/trainer_card/leaders.2bpp" ; 0x0133B1--0x133BA1 - +TrainerCardLeadersGFX:: INCBIN "gfx/trainer_card/leaders.2bpp" ; 0x0133B1--0x013BA1 +if DEBUG || def(GOLD) db $18, $00 ; leftover of previous graphics - -Unreferenced_UnusedLeaderNameGFX:: INCBIN "gfx/trainer_card/unused_leader_name.2bpp" ; 0x1 +else + db $b2, $aa ; leftover of previous graphics? +endc + +if DEBUG +; Not sure how to parse this from the non-debug ROM, so I'll leave this be for now +Unreferenced_UnusedLeaderNameGFX:: INCBIN "gfx/trainer_card/unused_leader_name.2bpp" ; 0x13ba3 +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 Binary files differindex 2fda111..2fda111 100644 --- a/gfx/sgb/sgb_border.png +++ b/gfx/sgb/sgb_border_gold.png diff --git a/gfx/sgb/sgb_border_silver.png b/gfx/sgb/sgb_border_silver.png Binary files differnew file mode 100644 index 0000000..312af38 --- /dev/null +++ b/gfx/sgb/sgb_border_silver.png diff --git a/gfx/title/title.png b/gfx/title/title_gold.png Binary files differindex 1b6ba5d..1b6ba5d 100644 --- a/gfx/title/title.png +++ b/gfx/title/title_gold.png diff --git a/gfx/title/title_silver.png b/gfx/title/title_silver.png Binary files differnew file mode 100644 index 0000000..f7f8f6b --- /dev/null +++ b/gfx/title/title_silver.png diff --git a/home/audio.asm b/home/audio.asm index 5104582..bf3a6c5 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 1ad45f1..278013c 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 40f187a..489b375 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 dfb35ef..c916cbd 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 FarCopyBytes:: ; 32f7 ; Copy bc bytes from a:hl to de. diff --git a/home/farcall.asm b/home/farcall.asm index 106ca28..3fcf37f 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 38c2a31..ef4b745 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 - db $21, $C6 +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/items.asm b/home/items.asm index d5303c3..496b685 100755 --- a/home/items.asm +++ b/home/items.asm @@ -1,6 +1,10 @@ INCLUDE "constants.asm"
+if DEBUG
SECTION "AddItemToInventory", ROM0[$3259]
+else
+SECTION "AddItemToInventory", ROM0[$321D]
+endc
AddItemToInventory:: ; 3259
; function to add an item (in varying quantities) to the player's bag or PC box
@@ -25,7 +29,11 @@ AddItemToInventory:: ; 3259 pop bc
ret
+if DEBUG
SECTION "GiveItem", ROM0[$366C]
+else
+SECTION "GiveItem", ROM0[$3630]
+endc
GiveItem::
; Give player quantity c of item b,
@@ -44,7 +52,11 @@ GiveItem:: scf
ret
+if DEBUG
SECTION "GetItemName", ROM0[$376F]
+else
+SECTION "GetItemName", ROM0[$3733]
+endc
GetItemName:: ; 376F
; given an item ID at [wce37], store the name of the item into a string
@@ -69,7 +81,11 @@ GetItemName:: ; 376F pop hl
ret
+if DEBUG
SECTION "GetMachineName", ROM0[$378E]
+else
+SECTION "GetMachineName", ROM0[$3752]
+endc
GetMachineName::
; copies the name of the TM/HM in [wce37] to wcd26
diff --git a/home/jumptable.asm b/home/jumptable.asm index 8b345e2..15d414b 100644 --- a/home/jumptable.asm +++ b/home/jumptable.asm @@ -1,6 +1,10 @@ INCLUDE "constants.asm" +if DEBUG SECTION "Jumptable functions", ROM0[$35cd] +else +SECTION "Jumptable functions", ROM0[$3591] +endc CallJumptable:: ; 35cd (0:35cd) ; CallJumptable diff --git a/home/menu.asm b/home/menu.asm index e673b2d..e8b4eeb 100644 --- a/home/menu.asm +++ b/home/menu.asm @@ -1,6 +1,10 @@ +include "constants.asm" - +if DEBUG SECTION "Print Letter Delay", ROM0[$33a3] +else +SECTION "Print Letter Delay", ROM0[$3367] +endc PrintLetterDelay:: ; 33a3 (0:33a3) ld a, [wce5f] diff --git a/home/names.asm b/home/names.asm index 366d795..7ce5767 100644 --- a/home/names.asm +++ b/home/names.asm @@ -1,6 +1,10 @@ INCLUDE "constants.asm" +if DEBUG SECTION "GetNthString", ROM0[$3732] +else +SECTION "GetNthString", ROM0[$36F6] +endc GetNthString:: ; Return the address of the ath string starting from hl. diff --git a/engine/overworld.asm b/home/overworld.asm index 3f52f6e..2a4671a 100644 --- a/engine/overworld.asm +++ b/home/overworld.asm @@ -1,11 +1,16 @@ INCLUDE "constants.asm" +if DEBUG SECTION "Startmenu and Select Button Check", ROM0[$2C05] +else +SECTION "Startmenu and Select Button Check", ROM0[$2BDF] +endc OverworldStartButtonCheck:: ; 2c05 (0:2c05) ldh a, [hJoyState] bit START_F, a ret z +if DEBUG and (START | B_BUTTON) cp (START | B_BUTTON) jr nz, .regularMenu @@ -17,6 +22,7 @@ OverworldStartButtonCheck:: ; 2c05 (0:2c05) call FarCall_hl jr CheckStartmenuSelectHook .regularMenu +endc ld a, BANK(DisplayStartMenu) ld hl, DisplayStartMenu call FarCall_hl @@ -42,7 +48,11 @@ CheckStartmenuSelectHook: dec a ret +if DEBUG SECTION "Install StartMenu Hook Function", ROM0[$35EC] +else +SECTION "Install StartMenu Hook Function", ROM0[$35B0] +endc InstallStartmenuCloseAndSelectHook:: ; Install a function that is called as soon as diff --git a/home/pokemon.asm b/home/pokemon.asm index 35f12e3..6cf1eb5 100644 --- a/home/pokemon.asm +++ b/home/pokemon.asm @@ -1,8 +1,10 @@ INCLUDE "constants.asm" - +if DEBUG SECTION "3A4B", ROM0[$3A4B] - +else +SECTION "3A4B", ROM0[$3A0F] +endc GetMonHeader:: ; 3a4b (0:3a4b) ; copies the base stat data of a pokemon to wMonHeader ; INPUT: @@ -20,7 +22,7 @@ GetMonHeader:: ; 3a4b (0:3a4b) dec a ld bc, MonBaseStatsEnd - MonBaseStats ld hl, MonBaseStats - call AddAMulBC + call AddNTimes ld de, wMonHeader ld bc, MonBaseStatsEnd - MonBaseStats call CopyBytes @@ -45,8 +47,11 @@ GetMonHeader:: ; 3a4b (0:3a4b) pop bc ret - +if DEBUG SECTION "3AED", ROM0[$3AED] +else +SECTION "3AED", ROM0[$3AB1] +endc UncompressMonSprite:: ; 3aed (0:3aed) ; Uncompresses the front or back sprite of the specified mon diff --git a/home/predef.asm b/home/predef.asm index 92f8903..e6d5019 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/print_bcd.asm b/home/print_bcd.asm index eefb9f0..ed110e9 100644 --- a/home/print_bcd.asm +++ b/home/print_bcd.asm @@ -1,6 +1,10 @@ INCLUDE "constants.asm" -SECTION "BCD Functions", ROM0[$3ab2] +if DEBUG +SECTION "BCD Functions", ROM0[$3AB2] +else +SECTION "BCD Functions", ROM0[$3A76] +endc ; function to print a BCD (Binary-coded decimal) number ; de = address of BCD number diff --git a/home/print_hex.asm b/home/print_hex.asm index 0232211..8292884 100644 --- a/home/print_hex.asm +++ b/home/print_hex.asm @@ -1,6 +1,10 @@ INCLUDE "constants.asm" +if DEBUG SECTION "Print Hexadecimal functions", ROM0[$3597] +else +SECTION "Print Hexadecimal functions", ROM0[$355B] +endc PrintHexBytes: ; 3597 (0:3597) ; Print c hex bytes located at de to hl diff --git a/home/print_num.asm b/home/print_num.asm index b69191f..3ae1c10 100644 --- a/home/print_num.asm +++ b/home/print_num.asm @@ -1,6 +1,10 @@ INCLUDE "constants.asm" +if DEBUG SECTION "Number Printing Functions", ROM0[$3460] +else +SECTION "Number Printing Functions", ROM0[$3424] +endc PrintNumber:: ; 3460 (0:3460) ; function to print a number 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 9c15145..87f2335 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 de0d21c..5b9a6e1 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 @@ -27,10 +31,93 @@ _1FF4:: ; 1ff4 ret _2007:: ; 2007 - ld a, BANK(s0_a600) - call OpenSRAM - ld a, [s0_a600] - and 8 - ld [wce5f], a - call CloseSRAM - ret + ld a, BANK(s0_a600) + call OpenSRAM + ld a, [s0_a600] + and 8 + 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, hRTCHours + ld de, wcbd2 + call _20DC + ld hl, hRTCMinutes + ld de, wcbd2 + 3 + call _20DC + ldh a, [hRTCDays] + 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, [hRTCSeconds] + 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/home/util.asm b/home/util.asm index bfc4ce4..6591da2 100644 --- a/home/util.asm +++ b/home/util.asm @@ -1,6 +1,21 @@ INCLUDE "constants.asm" -SECTION "Misc Utility Functions", ROM0[$3429] +if DEBUG +SECTION "Misc Utility Functions", ROM0[$341F] +else +SECTION "Misc Utility Functions", 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 AddNTimes:: ; 3429 (0:3429) and a @@ -10,4 +25,17 @@ AddNTimes:: ; 3429 (0:3429) dec a jr nz, .asm_342b ret -; 0x3430
\ No newline at end of file +; 0x3430 + +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 @@ -6,8 +6,8 @@ hOAMDMA:: ; ff80 hRTCHours:: db ; ff8d hRTCMinutes:: db ; ff8e hRTCSeconds:: db ; ff8f - - ds 7 ; TODO +hRTCDays:: db ; ff90 + ds 6 ; TODO hVBlankCounter:: ; ff97 db @@ -1 +1,2 @@ 2eadbed83b775c097ff79e5128d1184f *pokegold-spaceworld.gb +8e509301f6db1f89fee85aead8ebf8d4 *pokegold-spaceworld-correctheader.gb @@ -1,26 +1,22 @@ -; ROM0 -00:032b UpdateTimeOfDayPalettes +00:032B UpdateTimeOfDayPalettes 00:0436 RTC 00:051C Reset -00:0d1a LoadFontExtra -00:0d0a LoadFont +00:0D0A LoadFont +00:0D1A LoadFontExtra 00:0E2A ClearTileMap -00:0e3d DrawTextBox +00:0E3D DrawTextBox 00:0E93 PlaceString 00:0E94 PlaceNextChar 00:0E9D CheckDict -00:1d49 LoadMenuHeader -00:1e58 OpenMenu +00:1D49 LoadMenuHeader +00:1E58 OpenMenu 00:1F9E ClearWindowData 00:1FCC ClearWindowData.bytefill - -00:20ff RunMapScript -00:232c LoadMapWarp -00:23e5 OverworldFadeIn +00:20FF RunMapScript +00:232C LoadMapWarp +00:23E5 OverworldFadeIn 00:2C05 StartMenuCheck - 00:3270 Random -00:3429 AddAMulBC 00:3621 WaitBGMap 00:362B SetPalettes 00:3634 ClearPalettes @@ -30,7 +26,6 @@ 00:3655 SetHPPal.done 00:36C8 NamesPointers 00:36E0 GetName -00:38E3 CheckRandomEncounter 00:39BA PlayCry 00:3D86 WaitSFX 00:3D87 WaitSFX.wait @@ -43,77 +38,146 @@ 00:3DE1 PlayMapMusic 00:3E00 PlayMapMusic.dontplay 00:3E05 SpecialMapMusic -00:3E14 SpecialMapMusic.state2 ; ? +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??? - ; ^-- it's a static assignment of music - ; according to some map metadata - +00:3E32 Unk_3E32 +01:4031 Function_4031 +01:53CC MainMenu +01:5D27 Function_5d27 01:6114 TitleScreenInputAndTimeout -01:53cc MainMenu - +01:6445 Function_6445 +01:66B1 Function_66b1 +01:6713 Function_6713 +02:4786 Function_8786 02:4856 DecompTownMapTilemap -02:48da DecompTownMapTilemap.tilemap ; compressed -02:4f32 PokegearRadioGfx -02:4c7c DrawMap -02:4dc2 TownMapGfx -02:5695 CheckSGB ; ? - +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:479F DebugWarp.Destinations 03:4AA1 AddItemToInventory_ - +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:5dbe DisplayStartMenu -04:6c58 CheckRegisteredItem - -0e:4b78 LoadTrainerClassName -0e:4ba0 LoadTrainerClassName.got_name -0e:4ba9 LoadTrainerClass - +04:5DBE DisplayStartMenu +04:640B Function_1240b +04:6C58 CheckRegisteredItem +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:4000 AnimateTilesetImpl 23:4349 OverworldFadeOut -23:60cc MenuMonIconGfx - +23:44BE Function_8c4be +23:4940 Function_8c940 +23:49C6 Function_8c9c6 +23:60CC MenuMonIconGfx 24:4000 SetClockDialog 24:4239 SlotMachineGame - +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:40E9 InGameDebugMenu -3f:64ce MonsterTest -3f:654e PicTest -3f:6750 PicTestMenu -3f:6755 PicTestMenu.loop - -;00:BFFF sWindowStackTop - -00:c5e8 wMapScriptNumber -00:ca22 wTrainerClass +3F:40E9 InGameDebugMenu +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:ce67 wPlayerName - -01:d165 wTMCounts -01:d19e wItems -01:d258 wRivalName +00:CDBE wTargetMapUnk +00:CDBF wTargetMapGroup +00:CDC0 wTargetMapId +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:D656 wMapGroup +01:D657 wMapId +01:D66A wMapScriptPtr 01:D7D2 wPartyMonOT -01:DA3B wUnk_DA3B ; In final, $DE7D in NamesPointers (6th entry) +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/tools/sort_sym.py b/tools/sort_sym.py new file mode 100644 index 0000000..f4674e8 --- /dev/null +++ b/tools/sort_sym.py @@ -0,0 +1,68 @@ +#!/usr/bin/python3.6 + +import argparse +from functools import total_ordering + + +@total_ordering +class GBSection: + ROM0 = 0 + ROMX = 1 + VRAM = 2 + SRAM = 3 + WRAM0 = 4 + WRAMX = 5 + + __thresholds__ = (0x4000, 0x8000, 0xa000, 0xc000, 0xd000, 0xe000) + + def __init__(self, addr): + self.ident = sum(x <= addr for x in self.__thresholds__) + + @property + def start(self): + if self.ident == self.ROM0: + return 0 + return self.__thresholds__[self.ident - 1] + + @property + def end(self): + return self.__thresholds__[self.ident] + + def __eq__(self, other): + return self.ident == other.ident + + def __lt__(self, other): + return self.ident < other.ident + + +def read_sym(filename): + with open(filename) as fp: + for line in fp: + try: + line, *rest = line.split(';') + pointer, name = line.split() + bank, addr = (int(part, 16) for part in pointer.split(':')) + yield bank, addr, name + except ValueError: + continue + + +def sort_key(args): + bank, addr, name = args + return GBSection(addr), bank, addr, name + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('symfile') + args = parser.parse_args() + + symbols = list(read_sym(args.symfile)) + symbols.sort(key=sort_key) + with open(args.symfile, 'w') as fp: + for bank, addr, name in symbols: + print(f'{bank:02X}:{addr:04X}', name, file=fp) + + +if __name__ == '__main__': + main() @@ -119,6 +119,10 @@ wVBCopyFarSrc:: ds 2 ; cb72 wVBCopyFarDst:: ds 2 ; cb74 wVBCopyFarSrcBank:: ds 1 ; cb76 +SECTION "CBD2", WRAM0[$CBD2] +wcbd2:: ; cbd2 + ds $14 + SECTION "CBF7", WRAM0[$CBF7] wActiveBackpackPocket:: db ; cbf7 @@ -132,7 +136,6 @@ SECTION "CC2A", WRAM0[$CC2A] wMenuCursorY:: db ; cc2a SECTION "CC32", WRAM0[$CC32] ; Please merge when more is disassembled - wVBlankJoyFrameCounter: db ; cc32 wVBlankOccurred: db ; cc33 |