diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2018-06-02 20:16:37 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2018-06-02 20:16:37 -0400 |
commit | 956d010d59ad225bea768aec172ccb56977b1775 (patch) | |
tree | 4385f7c50ebb09e747f9e2cac4bc900d925060d4 | |
parent | 513028a98e6225e39c53ea64e4f9c483b3abd55b (diff) |
Make the repository build all four ROMs
43 files changed, 1775 insertions, 547 deletions
@@ -24,3 +24,4 @@ tools/scan_includes tools/pkmncompress tools/gfx build/ +.idea/ @@ -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 @@ -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 @@ -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 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 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 @@ -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 @@ -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: @@ -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 |