summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2018-06-02 21:26:20 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2018-06-02 21:26:20 -0400
commit04883f4bf9fa6c0bf935f1aac95d5d48abe3bb30 (patch)
tree3ff95e7bbb62d0decfb9e2cba9e3d54f61013706
parent956d010d59ad225bea768aec172ccb56977b1775 (diff)
parent5fb7140613d6ea00ec1964fde18418c6257c2e27 (diff)
Merge branch 'master' into build_more_roms
-rw-r--r--.gitignore6
-rw-r--r--Makefile19
-rw-r--r--audio/engine.asm3
-rw-r--r--audio/song_header_pointers.inc14
-rwxr-xr-xaudio/songs/bicycle.asm724
-rwxr-xr-xaudio/songs/evolution.asm126
-rwxr-xr-xaudio/songs/heal.asm62
-rwxr-xr-xaudio/songs/leaderbattle.asm1415
-rwxr-xr-xaudio/songs/nidorinointro.asm347
-rwxr-xr-xaudio/songs/none.asm20
-rwxr-xr-xaudio/songs/oakintro.asm445
-rwxr-xr-xaudio/songs/route1.asm426
-rwxr-xr-xaudio/songs/spottedrocket.asm95
-rwxr-xr-xaudio/songs/title.asm695
-rwxr-xr-xaudio/songs/trainerbattle.asm1872
-rwxr-xr-xaudio/songs/victorytrainer.asm278
-rwxr-xr-xaudio/songs/viridiancity.asm677
-rw-r--r--charmap.asm169
-rw-r--r--constants.asm4
-rw-r--r--constants/audio_constants.asm18
-rw-r--r--constants/item_constants.asm4
-rw-r--r--constants/misc_constants.asm24
-rw-r--r--constants/move_constants.asm2
-rwxr-xr-xconstants/name_constants.asm2
-rwxr-xr-xconstants/palette_constants.asm28
-rw-r--r--constants/pokemon_constants.asm199
-rw-r--r--constants/serial.asm17
-rw-r--r--constants/sprite_constants.asm93
-rw-r--r--data/items/names.asm118
-rw-r--r--data/maps/landmarks.asm50
-rw-r--r--data/moves/names.asm4
-rw-r--r--data/pokemon/evos_attacks.asm28
-rw-r--r--data/pokemon/names.asm4
-rwxr-xr-xdata/pokemon/palettes.inc (renamed from data/pokemon_palettes.inc)0
-rw-r--r--data/predef_pointers.inc4
-rw-r--r--data/sprites/sprites.asm102
-rw-r--r--data/super_palettes.inc28
-rw-r--r--data/trainers/parties.asm326
-rw-r--r--data/wild.asm645
-rw-r--r--engine/landmarks.asm11
-rw-r--r--engine/link/place_waiting_text.asm2
-rw-r--r--engine/menu/main_menu.asm2
-rw-r--r--gfx.asm218
-rw-r--r--gfx/icons/egg.png (renamed from gfx/icons/tamago.png)bin234 -> 234 bytes
-rw-r--r--gfx/pokemon/annon_pics.asm104
-rw-r--r--gfx/sprites/blackbelt.pngbin0 -> 279 bytes
-rw-r--r--gfx/sprites/blue.pngbin0 -> 321 bytes
-rw-r--r--gfx/sprites/boulder.pngbin0 -> 293 bytes
-rw-r--r--gfx/sprites/bug_catcher_boy.pngbin0 -> 237 bytes
-rw-r--r--gfx/sprites/burglar.pngbin0 -> 292 bytes
-rw-r--r--gfx/sprites/captain.pngbin0 -> 227 bytes
-rw-r--r--gfx/sprites/clerk.pngbin0 -> 292 bytes
-rw-r--r--gfx/sprites/cooltrainer_f.pngbin0 -> 349 bytes
-rw-r--r--gfx/sprites/cooltrainer_m.pngbin0 -> 286 bytes
-rw-r--r--gfx/sprites/egg.pngbin0 -> 264 bytes
-rw-r--r--gfx/sprites/elder.pngbin0 -> 319 bytes
-rw-r--r--gfx/sprites/enoki.pngbin0 -> 555 bytes
-rw-r--r--gfx/sprites/evil_okido.pngbin0 -> 288 bytes
-rw-r--r--gfx/sprites/fisher.pngbin0 -> 308 bytes
-rw-r--r--gfx/sprites/fishing_guru.pngbin0 -> 269 bytes
-rw-r--r--gfx/sprites/frowning_man.pngbin0 -> 262 bytes
-rw-r--r--gfx/sprites/gantetsu.pngbin0 -> 309 bytes
-rw-r--r--gfx/sprites/gentleman.pngbin0 -> 264 bytes
-rw-r--r--gfx/sprites/girl.pngbin0 -> 325 bytes
-rw-r--r--gfx/sprites/gold.pngbin0 -> 305 bytes
-rw-r--r--gfx/sprites/gold_bike.pngbin0 -> 373 bytes
-rw-r--r--gfx/sprites/gold_skateboard.pngbin0 -> 351 bytes
-rw-r--r--gfx/sprites/gramps.pngbin0 -> 338 bytes
-rw-r--r--gfx/sprites/granny.pngbin0 -> 360 bytes
-rw-r--r--gfx/sprites/gym_guy.pngbin0 -> 295 bytes
-rw-r--r--gfx/sprites/hayato.pngbin0 -> 524 bytes
-rw-r--r--gfx/sprites/helmet.pngbin0 -> 272 bytes
-rw-r--r--gfx/sprites/kabigon.pngbin0 -> 346 bytes
-rw-r--r--gfx/sprites/kikuko.pngbin0 -> 289 bytes
-rw-r--r--gfx/sprites/laplace.pngbin0 -> 355 bytes
-rw-r--r--gfx/sprites/lass.pngbin0 -> 305 bytes
-rw-r--r--gfx/sprites/link_receptionist.pngbin0 -> 460 bytes
-rw-r--r--gfx/sprites/lizardon.pngbin0 -> 327 bytes
-rw-r--r--gfx/sprites/masaki.pngbin0 -> 307 bytes
-rw-r--r--gfx/sprites/medium.pngbin0 -> 261 bytes
-rw-r--r--gfx/sprites/mikan.pngbin0 -> 249 bytes
-rw-r--r--gfx/sprites/mohawk.pngbin0 -> 309 bytes
-rw-r--r--gfx/sprites/mom.pngbin0 -> 269 bytes
-rw-r--r--gfx/sprites/nanami.pngbin0 -> 277 bytes
-rw-r--r--gfx/sprites/nurse.pngbin0 -> 497 bytes
-rw-r--r--gfx/sprites/nyorobon.pngbin0 -> 268 bytes
-rw-r--r--gfx/sprites/officer.pngbin0 -> 285 bytes
-rw-r--r--gfx/sprites/okido.pngbin0 -> 305 bytes
-rw-r--r--gfx/sprites/old_link_receptionist.pngbin0 -> 290 bytes
-rw-r--r--gfx/sprites/paper.pngbin0 -> 269 bytes
-rw-r--r--gfx/sprites/pawou.pngbin0 -> 347 bytes
-rw-r--r--gfx/sprites/pippi.pngbin0 -> 317 bytes
-rw-r--r--gfx/sprites/poke_ball.pngbin0 -> 274 bytes
-rw-r--r--gfx/sprites/pokedex.pngbin0 -> 274 bytes
-rw-r--r--gfx/sprites/pokefan_f.pngbin0 -> 264 bytes
-rw-r--r--gfx/sprites/pokefan_m.pngbin0 -> 289 bytes
-rw-r--r--gfx/sprites/poppo.pngbin0 -> 354 bytes
-rw-r--r--gfx/sprites/receptionist.pngbin0 -> 237 bytes
-rw-r--r--gfx/sprites/red.pngbin0 -> 294 bytes
-rw-r--r--gfx/sprites/reds_mom.pngbin0 -> 281 bytes
-rw-r--r--gfx/sprites/rocker.pngbin0 -> 296 bytes
-rw-r--r--gfx/sprites/rocket_f.pngbin0 -> 253 bytes
-rw-r--r--gfx/sprites/rocket_m.pngbin0 -> 247 bytes
-rw-r--r--gfx/sprites/sage.pngbin0 -> 305 bytes
-rw-r--r--gfx/sprites/sailor.pngbin0 -> 307 bytes
-rw-r--r--gfx/sprites/sakaki.pngbin0 -> 265 bytes
-rw-r--r--gfx/sprites/scientist.pngbin0 -> 283 bytes
-rw-r--r--gfx/sprites/sidon.pngbin0 -> 350 bytes
-rw-r--r--gfx/sprites/silver.pngbin0 -> 300 bytes
-rw-r--r--gfx/sprites/silvers_mom.pngbin0 -> 262 bytes
-rw-r--r--gfx/sprites/super_nerd.pngbin0 -> 293 bytes
-rw-r--r--gfx/sprites/swimmer_f.pngbin0 -> 328 bytes
-rw-r--r--gfx/sprites/swimmer_m.pngbin0 -> 303 bytes
-rw-r--r--gfx/sprites/teacher.pngbin0 -> 283 bytes
-rw-r--r--gfx/sprites/tsukushi.pngbin0 -> 540 bytes
-rw-r--r--gfx/sprites/twin.pngbin0 -> 254 bytes
-rw-r--r--gfx/sprites/youngster.pngbin0 -> 281 bytes
-rw-r--r--gfx/trainer/akane.pngbin0 -> 413 bytes
-rw-r--r--gfx/trainer/beauty.pngbin0 -> 497 bytes
-rw-r--r--gfx/trainer/biker.pngbin0 -> 745 bytes
-rw-r--r--gfx/trainer/blackbelt.pngbin0 -> 580 bytes
-rw-r--r--gfx/trainer/blue.pngbin0 -> 440 bytes
-rw-r--r--gfx/trainer/bug_catcher_boy.pngbin0 -> 489 bytes
-rw-r--r--gfx/trainer/burglar.pngbin0 -> 505 bytes
-rw-r--r--gfx/trainer/engineer.pngbin0 -> 546 bytes
-rw-r--r--gfx/trainer/enoki.pngbin0 -> 447 bytes
-rw-r--r--gfx/trainer/firebreather.pngbin0 -> 621 bytes
-rw-r--r--gfx/trainer/fisher.pngbin0 -> 585 bytes
-rw-r--r--gfx/trainer/fledgling.pngbin0 -> 342 bytes
-rw-r--r--gfx/trainer/gama.pngbin0 -> 365 bytes
-rw-r--r--gfx/trainer/green.pngbin0 -> 423 bytes
-rw-r--r--gfx/trainer/hayato.pngbin0 -> 663 bytes
-rw-r--r--gfx/trainer/juggler.pngbin0 -> 595 bytes
-rw-r--r--gfx/trainer/kimonogirl.pngbin0 -> 531 bytes
-rw-r--r--gfx/trainer/kurt.pngbin0 -> 472 bytes
-rw-r--r--gfx/trainer/lass.pngbin0 -> 500 bytes
-rw-r--r--gfx/trainer/medium.pngbin0 -> 665 bytes
-rw-r--r--gfx/trainer/mikan.pngbin0 -> 550 bytes
-rw-r--r--gfx/trainer/oak.pngbin0 -> 440 bytes
-rw-r--r--gfx/trainer/okera.pngbin0 -> 443 bytes
-rw-r--r--gfx/trainer/pokemaniac.pngbin0 -> 585 bytes
-rw-r--r--gfx/trainer/professional_f.pngbin0 -> 585 bytes
-rw-r--r--gfx/trainer/professional_m.pngbin0 -> 601 bytes
-rw-r--r--gfx/trainer/protagonist.pngbin0 -> 433 bytes
-rw-r--r--gfx/trainer/rival.pngbin0 -> 426 bytes
-rw-r--r--gfx/trainer/rocket_m.pngbin0 -> 534 bytes
-rw-r--r--gfx/trainer/schoolboy.pngbin0 -> 451 bytes
-rw-r--r--gfx/trainer/soldier.pngbin0 -> 583 bytes
-rw-r--r--gfx/trainer/sportsman.pngbin0 -> 536 bytes
-rw-r--r--gfx/trainer/supernerd.pngbin0 -> 383 bytes
-rw-r--r--gfx/trainer/swimmer_f.pngbin0 -> 474 bytes
-rw-r--r--gfx/trainer/swimmer_m.pngbin0 -> 446 bytes
-rw-r--r--gfx/trainer/teacher_f.pngbin0 -> 534 bytes
-rw-r--r--gfx/trainer/teacher_m.pngbin0 -> 454 bytes
-rw-r--r--gfx/trainer/tsukushi.pngbin0 -> 532 bytes
-rw-r--r--gfx/trainer/twins.pngbin0 -> 557 bytes
-rw-r--r--gfx/trainer/youngster.pngbin0 -> 395 bytes
-rw-r--r--home/audio.asm247
-rw-r--r--home/bankswitch.asm6
-rw-r--r--home/clear_sprites.asm32
-rw-r--r--home/copy.asm149
-rw-r--r--home/copy2.asm28
-rw-r--r--home/copy_tilemap.asm24
-rw-r--r--home/delay.asm28
-rw-r--r--home/farcall.asm62
-rw-r--r--home/init.asm221
-rw-r--r--home/interrupts.asm14
-rwxr-xr-xhome/items.asm145
-rw-r--r--home/joypad.asm285
-rw-r--r--home/lcd.asm120
-rw-r--r--home/names.asm23
-rw-r--r--home/oam_dma.asm30
-rw-r--r--home/pic.asm40
-rw-r--r--home/pokemon.asm28
-rw-r--r--home/predef.asm72
-rw-r--r--home/print_bcd.asm113
-rw-r--r--home/print_hex.asm42
-rw-r--r--home/print_num.asm252
-rw-r--r--home/serial.asm87
-rw-r--r--home/sram.asm28
-rw-r--r--home/text.asm368
-rw-r--r--home/unknown.asm32
-rw-r--r--home/vblank.asm315
-rw-r--r--home/vcopy.asm616
-rw-r--r--hram.asm119
-rw-r--r--macros.asm2
-rwxr-xr-xmacros/audio.asm278
-rw-r--r--macros/text.asm135
-rw-r--r--shim_gold.sym65
-rw-r--r--shim_gold_debug.sym19
-rw-r--r--shim_silver.sym65
-rw-r--r--shim_silver_debug.sym19
-rw-r--r--tools/disasm_coverage.py78
-rw-r--r--tools/dump_names.py52
-rw-r--r--tools/dump_text.py298
-rw-r--r--tools/mapreader.py171
-rw-r--r--tools/read_charmap.py42
-rw-r--r--tools/tests/README.txt1
-rw-r--r--tools/tests/charmap.asm293
-rw-r--r--tools/tests/dump_test.cc.txt26
-rw-r--r--tools/tests/dump_test.cc_endless.txt33
-rw-r--r--tools/tests/dump_test.cc_tc.txt27
-rw-r--r--tools/tests/dump_test.cc_tc_endless.txt35
-rw-r--r--tools/tests/dump_test.endless.txt9
-rw-r--r--tools/tests/dump_test.tc.txt4
-rw-r--r--tools/tests/dump_test.tc_endless.txt11
-rw-r--r--tools/tests/dump_test.txt3
-rw-r--r--tools/tests/dump_text_test.binbin0 -> 69 bytes
-rw-r--r--vram.asm21
-rw-r--r--wram.asm206
210 files changed, 13533 insertions, 1316 deletions
diff --git a/.gitignore b/.gitignore
index 9ebac92..4761880 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,7 +13,7 @@
*.pic
*.pcm
*.map
-pokegold-spaceworld.sym
+poke*_spaceworld.sym
shim.asm
*~
@@ -23,5 +23,9 @@ shim.asm
tools/scan_includes
tools/pkmncompress
tools/gfx
+tools/*.pyc
build/
.idea/
+
+coverage.png
+coverage.log
diff --git a/Makefile b/Makefile
index f9fc269..367226f 100644
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,7 @@ 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
+CORRECTEDROMS := $(ROMS:%.gb=%-correctheader.gb)
rwildcard = $(foreach d, $(wildcard $1*), $(filter $(subst *, %, $2), $d) $(call rwildcard, $d/, $2))
OBJS += $(patsubst %.asm, $(BUILD)/%.o, $(call rwildcard, $(DIRS), *.asm))
@@ -30,13 +31,13 @@ GFX := $(patsubst %.png, $(BUILD)/%.2bpp, \
$(patsubst %.1bpp.png, $(BUILD)/%.1bpp, \
$(patsubst gfx/pokemon/%/front.png, $(BUILD)/gfx/pokemon/%/front.pic, \
$(patsubst gfx/pokemon/%/back.png, $(BUILD)/gfx/pokemon/%/back.pic, \
- $(call rwildcard, gfx, *.png)))))
+ $(patsubst gfx/trainer/%.png, $(BUILD)/gfx/trainer/%.pic, \
+ $(call rwildcard, gfx, *.png))))))
.SECONDEXPANSION:
.PHONY: all
-all: $(ROM)
-
+all: $(ROM) $(CORRECTEDROMS) coverage
.PHONY: tools
tools tools/pkmncompress tools/gfx:
$(MAKE) -C tools/
@@ -44,13 +45,14 @@ tools tools/pkmncompress tools/gfx:
# Remove files generated by the build process.
.PHONY: clean
clean:
- rm -rf $(ROMS) $(BUILDBASE) $(ROMS:.gb=.sym) $(ROMS:.gb=.map)
+ rm -rf $(ROMS) $(BUILDBASE) $(ROMS:.gb=.sym) $(ROMS:.gb=.map) $(CORRECTEDROMS)
make -C tools clean
# Remove files except for graphics.
.PHONY: mostlyclean
mostlyclean:
- rm -rf $(ROMS) $(OBJS) $(ROMS:.gb=.sym) $(ROMS:.gb=.map)
+ rm -rf $(ROMS) $(OBJS) $(ROMS:.gb=.sym) $(ROMS:.gb=.map) $(CORRECTEDROMS)
+ find . \( -iname '*.d' \) -exec rm {} +
$(ROM): $(OBJS)
$(RGBLINK) -d -n $(@:.gb=.sym) -m $(@:.gb=.map) -O $(BASEROM) -o $@ $^
@@ -59,6 +61,13 @@ $(ROM): $(OBJS)
$(BUILD)/shim.asm: $(SHIM) | $$(dir $$@)
tools/make_shim -w $< > $@
+$(CORRECTEDROMS): %-correctheader.gb: %.gb
+ cp $< $@
+ $(RGBFIX) -f h -m 0x10 $@
+
+.PHONY: coverage
+coverage: $(ROMS)
+ $(PYTHON) tools/disasm_coverage.py -m $(ROM:.gb=.map) -b 0x40
$(BUILD)/gfx.o: | $(GFX)
$(BUILD)/%.o: $(BUILD)/%.asm | $$(dir $$@)
diff --git a/audio/engine.asm b/audio/engine.asm
index 561d778..f7a9974 100644
--- a/audio/engine.asm
+++ b/audio/engine.asm
@@ -166,3 +166,6 @@ _PlayMusic:: ; 3a:4d66
jr nz, .loop
xor a
; TODO
+
+SECTION "Song Header Pointers", ROMX[$52C7], BANK[$3A]
+INCLUDE "audio/song_header_pointers.inc"
diff --git a/audio/song_header_pointers.inc b/audio/song_header_pointers.inc
new file mode 100644
index 0000000..231eba6
--- /dev/null
+++ b/audio/song_header_pointers.inc
@@ -0,0 +1,14 @@
+SongHeaderPointers:
+ dbw Bank(Song_None), Song_None
+ dbw Bank(Song_Title), Song_Title
+ dbw Bank(Song_Route1), Song_Route1
+ dbw Bank(Song_OakIntro), Song_OakIntro
+ dbw Bank(Song_LeaderBattle), Song_LeaderBattle
+ dbw Bank(Song_TrainerBattle), Song_TrainerBattle
+ dbw Bank(Song_NidorinoIntro), Song_NidorinoIntro
+ dbw Bank(Song_ViridianCity), Song_ViridianCity
+ dbw Bank(Song_Heal), Song_Heal
+ dbw Bank(Song_Bicycle), Song_Bicycle
+ dbw Bank(Song_SpottedRocket), Song_SpottedRocket
+ dbw Bank(Song_VictoryTrainer), Song_VictoryTrainer
+ dbw Bank(Song_Evolution), Song_Evolution
diff --git a/audio/songs/bicycle.asm b/audio/songs/bicycle.asm
new file mode 100755
index 0000000..7c773fa
--- /dev/null
+++ b/audio/songs/bicycle.asm
@@ -0,0 +1,724 @@
+INCLUDE "constants.asm"
+
+SECTION "Song Bicycle", ROMX[$563e], BANK[$3b]
+
+Song_Bicycle:: ; ed63e (3b:563e)
+ db 3 << 6 | 0
+ dw Song_Bicycle_Ch0
+ db 1
+ dw Song_Bicycle_Ch1
+ db 2
+ dw Song_Bicycle_Ch2
+ db 3
+ dw Song_Bicycle_Ch3
+
+Song_Bicycle_Ch0:: ; ed64a (3b:564a)
+ tempo 144
+ volume 7, 7
+ duty 3
+ vibrato 8, 1, 4
+ notetype 12, 11, 5
+ octave 3
+ G_ 2
+
+Song_Bicycle_branch_ed659::
+ octave 4
+ C_ 4
+ D_ 4
+ E_ 2
+ C_ 2
+ E_ 2
+ G_ 2
+ G_ 2
+ F_ 2
+ E_ 2
+ F_ 4
+ E_ 2
+ D_ 2
+ F_ 4
+ D_ 4
+ octave 3
+ B_ 2
+ octave 4
+ F_ 4
+ D_ 4
+ E_ 2
+ F_ 2
+ G_ 2
+ C_ 2
+ E_ 2
+ C_ 2
+ D_ 2
+ E_ 2
+ notetype 12, 11, 6
+ F_ 10
+ notetype 12, 10, 6
+ F_ 2
+ E_ 2
+ F_ 2
+ G_ 10
+ E_ 2
+ D_ 2
+ E_ 2
+ F_ 6
+ toggleperfectpitch
+ rest 1
+ rest 2
+ notetype 12, 11, 3
+ E_ 2
+ D_ 2
+ D_ 1
+ E_ 1
+ F_ 2
+ E_ 1
+ F_ 1
+ toggleperfectpitch
+ rest 1
+ rest 2
+ notetype 12, 11, 5
+ G_ 6
+ G_ 6
+ A_ 2
+ F_ 2
+ G_ 6
+ notetype 12, 11, 4
+ G_ 2
+ F_ 4
+ notetype 12, 10, 4
+ E_ 2
+ D_ 2
+ notetype 12, 9, 3
+ octave 3
+ A_ 2
+ octave 4
+ C_ 4
+ C_ 2
+ octave 3
+ B_ 2
+ A_ 1
+ B_ 1
+ A_ 2
+ B_ 2
+ octave 4
+ C_ 2
+ C_ 4
+ C_ 2
+ octave 3
+ A_ 2
+ B_ 2
+ B_ 2
+ A_ 2
+ octave 4
+ C_ 4
+ octave 3
+ A_ 2
+ B_ 1
+ octave 4
+ C_ 1
+ octave 3
+ B_ 2
+ octave 4
+ D_ 4
+ octave 3
+ B_ 2
+ octave 4
+ C_ 4
+ octave 3
+ B_ 1
+ octave 4
+ C_ 1
+ D_ 1
+ octave 3
+ B_ 1
+ octave 4
+ C_ 4
+ notetype 12, 3, 13
+ C_ 4
+ notetype 12, 11, 4
+ F_ 6
+ G_ 4
+ F_ 1
+ G_ 1
+ F_ 4
+ E_ 6
+ F_ 2
+ E_ 2
+ D_ 1
+ E_ 1
+ D_ 2
+ C_ 2
+ notetype 12, 11, 5
+ octave 3
+ A_ 4
+ octave 4
+ D_ 4
+ octave 3
+ B_ 4
+ octave 4
+ E_ 4
+ C_ 4
+ F_ 4
+ D_ 4
+ F# 4
+ vibrato 10, 2, 6
+ notetype 12, 8, 0
+ G_ 16
+ G_ 4
+ notetype 12, 8, 7
+ G_ 12
+ notetype 12, 11, 5
+ vibrato 8, 1, 4
+ loopchannel 0, Song_Bicycle_branch_ed659
+
+
+Song_Bicycle_Ch1:: ; ed70d (3b:570d)
+ duty 2
+ vibrato 6, 1, 5
+ notetype 12, 12, 3
+ octave 4
+ C_ 2
+
+Song_Bicycle_branch_ed717::
+ E_ 4
+ F_ 4
+ G_ 4
+ octave 5
+ C_ 4
+ octave 4
+ B_ 6
+ A_ 1
+ B_ 1
+ A_ 10
+ F_ 2
+ G_ 2
+ A_ 2
+ octave 5
+ D_ 2
+ C_ 2
+ octave 4
+ B_ 2
+ A_ 1
+ B_ 1
+ octave 5
+ C_ 6
+ octave 4
+ A_ 2
+ G_ 4
+ duty 3
+ notetype 12, 8, 4
+ A# 6
+ duty 2
+ notetype 12, 12, 5
+ octave 5
+ C_ 2
+ octave 4
+ B_ 2
+ octave 5
+ C_ 2
+ octave 4
+ A_ 10
+ octave 5
+ C_ 2
+ octave 4
+ B_ 2
+ octave 5
+ C_ 2
+ octave 4
+ G_ 10
+ notetype 12, 12, 3
+ octave 5
+ C_ 4
+ E_ 2
+ D_ 2
+ C_ 2
+ octave 4
+ B_ 2
+ octave 5
+ C_ 2
+ notetype 12, 11, 0
+ D_ 4
+ notetype 12, 12, 7
+ D_ 10
+ D_ 1
+ C_ 1
+ notetype 12, 11, 0
+ octave 4
+ B_ 4
+ notetype 12, 12, 7
+ B_ 12
+ notetype 12, 12, 4
+ F_ 6
+ F_ 2
+ G_ 2
+ F_ 2
+ E_ 2
+ D_ 2
+ E_ 6
+ E_ 2
+ F_ 2
+ E_ 2
+ D_ 2
+ C_ 2
+ F_ 2
+ E_ 2
+ D_ 2
+ F_ 2
+ G_ 4
+ A_ 2
+ F_ 2
+ E_ 2
+ G_ 4
+ F_ 2
+ E_ 6
+ notetype 6, 12, 2
+ F_ 1
+ G_ 1
+ A_ 1
+ B_ 1
+ notetype 12, 12, 3
+ octave 5
+ C_ 2
+ octave 4
+ B_ 2
+ A_ 2
+ octave 5
+ C_ 2
+ octave 4
+ B_ 4
+ A_ 4
+ G_ 2
+ A# 4
+ A_ 2
+ G_ 4
+ F_ 2
+ E_ 2
+ notetype 8, 12, 4
+ A_ 4
+ G_ 4
+ F_ 4
+ B_ 4
+ A_ 4
+ G_ 4
+ octave 5
+ C_ 4
+ octave 4
+ B_ 4
+ A_ 4
+ octave 5
+ D_ 4
+ E_ 4
+ C_ 4
+ notetype 12, 12, 7
+ D_ 12
+ C_ 4
+ notetype 12, 11, 0
+ octave 4
+ B_ 4
+ notetype 12, 12, 7
+ B_ 12
+ notetype 12, 12, 3
+ loopchannel 0, Song_Bicycle_branch_ed717
+
+
+Song_Bicycle_Ch2:: ; ed7c5 (3b:57c5)
+ notetype 12, 1, 3
+ rest 2
+
+Song_Bicycle_branch_ed7c9::
+ octave 4
+ C_ 1
+ rest 1
+ E_ 1
+ rest 1
+ octave 3
+ G_ 1
+ rest 1
+ octave 4
+ E_ 1
+ rest 1
+ C_ 1
+ rest 1
+ E_ 1
+ rest 1
+ C_ 1
+ rest 1
+ G_ 1
+ rest 1
+ F_ 1
+ rest 1
+ A_ 1
+ rest 1
+ C_ 1
+ rest 1
+ A_ 1
+ rest 1
+ F_ 1
+ rest 1
+ A_ 1
+ rest 1
+ E_ 1
+ rest 1
+ A_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ octave 3
+ A_ 1
+ rest 1
+ octave 4
+ F_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ E_ 1
+ rest 1
+ F_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ C_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ F_ 1
+ rest 1
+ A_ 1
+ rest 1
+ C_ 1
+ rest 1
+ A_ 1
+ rest 1
+ F_ 1
+ rest 1
+ G_ 1
+ rest 1
+ A_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ C_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ octave 3
+ A_ 1
+ rest 1
+ octave 4
+ F_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ G_ 1
+ rest 1
+ C_ 1
+ rest 1
+ D_ 1
+ rest 1
+ G_ 1
+ rest 1
+ D_ 1
+ rest 1
+ G_ 1
+ rest 1
+ D_ 1
+ rest 1
+ G_ 1
+ rest 1
+ D_ 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ D_ 1
+ rest 1
+ G_ 1
+ rest 1
+ D_ 1
+ rest 1
+ G_ 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ G_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ octave 3
+ A_ 1
+ rest 1
+ octave 4
+ F_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ C_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ octave 3
+ A_ 1
+ rest 1
+ octave 4
+ F_ 1
+ rest 1
+ F_ 1
+ rest 1
+ E_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ E_ 1
+ rest 1
+ C_ 1
+ rest 1
+ G_ 1
+ rest 1
+ C_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ F_ 1
+ rest 1
+ A_ 1
+ rest 1
+ C_ 1
+ rest 1
+ A_ 1
+ rest 1
+ F_ 1
+ rest 1
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ F_ 1
+ rest 1
+ G_ 1
+ rest 1
+ A# 1
+ rest 1
+ E_ 1
+ rest 1
+ A# 1
+ rest 1
+ G_ 1
+ rest 1
+ A# 1
+ rest 1
+ A# 1
+ rest 1
+ G_ 1
+ rest 1
+ F_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F_ 1
+ rest 1
+ A_ 1
+ rest 1
+ G_ 1
+ rest 1
+ E_ 1
+ rest 1
+ G_ 1
+ rest 1
+ B_ 1
+ rest 1
+ A_ 1
+ rest 1
+ F_ 1
+ rest 1
+ A_ 1
+ rest 1
+ octave 5
+ C_ 1
+ rest 1
+ octave 4
+ B_ 1
+ rest 1
+ A_ 1
+ rest 1
+ octave 5
+ C_ 1
+ rest 1
+ octave 4
+ A_ 1
+ rest 1
+ G_ 1
+ rest 1
+ octave 5
+ C_ 1
+ rest 1
+ octave 4
+ G_ 1
+ rest 1
+ octave 5
+ C_ 1
+ rest 1
+ octave 4
+ G_ 1
+ rest 1
+ octave 5
+ C_ 1
+ rest 1
+ octave 4
+ G_ 1
+ rest 1
+ octave 5
+ C_ 1
+ rest 1
+ octave 4
+ G_ 1
+ rest 1
+ B_ 1
+ rest 1
+ G_ 1
+ rest 1
+ B_ 1
+ rest 1
+ F_ 1
+ rest 1
+ A_ 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F_ 1
+ rest 1
+ loopchannel 0, Song_Bicycle_branch_ed7c9
+
+
+Song_Bicycle_Ch3:: ; ed91a (3b:591a)
+ drumset 1
+ dspeed 12
+ rest 2
+
+Song_Bicycle_branch_ed91f::
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed965
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed96e
+ callchannel Song_Bicycle_branch_ed965
+ callchannel Song_Bicycle_branch_ed965
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed965
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed96e
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed965
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed95c
+ callchannel Song_Bicycle_branch_ed95c
+ loopchannel 0, Song_Bicycle_branch_ed91f
+
+Song_Bicycle_branch_ed95c::
+ rest 2
+ snare7 2
+ rest 2
+ snare7 2
+ rest 2
+ snare7 2
+ rest 2
+ snare7 2
+ endchannel
+
+Song_Bicycle_branch_ed965::
+ rest 2
+ snare7 2
+ rest 2
+ snare7 2
+ rest 2
+ snare7 2
+ snare7 2
+ snare7 2
+ endchannel
+
+Song_Bicycle_branch_ed96e::
+ rest 2
+ snare7 2
+ rest 2
+ snare7 2
+ rest 2
+ snare7 2
+ rest 2
+ snare7 1
+ snare7 1
+ endchannel
+; 0xed978
diff --git a/audio/songs/evolution.asm b/audio/songs/evolution.asm
new file mode 100755
index 0000000..98bfc0e
--- /dev/null
+++ b/audio/songs/evolution.asm
@@ -0,0 +1,126 @@
+INCLUDE "constants.asm"
+
+SECTION "Song Evolution", ROMX[$5b1c], BANK[$3b]
+
+Song_Evolution:: ; edb1c (3b:5b1c)
+ db 2 << 6 | 0
+ dw Song_Evolution_Ch0
+ db 1
+ dw Song_Evolution_Ch1
+ db 2
+ dw Song_Evolution_Ch2
+
+Song_Evolution_Ch0:: ; edb25 (3b:5b25)
+ tempo 132
+ volume 7, 7
+ vibrato 6, 3, 4
+ toggleperfectpitch
+ rest 1
+ rest 2
+ duty 2
+ notetype 12, 9, 2
+ octave 3
+ pitchbend 0, 74
+ C_ 1
+ pitchbend 0, 74
+ G_ 1
+ pitchbend 0, 74
+ C_ 1
+ pitchbend 0, 74
+ G_ 1
+ rest 4
+ duty 3
+
+Song_Evolution_branch_edb49::
+ callchannel Song_Evolution_branch_edb5b
+ notetype 12, 10, 4
+ F# 4
+ callchannel Song_Evolution_branch_edb5b
+ notetype 12, 10, 4
+ F# 4
+ loopchannel 0, Song_Evolution_branch_edb49
+
+Song_Evolution_branch_edb5b::
+ notetype 12, 10, 2
+ octave 3
+ C_ 4
+ G_ 4
+ C_ 4
+ G_ 4
+ C_ 4
+ G_ 4
+ C_ 4
+ endchannel
+
+
+Song_Evolution_Ch1:: ; edb67 (3b:5b67)
+ duty 2
+ vibrato 8, 2, 5
+ notetype 12, 10, 2
+ octave 4
+ G_ 1
+ D_ 1
+ G_ 1
+ D_ 1
+ rest 4
+ duty 3
+
+Song_Evolution_branch_edb77::
+ callchannel Song_Evolution_branch_edb89
+ notetype 12, 11, 5
+ A_ 4
+ callchannel Song_Evolution_branch_edb89
+ notetype 12, 11, 5
+ B_ 4
+ loopchannel 0, Song_Evolution_branch_edb77
+
+Song_Evolution_branch_edb89::
+ notetype 12, 11, 2
+ octave 3
+ G_ 4
+ D_ 4
+ G_ 4
+ D_ 4
+ G_ 4
+ D_ 4
+ G_ 4
+ endchannel
+
+
+Song_Evolution_Ch2:: ; edb95 (3b:5b95)
+ notetype 12, 1, 0
+ rest 8
+
+Song_Evolution_branch_edb99::
+ callchannel Song_Evolution_branch_edba7
+ octave 4
+ A_ 4
+ callchannel Song_Evolution_branch_edba7
+ octave 4
+ B_ 4
+ loopchannel 0, Song_Evolution_branch_edb99
+
+Song_Evolution_branch_edba7::
+ octave 3
+ A_ 2
+ rest 2
+ octave 4
+ D_ 2
+ rest 2
+ octave 3
+ A_ 2
+ rest 2
+ octave 4
+ D_ 2
+ rest 2
+ octave 3
+ A_ 2
+ rest 2
+ octave 4
+ D_ 2
+ rest 2
+ octave 3
+ A_ 2
+ rest 2
+ endchannel
+; 0xedbbd
diff --git a/audio/songs/heal.asm b/audio/songs/heal.asm
new file mode 100755
index 0000000..9ea7368
--- /dev/null
+++ b/audio/songs/heal.asm
@@ -0,0 +1,62 @@
+INCLUDE "constants.asm"
+
+SECTION "Song Heal", ROMX[$55f4], BANK[$3b]
+
+Song_Heal:: ; ed5f4 (3b:55f4)
+ db 2 << 6 | 0
+ dw Song_Heal_Ch0
+ db 1
+ dw Song_Heal_Ch1
+ db 2
+ dw Song_Heal_Ch2
+
+Song_Heal_Ch0:: ; ed5fd (3b:55fd)
+ tempo 144
+ volume 7, 7
+ duty 2
+ toggleperfectpitch
+ rest 1
+ rest 2
+ notetype 12, 8, 1
+ rest 2
+ pitchbend 0, 64
+ B_ 2
+ pitchbend 0, 85
+ B_ 2
+ pitchbend 0, 69
+ E_ 2
+ rest 4
+ pitchbend 0, 48
+ E_ 4
+ pitchbend 0, 64
+ B_ 4
+ endchannel
+
+
+Song_Heal_Ch1:: ; ed621 (3b:5621)
+ duty 2
+ notetype 12, 12, 3
+ octave 4
+ B_ 4
+ B_ 4
+ B_ 2
+ G# 2
+ notetype 12, 12, 4
+ octave 5
+ E_ 8
+ endchannel
+
+
+Song_Heal_Ch2:: ; ed631 (3b:5631)
+ notetype 12, 1, 0
+ octave 4
+ E_ 2
+ rest 2
+ E_ 2
+ rest 2
+ E_ 2
+ G# 2
+ E_ 6
+ rest 2
+ endchannel
+; 0xed63e
diff --git a/audio/songs/leaderbattle.asm b/audio/songs/leaderbattle.asm
new file mode 100755
index 0000000..e013759
--- /dev/null
+++ b/audio/songs/leaderbattle.asm
@@ -0,0 +1,1415 @@
+INCLUDE "constants.asm"
+
+SECTION "Song LeaderBattle", ROMX[$4858], BANK[$3b]
+
+Song_LeaderBattle:: ; ec858 (3b:4858)
+ db 2 << 6 | 0
+ dw Song_LeaderBattle_Ch0
+ db 1
+ dw Song_LeaderBattle_Ch1
+ db 2
+ dw Song_LeaderBattle_Ch2
+
+Song_LeaderBattle_Ch0:: ; ec861 (3b:4861)
+ tempo 104
+ volume 7, 7
+ duty 3
+ vibrato 8, 3, 4
+ toggleperfectpitch
+ rest 1
+ rest 2
+ notetype 12, 11, 3
+ rest 6
+ octave 3
+ F# 1
+ F_ 1
+ E_ 1
+ F_ 1
+ E_ 1
+ D# 1
+ E_ 1
+ D# 1
+ D_ 1
+ D# 1
+ D_ 1
+ C# 1
+ D_ 1
+ C# 1
+ C_ 1
+ C# 1
+ C_ 1
+ octave 2
+ B_ 1
+ octave 1
+ G# 1
+ A_ 1
+ A# 1
+ A_ 1
+ A# 1
+ B_ 1
+ A# 1
+ B_ 1
+ octave 2
+ F# 1
+ rest 15
+ F# 1
+ rest 9
+ G_ 6
+ F# 1
+ rest 15
+ F# 1
+ rest 9
+ F_ 6
+ F# 1
+ rest 15
+ F# 1
+ rest 9
+ G_ 6
+ F# 1
+ rest 15
+ F# 1
+ rest 9
+ A_ 6
+
+Song_LeaderBattle_branch_ec8a4::
+ F# 1
+ octave 3
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ octave 2
+ E_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ F# 1
+ octave 3
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ C# 1
+ octave 2
+ E_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ octave 3
+ C# 1
+ octave 2
+ B_ 1
+ A_ 1
+ rest 2
+ octave 1
+ B_ 1
+ rest 1
+ octave 2
+ D_ 4
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 2
+ E_ 4
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 2
+ D_ 4
+ octave 1
+ B_ 1
+ rest 1
+ octave 2
+ C# 2
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 2
+ D_ 4
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 2
+ E_ 4
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 2
+ D_ 4
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 2
+ C# 2
+ octave 1
+ B_ 2
+ A_ 2
+ octave 2
+ C# 2
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ rest 16
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ B_ 1
+ octave 1
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ notetype 12, 11, 5
+ octave 3
+ C# 12
+ notetype 12, 11, 3
+ octave 1
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ notetype 12, 11, 5
+ octave 3
+ A_ 12
+ notetype 12, 11, 3
+ D# 4
+ C# 4
+ D# 4
+ E_ 2
+ F# 4
+ octave 2
+ B_ 2
+ octave 3
+ C# 2
+ F# 2
+ B_ 2
+ F# 2
+ D# 2
+ F# 2
+ octave 1
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ notetype 12, 11, 5
+ octave 3
+ A_ 12
+ notetype 12, 11, 3
+ C# 1
+ octave 2
+ B_ 1
+ octave 3
+ C# 1
+ D# 1
+ E_ 1
+ D# 1
+ E_ 1
+ F# 1
+ A_ 1
+ G# 1
+ F# 1
+ E_ 1
+ F# 1
+ E_ 1
+ D# 1
+ C# 1
+ notetype 12, 11, 5
+ D# 4
+ E_ 4
+ C# 2
+ D# 6
+ F# 4
+ E_ 2
+ D# 4
+ C# 6
+ rest 16
+ rest 10
+ E_ 6
+ D# 4
+ E_ 4
+ C# 2
+ D# 6
+ E_ 4
+ D# 2
+ C# 4
+ octave 2
+ B_ 6
+ octave 3
+ D# 4
+ E_ 4
+ C# 2
+ D# 6
+ F# 4
+ A_ 2
+ G# 4
+ E_ 6
+ loopchannel 0, Song_LeaderBattle_branch_ec8a4
+
+
+Song_LeaderBattle_Ch1:: ; eca9c (3b:4a9c)
+ duty 3
+ vibrato 8, 2, 5
+ notetype 12, 12, 3
+ octave 4
+ F_ 1
+ E_ 1
+ D# 1
+ E_ 1
+ D# 1
+ D_ 1
+ D# 1
+ D_ 1
+ C# 1
+ D_ 1
+ C# 1
+ C_ 1
+ octave 3
+ B_ 1
+ rest 5
+ F# 1
+ F_ 1
+ E_ 1
+ F_ 1
+ E_ 1
+ D# 1
+ E_ 1
+ D# 1
+ D_ 1
+ D# 1
+ D_ 1
+ C# 1
+ D_ 1
+ C# 1
+ B_ 1
+ rest 15
+ B_ 1
+ rest 9
+ octave 4
+ C_ 6
+ octave 3
+ B_ 1
+ rest 15
+ B_ 1
+ rest 9
+ A# 6
+ octave 3
+ B_ 1
+ rest 15
+ B_ 1
+ rest 9
+ octave 4
+ C_ 6
+ octave 3
+ B_ 1
+ rest 15
+ B_ 1
+ rest 9
+ octave 4
+ C# 6
+
+Song_LeaderBattle_branch_ecadc::
+ notetype 12, 12, 5
+ D# 4
+ C# 4
+ D# 4
+ E_ 2
+ F# 4
+ E_ 4
+ D# 2
+ C# 2
+ octave 3
+ B_ 2
+ octave 4
+ C# 2
+ D# 2
+ notetype 12, 11, 7
+ duty 2
+ octave 3
+ A_ 8
+ octave 4
+ C# 8
+ E_ 8
+ C# 8
+ notetype 12, 12, 5
+ duty 3
+ D# 4
+ C# 4
+ D# 4
+ E_ 2
+ F# 4
+ E_ 4
+ D# 2
+ C# 2
+ octave 3
+ B_ 2
+ octave 4
+ C# 2
+ D# 2
+ notetype 12, 11, 7
+ duty 2
+ C# 8
+ octave 3
+ B_ 8
+ A_ 8
+ notetype 12, 12, 3
+ octave 4
+ E_ 4
+ E_ 2
+ C# 2
+ notetype 12, 12, 5
+ duty 3
+ octave 1
+ B_ 1
+ rest 3
+ octave 3
+ D_ 1
+ C# 1
+ octave 2
+ B_ 1
+ octave 3
+ D_ 1
+ rest 4
+ E_ 1
+ D_ 1
+ octave 2
+ B_ 1
+ octave 3
+ E_ 1
+ rest 4
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ rest 2
+ E_ 1
+ C# 1
+ E_ 1
+ rest 1
+ F_ 1
+ rest 1
+ D_ 1
+ C# 1
+ octave 2
+ B_ 1
+ octave 3
+ D_ 1
+ rest 4
+ E_ 1
+ D_ 1
+ octave 2
+ B_ 1
+ octave 3
+ E_ 1
+ rest 4
+ F# 1
+ E_ 1
+ C# 1
+ F# 1
+ E_ 1
+ rest 1
+ C# 1
+ rest 1
+ D_ 1
+ rest 1
+ C# 1
+ rest 1
+ F# 1
+ rest 1
+ E_ 1
+ rest 1
+ octave 1
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ notetype 12, 11, 0
+ octave 3
+ B_ 4
+ octave 4
+ C_ 4
+ octave 3
+ A_ 4
+ B_ 4
+ octave 4
+ C_ 4
+ octave 3
+ A_ 4
+ G_ 4
+ notetype 12, 11, 0
+ F# 8
+ notetype 12, 11, 7
+ F# 8
+ notetype 12, 12, 3
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ D# 1
+ D_ 1
+ C# 1
+ C_ 1
+ octave 2
+ B_ 1
+ A_ 1
+ G_ 1
+ F# 1
+ F_ 1
+ E_ 1
+ F_ 1
+ F# 1
+ G_ 1
+ A_ 1
+ B_ 1
+ notetype 12, 11, 0
+ octave 3
+ B_ 4
+ octave 4
+ C_ 4
+ octave 3
+ A_ 4
+ B_ 4
+ octave 4
+ C_ 4
+ octave 3
+ A_ 4
+ octave 4
+ C_ 4
+ notetype 12, 11, 0
+ octave 3
+ B_ 16
+ notetype 12, 3, 15
+ octave 4
+ F# 16
+ notetype 12, 12, 3
+ duty 3
+ octave 1
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ notetype 12, 12, 7
+ octave 3
+ A_ 12
+ notetype 12, 12, 3
+ octave 1
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ notetype 12, 12, 7
+ octave 4
+ C# 12
+ notetype 12, 11, 0
+ D# 16
+ notetype 12, 11, 7
+ D# 16
+ notetype 12, 12, 3
+ octave 1
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ notetype 12, 12, 7
+ octave 4
+ C# 12
+ notetype 12, 12, 0
+ A_ 8
+ E_ 8
+ B_ 16
+ notetype 12, 12, 7
+ B_ 16
+ notetype 12, 12, 4
+ octave 3
+ D# 4
+ E_ 4
+ C# 2
+ D# 6
+ F# 4
+ A_ 2
+ G# 4
+ rest 2
+ B_ 1
+ octave 4
+ D# 1
+ F# 1
+ A# 1
+ notetype 12, 12, 0
+ B_ 16
+ F# 16
+ A_ 16
+ octave 5
+ C# 8
+ rest 2
+ notetype 12, 12, 3
+ octave 4
+ A_ 6
+ loopchannel 0, Song_LeaderBattle_branch_ecadc
+
+
+Song_LeaderBattle_Ch2:: ; ecc05 (3b:4c05)
+ vibrato 0, 2, 0
+ notetype 12, 1, 3
+ rest 12
+ octave 3
+ B_ 1
+ octave 4
+ C_ 1
+ C# 1
+ C_ 1
+ C# 1
+ D_ 1
+ C# 1
+ D_ 1
+ D# 1
+ D_ 1
+ D# 1
+ E_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ E_ 1
+ F_ 1
+ F# 1
+ F_ 1
+ F# 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ C_ 6
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F_ 6
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ C_ 6
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ F# 1
+ rest 1
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ C# 6
+ notetype 12, 1, 4
+
+Song_LeaderBattle_branch_eccc9::
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 4
+ D_ 4
+ octave 3
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 4
+ E_ 4
+ octave 3
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 4
+ D_ 4
+ octave 3
+ B_ 1
+ rest 1
+ octave 4
+ C# 2
+ octave 3
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 4
+ D_ 4
+ octave 3
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 4
+ E_ 4
+ octave 3
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 4
+ D_ 4
+ octave 3
+ B_ 1
+ rest 1
+ B_ 1
+ rest 1
+ octave 4
+ C# 2
+ octave 3
+ B_ 2
+ A_ 2
+ octave 4
+ C# 2
+ octave 3
+ B_ 1
+ rest 1
+ B_ 1
+ rest 13
+ B_ 1
+ rest 1
+ B_ 1
+ rest 13
+ B_ 1
+ rest 1
+ B_ 1
+ rest 13
+ B_ 1
+ rest 1
+ B_ 1
+ rest 13
+ B_ 1
+ rest 1
+ B_ 1
+ rest 13
+ B_ 1
+ rest 1
+ B_ 1
+ rest 13
+ B_ 1
+ rest 1
+ B_ 1
+ rest 13
+ B_ 1
+ rest 1
+ B_ 1
+ rest 13
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ octave 4
+ C# 12
+ octave 3
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ octave 4
+ E_ 12
+ D# 16
+ octave 3
+ B_ 16
+ A_ 1
+ rest 1
+ A_ 1
+ rest 1
+ octave 4
+ E_ 12
+ C# 8
+ E_ 8
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ E_ 6
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ G_ 6
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ C_ 6
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ F# 2
+ octave 3
+ B_ 2
+ octave 4
+ G_ 6
+ loopchannel 0, Song_LeaderBattle_branch_eccc9
+; 0xece31
diff --git a/audio/songs/nidorinointro.asm b/audio/songs/nidorinointro.asm
new file mode 100755
index 0000000..2124bc1
--- /dev/null
+++ b/audio/songs/nidorinointro.asm
@@ -0,0 +1,347 @@
+INCLUDE "constants.asm"
+
+SECTION "Song NidorinoIntro", ROMX[$4000], BANK[$3b]
+
+Song_NidorinoIntro:: ; ec000 (3b:4000)
+ db 3 << 6 | 0
+ dw Song_NidorinoIntro_Ch0
+ db 1
+ dw Song_NidorinoIntro_Ch1
+ db 2
+ dw Song_NidorinoIntro_Ch2
+ db 3
+ dw Song_NidorinoIntro_Ch3
+
+Song_NidorinoIntro_Ch0:: ; ec00c (3b:400c)
+ tempo 102
+ volume 7, 7
+ duty 3
+ vibrato 6, 3, 4
+ toggleperfectpitch
+ rest 1
+ rest 2
+ notetype 12, 11, 1
+ rest 8
+ octave 2
+ A_ 2
+ A_ 2
+ notetype 12, 11, 4
+ octave 3
+ D_ 4
+ notetype 12, 11, 1
+ octave 2
+ A_ 2
+ A_ 2
+ notetype 12, 11, 4
+ octave 3
+ D# 4
+ notetype 12, 11, 1
+ octave 2
+ A_ 2
+ A_ 2
+ notetype 12, 11, 4
+ octave 3
+ D_ 4
+ notetype 12, 11, 1
+ octave 2
+ A_ 2
+ A_ 2
+ notetype 12, 10, 0
+ A# 4
+ notetype 12, 11, 1
+ A_ 2
+ A_ 2
+ notetype 12, 11, 4
+ octave 3
+ D_ 4
+ notetype 12, 11, 1
+ octave 2
+ A_ 2
+ A_ 2
+ notetype 12, 2, 9
+ octave 3
+ G_ 4
+ notetype 12, 11, 0
+ A_ 8
+ octave 2
+ A_ 8
+ notetype 12, 11, 7
+ octave 3
+ F_ 8
+ notetype 12, 4, 15
+ octave 2
+ F_ 8
+ notetype 12, 11, 1
+ A_ 2
+ A_ 2
+ notetype 12, 11, 4
+ octave 3
+ D_ 4
+ notetype 12, 11, 1
+ octave 2
+ A_ 2
+ A_ 2
+ notetype 12, 11, 4
+ octave 3
+ D# 4
+ notetype 12, 11, 1
+ octave 2
+ A_ 2
+ A_ 2
+ notetype 12, 11, 4
+ octave 3
+ F_ 4
+ notetype 12, 11, 1
+ octave 2
+ A_ 2
+ A_ 2
+ notetype 12, 11, 4
+ octave 3
+ G_ 4
+ notetype 12, 11, 0
+ F# 16
+ notetype 12, 11, 1
+ octave 4
+ D_ 16
+ endchannel
+
+
+Song_NidorinoIntro_Ch1:: ; ec09f (3b:409f)
+ duty 3
+ vibrato 8, 2, 5
+ notetype 12, 12, 2
+ rest 8
+ octave 3
+ D_ 2
+ D_ 2
+ notetype 12, 12, 5
+ A_ 4
+ notetype 12, 12, 2
+ D_ 2
+ D_ 2
+ notetype 12, 12, 5
+ A# 4
+ notetype 12, 12, 2
+ D_ 2
+ D_ 2
+ notetype 12, 12, 5
+ A_ 4
+ notetype 12, 12, 2
+ D_ 2
+ D_ 2
+ notetype 12, 11, 7
+ C# 4
+ notetype 12, 12, 2
+ D_ 2
+ D_ 2
+ notetype 12, 12, 5
+ A_ 4
+ notetype 12, 12, 2
+ octave 3
+ D_ 2
+ D_ 2
+ notetype 12, 12, 7
+ octave 4
+ C# 4
+ D_ 8
+ octave 3
+ D_ 8
+ octave 4
+ C_ 8
+ octave 3
+ C_ 8
+ notetype 12, 12, 2
+ D_ 2
+ D_ 2
+ notetype 12, 12, 5
+ A_ 4
+ notetype 12, 12, 2
+ D_ 2
+ D_ 2
+ notetype 12, 12, 5
+ A# 4
+ notetype 12, 12, 2
+ D_ 2
+ D_ 2
+ notetype 12, 12, 5
+ octave 4
+ C_ 4
+ notetype 12, 12, 2
+ octave 3
+ D_ 2
+ D_ 2
+ notetype 12, 12, 5
+ octave 4
+ C# 4
+ notetype 12, 2, 15
+ D_ 16
+ notetype 12, 12, 1
+ octave 5
+ D_ 16
+ endchannel
+
+
+Song_NidorinoIntro_Ch2:: ; ec116 (3b:4116)
+ notetype 12, 1, 0
+ rest 8
+ octave 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A_ 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A_ 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A_ 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ F# 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A_ 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A# 4
+ A_ 8
+ D_ 8
+ A# 8
+ D_ 8
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A_ 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A_ 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A# 4
+ D_ 1
+ rest 1
+ D_ 1
+ rest 1
+ A# 4
+ A_ 16
+ D_ 1
+ rest 15
+ endchannel
+
+
+Song_NidorinoIntro_Ch3:: ; ec155 (3b:4155)
+ drumset 2
+ dspeed 6
+ snare4 1
+ snare4 1
+ snare4 1
+ snare4 1
+ snare3 1
+ snare4 1
+ snare3 1
+ snare4 1
+ snare3 1
+ snare4 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare2 1
+ snare2 1
+ snare2 4
+ snare2 4
+ snare4 1
+ snare4 1
+ snare4 1
+ snare4 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare2 4
+ snare2 4
+ snare2 8
+ snare2 4
+ snare2 4
+ snare2 8
+ snare2 4
+ snare2 4
+ snare4 1
+ snare4 1
+ snare4 1
+ snare4 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare2 4
+ snare2 4
+ snare2 8
+ snare2 4
+ snare2 4
+ snare2 4
+ snare4 1
+ snare4 1
+ snare3 1
+ snare3 1
+ snare2 16
+ snare2 16
+ snare2 16
+ snare4 1
+ snare4 1
+ snare4 1
+ snare4 1
+ snare3 1
+ snare4 1
+ snare3 1
+ snare4 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare2 1
+ snare2 1
+ snare2 1
+ snare2 1
+ snare2 4
+ snare2 4
+ snare2 8
+ snare2 4
+ snare2 4
+ snare4 1
+ snare4 1
+ snare4 1
+ snare4 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare3 1
+ snare2 4
+ snare2 4
+ snare2 8
+ snare2 4
+ snare2 8
+ snare2 4
+ snare2 16
+ snare2 16
+ snare2 2
+ rest 16
+ rest 14
+ endchannel
+; 0xec1b9
diff --git a/audio/songs/none.asm b/audio/songs/none.asm
new file mode 100755
index 0000000..746a1c9
--- /dev/null
+++ b/audio/songs/none.asm
@@ -0,0 +1,20 @@
+INCLUDE "constants.asm"
+
+SECTION "Song None", ROMX[$52ee], BANK[$3a]
+
+Song_None:: ; e92ee (3a:52ee)
+ db 3 << 6 | 0
+ dw Song_None_Ch0
+ db 1
+ dw Song_None_Ch1
+ db 2
+ dw Song_None_Ch2
+ db 3
+ dw Song_None_Ch3
+
+Song_None_Ch0:: ; e92fa (3a:52fa)
+Song_None_Ch1:: ; e92fa (3a:52fa)
+Song_None_Ch2:: ; e92fa (3a:52fa)
+Song_None_Ch3:: ; e92fa (3a:52fa)
+ endchannel
+; 0xe92fb
diff --git a/audio/songs/oakintro.asm b/audio/songs/oakintro.asm
new file mode 100755
index 0000000..e6d6bb4
--- /dev/null
+++ b/audio/songs/oakintro.asm
@@ -0,0 +1,445 @@
+INCLUDE "constants.asm"
+
+SECTION "Song OakIntro", ROMX[$4685], BANK[$3b]
+
+Song_OakIntro:: ; ec685 (3b:4685)
+ db 3 << 6 | 0
+ dw Song_OakIntro_Ch0
+ db 1
+ dw Song_OakIntro_Ch1
+ db 2
+ dw Song_OakIntro_Ch2
+ db 3
+ dw Song_OakIntro_Ch3
+
+Song_OakIntro_Ch0:: ; ec691 (3b:4691)
+ tempo 152
+ volume 7, 7
+ vibrato 9, 2, 5
+ duty 1
+
+Song_OakIntro_branch_ec69b::
+ notetype 12, 11, 2
+ octave 2
+ B_ 4
+ octave 3
+ G# 6
+ F# 2
+ E_ 2
+ D# 1
+ F# 1
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ A_ 2
+ G# 4
+ F# 4
+ octave 2
+ B_ 4
+ octave 3
+ G# 6
+ F# 2
+ E_ 2
+ D# 1
+ F# 1
+ B_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ A_ 2
+ G# 4
+ B_ 4
+ notetype 8, 11, 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ E_ 2
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ D# 2
+ octave 3
+ G# 2
+ octave 4
+ D# 2
+ D# 2
+ octave 3
+ G# 2
+ octave 4
+ D# 2
+ C# 2
+ octave 3
+ F# 2
+ octave 4
+ C# 2
+ C# 2
+ octave 3
+ F# 2
+ octave 4
+ C# 2
+ octave 3
+ B_ 2
+ E_ 2
+ B_ 2
+ B_ 2
+ E_ 2
+ G# 2
+ F# 2
+ G# 2
+ A_ 2
+ A_ 2
+ F# 2
+ A_ 2
+ F# 2
+ G# 2
+ A_ 2
+ A_ 2
+ F# 2
+ A_ 2
+ G# 2
+ E_ 2
+ B_ 2
+ B_ 2
+ E_ 2
+ B_ 2
+ B_ 2
+ E_ 2
+ B_ 2
+ B_ 2
+ E_ 2
+ B_ 2
+ A_ 2
+ B_ 2
+ A_ 2
+ octave 4
+ C# 2
+ octave 3
+ B_ 2
+ octave 4
+ C# 2
+ D_ 2
+ octave 3
+ B_ 2
+ octave 4
+ D_ 2
+ F# 2
+ E_ 2
+ D# 2
+ E_ 2
+ octave 3
+ B_ 2
+ octave 4
+ E_ 2
+ E_ 2
+ octave 3
+ B_ 2
+ octave 4
+ E_ 2
+ E_ 2
+ octave 3
+ B_ 2
+ octave 4
+ E_ 2
+ E_ 2
+ octave 3
+ B_ 2
+ octave 4
+ E_ 2
+ loopchannel 0, Song_OakIntro_branch_ec69b
+ endchannel
+
+
+Song_OakIntro_Ch1:: ; ec729 (3b:4729)
+ vibrato 8, 2, 6
+ duty 3
+
+Song_OakIntro_branch_ec72e::
+ notetype 12, 13, 4
+ octave 4
+ E_ 6
+ octave 3
+ B_ 1
+ octave 4
+ E_ 1
+ F# 6
+ A_ 2
+ G# 3
+ E_ 1
+ F# 8
+ octave 3
+ D# 4
+ octave 4
+ E_ 6
+ octave 3
+ B_ 1
+ octave 4
+ E_ 1
+ F# 6
+ A_ 2
+ G# 3
+ E_ 1
+ B_ 8
+ octave 3
+ G# 4
+ octave 5
+ C# 6
+ octave 4
+ B_ 1
+ A_ 1
+ B_ 6
+ A_ 1
+ G# 1
+ A_ 6
+ G# 1
+ F# 1
+ G# 4
+ F# 2
+ E_ 2
+ D_ 2
+ D_ 1
+ E_ 1
+ F# 8
+ A_ 4
+ G# 3
+ F# 1
+ E_ 8
+ F# 2
+ E_ 2
+ stereopanning 70
+ D# 6
+ D_ 2
+ D_ 1
+ E_ 1
+ F# 2
+ F# 1
+ G# 1
+ A_ 4
+ octave 5
+ C# 4
+ octave 4
+ B_ 3
+ A_ 1
+ G# 8
+ rest 4
+ loopchannel 0, Song_OakIntro_branch_ec72e
+ endchannel
+
+
+Song_OakIntro_Ch2:: ; ec779 (3b:4779)
+ vibrato 9, 2, 8
+
+Song_OakIntro_branch_ec77c::
+ notetype 12, 1, 1
+ octave 3
+ E_ 2
+ rest 2
+ octave 2
+ B_ 6
+ octave 3
+ D_ 1
+ C# 1
+ D_ 2
+ D# 2
+ E_ 2
+ rest 2
+ octave 2
+ B_ 6
+ octave 3
+ D_ 1
+ C# 1
+ octave 2
+ A_ 2
+ octave 3
+ C# 2
+ E_ 2
+ rest 2
+ octave 2
+ B_ 6
+ octave 3
+ D_ 1
+ C# 1
+ D_ 2
+ D# 2
+ E_ 2
+ rest 2
+ octave 2
+ B_ 4
+ octave 3
+ C# 2
+ octave 2
+ B_ 2
+ octave 3
+ D_ 2
+ F# 2
+ E_ 2
+ rest 2
+ octave 2
+ A_ 2
+ rest 2
+ octave 3
+ D# 2
+ rest 2
+ octave 2
+ G# 2
+ rest 2
+ octave 3
+ C# 2
+ rest 2
+ octave 2
+ F# 2
+ rest 2
+ B_ 2
+ rest 2
+ E_ 2
+ G# 2
+ F# 2
+ rest 2
+ A_ 2
+ rest 2
+ F# 2
+ rest 2
+ A_ 2
+ rest 2
+ G# 2
+ rest 2
+ B_ 2
+ rest 2
+ G# 2
+ rest 2
+ B_ 2
+ rest 2
+ F# 2
+ rest 2
+ A_ 2
+ rest 2
+ octave 3
+ C# 2
+ rest 2
+ octave 2
+ A_ 2
+ octave 3
+ C# 2
+ octave 2
+ B_ 2
+ rest 2
+ octave 3
+ E_ 2
+ rest 2
+ G# 2
+ rest 2
+ E_ 2
+ rest 2
+ loopchannel 0, Song_OakIntro_branch_ec77c
+ endchannel
+
+
+Song_OakIntro_Ch3:: ; ec7e7 (3b:47e7)
+ drumset 0
+
+Song_OakIntro_branch_ec7e9::
+ dspeed 12
+ snare3 2
+ rest 2
+ snare3 1
+ rest 5
+ snare3 1
+ snare3 1
+ snare3 2
+ snare3 2
+ snare3 2
+ rest 2
+ dspeed 8
+ snare3 2
+ snare3 2
+ snare3 2
+ snare3 3
+ snare3 3
+ dspeed 12
+ snare3 1
+ rest 3
+ snare3 2
+ rest 2
+ snare3 2
+ rest 4
+ snare3 1
+ snare3 1
+ snare3 2
+ rest 2
+ snare3 2
+ rest 2
+ dspeed 8
+ snare3 2
+ snare3 2
+ snare3 2
+ snare3 3
+ snare3 3
+ snare3 2
+ snare3 2
+ snare3 2
+ snare3 3
+ rest 3
+ dspeed 12
+ snare3 1
+ rest 5
+ snare3 1
+ snare3 1
+ snare3 2
+ snare3 2
+ snare3 2
+ rest 2
+ dspeed 8
+ snare3 2
+ snare3 2
+ snare3 2
+ snare3 3
+ rest 3
+ dspeed 12
+ snare3 1
+ rest 3
+ snare3 2
+ rest 2
+ snare3 2
+ rest 4
+ snare3 1
+ snare3 1
+ snare3 2
+ snare3 2
+ snare3 2
+ rest 2
+ dspeed 8
+ snare3 2
+ snare3 2
+ snare3 2
+ snare3 3
+ rest 3
+ snare3 3
+ snare3 3
+ snare3 3
+ rest 3
+ dspeed 12
+ snare3 1
+ rest 5
+ snare3 1
+ snare3 1
+ snare3 2
+ snare3 2
+ snare3 2
+ rest 2
+ dspeed 8
+ snare3 2
+ snare3 2
+ snare3 2
+ snare3 3
+ rest 3
+ snare3 3
+ rest 3
+ loopchannel 0, Song_OakIntro_branch_ec7e9
+ endchannel
+; 0xec858
diff --git a/audio/songs/route1.asm b/audio/songs/route1.asm
new file mode 100755
index 0000000..0ad9311
--- /dev/null
+++ b/audio/songs/route1.asm
@@ -0,0 +1,426 @@
+INCLUDE "constants.asm"
+
+SECTION "Song Route1", ROMX[$44c2], BANK[$3b]
+
+Song_Route1:: ; ec4c2 (3b:44c2)
+ db 3 << 6 | 0
+ dw Song_Route1_Ch0
+ db 1
+ dw Song_Route1_Ch1
+ db 2
+ dw Song_Route1_Ch2
+ db 3
+ dw Song_Route1_Ch3
+
+Song_Route1_Ch0:: ; ec4ce (3b:44ce)
+ tempo 152
+ volume 7, 7
+ vibrato 4, 2, 3
+ duty 2
+ toggleperfectpitch
+ rest 1
+ rest 2
+
+Song_Route1_branch_ec4db::
+ notetype 12, 10, 1
+ rest 4
+ octave 4
+ D_ 2
+ D_ 6
+ D_ 2
+ D_ 6
+ D_ 2
+ D_ 1
+ C# 1
+ octave 3
+ B_ 1
+ octave 4
+ C# 1
+ octave 3
+ A_ 2
+ A_ 2
+ A_ 6
+ octave 4
+ C# 2
+ C# 6
+ C# 2
+ C# 4
+ octave 3
+ A_ 2
+ octave 4
+ C# 2
+ octave 3
+ B_ 2
+ octave 4
+ C# 4
+ octave 3
+ A_ 2
+ A_ 6
+ octave 4
+ D_ 2
+ D_ 6
+ D_ 2
+ D_ 6
+ D_ 2
+ D_ 1
+ E_ 1
+ D_ 1
+ C# 1
+ octave 3
+ B_ 2
+ A_ 2
+ A_ 6
+ octave 4
+ C# 2
+ C# 6
+ octave 3
+ A_ 2
+ octave 4
+ E_ 2
+ octave 3
+ A_ 2
+ notetype 12, 10, 2
+ octave 4
+ G_ 4
+ E_ 4
+ F# 2
+ notetype 12, 10, 1
+ octave 3
+ A_ 2
+ A_ 6
+ A_ 2
+ F# 2
+ A_ 4
+ B_ 2
+ octave 4
+ C# 2
+ octave 3
+ B_ 4
+ A_ 2
+ F# 2
+ A_ 4
+ G_ 2
+ E_ 2
+ C# 4
+ A_ 2
+ octave 4
+ D_ 2
+ octave 3
+ A_ 4
+ B_ 2
+ G_ 2
+ B_ 4
+ octave 4
+ D_ 2
+ E_ 2
+ C# 2
+ D_ 2
+ octave 3
+ A_ 2
+ A_ 2
+ loopchannel 0, Song_Route1_branch_ec4db
+ endchannel
+
+
+Song_Route1_Ch1:: ; ec546 (3b:4546)
+ duty 2
+
+Song_Route1_branch_ec548::
+ notetype 12, 13, 1
+ callchannel Song_Route1_branch_ec55b
+ callchannel Song_Route1_branch_ec56e
+ callchannel Song_Route1_branch_ec55b
+ callchannel Song_Route1_branch_ec586
+ loopchannel 0, Song_Route1_branch_ec548
+
+Song_Route1_branch_ec55b::
+ octave 4
+ D_ 1
+ E_ 1
+ F# 2
+ F# 2
+ F# 2
+ D_ 1
+ E_ 1
+ F# 2
+ F# 2
+ F# 2
+ D_ 1
+ E_ 1
+ F# 2
+ F# 2
+ G_ 3
+ F# 1
+ E_ 6
+ endchannel
+
+Song_Route1_branch_ec56e::
+ C# 1
+ D_ 1
+ E_ 2
+ E_ 2
+ E_ 2
+ C# 1
+ D_ 1
+ E_ 2
+ E_ 2
+ E_ 2
+ C# 1
+ D_ 1
+ stereopanning 41
+ D# 8
+ E_ 2
+ E_ 2
+ F# 1
+ E_ 1
+ E_ 1
+ F# 1
+ D_ 4
+ F# 2
+ endchannel
+
+Song_Route1_branch_ec586::
+ C# 1
+ D_ 1
+ E_ 2
+ G_ 2
+ F# 2
+ E_ 2
+ D_ 2
+ C# 2
+ octave 3
+ B_ 2
+ octave 4
+ C# 2
+ notetype 12, 13, 2
+ B_ 4
+ notetype 6, 13, 1
+ octave 3
+ B_ 1
+ octave 4
+ C# 1
+ notetype 12, 13, 1
+ octave 3
+ B_ 1
+ A_ 1
+ octave 4
+ C# 1
+ D_ 6
+ notetype 12, 13, 2
+ F# 1
+ G_ 1
+ A_ 2
+ A_ 2
+ F# 2
+ D_ 2
+ octave 5
+ D_ 2
+ C# 2
+ octave 4
+ B_ 2
+ octave 5
+ C# 2
+ octave 4
+ A_ 2
+ F# 2
+ D_ 3
+ F# 1
+ E_ 6
+ F# 1
+ G_ 1
+ A_ 2
+ A_ 2
+ F# 2
+ A_ 2
+ octave 5
+ D_ 2
+ C# 2
+ octave 4
+ B_ 3
+ G_ 1
+ A_ 2
+ octave 5
+ D_ 2
+ C# 2
+ E_ 2
+ D_ 2
+ notetype 12, 13, 1
+ octave 4
+ D_ 2
+ D_ 2
+ endchannel
+ endchannel
+
+
+Song_Route1_Ch2:: ; ec5d6 (3b:45d6)
+ vibrato 8, 2, 5
+ notetype 12, 1, 3
+
+Song_Route1_branch_ec5dc::
+ rest 2
+ octave 4
+ D_ 4
+ C# 4
+ octave 3
+ B_ 4
+ A_ 4
+ octave 4
+ D_ 4
+ octave 3
+ A_ 4
+ B_ 4
+ A_ 4
+ octave 4
+ C# 4
+ octave 3
+ A_ 4
+ B_ 4
+ octave 4
+ C_ 4
+ C# 4
+ octave 3
+ A_ 4
+ octave 4
+ D_ 4
+ octave 3
+ A_ 4
+ octave 4
+ D_ 4
+ C# 4
+ octave 3
+ B_ 4
+ A_ 4
+ octave 4
+ D_ 4
+ octave 3
+ A_ 4
+ B_ 4
+ A_ 4
+ octave 4
+ C# 4
+ octave 3
+ B_ 4
+ A_ 4
+ B_ 4
+ octave 4
+ C# 4
+ octave 3
+ A_ 4
+ octave 4
+ D_ 4
+ octave 3
+ A_ 4
+ octave 4
+ D_ 8
+ octave 3
+ G_ 8
+ A_ 8
+ octave 4
+ C# 8
+ D_ 8
+ octave 3
+ G_ 8
+ A_ 8
+ octave 4
+ D_ 6
+ loopchannel 0, Song_Route1_branch_ec5dc
+ endchannel
+
+
+Song_Route1_Ch3:: ; ec623 (3b:4623)
+ drumset 2
+
+Song_Route1_branch_ec625::
+ dspeed 12
+ rest 4
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ rest 4
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ snare4 2
+ snare4 2
+ rest 4
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ rest 4
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ rest 4
+ snare4 2
+ snare4 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ rest 4
+ snare4 2
+ snare4 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ rest 4
+ snare4 2
+ snare4 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ snare4 2
+ rest 2
+ snare4 2
+ snare4 2
+ loopchannel 0, Song_Route1_branch_ec625
+ endchannel
+; 0xec685
diff --git a/audio/songs/spottedrocket.asm b/audio/songs/spottedrocket.asm
new file mode 100755
index 0000000..aef6bb5
--- /dev/null
+++ b/audio/songs/spottedrocket.asm
@@ -0,0 +1,95 @@
+INCLUDE "constants.asm"
+
+SECTION "Song SpottedRocket", ROMX[$5978], BANK[$3b]
+
+Song_SpottedRocket:: ; ed978 (3b:5978)
+ db 2 << 6 | 0
+ dw Song_SpottedRocket_Ch0
+ db 1
+ dw Song_SpottedRocket_Ch1
+ db 2
+ dw Song_SpottedRocket_Ch2
+
+Song_SpottedRocket_Ch0:: ; ed981 (3b:5981)
+ tempo 124
+ volume 7, 7
+ duty 2
+ toggleperfectpitch
+ rest 1
+ rest 2
+ notetype 12, 11, 1
+ rest 4
+ octave 3
+ D_ 2
+ C# 2
+ notetype 12, 4, 15
+ D_ 4
+
+Song_SpottedRocket_branch_ed996::
+ notetype 12, 10, 1
+ D_ 4
+ D_ 4
+ D_ 4
+ notetype 12, 7, 0
+ D_ 4
+ loopchannel 0, Song_SpottedRocket_branch_ed996
+
+
+Song_SpottedRocket_Ch1:: ; ed9a4 (3b:59a4)
+ duty 1
+ notetype 12, 11, 6
+ octave 3
+ B_ 2
+ A# 2
+ B_ 8
+
+Song_SpottedRocket_branch_ed9ad::
+ notetype 12, 12, 2
+ octave 4
+ D# 2
+ D_ 2
+ C# 2
+ C_ 2
+ octave 3
+ B_ 4
+ B_ 4
+ B_ 4
+ B_ 4
+ B_ 4
+ notetype 12, 4, 15
+ A# 4
+ notetype 12, 12, 2
+ G_ 2
+ G# 2
+ A_ 2
+ A# 2
+ B_ 4
+ B_ 4
+ B_ 4
+ B_ 4
+ B_ 4
+ notetype 12, 3, 15
+ A# 4
+ notetype 12, 12, 2
+ loopchannel 0, Song_SpottedRocket_branch_ed9ad
+
+
+Song_SpottedRocket_Ch2:: ; ed9d6 (3b:59d6)
+ notetype 12, 1, 0
+ rest 8
+ octave 4
+ F# 1
+ rest 1
+ F_ 1
+ rest 1
+
+Song_SpottedRocket_branch_ed9df::
+ F# 1
+ rest 3
+ F# 1
+ rest 3
+ F# 1
+ rest 3
+ A# 4
+ loopchannel 0, Song_SpottedRocket_branch_ed9df
+; 0xed9ea
diff --git a/audio/songs/title.asm b/audio/songs/title.asm
new file mode 100755
index 0000000..087980d
--- /dev/null
+++ b/audio/songs/title.asm
@@ -0,0 +1,695 @@
+INCLUDE "constants.asm"
+
+SECTION "Song Title", ROMX[$62fe], BANK[$3c]
+
+Song_Title:: ; f22fe (3c:62fe)
+ db 3 << 6 | 0
+ dw Song_Title_Ch0
+ db 1
+ dw Song_Title_Ch1
+ db 2
+ dw Song_Title_Ch2
+ db 3
+ dw Song_Title_Ch3
+
+Song_Title_Ch0:: ; f230a (3c:630a)
+ tempo 144
+ volume 7, 7
+ vibrato 9, 3, 4
+ duty 3
+ notetype 12, 12, 1
+ octave 2
+ E_ 1
+ G_ 1
+ B_ 1
+ octave 3
+ D_ 1
+ octave 2
+ G_ 4
+ G_ 6
+ G_ 1
+ G_ 1
+ G_ 4
+ G_ 4
+ G_ 4
+ notetype 8, 12, 1
+ A_ 2
+ A_ 2
+ A_ 2
+ A_ 2
+ A_ 2
+ F# 2
+
+Song_Title_branch_f232e::
+ callchannel Song_Title_branch_f2395
+ callchannel Song_Title_branch_f239f
+ callchannel Song_Title_branch_f2395
+ octave 3
+ C_ 8
+ notetype 8, 12, 6
+ E_ 4
+ E_ 4
+ C_ 4
+ notetype 12, 12, 6
+ octave 2
+ B_ 8
+ notetype 8, 14, 7
+ octave 3
+ F_ 4
+ E_ 4
+ C_ 4
+ notetype 12, 14, 7
+ D_ 10
+ notetype 12, 12, 6
+ octave 2
+ B_ 2
+ octave 3
+ C_ 2
+ D_ 2
+ callchannel Song_Title_branch_f2395
+ callchannel Song_Title_branch_f239f
+ callchannel Song_Title_branch_f2395
+ C_ 6
+ C_ 6
+ E_ 4
+ D_ 6
+ F_ 2
+ G_ 2
+ D_ 4
+ G_ 2
+ G_ 6
+ A_ 4
+ F_ 2
+ A_ 2
+ octave 4
+ C_ 2
+ octave 3
+ D_ 12
+ E_ 4
+ F_ 8
+ G_ 4
+ F_ 4
+ E_ 12
+ F_ 4
+ G_ 8
+ notetype 12, 11, 6
+ octave 4
+ C_ 4
+ C# 4
+ callchannel Song_Title_branch_f23b3
+ notetype 8, 11, 4
+ octave 4
+ C_ 4
+ C_ 4
+ C# 4
+ callchannel Song_Title_branch_f23b3
+ notetype 8, 11, 2
+ octave 3
+ E_ 4
+ E_ 4
+ C# 4
+ loopchannel 0, Song_Title_branch_f232e
+
+Song_Title_branch_f2395::
+ notetype 12, 12, 6
+ octave 3
+ D_ 6
+ octave 2
+ B_ 2
+ octave 3
+ D_ 8
+ endchannel
+
+Song_Title_branch_f239f::
+ C_ 6
+ F_ 6
+ C_ 4
+ D_ 8
+ notetype 12, 14, 7
+ F_ 6
+ E_ 1
+ D# 1
+ D_ 8
+ notetype 8, 12, 6
+ C_ 4
+ octave 2
+ B_ 4
+ octave 3
+ C_ 4
+ endchannel
+
+Song_Title_branch_f23b3::
+ notetype 12, 12, 1
+ D_ 1
+ rest 1
+ octave 2
+ D_ 1
+ D_ 1
+ D_ 1
+ rest 1
+ D_ 1
+ D_ 1
+ D_ 1
+ rest 1
+ D_ 1
+ D_ 1
+ D_ 1
+ rest 1
+ D_ 1
+ D_ 1
+ D_ 1
+ rest 1
+ D_ 1
+ D_ 1
+ D_ 1
+ rest 1
+ D_ 1
+ D_ 1
+ endchannel
+
+
+Song_Title_Ch1:: ; f23d0 (3c:63d0)
+ vibrato 16, 4, 6
+ duty 1
+ notetype 12, 14, 1
+ octave 2
+ G_ 1
+ B_ 1
+ octave 3
+ D_ 1
+ F# 1
+ G_ 4
+ G_ 6
+ G_ 1
+ G_ 1
+ G_ 4
+ G_ 4
+ G_ 4
+ notetype 8, 14, 1
+ F_ 2
+ F_ 2
+ F_ 2
+ F_ 2
+ F_ 2
+ F# 2
+
+Song_Title_branch_f23ee::
+ vibrato 16, 4, 6
+ callchannel Song_Title_branch_f248a
+ unknown_f9
+ octave 2
+ A_ 4
+ F_ 4
+ callchannel Song_Title_branch_f2496
+ octave 2
+ A_ 8
+ B_ 16
+ callchannel Song_Title_branch_f248a
+ octave 2
+ A_ 6
+ F_ 2
+ notetype 8, 14, 7
+ octave 4
+ C_ 4
+ octave 3
+ B_ 4
+ octave 4
+ C_ 4
+ notetype 12, 14, 7
+ D_ 8
+ notetype 12, 9, 5
+ octave 2
+ D_ 6
+ D_ 1
+ F# 1
+ G_ 16
+ callchannel Song_Title_branch_f248a
+ octave 2
+ A_ 2
+ F_ 6
+ callchannel Song_Title_branch_f2496
+ octave 3
+ C_ 2
+ octave 2
+ A_ 6
+ B_ 6
+ G_ 2
+ F_ 8
+ callchannel Song_Title_branch_f248a
+ notetype 8, 9, 5
+ octave 2
+ G_ 4
+ F_ 5
+ A_ 3
+ notetype 8, 14, 6
+ octave 4
+ F_ 4
+ E_ 4
+ F_ 4
+ notetype 12, 14, 7
+ G_ 6
+ A# 2
+ G_ 8
+ unknown_f9
+ vibrato 16, 2, 6
+ duty 3
+ notetype 12, 0, 11
+ G_ 8
+ notetype 12, 14, 7
+ A_ 8
+ duty 1
+ notetype 12, 14, 7
+ A# 6
+ F_ 2
+ F_ 8
+ octave 3
+ D_ 8
+ octave 4
+ A# 4
+ B_ 4
+ octave 5
+ C_ 6
+ octave 4
+ G_ 2
+ G_ 8
+ octave 3
+ E_ 8
+ notetype 12, 13, 7
+ octave 5
+ C_ 4
+ C# 4
+ callchannel Song_Title_branch_f24a2
+ rest 3
+ D_ 1
+ rest 3
+ D_ 1
+ notetype 8, 14, 5
+ octave 5
+ C_ 4
+ C_ 4
+ C# 4
+ callchannel Song_Title_branch_f24a2
+ D_ 1
+ rest 2
+ D_ 1
+ rest 3
+ D_ 1
+ notetype 8, 14, 3
+ octave 5
+ C_ 4
+ C_ 4
+ octave 4
+ B_ 4
+ loopchannel 0, Song_Title_branch_f23ee
+
+Song_Title_branch_f248a::
+ notetype 12, 14, 7
+ octave 3
+ G_ 6
+ B_ 2
+ octave 4
+ D_ 8
+ notetype 12, 9, 5
+ endchannel
+
+Song_Title_branch_f2496::
+ notetype 12, 14, 7
+ octave 4
+ F_ 6
+ E_ 1
+ D# 1
+ D_ 8
+ notetype 12, 9, 5
+ endchannel
+
+Song_Title_branch_f24a2::
+ notetype 12, 14, 1
+ D_ 1
+ rest 2
+ octave 4
+ D_ 1
+ rest 3
+ D_ 1
+ rest 3
+ D_ 1
+ rest 3
+ D_ 1
+ endchannel
+
+
+Song_Title_Ch2:: ; f24b0 (3c:64b0)
+ notetype 12, 1, 0
+ octave 3
+ G_ 1
+ rest 1
+ D_ 1
+ rest 1
+ G_ 1
+ rest 3
+ G_ 1
+ rest 5
+ G_ 1
+ G_ 1
+ G_ 1
+ rest 3
+ G_ 1
+ rest 3
+ G_ 1
+ rest 3
+ notetype 8, 1, 0
+ F_ 2
+ F_ 2
+ F_ 2
+ F_ 2
+ F_ 2
+ A_ 2
+
+Song_Title_branch_f24cd::
+ callchannel Song_Title_branch_f253a
+ callchannel Song_Title_branch_f2541
+
+Song_Title_branch_f24d3::
+ callchannel Song_Title_branch_f253a
+ callchannel Song_Title_branch_f253a
+ callchannel Song_Title_branch_f253a
+ callchannel Song_Title_branch_f2541
+ loopchannel 3, Song_Title_branch_f24d3
+ callchannel Song_Title_branch_f253a
+ G_ 6
+ D_ 3
+ A_ 6
+ F_ 3
+ A_ 3
+ F_ 3
+ callchannel Song_Title_branch_f2548
+ A# 3
+ F_ 3
+ callchannel Song_Title_branch_f2548
+ B_ 3
+ G_ 3
+ callchannel Song_Title_branch_f254d
+ octave 4
+ C_ 3
+ octave 3
+ G_ 3
+ callchannel Song_Title_branch_f254d
+ octave 4
+ C# 3
+ octave 3
+ A_ 3
+ callchannel Song_Title_branch_f2556
+ octave 5
+ pitchbend 0, 67
+ D_ 4
+ rest 4
+ octave 6
+ pitchbend 0, 51
+ D_ 4
+ octave 5
+ pitchbend 0, 67
+ D_ 4
+ rest 2
+ notetype 8, 1, 0
+ octave 4
+ C_ 4
+ C_ 4
+ C# 4
+ callchannel Song_Title_branch_f2556
+ octave 6
+ pitchbend 0, 51
+ D_ 4
+ rest 4
+ octave 5
+ pitchbend 0, 67
+ D_ 4
+ rest 6
+ notetype 8, 1, 0
+ octave 4
+ C_ 4
+ C_ 4
+ octave 3
+ B_ 4
+ loopchannel 0, Song_Title_branch_f24cd
+
+Song_Title_branch_f253a::
+ G_ 6
+ D_ 3
+ G_ 6
+ D_ 3
+ G_ 3
+ D_ 3
+ endchannel
+
+Song_Title_branch_f2541::
+ F_ 6
+ C_ 3
+ F_ 6
+ C_ 3
+ F_ 3
+ C_ 3
+ endchannel
+
+Song_Title_branch_f2548::
+ A# 6
+ F_ 3
+ A# 6
+ F_ 3
+ endchannel
+
+Song_Title_branch_f254d::
+ octave 4
+ C_ 6
+ octave 3
+ G_ 3
+ octave 4
+ C_ 6
+ octave 3
+ G_ 3
+ endchannel
+
+Song_Title_branch_f2556::
+ notetype 12, 1, 0
+ octave 4
+ D_ 1
+ rest 5
+ endchannel
+
+
+Song_Title_Ch3:: ; f255d (3c:655d)
+ drumset 0
+ dspeed 6
+ rest 4
+ snare3 1
+ snare3 1
+ snare4 1
+ snare4 1
+ dspeed 12
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare2 1
+ snare2 1
+ snare2 1
+ rest 3
+ snare2 1
+ rest 3
+ snare2 1
+ rest 3
+ dspeed 8
+ snare3 2
+ snare4 2
+ snare2 2
+ snare3 2
+ snare2 2
+ snare1 2
+
+Song_Title_branch_f257c::
+ dspeed 12
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare2 1
+ snare2 1
+ snare3 1
+ rest 3
+ callchannel Song_Title_branch_f263c
+ callchannel Song_Title_branch_f263c
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare2 1
+ snare2 1
+ snare3 1
+ rest 1
+ snare3 1
+ snare2 1
+ callchannel Song_Title_branch_f2645
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare2 1
+ snare3 1
+ snare2 1
+ rest 1
+ snare2 1
+ rest 1
+ callchannel Song_Title_branch_f2645
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare2 1
+ snare3 1
+ snare2 1
+ rest 1
+ dspeed 6
+ snare3 1
+ snare3 1
+ snare4 1
+ snare4 1
+ dspeed 12
+ callchannel Song_Title_branch_f263c
+ callchannel Song_Title_branch_f2645
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare2 1
+ snare3 1
+ snare2 1
+ rest 3
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare3 1
+ snare2 1
+ snare2 1
+ rest 1
+ snare3 1
+ snare2 1
+ callchannel Song_Title_branch_f263c
+ callchannel Song_Title_branch_f2645
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare3 1
+ snare2 1
+ snare2 1
+ rest 1
+ snare4 1
+ snare3 1
+ snare2 1
+ rest 3
+ snare3 1
+ rest 5
+ snare2 1
+ snare4 1
+ snare2 1
+ rest 1
+ dspeed 6
+ snare3 1
+ snare3 1
+ snare4 1
+ snare4 1
+ dspeed 12
+ snare1 1
+ rest 3
+ snare2 1
+ rest 5
+ snare3 1
+ snare2 1
+ snare1 1
+ rest 3
+ snare2 1
+ rest 3
+ snare3 1
+ rest 5
+ snare3 1
+ snare2 1
+ snare3 1
+ rest 3
+ snare2 1
+ rest 3
+ snare3 1
+ rest 5
+ snare2 1
+ snare3 1
+ snare4 1
+ rest 1
+ snare3 1
+ snare2 1
+ snare2 1
+ rest 3
+ snare3 1
+ rest 5
+ snare2 1
+ snare3 1
+ snare2 1
+ rest 3
+ snare5 1
+ rest 5
+ snare2 1
+ rest 3
+ snare3 1
+ snare2 1
+ snare1 1
+ rest 5
+ snare2 1
+ snare3 1
+ snare2 1
+ rest 1
+ snare1 1
+ rest 1
+ dspeed 8
+ snare2 4
+ snare3 4
+ snare1 4
+ dspeed 12
+ snare5 1
+ rest 5
+ snare2 1
+ rest 3
+ snare3 1
+ snare2 1
+ snare3 1
+ rest 5
+ snare2 1
+ snare3 1
+ snare1 1
+ rest 1
+ snare3 1
+ snare2 1
+ dspeed 8
+ snare2 4
+ snare3 4
+ snare2 4
+ loopchannel 0, Song_Title_branch_f257c
+
+Song_Title_branch_f263c::
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare2 1
+ snare3 1
+ snare2 1
+ rest 3
+ endchannel
+
+Song_Title_branch_f2645::
+ snare2 1
+ rest 3
+ snare2 1
+ rest 5
+ snare3 1
+ snare2 1
+ snare2 1
+ rest 3
+ endchannel
+; 0xf264e
diff --git a/audio/songs/trainerbattle.asm b/audio/songs/trainerbattle.asm
new file mode 100755
index 0000000..a7e9a84
--- /dev/null
+++ b/audio/songs/trainerbattle.asm
@@ -0,0 +1,1872 @@
+INCLUDE "constants.asm"
+
+SECTION "Song TrainerBattle", ROMX[$4e31], BANK[$3b]
+
+Song_TrainerBattle:: ; ece31 (3b:4e31)
+ db 2 << 6 | 0
+ dw Song_TrainerBattle_Ch0
+ db 1
+ dw Song_TrainerBattle_Ch1
+ db 2
+ dw Song_TrainerBattle_Ch2
+
+Song_TrainerBattle_Ch0:: ; ece3a (3b:4e3a)
+ tempo 112
+ volume 7, 7
+ duty 3
+ vibrato 6, 3, 4
+ toggleperfectpitch
+ rest 1
+ rest 2
+ notetype 12, 11, 2
+ rest 8
+ octave 3
+ F_ 1
+ E_ 1
+ F_ 1
+ E_ 1
+ D# 1
+ E_ 1
+ D# 1
+ D_ 1
+ D# 1
+ D_ 1
+ C# 1
+ D_ 1
+ C# 1
+ C_ 1
+ C# 1
+ C_ 1
+ octave 2
+ B_ 1
+ octave 3
+ C_ 1
+ octave 2
+ B_ 1
+ A# 1
+ B_ 1
+ A# 1
+ A_ 1
+ A# 1
+ octave 3
+ D_ 6
+ E_ 6
+ F_ 4
+ D_ 2
+ E_ 4
+ F_ 6
+ C_ 4
+ D_ 6
+ E_ 6
+ F_ 4
+ D_ 2
+ E_ 4
+ F_ 6
+ C_ 2
+ C# 2
+ D_ 6
+ E_ 6
+ F_ 4
+ D_ 2
+ E_ 4
+ F_ 6
+ C_ 4
+ D_ 6
+ E_ 6
+ F_ 4
+ D_ 2
+ E_ 4
+ F_ 6
+ C_ 2
+ C# 2
+
+Song_TrainerBattle_branch_ece86::
+ notetype 12, 11, 5
+ D_ 2
+ E_ 4
+ C# 2
+ D_ 4
+ octave 2
+ B_ 4
+ F# 4
+ octave 3
+ E_ 2
+ D_ 4
+ C# 2
+ D_ 2
+ E_ 2
+ F_ 8
+ notetype 12, 11, 2
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ D# 1
+ D_ 1
+ C_ 1
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ F# 1
+ G_ 1
+ G# 1
+ G_ 1
+ F# 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ C_ 1
+ notetype 12, 11, 5
+ D_ 2
+ E_ 4
+ C# 2
+ D_ 4
+ octave 2
+ B_ 4
+ F# 4
+ octave 3
+ E_ 2
+ D_ 4
+ C# 2
+ octave 2
+ B_ 2
+ octave 3
+ C# 2
+ notetype 12, 10, 7
+ D_ 8
+ C# 8
+ octave 2
+ B_ 8
+ octave 3
+ C# 8
+ notetype 12, 11, 5
+ D_ 2
+ C# 2
+ octave 2
+ B_ 2
+ A_ 2
+ G_ 2
+ rest 2
+ octave 3
+ D_ 2
+ C# 2
+ octave 2
+ B_ 2
+ A_ 2
+ G_ 2
+ rest 2
+ octave 3
+ D_ 2
+ C# 2
+ octave 2
+ B_ 2
+ octave 3
+ C# 2
+ E_ 4
+ octave 2
+ G_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C# 1
+ D_ 4
+ octave 2
+ F# 1
+ G_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C# 4
+ octave 2
+ G_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ C# 1
+ D_ 4
+ octave 2
+ F# 1
+ G_ 1
+ A_ 1
+ B_ 1
+ octave 3
+ D_ 2
+ C# 2
+ octave 2
+ B_ 2
+ A_ 2
+ G_ 2
+ rest 2
+ octave 3
+ D_ 2
+ C# 2
+ octave 2
+ B_ 2
+ A_ 2
+ B_ 2
+ G_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ F# 2
+ G_ 2
+ A_ 2
+ B_ 2
+ A_ 2
+ G_ 2
+ A_ 2
+ rest 2
+ A_ 2
+ B_ 2
+ A_ 2
+ G_ 2
+ F# 2
+ G_ 2
+ A_ 2
+ E_ 2
+ G_ 2
+ F# 2
+ octave 2
+ B_ 1
+ octave 3
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ F# 1
+ G_ 1
+ G# 1
+ A_ 1
+ A# 1
+ B_ 1
+ octave 4
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ D_ 1
+ C# 1
+ C_ 1
+ octave 3
+ B_ 1
+ A# 1
+ A_ 1
+ G# 1
+ G_ 1
+ F# 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ C# 1
+ C_ 1
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ F# 1
+ G_ 1
+ G# 1
+ A_ 1
+ A# 1
+ B_ 1
+ octave 4
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ D# 1
+ D_ 1
+ C# 1
+ C_ 1
+ octave 3
+ B_ 1
+ A# 1
+ A_ 1
+ G# 1
+ G_ 1
+ F# 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ C# 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ F# 1
+ G_ 1
+ G# 1
+ A_ 1
+ A# 1
+ B_ 1
+ octave 4
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ C# 1
+ C_ 1
+ octave 3
+ B_ 1
+ A# 1
+ A_ 1
+ G# 1
+ G_ 1
+ F# 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ F# 1
+ G_ 1
+ G# 1
+ A_ 1
+ A# 1
+ B_ 1
+ octave 4
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ F# 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ C# 1
+ C_ 1
+ octave 3
+ B_ 1
+ A# 1
+ B_ 1
+ octave 4
+ C_ 1
+ C# 1
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ octave 3
+ A_ 4
+ octave 4
+ D_ 4
+ octave 3
+ A_ 2
+ D_ 1
+ E_ 1
+ F# 1
+ G_ 1
+ G# 1
+ A# 1
+ B_ 2
+ octave 4
+ C_ 2
+ octave 3
+ A_ 2
+ octave 4
+ C_ 2
+ octave 3
+ G_ 2
+ B_ 2
+ F_ 2
+ G_ 2
+ A_ 2
+ octave 4
+ C_ 2
+ D_ 2
+ rest 2
+ octave 3
+ A_ 4
+ octave 4
+ C_ 4
+ D_ 2
+ octave 3
+ F_ 1
+ G_ 1
+ A_ 1
+ B_ 1
+ octave 4
+ C_ 1
+ D_ 1
+ E_ 2
+ F_ 2
+ D_ 2
+ F_ 2
+ D_ 2
+ F_ 2
+ D_ 2
+ F_ 2
+ D_ 2
+ F_ 2
+ D_ 2
+ F_ 2
+ E_ 2
+ F_ 2
+ E_ 2
+ F_ 2
+ E_ 2
+ F_ 2
+ E_ 2
+ F_ 2
+ E_ 2
+ F_ 2
+ E_ 2
+ F_ 2
+ E_ 2
+ F_ 2
+ E_ 2
+ octave 3
+ B_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ C_ 2
+ E_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ D_ 2
+ F_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ C_ 2
+ octave 2
+ A_ 2
+ octave 3
+ C_ 2
+ E_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ D_ 2
+ F_ 2
+ D_ 16
+ C_ 16
+ octave 2
+ A# 16
+ G_ 12
+ octave 3
+ D_ 1
+ E_ 1
+ G_ 1
+ octave 4
+ C_ 1
+ D_ 8
+ F_ 8
+ octave 3
+ A# 8
+ octave 4
+ C_ 8
+ D_ 8
+ E_ 8
+ F_ 8
+ G_ 8
+ E_ 2
+ rest 4
+ E_ 2
+ rest 4
+ E_ 2
+ rest 2
+ E_ 2
+ rest 4
+ E_ 2
+ rest 4
+ E_ 2
+ rest 2
+ E_ 2
+ rest 4
+ E_ 2
+ rest 4
+ E_ 2
+ rest 2
+ E_ 2
+ rest 4
+ E_ 2
+ rest 4
+ E_ 2
+ rest 2
+ octave 3
+ C_ 2
+ D_ 4
+ octave 2
+ B_ 2
+ octave 3
+ C# 4
+ rest 2
+ C# 1
+ D_ 1
+ E_ 1
+ rest 1
+ D_ 1
+ rest 1
+ octave 2
+ B_ 1
+ rest 1
+ octave 3
+ C# 1
+ rest 9
+ D_ 1
+ D# 1
+ E_ 1
+ F_ 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ C# 1
+ rest 5
+ C# 1
+ D_ 1
+ E_ 1
+ rest 1
+ F_ 1
+ rest 1
+ E_ 1
+ rest 1
+ D_ 1
+ rest 1
+ D_ 2
+ E_ 2
+ F_ 2
+ G_ 2
+ D# 1
+ E_ 1
+ F_ 1
+ F# 1
+ F# 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ rest 9
+ F# 2
+ E_ 4
+ D# 2
+ E_ 2
+ F# 2
+ G# 2
+ E_ 8
+ F# 8
+ G_ 8
+ octave 4
+ C_ 4
+ octave 3
+ G_ 1
+ G# 1
+ A_ 1
+ A# 1
+ loopchannel 0, Song_TrainerBattle_branch_ece86
+
+
+Song_TrainerBattle_Ch1:: ; ed0d7 (3b:50d7)
+ duty 3
+ vibrato 10, 2, 5
+ notetype 12, 12, 2
+ octave 4
+ A_ 1
+ G# 1
+ G_ 1
+ F# 1
+ A_ 1
+ F_ 1
+ F# 1
+ F_ 1
+ A_ 1
+ E_ 1
+ F_ 1
+ E_ 1
+ A_ 1
+ D# 1
+ E_ 1
+ D# 1
+ A_ 1
+ D_ 1
+ D# 1
+ D_ 1
+ A_ 1
+ C# 1
+ D_ 1
+ C# 1
+ A_ 1
+ C_ 1
+ C# 1
+ C_ 1
+ A_ 1
+ octave 3
+ B_ 1
+ octave 4
+ C_ 1
+ octave 3
+ B_ 1
+ notetype 12, 14, 1
+ octave 4
+ B_ 16
+ rest 16
+ notetype 12, 13, 1
+ B_ 16
+ rest 12
+ A_ 4
+ notetype 12, 12, 2
+ octave 3
+ B_ 6
+ octave 4
+ C# 6
+ D_ 4
+ octave 3
+ B_ 2
+ octave 4
+ C# 4
+ D_ 6
+ A_ 2
+ A# 2
+ B_ 6
+ octave 5
+ C# 6
+ D_ 4
+ octave 4
+ B_ 2
+ octave 5
+ C# 4
+ D_ 6
+ octave 4
+ A_ 4
+
+Song_TrainerBattle_branch_ed129::
+ notetype 12, 12, 7
+ octave 3
+ B_ 6
+ F# 14
+ B_ 4
+ F# 4
+ B_ 4
+ notetype 12, 5, 0
+ octave 4
+ C_ 8
+ notetype 12, 3, 0
+ C_ 8
+ notetype 12, 4, 14
+ C_ 8
+ notetype 12, 12, 7
+ C_ 8
+ octave 3
+ B_ 6
+ F# 14
+ B_ 4
+ F# 4
+ B_ 4
+ notetype 12, 9, 0
+ A_ 8
+ notetype 12, 5, 0
+ A_ 8
+ notetype 12, 4, 0
+ A_ 8
+ notetype 12, 3, 0
+ A_ 8
+ notetype 12, 12, 7
+ G_ 16
+ octave 4
+ D_ 8
+ octave 3
+ G_ 8
+ notetype 12, 8, 0
+ A_ 8
+ notetype 12, 5, 0
+ A_ 8
+ notetype 12, 4, 0
+ A_ 8
+ notetype 12, 6, 0
+ A_ 8
+ notetype 12, 12, 7
+ G_ 16
+ octave 4
+ E_ 8
+ F# 8
+ E_ 16
+ notetype 12, 12, 5
+ G_ 4
+ A_ 2
+ G_ 2
+ F# 2
+ E_ 2
+ D_ 2
+ E_ 2
+ notetype 12, 11, 7
+ F# 8
+ notetype 12, 5, 0
+ F# 8
+ notetype 12, 6, 0
+ F# 8
+ notetype 12, 7, 0
+ F# 8
+ notetype 12, 10, 0
+ G_ 8
+ notetype 12, 10, 7
+ G_ 8
+ notetype 12, 11, 7
+ G_ 4
+ notetype 12, 12, 5
+ A_ 2
+ G_ 2
+ G_ 2
+ F# 2
+ E_ 2
+ F# 2
+ notetype 12, 10, 0
+ G# 8
+ notetype 12, 7, 0
+ G# 8
+ notetype 12, 8, 0
+ G# 8
+ notetype 12, 6, 0
+ G# 8
+ notetype 12, 10, 0
+ A_ 16
+ notetype 12, 11, 0
+ octave 5
+ C# 8
+ E_ 8
+ notetype 12, 12, 0
+ D_ 4
+ octave 4
+ A_ 4
+ octave 5
+ C_ 2
+ notetype 12, 12, 7
+ octave 4
+ B_ 8
+ notetype 12, 6, 0
+ B_ 8
+ notetype 12, 6, 9
+ B_ 6
+ notetype 12, 9, 6
+ B_ 6
+ rest 2
+ notetype 12, 12, 0
+ octave 5
+ D_ 4
+ octave 4
+ A_ 4
+ A# 2
+ notetype 12, 11, 0
+ octave 5
+ F_ 14
+ notetype 12, 6, 0
+ G_ 16
+ notetype 12, 5, 0
+ E_ 16
+ notetype 12, 4, 0
+ E_ 16
+ notetype 12, 12, 7
+ octave 4
+ C_ 6
+ octave 3
+ A_ 14
+ octave 4
+ C_ 4
+ octave 3
+ A_ 4
+ octave 4
+ C_ 4
+ octave 3
+ A# 6
+ octave 4
+ F_ 14
+ octave 3
+ A# 4
+ octave 4
+ F_ 4
+ D_ 4
+ C_ 6
+ octave 3
+ A_ 14
+ octave 4
+ C_ 4
+ E_ 2
+ D_ 2
+ C_ 2
+ E_ 2
+ D_ 2
+ octave 3
+ A# 4
+ octave 4
+ F_ 10
+ G_ 6
+ F_ 6
+ D_ 4
+ notetype 12, 11, 0
+ F_ 16
+ E_ 16
+ D_ 16
+ E_ 16
+ notetype 12, 10, 0
+ octave 5
+ F_ 16
+ E_ 16
+ G_ 16
+ F_ 16
+ notetype 12, 13, 1
+ octave 3
+ A# 6
+ A# 6
+ A# 4
+ A_ 6
+ A_ 6
+ A_ 4
+ octave 4
+ C_ 6
+ C_ 6
+ C_ 4
+ octave 3
+ A# 6
+ A# 6
+ A_ 4
+ notetype 12, 12, 7
+ A_ 4
+ B_ 4
+ G_ 2
+ A_ 10
+ B_ 2
+ octave 4
+ C# 2
+ E_ 2
+ D_ 2
+ C# 2
+ octave 3
+ B_ 2
+ A# 16
+ rest 2
+ A# 2
+ octave 4
+ C_ 2
+ F_ 2
+ E_ 2
+ D_ 2
+ C_ 2
+ octave 3
+ A# 2
+ B_ 16
+ rest 2
+ B_ 2
+ octave 4
+ C# 2
+ G_ 2
+ F# 2
+ E_ 2
+ D_ 2
+ octave 3
+ B_ 2
+ octave 4
+ C_ 16
+ E_ 8
+ G_ 8
+ loopchannel 0, Song_TrainerBattle_branch_ed129
+
+
+Song_TrainerBattle_Ch2:: ; ed26a (3b:526a)
+ vibrato 0, 2, 0
+ notetype 12, 1, 4
+ octave 3
+ B_ 1
+ A# 1
+ A_ 1
+ G# 1
+ A_ 1
+ G# 1
+ G_ 1
+ F# 1
+ G_ 1
+ F# 1
+ F_ 1
+ E_ 1
+ F_ 1
+ E_ 1
+ D# 1
+ D_ 1
+ D# 1
+ D_ 1
+ C# 1
+ C_ 1
+ C# 1
+ C_ 1
+ octave 2
+ B_ 1
+ A# 1
+ B_ 1
+ A# 1
+ A_ 1
+ G# 1
+ A_ 2
+ A# 2
+ B_ 2
+ B_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ F_ 2
+ E_ 2
+ D_ 2
+ octave 2
+ B_ 2
+ B_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ C_ 2
+ octave 2
+ B_ 2
+ B_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ F_ 2
+ E_ 2
+ D_ 2
+ octave 2
+ B_ 2
+ B_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ C_ 2
+ octave 2
+ B_ 2
+ B_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ F_ 2
+ E_ 2
+ D_ 2
+ octave 2
+ B_ 2
+ B_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ C_ 2
+ octave 2
+ B_ 2
+ B_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ F_ 2
+ E_ 2
+ D_ 2
+ octave 2
+ B_ 2
+ B_ 2
+ octave 3
+ D_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ D_ 2
+ octave 2
+ A# 2
+ octave 3
+ C_ 2
+
+Song_TrainerBattle_branch_ed2f7::
+ octave 2
+ A# 1
+ B_ 1
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ A_ 2
+ G_ 2
+ F# 2
+ E_ 2
+ D_ 2
+ C_ 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ D_ 2
+ C# 2
+ D_ 2
+ C# 2
+ octave 2
+ A_ 2
+ G# 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ G# 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ octave 3
+ D_ 2
+ octave 2
+ G_ 2
+ G# 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ D_ 2
+ C# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ D_ 2
+ E_ 2
+ F# 2
+ E_ 2
+ D_ 2
+ F# 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ D# 2
+ F_ 2
+ G_ 2
+ F_ 2
+ D# 2
+ G_ 2
+ C# 2
+ G# 2
+ C# 2
+ G# 2
+ C# 2
+ G# 2
+ C# 2
+ G# 2
+ C# 2
+ G# 2
+ E_ 2
+ F# 2
+ G# 2
+ F# 2
+ E_ 2
+ G# 2
+ D_ 2
+ A_ 2
+ D_ 2
+ A_ 2
+ D_ 2
+ A_ 2
+ D_ 2
+ A_ 2
+ D_ 2
+ A_ 2
+ F_ 2
+ G_ 2
+ A_ 2
+ G_ 2
+ F_ 2
+ E_ 2
+ D_ 4
+ octave 2
+ A_ 4
+ octave 3
+ C_ 2
+ G_ 2
+ octave 2
+ B_ 2
+ octave 3
+ G_ 2
+ octave 2
+ B_ 2
+ octave 3
+ G_ 2
+ octave 2
+ B_ 2
+ octave 3
+ G_ 2
+ octave 2
+ B_ 2
+ octave 3
+ G_ 2
+ octave 2
+ B_ 2
+ octave 3
+ G_ 2
+ octave 2
+ B_ 2
+ octave 3
+ G_ 2
+ octave 2
+ B_ 2
+ octave 3
+ G_ 2
+ D_ 4
+ octave 2
+ A_ 4
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 4
+ octave 3
+ F_ 4
+ octave 2
+ A# 4
+ octave 3
+ F_ 4
+ octave 2
+ A# 4
+ octave 3
+ E_ 4
+ octave 2
+ A# 4
+ octave 3
+ E_ 4
+ octave 2
+ A# 4
+ octave 3
+ D_ 4
+ octave 2
+ A# 4
+ octave 3
+ D_ 4
+ octave 2
+ A# 4
+ octave 3
+ E_ 4
+ octave 2
+ A# 4
+ octave 3
+ E_ 4
+ octave 2
+ A# 4
+ octave 3
+ F_ 4
+ octave 2
+ A# 4
+ octave 3
+ F_ 4
+ octave 2
+ A# 4
+ octave 3
+ E_ 4
+ octave 2
+ A# 4
+ octave 3
+ E_ 4
+ octave 2
+ A# 4
+ octave 3
+ D_ 4
+ octave 2
+ A# 4
+ octave 3
+ D_ 4
+ octave 2
+ A# 4
+ octave 3
+ E_ 4
+ octave 2
+ A# 4
+ octave 3
+ E_ 4
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ octave 2
+ B_ 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A_ 2
+ octave 3
+ E_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ A# 2
+ octave 3
+ F_ 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ C_ 2
+ G_ 2
+ F# 2
+ E_ 2
+ F# 2
+ E_ 2
+ D_ 2
+ C_ 2
+ loopchannel 0, Song_TrainerBattle_branch_ed2f7
+; 0xed5f4
diff --git a/audio/songs/victorytrainer.asm b/audio/songs/victorytrainer.asm
new file mode 100755
index 0000000..3fe523e
--- /dev/null
+++ b/audio/songs/victorytrainer.asm
@@ -0,0 +1,278 @@
+INCLUDE "constants.asm"
+
+SECTION "Song VictoryTrainer", ROMX[$59ea], BANK[$3b]
+
+Song_VictoryTrainer:: ; ed9ea (3b:59ea)
+ db 2 << 6 | 0
+ dw Song_VictoryTrainer_Ch0
+ db 1
+ dw Song_VictoryTrainer_Ch1
+ db 2
+ dw Song_VictoryTrainer_Ch2
+
+Song_VictoryTrainer_Ch0:: ; ed9f3 (3b:59f3)
+ tempo 224
+ volume 7, 7
+ duty 2
+ toggleperfectpitch
+ rest 1
+ rest 2
+ tempo 224
+ notetype 4, 10, 2
+ octave 4
+ D_ 2
+ tempo 224
+ D_ 2
+ D_ 2
+ D_ 2
+ octave 3
+ A_ 2
+ octave 4
+ D_ 2
+ notetype 4, 11, 3
+ F# 12
+ duty 1
+ tempo 224
+
+Song_VictoryTrainer_branch_eda18::
+ notetype 4, 6, 3
+ octave 3
+ A_ 6
+ F# 3
+ A_ 3
+ B_ 6
+ G# 3
+ B_ 3
+ octave 4
+ C# 3
+ octave 3
+ B_ 3
+ A_ 3
+ G_ 3
+ A_ 3
+ B_ 3
+ A_ 3
+ G_ 3
+ A_ 6
+ F# 3
+ A_ 3
+ B_ 6
+ G# 3
+ B_ 3
+ octave 4
+ C# 3
+ D_ 3
+ E_ 3
+ F# 3
+ C# 3
+ octave 3
+ B_ 3
+ A_ 3
+ octave 4
+ C# 3
+ octave 3
+ A_ 6
+ F# 3
+ A_ 3
+ B_ 6
+ G# 3
+ B_ 3
+ octave 4
+ C_ 6
+ octave 3
+ A_ 3
+ octave 4
+ C_ 3
+ D_ 3
+ octave 3
+ B_ 3
+ octave 4
+ D_ 6
+ C# 3
+ octave 3
+ B_ 3
+ A_ 3
+ G_ 3
+ F# 3
+ G_ 3
+ A_ 3
+ B_ 3
+ A_ 3
+ G_ 3
+ F# 3
+ E_ 3
+ F# 3
+ G_ 3
+ A_ 3
+ B_ 3
+ loopchannel 0, Song_VictoryTrainer_branch_eda18
+
+
+Song_VictoryTrainer_Ch1:: ; eda64 (3b:5a64)
+ duty 2
+ notetype 4, 12, 3
+ octave 4
+ A_ 2
+ A_ 2
+ A_ 2
+ A_ 2
+ B_ 2
+ octave 5
+ C# 2
+ notetype 4, 12, 4
+ D_ 12
+
+Song_VictoryTrainer_branch_eda75::
+ notetype 4, 8, 5
+ octave 4
+ D_ 6
+ octave 3
+ A_ 3
+ octave 4
+ D_ 3
+ E_ 6
+ octave 3
+ B_ 3
+ octave 4
+ E_ 3
+ F# 3
+ G_ 3
+ A_ 6
+ E_ 3
+ F# 3
+ G_ 6
+ D_ 6
+ octave 3
+ A_ 3
+ octave 4
+ D_ 3
+ E_ 6
+ octave 3
+ B_ 3
+ octave 4
+ E_ 3
+ F# 3
+ G_ 3
+ A_ 6
+ F# 3
+ G_ 3
+ A_ 6
+ D_ 6
+ octave 3
+ A_ 3
+ octave 4
+ D_ 3
+ E_ 6
+ octave 3
+ B_ 3
+ octave 4
+ E_ 3
+ F_ 6
+ C_ 3
+ F_ 3
+ G_ 3
+ D_ 3
+ G_ 6
+ notetype 4, 7, 0
+ F# 12
+ notetype 4, 7, 7
+ F# 12
+ notetype 4, 6, 0
+ E_ 12
+ notetype 4, 6, 7
+ E_ 12
+ loopchannel 0, Song_VictoryTrainer_branch_eda75
+
+
+Song_VictoryTrainer_Ch2:: ; edabd (3b:5abd)
+ notetype 4, 1, 0
+ octave 5
+ D_ 2
+ D_ 2
+ D_ 2
+ octave 4
+ B_ 2
+ A_ 2
+ G_ 2
+ A_ 12
+ notetype 4, 2, 1
+
+Song_VictoryTrainer_branch_edacc::
+ F# 3
+ rest 3
+ F# 3
+ rest 3
+ G# 3
+ rest 3
+ G# 3
+ rest 3
+ A_ 3
+ rest 3
+ A_ 3
+ rest 3
+ B_ 3
+ rest 3
+ B_ 3
+ rest 3
+ F# 3
+ rest 3
+ F# 3
+ rest 3
+ G# 3
+ rest 3
+ G# 3
+ rest 3
+ A_ 3
+ rest 3
+ A_ 3
+ rest 3
+ octave 5
+ C# 3
+ rest 3
+ C# 3
+ octave 4
+ A_ 3
+ F# 3
+ octave 5
+ D_ 3
+ octave 4
+ F# 3
+ rest 3
+ G# 3
+ octave 5
+ E_ 3
+ octave 4
+ G# 3
+ rest 3
+ A_ 3
+ octave 5
+ F_ 3
+ octave 4
+ A_ 3
+ rest 3
+ B_ 3
+ octave 5
+ G_ 3
+ octave 4
+ B_ 3
+ A# 3
+ A_ 3
+ rest 3
+ A_ 3
+ rest 3
+ A_ 3
+ rest 3
+ A_ 3
+ octave 5
+ C_ 3
+ C# 3
+ rest 3
+ C# 3
+ rest 3
+ C# 3
+ rest 3
+ C# 3
+ octave 4
+ A_ 3
+ loopchannel 0, Song_VictoryTrainer_branch_edacc
+; 0xedb1c
diff --git a/audio/songs/viridiancity.asm b/audio/songs/viridiancity.asm
new file mode 100755
index 0000000..4b3a35e
--- /dev/null
+++ b/audio/songs/viridiancity.asm
@@ -0,0 +1,677 @@
+INCLUDE "constants.asm"
+
+SECTION "Song ViridianCity", ROMX[$41b9], BANK[$3b]
+
+Song_ViridianCity:: ; ec1b9 (3b:41b9)
+ db 3 << 6 | 0
+ dw Song_ViridianCity_Ch0
+ db 1
+ dw Song_ViridianCity_Ch1
+ db 2
+ dw Song_ViridianCity_Ch2
+ db 3
+ dw Song_ViridianCity_Ch3
+
+Song_ViridianCity_branch_ec1c5::
+ tempo 232
+ loopchannel 0, Song_ViridianCity_branch_ec1cf
+
+Song_ViridianCity_Ch0:: ; ec1cc (3b:41cc)
+ tempo 144
+
+Song_ViridianCity_branch_ec1cf::
+ volume 7, 7
+ vibrato 8, 2, 4
+ duty 3
+
+Song_ViridianCity_branch_ec1d6::
+ notetype 12, 12, 5
+ octave 3
+ G# 4
+ F# 4
+ E_ 2
+ E_ 2
+ F# 2
+ D# 2
+ E_ 2
+ E_ 2
+ D# 2
+ C# 4
+ D# 4
+ E_ 2
+ D# 4
+ C# 2
+ E_ 2
+ E_ 4
+ notetype 12, 10, 5
+ C# 4
+ octave 2
+ B_ 6
+ octave 3
+ C# 2
+ C# 4
+ octave 2
+ B_ 4
+ notetype 12, 12, 5
+ callchannel Song_ViridianCity_branch_ec2de
+ octave 3
+ D# 6
+ E_ 2
+ octave 2
+ B_ 4
+ notetype 12, 10, 5
+ octave 3
+ C# 2
+ octave 2
+ B_ 2
+ A_ 4
+ B_ 4
+ B_ 2
+ octave 3
+ C# 2
+ D# 2
+ E_ 2
+ D# 2
+ C# 2
+ D# 2
+ notetype 12, 12, 5
+ G# 2
+ E_ 2
+ F# 2
+ E_ 2
+ E_ 4
+ F# 2
+ D# 2
+ E_ 4
+ D# 2
+ C# 4
+ D# 4
+ E_ 2
+ D# 2
+ C# 2
+ C# 2
+ E_ 2
+ E_ 4
+ notetype 12, 10, 5
+ C# 2
+ octave 2
+ A_ 2
+ B_ 6
+ octave 3
+ C# 2
+ C# 2
+ octave 2
+ B_ 2
+ B_ 4
+ notetype 12, 12, 5
+ callchannel Song_ViridianCity_branch_ec2de
+ octave 3
+ D# 4
+ D# 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ C# 2
+ G# 2
+ E_ 4
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ notetype 12, 10, 5
+ C# 4
+ octave 2
+ B_ 2
+ octave 3
+ D# 4
+ C# 2
+ E_ 4
+ notetype 12, 11, 3
+ callchannel Song_ViridianCity_branch_ec2eb
+ A_ 2
+ B_ 2
+ A_ 2
+ G# 2
+ A_ 4
+ F# 4
+ G# 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 4
+ G# 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ E_ 2
+ F# 2
+ E_ 2
+ D# 2
+ E_ 2
+ D# 2
+ C# 2
+ octave 2
+ B_ 2
+ octave 3
+
+Song_ViridianCity_branch_ec271::
+ C# 2
+ D# 2
+ C# 2
+ octave 2
+ B_ 4
+ B_ 2
+ octave 3
+ C# 2
+ D# 2
+ loopchannel 2, Song_ViridianCity_branch_ec271
+ E_ 2
+ octave 2
+ B_ 4
+ octave 3
+ E_ 4
+ octave 2
+ B_ 2
+ octave 3
+ C# 2
+ G# 2
+ G# 2
+ octave 2
+ B_ 2
+ octave 3
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ D# 2
+ octave 2
+ B_ 2
+ octave 3
+ callchannel Song_ViridianCity_branch_ec2eb
+ A_ 2
+ E_ 2
+ A_ 2
+ B_ 2
+ A_ 2
+ G# 2
+ A_ 2
+ F# 2
+ G# 2
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ C# 2
+ G# 2
+ C# 2
+ D# 2
+ B_ 2
+ E_ 2
+ G# 2
+ E_ 2
+ F# 2
+ E_ 4
+ G# 2
+ F# 2
+ D# 2
+ octave 2
+ B_ 2
+ octave 3
+ D# 4
+ F# 2
+ D# 2
+ D# 2
+ F# 2
+ octave 2
+ B_ 2
+ octave 3
+ E_ 2
+ octave 2
+ B_ 2
+ octave 3
+ D# 2
+ octave 2
+ B_ 2
+ B_ 2
+ octave 3
+ D# 2
+ notetype 12, 11, 6
+ F# 8
+ F# 4
+ D# 4
+ E_ 8
+ notetype 12, 8, 4
+ octave 2
+ B_ 4
+ octave 3
+ E_ 2
+ F# 2
+ loopchannel 0, Song_ViridianCity_branch_ec1d6
+
+Song_ViridianCity_branch_ec2de::
+ octave 3
+ F# 2
+ D# 4
+ E_ 2
+ D# 4
+ C# 4
+ octave 2
+ B_ 4
+ octave 3
+ C# 2
+ D# 2
+ C# 2
+ endchannel
+
+Song_ViridianCity_branch_ec2eb::
+ A_ 2
+ E_ 2
+ C# 2
+ E_ 4
+ A_ 2
+ C# 2
+ E_ 2
+ endchannel
+
+
+Song_ViridianCity_Ch1:: ; ec2f3 (3b:42f3)
+ vibrato 5, 1, 5
+ callchannel Song_ViridianCity_branch_ec368
+ octave 4
+ G# 2
+ notetype 12, 12, 4
+ E_ 6
+ notetype 12, 12, 5
+ duty 3
+ octave 3
+ C# 4
+ D# 4
+ E_ 6
+ F# 6
+ G# 4
+ callchannel Song_ViridianCity_branch_ec368
+ octave 4
+ G# 2
+ notetype 12, 12, 4
+ E_ 14
+ duty 3
+ octave 3
+ E_ 6
+ F# 6
+ G# 4
+ notetype 12, 11, 7
+ duty 2
+ vibrato 8, 1, 7
+ octave 5
+ C# 12
+ octave 4
+ A_ 4
+ octave 5
+ E_ 8
+ F# 2
+ E_ 2
+ D# 2
+ C# 2
+ octave 4
+ B_ 12
+ G# 4
+ B_ 16
+ F# 12
+ G# 2
+ A_ 2
+ B_ 4
+ A_ 4
+ G# 4
+ F# 4
+ G# 12
+ E_ 4
+ B_ 16
+ octave 5
+ C# 12
+ D# 2
+ E_ 2
+ F# 4
+ E_ 4
+ D# 4
+ C# 4
+ octave 4
+ B_ 12
+ octave 5
+ C# 2
+ D# 2
+ C# 4
+ octave 4
+ B_ 4
+ A_ 4
+ G# 4
+ A_ 12
+ B_ 2
+ octave 5
+ C_ 2
+ C_ 4
+ octave 4
+ B_ 4
+ A_ 4
+ F# 4
+ notetype 12, 11, 7
+ A_ 8
+ octave 5
+ C_ 8
+ octave 4
+ B_ 14
+ notetype 12, 8, 4
+ G# 1
+ notetype 12, 10, 4
+ A_ 1
+ loopchannel 0, Song_ViridianCity_Ch1
+
+Song_ViridianCity_branch_ec368::
+ duty 2
+ notetype 12, 12, 3
+ octave 4
+ B_ 4
+ A_ 4
+ notetype 12, 12, 4
+ G# 10
+ notetype 12, 12, 3
+ G# 2
+ A_ 2
+ B_ 4
+ B_ 2
+ A_ 2
+ G# 2
+ A_ 2
+ notetype 12, 12, 4
+ F# 10
+ notetype 12, 12, 5
+ duty 3
+ octave 3
+ E_ 4
+ D# 8
+ E_ 4
+ F# 4
+ notetype 12, 12, 3
+ duty 2
+ octave 4
+ A_ 4
+ G# 4
+ notetype 12, 12, 4
+ F# 10
+ notetype 12, 12, 3
+ F# 2
+ G# 2
+ A_ 4
+ A_ 2
+ G# 2
+ F# 2
+ endchannel
+
+
+Song_ViridianCity_Ch2:: ; ec3a2 (3b:43a2)
+ notetype 12, 1, 1
+ toggleperfectpitch
+ rest 1
+ rest 2
+
+Song_ViridianCity_branch_ec3a8::
+ vibrato 0, 0, 0
+ octave 4
+ callchannel Song_ViridianCity_branch_ec438
+ callchannel Song_ViridianCity_branch_ec438
+ callchannel Song_ViridianCity_branch_ec441
+ G# 2
+ E_ 2
+ F# 2
+ G# 2
+ rest 2
+ E_ 2
+ F# 2
+ G# 2
+ callchannel Song_ViridianCity_branch_ec438
+ B_ 2
+ E_ 2
+ F# 2
+ G# 2
+ rest 2
+ E_ 2
+ F# 2
+ G# 2
+ callchannel Song_ViridianCity_branch_ec438
+ callchannel Song_ViridianCity_branch_ec441
+ G# 2
+ E_ 2
+ F# 2
+ G# 2
+ rest 2
+ G# 2
+ E_ 2
+ B_ 2
+ rest 2
+ E_ 2
+ F# 2
+ E_ 2
+ G# 2
+ E_ 2
+ B_ 2
+ E_ 2
+ vibrato 8, 2, 5
+ A_ 8
+ E_ 8
+ A_ 8
+ F# 8
+ G# 8
+ E_ 8
+ G# 12
+ E_ 4
+ F# 2
+ F# 2
+ D# 2
+ E_ 4
+ F# 2
+ D# 2
+ E_ 2
+ F# 2
+ F# 2
+ B_ 2
+ A_ 2
+ G# 2
+ A_ 2
+ G# 2
+ F# 2
+ G# 2
+ G# 2
+ E_ 2
+ G# 2
+ rest 2
+ E_ 2
+ F# 2
+ G# 2
+ rest 2
+ E_ 2
+ F# 2
+ G# 2
+ B_ 2
+ A_ 2
+ G# 2
+ F# 2
+ A_ 8
+ E_ 8
+ A_ 8
+ B_ 2
+ A_ 2
+ G# 2
+ F# 2
+ G# 8
+ E_ 8
+ B_ 4
+ E_ 4
+ F# 4
+ G# 4
+ rest 2
+ D# 2
+ E_ 2
+ F# 2
+ rest 2
+ F# 2
+ B_ 2
+ A_ 2
+ A_ 4
+ G# 4
+ F# 2
+ D# 2
+ A_ 2
+ F# 2
+ rest 2
+ E_ 2
+ F# 2
+ G# 2
+ rest 2
+ E_ 2
+ F# 1
+ G# 1
+ E_ 1
+ F# 1
+ G# 4
+ B_ 2
+ A_ 2
+ G# 2
+ A_ 2
+ G# 2
+ F# 2
+ loopchannel 0, Song_ViridianCity_branch_ec3a8
+
+Song_ViridianCity_branch_ec438::
+ rest 2
+ E_ 2
+ F# 2
+ G# 2
+ rest 2
+ E_ 2
+ F# 2
+ G# 2
+ endchannel
+
+Song_ViridianCity_branch_ec441::
+ A_ 2
+ F# 2
+ G# 2
+ A_ 2
+ rest 2
+ A_ 2
+ G# 2
+ F# 2
+ rest 2
+ F# 2
+ G# 2
+ A_ 2
+ rest 2
+ A_ 2
+ G# 2
+ F# 2
+ D# 2
+ D# 2
+ E_ 2
+ F# 2
+ rest 2
+ D# 2
+ E_ 2
+ F# 2
+ rest 2
+ D# 2
+ E_ 2
+ F# 2
+ rest 2
+ D# 2
+ E_ 2
+ F# 2
+ endchannel
+
+
+Song_ViridianCity_Ch3:: ; ec462 (3b:4462)
+ drumset 0
+
+Song_ViridianCity_branch_ec464::
+ dspeed 12
+ callchannel Song_ViridianCity_branch_ec49f
+
+Song_ViridianCity_branch_ec469::
+ callchannel Song_ViridianCity_branch_ec49f
+ callchannel Song_ViridianCity_branch_ec4a7
+ callchannel Song_ViridianCity_branch_ec4a7
+ loopchannel 2, Song_ViridianCity_branch_ec469
+ callchannel Song_ViridianCity_branch_ec49f
+ callchannel Song_ViridianCity_branch_ec4b5
+ callchannel Song_ViridianCity_branch_ec4ae
+ triangle1 6
+ triangle1 6
+ triangle2 4
+ callchannel Song_ViridianCity_branch_ec4bd
+ callchannel Song_ViridianCity_branch_ec4b5
+ callchannel Song_ViridianCity_branch_ec4ae
+ callchannel Song_ViridianCity_branch_ec4bd
+ callchannel Song_ViridianCity_branch_ec4ae
+ triangle1 6
+ triangle1 6
+ triangle2 2
+ triangle1 2
+ triangle1 6
+ triangle1 6
+ triangle1 4
+ triangle1 6
+ snare6 6
+ snare6 4
+ loopchannel 0, Song_ViridianCity_branch_ec464
+
+Song_ViridianCity_branch_ec49f::
+ snare6 6
+ snare6 6
+ snare6 4
+ snare6 6
+ snare6 6
+ snare6 2
+ snare6 2
+ endchannel
+
+Song_ViridianCity_branch_ec4a7::
+ snare6 6
+ snare6 6
+ snare6 4
+ snare6 6
+ snare6 6
+ snare6 4
+ endchannel
+
+Song_ViridianCity_branch_ec4ae::
+ triangle1 6
+ triangle1 6
+ triangle2 4
+ triangle1 6
+ triangle1 6
+ triangle2 4
+ endchannel
+
+Song_ViridianCity_branch_ec4b5::
+ triangle1 6
+ triangle1 6
+ triangle2 4
+ triangle1 6
+ triangle1 6
+ triangle2 2
+ triangle1 2
+ endchannel
+
+Song_ViridianCity_branch_ec4bd::
+ triangle1 6
+ triangle1 6
+ triangle2 2
+ triangle2 2
+ endchannel
+; 0xec4c2
diff --git a/charmap.asm b/charmap.asm
index 2f8b096..575a8eb 100644
--- a/charmap.asm
+++ b/charmap.asm
@@ -1,57 +1,9 @@
-; $00-$16 are TX_* constants (see macros/scripts/text.asm)
+ charmap "<NULL>", $00
-; Control characters (see home/text.asm)
-
- charmap "<PLAY_G>", $14 ; "<PLAYER>くん" or "<PLAYER>ちゃん"; same as "<PLAYER>" in English
- charmap "<JP_18>", $18 ; "ノ゛"? (ungrammatical)
- charmap "<NI>", $1d ; "に "
- charmap "<TTE>", $1e ; "って"
- charmap "<WO>", $1f ; "を "
-
- charmap "<TA!>", $22 ; "た!"
- charmap "<KOUGEKI>", $23 ; "こうげき"
- charmap "<WA>", $24 ; "は "
- charmap "<NO>", $25 ; "の "
-
- charmap "<ROUTE>", $35 ; "ばん どうろ"
- charmap "<WATASHI>", $36 ; "わたし"
- charmap "<KOKO_WA>", $37 ; "ここは"
- charmap "<RED>", $38 ; wRedsName
- charmap "<GREEN>", $39 ; wGreensName
- charmap "<ENEMY>", $3f
-
- charmap "<MOM>", $49 ; wMomsName
- charmap "<GA>", $4a ; "が "
- charmap "<_CONT>", $4b ; implements "<CONT>"
- charmap "<SCROLL>", $4c
- charmap "<NEXT>", $4e
- charmap "<LINE>", $4f
-
- charmap "@", $50 ; string terminator
- charmap "<PARA>", $51
- charmap "<PLAYER>", $52 ; wPlayerName
- charmap "<RIVAL>", $53 ; wRivalName
- charmap "#", $54 ; "POKé"
- charmap "<CONT>", $55
- charmap "<……>", $56 ; "……"
- charmap "<DONE>", $57
- charmap "<PROMPT>", $58
- charmap "<TARGET>", $59
- charmap "<USER>", $5a
- charmap "<PC>", $5b ; "PC"
- charmap "<TM>", $5c ; "TM"
- charmap "<TRAINER>", $5d ; "TRAINER"
- charmap "<ROCKET>", $5e ; "ROCKET"
- charmap "<DEXEND>", $5f
-
-; Actual characters (from other graphics files)
-
- ; needed for _LoadFontsExtra1 (see engine/load_font.asm)
- charmap "■", $60 ; gfx/font/black.2bpp
- charmap "▲", $61 ; gfx/font/up_arrow.png
- charmap "☎", $62 ; gfx/font/phone_icon.2bpp
-
-; Japanese kana
+ charmap "イ゛", $01
+ charmap "ヴ", $02
+ charmap "エ゛", $03
+ charmap "オ゛", $04
charmap "ガ", $05
charmap "ギ", $06
@@ -69,11 +21,31 @@
charmap "デ", $12
charmap "ド", $13
+ charmap "<PLAY_G>", $14 ; "<PLAYER>くん" or "<PLAYER>ちゃん"
+
+ charmap "<15>", $15 ; nothing
+ charmap "<16>", $16 ; nothing
+
+ charmap "ネ゛", $17
+ charmap "ノ゛", $18
+
charmap "バ", $19
charmap "ビ", $1a
charmap "ブ", $1b
charmap "ボ", $1c
+ charmap "<NI>", $1d ; "に "
+ charmap "<TTE>", $1e ; "って"
+ charmap "<WO>", $1f ; "を "
+
+ charmap "ィ゛", $20
+ charmap "あ゛", $21
+
+ charmap "<TA!>", $22 ; "た!"
+ charmap "<KOUGEKI>", $23 ; "こうげき"
+ charmap "<WA>", $24 ; "は "
+ charmap "<NO>", $25 ; "の "
+
charmap "が", $26
charmap "ぎ", $27
charmap "ぐ", $28
@@ -90,12 +62,20 @@
charmap "で", $33
charmap "ど", $34
+ charmap "<ROUTE>", $35 ; "ばん どうろ"
+ charmap "<WATASHI>", $36 ; "わたし"
+ charmap "<KOKO_WA>", $37 ; "ここは"
+ charmap "<RED>", $38 ; wRedsName
+ charmap "<GREEN>", $39 ; wGreensName
+
charmap "ば", $3a
charmap "び", $3b
charmap "ぶ", $3c
charmap "べ", $3d
charmap "ぼ", $3e
+ charmap "<ENEMY>", $3f
+
charmap "パ", $40
charmap "ピ", $41
charmap "プ", $42
@@ -106,12 +86,61 @@
charmap "ぺ", $47
charmap "ぽ", $48
+ charmap "<MOM>", $49 ; wMomsName
+ charmap "<GA>", $4a ; "が "
+ charmap "<_CONT>", $4b ; implements "<CONT>"
+ charmap "<SCROLL>", $4c
+
+ charmap "も゜", $4d
+
+ charmap "<NEXT>", $4e
+ charmap "<LINE>", $4f
+ charmap "@", $50 ; string terminator
+ charmap "<PARA>", $51
+ charmap "<PLAYER>", $52 ; wPlayerName
+ charmap "<RIVAL>", $53 ; wRivalName
+ charmap "#", $54 ; "POKé"
+ charmap "<CONT>", $55
+ charmap "<……>", $56 ; "……"
+ charmap "<DONE>", $57
+ charmap "<PROMPT>", $58
+ charmap "<TARGET>", $59
+ charmap "<USER>", $5a
+ charmap "<PC>", $5b ; "PC"
+ charmap "<TM>", $5c ; "TM"
+ charmap "<TRAINER>", $5d ; "TRAINER"
+ charmap "<ROCKET>", $5e ; "ROCKET"
+ charmap "<DEXEND>", $5f
+
+ charmap "■", $60
+ charmap "▲", $61
+ charmap "☎", $62
+
+ charmap "A", $60
+ charmap "B", $61
+ charmap "C", $62
+ charmap "D", $63
+ charmap "E", $64
+ charmap "F", $65
+ charmap "G", $66
+ charmap "H", $67
+ charmap "I", $68
+ charmap "V", $69
+ charmap "S", $6a
+ charmap "L", $6b
+ charmap "M", $6c
+
+ charmap ":", $6d
+
+ charmap "ぃ", $6e
+ charmap "ぅ", $6f
+
charmap "「", $70
charmap "」", $71
charmap "『", $72
charmap "』", $73
- charmap "·", $74
- charmap "⋯", $75
+ charmap "・", $74
+ charmap "…", $75
charmap "ぁ", $76
charmap "ぇ", $77
@@ -123,6 +152,7 @@
charmap "│", $7c
charmap "└", $7d
charmap "┘", $7e
+
charmap " ", $7f
charmap "ア", $80
@@ -169,6 +199,7 @@
charmap "ワ", $a9
charmap "ヲ", $aa
charmap "ン", $ab
+
charmap "ッ", $ac
charmap "ャ", $ad
charmap "ュ", $ae
@@ -221,12 +252,14 @@
charmap "わ", $dc
charmap "を", $dd
charmap "ん", $de
+
charmap "っ", $df
charmap "ゃ", $e0
charmap "ゅ", $e1
charmap "ょ", $e2
charmap "ー", $e3
+
charmap "゚", $e4
charmap "゙", $e5
@@ -237,29 +270,27 @@
charmap "ァ", $e9
charmap "ゥ", $ea
charmap "ェ", $eb
-
+
charmap "▷", $ec
charmap "▶", $ed
charmap "▲", $ed
charmap "▼", $ee
charmap "♂", $ef
-
charmap "円", $f0
charmap "×", $f1
charmap ".", $f2
charmap "/", $f3
charmap "ォ", $f4
-
- charmap "♀", $f5
- charmap "0", $f6
- charmap "1", $f7
- charmap "2", $f8
- charmap "3", $f9
- charmap "4", $fa
- charmap "5", $fb
- charmap "6", $fc
- charmap "7", $fd
- charmap "8", $fe
- charmap "9", $ff
+ charmap "♀", $f5
+ charmap "0", $f6
+ charmap "1", $f7
+ charmap "2", $f8
+ charmap "3", $f9
+ charmap "4", $fa
+ charmap "5", $fb
+ charmap "6", $fc
+ charmap "7", $fd
+ charmap "8", $fe
+ charmap "9", $ff
diff --git a/constants.asm b/constants.asm
index d9bf703..6909def 100644
--- a/constants.asm
+++ b/constants.asm
@@ -9,12 +9,16 @@ INCLUDE "constants/text_constants.asm"
INCLUDE "constants/type_constants.asm"
INCLUDE "constants/pokedex_constants.asm"
+INCLUDE "constants/pokemon_constants.asm"
INCLUDE "constants/pokemon_data_constants.asm"
INCLUDE "constants/move_constants.asm"
INCLUDE "constants/item_constants.asm"
INCLUDE "constants/trainer_constants.asm"
INCLUDE "constants/trainer_data_constants.asm"
+INCLUDE "constants/sprite_constants.asm"
INCLUDE "constants/battle_constants.asm"
INCLUDE "constants/palette_constants.asm"
INCLUDE "constants/serial_constants.asm"
+
+INCLUDE "constants/misc_constants.asm"
diff --git a/constants/audio_constants.asm b/constants/audio_constants.asm
index c341e90..8d25540 100644
--- a/constants/audio_constants.asm
+++ b/constants/audio_constants.asm
@@ -1,21 +1,3 @@
-
-
-; pitch
- const_def
- const __
- const C_
- const C#
- const D_
- const D#
- const E_
- const F_
- const F#
- const G_
- const G#
- const A_
- const A#
- const B_
-
; channel
const_def
const CHAN1
diff --git a/constants/item_constants.asm b/constants/item_constants.asm
index 017a58e..30af41c 100644
--- a/constants/item_constants.asm
+++ b/constants/item_constants.asm
@@ -262,3 +262,7 @@ NUM_TMS = const_value - ITEM_TM01 - 2 ; discount ITEM_C8 and ITEM_E1
NUM_HMS = const_value - ITEM_HM01
NUM_TMS_HMS = NUM_TMS + NUM_HMS
+
+; leftovers from pokered
+ITEM_HM01_RED EQU $c4
+ITEM_TM01_RED EQU $c9
diff --git a/constants/misc_constants.asm b/constants/misc_constants.asm
new file mode 100644
index 0000000..d01de98
--- /dev/null
+++ b/constants/misc_constants.asm
@@ -0,0 +1,24 @@
+; joypad
+
+ const_def
+ const A_BUTTON_F
+ const B_BUTTON_F
+ const SELECT_F
+ const START_F
+ const D_RIGHT_F
+ const D_LEFT_F
+ const D_UP_F
+ const D_DOWN_F
+
+NO_INPUT EQU %00000000
+A_BUTTON EQU 1 << A_BUTTON_F
+B_BUTTON EQU 1 << B_BUTTON_F
+SELECT EQU 1 << SELECT_F
+START EQU 1 << START_F
+D_RIGHT EQU 1 << D_RIGHT_F
+D_LEFT EQU 1 << D_LEFT_F
+D_UP EQU 1 << D_UP_F
+D_DOWN EQU 1 << D_DOWN_F
+
+BUTTONS EQU A_BUTTON | B_BUTTON | SELECT | START
+D_PAD EQU D_RIGHT | D_LEFT | D_UP | D_DOWN
diff --git a/constants/move_constants.asm b/constants/move_constants.asm
index 1f04fe8..b7daf0e 100644
--- a/constants/move_constants.asm
+++ b/constants/move_constants.asm
@@ -94,7 +94,7 @@
const MOVE_DIG ; 5b
const MOVE_TOXIC ; 5c
const MOVE_CONFUSION ; 5d
- const MOVE_PSYCHIC_M ; 5e
+ const MOVE_PSYCHIC ; 5e
const MOVE_HYPNOSIS ; 5f
const MOVE_MEDITATE ; 60
const MOVE_AGILITY ; 61
diff --git a/constants/name_constants.asm b/constants/name_constants.asm
new file mode 100755
index 0000000..7e35ebb
--- /dev/null
+++ b/constants/name_constants.asm
@@ -0,0 +1,2 @@
+; Name Lists
+ITEM_NAME EQU 4 \ No newline at end of file
diff --git a/constants/palette_constants.asm b/constants/palette_constants.asm
index 9f410a8..e9d6d79 100755
--- a/constants/palette_constants.asm
+++ b/constants/palette_constants.asm
@@ -1,5 +1,5 @@
const_def
- const PAL_TOWN_00 ; 00
+ const PAL_ROUTE ; 00
const PAL_TOWN_01 ; 01
const PAL_TOWN_02 ; 02
const PAL_TOWN_03 ; 03
@@ -24,19 +24,19 @@
const PAL_PINKMON ; 16
const PAL_YELLOWMON ; 17
const PAL_GREYMON ; 18
- const PAL_DARKMEWMON ; 19
- const PAL_DARKBLUEMON ; 1a
- const PAL_DARKREDMON ; 1b
- const PAL_DARKCYANMON ; 1c
- const PAL_DARKPURPLEMON ; 1d
- const PAL_DARKBROWNMON ; 1e
- const PAL_TANMON ; 1f
- const PAL_BLUEPINKMON ; 20
- const PAL_ORANGEMON ; 21
- const PAL_DARKGREYMON ; 22
- const PAL_GREENBAR ; 23
- const PAL_YELLOWBAR ; 24
- const PAL_REDBAR ; 25
+ const PAL_SHINY_MEWMON ; 19
+ const PAL_SHINY_BLUEMON ; 1a
+ const PAL_SHINY_REDMON ; 1b
+ const PAL_SHINY_CYANMON ; 1c
+ const PAL_SHINY_PURPLEMON ; 1d
+ const PAL_SHINY_BROWNMON ; 1e
+ const PAL_SHINY_GREENMON ; 1f
+ const PAL_SHINY_PINKMON ; 20
+ const PAL_SHINY_YELLOWMON ; 21
+ const PAL_SHINY_GREYMON ; 22
+ const PAL_GREEN_BAR ; 23
+ const PAL_YELLOW_BAR ; 24
+ const PAL_RED_BAR ; 25
const PAL_TOWN_MAP ; 26
const PAL_LOGO_1 ; 27
const PAL_LOGO_2 ; 28
diff --git a/constants/pokemon_constants.asm b/constants/pokemon_constants.asm
new file mode 100644
index 0000000..2678607
--- /dev/null
+++ b/constants/pokemon_constants.asm
@@ -0,0 +1,199 @@
+; old RBY index numbers
+; used primarily for cries
+ const_def
+ const MON_NONE ; 00
+ const MON_SIDON ; 01 RHYDON
+ const MON_GARURA ; 02 KANGASKHAN
+ const MON_NIDORAN_M ; 03 NIDORAN_M
+ const MON_PIPPI ; 04 CLEFAIRY
+ const MON_ONISUZUME ; 05 SPEAROW
+ const MON_BIRIRIDAMA ; 06 VOLTORB
+ const MON_NIDOKING ; 07 NIDOKING
+ const MON_YADORAN ; 08 SLOWBRO
+ const MON_FUSHIGISOU ; 09 IVYSAUR
+ const MON_NASSY ; 0a EXEGGUTOR
+ const MON_BERORINGA ; 0b LICKITUNG
+ const MON_TAMATAMA ; 0c EXEGGCUTE
+ const MON_BETBETER ; 0d GRIMER
+ const MON_GANGAR ; 0e GENGAR
+ const MON_NIDORAN_F ; 0f NIDORAN_F
+ const MON_NIDOQUEEN ; 10 NIDOQUEEN
+ const MON_KARAKARA ; 11 CUBONE
+ const MON_SIHORN ; 12 RHYHORN
+ const MON_LAPLACE ; 13 LAPRAS
+ const MON_WINDIE ; 14 ARCANINE
+ const MON_MEW ; 15 MEW
+ const MON_GYARADOS ; 16 GYARADOS
+ const MON_SHELLDER ; 17 SHELLDER
+ const MON_MENOKURAGE ; 18 TENTACOOL
+ const MON_GHOS ; 19 GASTLY
+ const MON_STRIKE ; 1a SCYTHER
+ const MON_HITODEMAN ; 1b STARYU
+ const MON_KAMEX ; 1c BLASTOISE
+ const MON_KAILIOS ; 1d PINSIR
+ const MON_MONJARA ; 1e TANGELA
+ const MON_KAPOERER ; 1f HITMONTOP
+ const MON_PUDIE ; 20 (baby GROWLITHE)
+ const MON_GARDIE ; 21 GROWLITHE
+ const MON_IWARK ; 22 ONIX
+ const MON_ONIDRILL ; 23 FEAROW
+ const MON_POPPO ; 24 PIDGEY
+ const MON_YADON ; 25 SLOWPOKE
+ const MON_YUNGERER ; 26 KADABRA
+ const MON_GOLONE ; 27 GRAVELER
+ const MON_LUCKY ; 28 CHANSEY
+ const MON_GORIKY ; 29 MACHOKE
+ const MON_BARRIERD ; 2a MR__MIME
+ const MON_SAWAMULAR ; 2b HITMONLEE
+ const MON_EBIWALAR ; 2c HITMONCHAN
+ const MON_ARBOK ; 2d ARBOK
+ const MON_PARASECT ; 2e PARASECT
+ const MON_KODUCK ; 2f PSYDUCK
+ const MON_SLEEPE ; 30 DROWZEE
+ const MON_GOLONYA ; 31 GOLEM
+ const MON_HANEKO ; 32 HOPPIP
+ const MON_BOOBER ; 33 MAGMAR
+ const MON_TAIL ; 34 AIPOM
+ const MON_ELEBOO ; 35 ELECTABUZZ
+ const MON_RARECOIL ; 36 MAGNETON
+ const MON_DOGARS ; 37 KOFFING
+ const MON_POPONEKO ; 38 SKIPLOOM
+ const MON_MANKEY ; 39 MANKEY
+ const MON_PAWOU ; 3a SEEL
+ const MON_DIGDA ; 3b DIGLETT
+ const MON_KENTAUROS ; 3c TAUROS
+ const MON_WATANEKO ; 3d JUMPLUFF
+ const MON_BARIRINA ; 3e MIME_JR (baby MR__MIME)
+ const MON_LIP ; 3f SMOOCHUM
+ const MON_KAMONEGI ; 40 FARFETCH_D
+ const MON_KONGPANG ; 41 VENONAT
+ const MON_KAIRYU ; 42 DRAGONITE
+ const MON_ELEBABY ; 43 ELEKID
+ const MON_BOOBY ; 44 MAGBY
+ const MON_KIREIHANA ; 45 BELLOSSOM
+ const MON_DODO ; 46 DODUO
+ const MON_NYOROMO ; 47 POLIWAG
+ const MON_ROUGELA ; 48 JYNX
+ const MON_FIRE ; 49 MOLTRES
+ const MON_FREEZER ; 4a ARTICUNO
+ const MON_THUNDER ; 4b ZAPDOS
+ const MON_METAMON ; 4c DITTO
+ const MON_NYARTH ; 4d MEOWTH
+ const MON_CRAB ; 4e KRABBY
+ const MON_TSUBOMITTO ; 4f (evolved WEEPINBELL)
+ const MON_MILTANK ; 50 MILTANK
+ const MON_BOMBSEEKER ; 51 (MISSINGNO)
+ const MON_ROKON ; 52 VULPIX
+ const MON_KYUKON ; 53 NINETALES
+ const MON_PIKACHU ; 54 PIKACHU
+ const MON_RAICHU ; 55 RAICHU
+ const MON_GIFT ; 56 DELIBIRD
+ const MON_KOTORA ; 57 (MISSINGNO)
+ const MON_MINIRYU ; 58 DRATINI
+ const MON_HAKURYU ; 59 DRAGONAIR
+ const MON_KABUTO ; 5a KABUTO
+ const MON_KABUTOPS ; 5b KABUTOPS
+ const MON_TATTU ; 5c HORSEA
+ const MON_SEADRA ; 5d SEADRA
+ const MON_RAITORA ; 5e (MISSINGNO)
+ const MON_MADAME ; 5f (evolved FARFETCH_D)
+ const MON_SAND ; 60 SANDSHREW
+ const MON_SANDPAN ; 61 SANDSLASH
+ const MON_OMNITE ; 62 OMANYTE
+ const MON_OMSTAR ; 63 OMASTAR
+ const MON_PURIN ; 64 JIGGLYPUFF
+ const MON_PUKURIN ; 65 WIGGLYTUFF
+ const MON_EIEVUI ; 66 EEVEE
+ const MON_BOOSTER ; 67 FLAREON
+ const MON_THUNDERS ; 68 JOLTEON
+ const MON_SHOWERS ; 69 VAPOREON
+ const MON_WANRIKY ; 6a MACHOP
+ const MON_ZUBAT ; 6b ZUBAT
+ const MON_ARBO ; 6c EKANS
+ const MON_PARAS ; 6d PARAS
+ const MON_NYOROZO ; 6e POLIWHIRL
+ const MON_NYOROBON ; 6f POLIWRATH
+ const MON_BEEDLE ; 70 WEEDLE
+ const MON_COCOON ; 71 KAKUNA
+ const MON_SPEAR ; 72 BEEDRILL
+ const MON_NOROWARA ; 73 (MISSINGNO)
+ const MON_DODORIO ; 74 DODRIO
+ const MON_OKORIZARU ; 75 PRIMEAPE
+ const MON_DUGTRIO ; 76 DUGTRIO
+ const MON_MORPHON ; 77 VENOMOTH
+ const MON_JUGON ; 78 DEWGONG
+ const MON_KYONPAN ; 79 (MISSINGNO)
+ const MON_YAMIKARASU ; 7a MURKROW
+ const MON_CATERPIE ; 7b CATERPIE
+ const MON_TRANSEL ; 7c METAPOD
+ const MON_BUTTERFREE ; 7d BUTTERFREE
+ const MON_KAIRIKY ; 7e MACHAMP
+ const MON_HAPPI ; 7f BLISSEY
+ const MON_GOLDUCK ; 80 GOLDUCK
+ const MON_SLEEPER ; 81 HYPNO
+ const MON_GOLBAT ; 82 GOLBAT
+ const MON_MEWTWO ; 83 MEWTWO
+ const MON_KABIGON ; 84 SNORLAX
+ const MON_KOIKING ; 85 MAGIKARP
+ const MON_SCISSORS ; 86 SCIZOR
+ const MON_PURAKKUSU ; 87 (evolved PINSIR)
+ const MON_BETBETON ; 88 MUK
+ const MON_DEVIL ; 89 HOUNDOUR
+ const MON_KINGLER ; 8a KINGLER
+ const MON_PARSHEN ; 8b CLOYSTER
+ const MON_HELGAA ; 8c HOUNDOOM
+ const MON_MARUMINE ; 8d ELECTRODE
+ const MON_PIXY ; 8e CLEFABLE
+ const MON_MATADOGAS ; 8f WEEZING
+ const MON_PERSIAN ; 90 PERSIAN
+ const MON_GARAGARA ; 91 MAROWAK
+ const MON_WOLFMAN ; 92 (MISSINGNO)
+ const MON_GHOST ; 93 HAUNTER
+ const MON_CASEY ; 94 ABRA
+ const MON_FOODIN ; 95 ALAKAZAM
+ const MON_PIGEON ; 96 PIDGEOTTO
+ const MON_PIGEOT ; 97 PIDGEOT
+ const MON_STARMIE ; 98 STARMIE
+ const MON_FUSHIGIDANE ; 99 BULBASAUR
+ const MON_FUSHIGIBANA ; 9a VENUSAUR
+ const MON_DOKUKURAGE ; 9b TENTACRUEL
+ const MON_WARWOLF ; 9c (MISSINGNO)
+ const MON_TOSAKINTO ; 9d GOLDEEN
+ const MON_AZUMAO ; 9e SEAKING
+ const MON_PORYGON2 ; 9f PORYGON2
+ const MON_NAMEIL ; a0 LICKILICKY (evolved LICKITUNG)
+ const MON_HAGANEIL ; a1 STEELIX
+ const MON_KINGDRA ; a2 KINGDRA
+ const MON_PONYTA ; a3 PONYTA
+ const MON_GALLOP ; a4 RAPIDASH
+ const MON_KORATTA ; a5 RATTATA
+ const MON_RATTA ; a6 RATICATE
+ const MON_NIDORINO ; a7 NIDORINO
+ const MON_NIDORINA ; a8 NIDORINA
+ const MON_ISITSUBUTE ; a9 GEODUDE
+ const MON_PORYGON ; aa PORYGON
+ const MON_PTERA ; ab AERODACTYL
+ const MON_RAI ; ac RAIKOU
+ const MON_COIL ; ad MAGNEMITE
+ const MON_EN ; ae ENTEI
+ const MON_SUI ; af SUICUNE
+ const MON_HITOKAGE ; b0 CHARMANDER
+ const MON_ZENIGAME ; b1 SQUIRTLE
+ const MON_LIZARDO ; b2 CHARMELEON
+ const MON_KAMEIL ; b3 WARTORTLE
+ const MON_LIZARDON ; b4 CHARIZARD
+ const MON_NYULA ; b5 SNEASEL
+ const MON_HOUOU ; b6 HO_OH
+ const MON_TOGEPY ; b7 TOGEPI
+ const MON_BULU ; b8 SNUBBULL
+ const MON_NAZONOKUSA ; b9 ODDISH
+ const MON_KUSAIHANA ; ba GLOOM
+ const MON_RUFFRESIA ; bb VILEPLUME
+ const MON_MADATSUBOMI ; bc BELLSPROUT
+ const MON_UTSUDON ; bd WEEPINBELL
+ const MON_UTSUBOT ; be VICTREEBEL
+
+; LEAFY isn't in the table at 10:4B70
+; and its ID 0xFB will be found at
+; 10:4117 (index 0x4A7 + 1 % 0x100 = 0xA8)
+MON_LEAFY EQU MON_NIDORINA
diff --git a/constants/serial.asm b/constants/serial.asm
deleted file mode 100644
index e475798..0000000
--- a/constants/serial.asm
+++ /dev/null
@@ -1,17 +0,0 @@
-; serial
-
-ESTABLISH_CONNECTION_WITH_INTERNAL_CLOCK EQU $01
-ESTABLISH_CONNECTION_WITH_EXTERNAL_CLOCK EQU $02
-
-USING_EXTERNAL_CLOCK EQU $01
-USING_INTERNAL_CLOCK EQU $02
-CONNECTION_NOT_ESTABLISHED EQU $ff
-
-; signals the start of an array of bytes transferred over the link cable
-SERIAL_PREAMBLE_BYTE EQU $FD
-
-; this byte is used when there is no data to send
-SERIAL_NO_DATA_BYTE EQU $FE
-
-; signals the end of one part of a patch list (there are two parts) for player/enemy party data
-SERIAL_PATCH_LIST_PART_TERMINATOR EQU $FF
diff --git a/constants/sprite_constants.asm b/constants/sprite_constants.asm
new file mode 100644
index 0000000..50b5d84
--- /dev/null
+++ b/constants/sprite_constants.asm
@@ -0,0 +1,93 @@
+ const_def
+ const SPRITE_NONE ; 00
+ const SPRITE_GOLD ; 01
+ const SPRITE_GOLD_BIKE ; 02
+ const SPRITE_GOLD_SKATEBOARD ; 03
+ const SPRITE_SILVER ; 04
+ const SPRITE_OKIDO ; 05 PROF_OAK
+ const SPRITE_RED ; 06
+ const SPRITE_BLUE ; 07
+ const SPRITE_MASAKI ; 08 BILL
+ const SPRITE_ELDER ; 09
+ const SPRITE_SAKAKI ; 0a GIOVANNI
+ const SPRITE_GANTETSU ; 0b KURT
+ const SPRITE_MOM ; 0c
+ const SPRITE_SILVERS_MOM ; 0d
+ const SPRITE_REDS_MOM ; 0e
+ const SPRITE_0F ; 0f duplicate SPRITE_REDS_MOM
+ const SPRITE_NANAMI ; 10 DAISY
+ const SPRITE_EVIL_OKIDO ; 11 EVIL_PROF_OAK
+ const SPRITE_KIKUKO ; 12 AGATHA
+ const SPRITE_HAYATO ; 13 FALKNER
+ const SPRITE_TSUKUSHI ; 14 BUGSY
+ const SPRITE_15 ; 15 duplicate SPRITE_TSUKUSHI
+ const SPRITE_ENOKI ; 16 MORTY
+ const SPRITE_MIKAN ; 17 JASMINE
+ const SPRITE_18 ; 18 duplicate SPRITE_MIKAN
+ const SPRITE_COOLTRAINER_M ; 19
+ const SPRITE_1A ; 1a duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_1B ; 1b duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_1C ; 1c duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_1D ; 1d duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_1E ; 1e duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_1F ; 1f duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_20 ; 20 duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_21 ; 21 duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_22 ; 22 duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_23 ; 23 duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_24 ; 24 duplicate SPRITE_COOLTRAINER_M
+ const SPRITE_COOLTRAINER_F ; 25
+ const SPRITE_BUG_CATCHER_BOY ; 26
+ const SPRITE_TWIN ; 27
+ const SPRITE_YOUNGSTER ; 28
+ const SPRITE_LASS ; 29
+ const SPRITE_TEACHER ; 2a
+ const SPRITE_GIRL ; 2b
+ const SPRITE_SUPER_NERD ; 2c
+ const SPRITE_ROCKER ; 2d
+ const SPRITE_POKEFAN_M ; 2e
+ const SPRITE_POKEFAN_F ; 2f
+ const SPRITE_GRAMPS ; 30
+ const SPRITE_GRANNY ; 31
+ const SPRITE_SWIMMER_M ; 32
+ const SPRITE_SWIMMER_F ; 33
+ const SPRITE_ROCKET_M ; 34
+ const SPRITE_35 ; 35 duplicate SPRITE_ROCKET_M
+ const SPRITE_36 ; 36 duplicate SPRITE_ROCKET_M
+ const SPRITE_ROCKET_F ; 37
+ const SPRITE_NURSE ; 38
+ const SPRITE_LINK_RECEPTIONIST ; 39
+ const SPRITE_CLERK ; 3a
+ const SPRITE_FISHER ; 3b
+ const SPRITE_FISHING_GURU ; 3c
+ const SPRITE_SCIENTIST ; 3d
+ const SPRITE_MEDIUM ; 3e
+ const SPRITE_SAGE ; 3f
+ const SPRITE_FROWNING_MAN ; 40
+ const SPRITE_GENTLEMAN ; 41
+ const SPRITE_BLACKBELT ; 42
+ const SPRITE_RECEPTIONIST ; 43
+ const SPRITE_OFFICER ; 44
+ const SPRITE_CAPTAIN ; 45
+ const SPRITE_46 ; 46 duplicate SPRITE_CAPTAIN
+ const SPRITE_47 ; 47 duplicate SPRITE_CAPTAIN
+ const SPRITE_MOHAWK ; 48
+ const SPRITE_GYM_GUY ; 49
+ const SPRITE_SAILOR ; 4a
+ const SPRITE_HELMET ; 4b
+ const SPRITE_BURGLAR ; 4c
+ const SPRITE_SIDON ; 4d RHYDON
+ const SPRITE_PIPPI ; 4e CLEFAIRY
+ const SPRITE_POPPO ; 4f PIDGEY
+ const SPRITE_LIZARDON ; 50 CHARIZARD
+ const SPRITE_KABIGON ; 51 SNORLAX
+ const SPRITE_PAWOU ; 52 SEEL
+ const SPRITE_NYOROBON ; 53 POLIWRATH
+ const SPRITE_LAPLACE ; 54 LAPRAS
+ const SPRITE_POKE_BALL ; 55
+ const SPRITE_POKEDEX ; 56
+ const SPRITE_PAPER ; 57
+ const SPRITE_OLD_LINK_RECEPTIONIST ; 58
+ const SPRITE_59 ; 59 duplicate SPRITE_OLD_LINK_RECEPTIONIST
+ const SPRITE_EGG ; 5a
+ const SPRITE_BOULDER ; 5b
diff --git a/data/items/names.asm b/data/items/names.asm
index a37acce..942af41 100644
--- a/data/items/names.asm
+++ b/data/items/names.asm
@@ -120,7 +120,7 @@ ItemNames::
db "おうじゃのべルト@" ; CHAMPION_BELT
db "おふだ@" ; TAG
db "のろいのおふだ@" ; SPELL_TAG
- db "5えんだま@" ; 5_YEN_COIN
+ db "5えんだま@" ; 5_YEN_COIN
db "まもりのいと@" ; GUARD_THREAD
db "しげきだま@" ; STIMULUS_ORB
db "おちつきのみ@" ; CALM_BERRY
@@ -145,7 +145,7 @@ ItemNames::
db "こおりのビキニ@" ; ICE_BIKINI
db "いかずちのキバ@" ; THUNDER_FANG
db "ほのおのツメ@" ; FIRE_CLAW
- db "2ほんのツノ@" ; TWIN_HORNS
+ db "2ほんのツノ@" ; TWIN_HORNS
db "ごすんくぎ@" ; SPIKE
db "きのみ@" ; BERRY
db "りンゴ@" ; APPLE
@@ -202,63 +202,63 @@ ItemNames::
db "みしよう@" ; C1
db "みしよう@" ; C2
db "みしよう@" ; C3
- db "わざマシン01@" ; TM01
- db "わざマシン02@" ; TM02
- db "わざマシン03@" ; TM03
- db "わざマシン04@" ; TM04
+ db "わざマシン01@" ; TM01
+ db "わざマシン02@" ; TM02
+ db "わざマシン03@" ; TM03
+ db "わざマシン04@" ; TM04
db "しようきんし@" ; C8
- db "わざマシン05@" ; TM05
- db "わざマシン06@" ; TM06
- db "わざマシン07@" ; TM07
- db "わざマシン08@" ; TM08
- db "わざマシン09@" ; TM09
- db "わざマシン10@" ; TM10
- db "わざマシン11@" ; TM11
- db "わざマシン12@" ; TM12
- db "わざマシン13@" ; TM13
- db "わざマシン14@" ; TM14
- db "わざマシン15@" ; TM15
- db "わざマシン16@" ; TM16
- db "わざマシン17@" ; TM17
- db "わざマシン18@" ; TM18
- db "わざマシン19@" ; TM19
- db "わざマシン20@" ; TM20
- db "わざマシン21@" ; TM21
- db "わざマシン22@" ; TM22
- db "わざマシン23@" ; TM23
- db "わざマシン24@" ; TM24
- db "わざマシン25@" ; TM25
- db "わざマシン26@" ; TM26
- db "わざマシン27@" ; TM27
- db "わざマシン28@" ; TM28
+ db "わざマシン05@" ; TM05
+ db "わざマシン06@" ; TM06
+ db "わざマシン07@" ; TM07
+ db "わざマシン08@" ; TM08
+ db "わざマシン09@" ; TM09
+ db "わざマシン10@" ; TM10
+ db "わざマシン11@" ; TM11
+ db "わざマシン12@" ; TM12
+ db "わざマシン13@" ; TM13
+ db "わざマシン14@" ; TM14
+ db "わざマシン15@" ; TM15
+ db "わざマシン16@" ; TM16
+ db "わざマシン17@" ; TM17
+ db "わざマシン18@" ; TM18
+ db "わざマシン19@" ; TM19
+ db "わざマシン20@" ; TM20
+ db "わざマシン21@" ; TM21
+ db "わざマシン22@" ; TM22
+ db "わざマシン23@" ; TM23
+ db "わざマシン24@" ; TM24
+ db "わざマシン25@" ; TM25
+ db "わざマシン26@" ; TM26
+ db "わざマシン27@" ; TM27
+ db "わざマシン28@" ; TM28
db "しようきんし@" ; E1
- db "わざマシン29@" ; TM29
- db "わざマシン30@" ; TM30
- db "わざマシン31@" ; TM31
- db "わざマシン32@" ; TM32
- db "わざマシン33@" ; TM33
- db "わざマシン34@" ; TM34
- db "わざマシン35@" ; TM35
- db "わざマシン36@" ; TM36
- db "わざマシン37@" ; TM37
- db "わざマシン38@" ; TM38
- db "わざマシン39@" ; TM39
- db "わざマシン40@" ; TM40
- db "わざマシン41@" ; TM41
- db "わざマシン42@" ; TM42
- db "わざマシン43@" ; TM43
- db "わざマシン44@" ; TM44
- db "わざマシン45@" ; TM45
- db "わざマシン46@" ; TM46
- db "わざマシン47@" ; TM47
- db "わざマシン48@" ; TM48
- db "わざマシン49@" ; TM49
- db "わざマシン50@" ; TM50
- db "ひでんマシン01@" ; HM01
- db "ひでんマシン02@" ; HM02
- db "ひでんマシン03@" ; HM03
- db "ひでんマシン04@" ; HM04
- db "ひでんマシン05@" ; HM05
- db "ひでんマシン06@" ; HM06
- db "ひでんマシン07@" ; HM07
+ db "わざマシン29@" ; TM29
+ db "わざマシン30@" ; TM30
+ db "わざマシン31@" ; TM31
+ db "わざマシン32@" ; TM32
+ db "わざマシン33@" ; TM33
+ db "わざマシン34@" ; TM34
+ db "わざマシン35@" ; TM35
+ db "わざマシン36@" ; TM36
+ db "わざマシン37@" ; TM37
+ db "わざマシン38@" ; TM38
+ db "わざマシン39@" ; TM39
+ db "わざマシン40@" ; TM40
+ db "わざマシン41@" ; TM41
+ db "わざマシン42@" ; TM42
+ db "わざマシン43@" ; TM43
+ db "わざマシン44@" ; TM44
+ db "わざマシン45@" ; TM45
+ db "わざマシン46@" ; TM46
+ db "わざマシン47@" ; TM47
+ db "わざマシン48@" ; TM48
+ db "わざマシン49@" ; TM49
+ db "わざマシン50@" ; TM50
+ db "ひでんマシン01@" ; HM01
+ db "ひでんマシン02@" ; HM02
+ db "ひでんマシン03@" ; HM03
+ db "ひでんマシン04@" ; HM04
+ db "ひでんマシン05@" ; HM05
+ db "ひでんマシン06@" ; HM06
+ db "ひでんマシン07@" ; HM07
db "しようきんし@" ; FF
diff --git a/data/maps/landmarks.asm b/data/maps/landmarks.asm
new file mode 100644
index 0000000..314e4ba
--- /dev/null
+++ b/data/maps/landmarks.asm
@@ -0,0 +1,50 @@
+INCLUDE "constants.asm"
+
+SECTION "LandmarkNames", ROMX[$4AAF], BANK[$3F]
+
+LandmarkNames::
+ db "サイレント@"
+ db "オールド@"
+ db "ウエスト@"
+ db "ハイテク@"
+ db "フォント@"
+ db "バードン@"
+ db "ニュータイプ@"
+ db "シュガー@"
+ db "ブルーフォレスト@"
+ db "スタンド@"
+ db "カントー@"
+ db "プりンス@"
+ db "フジヤマ@"
+ db "サウス@"
+ db "ノース@"
+ db "15ばんどうろ@"
+ db "18ばんどうろ@"
+ db "はつでんしょ1@"
+ db "はつでんしょ2@"
+ db "はつでんしょ3@"
+ db "はつでんしょ4@"
+ db "いせき 1@"
+ db "いせき 2@"
+ db "はいこう1@"
+ db "はいこう2@"
+ db "はいこう3@"
+ db "はいこう4@"
+ db "はいこう5@"
+ db "はいこう6@"
+ db "はいこう7@"
+ db "アジト 1@"
+ db "アジト 2@"
+ db "アジト 3@"
+ db "ヤドンの いど1@"
+ db "ヤドンの いど2@"
+ db "#りーぐ1@"
+ db "#りーぐ1@"
+ db "#りーぐ2@"
+ db "#りーぐ3@"
+ db "#りーぐ4@"
+ db "#りーぐ5@"
+ db "#りーぐ6@"
+ db "#りーぐ7@"
+ db "#りーぐ7@"
+ db "しずかなおか@"
diff --git a/data/moves/names.asm b/data/moves/names.asm
index 2ca2749..db98d65 100644
--- a/data/moves/names.asm
+++ b/data/moves/names.asm
@@ -87,7 +87,7 @@ MoveNames::
db "りゅうのいかり@" ; DRAGON_RAGE
db "ほのおのうず@" ; FIRE_SPIN
db "でんきショック@" ; THUNDERSHOCK
- db "10まんボルト@" ; THUNDERBOLT
+ db "10まんボルト@" ; THUNDERBOLT
db "でんじは@" ; THUNDER_WAVE
db "かみなり@" ; THUNDER
db "いわおとし@" ; ROCK_THROW
@@ -178,7 +178,7 @@ MoveNames::
db "いびき@" ; SNORE
db "クギをうつ@" ; NAIL_DOWN
db "じたばた@" ; FLAIL
- db "テクスチャー2@" ; CONVERSION2
+ db "テクスチャー2@" ; CONVERSION2
db "こばんなげ@" ; COIN_HURL
db "わたほうし@" ; COTTON_SPORE
db "きしかいせい@" ; REVERSAL
diff --git a/data/pokemon/evos_attacks.asm b/data/pokemon/evos_attacks.asm
index e78a5d0..c18757b 100644
--- a/data/pokemon/evos_attacks.asm
+++ b/data/pokemon/evos_attacks.asm
@@ -622,7 +622,7 @@ KongpangEvosAttacks: ; 42a1c
db 35, MOVE_LEECH_LIFE
db 42, MOVE_PSYBEAM
db 49, MOVE_SLEEP_POWDER
- db 56, MOVE_PSYCHIC_M
+ db 56, MOVE_PSYCHIC
db 0 ; no more level-up moves
MorphonEvosAttacks: ; 42a33
@@ -635,7 +635,7 @@ MorphonEvosAttacks: ; 42a33
db 40, MOVE_LEECH_LIFE
db 48, MOVE_PSYBEAM
db 56, MOVE_SLEEP_POWDER
- db 64, MOVE_PSYCHIC_M
+ db 64, MOVE_PSYCHIC
db 0 ; no more level-up moves
DigdaEvosAttacks: ; 42a47
@@ -825,7 +825,7 @@ YungererEvosAttacks: ; 42b5d
db 36, MOVE_RECOVER
db 41, MOVE_REFLECT
db 41, MOVE_LIGHT_SCREEN
- db 46, MOVE_PSYCHIC_M
+ db 46, MOVE_PSYCHIC
db 0 ; no more level-up moves
FoodinEvosAttacks: ; 42b76
@@ -839,7 +839,7 @@ FoodinEvosAttacks: ; 42b76
db 36, MOVE_RECOVER
db 41, MOVE_REFLECT
db 41, MOVE_LIGHT_SCREEN
- db 46, MOVE_PSYCHIC_M
+ db 46, MOVE_PSYCHIC
db 0 ; no more level-up moves
WanrikyEvosAttacks: ; 42b8c
@@ -1032,7 +1032,7 @@ YadonEvosAttacks: ; 42cb3
db 22, MOVE_WATER_GUN
db 31, MOVE_HEADBUTT
db 41, MOVE_AMNESIA
- db 52, MOVE_PSYCHIC_M
+ db 52, MOVE_PSYCHIC
db 0 ; no more level-up moves
YadoranEvosAttacks: ; 42cc6
@@ -1045,7 +1045,7 @@ YadoranEvosAttacks: ; 42cc6
db 37, MOVE_WITHDRAW
db 39, MOVE_HEADBUTT
db 51, MOVE_AMNESIA
- db 64, MOVE_PSYCHIC_M
+ db 64, MOVE_PSYCHIC
db 0 ; no more level-up moves
CoilEvosAttacks: ; 42cdc
@@ -1269,7 +1269,7 @@ SleepeEvosAttacks: ; 42e30
db 26, MOVE_POISON_GAS
db 31, MOVE_MEDITATE
db 36, MOVE_STALKER
- db 41, MOVE_PSYCHIC_M
+ db 41, MOVE_PSYCHIC
db 46, MOVE_CONFUSE_RAY
db 0 ; no more level-up moves
@@ -1283,7 +1283,7 @@ SleeperEvosAttacks: ; 42e49
db 31, MOVE_POISON_GAS
db 37, MOVE_MEDITATE
db 43, MOVE_STALKER
- db 49, MOVE_PSYCHIC_M
+ db 49, MOVE_PSYCHIC
db 55, MOVE_CONFUSE_RAY
db 0 ; no more level-up moves
@@ -1994,7 +1994,7 @@ MewtwoEvosAttacks: ; 432bf
db 46, MOVE_RECOVER
db 58, MOVE_SAFEGUARD
db 71, MOVE_BARRIER
- db 85, MOVE_PSYCHIC_M
+ db 85, MOVE_PSYCHIC
db 100, MOVE_AMNESIA
db 0 ; no more level-up moves
@@ -2465,7 +2465,7 @@ KokumoEvosAttacks: ; 435a2
db 26, MOVE_BITE
db 34, MOVE_SPIDER_WEB
db 43, MOVE_NIGHT_SHADE
- db 53, MOVE_PSYCHIC_M
+ db 53, MOVE_PSYCHIC
db 0 ; no more level-up moves
TwoheadEvosAttacks: ; 435b9
@@ -2478,7 +2478,7 @@ TwoheadEvosAttacks: ; 435b9
db 31, MOVE_BITE
db 40, MOVE_SPIDER_WEB
db 50, MOVE_NIGHT_SHADE
- db 61, MOVE_PSYCHIC_M
+ db 61, MOVE_PSYCHIC
db 0 ; no more level-up moves
YoroidoriEvosAttacks: ; 435cd
@@ -2644,7 +2644,7 @@ YadokingEvosAttacks: ; 436b6
db 37, MOVE_SWAGGER
db 39, MOVE_HEADBUTT
db 51, MOVE_AMNESIA
- db 64, MOVE_PSYCHIC_M
+ db 64, MOVE_PSYCHIC
db 0 ; no more level-up moves
AnnonEvosAttacks: ; 436ca
@@ -2697,7 +2697,7 @@ EifieEvosAttacks: ; 436ff
db 42, MOVE_AGILITY
db 49, MOVE_REFLECT
db 56, MOVE_LIGHT_SCREEN
- db 63, MOVE_PSYCHIC_M
+ db 63, MOVE_PSYCHIC
db 0 ; no more level-up moves
BlackyEvosAttacks: ; 43715
@@ -2998,7 +2998,7 @@ NorowaraEvosAttacks: ; 438d5
db 35, MOVE_CONFUSION
db 46, MOVE_NIGHT_SHADE
db 58, MOVE_SUBSTITUTE
- db 71, MOVE_PSYCHIC_M
+ db 71, MOVE_PSYCHIC
db 85, MOVE_PAIN_SPLIT
db 100, MOVE_NAIL_DOWN
db 0 ; no more level-up moves
diff --git a/data/pokemon/names.asm b/data/pokemon/names.asm
index 29cf7e2..54d5263 100644
--- a/data/pokemon/names.asm
+++ b/data/pokemon/names.asm
@@ -182,7 +182,7 @@ PokemonNames::
db "ネイティオ" ; NATIO
db "ギョピン@" ; GYOPIN
db "マりル@@" ; MARIL
- db "マンボー1" ; MANBO1
+ db "マンボー1" ; MANBO1
db "イカり@@" ; IKARI
db "グロテス@" ; GROTESS
db "エクシング" ; EKSING
@@ -241,7 +241,7 @@ PokemonNames::
db "へルガー@" ; HELGAA
db "ウルフマン" ; WOLFMAN
db "ワーウルフ" ; WARWOLF
- db "ポりゴン2" ; PORYGON2
+ db "ポりゴン2" ; PORYGON2
db "ナメール@" ; NAMEIL
db "ハガネール" ; HAGANEIL
db "キングドラ" ; KINGDRA
diff --git a/data/pokemon_palettes.inc b/data/pokemon/palettes.inc
index 41ca0d5..41ca0d5 100755
--- a/data/pokemon_palettes.inc
+++ b/data/pokemon/palettes.inc
diff --git a/data/predef_pointers.inc b/data/predef_pointers.inc
index ca710dd..0cc8d67 100644
--- a/data/predef_pointers.inc
+++ b/data/predef_pointers.inc
@@ -24,8 +24,8 @@ PredefPointers:: ; 1:62d3
add_predef Function_cdf9
add_predef Function_ce10_2
add_predef Function_cd33
-Function_366cPredef::
- dbw 3, Function_366c
+GiveItemPredef::
+ dbw 3, GiveItem
add_predef Function_ce3c
add_predef Function_da28
add_predef Function_d886
diff --git a/data/sprites/sprites.asm b/data/sprites/sprites.asm
new file mode 100644
index 0000000..b901b7a
--- /dev/null
+++ b/data/sprites/sprites.asm
@@ -0,0 +1,102 @@
+INCLUDE "constants.asm"
+
+SECTION "OverworldSprites", ROMX[$423B], BANK[$05]
+
+overworld_sprite: MACRO
+; pointer, length, bank
+ dw \1
+ db \2 tiles, BANK(\1)
+ENDM
+
+OverworldSprites::
+ overworld_sprite GoldSpriteGFX, 12
+ overworld_sprite GoldBikeSpriteGFX, 12
+ overworld_sprite GoldSkateboardSpriteGFX, 12
+ overworld_sprite SilverSpriteGFX, 12
+ overworld_sprite OkidoSpriteGFX, 12
+ overworld_sprite RedSpriteGFX, 12
+ overworld_sprite BlueSpriteGFX, 12
+ overworld_sprite MasakiSpriteGFX, 12
+ overworld_sprite ElderSpriteGFX, 12
+ overworld_sprite SakakiSpriteGFX, 12
+ overworld_sprite GantetsuSpriteGFX, 12
+ overworld_sprite MomSpriteGFX, 12
+ overworld_sprite SilversMomSpriteGFX, 12
+ overworld_sprite RedsMomSpriteGFX, 12
+ overworld_sprite RedsMomSpriteGFX, 12
+ overworld_sprite NanamiSpriteGFX, 12
+ overworld_sprite EvilOkidoSpriteGFX, 12
+ overworld_sprite KikukoSpriteGFX, 12
+ overworld_sprite HayatoSpriteGFX, 12
+ overworld_sprite TsukushiSpriteGFX, 12
+ overworld_sprite TsukushiSpriteGFX, 12
+ overworld_sprite EnokiSpriteGFX, 12
+ overworld_sprite MikanSpriteGFX, 12
+ overworld_sprite MikanSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerMSpriteGFX, 12
+ overworld_sprite CooltrainerFSpriteGFX, 12
+ overworld_sprite BugCatcherBoySpriteGFX, 12
+ overworld_sprite TwinSpriteGFX, 12
+ overworld_sprite YoungsterSpriteGFX, 12
+ overworld_sprite LassSpriteGFX, 12
+ overworld_sprite TeacherSpriteGFX, 12
+ overworld_sprite GirlSpriteGFX, 12
+ overworld_sprite SuperNerdSpriteGFX, 12
+ overworld_sprite RockerSpriteGFX, 12
+ overworld_sprite PokefanMSpriteGFX, 12
+ overworld_sprite PokefanFSpriteGFX, 12
+ overworld_sprite GrampsSpriteGFX, 12
+ overworld_sprite GrannySpriteGFX, 12
+ overworld_sprite SwimmerMSpriteGFX, 12
+ overworld_sprite SwimmerFSpriteGFX, 12
+ overworld_sprite RocketMSpriteGFX, 12
+ overworld_sprite RocketMSpriteGFX, 12
+ overworld_sprite RocketMSpriteGFX, 12
+ overworld_sprite RocketFSpriteGFX, 12
+ overworld_sprite NurseSpriteGFX, 12
+ overworld_sprite LinkReceptionistSpriteGFX, 12
+ overworld_sprite ClerkSpriteGFX, 12
+ overworld_sprite FisherSpriteGFX, 12
+ overworld_sprite FishingGuruSpriteGFX, 12
+ overworld_sprite ScientistSpriteGFX, 12
+ overworld_sprite MediumSpriteGFX, 12
+ overworld_sprite SageSpriteGFX, 12
+ overworld_sprite FrowningManSpriteGFX, 12
+ overworld_sprite GentlemanSpriteGFX, 12
+ overworld_sprite BlackbeltSpriteGFX, 12
+ overworld_sprite ReceptionistSpriteGFX, 12
+ overworld_sprite OfficerSpriteGFX, 12
+ overworld_sprite CaptainSpriteGFX, 12
+ overworld_sprite CaptainSpriteGFX, 12
+ overworld_sprite CaptainSpriteGFX, 12
+ overworld_sprite MohawkSpriteGFX, 12
+ overworld_sprite GymGuySpriteGFX, 12
+ overworld_sprite SailorSpriteGFX, 12
+ overworld_sprite HelmetSpriteGFX, 12
+ overworld_sprite BurglarSpriteGFX, 12
+ overworld_sprite SidonSpriteGFX, 12
+ overworld_sprite PippiSpriteGFX, 12
+ overworld_sprite PoppoSpriteGFX, 12
+ overworld_sprite LizardonSpriteGFX, 12
+ overworld_sprite KabigonSpriteGFX, 4
+ overworld_sprite PawouSpriteGFX, 12
+ overworld_sprite NyorobonSpriteGFX, 12
+ overworld_sprite LaplaceSpriteGFX, 12
+ overworld_sprite PokeBallSpriteGFX, 4
+ overworld_sprite PokedexSpriteGFX, 4
+ overworld_sprite PaperSpriteGFX, 4
+ overworld_sprite OldLinkReceptionistSpriteGFX, 4
+ overworld_sprite OldLinkReceptionistSpriteGFX, 4
+ overworld_sprite EggSpriteGFX, 4
+ overworld_sprite BoulderSpriteGFX, 4
diff --git a/data/super_palettes.inc b/data/super_palettes.inc
index 052bcaf..cf654c3 100644
--- a/data/super_palettes.inc
+++ b/data/super_palettes.inc
@@ -1,5 +1,5 @@
SuperPalettes::
- RGB 28,28,28, 23,21,16, 15,20,20, 04,04,04 ; TOWN_00
+ RGB 28,28,28, 23,21,16, 15,20,20, 04,04,04 ; ROUTE
RGB 28,28,28, 25,24,29, 15,20,20, 04,04,04 ; TOWN_01
RGB 28,28,28, 11,31,03, 15,20,20, 04,04,04 ; TOWN_02
RGB 28,28,28, 18,18,18, 15,20,20, 04,04,04 ; TOWN_03
@@ -24,19 +24,19 @@ SuperPalettes::
RGB 28,28,28, 30,22,24, 28,15,21, 04,04,04 ; PINKMON
RGB 28,28,28, 31,28,14, 26,20,00, 04,04,04 ; YELLOWMON
RGB 28,28,28, 26,21,22, 15,15,18, 04,04,04 ; GREYMON
- RGB 28,28,28, 23,19,13, 14,12,17, 04,04,04 ; DARKMEWMON
- RGB 28,28,28, 16,18,21, 10,12,18, 04,04,04 ; DARKBLUEMON
- RGB 28,28,28, 22,15,16, 17,02,05, 04,04,04 ; DARKREDMON
- RGB 28,28,28, 15,20,20, 05,16,16, 04,04,04 ; DARKCYANMON
- RGB 28,28,28, 23,15,19, 14,04,12, 04,04,04 ; DARKPURPLEMON
- RGB 28,28,28, 20,17,18, 18,13,11, 04,04,04 ; DARKBROWNMON
- RGB 28,28,28, 23,21,16, 12,12,10, 04,04,04 ; TANMON
- RGB 28,28,28, 21,25,29, 30,22,24, 04,04,04 ; BLUEPINKMON
- RGB 28,28,28, 26,23,16, 29,14,09, 04,04,04 ; ORANGEMON
- RGB 28,28,28, 18,18,18, 10,10,10, 04,04,04 ; DARKGREYMON
- RGB 28,28,28, 30,26,15, 09,20,11, 04,04,04 ; GREENBAR
- 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, 23,19,13, 14,12,17, 04,04,04 ; SHINY_MEWMON
+ RGB 28,28,28, 16,18,21, 10,12,18, 04,04,04 ; SHINY_BLUEMON
+ RGB 28,28,28, 22,15,16, 17,02,05, 04,04,04 ; SHINY_REDMON
+ RGB 28,28,28, 15,20,20, 05,16,16, 04,04,04 ; SHINY_CYANMON
+ RGB 28,28,28, 23,15,19, 14,04,12, 04,04,04 ; SHINY_PURPLEMON
+ RGB 28,28,28, 20,17,18, 18,13,11, 04,04,04 ; SHINY_BROWNMON
+ RGB 28,28,28, 23,21,16, 12,12,10, 04,04,04 ; SHINY_GREENMON
+ RGB 28,28,28, 21,25,29, 30,22,24, 04,04,04 ; SHINY_PINKMON
+ RGB 28,28,28, 26,23,16, 29,14,09, 04,04,04 ; SHINY_YELLOWMON
+ RGB 28,28,28, 18,18,18, 10,10,10, 04,04,04 ; SHINY_GREYMON
+ RGB 28,28,28, 30,26,15, 09,20,11, 04,04,04 ; GREEN_BAR
+ 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
diff --git a/data/trainers/parties.asm b/data/trainers/parties.asm
index d31c34c..f91aba7 100644
--- a/data/trainers/parties.asm
+++ b/data/trainers/parties.asm
@@ -16,6 +16,8 @@ INCLUDE "data/trainers/party_pointers.inc"
; TODO: decode all data
if def(GOLD)
+HayatoGroup::
+
SECTION "Trainer Parties 1 TEMPORARY", ROMX[$51BF],BANK[$E]
AkaneGroup::
BugCatcherBoyGroup::
@@ -29,168 +31,239 @@ BugCatcherBoyGroup::
db 9, DEX_REDIBA, ITEM_NONE, MOVE_SCRATCH, MOVE_QUICK_ATTACK, 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::
+; Leftover Bug Catcher data from Red/Blue
+ db 6, MON_BEEDLE, MON_CATERPIE, 0
+ db 7, MON_BEEDLE, MON_COCOON, MON_BEEDLE, 0
+ db 9, MON_BEEDLE, 0
+ db 10, MON_CATERPIE, MON_BEEDLE, MON_CATERPIE, 0
+ db 9, MON_BEEDLE, MON_COCOON, MON_CATERPIE, MON_TRANSEL, 0
+ db 11, MON_CATERPIE, MON_TRANSEL, 0
+ db 11, MON_BEEDLE, MON_COCOON, 0
+ db 10, MON_CATERPIE, MON_TRANSEL, MON_CATERPIE, 0
+ db 14, MON_CATERPIE, MON_BEEDLE, 0
+ db 16, MON_BEEDLE, MON_CATERPIE, MON_BEEDLE, 0
+ db 20, MON_BUTTERFREE, 0
+ db 18, MON_TRANSEL, MON_CATERPIE, MON_KONGPANG, 0
+ db 19, MON_SPEAR, MON_SPEAR, 0
+ db 20, MON_CATERPIE, MON_BEEDLE, MON_KONGPANG, 0
-SECTION "Trainer Parties 4 TEMPORARY", ROMX[$54B6],BANK[$E]
-WataruGroup::
-
-SECTION "Trainer Parties 5 TEMPORARY", ROMX[$54DC],BANK[$E]
-GerugeMemberMGroup::
-
-SECTION "Trainer Parties 6 TEMPORARY", ROMX[$54FA],BANK[$E]
-Trio1Group::
-BeautyGroup::
- ; BEAUTY_MEGUMI
- db "めぐみ@", TRAINERTYPE_ITEM_MOVES
- db 10, DEX_NYARTH, ITEM_NONE, MOVE_PAY_DAY, MOVE_GROWL, MOVE_NONE, MOVE_NONE
+TsukishiGroup::
+LassGroup::
+ ; LASS_ATSUKO
+ db "あつこ@", TRAINERTYPE_ITEM_MOVES
+ db 8, DEX_NAZONOKUSA, ITEM_NONE
+ ; No moves?
db -1 ; end
-SECTION "Trainer Parties 7 TEMPORARY", ROMX[$55F4],BANK[$E]
-FledglingGroup::
+; Leftover Lass data from Red/Blue
+ db 9, MON_POPPO, MON_POPPO, 0
+ db 10, MON_KORATTA, MON_NIDORAN_M, 0
+ db 14, MON_PURIN, 0
+ db 31, MON_PARAS, MON_PARAS, MON_PARASECT, 0
+ db 11, MON_NAZONOKUSA, MON_MADATSUBOMI, 0
+ db 14, MON_PIPPI, 0
+ db 16, MON_POPPO, MON_NIDORAN_F, 0
+ db 14, MON_POPPO, MON_NIDORAN_F, 0
+ db 15, MON_NIDORAN_M, MON_NIDORAN_F, 0
+ db 13, MON_NAZONOKUSA, MON_POPPO, MON_NAZONOKUSA, 0
+ db 18, MON_POPPO, MON_NIDORAN_F, 0
+ db 18, MON_KORATTA, MON_PIKACHU, 0
+ db 23, MON_NIDORAN_F, MON_NIDORINA, 0
+ db 24, MON_NYARTH, MON_NYARTH, MON_NYARTH, 0
+ db 19, MON_POPPO, MON_KORATTA, MON_NIDORAN_M, MON_NYARTH, MON_PIKACHU, 0
+ db 22, MON_PIPPI, MON_PIPPI, 0
+ db 23, MON_MADATSUBOMI, MON_UTSUDON, 0
+ db 23, MON_NAZONOKUSA, MON_KUSAIHANA, 0
-SECTION "Trainer Parties 8 TEMPORARY", ROMX[$56D7],BANK[$E]
-PokeManiacGroup::
+EnokiGroup::
+; Leftover Sailor data from Red/Blue
+ db 18, MON_WANRIKY, MON_SHELLDER, 0
+ db 17, MON_WANRIKY, MON_MENOKURAGE, 0
+ db 21, MON_SHELLDER, 0
+ db 17, MON_TATTU, MON_SHELLDER, MON_MENOKURAGE, 0
+ db 18, MON_MENOKURAGE, MON_HITODEMAN, 0
+ db 17, MON_TATTU, MON_TATTU, MON_TATTU, 0
+ db 20, MON_WANRIKY, 0
+ db 21, MON_PIKACHU, MON_PIKACHU, 0
-SECTION "Trainer Parties 9 TEMPORARY", ROMX[$57C5],BANK[$E]
-GentlemanGroup::
+OkeraGroup::
+; Leftover Jr.Trainer♂ data from Red/Blue
+ db 11, MON_DIGDA, MON_SAND, 0
+ db 14, MON_KORATTA, MON_ARBO, 0
+ db 18, MON_MANKEY, 0
+ db 20, MON_ZENIGAME, 0
+ db 16, MON_ONISUZUME, MON_RATTA, 0
+ db 18, MON_DIGDA, MON_DIGDA, MON_SAND, 0
+ db 21, MON_GARDIE, MON_HITOKAGE, 0
+ db 19, MON_KORATTA, MON_DIGDA, MON_ARBO, MON_SAND, 0
+ db 29, MON_NIDORAN_M, MON_NIDORINO, 0
+
+SECTION "Trainer Parties 4 TEMPORARY", ROMX[$52B4],BANK[$E]
+MikanGroup::
-SECTION "Trainer Parties 10 TEMPORARY", ROMX[$57E9],BANK[$E]
-TeacherMGroup::
+SECTION "Trainer Parties 5 TEMPORARY", ROMX[$5320],BANK[$E]
+BlueGroup::
-SECTION "Trainer Parties 11 TEMPORARY", ROMX[$57F5],BANK[$E]
-TeacherFGroup::
+SECTION "Trainer Parties 6 TEMPORARY", ROMX[$533D],BANK[$E]
+GamaGroup::
-SECTION "Trainer Parties 12 TEMPORARY", ROMX[$57FB],BANK[$E]
-ManchildGroup::
+SECTION "Trainer Parties 7 TEMPORARY", ROMX[$5375],BANK[$E]
+RivalGroup::
+ db 5, DEX_KURUSU, 0
+ db 5, DEX_HAPPA, 0
+ db 5, DEX_HONOGUMA, 0
-SECTION "Trainer Parties 13 TEMPORARY", ROMX[$58CC],BANK[$E]
-RockerGroup::
+SECTION "Trainer Parties 8 TEMPORARY", ROMX[$53BC],BANK[$E]
+OkidoGroup::
-SECTION "Trainer Parties 14 TEMPORARY", ROMX[$58FB],BANK[$E]
-HikerGroup::
+SECTION "Trainer Parties 9 TEMPORARY", ROMX[$5404],BANK[$E]
+SakakiGroup::
-SECTION "Trainer Parties 15 TEMPORARY", ROMX[$59A2],BANK[$E]
-KimonoGirlGroup::
- ; KIMONO_GIRL_TAMAO
- db "たまお@", TRAINERTYPE_ITEM_MOVES
- db 12, DEX_PURIN, ITEM_NONE, MOVE_CHARM, MOVE_ENCORE, MOVE_POUND, MOVE_NONE
- db -1 ; end
+SECTION "Trainer Parties 10 TEMPORARY", ROMX[$5427],BANK[$E]
+ProtagonistGroup::
- ; KIMONO_GIRL_KOUME
- db "こうめ@", TRAINERTYPE_ITEM_MOVES
- db 10, DEX_PIPPI, ITEM_NONE, MOVE_CHARM, MOVE_SWEET_KISS, MOVE_POUND, MOVE_NONE
+SECTION "Trainer Parties 11 TEMPORARY", ROMX[$5433],BANK[$E]
+SibaGroup::
+KasumiGroup::
+FisherGroup::
+ ; FISHER_HISASHI
+ db "ひさし@", TRAINERTYPE_ITEM_MOVES
+ db 8, DEX_PUKU, ITEM_NONE
+ ; No moves?
db -1 ; end
-SECTION "Trainer Parties 16 TEMPORARY", ROMX[$518A],BANK[$E]
-HayatoGroup::
-
-SECTION "Trainer Parties 17 TEMPORARY", ROMX[$521A],BANK[$E]
-TsukishiGroup::
-LassGroup::
+SECTION "Trainer Parties 12 TEMPORARY", ROMX[$5472],BANK[$E]
+KannaGroup::
-SECTION "Trainer Parties 18 TEMPORARY", ROMX[$526F],BANK[$E]
-EnokiGroup::
+SECTION "Trainer Parties 13 TEMPORARY", ROMX[$54B6],BANK[$E]
+WataruGroup::
-SECTION "Trainer Parties 19 TEMPORARY", ROMX[$528F],BANK[$E]
-OkeraGroup::
+SECTION "Trainer Parties 14 TEMPORARY", ROMX[$54DC],BANK[$E]
+GerugeMemberMGroup::
-SECTION "Trainer Parties 20 TEMPORARY", ROMX[$533D],BANK[$E]
-GamaGroup::
+SECTION "Trainer Parties 15 TEMPORARY", ROMX[$54FA],BANK[$E]
+Trio1Group::
+BeautyGroup::
+ ; BEAUTY_MEGUMI
+ db "めぐみ@", TRAINERTYPE_ITEM_MOVES
+ db 10, DEX_NYARTH, ITEM_NONE, MOVE_PAY_DAY, MOVE_GROWL, MOVE_NONE, MOVE_NONE
+ db -1 ; end
-SECTION "Trainer Parties 21 TEMPORARY", ROMX[$554B],BANK[$E]
+SECTION "Trainer Parties 16 TEMPORARY", ROMX[$554B],BANK[$E]
Trio2Group::
-SECTION "Trainer Parties 22 TEMPORARY", ROMX[$555D],BANK[$E]
+SECTION "Trainer Parties 17 TEMPORARY", ROMX[$555D],BANK[$E]
Trio3Group::
-SECTION "Trainer Parties 23 TEMPORARY", ROMX[$567C],BANK[$E]
-ProfessionalMGroup::
-ProfessionalFGroup::
+SECTION "Trainer Parties 18 TEMPORARY", ROMX[$5566],BANK[$E]
+RocketFGroup::
-SECTION "Trainer Parties 24 TEMPORARY", ROMX[$581B],BANK[$E]
-SwimmerMGroup::
+SECTION "Trainer Parties 19 TEMPORARY", ROMX[$5587],BANK[$E]
+YoungsterGroup::
-SECTION "Trainer Parties 25 TEMPORARY", ROMX[$582A],BANK[$E]
-SuperNerdGroup::
+SECTION "Trainer Parties 20 TEMPORARY", ROMX[$55F4],BANK[$E]
+FledglingGroup::
-SECTION "Trainer Parties 26 TEMPORARY", ROMX[$583C],BANK[$E]
-EngineerGroup::
+SECTION "Trainer Parties 21 TEMPORARY", ROMX[$5658],BANK[$E]
+ProdigyGroup::
-SECTION "Trainer Parties 27 TEMPORARY", ROMX[$596E],BANK[$E]
-JugglerGroup::
+SECTION "Trainer Parties 22 TEMPORARY", ROMX[$567C],BANK[$E]
+ProfessionalMGroup::
+ProfessionalFGroup::
-SECTION "Trainer Parties 28 TEMPORARY", ROMX[$597A],BANK[$E]
-TwinsGroup::
+SECTION "Trainer Parties 23 TEMPORARY", ROMX[$56D7],BANK[$E]
+PokeManiacGroup::
-SECTION "Trainer Parties 29 TEMPORARY", ROMX[$597F],BANK[$E]
-SchoolboyGroup::
- ; SCHOOLBOY_TETSUYA
- db "てつや@", TRAINERTYPE_ITEM_MOVES
- db 9, DEX_YADOKING, ITEM_NONE, MOVE_DISABLE, MOVE_CONFUSION, MOVE_NONE, MOVE_NONE
- db -1 ; end
+SECTION "Trainer Parties 24 TEMPORARY", ROMX[$5795],BANK[$E]
+RocketMGroup::
-SECTION "Trainer Parties 30 TEMPORARY", ROMX[$598C],BANK[$E]
-FirebreatherGroup::
- ; FIREBREATHER_AKITO
- db "あきと@", TRAINERTYPE_ITEM_MOVES
- db 10, DEX_BOOBY, ITEM_NONE, MOVE_SCRATCH, MOVE_SMOG, MOVE_NONE, MOVE_NONE
- db -1 ; end
+SECTION "Trainer Parties 25 TEMPORARY", ROMX[$57C5],BANK[$E]
+GentlemanGroup::
-SECTION "Trainer Parties 31 TEMPORARY", ROMX[$5320],BANK[$E]
-BlueGroup::
+SECTION "Trainer Parties 26 TEMPORARY", ROMX[$57E9],BANK[$E]
+TeacherMGroup::
+; Leftover Bruno data from Red/Blue
+ db -1, 53, MON_IWARK, 55, MON_EBIWALAR, 55, MON_SAWAMULAR, 56, MON_IWARK, 58, MON_KAIRIKY, 0
-SECTION "Trainer Parties 32 TEMPORARY", ROMX[$5375],BANK[$E]
-RivalGroup::
+TeacherFGroup::
+; Leftover Brock data from Red/Blue
+ db -1, 12, MON_ISITSUBUTE, 14, MON_IWARK, 0
-SECTION "Trainer Parties 33 TEMPORARY", ROMX[$5404],BANK[$E]
-SakakiGroup::
+ManchildGroup::
+; Leftover Misty data from Red/Blue
+ db -1, 18, MON_HITODEMAN, 21, MON_STARMIE, 0
-SECTION "Trainer Parties 34 TEMPORARY", ROMX[$5427],BANK[$E]
-ProtagonistGroup::
+; Leftover Lt.Surge data from Red/Blue
+ db -1, 21, MON_BIRIRIDAMA, 18, MON_PIKACHU, 24, MON_RAICHU, 0
-SECTION "Trainer Parties 35 TEMPORARY", ROMX[$5433],BANK[$E]
-SibaGroup::
-KasumiGroup::
-FisherGroup::
+; Leftover Erika data from Red/Blue
+ db -1, 29, MON_UTSUBOT, 24, MON_MONJARA, 29, MON_RUFFRESIA, 0
-SECTION "Trainer Parties 36 TEMPORARY", ROMX[$5472],BANK[$E]
-KannaGroup::
+SwimmerFGroup::
+; Leftover Koga data from Red/Blue
+ db -1, 37, MON_DOGARS, 39, MON_BETBETON, 37, MON_DOGARS, 43, MON_MATADOGAS, 0
-SECTION "Trainer Parties 37 TEMPORARY", ROMX[$5566],BANK[$E]
-RocketFGroup::
+SwimmerMGroup::
+ db 10, DEX_BARIRINA, DEX_KIRINRIKI, DEX_PUCHICORN, 0
-SECTION "Trainer Parties 38 TEMPORARY", ROMX[$5587],BANK[$E]
-YoungsterGroup::
+SailorGroup::
+; Leftover Sabrina data from Red/Blue
+ db -1, 38, MON_YUNGERER, 37, MON_BARRIERD, 38, MON_MORPHON, 43, MON_FOODIN, 0
-SECTION "Trainer Parties 39 TEMPORARY", ROMX[$5658],BANK[$E]
-ProdigyGroup::
+SuperNerdGroup::
-SECTION "Trainer Parties 40 TEMPORARY", ROMX[$5795],BANK[$E]
-RocketMGroup::
+SECTION "Trainer Parties 27 TEMPORARY", ROMX[$583C],BANK[$E]
+EngineerGroup::
-SECTION "Trainer Parties 41 TEMPORARY", ROMX[$5811],BANK[$E]
-SwimmerFGroup::
+SECTION "Trainer Parties 28 TEMPORARY", ROMX[$58CC],BANK[$E]
+RockerGroup::
-SECTION "Trainer Parties 42 TEMPORARY", ROMX[$5820],BANK[$E]
-SailorGroup::
+SECTION "Trainer Parties 29 TEMPORARY", ROMX[$58FB],BANK[$E]
+HikerGroup::
-SECTION "Trainer Parties 43 TEMPORARY", ROMX[$5907],BANK[$E]
+SECTION "Trainer Parties 30 TEMPORARY", ROMX[$5907],BANK[$E]
BikerGroup::
-
-SECTION "Trainer Parties 44 TEMPORARY", ROMX[$5956],BANK[$E]
+; Leftover Channeler data from Red/Blue
+ db 22, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 23, MON_GHOS, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 23, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 24, MON_GHOST, 0
+ db 22, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 23, MON_GHOS, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 22, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 23, MON_GHOST, 0
+ db 24, MON_GHOS, 0
+ db 22, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 22, MON_GHOST, 0
+ db 22, MON_GHOS, MON_GHOS, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 24, MON_GHOS, 0
+ db 34, MON_GHOS, MON_GHOST, 0
+ db 38, MON_GHOST, 0
+ db 33, MON_GHOS, MON_GHOS, MON_GHOST, 0
+
+SECTION "Trainer Parties 31 TEMPORARY", ROMX[$5956],BANK[$E]
RockClimberGroup::
+; Leftover Agatha data from Red/Blue
+ db -1, 56, MON_GANGAR, 56, MON_GOLBAT, 55, MON_GHOST, 58, MON_ARBOK, 60, MON_GANGAR, 0
-SECTION "Trainer Parties 45 TEMPORARY", ROMX[$5962],BANK[$E]
BurglarGroup::
+; Leftover Lance data from Red/Blue
+ db -1, 58, MON_GYARADOS, 56, MON_HAKURYU, 56, MON_HAKURYU, 60, MON_PTERA, 62, MON_KAIRYU, 0
+
+JugglerGroup::
+ db 6, DEX_MARIL, DEX_GYOPIN, 0
-SECTION "Trainer Parties 46 TEMPORARY", ROMX[$5972],BANK[$E]
BlackbeltGroup::
+ db 6, DEX_PY, DEX_GYOPIN, 0
-SECTION "Trainer Parties 47 TEMPORARY", ROMX[$5976],BANK[$E]
PsychicGroup::
KungFuMasterGroup::
FortuneTellerGroup::
@@ -199,14 +272,39 @@ SageGroup::
MediumGroup::
SoldierGroup::
GerugeMemberFGroup::
+ db 12, DEX_SHIBIREFUGU, DEX_MADAME, 0
+
+TwinsGroup::
+ db 13, DEX_MADAME, DEX_ELEBABY, DEX_MIZUUO, 0
+
+SchoolboyGroup::
+ ; SCHOOLBOY_TETSUYA
+ db "てつや@", TRAINERTYPE_ITEM_MOVES
+ db 9, DEX_YADOKING, ITEM_NONE, MOVE_DISABLE, MOVE_CONFUSION, MOVE_NONE, MOVE_NONE
+ db -1 ; end
+
+FirebreatherGroup::
+ ; FIREBREATHER_AKITO
+ db "あきと@", TRAINERTYPE_ITEM_MOVES
+ db 10, DEX_BOOBY, ITEM_NONE, MOVE_SCRATCH, MOVE_SMOG, MOVE_NONE, MOVE_NONE
+ db -1 ; end
-SECTION "Trainer Parties 48 TEMPORARY", ROMX[$5999],BANK[$E]
SportsmanGroup::
; SPORTSMAN_SHIGEKI
db "しげき@", TRAINERTYPE_ITEM
db 8, DEX_DONPHAN, ITEM_NONE
db -1 ; end
+KimonoGirlGroup::
+ ; KIMONO_GIRL_TAMAO
+ db "たまお@", TRAINERTYPE_ITEM_MOVES
+ db 12, DEX_PURIN, ITEM_NONE, MOVE_CHARM, MOVE_ENCORE, MOVE_POUND, MOVE_NONE
+ db -1 ; end
+
+ ; KIMONO_GIRL_KOUME
+ db "こうめ@", TRAINERTYPE_ITEM_MOVES
+ db 10, DEX_PIPPI, ITEM_NONE, MOVE_CHARM, MOVE_SWEET_KISS, MOVE_POUND, MOVE_NONE
+ db -1 ; end
else
diff --git a/data/wild.asm b/data/wild.asm
new file mode 100644
index 0000000..515985d
--- /dev/null
+++ b/data/wild.asm
@@ -0,0 +1,645 @@
+INCLUDE "constants.asm"
+
+SECTION "Wild Pokémon", ROMX[$6A3C], BANK[$0F]
+
+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
+ ; day
+ 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
+ ; day
+ 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
+
+ db $02, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 9, DEX_CATERPIE
+ db 9, DEX_TRANSEL
+ db 8, DEX_CATERPIE
+ db 7, DEX_TRANSEL
+ db 10, DEX_POPPO
+ db 7, DEX_CATERPIE
+ ; day
+ db 8, DEX_CATERPIE
+ db 9, DEX_POPPO
+ db 11, DEX_KORATTA
+ db 9, DEX_KORATTA
+ db 10, DEX_KORATTA
+ db 8, DEX_CATERPIE
+ ; nite
+ db 9, DEX_KORATTA
+ db 10, DEX_HOHO
+ db 11, DEX_NAZONOKUSA
+ db 12, DEX_HOHO
+ db 11, DEX_NAZONOKUSA
+ db 13, DEX_NAZONOKUSA
+
+ db $06, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 19, DEX_METAMON
+ db 20, DEX_ONIDRILL
+ db 18, DEX_METAMON
+ db 17, DEX_TRANSEL
+ db 21, DEX_ONIDRILL
+ db 17, DEX_METAMON
+ ; day
+ db 17, DEX_ONISUZUME
+ db 18, DEX_ONISUZUME
+ db 21, DEX_DODO
+ db 19, DEX_DODO
+ db 20, DEX_DODO
+ db 18, DEX_METAMON
+ ; nite
+ db 19, DEX_SLEEPE
+ db 20, DEX_SLEEPE
+ db 21, DEX_SLEEPE
+ db 22, DEX_SLEEPE
+ db 23, DEX_SLEEPE
+ db 23, DEX_SLEEPE
+
+ db $04, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 12, DEX_TAMATAMA
+ db 12, DEX_KONGPANG
+ db 11, DEX_TAMATAMA
+ db 10, DEX_KONGPANG
+ db 13, DEX_ONISUZUME
+ db 10, DEX_TAMATAMA
+ ; day
+ db 11, DEX_ONISUZUME
+ db 12, DEX_ONISUZUME
+ db 14, DEX_ISITSUBUTE
+ db 12, DEX_ISITSUBUTE
+ db 13, DEX_ISITSUBUTE
+ db 11, DEX_TAMATAMA
+ ; nite
+ db 12, DEX_ARBO
+ db 13, DEX_ARBO
+ db 14, DEX_ARBO
+ db 15, DEX_ARBO
+ db 16, DEX_ARBO
+ db 16, DEX_ARBO
+
+ db $04, $02 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 25, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 20, DEX_MENOKURAGE
+ db 15, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 15, DEX_MENOKURAGE
+ ; day
+ db 20, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 35, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ ; nite
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 35, DEX_MENOKURAGE
+ db 40, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 45, DEX_MENOKURAGE
+
+ db $05, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 25, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 20, DEX_MENOKURAGE
+ db 15, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 15, DEX_MENOKURAGE
+ ; day
+ db 20, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 35, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ ; nite
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 35, DEX_MENOKURAGE
+ db 40, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 45, DEX_MENOKURAGE
+
+ db $05, $02 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 25, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 20, DEX_MENOKURAGE
+ db 15, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 15, DEX_MENOKURAGE
+ ; day
+ db 20, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 35, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ ; nite
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 35, DEX_MENOKURAGE
+ db 40, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 45, DEX_MENOKURAGE
+
+ db $05, $03 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 16, DEX_WANRIKY
+ db 16, DEX_WANRIKY
+ db 15, DEX_WANRIKY
+ db 14, DEX_WANRIKY
+ db 17, DEX_ONISUZUME
+ db 14, DEX_WANRIKY
+ ; day
+ db 15, DEX_ONISUZUME
+ db 16, DEX_ONISUZUME
+ db 18, DEX_KORATTA
+ db 16, DEX_KORATTA
+ db 17, DEX_KORATTA
+ db 15, DEX_ONISUZUME
+ ; nite
+ db 16, DEX_SLEEPE
+ db 17, DEX_SLEEPE
+ db 18, DEX_SLEEPE
+ db 19, DEX_SLEEPE
+ db 20, DEX_SLEEPE
+ db 20, DEX_SLEEPE
+
+ db $05, $04 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 17, DEX_ONISUZUME
+ db 17, DEX_ONISUZUME
+ db 16, DEX_ONISUZUME
+ db 15, DEX_ONISUZUME
+ db 18, DEX_DODO
+ db 15, DEX_ONISUZUME
+ ; day
+ db 16, DEX_DODO
+ db 17, DEX_DONPHAN
+ db 19, DEX_SAND
+ db 17, DEX_SAND
+ db 18, DEX_SAND
+ db 16, DEX_DODO
+ ; nite
+ db 17, DEX_DODO
+ db 18, DEX_DODO
+ db 19, DEX_DODO
+ db 20, DEX_DODO
+ db 21, DEX_BULU
+ db 21, DEX_BULU
+
+ db $06, $02 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 21, DEX_ONISUZUME
+ db 21, DEX_ONISUZUME
+ db 20, DEX_ONIDRILL
+ db 19, DEX_ONIDRILL
+ db 22, DEX_ONIDRILL
+ db 19, DEX_ONISUZUME
+ ; day
+ db 20, DEX_DODO
+ db 22, DEX_SANDPAN
+ db 21, DEX_DONPHAN
+ db 21, DEX_SAND
+ db 23, DEX_SAND
+ db 20, DEX_DODO
+ ; nite
+ db 21, DEX_DODO
+ db 22, DEX_DODO
+ db 23, DEX_DODO
+ db 24, DEX_DODO
+ db 25, DEX_BULU
+ db 25, DEX_BULU
+
+ db $06, $03 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 23, DEX_HANEKO
+ db 23, DEX_POPONEKO
+ db 22, DEX_HANEKO
+ db 25, DEX_POPONEKO
+ db 24, DEX_SAND
+ db 21, DEX_HANEKO
+ ; day
+ db 22, DEX_SAND
+ db 23, DEX_SANDPAN
+ db 25, DEX_ROKON
+ db 23, DEX_ROKON
+ db 21, DEX_MIKON
+ db 22, DEX_HANEKO
+ ; nite
+ db 23, DEX_HOHO
+ db 24, DEX_HOHO
+ db 25, DEX_HOHO
+ db 26, DEX_HOHO
+ db 27, DEX_BULU
+ db 27, DEX_BULU
+
+ db $07, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 24, DEX_HANEKO
+ db 24, DEX_POPONEKO
+ db 23, DEX_HANEKO
+ db 22, DEX_POPONEKO
+ db 25, DEX_POPONEKO
+ db 22, DEX_HANEKO
+ ; day
+ db 23, DEX_POPPO
+ db 24, DEX_PIGEON
+ db 26, DEX_ROKON
+ db 24, DEX_ROKON
+ db 25, DEX_ROKON
+ db 23, DEX_HANEKO
+ ; nite
+ db 24, DEX_HOHO
+ db 25, DEX_HOHO
+ db 26, DEX_SLEEPE
+ db 27, DEX_SLEEPE
+ db 28, DEX_SLEEPER
+ db 28, DEX_SLEEPER
+
+ db $08, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 25, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 20, DEX_MENOKURAGE
+ db 15, DEX_MENOKURAGE
+ db 35, DEX_IKARI
+ db 15, DEX_MENOKURAGE
+ ; day
+ db 20, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 35, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ ; nite
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 35, DEX_MENOKURAGE
+ db 40, DEX_MENOKURAGE
+ db 35, DEX_IKARI
+ db 45, DEX_MENOKURAGE
+
+ db $07, $02 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 28, DEX_HANEKO
+ db 28, DEX_POPONEKO
+ db 27, DEX_HANEKO
+ db 27, DEX_POPONEKO
+ db 30, DEX_POPONEKO
+ db 27, DEX_HANEKO
+ ; day
+ db 28, DEX_POPPO
+ db 29, DEX_PIGEON
+ db 31, DEX_ROKON
+ db 29, DEX_ROKON
+ db 30, DEX_ROKON
+ db 28, DEX_HANEKO
+ ; nite
+ db 29, DEX_HOHO
+ db 31, DEX_HOHO
+ db 32, DEX_SLEEPE
+ db 33, DEX_SLEEPE
+ db 34, DEX_SLEEPER
+ db 34, DEX_SLEEPER
+
+ db $07, $03 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 28, DEX_REDIBA
+ db 28, DEX_MANKEY
+ db 27, DEX_REDIBA
+ db 28, DEX_MANKEY
+ db 31, DEX_MANKEY
+ db 28, DEX_POPPO
+ ; day
+ db 29, DEX_MANKEY
+ db 30, DEX_PIGEON
+ db 32, DEX_ROKON
+ db 30, DEX_WOLFMAN
+ db 31, DEX_WOLFMAN
+ db 29, DEX_REDIBA
+ ; nite
+ db 30, DEX_WOLFMAN
+ db 33, DEX_WOLFMAN
+ db 34, DEX_SLEEPE
+ db 35, DEX_WOLFMAN
+ db 36, DEX_SLEEPER
+ db 36, DEX_WOLFMAN
+
+ db $09, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 29, DEX_REDIBA
+ db 29, DEX_MILTANK
+ db 28, DEX_REDIBA
+ db 29, DEX_MILTANK
+ db 32, DEX_MANKEY
+ db 29, DEX_REDIBA
+ ; day
+ db 30, DEX_MANKEY
+ db 31, DEX_OKORIZARU
+ db 33, DEX_NYOROMO
+ db 31, DEX_NYOROZO
+ db 32, DEX_NYOROMO
+ db 30, DEX_REDIBA
+ ; nite
+ db 31, DEX_WOLFMAN
+ db 34, DEX_WOLFMAN
+ db 35, DEX_WOLFMAN
+ db 36, DEX_WOLFMAN
+ db 37, DEX_WOLFMAN
+ db 37, DEX_WOLFMAN
+
+ db $09, $02 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 32, DEX_MILTANK
+ db 32, DEX_MILTANK
+ db 31, DEX_MILTANK
+ db 32, DEX_MILTANK
+ db 35, DEX_OKORIZARU
+ db 32, DEX_REDIBA
+ ; day
+ db 33, DEX_MANKEY
+ db 34, DEX_OKORIZARU
+ db 36, DEX_NYOROMO
+ db 34, DEX_NYOROZO
+ db 35, DEX_NYOROZO
+ db 33, DEX_REDIBA
+ ; nite
+ db 34, DEX_WOLFMAN
+ db 37, DEX_WOLFMAN
+ db 38, DEX_WOLFMAN
+ db 39, DEX_WOLFMAN
+ db 40, DEX_WARWOLF
+ db 40, DEX_WARWOLF
+
+ db $0a, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 29, DEX_KARAKARA
+ db 29, DEX_GARAGARA
+ db 28, DEX_KARAKARA
+ db 29, DEX_GARAGARA
+ db 32, DEX_SIHORN
+ db 29, DEX_KARAKARA
+ ; day
+ db 30, DEX_SIHORN
+ db 31, DEX_SIHORN
+ db 33, DEX_YOROIDORI
+ db 31, DEX_YOROIDORI
+ db 32, DEX_YOROIDORI
+ db 30, DEX_KARAKARA
+ ; nite
+ db 31, DEX_ARBO
+ db 34, DEX_ARBO
+ db 35, DEX_ARBOK
+ db 36, DEX_ARBOK
+ db 37, DEX_ARBO
+ db 37, DEX_ARBOK
+
+ db $0b, $01 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 28, DEX_PICHU
+ db 28, DEX_PICHU
+ db 27, DEX_PIKACHU
+ db 28, DEX_NAZONOKUSA
+ db 31, DEX_KUSAIHANA
+ db 28, DEX_PIKACHU
+ ; day
+ db 29, DEX_NAZONOKUSA
+ db 30, DEX_PAINTER
+ db 32, DEX_NYARTH
+ db 32, DEX_RATTA
+ db 31, DEX_NYARTH
+ db 29, DEX_NAZONOKUSA
+ ; nite
+ db 31, DEX_RATTA
+ db 33, DEX_ARBO
+ db 34, DEX_ARBOK
+ db 35, DEX_ARBOK
+ db 36, DEX_ARBO
+ db 36, DEX_ARBOK
+
+ db $01, $03 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 29, DEX_PICHU
+ db 29, DEX_PICHU
+ db 28, DEX_PIKACHU
+ db 29, DEX_NAZONOKUSA
+ db 32, DEX_KUSAIHANA
+ db 27, DEX_PIKACHU
+ ; day
+ db 28, DEX_NAZONOKUSA
+ db 29, DEX_PAINTER
+ db 32, DEX_NYARTH
+ db 32, DEX_RATTA
+ db 30, DEX_NYARTH
+ db 28, DEX_NAZONOKUSA
+ ; nite
+ db 30, DEX_RATTA
+ db 32, DEX_HOHO
+ db 33, DEX_ARBO
+ db 34, DEX_HOHO
+ db 35, DEX_ARBOK
+ db 35, DEX_HOHO
+
+ db $05, $05 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 25, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 20, DEX_MENOKURAGE
+ db 15, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 15, DEX_MENOKURAGE
+ ; day
+ db 20, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 35, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ ; nite
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 35, DEX_MENOKURAGE
+ db 40, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 45, DEX_MENOKURAGE
+
+ db $05, $06 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 25, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 20, DEX_MENOKURAGE
+ db 15, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 15, DEX_MENOKURAGE
+ ; day
+ db 20, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 35, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ ; nite
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 35, DEX_MENOKURAGE
+ db 40, DEX_MENOKURAGE
+ db 35, DEX_HANEEI
+ db 45, DEX_MENOKURAGE
+
+ db $09, $03 ; map group, map id
+ db 6 percent, 10 percent, 14 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 25, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 20, DEX_MENOKURAGE
+ db 15, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 15, DEX_MENOKURAGE
+ ; day
+ db 20, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 35, DEX_MENOKURAGE
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ ; nite
+ db 25, DEX_MENOKURAGE
+ db 30, DEX_MENOKURAGE
+ db 35, DEX_MENOKURAGE
+ db 40, DEX_MENOKURAGE
+ db 35, DEX_DOKUKURAGE
+ db 45, DEX_MENOKURAGE
+
+ db $01, $0F ; map group, map id
+ db 8 percent, 8 percent, 8 percent ; encounter rates: morn/day/nite
+ ; morn
+ db 7, DEX_REDIBA
+ db 7, DEX_REDIBA
+ db 5, DEX_TRANSEL
+ db 5, DEX_PIKACHU
+ db 7, DEX_POPPO
+ db 5, DEX_POPPO
+ ; day
+ 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
+
+ db $FF
+; f:6e3e
diff --git a/engine/landmarks.asm b/engine/landmarks.asm
new file mode 100644
index 0000000..9e3c95d
--- /dev/null
+++ b/engine/landmarks.asm
@@ -0,0 +1,11 @@
+INCLUDE "constants.asm"
+
+SECTION "GetLandmarkName", ROMX[$4AA5], BANK[$3F]
+
+GetLandmarkName::
+ dec a
+ ld hl, LandmarkNames
+ call GetNthString
+ ld d, h
+ ld e, l
+ ret
diff --git a/engine/link/place_waiting_text.asm b/engine/link/place_waiting_text.asm
index c617dec..bfe9d7e 100644
--- a/engine/link/place_waiting_text.asm
+++ b/engine/link/place_waiting_text.asm
@@ -15,7 +15,7 @@ PlaceWaitingText:: ; 1:4000
.link_textbox
; TODO
; predef Predef_LinkTextbox
- ld a, $1C
+ ld a, $1c
call Predef
.textbox_done
hlcoord 4, 11
diff --git a/engine/menu/main_menu.asm b/engine/menu/main_menu.asm
index 5701eba..536123f 100644
--- a/engine/menu/main_menu.asm
+++ b/engine/menu/main_menu.asm
@@ -4,7 +4,7 @@ SECTION "Main Menu Definition", ROMX[$5418], BANK[$01]
MainMenuHeader:
db $40
- db 0, 0, 7, 13
+ db $00, $00, $07, $0d
dw .data
db 1 ; default option
diff --git a/gfx.asm b/gfx.asm
index 20dd389..46f404b 100644
--- a/gfx.asm
+++ b/gfx.asm
@@ -26,7 +26,7 @@ PokegearGFX::
INCBIN "gfx/pokegear/pokegear.2bpp"
SECTION "Super Palettes", ROMX[$5B4C], BANK[$02]
-INCLUDE "data/pokemon_palettes.inc"
+INCLUDE "data/pokemon/palettes.inc"
INCLUDE "data/super_palettes.inc"
SECTION "Unused SGB Border GFX", ROMX[$62CC], BANK[$02]
@@ -156,6 +156,49 @@ INCBIN "gfx/pokedex/cursors.2bpp"
PokedexSearchGFX::
INCBIN "gfx/pokedex/search.2bpp"
+SECTION "Trainer Battle Sprites", ROMX[$4000], BANK[$12]
+HayatoPic:: INCBIN "gfx/trainer/hayato.pic"
+AkanePic:: INCBIN "gfx/trainer/akane.pic" ; Gen 1 Bug Catcher
+TsukushiPic:: INCBIN "gfx/trainer/tsukushi.pic"
+EnokiPic:: INCBIN "gfx/trainer/enoki.pic"
+OkeraPic:: INCBIN "gfx/trainer/okera.pic" ; Gen 1 Police Female
+MikanPic:: INCBIN "gfx/trainer/mikan.pic"
+BluePic:: INCBIN "gfx/trainer/blue.pic" ; Gen 1 Pokemaniac
+GamaPic:: INCBIN "gfx/trainer/gama.pic" ; Gen 1 Super Nerd
+RivalPic:: INCBIN "gfx/trainer/rival.pic"
+OakPic:: INCBIN "gfx/trainer/oak.pic"
+ProtagonistPic:: INCBIN "/gfx/trainer/protagonist.pic"
+KurtPic:: INCBIN "/gfx/trainer/kurt.pic"
+YoungsterPic:: INCBIN "gfx/trainer/youngster.pic"
+SchoolboyPic:: INCBIN "gfx/trainer/schoolboy.pic"
+FledglingPic:: INCBIN "gfx/trainer/fledgling.pic"
+LassPic:: INCBIN "gfx/trainer/lass.pic"
+ProfessionalMPic:: INCBIN "gfx/trainer/professional_m.pic"
+ProfessionalFPic:: INCBIN "gfx/trainer/professional_f.pic"
+BeautyPic:: INCBIN "gfx/trainer/beauty.pic"
+PokemaniacPic:: INCBIN "gfx/trainer/pokemaniac.pic"
+RocketMPic:: INCBIN "gfx/trainer/rocket_m.pic"
+TeacherMPic:: INCBIN "gfx/trainer/teacher_m.pic"
+TeacherFPic:: INCBIN "gfx/trainer/teacher_f.pic"
+BugCatcherBoyPic:: INCBIN "gfx/trainer/bug_catcher_boy.pic"
+FisherPic:: INCBIN "gfx/trainer/fisher.pic"
+SwimmerMPic:: INCBIN "gfx/trainer/swimmer_m.pic"
+SwimmerFPic:: INCBIN "gfx/trainer/swimmer_f.pic"
+SuperNerdPic:: INCBIN "gfx/trainer/supernerd.pic"
+EngineerPic:: INCBIN "gfx/trainer/engineer.pic"
+GreenPic:: INCBIN "gfx/trainer/green.pic" ; Gen 1 Green
+BikerPic:: INCBIN "gfx/trainer/biker.pic"
+BurglarPic:: INCBIN "gfx/trainer/burglar.pic"
+FirebreatherPic:: INCBIN "gfx/trainer/firebreather.pic"
+JugglerPic:: INCBIN "gfx/trainer/juggler.pic"
+BlackbeltPic:: INCBIN "gfx/trainer/blackbelt.pic"
+SportsmanPic:: INCBIN "gfx/trainer/sportsman.pic"
+MediumPic:: INCBIN "gfx/trainer/medium.pic"
+SoldierPic:: INCBIN "gfx/trainer/soldier.pic"
+KimonoGirlPic:: INCBIN "gfx/trainer/kimonogirl.pic"
+TwinsPic:: INCBIN "gfx/trainer/twins.pic"
+
+
SECTION "Bank 13 Tilesets 0a", ROMX[$4000], BANK[$13]
Tileset_0a_GFX:
INCBIN "gfx/tilesets/tileset_0a.2bpp"
@@ -177,6 +220,7 @@ INCLUDE "gfx/pokemon/pkmn_pic_banks.asm"
INCLUDE "gfx/pokemon/pkmn_pics.asm"
+
SECTION "Annon Pic Ptrs and Pics", ROMX[$4d6a], BANK[$1f]
INCLUDE "gfx/pokemon/annon_pic_ptrs.asm"
INCLUDE "gfx/pokemon/annon_pics.asm"
@@ -187,70 +231,38 @@ SECTION "Attack Animation GFX", ROMX[$4000], BANK[$21]
INCBIN "gfx/battle_anims/attack_animations.2bpp"
SECTION "Pokemon Party Sprites", ROMX[$60CC], BANK[$23]
-NyoromoIcon::
-INCBIN "gfx/icons/nyoromo.2bpp"
-PurinIcon::
-INCBIN "gfx/icons/purin.2bpp"
-DigdaIcon::
-INCBIN "gfx/icons/digda.2bpp"
-PikachuIcon::
-INCBIN "gfx/icons/pikachu.2bpp"
-HitodemanIcon::
-INCBIN "gfx/icons/hitodeman.2bpp"
-KoikingIcon::
-INCBIN "gfx/icons/koiking.2bpp"
-PoppoIcon::
-INCBIN "gfx/icons/poppo.2bpp"
-SidonIcon::
-INCBIN "gfx/icons/sidon.2bpp"
-PippiIcon::
-INCBIN "gfx/icons/pippi.2bpp"
-NazonokusaIcon::
-INCBIN "gfx/icons/nazonokusa.2bpp"
-MushiIcon::
-INCBIN "gfx/icons/mushi.2bpp"
-GangarIcon::
-INCBIN "gfx/icons/gangar.2bpp"
-LaplaceIcon::
-INCBIN "gfx/icons/laplace.2bpp"
-BarrierdIcon::
-INCBIN "gfx/icons/barrierd.2bpp"
-LokonIcon::
-INCBIN "gfx/icons/lokon.2bpp"
-KentaurosIcon::
-INCBIN "gfx/icons/kentauros.2bpp"
-ShellderIcon::
-INCBIN "gfx/icons/shellder.2bpp"
-MetamonIcon::
-INCBIN "gfx/icons/metamon.2bpp"
-IwarkIcon::
-INCBIN "gfx/icons/iwark.2bpp"
-BiriridamaIcon::
-INCBIN "gfx/icons/biriridama.2bpp"
-ZenigameIcon::
-INCBIN "gfx/icons/zenigame.2bpp"
-FushigidaneIcon::
-INCBIN "gfx/icons/fushigidane.2bpp"
-HitokageIcon::
-INCBIN "gfx/icons/hitokage.2bpp"
-BeedleIcon::
-INCBIN "gfx/icons/beedle.2bpp"
-AnnonIcon::
-INCBIN "gfx/icons/annon.2bpp"
-IsitsubuteIcon::
-INCBIN "gfx/icons/isitsubute.2bpp"
-WanrikyIcon::
-INCBIN "gfx/icons/wanriky.2bpp"
-TamagoIcon::
-INCBIN "gfx/icons/tamago.2bpp"
-MenokurageIcon::
-INCBIN "gfx/icons/menokurage.2bpp"
-ButterfreeIcon::
-INCBIN "gfx/icons/butterfree.2bpp"
-ZubatIcon::
-INCBIN "gfx/icons/zubat.2bpp"
-KabigonIcon::
-INCBIN "gfx/icons/kabigon.2bpp"
+NyoromoIcon:: INCBIN "gfx/icons/nyoromo.2bpp"
+PurinIcon:: INCBIN "gfx/icons/purin.2bpp"
+DigdaIcon:: INCBIN "gfx/icons/digda.2bpp"
+PikachuIcon:: INCBIN "gfx/icons/pikachu.2bpp"
+HitodemanIcon:: INCBIN "gfx/icons/hitodeman.2bpp"
+KoikingIcon:: INCBIN "gfx/icons/koiking.2bpp"
+PoppoIcon:: INCBIN "gfx/icons/poppo.2bpp"
+SidonIcon:: INCBIN "gfx/icons/sidon.2bpp"
+PippiIcon:: INCBIN "gfx/icons/pippi.2bpp"
+NazonokusaIcon:: INCBIN "gfx/icons/nazonokusa.2bpp"
+MushiIcon:: INCBIN "gfx/icons/mushi.2bpp"
+GangarIcon:: INCBIN "gfx/icons/gangar.2bpp"
+LaplaceIcon:: INCBIN "gfx/icons/laplace.2bpp"
+BarrierdIcon:: INCBIN "gfx/icons/barrierd.2bpp"
+LokonIcon:: INCBIN "gfx/icons/lokon.2bpp"
+KentaurosIcon:: INCBIN "gfx/icons/kentauros.2bpp"
+ShellderIcon:: INCBIN "gfx/icons/shellder.2bpp"
+MetamonIcon:: INCBIN "gfx/icons/metamon.2bpp"
+IwarkIcon:: INCBIN "gfx/icons/iwark.2bpp"
+BiriridamaIcon:: INCBIN "gfx/icons/biriridama.2bpp"
+ZenigameIcon:: INCBIN "gfx/icons/zenigame.2bpp"
+FushigidaneIcon:: INCBIN "gfx/icons/fushigidane.2bpp"
+HitokageIcon:: INCBIN "gfx/icons/hitokage.2bpp"
+BeedleIcon:: INCBIN "gfx/icons/beedle.2bpp"
+AnnonIcon:: INCBIN "gfx/icons/annon.2bpp"
+IsitsubuteIcon:: INCBIN "gfx/icons/isitsubute.2bpp"
+WanrikyIcon:: INCBIN "gfx/icons/wanriky.2bpp"
+EggIcon:: INCBIN "gfx/icons/egg.2bpp"
+MenokurageIcon:: INCBIN "gfx/icons/menokurage.2bpp"
+ButterfreeIcon:: INCBIN "gfx/icons/butterfree.2bpp"
+ZubatIcon:: INCBIN "gfx/icons/zubat.2bpp"
+KabigonIcon:: INCBIN "gfx/icons/kabigon.2bpp"
SECTION "Slot Machine GFX", ROMX[$4FDB], BANK[$24]
SlotMachineGFX::
@@ -258,6 +270,82 @@ INCBIN "gfx/minigames/slots.2bpp"
SlotMachine2GFX::
INCBIN "gfx/minigames/slots_2.2bpp"
+SECTION "Bank 30 Sprites 1", ROMX[$4000], BANK[$30]
+GoldSpriteGFX:: INCBIN "gfx/sprites/gold.2bpp" ; 30:4000
+GoldBikeSpriteGFX:: INCBIN "gfx/sprites/gold_bike.2bpp" ; 30:4180
+GoldSkateboardSpriteGFX:: INCBIN "gfx/sprites/gold_skateboard.2bpp" ; 30:4300
+SilverSpriteGFX:: INCBIN "gfx/sprites/silver.2bpp" ; 30:4480
+OkidoSpriteGFX:: INCBIN "gfx/sprites/okido.2bpp" ; 30:4600
+RedSpriteGFX:: INCBIN "gfx/sprites/red.2bpp" ; 30:4780
+BlueSpriteGFX:: INCBIN "gfx/sprites/blue.2bpp" ; 30:4900
+MasakiSpriteGFX:: INCBIN "gfx/sprites/masaki.2bpp" ; 30:4a80
+ElderSpriteGFX:: INCBIN "gfx/sprites/elder.2bpp" ; 30:4c00
+SakakiSpriteGFX:: INCBIN "gfx/sprites/sakaki.2bpp" ; 30:4d80
+GantetsuSpriteGFX:: INCBIN "gfx/sprites/gantetsu.2bpp" ; 30:4f00
+MomSpriteGFX:: INCBIN "gfx/sprites/mom.2bpp" ; 30:5080
+SilversMomSpriteGFX:: INCBIN "gfx/sprites/silvers_mom.2bpp" ; 30:5200
+RedsMomSpriteGFX:: INCBIN "gfx/sprites/reds_mom.2bpp" ; 30:5380
+NanamiSpriteGFX:: INCBIN "gfx/sprites/nanami.2bpp" ; 30:5500
+EvilOkidoSpriteGFX:: INCBIN "gfx/sprites/evil_okido.2bpp" ; 30:5680
+KikukoSpriteGFX:: INCBIN "gfx/sprites/kikuko.2bpp" ; 30:5800
+HayatoSpriteGFX:: INCBIN "gfx/sprites/hayato.2bpp" ; 30:5980
+TsukushiSpriteGFX:: INCBIN "gfx/sprites/tsukushi.2bpp" ; 30:5a40
+EnokiSpriteGFX:: INCBIN "gfx/sprites/enoki.2bpp" ; 30:5b00
+MikanSpriteGFX:: INCBIN "gfx/sprites/mikan.2bpp" ; 30:5bc0
+CooltrainerMSpriteGFX:: INCBIN "gfx/sprites/cooltrainer_m.2bpp" ; 30:5d40
+CooltrainerFSpriteGFX:: INCBIN "gfx/sprites/cooltrainer_f.2bpp" ; 30:5ec0
+BugCatcherBoySpriteGFX:: INCBIN "gfx/sprites/bug_catcher_boy.2bpp" ; 30:6040
+TwinSpriteGFX:: INCBIN "gfx/sprites/twin.2bpp" ; 30:61c0
+YoungsterSpriteGFX:: INCBIN "gfx/sprites/youngster.2bpp" ; 30:6340
+LassSpriteGFX:: INCBIN "gfx/sprites/lass.2bpp" ; 30:64c0
+TeacherSpriteGFX:: INCBIN "gfx/sprites/teacher.2bpp" ; 30:6640
+GirlSpriteGFX:: INCBIN "gfx/sprites/girl.2bpp" ; 30:67c0
+SuperNerdSpriteGFX:: INCBIN "gfx/sprites/super_nerd.2bpp" ; 30:6940
+RockerSpriteGFX:: INCBIN "gfx/sprites/rocker.2bpp" ; 30:6ac0
+PokefanMSpriteGFX:: INCBIN "gfx/sprites/pokefan_m.2bpp" ; 30:6c40
+PokefanFSpriteGFX:: INCBIN "gfx/sprites/pokefan_f.2bpp" ; 30:6dc0
+GrampsSpriteGFX:: INCBIN "gfx/sprites/gramps.2bpp" ; 30:6f40
+GrannySpriteGFX:: INCBIN "gfx/sprites/granny.2bpp" ; 30:70c0
+SwimmerMSpriteGFX:: INCBIN "gfx/sprites/swimmer_m.2bpp" ; 30:7240
+SwimmerFSpriteGFX:: INCBIN "gfx/sprites/swimmer_f.2bpp" ; 30:73c0
+RocketMSpriteGFX:: INCBIN "gfx/sprites/rocket_m.2bpp" ; 30:7540
+RocketFSpriteGFX:: INCBIN "gfx/sprites/rocket_f.2bpp" ; 30:76c0
+NurseSpriteGFX:: INCBIN "gfx/sprites/nurse.2bpp" ; 30:7840
+LinkReceptionistSpriteGFX:: INCBIN "gfx/sprites/link_receptionist.2bpp" ; 30:7900
+ClerkSpriteGFX:: INCBIN "gfx/sprites/clerk.2bpp" ; 30:79c0
+FisherSpriteGFX:: INCBIN "gfx/sprites/fisher.2bpp" ; 30:7b40
+FishingGuruSpriteGFX:: INCBIN "gfx/sprites/fishing_guru.2bpp" ; 30:7cc0
+
+SECTION "Bank 31 Sprites 2", ROMX[$4000], BANK[$31]
+ScientistSpriteGFX:: INCBIN "gfx/sprites/scientist.2bpp" ; 31:4000
+MediumSpriteGFX:: INCBIN "gfx/sprites/medium.2bpp" ; 31:4180
+SageSpriteGFX:: INCBIN "gfx/sprites/sage.2bpp" ; 31:4300
+FrowningManSpriteGFX:: INCBIN "gfx/sprites/frowning_man.2bpp" ; 31:4480
+GentlemanSpriteGFX:: INCBIN "gfx/sprites/gentleman.2bpp" ; 31:4600
+BlackbeltSpriteGFX:: INCBIN "gfx/sprites/blackbelt.2bpp" ; 31:4780
+ReceptionistSpriteGFX:: INCBIN "gfx/sprites/receptionist.2bpp" ; 31:4900
+OfficerSpriteGFX:: INCBIN "gfx/sprites/officer.2bpp" ; 31:4a80
+CaptainSpriteGFX:: INCBIN "gfx/sprites/captain.2bpp" ; 31:4c00
+MohawkSpriteGFX:: INCBIN "gfx/sprites/mohawk.2bpp" ; 31:4d80
+GymGuySpriteGFX:: INCBIN "gfx/sprites/gym_guy.2bpp" ; 31:4f00
+SailorSpriteGFX:: INCBIN "gfx/sprites/sailor.2bpp" ; 31:5080
+HelmetSpriteGFX:: INCBIN "gfx/sprites/helmet.2bpp" ; 31:5200
+BurglarSpriteGFX:: INCBIN "gfx/sprites/burglar.2bpp" ; 31:5380
+SidonSpriteGFX:: INCBIN "gfx/sprites/sidon.2bpp" ; 31:5500
+PippiSpriteGFX:: INCBIN "gfx/sprites/pippi.2bpp" ; 31:5680
+PoppoSpriteGFX:: INCBIN "gfx/sprites/poppo.2bpp" ; 31:5800
+LizardonSpriteGFX:: INCBIN "gfx/sprites/lizardon.2bpp" ; 31:5980
+KabigonSpriteGFX:: INCBIN "gfx/sprites/kabigon.2bpp" ; 31:5b00
+PawouSpriteGFX:: INCBIN "gfx/sprites/pawou.2bpp" ; 31:5c80
+NyorobonSpriteGFX:: INCBIN "gfx/sprites/nyorobon.2bpp" ; 31:5e00
+LaplaceSpriteGFX:: INCBIN "gfx/sprites/laplace.2bpp" ; 31:5f80
+PokeBallSpriteGFX:: INCBIN "gfx/sprites/poke_ball.2bpp" ; 31:6100
+PokedexSpriteGFX:: INCBIN "gfx/sprites/pokedex.2bpp" ; 31:6280
+PaperSpriteGFX:: INCBIN "gfx/sprites/paper.2bpp" ; 31:6400
+OldLinkReceptionistSpriteGFX:: INCBIN "gfx/sprites/old_link_receptionist.2bpp" ; 31:6580
+EggSpriteGFX:: INCBIN "gfx/sprites/egg.2bpp" ; 31:65c0
+BoulderSpriteGFX:: INCBIN "gfx/sprites/boulder.2bpp" ; 31:6600
+
SECTION "Bank 37 Tilesets 10", ROMX[$4000], BANK[$37]
Tileset_10_GFX:
INCBIN "gfx/tilesets/tileset_10.2bpp"
diff --git a/gfx/icons/tamago.png b/gfx/icons/egg.png
index 364fadf..364fadf 100644
--- a/gfx/icons/tamago.png
+++ b/gfx/icons/egg.png
Binary files differ
diff --git a/gfx/pokemon/annon_pics.asm b/gfx/pokemon/annon_pics.asm
index 86aca48..4999071 100644
--- a/gfx/pokemon/annon_pics.asm
+++ b/gfx/pokemon/annon_pics.asm
@@ -1,53 +1,53 @@
AnnonPics::
-AnnonAPicFront:: INCBIN "gfx/pokemon/annon_a/front.pic"
-AnnonAPicBack:: INCBIN "gfx/pokemon/annon_a/back.pic"
-AnnonBPicFront:: INCBIN "gfx/pokemon/annon_b/front.pic"
-AnnonBPicBack:: INCBIN "gfx/pokemon/annon_b/back.pic"
-AnnonCPicFront:: INCBIN "gfx/pokemon/annon_c/front.pic"
-AnnonCPicBack:: INCBIN "gfx/pokemon/annon_c/back.pic"
-AnnonDPicFront:: INCBIN "gfx/pokemon/annon_d/front.pic"
-AnnonDPicBack:: INCBIN "gfx/pokemon/annon_d/back.pic"
-AnnonEPicFront:: INCBIN "gfx/pokemon/annon_e/front.pic"
-AnnonEPicBack:: INCBIN "gfx/pokemon/annon_e/back.pic"
-AnnonFPicFront:: INCBIN "gfx/pokemon/annon_f/front.pic"
-AnnonFPicBack:: INCBIN "gfx/pokemon/annon_f/back.pic"
-AnnonGPicFront:: INCBIN "gfx/pokemon/annon_g/front.pic"
-AnnonGPicBack:: INCBIN "gfx/pokemon/annon_g/back.pic"
-AnnonHPicFront:: INCBIN "gfx/pokemon/annon_h/front.pic"
-AnnonHPicBack:: INCBIN "gfx/pokemon/annon_h/back.pic"
-AnnonIPicFront:: INCBIN "gfx/pokemon/annon_i/front.pic"
-AnnonIPicBack:: INCBIN "gfx/pokemon/annon_i/back.pic"
-AnnonJPicFront:: INCBIN "gfx/pokemon/annon_j/front.pic"
-AnnonJPicBack:: INCBIN "gfx/pokemon/annon_j/back.pic"
-AnnonKPicFront:: INCBIN "gfx/pokemon/annon_k/front.pic"
-AnnonKPicBack:: INCBIN "gfx/pokemon/annon_k/back.pic"
-AnnonLPicFront:: INCBIN "gfx/pokemon/annon_l/front.pic"
-AnnonLPicBack:: INCBIN "gfx/pokemon/annon_l/back.pic"
-AnnonMPicFront:: INCBIN "gfx/pokemon/annon_m/front.pic"
-AnnonMPicBack:: INCBIN "gfx/pokemon/annon_m/back.pic"
-AnnonNPicFront:: INCBIN "gfx/pokemon/annon_n/front.pic"
-AnnonNPicBack:: INCBIN "gfx/pokemon/annon_n/back.pic"
-AnnonOPicFront:: INCBIN "gfx/pokemon/annon_o/front.pic"
-AnnonOPicBack:: INCBIN "gfx/pokemon/annon_o/back.pic"
-AnnonPPicFront:: INCBIN "gfx/pokemon/annon_p/front.pic"
-AnnonPPicBack:: INCBIN "gfx/pokemon/annon_p/back.pic"
-AnnonQPicFront:: INCBIN "gfx/pokemon/annon_q/front.pic"
-AnnonQPicBack:: INCBIN "gfx/pokemon/annon_q/back.pic"
-AnnonRPicFront:: INCBIN "gfx/pokemon/annon_r/front.pic"
-AnnonRPicBack:: INCBIN "gfx/pokemon/annon_r/back.pic"
-AnnonSPicFront:: INCBIN "gfx/pokemon/annon_s/front.pic"
-AnnonSPicBack:: INCBIN "gfx/pokemon/annon_s/back.pic"
-AnnonTPicFront:: INCBIN "gfx/pokemon/annon_t/front.pic"
-AnnonTPicBack:: INCBIN "gfx/pokemon/annon_t/back.pic"
-AnnonUPicFront:: INCBIN "gfx/pokemon/annon_u/front.pic"
-AnnonUPicBack:: INCBIN "gfx/pokemon/annon_u/back.pic"
-AnnonVPicFront:: INCBIN "gfx/pokemon/annon_v/front.pic"
-AnnonVPicBack:: INCBIN "gfx/pokemon/annon_v/back.pic"
-AnnonWPicFront:: INCBIN "gfx/pokemon/annon_w/front.pic"
-AnnonWPicBack:: INCBIN "gfx/pokemon/annon_w/back.pic"
-AnnonXPicFront:: INCBIN "gfx/pokemon/annon_x/front.pic"
-AnnonXPicBack:: INCBIN "gfx/pokemon/annon_x/back.pic"
-AnnonYPicFront:: INCBIN "gfx/pokemon/annon_y/front.pic"
-AnnonYPicBack:: INCBIN "gfx/pokemon/annon_y/back.pic"
-AnnonZPicFront:: INCBIN "gfx/pokemon/annon_z/front.pic"
-AnnonZPicBack:: INCBIN "gfx/pokemon/annon_z/back.pic"
+AnnonAPicFront:: INCBIN "gfx/pokemon/annon_a/front.pic" ; 0x07cdd2--0x07ce57
+AnnonAPicBack:: INCBIN "gfx/pokemon/annon_a/back.pic" ; 0x07ce57--0x07ced0
+AnnonBPicFront:: INCBIN "gfx/pokemon/annon_b/front.pic" ; 0x07ced0--0x07cf64
+AnnonBPicBack:: INCBIN "gfx/pokemon/annon_b/back.pic" ; 0x07cf64--0x07cfed
+AnnonCPicFront:: INCBIN "gfx/pokemon/annon_c/front.pic" ; 0x07cfed--0x07d0a1
+AnnonCPicBack:: INCBIN "gfx/pokemon/annon_c/back.pic" ; 0x07d0a1--0x07d147
+AnnonDPicFront:: INCBIN "gfx/pokemon/annon_d/front.pic" ; 0x07d147--0x07d1ec
+AnnonDPicBack:: INCBIN "gfx/pokemon/annon_d/back.pic" ; 0x07d1ec--0x07d285
+AnnonEPicFront:: INCBIN "gfx/pokemon/annon_e/front.pic" ; 0x07d285--0x07d30e
+AnnonEPicBack:: INCBIN "gfx/pokemon/annon_e/back.pic" ; 0x07d30e--0x07d38b
+AnnonFPicFront:: INCBIN "gfx/pokemon/annon_f/front.pic" ; 0x07d38b--0x07d425
+AnnonFPicBack:: INCBIN "gfx/pokemon/annon_f/back.pic" ; 0x07d425--0x07d4ae
+AnnonGPicFront:: INCBIN "gfx/pokemon/annon_g/front.pic" ; 0x07d4ae--0x07d53f
+AnnonGPicBack:: INCBIN "gfx/pokemon/annon_g/back.pic" ; 0x07d53f--0x07d5c4
+AnnonHPicFront:: INCBIN "gfx/pokemon/annon_h/front.pic" ; 0x07d5c4--0x07d693
+AnnonHPicBack:: INCBIN "gfx/pokemon/annon_h/back.pic" ; 0x07d693--0x07d757
+AnnonIPicFront:: INCBIN "gfx/pokemon/annon_i/front.pic" ; 0x07d757--0x07d7c0
+AnnonIPicBack:: INCBIN "gfx/pokemon/annon_i/back.pic" ; 0x07d7c0--0x07d81f
+AnnonJPicFront:: INCBIN "gfx/pokemon/annon_j/front.pic" ; 0x07d81f--0x07d89b
+AnnonJPicBack:: INCBIN "gfx/pokemon/annon_j/back.pic" ; 0x07d89b--0x07d909
+AnnonKPicFront:: INCBIN "gfx/pokemon/annon_k/front.pic" ; 0x07d909--0x07d98d
+AnnonKPicBack:: INCBIN "gfx/pokemon/annon_k/back.pic" ; 0x07d98d--0x07da06
+AnnonLPicFront:: INCBIN "gfx/pokemon/annon_l/front.pic" ; 0x07da06--0x07da7a
+AnnonLPicBack:: INCBIN "gfx/pokemon/annon_l/back.pic" ; 0x07da7a--0x07dade
+AnnonMPicFront:: INCBIN "gfx/pokemon/annon_m/front.pic" ; 0x07dade--0x07dba1
+AnnonMPicBack:: INCBIN "gfx/pokemon/annon_m/back.pic" ; 0x07dba1--0x07dc57
+AnnonNPicFront:: INCBIN "gfx/pokemon/annon_n/front.pic" ; 0x07dc57--0x07dcf4
+AnnonNPicBack:: INCBIN "gfx/pokemon/annon_n/back.pic" ; 0x07dcf4--0x07dd8b
+AnnonOPicFront:: INCBIN "gfx/pokemon/annon_o/front.pic" ; 0x07dd8b--0x07de55
+AnnonOPicBack:: INCBIN "gfx/pokemon/annon_o/back.pic" ; 0x07de55--0x07df15
+AnnonPPicFront:: INCBIN "gfx/pokemon/annon_p/front.pic" ; 0x07df15--0x07df7d
+AnnonPPicBack:: INCBIN "gfx/pokemon/annon_p/back.pic" ; 0x07df7d--0x07dfd6
+AnnonQPicFront:: INCBIN "gfx/pokemon/annon_q/front.pic" ; 0x07dfd6--0x07e03d
+AnnonQPicBack:: INCBIN "gfx/pokemon/annon_q/back.pic" ; 0x07e03d--0x07e099
+AnnonRPicFront:: INCBIN "gfx/pokemon/annon_r/front.pic" ; 0x07e099--0x07e0ff
+AnnonRPicBack:: INCBIN "gfx/pokemon/annon_r/back.pic" ; 0x07e0ff--0x07e159
+AnnonSPicFront:: INCBIN "gfx/pokemon/annon_s/front.pic" ; 0x07e159--0x07e1f0
+AnnonSPicBack:: INCBIN "gfx/pokemon/annon_s/back.pic" ; 0x07e1f0--0x07e27a
+AnnonTPicFront:: INCBIN "gfx/pokemon/annon_t/front.pic" ; 0x07e27a--0x07e2e8
+AnnonTPicBack:: INCBIN "gfx/pokemon/annon_t/back.pic" ; 0x07e2e8--0x07e348
+AnnonUPicFront:: INCBIN "gfx/pokemon/annon_u/front.pic" ; 0x07e348--0x07e3e7
+AnnonUPicBack:: INCBIN "gfx/pokemon/annon_u/back.pic" ; 0x07e3e7--0x07e47a
+AnnonVPicFront:: INCBIN "gfx/pokemon/annon_v/front.pic" ; 0x07e47a--0x07e50a
+AnnonVPicBack:: INCBIN "gfx/pokemon/annon_v/back.pic" ; 0x07e50a--0x07e589
+AnnonWPicFront:: INCBIN "gfx/pokemon/annon_w/front.pic" ; 0x07e589--0x07e60d
+AnnonWPicBack:: INCBIN "gfx/pokemon/annon_w/back.pic" ; 0x07e60d--0x07e681
+AnnonXPicFront:: INCBIN "gfx/pokemon/annon_x/front.pic" ; 0x07e681--0x07e705
+AnnonXPicBack:: INCBIN "gfx/pokemon/annon_x/back.pic" ; 0x07e705--0x07e77b
+AnnonYPicFront:: INCBIN "gfx/pokemon/annon_y/front.pic" ; 0x07e77b--0x07e801
+AnnonYPicBack:: INCBIN "gfx/pokemon/annon_y/back.pic" ; 0x07e801--0x07e87c
+AnnonZPicFront:: INCBIN "gfx/pokemon/annon_z/front.pic" ; 0x07e87c--0x07e8fa
+AnnonZPicBack:: INCBIN "gfx/pokemon/annon_z/back.pic" ; 0x07e8fa--0x07e96a
diff --git a/gfx/sprites/blackbelt.png b/gfx/sprites/blackbelt.png
new file mode 100644
index 0000000..9aec228
--- /dev/null
+++ b/gfx/sprites/blackbelt.png
Binary files differ
diff --git a/gfx/sprites/blue.png b/gfx/sprites/blue.png
new file mode 100644
index 0000000..17fc2fd
--- /dev/null
+++ b/gfx/sprites/blue.png
Binary files differ
diff --git a/gfx/sprites/boulder.png b/gfx/sprites/boulder.png
new file mode 100644
index 0000000..4c4fd7a
--- /dev/null
+++ b/gfx/sprites/boulder.png
Binary files differ
diff --git a/gfx/sprites/bug_catcher_boy.png b/gfx/sprites/bug_catcher_boy.png
new file mode 100644
index 0000000..e1306b6
--- /dev/null
+++ b/gfx/sprites/bug_catcher_boy.png
Binary files differ
diff --git a/gfx/sprites/burglar.png b/gfx/sprites/burglar.png
new file mode 100644
index 0000000..ed0fa1d
--- /dev/null
+++ b/gfx/sprites/burglar.png
Binary files differ
diff --git a/gfx/sprites/captain.png b/gfx/sprites/captain.png
new file mode 100644
index 0000000..7408cbb
--- /dev/null
+++ b/gfx/sprites/captain.png
Binary files differ
diff --git a/gfx/sprites/clerk.png b/gfx/sprites/clerk.png
new file mode 100644
index 0000000..77a5fb9
--- /dev/null
+++ b/gfx/sprites/clerk.png
Binary files differ
diff --git a/gfx/sprites/cooltrainer_f.png b/gfx/sprites/cooltrainer_f.png
new file mode 100644
index 0000000..53bf81b
--- /dev/null
+++ b/gfx/sprites/cooltrainer_f.png
Binary files differ
diff --git a/gfx/sprites/cooltrainer_m.png b/gfx/sprites/cooltrainer_m.png
new file mode 100644
index 0000000..ffd94f4
--- /dev/null
+++ b/gfx/sprites/cooltrainer_m.png
Binary files differ
diff --git a/gfx/sprites/egg.png b/gfx/sprites/egg.png
new file mode 100644
index 0000000..0b5c54c
--- /dev/null
+++ b/gfx/sprites/egg.png
Binary files differ
diff --git a/gfx/sprites/elder.png b/gfx/sprites/elder.png
new file mode 100644
index 0000000..90b499f
--- /dev/null
+++ b/gfx/sprites/elder.png
Binary files differ
diff --git a/gfx/sprites/enoki.png b/gfx/sprites/enoki.png
new file mode 100644
index 0000000..a926851
--- /dev/null
+++ b/gfx/sprites/enoki.png
Binary files differ
diff --git a/gfx/sprites/evil_okido.png b/gfx/sprites/evil_okido.png
new file mode 100644
index 0000000..b2af757
--- /dev/null
+++ b/gfx/sprites/evil_okido.png
Binary files differ
diff --git a/gfx/sprites/fisher.png b/gfx/sprites/fisher.png
new file mode 100644
index 0000000..a84a2e3
--- /dev/null
+++ b/gfx/sprites/fisher.png
Binary files differ
diff --git a/gfx/sprites/fishing_guru.png b/gfx/sprites/fishing_guru.png
new file mode 100644
index 0000000..748444f
--- /dev/null
+++ b/gfx/sprites/fishing_guru.png
Binary files differ
diff --git a/gfx/sprites/frowning_man.png b/gfx/sprites/frowning_man.png
new file mode 100644
index 0000000..a6300e1
--- /dev/null
+++ b/gfx/sprites/frowning_man.png
Binary files differ
diff --git a/gfx/sprites/gantetsu.png b/gfx/sprites/gantetsu.png
new file mode 100644
index 0000000..bd7fc20
--- /dev/null
+++ b/gfx/sprites/gantetsu.png
Binary files differ
diff --git a/gfx/sprites/gentleman.png b/gfx/sprites/gentleman.png
new file mode 100644
index 0000000..38a6125
--- /dev/null
+++ b/gfx/sprites/gentleman.png
Binary files differ
diff --git a/gfx/sprites/girl.png b/gfx/sprites/girl.png
new file mode 100644
index 0000000..66c1455
--- /dev/null
+++ b/gfx/sprites/girl.png
Binary files differ
diff --git a/gfx/sprites/gold.png b/gfx/sprites/gold.png
new file mode 100644
index 0000000..9dfe77f
--- /dev/null
+++ b/gfx/sprites/gold.png
Binary files differ
diff --git a/gfx/sprites/gold_bike.png b/gfx/sprites/gold_bike.png
new file mode 100644
index 0000000..552d58f
--- /dev/null
+++ b/gfx/sprites/gold_bike.png
Binary files differ
diff --git a/gfx/sprites/gold_skateboard.png b/gfx/sprites/gold_skateboard.png
new file mode 100644
index 0000000..35b4da1
--- /dev/null
+++ b/gfx/sprites/gold_skateboard.png
Binary files differ
diff --git a/gfx/sprites/gramps.png b/gfx/sprites/gramps.png
new file mode 100644
index 0000000..abe61a3
--- /dev/null
+++ b/gfx/sprites/gramps.png
Binary files differ
diff --git a/gfx/sprites/granny.png b/gfx/sprites/granny.png
new file mode 100644
index 0000000..763b2a2
--- /dev/null
+++ b/gfx/sprites/granny.png
Binary files differ
diff --git a/gfx/sprites/gym_guy.png b/gfx/sprites/gym_guy.png
new file mode 100644
index 0000000..a1f74da
--- /dev/null
+++ b/gfx/sprites/gym_guy.png
Binary files differ
diff --git a/gfx/sprites/hayato.png b/gfx/sprites/hayato.png
new file mode 100644
index 0000000..00ee47b
--- /dev/null
+++ b/gfx/sprites/hayato.png
Binary files differ
diff --git a/gfx/sprites/helmet.png b/gfx/sprites/helmet.png
new file mode 100644
index 0000000..f905a7a
--- /dev/null
+++ b/gfx/sprites/helmet.png
Binary files differ
diff --git a/gfx/sprites/kabigon.png b/gfx/sprites/kabigon.png
new file mode 100644
index 0000000..7a2f70c
--- /dev/null
+++ b/gfx/sprites/kabigon.png
Binary files differ
diff --git a/gfx/sprites/kikuko.png b/gfx/sprites/kikuko.png
new file mode 100644
index 0000000..e454197
--- /dev/null
+++ b/gfx/sprites/kikuko.png
Binary files differ
diff --git a/gfx/sprites/laplace.png b/gfx/sprites/laplace.png
new file mode 100644
index 0000000..d124616
--- /dev/null
+++ b/gfx/sprites/laplace.png
Binary files differ
diff --git a/gfx/sprites/lass.png b/gfx/sprites/lass.png
new file mode 100644
index 0000000..762108a
--- /dev/null
+++ b/gfx/sprites/lass.png
Binary files differ
diff --git a/gfx/sprites/link_receptionist.png b/gfx/sprites/link_receptionist.png
new file mode 100644
index 0000000..42050ff
--- /dev/null
+++ b/gfx/sprites/link_receptionist.png
Binary files differ
diff --git a/gfx/sprites/lizardon.png b/gfx/sprites/lizardon.png
new file mode 100644
index 0000000..3b6c621
--- /dev/null
+++ b/gfx/sprites/lizardon.png
Binary files differ
diff --git a/gfx/sprites/masaki.png b/gfx/sprites/masaki.png
new file mode 100644
index 0000000..d72bb7b
--- /dev/null
+++ b/gfx/sprites/masaki.png
Binary files differ
diff --git a/gfx/sprites/medium.png b/gfx/sprites/medium.png
new file mode 100644
index 0000000..62be06b
--- /dev/null
+++ b/gfx/sprites/medium.png
Binary files differ
diff --git a/gfx/sprites/mikan.png b/gfx/sprites/mikan.png
new file mode 100644
index 0000000..cb58ae9
--- /dev/null
+++ b/gfx/sprites/mikan.png
Binary files differ
diff --git a/gfx/sprites/mohawk.png b/gfx/sprites/mohawk.png
new file mode 100644
index 0000000..9634d31
--- /dev/null
+++ b/gfx/sprites/mohawk.png
Binary files differ
diff --git a/gfx/sprites/mom.png b/gfx/sprites/mom.png
new file mode 100644
index 0000000..5ea9e6e
--- /dev/null
+++ b/gfx/sprites/mom.png
Binary files differ
diff --git a/gfx/sprites/nanami.png b/gfx/sprites/nanami.png
new file mode 100644
index 0000000..84f330f
--- /dev/null
+++ b/gfx/sprites/nanami.png
Binary files differ
diff --git a/gfx/sprites/nurse.png b/gfx/sprites/nurse.png
new file mode 100644
index 0000000..5984b44
--- /dev/null
+++ b/gfx/sprites/nurse.png
Binary files differ
diff --git a/gfx/sprites/nyorobon.png b/gfx/sprites/nyorobon.png
new file mode 100644
index 0000000..058461c
--- /dev/null
+++ b/gfx/sprites/nyorobon.png
Binary files differ
diff --git a/gfx/sprites/officer.png b/gfx/sprites/officer.png
new file mode 100644
index 0000000..f622520
--- /dev/null
+++ b/gfx/sprites/officer.png
Binary files differ
diff --git a/gfx/sprites/okido.png b/gfx/sprites/okido.png
new file mode 100644
index 0000000..7a76574
--- /dev/null
+++ b/gfx/sprites/okido.png
Binary files differ
diff --git a/gfx/sprites/old_link_receptionist.png b/gfx/sprites/old_link_receptionist.png
new file mode 100644
index 0000000..a03cae7
--- /dev/null
+++ b/gfx/sprites/old_link_receptionist.png
Binary files differ
diff --git a/gfx/sprites/paper.png b/gfx/sprites/paper.png
new file mode 100644
index 0000000..ede44e8
--- /dev/null
+++ b/gfx/sprites/paper.png
Binary files differ
diff --git a/gfx/sprites/pawou.png b/gfx/sprites/pawou.png
new file mode 100644
index 0000000..dbd4c07
--- /dev/null
+++ b/gfx/sprites/pawou.png
Binary files differ
diff --git a/gfx/sprites/pippi.png b/gfx/sprites/pippi.png
new file mode 100644
index 0000000..06fe007
--- /dev/null
+++ b/gfx/sprites/pippi.png
Binary files differ
diff --git a/gfx/sprites/poke_ball.png b/gfx/sprites/poke_ball.png
new file mode 100644
index 0000000..dec0cd8
--- /dev/null
+++ b/gfx/sprites/poke_ball.png
Binary files differ
diff --git a/gfx/sprites/pokedex.png b/gfx/sprites/pokedex.png
new file mode 100644
index 0000000..4af7be4
--- /dev/null
+++ b/gfx/sprites/pokedex.png
Binary files differ
diff --git a/gfx/sprites/pokefan_f.png b/gfx/sprites/pokefan_f.png
new file mode 100644
index 0000000..aa1fbc0
--- /dev/null
+++ b/gfx/sprites/pokefan_f.png
Binary files differ
diff --git a/gfx/sprites/pokefan_m.png b/gfx/sprites/pokefan_m.png
new file mode 100644
index 0000000..fea7979
--- /dev/null
+++ b/gfx/sprites/pokefan_m.png
Binary files differ
diff --git a/gfx/sprites/poppo.png b/gfx/sprites/poppo.png
new file mode 100644
index 0000000..9e20099
--- /dev/null
+++ b/gfx/sprites/poppo.png
Binary files differ
diff --git a/gfx/sprites/receptionist.png b/gfx/sprites/receptionist.png
new file mode 100644
index 0000000..0d102b0
--- /dev/null
+++ b/gfx/sprites/receptionist.png
Binary files differ
diff --git a/gfx/sprites/red.png b/gfx/sprites/red.png
new file mode 100644
index 0000000..018b676
--- /dev/null
+++ b/gfx/sprites/red.png
Binary files differ
diff --git a/gfx/sprites/reds_mom.png b/gfx/sprites/reds_mom.png
new file mode 100644
index 0000000..5644764
--- /dev/null
+++ b/gfx/sprites/reds_mom.png
Binary files differ
diff --git a/gfx/sprites/rocker.png b/gfx/sprites/rocker.png
new file mode 100644
index 0000000..50ac208
--- /dev/null
+++ b/gfx/sprites/rocker.png
Binary files differ
diff --git a/gfx/sprites/rocket_f.png b/gfx/sprites/rocket_f.png
new file mode 100644
index 0000000..b8714ba
--- /dev/null
+++ b/gfx/sprites/rocket_f.png
Binary files differ
diff --git a/gfx/sprites/rocket_m.png b/gfx/sprites/rocket_m.png
new file mode 100644
index 0000000..43a71bd
--- /dev/null
+++ b/gfx/sprites/rocket_m.png
Binary files differ
diff --git a/gfx/sprites/sage.png b/gfx/sprites/sage.png
new file mode 100644
index 0000000..8022304
--- /dev/null
+++ b/gfx/sprites/sage.png
Binary files differ
diff --git a/gfx/sprites/sailor.png b/gfx/sprites/sailor.png
new file mode 100644
index 0000000..b4d3b5f
--- /dev/null
+++ b/gfx/sprites/sailor.png
Binary files differ
diff --git a/gfx/sprites/sakaki.png b/gfx/sprites/sakaki.png
new file mode 100644
index 0000000..2e625e1
--- /dev/null
+++ b/gfx/sprites/sakaki.png
Binary files differ
diff --git a/gfx/sprites/scientist.png b/gfx/sprites/scientist.png
new file mode 100644
index 0000000..39c4429
--- /dev/null
+++ b/gfx/sprites/scientist.png
Binary files differ
diff --git a/gfx/sprites/sidon.png b/gfx/sprites/sidon.png
new file mode 100644
index 0000000..80d615b
--- /dev/null
+++ b/gfx/sprites/sidon.png
Binary files differ
diff --git a/gfx/sprites/silver.png b/gfx/sprites/silver.png
new file mode 100644
index 0000000..7d82d40
--- /dev/null
+++ b/gfx/sprites/silver.png
Binary files differ
diff --git a/gfx/sprites/silvers_mom.png b/gfx/sprites/silvers_mom.png
new file mode 100644
index 0000000..b8e9464
--- /dev/null
+++ b/gfx/sprites/silvers_mom.png
Binary files differ
diff --git a/gfx/sprites/super_nerd.png b/gfx/sprites/super_nerd.png
new file mode 100644
index 0000000..6866c7b
--- /dev/null
+++ b/gfx/sprites/super_nerd.png
Binary files differ
diff --git a/gfx/sprites/swimmer_f.png b/gfx/sprites/swimmer_f.png
new file mode 100644
index 0000000..eed753a
--- /dev/null
+++ b/gfx/sprites/swimmer_f.png
Binary files differ
diff --git a/gfx/sprites/swimmer_m.png b/gfx/sprites/swimmer_m.png
new file mode 100644
index 0000000..4c1818b
--- /dev/null
+++ b/gfx/sprites/swimmer_m.png
Binary files differ
diff --git a/gfx/sprites/teacher.png b/gfx/sprites/teacher.png
new file mode 100644
index 0000000..2107159
--- /dev/null
+++ b/gfx/sprites/teacher.png
Binary files differ
diff --git a/gfx/sprites/tsukushi.png b/gfx/sprites/tsukushi.png
new file mode 100644
index 0000000..99a36a2
--- /dev/null
+++ b/gfx/sprites/tsukushi.png
Binary files differ
diff --git a/gfx/sprites/twin.png b/gfx/sprites/twin.png
new file mode 100644
index 0000000..caa9f43
--- /dev/null
+++ b/gfx/sprites/twin.png
Binary files differ
diff --git a/gfx/sprites/youngster.png b/gfx/sprites/youngster.png
new file mode 100644
index 0000000..5c0d339
--- /dev/null
+++ b/gfx/sprites/youngster.png
Binary files differ
diff --git a/gfx/trainer/akane.png b/gfx/trainer/akane.png
new file mode 100644
index 0000000..0d108f4
--- /dev/null
+++ b/gfx/trainer/akane.png
Binary files differ
diff --git a/gfx/trainer/beauty.png b/gfx/trainer/beauty.png
new file mode 100644
index 0000000..eaa70e6
--- /dev/null
+++ b/gfx/trainer/beauty.png
Binary files differ
diff --git a/gfx/trainer/biker.png b/gfx/trainer/biker.png
new file mode 100644
index 0000000..1c95eea
--- /dev/null
+++ b/gfx/trainer/biker.png
Binary files differ
diff --git a/gfx/trainer/blackbelt.png b/gfx/trainer/blackbelt.png
new file mode 100644
index 0000000..205fa08
--- /dev/null
+++ b/gfx/trainer/blackbelt.png
Binary files differ
diff --git a/gfx/trainer/blue.png b/gfx/trainer/blue.png
new file mode 100644
index 0000000..954bbc4
--- /dev/null
+++ b/gfx/trainer/blue.png
Binary files differ
diff --git a/gfx/trainer/bug_catcher_boy.png b/gfx/trainer/bug_catcher_boy.png
new file mode 100644
index 0000000..36c80c7
--- /dev/null
+++ b/gfx/trainer/bug_catcher_boy.png
Binary files differ
diff --git a/gfx/trainer/burglar.png b/gfx/trainer/burglar.png
new file mode 100644
index 0000000..9142e8d
--- /dev/null
+++ b/gfx/trainer/burglar.png
Binary files differ
diff --git a/gfx/trainer/engineer.png b/gfx/trainer/engineer.png
new file mode 100644
index 0000000..1a1944e
--- /dev/null
+++ b/gfx/trainer/engineer.png
Binary files differ
diff --git a/gfx/trainer/enoki.png b/gfx/trainer/enoki.png
new file mode 100644
index 0000000..77ba390
--- /dev/null
+++ b/gfx/trainer/enoki.png
Binary files differ
diff --git a/gfx/trainer/firebreather.png b/gfx/trainer/firebreather.png
new file mode 100644
index 0000000..ac1148a
--- /dev/null
+++ b/gfx/trainer/firebreather.png
Binary files differ
diff --git a/gfx/trainer/fisher.png b/gfx/trainer/fisher.png
new file mode 100644
index 0000000..c845d9d
--- /dev/null
+++ b/gfx/trainer/fisher.png
Binary files differ
diff --git a/gfx/trainer/fledgling.png b/gfx/trainer/fledgling.png
new file mode 100644
index 0000000..52c58b2
--- /dev/null
+++ b/gfx/trainer/fledgling.png
Binary files differ
diff --git a/gfx/trainer/gama.png b/gfx/trainer/gama.png
new file mode 100644
index 0000000..37ef663
--- /dev/null
+++ b/gfx/trainer/gama.png
Binary files differ
diff --git a/gfx/trainer/green.png b/gfx/trainer/green.png
new file mode 100644
index 0000000..6b94fd2
--- /dev/null
+++ b/gfx/trainer/green.png
Binary files differ
diff --git a/gfx/trainer/hayato.png b/gfx/trainer/hayato.png
new file mode 100644
index 0000000..2d93a75
--- /dev/null
+++ b/gfx/trainer/hayato.png
Binary files differ
diff --git a/gfx/trainer/juggler.png b/gfx/trainer/juggler.png
new file mode 100644
index 0000000..4a4f8a0
--- /dev/null
+++ b/gfx/trainer/juggler.png
Binary files differ
diff --git a/gfx/trainer/kimonogirl.png b/gfx/trainer/kimonogirl.png
new file mode 100644
index 0000000..184c226
--- /dev/null
+++ b/gfx/trainer/kimonogirl.png
Binary files differ
diff --git a/gfx/trainer/kurt.png b/gfx/trainer/kurt.png
new file mode 100644
index 0000000..b881214
--- /dev/null
+++ b/gfx/trainer/kurt.png
Binary files differ
diff --git a/gfx/trainer/lass.png b/gfx/trainer/lass.png
new file mode 100644
index 0000000..ef5781c
--- /dev/null
+++ b/gfx/trainer/lass.png
Binary files differ
diff --git a/gfx/trainer/medium.png b/gfx/trainer/medium.png
new file mode 100644
index 0000000..49b29c7
--- /dev/null
+++ b/gfx/trainer/medium.png
Binary files differ
diff --git a/gfx/trainer/mikan.png b/gfx/trainer/mikan.png
new file mode 100644
index 0000000..e8150cf
--- /dev/null
+++ b/gfx/trainer/mikan.png
Binary files differ
diff --git a/gfx/trainer/oak.png b/gfx/trainer/oak.png
new file mode 100644
index 0000000..7c7452f
--- /dev/null
+++ b/gfx/trainer/oak.png
Binary files differ
diff --git a/gfx/trainer/okera.png b/gfx/trainer/okera.png
new file mode 100644
index 0000000..48392bf
--- /dev/null
+++ b/gfx/trainer/okera.png
Binary files differ
diff --git a/gfx/trainer/pokemaniac.png b/gfx/trainer/pokemaniac.png
new file mode 100644
index 0000000..e0d7957
--- /dev/null
+++ b/gfx/trainer/pokemaniac.png
Binary files differ
diff --git a/gfx/trainer/professional_f.png b/gfx/trainer/professional_f.png
new file mode 100644
index 0000000..3075251
--- /dev/null
+++ b/gfx/trainer/professional_f.png
Binary files differ
diff --git a/gfx/trainer/professional_m.png b/gfx/trainer/professional_m.png
new file mode 100644
index 0000000..610dad5
--- /dev/null
+++ b/gfx/trainer/professional_m.png
Binary files differ
diff --git a/gfx/trainer/protagonist.png b/gfx/trainer/protagonist.png
new file mode 100644
index 0000000..5215e15
--- /dev/null
+++ b/gfx/trainer/protagonist.png
Binary files differ
diff --git a/gfx/trainer/rival.png b/gfx/trainer/rival.png
new file mode 100644
index 0000000..9514cb9
--- /dev/null
+++ b/gfx/trainer/rival.png
Binary files differ
diff --git a/gfx/trainer/rocket_m.png b/gfx/trainer/rocket_m.png
new file mode 100644
index 0000000..257ad50
--- /dev/null
+++ b/gfx/trainer/rocket_m.png
Binary files differ
diff --git a/gfx/trainer/schoolboy.png b/gfx/trainer/schoolboy.png
new file mode 100644
index 0000000..ab8b8d4
--- /dev/null
+++ b/gfx/trainer/schoolboy.png
Binary files differ
diff --git a/gfx/trainer/soldier.png b/gfx/trainer/soldier.png
new file mode 100644
index 0000000..3dd9d4f
--- /dev/null
+++ b/gfx/trainer/soldier.png
Binary files differ
diff --git a/gfx/trainer/sportsman.png b/gfx/trainer/sportsman.png
new file mode 100644
index 0000000..0d1f02d
--- /dev/null
+++ b/gfx/trainer/sportsman.png
Binary files differ
diff --git a/gfx/trainer/supernerd.png b/gfx/trainer/supernerd.png
new file mode 100644
index 0000000..5034203
--- /dev/null
+++ b/gfx/trainer/supernerd.png
Binary files differ
diff --git a/gfx/trainer/swimmer_f.png b/gfx/trainer/swimmer_f.png
new file mode 100644
index 0000000..53d040a
--- /dev/null
+++ b/gfx/trainer/swimmer_f.png
Binary files differ
diff --git a/gfx/trainer/swimmer_m.png b/gfx/trainer/swimmer_m.png
new file mode 100644
index 0000000..e143f9b
--- /dev/null
+++ b/gfx/trainer/swimmer_m.png
Binary files differ
diff --git a/gfx/trainer/teacher_f.png b/gfx/trainer/teacher_f.png
new file mode 100644
index 0000000..8ba703b
--- /dev/null
+++ b/gfx/trainer/teacher_f.png
Binary files differ
diff --git a/gfx/trainer/teacher_m.png b/gfx/trainer/teacher_m.png
new file mode 100644
index 0000000..66c1710
--- /dev/null
+++ b/gfx/trainer/teacher_m.png
Binary files differ
diff --git a/gfx/trainer/tsukushi.png b/gfx/trainer/tsukushi.png
new file mode 100644
index 0000000..b898a86
--- /dev/null
+++ b/gfx/trainer/tsukushi.png
Binary files differ
diff --git a/gfx/trainer/twins.png b/gfx/trainer/twins.png
new file mode 100644
index 0000000..0f8d4ed
--- /dev/null
+++ b/gfx/trainer/twins.png
Binary files differ
diff --git a/gfx/trainer/youngster.png b/gfx/trainer/youngster.png
new file mode 100644
index 0000000..00ba41b
--- /dev/null
+++ b/gfx/trainer/youngster.png
Binary files differ
diff --git a/home/audio.asm b/home/audio.asm
index ede88d4..bf3a6c5 100644
--- a/home/audio.asm
+++ b/home/audio.asm
@@ -7,143 +7,136 @@ SECTION "Audio interface", ROM0[$3C83]
endc
DisableAudio:: ; 3cbf
- push hl
- push de
- push bc
- push af
- ldh a, [hROMBank]
- push af
- ld a, BANK(_DisableAudio)
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- call _DisableAudio
- pop af
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- pop af
- pop bc
- pop de
- pop hl
- ret
-
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_DisableAudio)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _DisableAudio
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
UpdateSound:: ; 3cdb
- push hl
- push de
- push bc
- push af
- ldh a, [hROMBank]
- push af
- ld a, BANK(_UpdateSound)
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- call _UpdateSound
- pop af
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- pop af
- pop bc
- pop de
- pop hl
- ret
-
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_UpdateSound)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _UpdateSound
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
_LoadMusicByte:: ; 3cf7
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- ld a, [de]
- push af
- ld a, BANK(_UpdateSound)
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- pop af
- ret
-
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ ld a, [de]
+ push af
+ ld a, BANK(_UpdateSound)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ ret
PlayMusic:: ; 3d07
- push hl
- push de
- push bc
- push af
- ldh a, [hROMBank]
- push af
- ld a, BANK(_PlayMusic)
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- call _PlayMusic
- pop af
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- pop af
- pop bc
- pop de
- pop hl
- ret
-
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_PlayMusic)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _PlayMusic
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
PlayCryHeader:: ; 3d23
- push hl
- push de
- push bc
- push af
- ldh a, [hROMBank]
- push af
-
- ld a, BANK(CryHeaders)
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- ld hl, CryHeaders
-REPT 6
- add hl, de
-ENDR
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
- ld a, [hli]
- ld [wCryPitch], a
- ld a, [hli]
- ld [wCryPitch + 1], a
- ld a, [hli]
- ld [wCryLength], a
- ld a, [hl]
- ld [wCryLength + 1], a
-
- ld a, BANK(_PlayCryHeader)
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- call _PlayCryHeader
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+
+ ld a, BANK(CryHeaders)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ ld hl, CryHeaders
+rept 6
+ add hl, de
+endr
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld a, [hli]
+ ld [wCryPitch], a
+ ld a, [hli]
+ ld [wCryPitch + 1], a
+ ld a, [hli]
+ ld [wCryLength], a
+ ld a, [hl]
+ ld [wCryLength + 1], a
+
+ ld a, BANK(_PlayCryHeader)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _PlayCryHeader
- pop af
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- pop af
- pop bc
- pop de
- pop hl
- ret
-
-
-
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
PlaySFX:: ; 3d63
- push hl
- push de
- push bc
- push af
- ldh a, [hROMBank]
- push af
- ld a, BANK(_PlaySFX)
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- call _PlaySFX
- pop af
- ld [MBC3RomBank], a ; Unsafe
- ldh [hROMBank], a
- pop af
- pop bc
- pop de
- pop hl
- ret
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_PlaySFX)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _PlaySFX
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
WaitPlaySFX:: ; 3d7f
diff --git a/home/bankswitch.asm b/home/bankswitch.asm
index 574fa64..278013c 100644
--- a/home/bankswitch.asm
+++ b/home/bankswitch.asm
@@ -9,6 +9,6 @@ endc
; Moved to a rst vector in final US releases (not sure about JP)
; All rst vectors are unused at this point in development
Bankswitch:: ; 32c2
- ldh [hROMBank], a
- ld [MBC3RomBank], a
- ret
+ ldh [hROMBank], a
+ ld [MBC3RomBank], a
+ ret
diff --git a/home/clear_sprites.asm b/home/clear_sprites.asm
index 90e8f38..489b375 100644
--- a/home/clear_sprites.asm
+++ b/home/clear_sprites.asm
@@ -7,23 +7,23 @@ SECTION "Sprite clearing", ROM0[$32A0]
endc
ClearSprites:: ; 32dc
- ld hl, wVirtualOAM
- ld b, wVirtualOAMEnd - wVirtualOAM
- xor a
+ ld hl, wVirtualOAM
+ ld b, wVirtualOAMEnd - wVirtualOAM
+ xor a
.loop
- ld [hli], a
- dec b
- jr nz, .loop
- ret
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ret
HideSprites:: ; 32e7
- ld hl, wVirtualOAM
- ld de, SPRITEOAMSTRUCT_LENGTH
- ld b, NUM_SPRITE_OAM_STRUCTS
- ld a, $A0
+ ld hl, wVirtualOAM
+ ld de, SPRITEOAMSTRUCT_LENGTH
+ ld b, NUM_SPRITE_OAM_STRUCTS
+ ld a, SPRITEOAMSTRUCT_LENGTH * NUM_SPRITE_OAM_STRUCTS
.loop
- ld [hl], a
- add hl, de
- dec b
- jr nz, .loop
- ret
+ ld [hl], a
+ add hl, de
+ dec b
+ jr nz, .loop
+ ret
diff --git a/home/copy.asm b/home/copy.asm
index 757da0d..c916cbd 100644
--- a/home/copy.asm
+++ b/home/copy.asm
@@ -6,72 +6,109 @@ else
SECTION "Copy functions", ROM0[$32BB]
endc
-; Copy bc bytes from a:hl to de.
FarCopyBytes:: ; 32f7
- ld [wBuffer], a
- ldh a, [hROMBank]
- push af
- ld a, [wBuffer]
- call Bankswitch
- call CopyBytes
- pop af
- jp Bankswitch
+; Copy bc bytes from a:hl to de.
+ ld [wBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ld a, [wBuffer]
+ call Bankswitch
+ call CopyBytes
+ pop af
+ jp Bankswitch
-; Copy bc bytes from hl to de
CopyBytes:: ; 330a
- ld a, b
- and a
- jr z, CopyBytesSmall
- ld a, c
- and a
- jr z, .next
- inc b
+; Copy bc bytes from hl to de
+ ld a, b
+ and a
+ jr z, CopyBytesSmall
+ ld a, c
+ and a
+ jr z, .next
+ inc b
.next
- call CopyBytesSmall
- dec b
- jr nz, .next
- ret
+ call CopyBytesSmall
+ dec b
+ jr nz, .next
+ ret
-; Copy c bytes from hl to de
CopyBytesSmall:: ; 331a
- ld a, [hli]
- ld [de], a
- inc de
- dec c
- jr nz, CopyBytesSmall
- ret
-
+; Copy c bytes from hl to de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, CopyBytesSmall
+ ret
GetFarByte:: ; 3321
- ld [wBuffer], a
- ldh a, [hROMBank]
- push af
- ld a, [wBuffer]
- call Bankswitch
- ld a, [hl]
- ld [wBuffer], a
- pop af
- call Bankswitch
- ld a, [wBuffer]
- ret
-
+ ld [wBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ld a, [wBuffer]
+ call Bankswitch
+ ld a, [hl]
+ ld [wBuffer], a
+ pop af
+ call Bankswitch
+ ld a, [wBuffer]
+ ret
ByteFill:: ; 3339
- push af
- ld a, b
- and a
- jr z, .small_fill
- ld a, c
- and a
- jr z, .start_filling
+ push af
+ ld a, b
+ and a
+ jr z, .small_fill
+ ld a, c
+ and a
+ jr z, .start_filling
.small_fill
- inc b
+ inc b
.start_filling
- pop af
+ pop af
.loop
- ld [hli], a
- dec c
- jr nz, .loop
- dec b
- jr nz, .loop
- ret
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ dec b
+ jr nz, .loop
+ ret
+
+UncompressSpriteFromDE::
+; Decompress pic at a:de.
+ ld hl, wSpriteInputPtr
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ jp UncompressSpriteData
+
+BackUpTilesToBuffer:: ; 3355
+ hlcoord 0, 0
+ decoord 0, 0, wTileMapBackup
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ jp CopyBytes
+
+ReloadTilesFromBuffer:: ; 3361
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 0, wTileMapBackup
+ decoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ call CopyBytes
+ ld a, 1
+ ldh [hBGMapMode], a
+ ret
+
+CopyStringToCD31::
+; copies a string from [de] to [wcd31]
+ ld hl, wcd31
+ ; fallthrough
+
+CopyString::
+; copies a string from [de] to [hl]
+ ld a, [de]
+ inc de
+ ld [hli], a
+ cp "@"
+ jr nz, CopyString
+ ret
diff --git a/home/copy2.asm b/home/copy2.asm
index 27abf08..0a0ee54 100644
--- a/home/copy2.asm
+++ b/home/copy2.asm
@@ -2,9 +2,9 @@ INCLUDE "constants.asm"
SECTION "Video Copy functions", ROM0[$0D2A]
+FarCopyData: ; d2a (0:d2a)
; Identical to FarCopyBytes except for tail call optimization
; Copy bc 2bpp bytes from a:hl to de.
-FarCopyData: ; d2a (0:d2a)
ld [wBuffer], a
ldh a, [hROMBank]
push af
@@ -15,8 +15,8 @@ FarCopyData: ; d2a (0:d2a)
call Bankswitch
ret
-; Copy and expand bc 1bpp bytes from a:hl to de.
FarCopyDataDouble: ; d3e (0:d3e)
+; Copy and expand bc 1bpp bytes from a:hl to de.
ld [wBuffer], a
ldh a, [hROMBank]
push af
@@ -49,10 +49,10 @@ FarCopyDataDouble: ; d3e (0:d3e)
call Bankswitch
ret
+CopyVideoData:: ; d68 (0:d68)
; Wait for the next VBlank, then copy c 2bpp
; tiles from b:de to hl, 8 tiles at a time.
; This takes c/8 frames.
-CopyVideoData:: ; d68 (0:d68)
ldh a, [hBGMapMode]
push af
xor a ; disable auto-transfer while copying
@@ -71,7 +71,7 @@ CopyVideoData:: ; d68 (0:d68)
ld [wVBCopyDst + 1], a
.loop
ld a, c
- cp $08
+ cp $8
jr nc, .keepgoing
ld [wVBCopySize], a
call DelayFrame
@@ -81,18 +81,18 @@ CopyVideoData:: ; d68 (0:d68)
ldh [hBGMapMode], a
ret
.keepgoing
- ld a, $08
+ ld a, $8
ld [wVBCopySize], a
call DelayFrame
ld a, c
- sub $08
+ sub $8
ld c, a
jr .loop
+CopyVideoDataDouble:: ; da6 (0:da6)
; Wait for the next VBlank, then copy c 1bpp
; tiles from b:de to hl, 8 tiles at a time.
; This takes c/8 frames.
-CopyVideoDataDouble:: ; da6 (0:da6)
ldh a, [hBGMapMode]
push af
xor a
@@ -111,7 +111,7 @@ CopyVideoDataDouble:: ; da6 (0:da6)
ld [wVBCopyDoubleDst + 1], a
.loop
ld a, c
- cp $08
+ cp $8
jr nc, .keepgoing
ld [wVBCopyDoubleSize], a
call DelayFrame
@@ -121,18 +121,18 @@ CopyVideoDataDouble:: ; da6 (0:da6)
ldh [hBGMapMode], a
ret
.keepgoing
- ld a, $08
+ ld a, $8
ld [wVBCopyDoubleSize], a
call DelayFrame
ld a, c
- sub $08
+ sub $8
ld c, a
jr .loop
+CopyVideoDataOptimized:: ; de4 (0:de4)
; Copy c 2bpp tiles from b:de to hl in VRAM
; using VBlank service or direct copy in
; case LCD is off
-CopyVideoDataOptimized:: ; de4 (0:de4)
ldh a, [rLCDC]
bit rLCDC_ENABLE, a
jp nz, CopyVideoData ; copy video data during vblank while screen is on
@@ -152,10 +152,10 @@ CopyVideoDataOptimized:: ; de4 (0:de4)
pop af
jp FarCopyData
+CopyVideoDataDoubleOptimized: ; dff (0:dff)
; Copy c 1bpp tiles from b:de to hl in VRAM
; using VBlank service or direct copy in
; case LCD is off
-CopyVideoDataDoubleOptimized: ; dff (0:dff)
ldh a, [rLCDC]
bit rLCDC_ENABLE, a
jp nz, CopyVideoDataDouble
@@ -164,7 +164,7 @@ CopyVideoDataDoubleOptimized: ; dff (0:dff)
ld e, l
ld a, b
push af
- ld h, $00
+ ld h, 0
ld l, c
add hl, hl
add hl, hl
@@ -174,4 +174,4 @@ CopyVideoDataDoubleOptimized: ; dff (0:dff)
pop af
pop hl
jp FarCopyDataDouble
-; 0xe18 \ No newline at end of file
+; 0xe18
diff --git a/home/copy_tilemap.asm b/home/copy_tilemap.asm
deleted file mode 100644
index 27c33c0..0000000
--- a/home/copy_tilemap.asm
+++ /dev/null
@@ -1,24 +0,0 @@
-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
- decoord 0, 0, wTileMapBackup
- ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
- jp CopyBytes
-
-ReloadTilesFromBuffer:: ; 3361
- xor a
- ldh [hBGMapMode], a
- hlcoord 0, 0, wTileMapBackup
- decoord 0, 0
- ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
- call CopyBytes
- ld a, 1
- ldh [hBGMapMode], a
- ret
diff --git a/home/delay.asm b/home/delay.asm
index dc3ad40..286cc0c 100644
--- a/home/delay.asm
+++ b/home/delay.asm
@@ -4,23 +4,19 @@ SECTION "Delay", ROM0[$0317]
DelayFrame::
; Wait for one frame
- ld a, 1
- ld [wVBlankOccurred], a
-
-; Wait for the next VBlank, halting to conserve battery
+ ld a, 1
+ ld [wVBlankOccurred], a
.halt
- halt ; rgbasm adds a nop after this instruction by default
- ld a, [wVBlankOccurred]
- and a
- jr nz, .halt
-
- ret
-
+; Wait for the next VBlank, halting to conserve battery
+ halt ; rgbasm adds a nop after this instruction by default
+ ld a, [wVBlankOccurred]
+ and a
+ jr nz, .halt
+ ret
DelayFrames::
; Wait c frames
- call DelayFrame
- dec c
- jr nz, DelayFrames
-
- ret
+ call DelayFrame
+ dec c
+ jr nz, DelayFrames
+ ret
diff --git a/home/farcall.asm b/home/farcall.asm
index 32fcce5..3fcf37f 100644
--- a/home/farcall.asm
+++ b/home/farcall.asm
@@ -7,36 +7,36 @@ SECTION "FarCall", ROM0[$2F6C]
endc
FarCall_hl:: ; 2fa8
- push af
- ld a, b
- ld [wFarCallBCBuffer], a
- ld a, c
- ld [wFarCallBCBuffer + 1], a
- pop af
- ld b, a
- ldh a, [hROMBank]
- push af
- ld a, b
- call Bankswitch
- ld bc, .return
- push bc
- push hl
- ld a, [wFarCallBCBuffer]
- ld b, a
- ld a, [wFarCallBCBuffer + 1]
- ld c, a
- ret
+ push af
+ ld a, b
+ ld [wFarCallBCBuffer], a
+ ld a, c
+ ld [wFarCallBCBuffer + 1], a
+ pop af
+ ld b, a
+ ldh a, [hROMBank]
+ push af
+ ld a, b
+ call Bankswitch
+ ld bc, .return
+ push bc
+ push hl
+ ld a, [wFarCallBCBuffer]
+ ld b, a
+ ld a, [wFarCallBCBuffer + 1]
+ ld c, a
+ ret
.return
- ld a, b
- ld [wFarCallBCBuffer], a
- ld a, c
- ld [wFarCallBCBuffer + 1], a
- pop bc
- ld a, b
- call Bankswitch
- ld a, [wFarCallBCBuffer]
- ld b, a
- ld a, [wFarCallBCBuffer + 1]
- ld c, a
- ret
+ ld a, b
+ ld [wFarCallBCBuffer], a
+ ld a, c
+ ld [wFarCallBCBuffer + 1], a
+ pop bc
+ ld a, b
+ call Bankswitch
+ ld a, [wFarCallBCBuffer]
+ ld b, a
+ ld a, [wFarCallBCBuffer + 1]
+ ld c, a
+ ret
diff --git a/home/init.asm b/home/init.asm
index 5498b35..ef4b745 100644
--- a/home/init.asm
+++ b/home/init.asm
@@ -1,8 +1,8 @@
INCLUDE "constants.asm"
SECTION "Entry point", ROM0[$100]
- nop
- jp Init
+ nop
+ jp Init
SECTION "Global check value", ROM0[$14E]
; The ROM has an incorrect global check, so set it here
@@ -25,121 +25,122 @@ endc
SECTION "Init", ROM0[$52F]
Init: ; 052f
- di
- xor a
- ld [rIF], a
- ld [rIE], a
- ld [rSCX], a
- ld [rSCY], a
- ld [rSB], a
- ld [rSC], a
- ld [rWX], a
- ld [rWY], a
- ld [rBGP], a
- ld [rOBP0], a
- ld [rOBP1], a
- ld [rTMA], a
- ld [rTAC], a
- ld [wcc38], a ; Useless, since WRAM gets cleared right after
- ld a, 1 << rTAC_ON | rTAC_4096_HZ
- ld [rTAC], a
- ld a, 1 << rLCDC_ENABLE
- ld [rLCDC], a
- call DisableLCD
-
- ld sp, wStackBottom
- call ClearVRAM
- ld hl, WRAM0_Begin
- ld bc, WRAM1_End - WRAM0_Begin
+ di
+ xor a
+ ld [rIF], a
+ ld [rIE], a
+ ld [rSCX], a
+ ld [rSCY], a
+ ld [rSB], a
+ ld [rSC], a
+ ld [rWX], a
+ ld [rWY], a
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ ld [rTMA], a
+ ld [rTAC], a
+ ld [wcc38], a ; Useless, since WRAM gets cleared right after
+ ld a, 1 << rTAC_ON | rTAC_4096_HZ
+ ld [rTAC], a
+ ld a, 1 << rLCDC_ENABLE
+ ld [rLCDC], a
+ call DisableLCD
+
+ ld sp, wStackBottom
+ call ClearVRAM
+ ld hl, WRAM0_Begin
+ ld bc, WRAM1_End - WRAM0_Begin
.ByteFill ; 0565
- ld [hl], 0
- inc hl
- dec bc
- ld a, b
- or c
- jr nz, .ByteFill
- ld hl, HRAM_Begin
- ld bc, HRAM_End - HRAM_Begin
- call ByteFill
- call ClearSprites
-
- ld a, BANK(WriteOAMDMACodeToHRAM)
- call Bankswitch
- call WriteOAMDMACodeToHRAM
-
- xor a
- ldh [hMapAnims], a
- ldh [hSCX], a
- ldh [hSCY], a
- ldh [rJOYP], a
- ld a, 1 << rSTAT_HBLANK
- ld [rSTAT], a
- ld a, SCREEN_HEIGHT_PX
- ldh [hWY], a
- ld [rWY], a
- ld a, 7
- ldh [hWX], a
- ld [rWX], a
-
- ld a, $FF
- ldh [hLinkPlayerNumber], a
- ld h, HIGH($9800)
- call BlankBGMap
- ld h, HIGH($9C00)
- call BlankBGMap
- ld a, LCDC_DEFAULT
- ld [rLCDC], a
-
- call DisableAudio
- call _2007
- ; predef ???
- ld a, $4B ; TODO: add predefs so the line above can be uncommented
- call Predef
- ld a, $1F
- ld [rIE], a
- ld a, HIGH($9C00)
- ldh [hBGMapAddress + 1], a
- xor a
- ldh [hBGMapAddress], a
-
- call DisableLCD
- call ClearVRAM
- ld a, LCDC_DEFAULT
- ld [rLCDC], a
- ei
-
- ld a, SRAM_ENABLE
- ld [MBC3SRamEnable], a
- ld a, RTC_DH
- ld [MBC3SRamBank], a
- xor a
- ld [SRAM_Begin], a
- ld a, 0 ; Useless
- ld [MBC3LatchClock], a
- ld [MBC3SRamEnable], a
- jp GameInit
+ ld [hl], 0
+ inc hl
+ dec bc
+ ld a, b
+ or c
+ jr nz, .ByteFill
+ ld hl, HRAM_Begin
+ ld bc, HRAM_End - HRAM_Begin
+ call ByteFill
+ call ClearSprites
+
+ ld a, BANK(WriteOAMDMACodeToHRAM)
+ call Bankswitch
+ call WriteOAMDMACodeToHRAM
+
+ xor a
+ ldh [hMapAnims], a
+ ldh [hSCX], a
+ ldh [hSCY], a
+ ldh [rJOYP], a
+ ld a, 1 << rSTAT_HBLANK
+ ld [rSTAT], a
+ ld a, SCREEN_HEIGHT_PX
+ ldh [hWY], a
+ ld [rWY], a
+ ld a, 7
+ ldh [hWX], a
+ ld [rWX], a
+
+ ld a, $ff
+ ldh [hLinkPlayerNumber], a
+ ld h, HIGH($9800)
+ call BlankBGMap
+ ld h, HIGH($9C00)
+ call BlankBGMap
+ ld a, LCDC_DEFAULT
+ ld [rLCDC], a
+
+ call DisableAudio
+ call _2007
+ ; predef ???
+ ld a, $4B ; TODO: add predefs so the line above can be uncommented
+ call Predef
+ ld a, $1F
+ ld [rIE], a
+ ld a, HIGH($9C00)
+ ldh [hBGMapAddress + 1], a
+ xor a
+ ldh [hBGMapAddress], a
+
+ call DisableLCD
+ call ClearVRAM
+ ld a, LCDC_DEFAULT
+ ld [rLCDC], a
+ ei
+
+ ld a, SRAM_ENABLE
+ ld [MBC3SRamEnable], a
+ ld a, RTC_DH
+ ld [MBC3SRamBank], a
+ xor a
+ ld [SRAM_Begin], a
+ ld a, 0 ; Useless
+ ld [MBC3LatchClock], a
+ ld [MBC3SRamEnable], a
+ jp GameInit
ClearVRAM: ; 05e6
- ld hl, VRAM_Begin
- ld bc, VRAM_End - VRAM_Begin
- xor a
- call ByteFill
- ret
+ ld hl, VRAM_Begin
+ ld bc, VRAM_End - VRAM_Begin
+ xor a
+ call ByteFill
+ ret
BlankBGMap:
- ld a, $7F
- jr _FillBGMap
+ ld a, $7f
+ jr _FillBGMap
FillBGMap:
- ld a, l
+ ld a, l
+ ; fallthrough
_FillBGMap:
- ld de, $400
- ld l, e
+ ld de, BG_MAP_WIDTH * BG_MAP_HEIGHT
+ ld l, e
.loop
- ld [hli], a
- dec e
- jr nz, .loop
- dec d
- jr nz, .loop
- ret
+ ld [hli], a
+ dec e
+ jr nz, .loop
+ dec d
+ jr nz, .loop
+ ret
diff --git a/home/interrupts.asm b/home/interrupts.asm
index b7800f1..f9d8ba1 100644
--- a/home/interrupts.asm
+++ b/home/interrupts.asm
@@ -1,28 +1,28 @@
INCLUDE "constants.asm"
SECTION "VBlank interrupt vector", ROM0[$040]
- jp VBlank
+ jp VBlank
SECTION "LCD interrupt vector", ROM0[$048]
- jp LCD
+ jp LCD
SECTION "Timer interrupt vector", ROM0[$050]
- jp TimerDummy
+ jp TimerDummy
SECTION "Serial interrupt vector", ROM0[$058]
- jp Serial
+ jp Serial
SECTION "Joypad interrupt vector", ROM0[$060]
- jp JoypadDummy
+ jp JoypadDummy
SECTION "Timer dummy interrupt", ROM0[$42A]
TimerDummy: ; 042a
- reti
+ reti
SECTION "Joypad dummy interrupt", ROM0[$7F7]
JoypadDummy: ; 07f7
- reti
+ reti
diff --git a/home/items.asm b/home/items.asm
new file mode 100755
index 0000000..496b685
--- /dev/null
+++ b/home/items.asm
@@ -0,0 +1,145 @@
+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
+; INPUT:
+; HL = address of inventory (either wNumBagItems or wNumBoxItems)
+; [wcd76] = item ID
+; [wItemQuantity] = item quantity
+; sets carry flag if successful, unsets carry flag if unsuccessful
+ push bc
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(AddItemToInventory_)
+ call Bankswitch
+ push hl
+ push de
+ call AddItemToInventory_
+ pop de
+ pop hl
+ pop bc
+ ld a, b
+ call Bankswitch
+ pop bc
+ ret
+
+if DEBUG
+SECTION "GiveItem", ROM0[$366C]
+else
+SECTION "GiveItem", ROM0[$3630]
+endc
+
+GiveItem::
+; Give player quantity c of item b,
+; and copy the item's name to wcf4b.
+; Return carry on success.
+ ld a, b
+ ld [wce37], a
+ ld [wcd76], a
+ ld a, c
+ ld [wItemQuantity], a
+ ld hl, wNumBagItems
+ call AddItemToInventory
+ ret nc
+ call GetItemName
+ call CopyStringToCD31
+ 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
+; starting at wcd26
+ push hl
+ push bc
+ ld a, [wce37]
+ cp ITEM_HM01_RED
+ jr nc, .machine
+
+ ld [wcb5b], a
+ ld a, ITEM_NAME
+ ld [wNameCategory], a
+ call GetName
+ jr .finish
+
+.machine
+ call GetMachineName
+.finish
+ ld de, wcd26 ; pointer to where item name is stored in RAM
+ pop bc
+ 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
+ push hl
+ push de
+ push bc
+ ld a, [wce37]
+ push af
+ cp ITEM_TM01_RED
+ jr nc, .WriteTM
+; if HM, then write "HM" and add 5 to the item ID, so we can reuse the
+; TM printing code
+ add 5
+ ld [wce37], a
+ ld hl, HiddenPrefix
+ ld bc, 6
+ jr .WriteMachinePrefix
+.WriteTM
+ ld hl, TechnicalPrefix
+ ld bc, 5
+.WriteMachinePrefix
+ ld de, wcd26
+ call CopyBytes
+; now get the machine number and convert it to text
+ ld a, [wce37]
+ sub ITEM_TM01_RED - 1
+ ld b, "0"
+.FirstDigit
+ sub 10
+ jr c, .SecondDigit
+ inc b
+ jr .FirstDigit
+.SecondDigit
+ add 10
+ push af
+ ld a, b
+ ld [de], a
+ inc de
+ pop af
+ ld b, "0"
+ add b
+ ld [de], a
+ inc de
+ ld a, "@"
+ ld [de], a
+ pop af
+ ld [wce37], a
+ pop bc
+ pop de
+ pop hl
+ ret
+
+TechnicalPrefix:
+ db "わざマシン@"
+
+HiddenPrefix:
+ db "ひでんマシン@"
diff --git a/home/joypad.asm b/home/joypad.asm
new file mode 100644
index 0000000..e0740f2
--- /dev/null
+++ b/home/joypad.asm
@@ -0,0 +1,285 @@
+INCLUDE "constants.asm"
+
+SECTION "Joypad functions", ROM0[$07FE]
+
+Joypad:: ; 7fe (0:7fe)
+; Read the joypad register and translate it to something more
+; workable for use in-game. There are 8 buttons, so we can use
+; one byte to contain all player input.
+
+; Updates:
+
+; hJoypadUp: released this frame (delta)
+; hJoypadDown: pressed this frame (delta)
+; hJoypadState: currently pressed
+; hJoypadSum: pressed so far
+ ld a, [$d4ab]
+ and $d0
+ ret nz
+ ld a, 1 << 5 ; select direction keys
+ ldh [rJOYP], a
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ cpl
+ and $0f
+ swap a
+ ld b, a
+ ld a, 1 << 4 ; select button keys
+ ldh [rJOYP], a
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ cpl
+ and $0f
+ or b
+ ld b, a
+ ld a, (1 << 5 | 1 << 4) ; port reset
+ ldh [rJOYP], a
+ ldh a, [hJoypadState]
+ ld e, a
+ xor b
+ ld d, a
+ and e
+ ldh [hJoypadUp], a
+ ld a, d
+ and b
+ ldh [hJoypadDown], a
+ ld c, a
+ ldh a, [hJoypadSum]
+ or c
+ ldh [hJoypadSum], a
+ ld a, b
+ ldh [hJoypadState], a
+ ldh [hJoypadState2], a
+ ; Soft-Reset by holding A+B+SELECT+START
+ and (A_BUTTON | B_BUTTON | SELECT | START)
+ cp (A_BUTTON | B_BUTTON | SELECT | START)
+ jp z, Reset
+ ret
+
+GetJoypad:: ; 84a (0:84a)
+; Update mirror joypad input from hJoypadState (real input)
+
+; hJoyReleased, hJoyDown and hJoyState are synchronized
+; copies of their hJoypad* counterparts.
+
+; bit 0 A
+; 1 B
+; 2 SELECT
+; 3 START
+; 4 RIGHT
+; 5 LEFT
+; 6 UP
+; 7 DOWN
+ push af
+ push hl
+ push de
+ ld hl, wJoypadFlags
+ set 6, [hl] ; mutex
+ ld hl, hJoypadDown
+ ld de, hJoyDown
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ ld hl, wJoypadFlags
+ res 6, [hl]
+ pop de
+ pop hl
+ pop af
+ ret
+
+JoyTitleScreenInput:: ; 869 (0:869)
+; Check if any of the following conditions
+; is met for c frames
+; - B, Select and Up keys are pressed in same frame
+; - A is pressed
+; - START is pressed
+;
+; Inputs: c - number of frames to check for
+; Return: carry set if condition met, else reset
+.loop
+ call DelayFrame
+ push bc
+ call GetJoypadDebounced
+ pop bc
+ ldh a, [hJoyState]
+ cp (D_UP | SELECT | B_BUTTON)
+ jr z, .done
+ ldh a, [hJoySum]
+ and (START | A_BUTTON)
+ jr nz, .done
+ dec c
+ jr nz, .loop
+ and a
+ ret
+.done
+ scf
+ ret
+
+GetJoypadDebounced:: ; 884 (0:884)
+; Update hJoySum joypad input from either hJoyDown or
+; hJoyState depending on hJoyDebounceSrc.
+; hJoyState is only updated every 5 frames and
+; the update is delayed by 15 frames after any button
+; press.
+ call GetJoypad
+ ldh a, [hJoyDebounceSrc]
+ and a
+ ldh a, [hJoyDown]
+ jr z, .joyDownSrc
+.joyStateSrc
+ ldh a, [hJoyState]
+.joyDownSrc
+ ldh [hJoySum], a
+ ldh a, [hJoyDown]
+ and a
+ jr z, .sampleAfterPress
+ ld a, $0f
+ ld [wVBlankJoyFrameCounter], a
+ ret
+.sampleAfterPress
+ ld a, [wVBlankJoyFrameCounter]
+ and a
+ jr z, .sampleRegular
+ xor a
+ ldh [hJoySum], a
+ ret
+.sampleRegular
+ ld a, $05
+ ld [wVBlankJoyFrameCounter], a
+ ret
+; 0x8ad
+
+TextboxWaitPressAorB_BlinkCursor: ; 8ad (0:8ad)
+; Show a blinking cursor in the lower right-hand
+; corner of a textbox and wait until A or B is
+; pressed.
+;
+; CAUTION: The cursor has to be shown when calling
+; this function or no cursor will be shown at all.
+; Waiting on button presses is unaffected by this.
+ ldh a, [hSpriteWidth] ; hTextBoxCursorBlinkInterval is shared with
+ push af ; hSpriteWidth and hSpriteHeight, so we need
+ ldh a, [hSpriteHeight] ; to back them up
+ push af
+ xor a
+ ldh [hTextBoxCursorBlinkInterval], a
+ ld a, $06
+ ldh [hTextBoxCursorBlinkInterval + 1], a ; initially, 0x600 iterations
+.loop
+ push hl
+ coord hl, (TEXTBOX_WIDTH - 2), (TEXTBOX_Y + TEXTBOX_HEIGHT - 1)
+ call TextboxBlinkCursor
+ pop hl
+ call GetJoypadDebounced
+ ldh a, [hJoySum]
+ and (A_BUTTON | B_BUTTON)
+ jr z, .loop
+ pop af
+ ldh [hSpriteHeight], a
+ pop af
+ ldh [hSpriteWidth], a
+ ret
+
+ButtonSound:: ; 8d2 (0:8d2)
+ ld a, [wLinkMode]
+ cp $03
+ jr z, .link
+ call WaitAorB_BlinkCursor
+ push de
+ ld de, $5
+ call PlaySFX
+ pop de
+ ret
+.link
+ ld c, $41
+ jp DelayFrames
+
+WaitAorB_BlinkCursor:: ; 8ea (0:8ea)
+.loop
+ call BlinkCursor
+ call GetJoypadDebounced
+ ldh a, [hJoySum]
+ and (A_BUTTON | B_BUTTON)
+ ret nz
+ call RTC
+ call UpdateTimeOfDayPalettes
+ ld a, $01
+ ldh [hBGMapMode], a
+ call DelayFrame
+ jr .loop
+
+BlinkCursor: ; 904 (0:904)
+; Show a blinking cursor in the lower right-hand
+; corner of the screen
+; Will toggle between cursor and blank every
+; 16 frames.
+ ldh a, [hVBlankCounter]
+ and $10
+ jr z, .cursor_off
+ ld a, "▼"
+ jr .save_cursor_state
+.cursor_off
+ ld a, " "
+.save_cursor_state
+ ldcoord_a (SCREEN_WIDTH - 2), (SCREEN_HEIGHT - 1)
+ ret
+
+TextboxBlinkCursor:: ; 914 (0:914)
+; Show a blinking cursor at the specified position
+; that toggles between down arrow and horizontal textbox
+; frame tile.
+; hl - address of cursor
+; hTextBoxCursorBlinkInterval - initial delay between toggling
+; subsequent delays will be 0x6FF
+; calls of this function
+; CAUTION: if the cursor is not shown initially, even initial
+; hTextBoxCursorBlinkInterval values will cause no cursor
+; to be shown at all.
+ ld a, [hl]
+ ld b, a
+ ld a, "▼"
+ cp b
+ jr nz, .showCursorCountdown
+.showTextboxFrameCountdown
+ ldh a, [hTextBoxCursorBlinkInterval]
+ dec a
+ ldh [hTextBoxCursorBlinkInterval], a
+ ret nz
+ ldh a, [hTextBoxCursorBlinkInterval + 1]
+ dec a
+ ldh [hTextBoxCursorBlinkInterval + 1], a
+ ret nz
+ ld a, "─"
+ ld [hl], a
+ ld a, $ff
+ ldh [hTextBoxCursorBlinkInterval], a
+ ld a, $06
+ ldh [hTextBoxCursorBlinkInterval + 1], a ; reset to 0x6FF iterations
+ ret
+.showCursorCountdown
+ ldh a, [hTextBoxCursorBlinkInterval]
+ and a
+ ret z
+ dec a
+ ldh [hTextBoxCursorBlinkInterval], a
+ ret nz
+ dec a
+ ldh [hTextBoxCursorBlinkInterval], a
+ ldh a, [hTextBoxCursorBlinkInterval + 1]
+ dec a
+ ldh [hTextBoxCursorBlinkInterval + 1], a
+ ret nz
+ ld a, $06
+ ldh [hTextBoxCursorBlinkInterval + 1], a ; reset to 0x6FF iterations
+ ld a, "▼"
+ ld [hl], a
+ ret
diff --git a/home/lcd.asm b/home/lcd.asm
index 6641f05..e915806 100644
--- a/home/lcd.asm
+++ b/home/lcd.asm
@@ -3,78 +3,78 @@ INCLUDE "constants.asm"
SECTION "LCD functions", ROM0[$3AE]
LCD:: ; 03ae
- push af
- ldh a, [hLCDCPointer]
- and a
- jr z, .done
- push hl
- rla
- jr c, .try_hide_sprites
- ld a, [rLY]
- ld l, a
- ld h, HIGH(wLYOverrides)
- ld h, [hl]
- ldh a, [hLCDCPointer]
- ld l, a
- ld a, h
- ld h, $FF
- ld [hl], a
- pop hl
- pop af
- reti
+ push af
+ ldh a, [hLCDCPointer]
+ and a
+ jr z, .done
+ push hl
+ rla
+ jr c, .try_hide_sprites
+ ld a, [rLY]
+ ld l, a
+ ld h, HIGH(wLYOverrides)
+ ld h, [hl]
+ ldh a, [hLCDCPointer]
+ ld l, a
+ ld a, h
+ ld h, $FF
+ ld [hl], a
+ pop hl
+ pop af
+ reti
.try_hide_sprites
- ld a, [rLY]
- cp $80
- jr nz, .dont_hide
- ld hl, rLCDC
- res 1, [hl]
+ ld a, [rLY]
+ cp $80
+ jr nz, .dont_hide
+ ld hl, rLCDC
+ res 1, [hl]
.dont_hide
- pop hl
- pop af
- reti
+ pop hl
+ pop af
+ reti
- ; Seems unused?
- ldh a, [hSCX]
- ld [rSCX], a
- ldh a, [hSCY]
- ld [rSCY], a
- pop hl
+ ; Seems unused?
+ ldh a, [hSCX]
+ ld [rSCX], a
+ ldh a, [hSCY]
+ ld [rSCY], a
+ pop hl
.done
- pop af
- reti
+ pop af
+ reti
; 0:3e1
; TODO: can this be done using `sine_table`?
- db 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 3, 3, 2, 2, 1, 0, -1, -2, -2, -3, -3, -4, -4, -4, -4, -4, -3, -3, -2, -2, -1
+ db 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 3, 3, 2, 2, 1, 0, -1, -2, -2, -3, -3, -4, -4, -4, -4, -4, -3, -3, -2, -2, -1
DisableLCD:: ; 0401
- ld a, [rLCDC]
- bit 7, a
- ret z
- xor a
- ld [rIF], a
- ld a, [rIE]
- ld b, a
- res 0, a
- ld [rIE], a
+ ld a, [rLCDC]
+ bit 7, a
+ ret z
+ xor a
+ ld [rIF], a
+ ld a, [rIE]
+ ld b, a
+ res 0, a
+ ld [rIE], a
.wait
- ld a, [rLY]
- cp LY_VBLANK + 1
- jr nz, .wait
- ld a, [rLCDC]
- and $7F ; Shut LCD down
- ld [rLCDC], a
- xor a
- ld [rIF], a
- ld a, b
- ld [rIE], a
- ret
+ ld a, [rLY]
+ cp LY_VBLANK + 1
+ jr nz, .wait
+ ld a, [rLCDC]
+ and $7f ; Shut LCD down
+ ld [rLCDC], a
+ xor a
+ ld [rIF], a
+ ld a, b
+ ld [rIE], a
+ ret
EnableLCD:: ; 0423
- ld a, [rLCDC]
- set 7, a
- ld [rLCDC], a
- ret
+ ld a, [rLCDC]
+ set 7, a
+ ld [rLCDC], a
+ ret
diff --git a/home/names.asm b/home/names.asm
new file mode 100644
index 0000000..7ce5767
--- /dev/null
+++ b/home/names.asm
@@ -0,0 +1,23 @@
+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.
+ and a
+ ret z
+ push bc
+ ld b, a
+ ld c, "@"
+.readChar:
+ ld a, [hli]
+ cp c
+ jr nz, .readChar
+ dec b
+ jr nz, .readChar
+ pop bc
+ ret
diff --git a/home/oam_dma.asm b/home/oam_dma.asm
index d76df89..42ecaaf 100644
--- a/home/oam_dma.asm
+++ b/home/oam_dma.asm
@@ -3,23 +3,23 @@ INCLUDE "constants.asm"
SECTION "OAM DMA", ROMX[$4153],BANK[1]
WriteOAMDMACodeToHRAM:: ; 4153
- ld c, LOW(hOAMDMA)
- ld b, .OAMDMAEnd - .OAMDMA
- ld hl, .OAMDMA
+ ld c, LOW(hOAMDMA)
+ ld b, .OAMDMAEnd - .OAMDMA
+ ld hl, .OAMDMA
.loop
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- dec b
- jr nz, .loop
- ret
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ dec b
+ jr nz, .loop
+ ret
.OAMDMA ; 4161
- ld a, HIGH(wVirtualOAM)
- ldh [rDMA], a
- ld a, $28
+ ld a, HIGH(wVirtualOAM)
+ ldh [rDMA], a
+ ld a, $28
.wait
- dec a
- jr nz, .wait
- ret
+ dec a
+ jr nz, .wait
+ ret
.OAMDMAEnd ; 416b
diff --git a/home/pic.asm b/home/pic.asm
index 60dd6a3..04cf7bb 100644
--- a/home/pic.asm
+++ b/home/pic.asm
@@ -2,9 +2,9 @@ INCLUDE "constants.asm"
SECTION "Decompression Functions", ROM0[$095E]
+UncompressSpriteData:: ; 95e (0:95e)
; bankswitches and runs _UncompressSpriteData
; bank is given in a, sprite input stream is pointed to in wSpriteInputPtr
-UncompressSpriteData:: ; 95e (0:95e)
ld b, a
ldh a, [hROMBank]
push af
@@ -18,11 +18,11 @@ UncompressSpriteData:: ; 95e (0:95e)
call Bankswitch
ret
-; initializes necessary data to load a sprite and runs UncompressSpriteDataLoop
_UncompressSpriteData:: ; 976 (0:976)
+; initializes necessary data to load a sprite and runs UncompressSpriteDataLoop
ld hl, sSpriteBuffer1
- ld c, (2*SPRITEBUFFERSIZE) % $100
- ld b, (2*SPRITEBUFFERSIZE) / $100
+ ld c, (2 * SPRITEBUFFERSIZE) % $100
+ ld b, (2 * SPRITEBUFFERSIZE) / $100
xor a
call ByteFill
ld a, $01 ; next call to ReadNextInputBit will read byte
@@ -51,12 +51,12 @@ _UncompressSpriteData:: ; 976 (0:976)
ld [wSpriteLoadFlags], a ; initialite bit1 to 0 and bit0 to the first input bit
; this will load two chunks of data to sSpriteBuffer1 and sSpriteBuffer2
; bit 0 decides in which one the first chunk is placed
- ; fall through
+ ; fallthrough
+UncompressSpriteDataLoop::
; uncompresses a chunk from the sprite input data stream (pointed to at wSpriteInputPtr) into sSpriteBuffer1 or sSpriteBuffer2
; each chunk is a 1bpp sprite. A 2bpp sprite consist of two chunks which are merged afterwards
; note that this is an endless loop which is terminated during a call to MoveToNextBufferPosition by manipulating the stack
-UncompressSpriteDataLoop::
ld hl, sSpriteBuffer1
ld a, [wSpriteLoadFlags]
bit 0, a
@@ -143,10 +143,10 @@ UncompressSpriteDataLoop::
jr nz, .writeZerosLoop
jr .readNextInput
+MoveToNextBufferPosition:: ; a34 (0:a34)
; moves output pointer to next position
; also cancels the calling function if the all output is done (by removing the return pointer from stack)
; and calls postprocessing functions according to the unpack mode
-MoveToNextBufferPosition:: ; a34 (0:a34)
ld a, [wSpriteHeight]
ld b, a
ld a, [wSpriteCurPosY]
@@ -206,8 +206,8 @@ MoveToNextBufferPosition:: ; a34 (0:a34)
.done
jp UnpackSprite
-; writes 2 bits (from a) to the output buffer (pointed to from wSpriteOutputPtr)
WriteSpriteBitsToBuffer:: ; aa5 (0:aa5)
+; writes 2 bits (from a) to the output buffer (pointed to from wSpriteOutputPtr)
ld e, a
ld a, [wSpriteOutputBitOffset]
and a
@@ -234,8 +234,8 @@ WriteSpriteBitsToBuffer:: ; aa5 (0:aa5)
ld [hl], a
ret
-; reads next bit from input stream and returns it in a
ReadNextInputBit:: ; acc (0:acc)
+; reads next bit from input stream and returns it in a
ld a, [wSpriteInputBitCounter]
dec a
jr nz, .curByteHasMoreBitsToRead
@@ -250,8 +250,8 @@ ReadNextInputBit:: ; acc (0:acc)
and $01
ret
-; reads next byte from input stream and returns it in a
ReadNextInputByte: ; ae7 (0:ae7)
+; reads next byte from input stream and returns it in a
ld a, [wSpriteInputPtr]
ld l, a
ld a, [wSpriteInputPtr + 1]
@@ -265,8 +265,8 @@ ReadNextInputByte: ; ae7 (0:ae7)
ld a, b
ret
-; the nth item is 2^n - 1
LengthEncodingOffsetList::
+; the nth item is 2^n - 1
dw %0000000000000001
dw %0000000000000011
dw %0000000000000111
@@ -284,8 +284,8 @@ LengthEncodingOffsetList::
dw %0111111111111111
dw %1111111111111111
-; unpacks the sprite data depending on the unpack mode
UnpackSprite:: ; b1b (0:b1b)
+; unpacks the sprite data depending on the unpack mode
ld a, [wSpriteUnpackMode]
cp $02
jp z, UnpackSpriteMode2
@@ -294,11 +294,11 @@ UnpackSprite:: ; b1b (0:b1b)
ld hl, sSpriteBuffer1
call SpriteDifferentialDecode
ld hl, sSpriteBuffer2
- ; fall through
+ ; fallthrough
+SpriteDifferentialDecode::
; decodes differential encoded sprite data
; input bit value 0 preserves the current bit value and input bit value 1 toggles it (starting from initial value 0).
-SpriteDifferentialDecode::
xor a
ld [wSpriteCurPosX], a
ld [wSpriteCurPosY], a
@@ -382,8 +382,8 @@ SpriteDifferentialDecode::
ld [wSpriteCurPosY], a
ret
-; decodes the nybble stored in a. Last decoded data is assumed to be in e (needed to determine if initial value is 0 or 1)
DifferentialDecodeNybble:: ; bc9 (0:bc9)
+; decodes the nybble stored in a. Last decoded data is assumed to be in e (needed to determine if initial value is 0 or 1)
srl a ; c=a%2, a/=2
ld c, $00
jr nc, .evenNumber
@@ -462,8 +462,8 @@ DecodeNybble1TableFlipped::
dn $e, $6
dn $2, $a
-; combines the two loaded chunks with xor (the chunk loaded second is the destination). The source chunk is differentially decoded beforehand.
XorSpriteChunks:: ; c23 (0:c23)
+; combines the two loaded chunks with xor (the chunk loaded second is the destination). The source chunk is differentially decoded beforehand.
xor a
ld [wSpriteCurPosX], a
ld [wSpriteCurPosY], a
@@ -527,8 +527,8 @@ XorSpriteChunks:: ; c23 (0:c23)
ld [wSpriteCurPosX], a
ret
-; reverses the bits in the nybble given in register a
ReverseNybble:: ; c93 (0:c93)
+; reverses the bits in the nybble given in register a
ld de, NybbleReverseTable
add e
ld e, a
@@ -538,8 +538,8 @@ ReverseNybble:: ; c93 (0:c93)
ld a, [de]
ret
-; resets sprite buffer pointers to buffer 1 and 2, depending on wSpriteLoadFlags
ResetSpriteBufferPointers:: ; c9d (0:c9d)
+; resets sprite buffer pointers to buffer 1 and 2, depending on wSpriteLoadFlags
ld a, [wSpriteLoadFlags]
bit 0, a
jr nz, .buffer2Selected
@@ -564,8 +564,8 @@ ResetSpriteBufferPointers:: ; c9d (0:c9d)
NybbleReverseTable::
db $0, $8, $4, $c, $2, $a, $6 ,$e, $1, $9, $5, $d, $3, $b, $7 ,$f
-; combines the two loaded chunks with xor (the chunk loaded second is the destination). Both chunks are differentially decoded beforehand.
UnpackSpriteMode2:: ; cd3 (0:cd3)
+; combines the two loaded chunks with xor (the chunk loaded second is the destination). Both chunks are differentially decoded beforehand.
call ResetSpriteBufferPointers
ld a, [wSpriteFlipped]
push af
@@ -581,8 +581,8 @@ UnpackSpriteMode2:: ; cd3 (0:cd3)
ld [wSpriteFlipped], a
jp XorSpriteChunks
-; stores hl into the output pointers
StoreSpriteOutputPointer:: ; cf3 (0:cf3)
+; stores hl into the output pointers
ld a, l
ld [wSpriteOutputPtr], a
ld [wSpriteOutputPtrCached], a
diff --git a/home/pokemon.asm b/home/pokemon.asm
index 1f51f8e..f990393 100644
--- a/home/pokemon.asm
+++ b/home/pokemon.asm
@@ -5,10 +5,10 @@ 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:
; [wcb5b] = pokemon ID in dex order
-GetMonHeader:: ; 3a4b (0:3a4b)
push bc
push de
push hl
@@ -29,7 +29,7 @@ GetMonHeader:: ; 3a4b (0:3a4b)
jr .done
.egg
ld de, EggPicFront
- ld b, $55 ; egg sprite dimension
+ ln b, 5, 5 ; egg sprite dimension
ld hl, wMonHSpriteDim
ld [hl], b
ld hl, wMonHFrontSprite
@@ -53,10 +53,10 @@ else
SECTION "3AED", ROM0[$3AB1]
endc
+UncompressMonSprite:: ; 3aed (0:3aed)
; Uncompresses the front or back sprite of the specified mon
; assumes the corresponding mon header is already loaded
; hl contains offset to sprite pointer ($b for front or $d for back)
-UncompressMonSprite:: ; 3aed (0:3aed)
ld a, [wMonDexIndex]
and a
ret z
@@ -104,12 +104,12 @@ UncompressMonSprite:: ; 3aed (0:3aed)
ld a, BANK(AnnonPics)
jp UncompressSpriteData
-; Uncompress Pokémon Front Srite for
+LoadMonFrontSprite:: ; 3b3f
+; Uncompress Pokémon Front Sprite for
; mon currently loaded in wMonHeader
; to 0x9000
; de: destination location
; returns the sprite dimension in c
-LoadMonFrontSprite:: ; 3b3f
push de
ld hl, wMonHFrontSprite - wMonHeader
call UncompressMonSprite
@@ -117,13 +117,13 @@ LoadMonFrontSprite:: ; 3b3f
ld a, [hl]
ld c, a
pop de
- ; fall through
-
+ ; fallthrough
+
+LoadUncompressedSpriteData:: ; 3b4c (0:3b4c)
; postprocesses uncompressed sprite chunks to a 2bpp sprite and loads it into video ram
; calculates alignment parameters to place both sprite chunks in the center of the 7*7 tile sprite buffers
; de: destination location
; a,c: sprite dimensions (in tiles of 8x8 each)
-LoadUncompressedSpriteData:: ; 3b4c (0:3b4c)
push de
and $0f
ldh [hSpriteWidth], a ; each byte contains 8 pixels (in 1bpp), so tiles=bytes for width
@@ -172,15 +172,15 @@ LoadUncompressedSpriteData:: ; 3b4c (0:3b4c)
call InterlaceMergeSpriteBuffers
ret
-; fills the sprite buffer (pointed to in hl) with zeros
ZeroSpriteBuffer:: ; 3ba1 (0:3ba1)
+; fills the sprite buffer (pointed to in hl) with zeros
ld bc, SPRITEBUFFERSIZE
xor a
jp ByteFill
+AlignSpriteDataCentered:: ; 3ba8 (0:3ba8)
; copies and aligns the sprite data properly inside the sprite buffer
; sprite buffers are 7*7 tiles in size, the loaded sprite is centered within this area
-AlignSpriteDataCentered:: ; 3ba8 (0:3ba8)
ldh a, [hSpriteOffset]
ld c, a
ld b, $00
@@ -206,28 +206,28 @@ AlignSpriteDataCentered:: ; 3ba8 (0:3ba8)
jr nz, .columnLoop
ret
+InterlaceMergeSpriteBuffers:: ; 3bc6 (0:3bc6)
; combines the (7*7 tiles, 1bpp) sprite chunks in buffer 0 and 1 into a 2bpp sprite located in buffer 1 through 2
; in the resulting sprite, the rows of the two source sprites are interlaced
; de: output address
-InterlaceMergeSpriteBuffers:: ; 3bc6 (0:3bc6)
ld a, $00
call OpenSRAM
push de
call _InterlaceMergeSpriteBuffers
pop hl
ld de, sSpriteBuffer1
- ld c, (2*SPRITEBUFFERSIZE)/16 ; $31, number of 16 byte chunks to be copied
+ ld c, (2 * SPRITEBUFFERSIZE) / 16 ; $31, number of 16 byte chunks to be copied
ldh a, [hROMBank]
ld b, a
call CopyVideoDataOptimized
call CloseSRAM
ret
+_InterlaceMergeSpriteBuffers:: ; 3bdf (0:3bdf)
; actual implementation of InterlaceMergeSpriteBuffers
; sprite flipping is now done during interlace merge loop
; and not as second loop after regular interlace merge
; to save time
-_InterlaceMergeSpriteBuffers:: ; 3bdf (0:3bdf)
ld a, [wSpriteFlipped]
and a
jr nz, .flipped
@@ -271,7 +271,7 @@ _InterlaceMergeSpriteBuffers:: ; 3bdf (0:3bdf)
ld hl, sSpriteBuffer2 + (SPRITEBUFFERSIZE - 1) ; destination: end of buffer 2
ld de, sSpriteBuffer1 + (SPRITEBUFFERSIZE - 1) ; source 2: end of buffer 1
ld bc, sSpriteBuffer0 + (SPRITEBUFFERSIZE - 1) ; source 1: end of buffer 0
- ld a, SPRITEBUFFERSIZE/2 ; $c4
+ ld a, SPRITEBUFFERSIZE / 2 ; $c4
ldh [hSpriteInterlaceCounter], a
.interlaceLoopFlipped
ld a, [de]
diff --git a/home/predef.asm b/home/predef.asm
index a9ff091..e6d5019 100644
--- a/home/predef.asm
+++ b/home/predef.asm
@@ -7,43 +7,43 @@ SECTION "Predef", ROM0[$2FA2]
endc
Predef:: ; 2fde
- ld [wPredefID], a
- ldh a, [hROMBank]
- push af
- ld a, BANK(GetPredefPointer)
- call Bankswitch
- call GetPredefPointer
- call Bankswitch
- ld hl, .return
- push hl
- push de
- jr .get_regs
+ ld [wPredefID], a
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(GetPredefPointer)
+ call Bankswitch
+ call GetPredefPointer
+ call Bankswitch
+ ld hl, .return
+ push hl
+ push de
+ jr .get_regs
.return
- ld a, h
- ld [wPredefHL], a
- ld a, l
- ld [wPredefHL + 1], a
- pop hl
- ld a, h ; Could have used `pop af` instead
- call Bankswitch
- ld a, [wPredefHL]
- ld h, a
- ld a, [wPredefHL + 1]
- ld l, a
- ret
+ ld a, h
+ ld [wPredefHL], a
+ ld a, l
+ ld [wPredefHL + 1], a
+ pop hl
+ ld a, h ; Could have used `pop af` instead
+ call Bankswitch
+ ld a, [wPredefHL]
+ ld h, a
+ ld a, [wPredefHL + 1]
+ ld l, a
+ ret
.get_regs
- ld a, [wPredefHL]
- ld h, a
- ld a, [wPredefHL + 1]
- ld l, a
- ld a, [wPredefDE]
- ld d, a
- ld a, [wPredefDE + 1]
- ld e, a
- ld a, [wPredefBC]
- ld b, a
- ld a, [wPredefBC + 1]
- ld c, a
- ret
+ ld a, [wPredefHL]
+ ld h, a
+ ld a, [wPredefHL + 1]
+ ld l, a
+ ld a, [wPredefDE]
+ ld d, a
+ ld a, [wPredefDE + 1]
+ ld e, a
+ ld a, [wPredefBC]
+ ld b, a
+ ld a, [wPredefBC + 1]
+ ld c, a
+ ret
diff --git a/home/print_bcd.asm b/home/print_bcd.asm
new file mode 100644
index 0000000..4f647ff
--- /dev/null
+++ b/home/print_bcd.asm
@@ -0,0 +1,113 @@
+INCLUDE "constants.asm"
+
+if DEBUG
+SECTION "BCD Finalize", ROM0[$33a3]
+else
+SECTION "BCD Finalize", ROM0[$3367]
+endc
+
+PrintLetterDelay:: ; 33a3 (0:33a3)
+ ld a, [wce5f]
+ bit 4, a
+ ret nz
+ ld a, [wTextBoxFlags]
+ bit 1, a
+ ret z
+ push hl
+ push de
+ push bc
+ ld a, [wTextBoxFlags]
+ bit 0, a
+ jr z, .waitOneFrame
+ ld a, [wce5f]
+ and $07
+ jr .initFrameCnt
+.waitOneFrame
+ ld a, $01
+.initFrameCnt
+ ld [wVBlankJoyFrameCounter], a
+.checkButtons
+ call GetJoypad
+ ldh a, [hJoyState]
+.checkAButton
+ bit 0, a ; is the A button pressed?
+ jr z, .checkBButton
+ jr .endWait
+.checkBButton
+ bit 1, a ; is the B button pressed?
+ jr z, .buttonsNotPressed
+.endWait
+ call DelayFrame
+ jr .done
+.buttonsNotPressed ; if neither A nor B is pressed
+ ld a, [wVBlankJoyFrameCounter]
+ and a
+ jr nz, .checkButtons
+.done
+ pop bc
+ pop de
+ pop hl
+ ret
+; 0x33e3
+
+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
+; hl = destination address
+; c = flags and length
+; bit 7: if set, do not print leading zeroes
+; if unset, print leading zeroes
+; bit 6: if set, left-align the string (do not pad empty digits with spaces)
+; if unset, right-align the string
+; bits 0-5: length of BCD number in bytes
+; Note that bits 5 and 7 are modified during execution. The above reflects
+; their meaning at the beginning of the functions's execution.
+PrintBCDNumber:: ; 3ab2 (0:3ab2)
+ ld b, c ; save flags in b
+ res 7, c
+ res 6, c ; c now holds the length
+.loop
+ ld a, [de]
+ swap a
+ call PrintBCDDigit
+ ld a, [de]
+ call PrintBCDDigit
+ inc de
+ dec c
+ jr nz, .loop
+ bit 7, b ; were any non-zero digits printed?
+ jr z, .done
+.numberEqualsZero ; if every digit of the BCD number is zero
+ bit 6, b
+ jr nz, .skipRightAlignmentAdjustment
+ dec hl ; if the string is right-aligned, it needs
+.skipRightAlignmentAdjustment ;to be moved back one space
+ ld [hl], "0"
+ call PrintLetterDelay
+ inc hl
+.done
+ ret
+
+PrintBCDDigit:: ; 3ad5 (0:3ad5)
+ and $0f
+ and a
+ jr z, .zeroDigit
+ res 7, b ; unset 7 to indicate that a nonzero
+.outputDigit ; digit has been reached
+ add "0"
+ ld [hli], a
+ jp PrintLetterDelay
+.zeroDigit
+ bit 7, b ; either printing leading zeroes or
+ jr z, .outputDigit ; already reached a nonzero digit?
+ bit 6, b
+ ret nz ; left-align, don't pad with space
+ ld a, " "
+ ld [hli], a
+ ret
+; 0x3aed \ No newline at end of file
diff --git a/home/print_hex.asm b/home/print_hex.asm
new file mode 100644
index 0000000..993e210
--- /dev/null
+++ b/home/print_hex.asm
@@ -0,0 +1,42 @@
+INCLUDE "constants.asm"
+
+if DEBUG
+SECTION "Print Hexadecimal functions", ROM0[$3597]
+else
+SECTION "Print Hexadecimal functions", ROM0[$355B]
+endc
+
+PrintHexBytes: ; 3597 (0:3597)
+.loop
+ push bc
+ call PrintHexByte
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+PrintHexByte:: ; 35a0 (0:35a0)
+ ld a, [de]
+ swap a
+ and $0f
+ call PrintHexDigit
+ ld [hli], a
+ ld a, [de]
+ and $0f
+ call PrintHexDigit
+ ld [hli], a
+ inc de
+ ret
+
+PrintHexDigit: ; 35b2 (0:35b2)
+ ld bc, .hexDigitTable
+ add c
+ ld c, a
+ ld a, $00
+ adc b
+ ld b, a
+ ld a, [bc]
+ ret
+
+.hexDigitTable:
+ db "0123456789ABCDEF"
diff --git a/home/print_num.asm b/home/print_num.asm
new file mode 100644
index 0000000..3ae1c10
--- /dev/null
+++ b/home/print_num.asm
@@ -0,0 +1,252 @@
+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
+; de = address of number in little-endian format
+; hl = destination address
+; b = flags and length
+; bit 7: if set, do not print leading zeroes
+; if unset, print leading zeroes
+; bit 6: if set, left-align the string (do not pad empty digits with spaces)
+; if unset, right-align the string
+; bits 0-5: length of number in bytes
+; 01 - 1 byte
+; 02 - 2 bytes
+; <> - 3 bytes
+; c = number of digits from 2 to 7
+; For 1-digit numbers, add the value to char "0"
+; instead of calling PrintNumber.
+; This function works as follow
+; There are three temporary registers
+; - hPrintNumDividend,
+; - hPrintNumDivisor,
+; - hPrintNumTemp
+; All are three bytes long and organized in big-endian order.
+; To produce digits, PrintNumber is going to
+; 1. Store Input in hPrintNumDividend
+; 1a. Init hPrintNumLeadingDigit to zero (no prior leading digit)
+; 2. Repeatedly call .PrintDigit for required digits 7 thru 3:
+; 2a. Store divisor in hPrintNumDivisor
+; 2b. Divide dividend by divisor to get digit
+; 2c. hPrintNumTemp is used, because dividend < divisor might
+; not be immediately visible in byte-wise division
+; 2d. Update hPrintNumLeadingDigit in case digit > 0
+; 3. Perform the same operations for two digits as byte-wide operations
+; as opposed to three-byte-wide operations
+; 4. Check if at least one non-zero digit was printed, else print zero.
+; 5. Done.
+ push bc
+ xor a
+ ldh [hPrintNumLeadingDigit], a
+ ldh [hPrintNumDividend], a
+ ldh [hPrintNumDividend + 1], a
+ ld a, b
+ and $0f
+ cp $01
+ jr z, .byte
+ cp $02
+ jr z, .word
+ ld a, [de]
+ ldh [hPrintNumDividend], a
+ inc de
+ ld a, [de]
+ ldh [hPrintNumDividend + 1], a
+ inc de
+ ld a, [de]
+ ldh [hPrintNumDividend + 2], a
+ jr .start
+.word
+ ld a, [de]
+ ldh [hPrintNumDividend + 1], a
+ inc de
+ ld a, [de]
+ ldh [hPrintNumDividend + 2], a
+ jr .start
+.byte
+ ld a, [de]
+ ldh [hPrintNumDividend + 2], a
+.start
+ push de
+ ld d, b
+ ld a, c
+ ld b, a
+ xor a
+ ld c, a
+ ld a, b
+ cp $02
+ jr z, .two_digits
+ cp $03
+ jr z, .three_digits
+ cp $04
+ jr z, .four_digits
+ cp $05
+ jr z, .five_digits
+ cp $06
+ jr z, .six_digits
+.seven_digits
+ ld a, 1000000 / $10000 % $100
+ ldh [hPrintNumDivisor], a
+ ld a, 1000000 / $100 % $100
+ ldh [hPrintNumDivisor + 1], a
+ ld a, 1000000 % $100
+ ldh [hPrintNumDivisor + 2], a
+ call .PrintDigit
+ call .AdvancePointer
+.six_digits
+ ld a, 100000 / $10000 % $100
+ ldh [hPrintNumDivisor], a
+ ld a, 100000 / $100 % $100
+ ldh [hPrintNumDivisor + 1], a
+ ld a, 100000 % $100
+ ldh [hPrintNumDivisor + 2], a
+ call .PrintDigit
+ call .AdvancePointer
+.five_digits
+ xor a
+ ldh [hPrintNumDivisor], a
+ ld a, 10000 / $100
+ ldh [hPrintNumDivisor + 1], a
+ ld a, 10000 % $100
+ ldh [hPrintNumDivisor + 2], a
+ call .PrintDigit
+ call .AdvancePointer
+.four_digits
+ xor a
+ ldh [hPrintNumDivisor], a
+ ld a, 1000 / $100
+ ldh [hPrintNumDivisor + 1], a
+ ld a, 1000 % $100
+ ldh [hPrintNumDivisor + 2], a
+ call .PrintDigit
+ call .AdvancePointer
+.three_digits
+ xor a
+ ldh [hPrintNumDivisor], a
+ xor a
+ ldh [hPrintNumDivisor + 1], a
+ ld a, 100
+ ldh [hPrintNumDivisor + 2], a
+ call .PrintDigit
+ call .AdvancePointer
+.two_digits
+ ld c, $00
+ ldh a, [hPrintNumDividend + 2]
+.mod_10
+ cp $0a
+ jr c, .modded_10
+ sub $0a
+ inc c
+ jr .mod_10
+.modded_10
+ ld b, a
+ ldh a, [hPrintNumLeadingDigit]
+ or c
+ ldh [hPrintNumLeadingDigit], a
+ jr nz, .LeadingNonZero
+ call .PrintLeadingZero
+ jr .PrintLeastSignificantDigit
+.LeadingNonZero
+ ld a, "0"
+ add c
+ ld [hl], a
+.PrintLeastSignificantDigit
+ call .AdvancePointer
+ ld a, "0"
+ add b
+ ld [hli], a
+ pop de
+ pop bc
+ ret
+
+.PrintDigit: ; 3525 (0:3525)
+ ld c, $00
+.loop
+ ldh a, [hPrintNumDivisor]
+ ld b, a
+ ldh a, [hPrintNumDividend]
+ ldh [hPrintNumTemp], a ; store high byte in case dividend < divisor
+ cp b ; in subsequent bytes
+ jr c, .DividendLessThanDivisor ; dividend < divisor --> the digit is zero
+ sub b
+ ldh [hPrintNumDividend], a
+ ldh a, [hPrintNumDivisor + 1]
+ ld b, a
+ ldh a, [hPrintNumDividend + 1]
+ ldh [hPrintNumTemp + 1], a ; store mid byte in case dividend < divisor
+ cp b ; in subsequent byte
+ jr nc, .SubtractMidNoBorrow
+ ldh a, [hPrintNumDividend] ; try to borrow from upper byte
+ or $00
+ jr z, .DividendLessThanDivisorRestoreHigh ; can't borrow, because dividend < divisor
+ dec a
+ ldh [hPrintNumDividend], a
+ ldh a, [hPrintNumDividend + 1]
+.SubtractMidNoBorrow
+ sub b
+ ldh [hPrintNumDividend + 1], a
+ ldh a, [hPrintNumDivisor + 2]
+ ld b, a
+ ldh a, [hPrintNumDividend + 2]
+ ldh [hPrintNumTemp + 2], a ; store low byte in case dividend < divisor, which
+ cp b ; goes unused, because the algorithm doesn't
+ jr nc, .SubtractLoNoBorrow ; clobber hPrintNumDividend + 2 in that case
+ ldh a, [hPrintNumDividend + 1]
+ and a
+ jr nz, .SubtractLoBorrow
+ ldh a, [hPrintNumDividend] ; if mid byte == zero, we need to borrow from high
+ and a
+ jr z, .DividendLessThanDivisorRestoreMid
+.SubtractLoBorrowFromHigh
+ dec a
+ ldh [hPrintNumDividend], a
+ xor a
+.SubtractLoBorrow
+ dec a
+ ldh [hPrintNumDividend + 1], a
+ ldh a, [hPrintNumDividend + 2]
+.SubtractLoNoBorrow
+ sub b
+ ldh [hPrintNumDividend + 2], a
+ inc c
+ jr .loop
+.DividendLessThanDivisorRestoreMid
+ ldh a, [hPrintNumTemp + 1]
+ ldh [hPrintNumDividend + 1], a
+.DividendLessThanDivisorRestoreHigh
+ ldh a, [hPrintNumTemp]
+ ldh [hPrintNumDividend], a
+.DividendLessThanDivisor
+ ldh a, [hPrintNumLeadingDigit]
+ or c
+ jr z, .PrintLeadingZero
+ ld a, "0"
+ add c
+ ld [hl], a
+ ldh [hPrintNumLeadingDigit], a
+ ret
+.PrintLeadingZero:
+; prints a leading zero unless they are turned off in the flags
+ bit 7, d
+ ret z
+ ld [hl], "0"
+ ret
+
+.AdvancePointer: ; 3589 (0:3589)
+; increments the pointer unless leading zeroes are not being printed,
+; the number is left-aligned, and no nonzero digits have been printed yet
+ bit 7, d ; print leading zeroes?
+ jr nz, .inc
+ bit 6, d ; left alignment or right alignment?
+ jr z, .inc
+ ldh a, [hPrintNumLeadingDigit]
+ and a
+ ret z ; don't advance if leading digit is zero
+.inc
+ inc hl
+ ret
diff --git a/home/serial.asm b/home/serial.asm
index 61510b0..48d6832 100644
--- a/home/serial.asm
+++ b/home/serial.asm
@@ -3,53 +3,52 @@ INCLUDE "constants.asm"
SECTION "Serial handler", ROM0[$602]
Serial::
- push af
- push bc
- push de
- push hl
- ldh a, [hLinkPlayerNumber]
- inc a
- jr z, .init_player_number
+ push af
+ push bc
+ push de
+ push hl
+ ldh a, [hLinkPlayerNumber]
+ inc a
+ jr z, .init_player_number
- ld a, [rSB]
- ldh [hSerialReceive], a
- ldh a, [hSerialSend]
- ld [rSB], a
- ldh a, [hLinkPlayerNumber]
- cp 2
- jr z, .done
- ld a, 1 << rSC_ON
- ld [rSC], a
- jr .done
+ ld a, [rSB]
+ ldh [hSerialReceive], a
+ ldh a, [hSerialSend]
+ ld [rSB], a
+ ldh a, [hLinkPlayerNumber]
+ cp 2
+ jr z, .done
+ ld a, 1 << rSC_ON
+ ld [rSC], a
+ jr .done
.init_player_number
- ld a, [rSB]
- ldh [hSerialReceive], a
- ldh [hLinkPlayerNumber], a
- cp 2
- jr z, .master
- xor a
- ld [rSB], a
- ld a, 3
- ld [rDIV], a
+ ld a, [rSB]
+ ldh [hSerialReceive], a
+ ldh [hLinkPlayerNumber], a
+ cp 2
+ jr z, .master
+ xor a
+ ld [rSB], a
+ ld a, 3
+ ld [rDIV], a
.wait
- ld a, [rDIV]
- bit 7, a
- jr nz, .wait
- ld a, 1 << rSC_ON
- ld [rSC], a
- jr .done
+ ld a, [rDIV]
+ bit 7, a
+ jr nz, .wait
+ ld a, 1 << rSC_ON
+ ld [rSC], a
+ jr .done
.master
- xor a
- ld [rSB], a
-
+ xor a
+ ld [rSB], a
.done
- ld a, 1
- ldh [hSerialReceived], a
- ld a, SERIAL_NO_DATA_BYTE
- ldh [hSerialSend], a
- pop hl
- pop de
- pop bc
- pop af
- reti
+ ld a, 1
+ ldh [hSerialReceived], a
+ ld a, SERIAL_NO_DATA_BYTE
+ ldh [hSerialSend], a
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
diff --git a/home/sram.asm b/home/sram.asm
index 03d4411..87f2335 100644
--- a/home/sram.asm
+++ b/home/sram.asm
@@ -7,19 +7,19 @@ SECTION "SRAM functions", ROM0[$326B]
endc
OpenSRAM:: ; 32a7
- push af
- ld a, 1
- ld [MBC3LatchClock], a
- ld a, SRAM_ENABLE
- ld [MBC3SRamEnable], a
- pop af
- ld [MBC3SRamBank], a
- ret
+ push af
+ ld a, 1
+ ld [MBC3LatchClock], a
+ ld a, SRAM_ENABLE
+ ld [MBC3SRamEnable], a
+ pop af
+ ld [MBC3SRamBank], a
+ ret
CloseSRAM:: ; 32b7
- push af
- ld a, SRAM_DISABLE
- ld [MBC3LatchClock], a
- ld [MBC3SRamEnable], a
- pop af
- ret
+ push af
+ ld a, SRAM_DISABLE
+ ld [MBC3LatchClock], a
+ ld [MBC3SRamEnable], a
+ pop af
+ ret
diff --git a/home/text.asm b/home/text.asm
new file mode 100644
index 0000000..83bbd42
--- /dev/null
+++ b/home/text.asm
@@ -0,0 +1,368 @@
+INCLUDE "constants.asm"
+
+SECTION "Text Commands", ROM0[$107e]
+
+ScrollTextUpOneLine:: ; 107e (0:107e)
+; move both rows of text in the normal text box up one row
+; always called twice in a row
+; first time, copy the two rows of text to the "in between" rows that are usually emtpy
+; second time, copy the bottom row of text into the top row of text
+ coord hl, TEXTBOX_X, TEXTBOX_INNERY ; top row of text
+ coord de, TEXTBOX_X, TEXTBOX_INNERY - 1 ; empty line above text
+ ld b, TEXTBOX_WIDTH * 3
+.copyText
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .copyText
+ coord hl, TEXTBOX_INNERX, TEXTBOX_INNERY + 2
+ ld a, " "
+ ld b, TEXTBOX_INNERW
+.clearText
+ ld [hli], a
+ dec b
+ jr nz, .clearText
+ ld b, $05 ; wait five frames
+.waitFrame
+ call DelayFrame
+ dec b
+ jr nz, .waitFrame
+ ret
+
+ProtectedWaitBGMap:: ; 10a0 (0:10a0)
+ push bc
+ call WaitBGMap
+ pop bc
+ ret
+
+TextCommandProcessor:: ; 10a6 (0:10a6)
+; Process a string of text commands
+; at hl and write text to bc
+ ld a, [wTextBoxFlags]
+ push af
+ set 1, a
+ ld [wTextBoxFlags], a
+ ld a, c
+ ld [wTextDest], a
+ ld a, b
+ ld [wTextDest + 1], a
+ ; fall through
+
+NextTextCommand:: ; 10b7 (0:10b7)
+ ld a, [hli]
+ cp "@" ; terminator
+ jr nz, .doTextCommand
+ pop af
+ ld [wTextBoxFlags], a
+ ret
+.doTextCommand
+ push hl
+ ld hl, TextCommands
+ push bc
+ add a
+ ld b, $00
+ ld c, a
+ add hl, bc
+ pop bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+Text_TX_BOX:: ; 10d0 (0:10d0)
+; TX_BOX
+; draw a box
+; little endian
+; [$04][addr][height][width]
+ pop hl
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld c, a
+ push hl
+ ld h, d
+ ld l, e
+ call DrawTextBox
+ pop hl
+ jr NextTextCommand
+
+Text_TX:: ; 10e2 (0:10e2)
+; TX
+; write text until "@"
+; [$00]["...@"]
+ pop hl
+ ld d, h
+ ld e, l
+ ld h, b
+ ld l, c
+ call PlaceString
+ ld h, d
+ ld l, e
+ inc hl
+ jr NextTextCommand
+
+Text_TX_RAM:: ; 10ef (0:10ef)
+; text_from_ram
+; write text from a ram address
+; little endian
+; [$01][addr]
+ pop hl
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ push hl
+ ld h, b
+ ld l, c
+ call PlaceString
+ pop hl
+ jr NextTextCommand
+
+Text_TX_BCD:: ; 10fd (0:10fd)
+; TX_BCD
+; write bcd from address, typically ram
+; [$02][addr][flags]
+; flags: see PrintBCDNumber
+ pop hl
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ push hl
+ ld h, b
+ ld l, c
+ ld c, a
+ call PrintBCDNumber
+ ld b, h
+ ld c, l
+ pop hl
+ jr NextTextCommand
+
+Text_TX_MOVE:: ; 110f (0:110f)
+; TX_MOVE
+; move to a new tile
+; [$03][addr]
+ pop hl
+ ld a, [hli]
+ ld [wTextDest], a
+ ld c, a
+ ld a, [hli]
+ ld [wTextDest + 1], a
+ ld b, a
+ jp NextTextCommand
+
+Text_TX_LOW:: ; 111d (0:111d)
+; TX_LOW
+; write text at (1,16)
+; [$05]
+ pop hl
+ coord bc, TEXTBOX_INNERX, TEXTBOX_INNERY + 2
+ jp NextTextCommand
+; 0x1124
+
+Text_WAIT_BUTTON:: ; 1124 (0:1124)
+; TX_WAITBUTTON
+; wait for button press
+; show arrow
+; [06]
+ ld a, [wLinkMode]
+ cp $03
+ jp z, Text_TX_LINK_WAIT_BUTTON
+ ld a, "▼"
+ ldcoord_a TEXTBOX_WIDTH - 2, TEXTBOX_Y + TEXTBOX_HEIGHT - 1
+ push bc
+ call ButtonSound
+ pop bc
+ ld a, "─"
+ ldcoord_a TEXTBOX_WIDTH - 2, TEXTBOX_Y + TEXTBOX_HEIGHT - 1
+ pop hl
+ jp NextTextCommand
+
+Text_TX_SCROLL:: ; 113f (0:113f)
+; TX_SCROLL
+; pushes text up two lines and sets the BC cursor to the border tile
+; below the first character column of the text box.
+; [07]
+ ld a, "─"
+ ldcoord_a TEXTBOX_WIDTH - 2, TEXTBOX_Y + TEXTBOX_HEIGHT - 1
+ call ScrollTextUpOneLine
+ call ScrollTextUpOneLine
+ pop hl
+ coord bc, TEXTBOX_INNERX, TEXTBOX_INNERY + 2
+ jp NextTextCommand
+
+Text_START_ASM:: ; 1151 (0:1151)
+; TX_ASM
+; Executes code following this command.
+; Text processing is resumed upon returning.
+; [08][asm...ret]
+ pop hl
+ ld de, NextTextCommand
+ push de
+ jp hl
+
+Text_TX_NUM:: ; 1157 (0:1157)
+; TX_NUM
+; [$09][addr][hi:bytes lo:digits]
+ pop hl
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ push hl
+ ld h, b
+ ld l, c
+ ld b, a
+ and $0f
+ ld c, a
+ ld a, b
+ and $f0
+ swap a
+ set 6, a
+ ld b, a
+ call PrintNumber
+ ld b, h
+ ld c, l
+ pop hl
+ jp NextTextCommand
+; 0x1175
+
+Text_TX_EXIT: ; 1175 (0:1175)
+; TX_EXIT
+; [$0A]
+ push bc
+ call GetJoypad
+ ldh a, [hJoyState]
+ and (A_BUTTON | B_BUTTON)
+ jr nz, .done
+ ld c, 30
+ call DelayFrames
+.done
+ pop bc
+ pop hl
+ jp NextTextCommand
+; 0x1189
+
+Text_PlaySound:: ; 1189 (0:1189)
+; Text_PlaySound
+; [0B|0E..13] Play Sound Effects
+; [14..16] Play Pokémon Cries
+ pop hl
+ push bc
+ dec hl
+ ld a, [hli]
+ ld b, a
+ push hl
+ ld hl, .soundTable
+.loop
+ ld a, [hli]
+ cp b
+ jr z, .found
+ inc hl
+ inc hl
+ jr .loop
+.found
+ cp $14
+ jr z, .playCry
+ cp $15
+ jr z, .playCry
+ cp $16
+ jr z, .playCry
+ push de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ call PlaySFX
+ call WaitSFX
+ pop de
+ pop hl
+ pop bc
+ jp NextTextCommand
+.playCry
+ push de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ call PlayCry
+ pop de
+ pop hl
+ pop bc
+ jp NextTextCommand
+
+.soundTable:
+ dbw TX_SOUND_0B, $0063
+ dbw TX_SOUND_12, $006B
+ dbw TX_SOUND_0E, $0066
+ dbw TX_SOUND_0F, $0067
+ dbw TX_SOUND_10, $0068
+ dbw TX_SOUND_11, $0069
+ dbw TX_SOUND_13, $0027
+ dbw TX_CRY_14, MON_NIDORINA ; or MON_LEAFY?
+ dbw TX_CRY_15, MON_PIGEOT
+ dbw TX_CRY_16, MON_JUGON
+
+Text_TX_DOTS: ; 11e1 (0:11e1)
+ pop hl
+ ld a, [hli]
+ ld d, a
+ push hl
+ ld h, b
+ ld l, c
+.loop
+ ld a, "…"
+ ld [hli], a
+ push de
+ call GetJoypad
+ pop de
+ ldh a, [hJoyState]
+ and (A_BUTTON | B_BUTTON)
+ jr nz, .next
+ ld c, 10
+ call DelayFrames
+.next
+ dec d
+ jr nz, .loop
+ ld b, h
+ ld c, l
+ pop hl
+ jp NextTextCommand
+
+Text_TX_LINK_WAIT_BUTTON:: ; 1203 (0:1203)
+ push bc
+ call ButtonSound
+ pop bc
+ pop hl
+ jp NextTextCommand
+; 0x120c
+
+TextCommands:: ; 120c
+ dw Text_TX
+ dw Text_TX_RAM
+ dw Text_TX_BCD
+ dw Text_TX_MOVE
+ dw Text_TX_BOX
+ dw Text_TX_LOW
+ dw Text_WAIT_BUTTON
+ dw Text_TX_SCROLL
+ dw Text_START_ASM
+ dw Text_TX_NUM
+ dw Text_TX_EXIT
+ dw Text_PlaySound
+ dw Text_TX_DOTS
+ dw Text_TX_LINK_WAIT_BUTTON
+ dw Text_PlaySound
+ dw Text_PlaySound
+ dw Text_PlaySound
+ dw Text_PlaySound
+ dw Text_PlaySound
+ dw Text_PlaySound
+ dw Text_PlaySound
+ dw Text_PlaySound
+ dw Text_PlaySound
diff --git a/home/unknown.asm b/home/unknown.asm
index c216f62..5b9a6e1 100644
--- a/home/unknown.asm
+++ b/home/unknown.asm
@@ -7,10 +7,10 @@ SECTION "Empty function", ROM0[$2F5B]
endc
InexplicablyEmptyFunction:: ; 2f97
-REPT 16
- nop
-ENDR
- ret
+rept 16
+ nop
+endr
+ ret
; TODO:
@@ -21,14 +21,14 @@ ENDR
SECTION "Unknown functions", ROM0[$1FF4]
_1FF4:: ; 1ff4
- ld a, BANK(s0_a600)
- call OpenSRAM
- ld hl, s0_a600 ; TODO: label this.
- ld bc, 7
- xor a
- call ByteFill
- call CloseSRAM
- ret
+ ld a, BANK(s0_a600)
+ call OpenSRAM
+ ld hl, s0_a600 ; TODO: label this.
+ ld bc, 7
+ xor a
+ call ByteFill
+ call CloseSRAM
+ ret
_2007:: ; 2007
ld a, BANK(s0_a600)
@@ -65,13 +65,13 @@ if DEBUG
._209e:
endc
- ld hl, hHours
+ ld hl, hRTCHours
ld de, wcbd2
call _20DC
- ld hl, hMinutes
+ ld hl, hRTCMinutes
ld de, wcbd2 + 3
call _20DC
- ldh a, [hDays]
+ ldh a, [hRTCDays]
and 7
add $71 ; Sunday
ld [wcbd2 + 6], a
@@ -79,7 +79,7 @@ endc
ld [wcbd2 + 9], a
inc a ; mobile
ld [wcbd2 + 11], a
- ldh a, [hSeconds]
+ ldh a, [hRTCSeconds]
and 1
ret z
ld a, $70 ; :
diff --git a/home/vblank.asm b/home/vblank.asm
index 334cef4..33bbd40 100644
--- a/home/vblank.asm
+++ b/home/vblank.asm
@@ -3,29 +3,298 @@ INCLUDE "constants.asm"
SECTION "VBlank handler", ROM0[$150]
VBlank:: ; 0150
- push af
- push bc
- push de
- push hl
- ldh a, [hVBlank]
- and 3
- ld e, a
- ld d, 0
- ld hl, .blanks
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld de, .return
- push de
- jp hl
+ push af
+ push bc
+ push de
+ push hl
+ ldh a, [hVBlank]
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, .blanks
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, .return
+ push de
+ jp hl
.return
- pop hl
- pop de
- pop bc
- pop af
- reti
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
.blanks
- ; TODO
+ dw VBlank0
+ dw VBlank1
+ dw VBlank2
+ dw VBlank3
+
+VBlank0:: ; 175 (0:175)
+; rng
+; scx, scy, wy, wx
+; bg map
+; row/column redraw
+; copy 2bpp
+; copy 1bpp
+; animate tileset
+; copy far 2bpp
+; enable oam sprites
+; oam
+; joypad
+; sound / serial / lcd_stat
+ ldh a, [hVBlankCounter]
+ inc a
+ ldh [hVBlankCounter], a
+ bit 0, a
+ jr nz, .even_frame
+ ldh a, [hRTCRandom]
+ ld b, a
+ ldh a, [rLY]
+ adc b
+.even_frame
+ ; advance random variables
+ ld b, a
+ ldh a, [hRandomAdd]
+ adc b
+ ldh [hRandomAdd], a
+ ld b, a
+ ldh a, [hRandomSub]
+ sbc b
+ ldh [hRandomSub], a
+ ldh a, [hRTCSeconds]
+ ldh [hRTCRandom], a
+ ldh a, [hROMBank]
+ ld [wVBlankSavedROMBank], a
+ ldh a, [hSCX]
+ ldh [rSCX], a
+ ldh a, [hSCY]
+ ldh [rSCY], a
+ ld a, [wDisableVBlankWYUpdate]
+ and a
+ jr nz, .ok
+ ldh a, [hWY]
+ ldh [rWY], a
+ ldh a, [hWX]
+ ldh [rWX], a
+.ok
+ call AutoBgMapTransfer
+ call RedrawRowOrColumn
+ call VBlankCopy
+ call VBlankCopyDouble
+ call AnimateTileset
+ call VBlankCopyFar
+ call EnableSprites
+ call hOAMDMA
+ xor a
+ ld [wVBlankOccurred], a
+ ld a, [wVBlankJoyFrameCounter]
+ and a
+ jr z, .skipDec
+ dec a
+ ld [wVBlankJoyFrameCounter], a
+.skipDec
+ call Joypad
+ xor a
+ ldh [rIF], a
+ ld a, (1 << SERIAL | 1 << LCD_STAT)
+ ldh [rIE], a
+ ld a, (1 << LCD_STAT)
+ ldh [rIF], a
+ ei
+ call UpdateSound
+ ld a, [wVBlankSavedROMBank]
+ call Bankswitch
+ di
+ xor a
+ ldh [rIF], a
+ ld a, (1 << JOYPAD | 1 << SERIAL | 1 << TIMER | 1 << LCD_STAT | 1 << VBLANK)
+ ldh [rIE], a
+ ret
+
+VBlank1:: ; 1f6 (0:1f6)
+; Simple VBlank
+;
+; scx, scy
+; dmg pals
+; bg map
+; copy 2bpp
+; oam
+; sound / lcd_stat
+; no counters!
+ ldh a, [hROMBank]
+ ld [wVBlankSavedROMBank], a
+ ldh a, [hSCX]
+ ldh [rSCX], a
+ ldh a, [hSCY]
+ ldh [rSCY], a
+ ld a, [wBGP]
+ ldh [rBGP], a
+ ld a, [wOBP0]
+ ldh [rOBP0], a
+ ld a, [wOBP1]
+ ldh [rOBP1], a
+ call AutoBgMapTransfer
+ call VBlankCopy
+ ld a, [wDisableVBlankOAMUpdate]
+ and a
+ jr nz, .skip_oam
+ call hOAMDMA
+.skip_oam
+ xor a
+ ld [wVBlankOccurred], a
+ xor a
+ ldh [rIF], a
+ ld a, (1 << LCD_STAT)
+ ldh [rIE], a
+ ldh [rIF], a
+ ei
+ call UpdateSound
+ ld a, [wVBlankSavedROMBank]
+ call Bankswitch
+ di
+ xor a
+ ldh [rIF], a
+ ld a, (1 << JOYPAD | 1 << SERIAL | 1 << TIMER | 1 << LCD_STAT | 1 << VBLANK)
+ ldh [rIE], a
+ ret
+
+VBlank2:: ; 241 (0:241)
+; rng
+; scx, scy, wy, wx
+; joypad
+; bg map
+; row/column redraw
+; copy 2bpp
+; copy 1bpp
+; copy far 2bpp
+; oam
+; sound
+ ldh a, [hVBlankCounter]
+ inc a
+ ldh [hVBlankCounter], a
+ bit 0, a
+ jr nz, .even_frame
+ ldh a, [rLY]
+.even_frame
+ ; advance random variables
+ ld b, a
+ ldh a, [hRandomAdd]
+ adc b
+ ldh [hRandomAdd], a
+ ld b, a
+ ldh a, [hRandomSub]
+ sbc b
+ ldh [hRandomSub], a
+ call Joypad
+ ldh a, [hROMBank]
+ ld [wVBlankSavedROMBank], a
+ ldh a, [hSCX]
+ ldh [rSCX], a
+ ldh a, [hSCY]
+ ldh [rSCY], a
+ ld a, [wDisableVBlankWYUpdate]
+ and a
+ jr nz, .ok
+ ldh a, [hWY]
+ ldh [rWY], a
+ ldh a, [hWX]
+ ldh [rWX], a
+.ok
+ call AutoBgMapTransfer
+ call RedrawRowOrColumn
+ call VBlankCopy
+ call VBlankCopyDouble
+ call VBlankCopyFar
+ call hOAMDMA
+ xor a
+ ld [wVBlankOccurred], a
+ ld a, [wVBlankJoyFrameCounter]
+ and a
+ jr z, .skipDec
+ dec a
+ ld [wVBlankJoyFrameCounter], a
+.skipDec
+ call UpdateSound
+ ld a, [wVBlankSavedROMBank]
+ call Bankswitch
+ ret
+
+VBlank3:: ; 2a0 (0:2a0)
+; rng
+; joypad
+; scx, scy, wy, wx
+; bg map
+; row/column redraw
+; copy 2bpp
+; copy 1bpp
+; animate tileset
+; copy far 2bpp
+; enable oam sprites
+; oam
+; sound / lcd_stat
+ ldh a, [hVBlankCounter]
+ inc a
+ ldh [hVBlankCounter], a
+ bit 0, a
+ jr nz, .even_frame
+ ldh a, [rLY]
+.even_frame
+ ld b, a
+ ldh a, [hRandomAdd]
+ adc b
+ ldh [hRandomAdd], a
+ ld b, a
+ ldh a, [hRandomSub]
+ sbc b
+ ldh [hRandomSub], a
+ call Joypad
+ ldh a, [hROMBank]
+ ld [wVBlankSavedROMBank], a
+ ldh a, [hSCX]
+ ldh [rSCX], a
+ ldh a, [hSCY]
+ ldh [rSCY], a
+ ld a, [wDisableVBlankWYUpdate]
+ and a
+ jr nz, .ok
+ ldh a, [hWY]
+ ldh [rWY], a
+ ldh a, [hWX]
+ ldh [rWX], a
+.ok
+ call AutoBgMapTransfer
+ call RedrawRowOrColumn
+ call VBlankCopy
+ call VBlankCopyDouble
+ call AnimateTileset
+ call VBlankCopyFar
+ call EnableSprites
+ call hOAMDMA
+ xor a
+ ld [wVBlankOccurred], a
+ ld a, [wVBlankJoyFrameCounter]
+ and a
+ jr z, .skipDec
+ dec a
+ ld [wVBlankJoyFrameCounter], a
+.skipDec
+ xor a
+ ldh [rIF], a
+ ld a, (1 << LCD_STAT)
+ ldh [rIE], a
+ ldh [rIF], a
+ ei
+ call UpdateSound
+ ld a, [wVBlankSavedROMBank]
+ call Bankswitch
+ di
+ xor a
+ ldh [rIF], a
+ ld a, (1 << JOYPAD | 1 << SERIAL | 1 << TIMER | 1 << LCD_STAT | 1 << VBLANK)
+ ldh [rIE], a
+ ret
+; 0x317
diff --git a/home/vcopy.asm b/home/vcopy.asm
new file mode 100644
index 0000000..a453da5
--- /dev/null
+++ b/home/vcopy.asm
@@ -0,0 +1,616 @@
+INCLUDE "constants.asm"
+INCLUDE "vram.asm"
+
+SECTION "Copy Routines used by VBlank ISR", ROM0[$123a]
+
+RedrawRowOrColumn:: ; 123a (0:123a)
+; This function redraws a BG row of height 2 or a BG column of width 2.
+; One of its main uses is redrawing the row or column that will be exposed upon
+; scrolling the BG when the player takes a step. Redrawing only the exposed
+; row or column is more efficient than redrawing the entire screen.
+; However, this function is also called repeatedly to redraw the whole screen
+; when necessary. It is also used in trade animation and elevator code.
+; This also implements the flashlight drawing distance effect, which takes
+; multiple frames in either direction to complete
+ ldh a, [hRedrawRowOrColumnMode]
+ and a
+ ret z
+ cp $03
+ jr nc, .flashlight_effect
+ ld b, a
+ xor a
+ ldh [hRedrawRowOrColumnMode], a
+ dec b
+ jr nz, .redrawRow
+.redrawColumn
+ ld hl, wRedrawRowOrColumnSrcTiles
+ ldh a, [hRedrawRowOrColumnDest]
+ ld e, a
+ ldh a, [hRedrawRowOrColumnDest + 1]
+ ld d, a
+ ld c, SCREEN_HEIGHT
+.col_loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ ld a, BG_MAP_WIDTH - 1
+ add e
+ ld e, a
+ jr nc, .noCarry
+ inc d
+.noCarry
+; the following 4 lines wrap us from bottom to top if necessary
+ ld a, d
+ and HIGH(vBGMap1 - vBGMap0 - $01)
+ or HIGH(vBGMap0)
+ ld d, a
+ dec c
+ jr nz, .col_loop
+ xor a
+ ldh [hRedrawRowOrColumnMode], a
+ ret
+.redrawRow
+ ld hl, wRedrawRowOrColumnSrcTiles
+ ldh a, [hRedrawRowOrColumnDest]
+ ld e, a
+ ldh a, [hRedrawRowOrColumnDest + 1]
+ ld d, a
+ push de
+ call .DrawHalf
+ pop de
+ ld a, BG_MAP_WIDTH ; width of VRAM background map
+ add e
+ ld e, a
+ ; fallthrough (draw lower half)
+
+.DrawHalf
+ ld c, SCREEN_WIDTH / 2
+.row_loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ ld a, e
+ inc a
+; the following 6 lines wrap us from the right edge to the left edge if necessary
+ and BG_MAP_WIDTH - 1 ; mask lower address bits
+ ld b, a
+ ld a, e
+ and ($FF ^ (BG_MAP_WIDTH - 1)) ; mask upper address bits
+ or b
+ ld e, a
+ dec c
+ jr nz, .row_loop
+ ret
+.flashlight_effect
+ dec a
+ dec a
+ dec a
+ ld c, a
+ ld b, $00
+ ld hl, .flashlight_effect_table
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.flashlight_effect_table
+ dw RedrawFlashlightRow0 ; $1310
+ dw RedrawFlashlightRow0 ; $1310
+ dw RedrawFlashlightColumn0 ; $12C3
+ dw RedrawFlashlightColumn0 ; $12C3
+ dw RedrawFlashlightRow1 ; $1329
+ dw RedrawFlashlightRow1 ; $1329
+ dw RedrawFlashlightColumn1 ; $12DC
+ dw RedrawFlashlightColumn1 ; $12DC
+ dw RedrawFlashlightRow2 ; $1335
+ dw RedrawFlashlightRow2 ; $1335
+ dw RedrawFlashlightColumn2 ; $12E8
+ dw RedrawFlashlightColumn2 ; $12E8
+ dw RedrawFlashlightRow3 ; $134E
+ dw RedrawFlashlightRow3 ; $134E
+ dw RedrawFlashlightColumn3 ; $1301
+ dw RedrawFlashlightColumn3 ; $1301
+
+RedrawFlashlightColumn0:: ; 12c3 (0:12c3)
+ ldh a, [hSCX]
+ and $07
+ ret nz ; wait till we moved one complete tile in X
+ ld a, [wRedrawFlashlightDst0]
+ ld e, a
+ ld a, [wRedrawFlashlightDst0 + 1]
+ ld d, a
+ ld a, [wRedrawFlashlightSrc0]
+ ld l, a
+ ld a, [wRedrawFlashlightSrc0 + 1]
+ ld h, a
+ call _RedrawFlashlightColumn
+ ret
+
+RedrawFlashlightColumn1:: ; 12dc (0:12dc)
+ ld a, [wRedrawFlashlightBlackDst0]
+ ld e, a
+ ld a, [wRedrawFlashlightBlackDst0 + 1]
+ ld d, a
+ call _RedrawFlashlightColumnBlack
+ ret
+; 0x12e8
+
+RedrawFlashlightColumn2:: ; 12e8 (0:12e8)
+ ldh a, [hSCX]
+ and $0f
+ ret nz ; wait till we moved two complete tiles in X
+ ld a, [wRedrawFlashlightDst1]
+ ld e, a
+ ld a, [wRedrawFlashlightDst1 + 1]
+ ld d, a
+ ld a, [wRedrawFlashlightSrc1]
+ ld l, a
+ ld a, [wRedrawFlashlightSrc1 + 1]
+ ld h, a
+ call _RedrawFlashlightColumn
+ ret
+
+RedrawFlashlightColumn3:: ; 1301 (0:1301)
+ ld a, [wRedrawFlashlightBlackDst1]
+ ld e, a
+ ld a, [wRedrawFlashlightBlackDst1 + 1]
+ ld d, a
+ call _RedrawFlashlightColumnBlack
+ xor a
+ ldh [hRedrawRowOrColumnMode], a ; end flashlight redraw
+ ret
+
+RedrawFlashlightRow0:: ; 1310 (0:1310)
+ ldh a, [hSCY]
+ and $07
+ ret nz ; wait till we moved one complete tile in Y
+ ld a, [wRedrawFlashlightDst0]
+ ld e, a
+ ld a, [wRedrawFlashlightDst0 + 1]
+ ld d, a
+ ld a, [wRedrawFlashlightSrc0]
+ ld l, a
+ ld a, [wRedrawFlashlightSrc0 + 1]
+ ld h, a
+ call _RedrawFlashlightRow
+ ret
+
+RedrawFlashlightRow1:: ; 1329 (0:1329)
+ ld a, [wRedrawFlashlightBlackDst0]
+ ld e, a
+ ld a, [wRedrawFlashlightBlackDst0 + 1]
+ ld d, a
+ call _RedrawFlashlightRowBlack
+ ret
+; 0x12e8
+
+RedrawFlashlightRow2:: ; 1335 (0:1335)
+ ldh a, [hSCY]
+ and $0f
+ ret nz ; wait till we moved two complete tiles in Y
+ ld a, [wRedrawFlashlightDst1]
+ ld e, a
+ ld a, [wRedrawFlashlightDst1 + 1]
+ ld d, a
+ ld a, [wRedrawFlashlightSrc1]
+ ld l, a
+ ld a, [wRedrawFlashlightSrc1 + 1]
+ ld h, a
+ call _RedrawFlashlightRow
+ ret
+
+RedrawFlashlightRow3:: ; 134e (0:134e)
+ ld a, [wRedrawFlashlightBlackDst1]
+ ld e, a
+ ld a, [wRedrawFlashlightBlackDst1 + 1]
+ ld d, a
+ call _RedrawFlashlightRowBlack
+ xor a
+ ldh [hRedrawRowOrColumnMode], a ; end flashlight redraw
+ ret
+
+_RedrawFlashlightColumn:: ; 135d (0:135d)
+ ld a, [wRedrawFlashlightWidthHeight]
+ add a
+ ld c, a
+.loop
+ ld a, [hli]
+ ld [de], a
+ ld a, SCREEN_WIDTH - 1
+ add l
+ ld l, a
+ jr nc, .noCarryScreen
+ inc h
+.noCarryScreen
+ ld a, BG_MAP_WIDTH
+ add e
+ ld e, a
+ jr nc, .noCarryBG
+ inc d
+.noCarryBG
+; the following 4 lines wrap us from bottom to top if necessary
+ ld a, d
+ and HIGH(vBGMap1 - vBGMap0 - $01)
+ or HIGH(vBGMap0)
+ ld d, a
+ dec c
+ jr nz, .loop
+ ldh a, [hRedrawRowOrColumnMode]
+ add $04 ; inc by 4, because flashlight redraw
+ ldh [hRedrawRowOrColumnMode], a ; has four directions
+ ret
+
+_RedrawFlashlightRow:: ; 1382 (0:1382)
+ ld a, [wRedrawFlashlightWidthHeight]
+ ld c, a
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ ld a, e
+ inc a
+; the following 6 lines wrap us from the right edge to the left edge if necessary
+ and BG_MAP_WIDTH - 1 ; mask lower address bits
+ ld b, a
+ ld a, e
+ and ($FF ^ (BG_MAP_WIDTH - 1)) ; mask upper address bits
+ or b
+ ld e, a
+ dec c
+ jr nz, .loop
+ ldh a, [hRedrawRowOrColumnMode]
+ add $04 ; inc by 4, because flashlight redraw
+ ldh [hRedrawRowOrColumnMode], a ; has four directions
+ ret
+
+_RedrawFlashlightColumnBlack:: ; 139f (0:139f)
+ ld l, e
+ ld h, d
+ ld b, "■"
+ ld de, BG_MAP_WIDTH
+ ld a, [wRedrawFlashlightWidthHeight]
+ add a
+ ld c, a
+.loop
+ ld [hl], b
+ add hl, de
+; the following 4 lines wrap us from bottom to top if necessary
+ ld a, h
+ and HIGH(vBGMap1 - vBGMap0 - $01)
+ or HIGH(vBGMap0)
+ ld h, a
+ dec c
+ jr nz, .loop
+ ldh a, [hRedrawRowOrColumnMode]
+ add $04 ; inc by 4, because flashlight redraw
+ ldh [hRedrawRowOrColumnMode], a ; has four directions
+ ret
+
+_RedrawFlashlightRowBlack:: ; 13bd (0:13bd)
+ ld l, e
+ ld h, d
+ ld b, "■"
+ ld a, [wRedrawFlashlightWidthHeight]
+ ld c, a
+.loop
+ ld [hl], b
+ inc hl
+ ld [hl], b
+ ld a, l
+ inc a
+; the following 6 lines wrap us from the right edge to the left edge if necessary
+ and BG_MAP_WIDTH - 1 ; mask lower address bits
+ ld d, a
+ ld a, l
+ and ($FF ^ (BG_MAP_WIDTH - 1)) ; mask upper address bits
+ or d
+ ld l, a
+ dec c
+ jr nz, .loop
+ ldh a, [hRedrawRowOrColumnMode]
+ add $04 ; inc by 4, because flashlight redraw
+ ldh [hRedrawRowOrColumnMode], a ; has four directions
+ ret
+
+WaitForAutoBgMapTransfer:: ; 13dc (0:13dc)
+.loop
+ ldh a, [hBGMapMode]
+ and a
+ ret z
+ ldh a, [hBGMapTransferPosition]
+ and a
+ jr z, .done
+ call DelayFrame
+ jr .loop
+.done
+ xor a
+ ldh [hBGMapMode], a
+ ret
+
+; This function automatically transfers tile number data from the tile map at
+; wTileMap to VRAM during V-blank. Note that it only transfers one third of the
+; background per V-blank. It cycles through which third it draws.
+; This transfer is turned off when walking around the map, but is turned
+; on when talking to sprites, battling, using menus, etc. This is because
+; the above function, RedrawRowOrColumn, is used when walking to
+; improve efficiency.
+AutoBgMapTransfer:: ; 13ee (0:13ee)
+ ldh a, [hBGMapMode]
+ and a
+ ret z
+ ld [hSPTemp], sp
+ ldh a, [hBGMapTransferPosition]
+ and a
+ jr z, .transferTopThird
+ dec a
+ jr z, .transferMiddleThird
+.transferBottomThird
+ coord hl, 0, 12
+ ld sp, hl
+ ldh a, [hBGMapAddress + 1]
+ ld h, a
+ ldh a, [hBGMapAddress]
+ ld l, a
+ ld de, 12 * BG_MAP_WIDTH
+ add hl, de
+ xor a
+ jr .doTransfer
+.transferTopThird
+ coord hl, 0, 0
+ ld sp, hl
+ ldh a, [hBGMapAddress + 1]
+ ld h, a
+ ldh a, [hBGMapAddress]
+ ld l, a
+ ld a, $01
+ jr .doTransfer
+.transferMiddleThird
+ coord hl, 0, 6
+ ld sp, hl
+ ldh a, [hBGMapAddress + 1]
+ ld h, a
+ ldh a, [hBGMapAddress]
+ ld l, a
+ ld de, 6 * BG_MAP_WIDTH
+ add hl, de
+ ld a, $02
+.doTransfer
+ ldh [hBGMapTransferPosition], a
+ ld a, $06 ; 6 rows of SCREEN_WIDTH each
+ ; fallthrough
+
+TransferBgRows:: ; 1430 (0:1430)
+ ld bc, BG_MAP_WIDTH - SCREEN_WIDTH + 1
+.loop
+
+ rept SCREEN_WIDTH / 2 - 1 ; two bytes per pop minus last block
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+ endr
+
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+ add hl, bc
+ dec a
+ jr nz, .loop
+ ldh a, [hSPTemp]
+ ld l, a
+ ldh a, [hSPTemp + 1]
+ ld h, a
+ ld sp, hl
+ ret
+
+VBlankCopyDouble:: ; 1470 (0:1470)
+; Copy [wVBCopyDoubleSize] 1bpp tiles
+; from wVBCopyDoubleSrc to wVBCopyDoubleDst.
+; wVBCopyDoubleDst must be aligned to 0x10 bytes.
+
+; While we're here, convert to 2bpp.
+; The process is straightforward:
+; copy each byte twice.
+ ld a, [wVBCopyDoubleSize]
+ and a
+ ret z
+ ld [hSPTemp], sp
+ ld hl, wVBCopyDoubleSrc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld sp, hl
+ ld hl, wVBCopyDoubleDst
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wVBCopyDoubleSize]
+ ld b, a
+ xor a
+ ld [wVBCopyDoubleSize], a
+.loop
+
+ rept 16/4 - 1 ; 16 bytes per 2bpp tile at 2 bytes per pop
+ pop de ; copied twice minus last block
+ ld [hl], e
+ inc l
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+ ld [hl], d
+ inc l
+ endr
+
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+ ld [hl], d
+ inc hl
+ dec b
+ jr nz, .loop
+ ld a, l
+ ld [wVBCopyDoubleDst], a
+ ld a, h
+ ld [wVBCopyDoubleDst + 1], a
+ ld [wVBCopyDoubleSrc], sp
+ ldh a, [hSPTemp]
+ ld l, a
+ ldh a, [hSPTemp + 1]
+ ld h, a
+ ld sp, hl
+ ret
+
+VBlankCopy:: ; 14c7 (0:14c7)
+; Copy 16 * [wVBCopySize] bytes
+; from wVBCopySrc to wVBCopyDst.
+; wVBCopyDst must be aligned to 0x10 bytes.
+
+; Source and destination addresses are updated,
+; so transfer can continue in subsequent calls.
+ ld a, [wVBCopySize]
+ and a
+ ret z
+ ld [hSPTemp], sp
+ ld hl, wVBCopySrc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld sp, hl
+ ld hl, wVBCopyDst
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wVBCopySize]
+ ld b, a
+ xor a
+ ld [wVBCopySize], a
+.loop
+
+ rept 16/2 - 1 ; 16 bytes per transfer at 2 bytes per pop
+ pop de ; minus last block
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+ endr
+
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc hl
+ dec b
+ jr nz, .loop
+ ld a, l
+ ld [wVBCopyDst], a
+ ld a, h
+ ld [wVBCopyDst + 1], a
+ ld [wVBCopySrc], sp
+ ldh a, [hSPTemp]
+ ld l, a
+ ldh a, [hSPTemp + 1]
+ ld h, a
+ ld sp, hl
+ ret
+
+AnimateTileset:: ; 1522 (0:1522)
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(AnimateTilesetImpl)
+ call Bankswitch
+ call AnimateTilesetImpl
+ pop af
+ jp Bankswitch
+; 0x1531
+
+EnableSprites:: ; 1531 (0:1531)
+ nop
+ ld hl, rLCDC
+ set rLCDC_SPRITES_ENABLE, [hl]
+ ret
+; 0x1538
+
+Function_1538: ; 1538 (0:1538)
+ ld a, [$d14f]
+ bit 0, a
+ ret z
+ bit 7, a
+ ret nz
+ bit 2, a
+ res 2, a
+ ret z
+ ld [$d14f], a
+ ld [hSPTemp], sp
+ ld hl, $cbd2
+ ld sp, hl
+ ld hl, $9c20
+ ld a, $01
+ jp TransferBgRows
+
+VBlankCopyFar:: ; 1558 (0:1558)
+; Copy 0x10 * [wVBCopyFarSize] bytes
+; from wVBCopyFarSrcBank::wVBCopyFarSrc to wVBCopyFarDst.
+; wVBCopyFarDst must be aligned to 0x10 bytes.
+
+; Source and destination addresses are updated,
+; so transfer can continue in subsequent calls.
+ ld a, [wVBCopyFarSize]
+ and a
+ ret z
+ ld a, [wVBCopyFarSrcBank]
+ call Bankswitch
+ ld [hSPTemp], sp
+ ld hl, wVBCopyFarSrc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld sp, hl
+ ld hl, wVBCopyFarDst
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wVBCopyFarSize]
+ ld b, a
+ xor a
+ ld [wVBCopyFarSize], a
+.loop
+ rept 16/2 - 1 ; 16 bytes per transfer at 2 bytes per pop
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+ endr
+
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc hl
+ dec b
+ jr nz, .loop
+ ld [wVBCopyFarSrc], sp
+ ld sp, hl
+ ld [wVBCopyFarDst], sp
+ ldh a, [hSPTemp]
+ ld l, a
+ ldh a, [hSPTemp + 1]
+ ld h, a
+ ld sp, hl
+ ret
+; 0x15b5
diff --git a/hram.asm b/hram.asm
index e5fbcf6..05c11fc 100644
--- a/hram.asm
+++ b/hram.asm
@@ -1,17 +1,16 @@
SECTION "HRAM", HRAM[$FF80]
hOAMDMA:: ; ff80
- ds 10
+ ds 13
+hRTCHours:: db ; ff8d
+hRTCMinutes:: db ; ff8e
+hRTCSeconds:: db ; ff8f
+hRTCDays:: db ; ff90
+ ds 6 ; TODO
- ds 3 ; TODO
-
-hHours:: db ; ff8d
-hMinutes:: db ; ff8e
-hSeconds:: db ; ff8f
-hDays:: db ; ff90
- ds 7 ; TODO
-
+hVBlankCounter:: ; ff97
+ db
hROMBank:: ; ff98
db
@@ -20,17 +19,60 @@ hROMBank:: ; ff98
hVBlank:: ; ff99
db
+ ds 3 ; TODO
+
+hJoypadUp:: db ; ff9d
+; Raw Joypad Up Event
+; A pressed key was released
+hJoypadDown:: db ; ff9e
+; Raw Joypad Down Event
+; An unpressed key was pressed
+hJoypadState:: db ; ff9f
+; Raw Joypad State
+; State of all keys during current frame
+hJoypadSum:: db ; ffa0
+; Raw Joypad State Sum
+; Sum of all keys that were pressed
+; since hJoypadSum was last cleared
+
+ ds 1; TODO
+hJoyDown:: db ; ffa2
+hJoyState:: db ; ffa3
+hJoySum:: db ; ffa4
- ds 21 ; TODO
+hJoyDebounceSrc:: db ; ffa5
+; hJoySum will be updated from
+; 00 - hJoyDown
+; <> - hJoyState
+; See GetJoypadDebounced
+hJoypadState2:: db ; ffa6
+
+ ds 8 ; TODO
+
+UNION
+
+hTextBoxCursorBlinkInterval:: ds 2 ; ffaf
+
+NEXTU
hSpriteWidth:: ; ffaf
hSpriteInterlaceCounter:: ; ffaf
db
hSpriteHeight:: ; ffb0
- db
+ db
+ENDU
+
hSpriteOffset:: ; ffb1
db
- ds 30 ; TODO
+
+ db ; TODO
+
+hPrintNumLeadingDigit:: db ; ffb3 digit one place-value up
+hPrintNumDividend:: ds 3 ; ffb4 big-endian
+hPrintNumDivisor:: ds 3 ; ffb7 big-endian
+hPrintNumTemp:: ds 3 ; ffba big-endian
+
+ ds 19 ; TODO
hLCDCPointer:: ; ffd0
@@ -61,22 +103,61 @@ hSCY:: db ; ffda
hWX:: db ; ffdb
hWY:: db ; ffdc
- db ; TODO
+hOverworldFlashlightEffect:: db ; ffdd
+; Influences draw distance of map around HIRO
+; Meant to go from 0x00--> to desired distance
+; or else graphical errors will occur.
+; 0x00 - regular distance
+; 0x01 - 14x14 tile block
+; 0x02 - 10x10 tile block
+; 0x03 - 6x 6 tile block
+; 0x04 - 2x 2 tile block
hBGMapMode:: ; ffde
db
- db ; TODO
+hBGMapTransferPosition:: ; ffdf
+ db
hBGMapAddress:: ; ffe0
dw
-
-
- ds 6 ; TODO
-
+ db ; TODO
+
+hSPTemp:: ; ffe3
+ dw
+
+hRedrawRowOrColumnMode:: db ; ffe5
+; Used for redrawing BG in small updates
+; instead of once completely for faster
+; scrolling on overworld etc.
+; Valid values:
+; 0x00 - no redraw
+; 0x01 - column redraw (move horizontally)
+; 0x02 - row redraw (move vertically)
+; 0x03 - flashlight row redraw 0 (move up)
+; 0x04 - flashlight row redraw 0 (move down)
+; 0x05 - flashlight column redraw 0 (move left)
+; 0x06 - flashlight column redraw 0 (move right)
+; 0x07 - flashlight row redraw 1 (move up)
+; 0x08 - flashlight row redraw 1 (move down)
+; 0x09 - flashlight column redraw 1 (move left)
+; 0x0A - flashlight column redraw 1 (move right)
+; 0x0B - flashlight row redraw 2 (move up)
+; 0x0C - flashlight row redraw 2 (move down)
+; 0x0D - flashlight column redraw 2 (move left)
+; 0x0E - flashlight column redraw 2 (move right)
+; 0x0F - flashlight row redraw 3 (move up)
+; 0x10 - flashlight row redraw 3 (move down)
+; 0x11 - flashlight column redraw 3 (move left)
+; 0x12 - flashlight column redraw 3 (move right)
+
+hRedrawRowOrColumnDest:: ds 2 ; ffe6
hMapAnims:: ; ffe8
; TODO: figure out size
-
+ ds 7
+hRandomAdd:: db ; ffef
+hRandomSub:: db ; fff0
+hRTCRandom:: db ; fff1
; TODO
diff --git a/macros.asm b/macros.asm
index e985105..a348650 100644
--- a/macros.asm
+++ b/macros.asm
@@ -6,4 +6,6 @@ INCLUDE "macros/code.asm"
INCLUDE "macros/gfx.asm"
INCLUDE "macros/coords.asm"
INCLUDE "macros/farcall.asm"
+INCLUDE "macros/text.asm"
INCLUDE "macros/wram.asm"
+INCLUDE "macros/audio.asm"
diff --git a/macros/audio.asm b/macros/audio.asm
new file mode 100755
index 0000000..8ebf840
--- /dev/null
+++ b/macros/audio.asm
@@ -0,0 +1,278 @@
+Ch0 EQU 0
+Ch1 EQU 1
+Ch2 EQU 2
+Ch3 EQU 3
+Ch4 EQU 4
+Ch5 EQU 5
+Ch6 EQU 6
+Ch7 EQU 7
+
+audio: MACRO
+ db (_NARG - 2) << 6 | \2
+ dw \1_\2
+ IF _NARG > 2
+ db \3
+ dw \1_\3
+ ENDC
+ IF _NARG > 3
+ db \4
+ dw \1_\4
+ ENDC
+ IF _NARG > 4
+ db \5
+ dw \1_\5
+ ENDC
+ENDM
+
+;format: length [0, 7], pitch change [-7, 7]
+pitchenvelope: MACRO
+ db $10
+ IF \2 > 0
+ db (\1 << 4) | \2
+ ELSE
+ db (\1 << 4) | (%1000 | (\2 * -1))
+ ENDC
+ENDM
+
+;format: length [0, 15], volume [0, 15], volume change [-7, 7], pitch
+squarenote: MACRO
+ db $20 | \1
+ IF \3 < 0
+ db (\2 << 4) | (%1000 | (\3 * -1))
+ ELSE
+ db (\2 << 4) | \3
+ ENDC
+ dw \4
+ENDM
+
+;format: length [0, 15], volume [0, 15], volume change [-7, 7], pitch
+noisenote: MACRO
+ db $20 | \1
+ IF \3 < 0
+ db (\2 << 4) | (%1000 | (\3 * -1))
+ ELSE
+ db (\2 << 4) | \3
+ ENDC
+ db \4
+ENDM
+
+;format: rest length (in 16ths)
+rest: MACRO
+ db $00 | (\1 - 1)
+ENDM
+
+;format: pitch length (in 16ths)
+C_: MACRO
+ db $10 | (\1 - 1)
+ENDM
+
+C#: MACRO
+ db $20 | (\1 - 1)
+ENDM
+
+D_: MACRO
+ db $30 | (\1 - 1)
+ENDM
+
+D#: MACRO
+ db $40 | (\1 - 1)
+ENDM
+
+E_: MACRO
+ db $50 | (\1 - 1)
+ENDM
+
+F_: MACRO
+ db $60 | (\1 - 1)
+ENDM
+
+F#: MACRO
+ db $70 | (\1 - 1)
+ENDM
+
+G_: MACRO
+ db $80 | (\1 - 1)
+ENDM
+
+G#: MACRO
+ db $90 | (\1 - 1)
+ENDM
+
+A_: MACRO
+ db $A0 | (\1 - 1)
+ENDM
+
+A#: MACRO
+ db $B0 | (\1 - 1)
+ENDM
+
+B_: MACRO
+ db $C0 | (\1 - 1)
+ENDM
+
+;format: instrument length (in 16ths)
+snare1: MACRO
+ db $10 | (\1 - 1)
+ENDM
+
+snare2: MACRO
+ db $20 | (\1 - 1)
+ENDM
+
+snare3: MACRO
+ db $30 | (\1 - 1)
+ENDM
+
+snare4: MACRO
+ db $40 | (\1 - 1)
+ENDM
+
+snare5: MACRO
+ db $50 | (\1 - 1)
+ENDM
+
+triangle1: MACRO
+ db $60 | (\1 - 1)
+ENDM
+
+triangle2: MACRO
+ db $70 | (\1 - 1)
+ENDM
+
+snare6: MACRO
+ db $80 | (\1 - 1)
+ENDM
+
+snare7: MACRO
+ db $90 | (\1 - 1)
+ENDM
+
+snare8: MACRO
+ db $A0 | (\1 - 1)
+ENDM
+
+snare9: MACRO
+ db $B0 | (\1 - 1)
+ENDM
+
+cymbal1: MACRO
+ db $C0 | (\1 - 1)
+ENDM
+
+cymbal2: MACRO
+ db $D0 | (\1 - 1)
+ENDM
+
+cymbal3: MACRO
+ db $E0 | (\1 - 1)
+ENDM
+
+mutedsnare1: MACRO
+ db $F0 | (\1 - 1)
+ENDM
+
+; TODO: clean up handling of drumsets
+;triangle3: MACRO
+; db $10 | (\1 - 1)
+;ENDM
+
+;mutedsnare2: MACRO
+; db $11 | (\1 - 1)
+;ENDM
+
+;mutedsnare3: MACRO
+; db $12 | (\1 - 1)
+;ENDM
+
+;mutedsnare4: MACRO
+; db $13 | (\1 - 1)
+;ENDM
+
+octave: MACRO
+ db $D8 - \1
+ENDM
+
+; format: notetype speed, volume, fade
+notetype: MACRO
+ db $D8
+ db \1
+ db (\2 << 4) | \3
+ENDM
+
+dspeed: MACRO
+ db $D8
+ db \1
+ENDM
+
+tempo: MACRO
+ db $DA
+ db \1 / $100
+ db \1 % $100
+ENDM
+
+duty: MACRO
+ db $DB
+ db \1
+ENDM
+
+pitchbend: MACRO
+ db $E0
+ db \1
+ db \2
+ENDM
+
+;format: vibrato delay, rate, depth
+vibrato: MACRO
+ db $E1
+ db \1
+ db (\2 << 4) | \3
+ENDM
+
+drumset: MACRO
+ db $E3
+ db \1
+ENDM
+
+volume: MACRO
+ db $E5
+ db (\1 << 4) | \2
+ENDM
+
+toggleperfectpitch: MACRO
+ db $E6
+ENDM
+
+stereopanning: MACRO
+ db $EE
+ db \1
+ENDM
+
+;executemusic: MACRO
+; db $F8
+;ENDM
+
+unknown_f9: MACRO
+ db $F9
+ENDM
+
+;dutycycle: MACRO
+; db $FC
+; db \1
+;ENDM
+
+;format: loopchannel count, address
+loopchannel: MACRO
+ db $FD
+ db \1
+ dw \2
+ENDM
+
+;format: callchannel address
+callchannel: MACRO
+ db $FE
+ dw \1
+ENDM
+
+endchannel: MACRO
+ db $FF
+ENDM
diff --git a/macros/text.asm b/macros/text.asm
new file mode 100644
index 0000000..f95c300
--- /dev/null
+++ b/macros/text.asm
@@ -0,0 +1,135 @@
+text EQUS "db $00," ; Start writing text.
+next EQUS "db \"<NEXT>\"," ; Move a line down.
+line EQUS "db \"<LINE>\"," ; Start writing at the bottom line.
+para EQUS "db \"<PARA>\"," ; Start a new paragraph.
+cont EQUS "db \"<CONT>\"," ; Scroll to the next line.
+done EQUS "db \"<DONE>\"" ; End a text box.
+prompt EQUS "db \"<PROMPT>\"" ; Prompt the player to end a text box (initiating some other event).
+text_end EQUS "db $50" ; End control code for text processor
+ ; different from @
+
+; TODO: determine if these are in
+; Pokedex text commands are only used with pokered.
+; They are included for compatibility.
+page EQUS "db $50," ; Start a new Pokedex page.
+dex EQUS "db $e8, $50" ; End a Pokedex entry.
+
+ enum_start 1
+ enum TX_RAM
+text_from_ram: MACRO
+ db TX_RAM
+ dw \1 ; address
+ ENDM
+
+ enum TX_BCD
+text_bcd: macro
+ db TX_BCD
+ dw \1 ; address
+ db \2 ; flags + digits, see PrintBCDNumber
+ ENDM
+
+ enum TX_MOVE
+text_move: macro
+ db TX_MOVE
+ dw \1 ; address
+ ENDM
+
+ enum TX_BOX
+text_box: macro
+ db TX_BOX
+ dw \1 ; address
+ db \2, \3 ; width, height
+ ENDM
+
+ enum TX_LOW
+text_low: macro
+ db TX_LOW
+ endm
+
+ enum WAIT_BUTTON
+text_waitbutton: macro
+ db WAIT_BUTTON
+ endm
+
+ enum TX_SCROLL
+text_scroll: macro
+ db TX_SCROLL
+ endm
+
+ enum START_ASM
+start_asm: macro
+ db START_ASM
+ endm
+
+ enum TX_NUM
+deciram: macro
+ db TX_NUM
+ dw \1 ; address
+ dn \2, \3 ; bytes, flags + digits
+ endm
+
+ enum TX_EXIT
+text_exit: macro
+ db TX_EXIT
+ endm
+
+ enum TX_SOUND_0B
+sound_dex_fanfare_50_79: macro
+ db TX_SOUND_0B
+ endm
+
+ enum TX_DOTS
+text_dots: macro
+ db TX_DOTS
+ db \1
+ endm
+
+ enum TX_LINK_WAIT_BUTTON
+link_wait_button: macro
+ db TX_LINK_WAIT_BUTTON
+ endm
+
+ enum TX_SOUND_0E
+sound_dex_fanfare_20_49: macro
+ db TX_SOUND_0E
+ endm
+
+ enum TX_SOUND_0F
+sound_item: macro
+ db TX_SOUND_0F
+ endm
+
+ enum TX_SOUND_10
+sound_caught_mon: macro
+ db TX_SOUND_10
+ endm
+
+ enum TX_SOUND_11
+sound_dex_fanfare_80_109: macro
+ db TX_SOUND_11
+ endm
+
+ enum TX_SOUND_12
+sound_fanfare: macro
+ db TX_SOUND_12
+ endm
+
+ enum TX_SOUND_13
+sound_slot_machine_start: macro
+ db TX_SOUND_13
+ endm
+
+ enum TX_CRY_14
+cry_nidorina: macro
+ db TX_CRY_14
+ endm
+
+ enum TX_CRY_15
+cry_pigeot: macro
+ db TX_CRY_15
+ endm
+
+ enum TX_CRY_16
+cry_jugon: macro
+ db TX_CRY_16
+ endm
diff --git a/shim_gold.sym b/shim_gold.sym
index cc7b9a7..2606b7e 100644
--- a/shim_gold.sym
+++ b/shim_gold.sym
@@ -1,4 +1,6 @@
-00:0884 UpdateJoypad
+00:032B UpdateTimeOfDayPalettes
+00:0436 RTC
+00:051C Reset
00:0D0A LoadFont
00:0D1A LoadFontExtra
00:0E2A ClearTileMap
@@ -6,11 +8,6 @@
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
@@ -18,36 +15,38 @@
00:20E1 RunMapScript
00:230E LoadMapWarp
00:23C7 OverworldFadeIn
+00:2BC9 StartMenuCheck
00:3234 Random
-00:3621 WaitBGMap
-00:362B SetPalettes
-00:3634 ClearPalettes
-00:363C GetMemSGBLayout
-00:363E GetSGBLayout
+00:35E5 WaitBGMap
+00:35EF SetPalettes
+00:35F8 ClearPalettes
+00:3600 GetMemSGBLayout
+00:3602 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
+00:368C NamesPointers
+00:36A4 GetName
+00:397E PlayCry
+00:3D4A WaitSFX
+00:3D4B WaitSFX.wait
+00:3D69 MaxVolume
+00:3D6F LowVolume
+00:3D75 VolumeOff
+00:3D7A UpdateSoundNTimes
+00:3D82 FadeToMapMusic
+00:3DA0 FadeToMapMusic.dontfade
+00:3DA5 PlayMapMusic
+00:3DC4 PlayMapMusic.dontplay
+00:3DC9 SpecialMapMusic
+00:3DD8 SpecialMapMusic.state2
+00:3DDD SpecialMapMusic.normal
+00:3DDF GetMapMusic
+00:3DF2 GetMapMusic.unk_3E2E
+00:3DFE Unk_3E32
01:4031 Function_4031
01:53CC MainMenu
01:5D27 Function_5d27
+01:6114 TitleScreenInputAndTimeout
01:6442 Function_6445
01:66AE Function_66b1
01:6710 Function_6713
@@ -62,6 +61,7 @@
02:5695 Function_9695
03:4791 DebugWarp
03:479F DebugWarp.Destinations
+03:4A89 AddItemToInventory_
03:4D1B Function_cd33
03:4D57 Function_cd6f
03:4DCB Function_cde3
@@ -133,12 +133,14 @@
14:4BCD Function_50bcd
14:4BFE Function_50bfe
14:4ED9 Function_50ed9
+23:4000 AnimateTilesetImpl
23:4349 OverworldFadeOut
23:44BE Function_8c4be
23:4940 Function_8c940
23:49C6 Function_8c9c6
23:60CC MenuMonIconGfx
-30:4000 OverworldSpriteGfx
+24:4000 SetClockDialog
+24:4239 SlotMachineGame
32:4000 Function_c8000
32:76FF Function_cb6ff
32:7710 Function_cb710
@@ -151,6 +153,7 @@
3A:4F11 LoadChannel
3A:4F6C LoadMusicByte
3A:52C7 Music
+3F:40E9 InGameDebugMenu
3F:5B66 Function_fdb66
3F:64CE MonsterTest
3F:654E PicTest
diff --git a/shim_gold_debug.sym b/shim_gold_debug.sym
index 8bcabbd..036cc77 100644
--- a/shim_gold_debug.sym
+++ b/shim_gold_debug.sym
@@ -1,4 +1,6 @@
-00:0884 UpdateJoypad
+00:032B UpdateTimeOfDayPalettes
+00:0436 RTC
+00:051C Reset
00:0D0A LoadFont
00:0D1A LoadFontExtra
00:0E2A ClearTileMap
@@ -6,11 +8,6 @@
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
@@ -18,6 +15,7 @@
00:20FF RunMapScript
00:232C LoadMapWarp
00:23E5 OverworldFadeIn
+00:2C05 StartMenuCheck
00:3270 Random
00:3621 WaitBGMap
00:362B SetPalettes
@@ -26,9 +24,9 @@
00:363E GetSGBLayout
00:3648 SetHPPal
00:3655 SetHPPal.done
-00:366C Function_366c
00:36C8 NamesPointers
00:36E0 GetName
+00:39BA PlayCry
00:3D86 WaitSFX
00:3D87 WaitSFX.wait
00:3DA5 MaxVolume
@@ -48,6 +46,7 @@
01:4031 Function_4031
01:53CC MainMenu
01:5D27 Function_5d27
+01:6114 TitleScreenInputAndTimeout
01:6445 Function_6445
01:66B1 Function_66b1
01:6713 Function_6713
@@ -62,6 +61,7 @@
02:5695 Function_9695
03:4791 DebugWarp
03:479F DebugWarp.Destinations
+03:4AA1 AddItemToInventory_
03:4D33 Function_cd33
03:4D6F Function_cd6f
03:4DE3 Function_cde3
@@ -133,12 +133,14 @@
14:4BCD Function_50bcd
14:4BFE Function_50bfe
14:4ED9 Function_50ed9
+23:4000 AnimateTilesetImpl
23:4349 OverworldFadeOut
23:44BE Function_8c4be
23:4940 Function_8c940
23:49C6 Function_8c9c6
23:60CC MenuMonIconGfx
-30:4000 OverworldSpriteGfx
+24:4000 SetClockDialog
+24:4239 SlotMachineGame
32:4000 Function_c8000
32:76FF Function_cb6ff
32:7710 Function_cb710
@@ -151,6 +153,7 @@
3A:4F11 LoadChannel
3A:4F6C LoadMusicByte
3A:52C7 Music
+3F:40E9 InGameDebugMenu
3F:5B66 Function_fdb66
3F:64CE MonsterTest
3F:654E PicTest
diff --git a/shim_silver.sym b/shim_silver.sym
index cc7b9a7..2606b7e 100644
--- a/shim_silver.sym
+++ b/shim_silver.sym
@@ -1,4 +1,6 @@
-00:0884 UpdateJoypad
+00:032B UpdateTimeOfDayPalettes
+00:0436 RTC
+00:051C Reset
00:0D0A LoadFont
00:0D1A LoadFontExtra
00:0E2A ClearTileMap
@@ -6,11 +8,6 @@
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
@@ -18,36 +15,38 @@
00:20E1 RunMapScript
00:230E LoadMapWarp
00:23C7 OverworldFadeIn
+00:2BC9 StartMenuCheck
00:3234 Random
-00:3621 WaitBGMap
-00:362B SetPalettes
-00:3634 ClearPalettes
-00:363C GetMemSGBLayout
-00:363E GetSGBLayout
+00:35E5 WaitBGMap
+00:35EF SetPalettes
+00:35F8 ClearPalettes
+00:3600 GetMemSGBLayout
+00:3602 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
+00:368C NamesPointers
+00:36A4 GetName
+00:397E PlayCry
+00:3D4A WaitSFX
+00:3D4B WaitSFX.wait
+00:3D69 MaxVolume
+00:3D6F LowVolume
+00:3D75 VolumeOff
+00:3D7A UpdateSoundNTimes
+00:3D82 FadeToMapMusic
+00:3DA0 FadeToMapMusic.dontfade
+00:3DA5 PlayMapMusic
+00:3DC4 PlayMapMusic.dontplay
+00:3DC9 SpecialMapMusic
+00:3DD8 SpecialMapMusic.state2
+00:3DDD SpecialMapMusic.normal
+00:3DDF GetMapMusic
+00:3DF2 GetMapMusic.unk_3E2E
+00:3DFE Unk_3E32
01:4031 Function_4031
01:53CC MainMenu
01:5D27 Function_5d27
+01:6114 TitleScreenInputAndTimeout
01:6442 Function_6445
01:66AE Function_66b1
01:6710 Function_6713
@@ -62,6 +61,7 @@
02:5695 Function_9695
03:4791 DebugWarp
03:479F DebugWarp.Destinations
+03:4A89 AddItemToInventory_
03:4D1B Function_cd33
03:4D57 Function_cd6f
03:4DCB Function_cde3
@@ -133,12 +133,14 @@
14:4BCD Function_50bcd
14:4BFE Function_50bfe
14:4ED9 Function_50ed9
+23:4000 AnimateTilesetImpl
23:4349 OverworldFadeOut
23:44BE Function_8c4be
23:4940 Function_8c940
23:49C6 Function_8c9c6
23:60CC MenuMonIconGfx
-30:4000 OverworldSpriteGfx
+24:4000 SetClockDialog
+24:4239 SlotMachineGame
32:4000 Function_c8000
32:76FF Function_cb6ff
32:7710 Function_cb710
@@ -151,6 +153,7 @@
3A:4F11 LoadChannel
3A:4F6C LoadMusicByte
3A:52C7 Music
+3F:40E9 InGameDebugMenu
3F:5B66 Function_fdb66
3F:64CE MonsterTest
3F:654E PicTest
diff --git a/shim_silver_debug.sym b/shim_silver_debug.sym
index 8bcabbd..036cc77 100644
--- a/shim_silver_debug.sym
+++ b/shim_silver_debug.sym
@@ -1,4 +1,6 @@
-00:0884 UpdateJoypad
+00:032B UpdateTimeOfDayPalettes
+00:0436 RTC
+00:051C Reset
00:0D0A LoadFont
00:0D1A LoadFontExtra
00:0E2A ClearTileMap
@@ -6,11 +8,6 @@
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
@@ -18,6 +15,7 @@
00:20FF RunMapScript
00:232C LoadMapWarp
00:23E5 OverworldFadeIn
+00:2C05 StartMenuCheck
00:3270 Random
00:3621 WaitBGMap
00:362B SetPalettes
@@ -26,9 +24,9 @@
00:363E GetSGBLayout
00:3648 SetHPPal
00:3655 SetHPPal.done
-00:366C Function_366c
00:36C8 NamesPointers
00:36E0 GetName
+00:39BA PlayCry
00:3D86 WaitSFX
00:3D87 WaitSFX.wait
00:3DA5 MaxVolume
@@ -48,6 +46,7 @@
01:4031 Function_4031
01:53CC MainMenu
01:5D27 Function_5d27
+01:6114 TitleScreenInputAndTimeout
01:6445 Function_6445
01:66B1 Function_66b1
01:6713 Function_6713
@@ -62,6 +61,7 @@
02:5695 Function_9695
03:4791 DebugWarp
03:479F DebugWarp.Destinations
+03:4AA1 AddItemToInventory_
03:4D33 Function_cd33
03:4D6F Function_cd6f
03:4DE3 Function_cde3
@@ -133,12 +133,14 @@
14:4BCD Function_50bcd
14:4BFE Function_50bfe
14:4ED9 Function_50ed9
+23:4000 AnimateTilesetImpl
23:4349 OverworldFadeOut
23:44BE Function_8c4be
23:4940 Function_8c940
23:49C6 Function_8c9c6
23:60CC MenuMonIconGfx
-30:4000 OverworldSpriteGfx
+24:4000 SetClockDialog
+24:4239 SlotMachineGame
32:4000 Function_c8000
32:76FF Function_cb6ff
32:7710 Function_cb710
@@ -151,6 +153,7 @@
3A:4F11 LoadChannel
3A:4F6C LoadMusicByte
3A:52C7 Music
+3F:40E9 InGameDebugMenu
3F:5B66 Function_fdb66
3F:64CE MonsterTest
3F:654E PicTest
diff --git a/tools/disasm_coverage.py b/tools/disasm_coverage.py
new file mode 100644
index 0000000..0b19ab0
--- /dev/null
+++ b/tools/disasm_coverage.py
@@ -0,0 +1,78 @@
+# #!/usr/bin/env python3
+# coding: utf-8
+
+from __future__ import division
+
+import os
+import sys
+import argparse
+import png
+from mapreader import MapReader
+from colorsys import hls_to_rgb
+
+if __name__ == "__main__":
+ # argument parser
+ ap = argparse.ArgumentParser()
+ ap.add_argument("-o", dest="filename", default="coverage.png")
+ ap.add_argument("-s", dest="statsname", default="coverage.log")
+ ap.add_argument("-m", dest="mapfile", required=True)
+ ap.add_argument("-b", dest="num_banks", required=True, type=lambda x: int(x, 0))
+ args = ap.parse_args()
+
+ bank_mask = 0x3FFF
+ bank_size = 0x4000 # bytes
+ width = 256 # pixels per row
+ bpp = 8 # bytes per pixel
+
+ rom_size = args.num_banks * bank_size # bytes
+ height = (args.num_banks * bank_size + (width * bpp - 1)) // (width * bpp) # pixels
+ rows_per_bank = bank_size // (width * bpp)
+
+ r = MapReader()
+ with open(args.mapfile, 'r') as f:
+ l = f.readlines()
+ r.read_map_data(l)
+
+ hit_data = [[0] * width for _ in range(height)]
+ default_bank_data = {'sections': [], 'used': 0, 'slack': bank_size}
+ for bank in range(args.num_banks):
+ data = r.bank_data['ROM Bank'].get(bank, default_bank_data)
+ for s in data['sections']:
+ beg = (s['beg'] & bank_mask) + bank * bank_size
+ end = (s['end'] & bank_mask) + bank * bank_size
+ y_beg = beg // (width * bpp)
+ x_beg = (beg % (width * bpp)) // bpp
+ y_end = end // (width * bpp)
+ x_end = (end % (width * bpp)) // bpp
+ #print('beg {0} end {1}: {2}/{3} -- {4}/{5}'.format(beg, end, y_beg, x_beg, y_end, x_end))
+ # special case y_beg/x_beg and y_end/x_end
+ if (y_beg == y_end and x_beg == x_end):
+ hit_data[y_beg][x_beg] += end - beg + 1
+ else:
+ hit_data[y_beg][x_beg] += bpp - ((beg % (width * bpp)) - x_beg * bpp)
+ hit_data[y_end][x_end] += ((end % (width * bpp)) - x_end * bpp + 1)
+ # regular case
+ for y in range(y_beg, y_end + 1):
+ x_line_beg = 0 if y_beg != y else x_beg + 1
+ x_line_end = width - 1 if y_end != y else x_end - 1
+ for x in range(x_line_beg, x_line_end + 1):
+ hit_data[y][x] += bpp
+
+ with open(args.statsname, 'w') as stats:
+ # TODO: write stats
+ pass
+
+ png_data = []
+ for i, row in enumerate(hit_data):
+ bank = i // rows_per_bank
+ hue = 0 if bank % 2 else 120
+ row_png_data = ()
+ for col in row:
+ hls = (hue/360.0, 1.0 - (col/bpp * (100 - 15))/100.0, 1.0)
+ rgb = tuple(255 * x for x in hls_to_rgb(*hls))
+ row_png_data += rgb
+ png_data.append(row_png_data)
+
+ with open(args.filename, 'wb') as f:
+ w = png.Writer(width, height)
+ w.write(f, png_data)
diff --git a/tools/dump_names.py b/tools/dump_names.py
index bd2078e..81f357a 100644
--- a/tools/dump_names.py
+++ b/tools/dump_names.py
@@ -1,52 +1,30 @@
#!/usr/bin/env python
import sys, os, io
+from read_charmap import read_charmap
-def parse_int(s):
- s = s.strip()
- if s.startswith('$'):
- return int(s[1:], 16)
- if s.startswith('%'):
- return int(s[1:], 2)
- return int(s)
+def calc_bank(p):
+ return p // 0x4000
-def parse_string(s):
- # assumes strings are literal, no STRCAT() etc
- return s.strip('" ')
+def calc_address(p):
+ b = calc_bank(p)
+ o = b * 0x4000
+ return 0x4000 + p - o
-def strip_comment(s):
- # assumes ";" is not in the charmap
- return s.split(';')[0].rstrip()
+def get_sym_loc(p):
+ b, a = calc_bank(p), calc_address(p)
+ return '%02x:%04x' % (b, a)
def get_project_dir():
script_path = os.path.realpath(__file__)
script_dir = os.path.dirname(script_path)
project_dir = os.path.join(script_dir, '..')
return os.path.normpath(project_dir)
-
-def get_charmap_path():
- project_dir = get_project_dir()
- return os.path.join(project_dir, 'charmap.asm')
-
+
def get_baserom_path():
project_dir = get_project_dir()
return os.path.join(project_dir, 'baserom.gb')
-def read_charmap():
- charmap_path = get_charmap_path()
- charmap = {}
- with io.open(charmap_path, 'r', encoding='utf-8') as f:
- lines = f.readlines()
- for line in lines:
- line = strip_comment(line).lstrip()
- if not line.startswith('charmap '):
- continue
- char, value = line[len('charmap '):].rsplit(',', 1)
- char = parse_string(char)
- value = parse_int(value)
- charmap[value] = char
- return charmap
-
def dump_strings(data):
charmap = read_charmap()
ss = []
@@ -84,9 +62,7 @@ def read_data(bank, address, n):
data.append(v)
return data
-#data = read_data(0x0E, 0x4D90, 64) # TrainerClassNames
-#data = read_data(0x01, 0x6FEC, 255) # ItemNames
-#data = read_data(0x10, 0x52A1, 251) # MoveNames
-data = read_data(0x14, 0x6D75, 251) # PokemonNames
-
+p = 0xfcaaf # Landmarks
+print get_sym_loc(p)
+data = read_data(calc_bank(p), calc_address(p), 45)
dump_strings(data)
diff --git a/tools/dump_text.py b/tools/dump_text.py
index 721d953..057de04 100644
--- a/tools/dump_text.py
+++ b/tools/dump_text.py
@@ -1,50 +1,252 @@
#!/usr/bin/python3
-from sys import argv, stdout
-
-
-char_table = [
- "?", "イ゛", "ヴ", "エ゛", "オ゛", "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ",
- "ヂ", "ヅ", "デ", "ド", "<PLAY_G>", "<0x15>", "<0x16>", "ネ゛", "<JP_18>", "バ", "ビ", "ブ", "ボ", "<NI>", "<TTE>", "<WO>",
- "ィ゛", "あ゛", "<TA!>", "<KOUGEKI>", "<WA>", "<NO>", "が", "ぎ", "ぐ", "げ", "ご", "ざ", "じ", "ず", "ぜ", "ぞ",
- "だ", "ぢ", "づ", "で", "ど", "<ROUTE>", "<WATASHI>", "<KOKO_WA>", "<RED>", "<GREEN>", "ば", "び", "ぶ", "べ", "ぼ", "<ENEMY>",
- "パ", "ピ", "プ", "ポ", "ぱ", "ぴ", "ぷ", "ぺ", "ぽ", "<MOM>", "<GA>", "<_CONT>", "<SCROLL>", "も゜", "<NEXT>", "<LINE>",
- "@", "<PARA>", "<PLAYER>", "<RIVAL>", "#", "<CONT>", "<……>", "<DONE>", "<PROMPT>", "<TARGET>", "<USER>", "<PC>", "<TM>", "<TRAINER>", "<ROCKET>", "<DEXEND>",
- "■", "▲", "☎", "D", "E", "F", "G", "H", "I", "V", "S", "L", "M", ":", "ぃ", "ぅ",
- "「", "」", "『", "』", "・", "<・・・>", "ぁ", "ぇ", "ぉ", "┌", "─", "┐", "│", "└", "┘", " ",
- "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ",
- "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ホ", "マ", "ミ", "ム",
- "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "ッ", "ャ", "ュ", "ョ",
- "ィ", "あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ",
- "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま",
- "み", "む", "め", "も", "や", "ゆ", "よ", "ら", "り", "る", "れ", "ろ", "わ", "を", "ん", "っ",
- "ゃ", "ゅ", "ょ", "ー", "゜", "゛", "?", "!", "。", "ァ", "ゥ", "ェ", "▷", "▶", "▼", "♂",
- "円", "×", ".", "/", "ォ", "♀", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
-]
-
-if len(argv) != 4:
- print(f"Usage: {argv[0]} path/to/ROM.gb start_offset end_offset\noffsets are in the form bank:address (both hex), and end_offset is *not* included.")
- exit(1)
-
-
-try:
- start_bank,start_addr = [ int(s, 16) for s in argv[2].split(':') ]
- end_bank, end_addr = [ int(s, 16) for s in argv[3].split(':') ]
- if start_bank != 0:
- start_addr += (start_bank - 1) * 0x4000
- if end_bank != 0:
- end_addr += (end_bank - 1) * 0x4000
-except Error:
- print("Please specify valid offsets (bank:address, both hex)")
- exit(1)
-
-
-with open(argv[1], "rb") as f:
- f.seek(start_addr)
-
- string = ""
- while start_addr < end_addr:
- string += char_table[ int.from_bytes(f.read(1), "little") ]
- start_addr += 1
-
- stdout.buffer.write( f"db \"{string}\"\n".encode('utf-8') )
+import argparse
+import sys
+from read_charmap import read_charmap
+
+charmap = {}
+
+bank_size = 0x4000
+
+textcodes = {
+ '<NEXT>' : {'label': 'next', 'fin': False},
+ '<LINE>' : {'label': 'line', 'fin': False},
+ '<PARA>' : {'label': 'para', 'fin': False},
+ '<CONT>' : {'label': 'cont', 'fin': False},
+ '<DONE>' : {'label': 'done', 'fin': True},
+ '<PROMPT>': {'label': 'prompt', 'fin': True},
+}
+
+# codes that end text control code 0x00
+# True if this code exits control code parsing as well
+end_codes = {
+ '@' : False,
+ '<DONE>' : True,
+ '<PROMPT>': True,
+}
+
+def conv_address(x):
+ if ':' in x:
+ bank, addr = [ int(s, 16) for s in x.split(':') ]
+ if (addr < bank_size and bank != 0):
+ raise argparse.ArgumentTypeError('Illegal ROM bank 0x00 address {0:02X}:{1:04X}. '
+ 'Bank 0x{0:02X} must be 0x00.'.format(bank, addr))
+ elif (addr >= bank_size and bank == 0):
+ raise argparse.ArgumentTypeError('Illegal ROM bank 0x00 address {0:02X}:{1:04X}. '
+ 'Address 0x{1:04X} > 0x{2:04X}.'.format(bank, addr, bank_size - 1))
+ elif (addr >= 2*bank_size):
+ raise argparse.ArgumentTypeError('Illegal ROM bank address {0:02X}:{1:04X}. '
+ 'Address 0x{1:04X} > 0x{2:04X}.'.format(bank, addr, 2*bank_size - 1))
+ return bank * 0x4000 + (addr & 0x3fff)
+ return int(x, 0)
+
+def addr2gb(addr):
+ bank = addr // bank_size
+ offset = addr % bank_size
+ if (bank > 0):
+ offset += bank_size
+ return bank, offset
+
+def transform_char(char, do_transform, is_begin):
+ result = ''
+ if (do_transform and char in textcodes):
+ replace = textcodes[char]
+ if (not is_begin):
+ result += '"\n'
+ result += replace['label']
+ if (not replace['fin']):
+ result += ' "'
+ return replace['fin'], result
+ else:
+ if (is_begin):
+ result += '"'
+ return False, (result + char)
+
+def dump_asm(data):
+
+ result = 'start_asm ; text dumper cannot dump asm\n'
+ result += ' ; Try dumping asm from the following offset and\n'
+ result += ' ; then continue dumping text in control mode.\n'
+ return True, result
+
+def dump_control(data, label, signature):
+
+ lengths = {'b': 1, 'n': 1, 'w': 2}
+
+ required_bytes = sum([lengths.get(c, 0) for c in signature])
+
+ if (data['len'] - data['offset'] < required_bytes):
+ #silently drop split control code
+ return True, ''
+
+ result = ''
+
+ for c in signature:
+ if result != '':
+ result += ', '
+ if c == 'b':
+ byte = data['bytes'][data['offset']]
+ data['offset'] += 1
+ result += '${0:02x}'.format(byte)
+ elif c == 'n':
+ byte = data['bytes'][data['offset']]
+ data['offset'] += 1
+ result += '${0:01x}, ${1:01x}'.format(byte >> 4, byte & 0x0f)
+ elif c == 'w':
+ word = data['bytes'][data['offset']]
+ data['offset'] += 1
+ word |= data['bytes'][data['offset']] << 8
+ data['offset'] += 1
+ result += '${0:02x}'.format(word)
+ else:
+ raise ValueError('Unknown signature char in {0:s}\'s signature "{1:s}".'.format(label, signature))
+
+ if (result != ''):
+ result = ' ' + result
+ return False, label + result
+
+def dump_text(data):
+
+ string = ''
+ exit_control = False
+ done = False
+ while (not done):
+
+ byte = data['bytes'][data['offset']]
+ data['offset'] += 1
+
+ char = charmap[byte]
+ fin, tchar = transform_char(char, data['textmode'], string == '')
+ string += tchar
+ if (char in end_codes):
+ done = True
+ exit_control = end_codes[char]
+ # end string if textmode didn't do it
+ if not data['textmode'] or not fin:
+ string += '"'
+ if (data['offset'] >= data['len']):
+ done = True
+ string += '"'
+
+ return exit_control, string
+
+def dump_text_control(data):
+
+ res, text = dump_text(data)
+ return res, 'text ' + text
+
+control_codes = {
+ 0x00: dump_text_control,
+ 0x01: lambda data: dump_control(data, 'text_from_ram' , 'w' ),
+ 0x02: lambda data: dump_control(data, 'text_bcd' , 'wb' ),
+ 0x03: lambda data: dump_control(data, 'text_move' , 'w' ),
+ 0x04: lambda data: dump_control(data, 'text_box' , 'wbb' ),
+ 0x05: lambda data: dump_control(data, 'text_low' , '' ),
+ 0x06: lambda data: dump_control(data, 'text_waitbutton' , '' ),
+ 0x07: lambda data: dump_control(data, 'text_scroll' , '' ),
+ 0x08: dump_asm,
+ 0x09: lambda data: dump_control(data, 'deciram' , 'wn' ),
+ 0x0A: lambda data: dump_control(data, 'text_exit' , '' ),
+ 0x0B: lambda data: dump_control(data, 'sound_dex_fanfare_50_79' , '' ),
+ 0x0C: lambda data: dump_control(data, 'text_dots' , 'b' ),
+ 0x0D: lambda data: dump_control(data, 'link_wait_button' , '' ),
+ 0x0E: lambda data: dump_control(data, 'sound_dex_fanfare_20_49' , '' ),
+ 0x0F: lambda data: dump_control(data, 'sound_item' , '' ),
+ 0x10: lambda data: dump_control(data, 'sound_caught_mon' , '' ),
+ 0x11: lambda data: dump_control(data, 'sound_dex_fanfare_80_109', '' ),
+ 0x12: lambda data: dump_control(data, 'sound_fanfare' , '' ),
+ 0x13: lambda data: dump_control(data, 'sound_slot_machine_start', '' ),
+ 0x14: lambda data: dump_control(data, 'cry_nidorina' , '' ),
+ 0x15: lambda data: dump_control(data, 'cry_pigeot' , '' ),
+ 0x16: lambda data: dump_control(data, 'cry_jugon' , '' ),
+ 0x50: lambda data: (True, 'text_end\n'),
+}
+
+def print_location(data):
+ return '.loc_{0:04X}:\n'.format(data['offset'])
+
+if __name__ == '__main__':
+ # argument parser
+ ap = argparse.ArgumentParser()
+ ap.add_argument('--cc', dest='ccmode', action='store_true',
+ help='dump in control code mode, implies text code macro mode'
+ )
+ ap.add_argument('--endless', dest='endless', action='store_true',
+ help='continue dumping even if string end text code was reached'
+ )
+ ap.add_argument('--tc', dest='textmode', action='store_true',
+ help='dump text codes (line breaks, prompt etc) as macros instead of inline text'
+ )
+ ap.add_argument('-o', dest='outfile', default=sys.stdout, help='output file name')
+ ap.add_argument('-m', dest='charmap', default='../charmap.asm', help='charmap file name')
+ ap.add_argument('rom', help='path to ROM')
+ ap.add_argument('start', help='start offset', type=conv_address)
+ ap.add_argument('end', help='end offset', type=conv_address, nargs='?')
+
+ args = ap.parse_args()
+ romname = args.rom
+ start_addr = args.start
+ end_addr = start_addr + bank_size if args.end is None else args.end
+ ccmode = args.ccmode
+ endless = args.endless
+ outfile = args.outfile
+ charmap = read_charmap(args.charmap)
+
+ if (end_addr < start_addr):
+ print('End address 0x{0:06X} ({1:02X}:{2:04X}) is before '
+ 'start address 0x{3:06X} ({4:02X}:{5:04X}).'.format(
+ end_addr,
+ *addr2gb(end_addr),
+ start_addr,
+ *addr2gb(start_addr)
+ ),
+ file=sys.stderr
+ )
+ sys.exit(-1)
+
+ bank_addr = start_addr & (~(bank_size - 1))
+ offset = start_addr - bank_addr
+ end_offset = end_addr - bank_addr
+
+ with open(romname, 'rb') as f:
+ f.seek(bank_addr)
+ bank_data = f.read(bank_size)
+
+ data = {'offset': offset, 'bytes': bank_data, 'len': min(end_offset, len(bank_data)), 'textmode': args.textmode}
+
+ with open(outfile, 'wb') if outfile != sys.stdout else outfile.buffer as f:
+ string = print_location(data)
+ while(data['offset'] < data['len']):
+ if (not ccmode):
+ # dumb mode
+ _, text = dump_text(data)
+ # start with db unless starting with a control code
+ # in textmode
+ if text[0] == '"' and data['textmode']:
+ string += '\tdb '
+ elif text[0] == '"':
+ string += '\tdb '
+ string += text.replace('\n', '\n\t')
+ string += '\n{0:s}'.format(print_location(data))
+ if (not endless):
+ break
+ else:
+ # control code mode
+ control_byte = data['bytes'][data['offset']]
+ data['offset'] += 1
+
+ if (control_byte in control_codes):
+ res, text = control_codes[control_byte](data)
+ string += '\t' + text.replace('\n', '\n\t')
+ string += '\n'
+ if (res):
+ string += print_location(data)
+ # exit out of control code parsing
+ if (res and not endless):
+ break
+ else:
+ print('Encountered unknown control code 0x{0:02X}. Abort...'.format(control_byte), file=sys.stderr)
+ break
+
+ f.write(string.encode('utf-8'))
+ f.close()
diff --git a/tools/mapreader.py b/tools/mapreader.py
new file mode 100644
index 0000000..41ad935
--- /dev/null
+++ b/tools/mapreader.py
@@ -0,0 +1,171 @@
+# #!/usr/bin/env python3
+# coding: utf-8
+
+import re
+
+class MapReader:
+
+ # {'ROM Bank': { 0: { 'sections': [ { 'beg': 1234,
+ # 'end': 5678,
+ # 'name': 'Section001',
+ # 'symbols': [ { 'symbol': 'Function1234',
+ # 'address: 1234,
+ # },
+ # ]
+ # },
+ # ],
+ # 'used': 1234,
+ # 'slack': 4567,
+ # },
+ # },
+ # 'OAM': { 'sections': [ { 'beg': 1234,
+ # 'end': 5678,
+ # 'name': 'Section002',
+ # 'symbols': [ { 'symbol': 'Data1234',
+ # 'address: 1234,
+ # },
+ # ]
+ # },
+ # ],
+ # 'used': 1234,
+ # 'slack': 4567,
+ # },
+ # }
+ #
+ bank_data = {}
+
+ bank_types = {
+ 'HRAM' : { 'size': 0x80, 'banked': False, },
+ 'OAM' : { 'size': 0xA0, 'banked': False, },
+ 'ROM Bank' : { 'size': 0x4000, 'banked': True, },
+ 'SRAM Bank': { 'size': 0x2000, 'banked': True, },
+ 'VRAM Bank': { 'size': 0x1000, 'banked': True, },
+ 'WRAM Bank': { 'size': 0x2000, 'banked': True, },
+ }
+
+ # FSM states
+ INIT, BANK, SECTION = range(3)
+
+ # $506D-$519A ($012E bytes) ["Type Matchups"]
+ section_header_regex = re.compile('\$([0-9A-Fa-f]{4})-\$([0-9A-Fa-f]{4}) \(.*\) \["(.*)"\]')
+ # $506D = TypeMatchups
+ section_data_regex = re.compile('\$([0-9A-Fa-f]{4}) = (.*)')
+ # $3ED2 bytes
+ slack_regex = re.compile('\$([0-9A-Fa-f]{4}) bytes')
+
+ def __init__(self, *args, **kwargs):
+ self.__dict__.update(kwargs)
+
+ def _parse_init(self, line):
+
+ line = line.split(':', 1)[0]
+ parts = line.split(' #', 1)
+
+ if (parts[0] in self.bank_types):
+ self._cur_bank_name = parts[0]
+ self._cur_bank_type = self.bank_types[self._cur_bank_name]
+ if (self._cur_bank_type['banked'] and len(parts) > 1):
+ parts[1] = parts[1].split(':', 1)[0]
+ parts[1] = parts[1].split(' ', 1)[0]
+ self._cur_bank = int(parts[1], 10)
+ if self._cur_bank_name not in self.bank_data:
+ self.bank_data[self._cur_bank_name] = {}
+ if self._cur_bank_type['banked']:
+ if self._cur_bank not in self.bank_data[self._cur_bank_name]:
+ self.bank_data[self._cur_bank_name][self._cur_bank] = {}
+ self._cur_data = self.bank_data[self._cur_bank_name][self._cur_bank]
+ else:
+ self._cur_data = self.bank_data[self._cur_bank_name]
+
+ if ({} == self._cur_data):
+ self._cur_data['sections'] = []
+ self._cur_data['used'] = 0
+ self._cur_data['slack'] = self._cur_bank_type['size']
+ return True
+
+ return False
+
+ def _parse_section_header(self, header):
+
+ section_data = self.section_header_regex.match(header)
+ if section_data is not None:
+ beg = int(section_data.group(1), 16)
+ end = int(section_data.group(2), 16)
+ name = section_data.group(3)
+ self._cur_section = {'beg': beg, 'end': end, 'name': name, 'symbols': []}
+ self._cur_data['sections'].append(self._cur_section)
+ return True
+ return False
+
+ def _parse_slack(self, data):
+
+ slack_data = self.slack_regex.match(data)
+ slack_bytes = int(slack_data.group(1), 16)
+ self._cur_data['slack'] = slack_bytes
+
+ used_bytes = 0
+
+ for s in self._cur_data['sections']:
+ used_bytes += s['end'] - s['beg'] + 1
+
+ self._cur_data['used'] = used_bytes
+
+ def read_map_data(self, map):
+
+ if type(map) is str:
+ map = map.split('\n')
+
+ self._state = MapReader.INIT
+ self._cur_bank_name = ''
+ self._cur_bank_type = {}
+ self._cur_bank = 0
+ self._cur_data = {}
+
+ for line in map:
+
+ line = line.rstrip()
+ if (MapReader.INIT == self._state):
+
+ if (self._parse_init(line)):
+ self._state = MapReader.BANK
+
+ elif (MapReader.BANK == self._state or MapReader.SECTION == self._state):
+
+ if ('' == line):
+ self._state = MapReader.INIT
+ else:
+
+ line = line.lstrip()
+ parts = line.split(': ', 1)
+
+ if (MapReader.SECTION == self._state):
+ section_data = self.section_data_regex.match(parts[0])
+ if section_data is not None:
+ address = int(section_data.group(1), 16)
+ name = section_data.group(2)
+ self._cur_section['symbols'].append({'name': name, 'address': address})
+ continue
+
+ if ('SECTION' == parts[0]):
+ if (self._parse_section_header(parts[1])):
+ self._state = MapReader.SECTION
+ elif ('SLACK' == parts[0]):
+ self._parse_slack(parts[1])
+ self._state = MapReader.INIT
+ elif ('EMPTY' == parts[0]):
+ self._cur_data = {'sections': [], 'used': 0, 'slack': self._cur_bank_type['size']}
+ self._state = MapReader.INIT
+
+ else:
+ pass
+
+ for k, v in self.bank_data.items():
+ if (self.bank_types[k]['banked']):
+ for _, vv in v.items():
+ vv['sections'].sort(key=lambda x: x['beg'])
+ for vvv in vv['sections']:
+ vvv['symbols'].sort(key=lambda x: x['address'])
+ else:
+ v['sections'].sort(key=lambda x: x['beg'])
+ for vv in v['sections']:
+ vv['symbols'].sort(key=lambda x: x['address']) \ No newline at end of file
diff --git a/tools/read_charmap.py b/tools/read_charmap.py
new file mode 100644
index 0000000..af290c3
--- /dev/null
+++ b/tools/read_charmap.py
@@ -0,0 +1,42 @@
+import os, io
+from re import compile
+from sys import stderr
+
+charmap_regex = compile('[ \t]*charmap[ \t]+"(.*?)",[ \t]*(\$[0-9A-Fa-f]{2}|%[01]{8}|[0-9]{3})')
+# A charmap line is
+# [ \t]* - zero or more space chars
+# charmap - literal charmap
+# [ \t]+ - one or more space chars
+# "(.*?)" - a lazily-matched text identifier in quotes
+# , - literal comma
+# [ \t]* - zero or more space chars
+# ( - either of
+# \$[0-9A-Fa-f]{2} - two hexadecimal digits preceeded by literal $
+# %[01]{8} - eight dual digits preceeded by literal %
+# [0-9]{3} - three decimal digits
+# )
+
+def parse_int(s):
+ # assumes integers are literal; no +-*/, etc
+ s = s.strip()
+ if s.startswith('$'):
+ return int(s[1:], 16)
+ if s.startswith('%'):
+ return int(s[1:], 2)
+ return int(s)
+
+def read_charmap(charmap_path):
+ charmap = {}
+ with io.open(charmap_path, 'r', encoding='utf-8') as f:
+ lines = f.readlines()
+ for line in lines:
+ m = charmap_regex.match(line)
+ if m is None:
+ continue
+ char = m.group(1)
+ value = parse_int(m.group(2))
+ if value in charmap:
+ print('Value {0:s} already in charmap, dropping it in favor of first charmap entry'.format(m.group(2)))
+ continue
+ charmap[value] = char
+ return charmap
diff --git a/tools/tests/README.txt b/tools/tests/README.txt
new file mode 100644
index 0000000..750482e
--- /dev/null
+++ b/tools/tests/README.txt
@@ -0,0 +1 @@
+python dump_text.py -o dump_test.txt -m charmap.asm dump_text_test.bin 00:0000
diff --git a/tools/tests/charmap.asm b/tools/tests/charmap.asm
new file mode 100644
index 0000000..228bb6b
--- /dev/null
+++ b/tools/tests/charmap.asm
@@ -0,0 +1,293 @@
+ charmap "<NULL>", $00
+
+ charmap "イ゛", $01
+ charmap "ヴ", $02
+ charmap "エ゛", $03
+ charmap "オ゛", $04
+
+ charmap "ガ", $05
+ charmap "ギ", $06
+ charmap "グ", $07
+ charmap "ゲ", $08
+ charmap "ゴ", $09
+ charmap "ザ", $0a
+ charmap "ジ", $0b
+ charmap "ズ", $0c
+ charmap "ゼ", $0d
+ charmap "ゾ", $0e
+ charmap "ダ", $0f
+ charmap "ヂ", $10
+ charmap "ヅ", $11
+ charmap "デ", $12
+ charmap "ド", $13
+
+ charmap "<PLAY_G>", $14 ; "<PLAYER>くん" or "<PLAYER>ちゃん"
+
+ charmap "<15>", $15 ; nothing
+ charmap "<16>", $16 ; nothing
+
+ charmap "ネ゛", $17
+ charmap "ノ゛", $18
+
+ charmap "バ", $19
+ charmap "ビ", $1a
+ charmap "ブ", $1b
+ charmap "ボ", $1c
+
+ charmap "<NI>", $1d ; "に "
+ charmap "<TTE>", $1e ; "って"
+ charmap "<WO>", $1f ; "を "
+
+ charmap "ィ゛", $20
+ charmap "あ゛", $21
+
+ charmap "<TA!>", $22 ; "た!"
+ charmap "<KOUGEKI>", $23 ; "こうげき"
+ charmap "<WA>", $24 ; "は "
+ charmap "<NO>", $25 ; "の "
+
+ charmap "が", $26
+ charmap "ぎ", $27
+ charmap "ぐ", $28
+ charmap "げ", $29
+ charmap "ご", $2a
+ charmap "ざ", $2b
+ charmap "じ", $2c
+ charmap "ず", $2d
+ charmap "ぜ", $2e
+ charmap "ぞ", $2f
+ charmap "だ", $30
+ charmap "ぢ", $31
+ charmap "づ", $32
+ charmap "で", $33
+ charmap "ど", $34
+
+ charmap "<ROUTE>", $35 ; "ばん どうろ"
+ charmap "<WATASHI>", $36 ; "わたし"
+ charmap "<KOKO_WA>", $37 ; "ここは"
+ charmap "<RED>", $38 ; wRedsName
+ charmap "<GREEN>", $39 ; wGreensName
+
+ charmap "ば", $3a
+ charmap "び", $3b
+ charmap "ぶ", $3c
+ charmap "べ", $3d
+ charmap "ぼ", $3e
+
+ charmap "<ENEMY>", $3f
+
+ charmap "パ", $40
+ charmap "ピ", $41
+ charmap "プ", $42
+ charmap "ポ", $43
+ charmap "ぱ", $44
+ charmap "ぴ", $45
+ charmap "ぷ", $46
+ charmap "ぺ", $47
+ charmap "ぽ", $48
+
+ charmap "<MOM>", $49 ; wMomsName
+ charmap "<GA>", $4a ; "が "
+ charmap "<_CONT>", $4b ; implements "<CONT>"
+ charmap "<SCROLL>", $4c
+
+ charmap "も゜", $4d
+
+ charmap "<NEXT>", $4e
+ charmap "<LINE>", $4f
+ charmap "@", $50 ; string terminator
+ charmap "<PARA>", $51
+ charmap "<PLAYER>", $52 ; wPlayerName
+ charmap "<RIVAL>", $53 ; wRivalName
+ charmap "#", $54 ; "POKé"
+ charmap "<CONT>", $55
+ charmap "<……>", $56 ; "……"
+ charmap "<DONE>", $57
+ charmap "<PROMPT>", $58
+ charmap "<TARGET>", $59
+ charmap "<USER>", $5a
+ charmap "<PC>", $5b ; "PC"
+ charmap "<TM>", $5c ; "TM"
+ charmap "<TRAINER>", $5d ; "TRAINER"
+ charmap "<ROCKET>", $5e ; "ROCKET"
+ charmap "<DEXEND>", $5f
+
+ charmap "■", $60
+ charmap "▲", $61
+ charmap "☎", $62
+
+ charmap "D", $63
+ charmap "E", $64
+ charmap "F", $65
+ charmap "G", $66
+ charmap "H", $67
+ charmap "I", $68
+ charmap "V", $69
+ charmap "S", $6a
+ charmap "L", $6b
+ charmap "M", $6c
+
+ charmap ":", $6d
+
+ charmap "ぃ", $6e
+ charmap "ぅ", $6f
+
+ charmap "「", $70
+ charmap "」", $71
+ charmap "『", $72
+ charmap "』", $73
+ charmap "・", $74
+ charmap "…", $75
+
+ charmap "ぁ", $76
+ charmap "ぇ", $77
+ charmap "ぉ", $78
+
+ charmap "┌", $79
+ charmap "─", $7a
+ charmap "┐", $7b
+ charmap "│", $7c
+ charmap "└", $7d
+ charmap "┘", $7e
+
+ charmap " ", $7f
+
+ charmap "ア", $80
+ charmap "イ", $81
+ charmap "ウ", $82
+ charmap "エ", $83
+ charmap "オ", $84
+ charmap "カ", $85
+ charmap "キ", $86
+ charmap "ク", $87
+ charmap "ケ", $88
+ charmap "コ", $89
+ charmap "サ", $8a
+ charmap "シ", $8b
+ charmap "ス", $8c
+ charmap "セ", $8d
+ charmap "ソ", $8e
+ charmap "タ", $8f
+ charmap "チ", $90
+ charmap "ツ", $91
+ charmap "テ", $92
+ charmap "ト", $93
+ charmap "ナ", $94
+ charmap "ニ", $95
+ charmap "ヌ", $96
+ charmap "ネ", $97
+ charmap "ノ", $98
+ charmap "ハ", $99
+ charmap "ヒ", $9a
+ charmap "フ", $9b
+ charmap "ホ", $9c
+ charmap "マ", $9d
+ charmap "ミ", $9e
+ charmap "ム", $9f
+ charmap "メ", $a0
+ charmap "モ", $a1
+ charmap "ヤ", $a2
+ charmap "ユ", $a3
+ charmap "ヨ", $a4
+ charmap "ラ", $a5
+ charmap "ル", $a6
+ charmap "レ", $a7
+ charmap "ロ", $a8
+ charmap "ワ", $a9
+ charmap "ヲ", $aa
+ charmap "ン", $ab
+
+ charmap "ッ", $ac
+ charmap "ャ", $ad
+ charmap "ュ", $ae
+ charmap "ョ", $af
+ charmap "ィ", $b0
+
+ charmap "あ", $b1
+ charmap "い", $b2
+ charmap "う", $b3
+ charmap "え", $b4
+ charmap "お", $b5
+ charmap "か", $b6
+ charmap "き", $b7
+ charmap "く", $b8
+ charmap "け", $b9
+ charmap "こ", $ba
+ charmap "さ", $bb
+ charmap "し", $bc
+ charmap "す", $bd
+ charmap "せ", $be
+ charmap "そ", $bf
+ charmap "た", $c0
+ charmap "ち", $c1
+ charmap "つ", $c2
+ charmap "て", $c3
+ charmap "と", $c4
+ charmap "な", $c5
+ charmap "に", $c6
+ charmap "ぬ", $c7
+ charmap "ね", $c8
+ charmap "の", $c9
+ charmap "は", $ca
+ charmap "ひ", $cb
+ charmap "ふ", $cc
+ charmap "へ", $cd
+ charmap "ほ", $ce
+ charmap "ま", $cf
+ charmap "み", $d0
+ charmap "む", $d1
+ charmap "め", $d2
+ charmap "も", $d3
+ charmap "や", $d4
+ charmap "ゆ", $d5
+ charmap "よ", $d6
+ charmap "ら", $d7
+ charmap "り", $d8
+ charmap "る", $d9
+ charmap "れ", $da
+ charmap "ろ", $db
+ charmap "わ", $dc
+ charmap "を", $dd
+ charmap "ん", $de
+
+ charmap "っ", $df
+ charmap "ゃ", $e0
+ charmap "ゅ", $e1
+ charmap "ょ", $e2
+
+ charmap "ー", $e3
+
+ charmap "゚", $e4
+ charmap "゙", $e5
+
+ charmap "?", $e6
+ charmap "!", $e7
+ charmap "。", $e8
+
+ charmap "ァ", $e9
+ charmap "ゥ", $ea
+ charmap "ェ", $eb
+
+ charmap "▷", $ec
+ charmap "▶", $ed
+ charmap "▲", $ed
+ charmap "▼", $ee
+ charmap "♂", $ef
+ charmap "円", $f0
+ charmap "×", $f1
+ charmap ".", $f2
+ charmap "/", $f3
+
+ charmap "ォ", $f4
+
+ charmap "♀", $f5
+ charmap "0", $f6
+ charmap "1", $f7
+ charmap "2", $f8
+ charmap "3", $f9
+ charmap "4", $fa
+ charmap "5", $fb
+ charmap "6", $fc
+ charmap "7", $fd
+ charmap "8", $fe
+ charmap "9", $ff
diff --git a/tools/tests/dump_test.cc.txt b/tools/tests/dump_test.cc.txt
new file mode 100644
index 0000000..4dfd14a
--- /dev/null
+++ b/tools/tests/dump_test.cc.txt
@@ -0,0 +1,26 @@
+.loc_0000:
+ text "ほんとにりセットしますか?<LINE>@"
+ text_from_ram $ce33
+ text_bcd $ce34, $78
+ text_move $ce35
+ text_box $cc36, $08, $12
+ text_low
+ text_waitbutton
+ text_scroll
+ deciram $cc37, $6, $5
+ text_exit
+ sound_dex_fanfare_50_79
+ text_dots $14
+ link_wait_button
+ sound_dex_fanfare_20_49
+ sound_item
+ sound_caught_mon
+ sound_dex_fanfare_80_109
+ sound_fanfare
+ sound_slot_machine_start
+ cry_nidorina
+ cry_pigeot
+ cry_jugon
+ text_end
+
+.loc_0035:
diff --git a/tools/tests/dump_test.cc_endless.txt b/tools/tests/dump_test.cc_endless.txt
new file mode 100644
index 0000000..5c59830
--- /dev/null
+++ b/tools/tests/dump_test.cc_endless.txt
@@ -0,0 +1,33 @@
+.loc_0000:
+ text "ほんとにりセットしますか?<LINE>@"
+ text_from_ram $ce33
+ text_bcd $ce34, $78
+ text_move $ce35
+ text_box $cc36, $08, $12
+ text_low
+ text_waitbutton
+ text_scroll
+ deciram $cc37, $6, $5
+ text_exit
+ sound_dex_fanfare_50_79
+ text_dots $14
+ link_wait_button
+ sound_dex_fanfare_20_49
+ sound_item
+ sound_caught_mon
+ sound_dex_fanfare_80_109
+ sound_fanfare
+ sound_slot_machine_start
+ cry_nidorina
+ cry_pigeot
+ cry_jugon
+ text_end
+
+.loc_0035:
+ text "ほんとにりセットしますか?<DONE>"
+.loc_0044:
+ start_asm ; text dumper cannot dump asm
+ ; Try dumping asm from the following offset and
+ ; then continue dumping text in control mode.
+
+.loc_0045:
diff --git a/tools/tests/dump_test.cc_tc.txt b/tools/tests/dump_test.cc_tc.txt
new file mode 100644
index 0000000..e49a010
--- /dev/null
+++ b/tools/tests/dump_test.cc_tc.txt
@@ -0,0 +1,27 @@
+.loc_0000:
+ text "ほんとにりセットしますか?"
+ line "@"
+ text_from_ram $ce33
+ text_bcd $ce34, $78
+ text_move $ce35
+ text_box $cc36, $08, $12
+ text_low
+ text_waitbutton
+ text_scroll
+ deciram $cc37, $6, $5
+ text_exit
+ sound_dex_fanfare_50_79
+ text_dots $14
+ link_wait_button
+ sound_dex_fanfare_20_49
+ sound_item
+ sound_caught_mon
+ sound_dex_fanfare_80_109
+ sound_fanfare
+ sound_slot_machine_start
+ cry_nidorina
+ cry_pigeot
+ cry_jugon
+ text_end
+
+.loc_0035:
diff --git a/tools/tests/dump_test.cc_tc_endless.txt b/tools/tests/dump_test.cc_tc_endless.txt
new file mode 100644
index 0000000..dbf8e8b
--- /dev/null
+++ b/tools/tests/dump_test.cc_tc_endless.txt
@@ -0,0 +1,35 @@
+.loc_0000:
+ text "ほんとにりセットしますか?"
+ line "@"
+ text_from_ram $ce33
+ text_bcd $ce34, $78
+ text_move $ce35
+ text_box $cc36, $08, $12
+ text_low
+ text_waitbutton
+ text_scroll
+ deciram $cc37, $6, $5
+ text_exit
+ sound_dex_fanfare_50_79
+ text_dots $14
+ link_wait_button
+ sound_dex_fanfare_20_49
+ sound_item
+ sound_caught_mon
+ sound_dex_fanfare_80_109
+ sound_fanfare
+ sound_slot_machine_start
+ cry_nidorina
+ cry_pigeot
+ cry_jugon
+ text_end
+
+.loc_0035:
+ text "ほんとにりセットしますか?"
+ done
+.loc_0044:
+ start_asm ; text dumper cannot dump asm
+ ; Try dumping asm from the following offset and
+ ; then continue dumping text in control mode.
+
+.loc_0045:
diff --git a/tools/tests/dump_test.endless.txt b/tools/tests/dump_test.endless.txt
new file mode 100644
index 0000000..fbbdeef
--- /dev/null
+++ b/tools/tests/dump_test.endless.txt
@@ -0,0 +1,9 @@
+.loc_0000:
+ db "<NULL>ほんとにりセットしますか?<LINE>@"
+.loc_0010:
+ db "イ゛でほヴどほぉエ゛<ROUTE>ほオ゛<WATASHI>ふゲデガギグゴ<KOKO_WA>ふFザジズ<PLAY_G>ゼゾダヂヅデド<PLAY_G><15><16>@"
+.loc_0035:
+ db "<NULL>ほんとにりセットしますか?<DONE>"
+.loc_0044:
+ db "ゲ"
+.loc_0045:
diff --git a/tools/tests/dump_test.tc.txt b/tools/tests/dump_test.tc.txt
new file mode 100644
index 0000000..82c276d
--- /dev/null
+++ b/tools/tests/dump_test.tc.txt
@@ -0,0 +1,4 @@
+.loc_0000:
+ db "<NULL>ほんとにりセットしますか?"
+ line "@"
+.loc_0010:
diff --git a/tools/tests/dump_test.tc_endless.txt b/tools/tests/dump_test.tc_endless.txt
new file mode 100644
index 0000000..37bdda0
--- /dev/null
+++ b/tools/tests/dump_test.tc_endless.txt
@@ -0,0 +1,11 @@
+.loc_0000:
+ db "<NULL>ほんとにりセットしますか?"
+ line "@"
+.loc_0010:
+ db "イ゛でほヴどほぉエ゛<ROUTE>ほオ゛<WATASHI>ふゲデガギグゴ<KOKO_WA>ふFザジズ<PLAY_G>ゼゾダヂヅデド<PLAY_G><15><16>@"
+.loc_0035:
+ db "<NULL>ほんとにりセットしますか?"
+ done
+.loc_0044:
+ db "ゲ"
+.loc_0045:
diff --git a/tools/tests/dump_test.txt b/tools/tests/dump_test.txt
new file mode 100644
index 0000000..a181744
--- /dev/null
+++ b/tools/tests/dump_test.txt
@@ -0,0 +1,3 @@
+.loc_0000:
+ db "<NULL>ほんとにりセットしますか?<LINE>@"
+.loc_0010:
diff --git a/tools/tests/dump_text_test.bin b/tools/tests/dump_text_test.bin
new file mode 100644
index 0000000..778a446
--- /dev/null
+++ b/tools/tests/dump_text_test.bin
Binary files differ
diff --git a/vram.asm b/vram.asm
new file mode 100644
index 0000000..05f3199
--- /dev/null
+++ b/vram.asm
@@ -0,0 +1,21 @@
+vChars0 EQU $8000
+vChars1 EQU $8800
+vChars2 EQU $9000
+vBGMap0 EQU $9800
+vBGMap1 EQU $9c00
+
+; Battle/Menu
+vSprites EQU vChars0
+vFont EQU vChars1
+vFrontPic EQU vChars2
+vBackPic EQU vFrontPic + 7 * 7 * $10
+
+; Overworld
+vNPCSprites EQU vChars0
+vNPCSprites2 EQU vChars1
+vTileset EQU vChars2
+
+; Title
+vTitleLogo EQU vChars1
+vTitleLogo2 EQU vFrontPic + 7 * 7 * $10
+
diff --git a/wram.asm b/wram.asm
index 745f71e..44a4323 100644
--- a/wram.asm
+++ b/wram.asm
@@ -81,27 +81,53 @@ SECTION "LY overrides buffer", WRAM0[$C600]
wLYOverrides:: ; c600
ds SCREEN_HEIGHT_PX
+SECTION "CB14", WRAM0[$CB14]
+
+UNION
+wRedrawRowOrColumnSrcTiles:: ; cb14
+; the tiles of the row or column to be redrawn by RedrawRowOrColumn
+ ds SCREEN_WIDTH * 2
+NEXTU
+wRedrawFlashlightDst0:: dw ; cb14
+wRedrawFlashlightSrc0:: dw ; cb16
+wRedrawFlashlightBlackDst0:: dw ; cb18
+wRedrawFlashlightDst1:: dw ; cb1a
+wRedrawFlashlightSrc1:: dw ; cb1c
+wRedrawFlashlightBlackDst1:: dw ; cb1e
+wRedrawFlashlightWidthHeight:: db ; cb20
+; width or height of flashlight redraw region
+; in units of two tiles (people event meta tile)
+ENDU
+
SECTION "CB56", WRAM0[$CB5B]
wcb5b:: ds 1 ; multipurpose, also wName, wMonDexIndex2
wNameCategory:: ds 1
SECTION "CB62", WRAM0[$CB62]
-wVBCopySize:: ds 1
-wVBCopySrc:: ds 2
-wVBCopyDst:: ds 2
-wVBCopyDoubleSize:: ds 1
-wVBCopyDoubleSrc:: ds 2
-wVBCopyDoubleDst:: ds 2
+wVBCopySize:: ds 1 ; cb62
+wVBCopySrc:: ds 2 ; cb63
+wVBCopyDst:: ds 2 ; cb65
+wVBCopyDoubleSize:: ds 1 ; cb67
+wVBCopyDoubleSrc:: ds 2 ; cb68
+wVBCopyDoubleDst:: ds 2 ; cb6a
+
+SECTION "CB71", WRAM0[$CB71]
+
+wVBCopyFarSize:: ds 1 ; cb71
+wVBCopyFarSrc:: ds 2 ; cb72
+wVBCopyFarDst:: ds 2 ; cb74
+wVBCopyFarSrcBank:: ds 1 ; cb76
SECTION "CBD2", WRAM0[$CBD2]
wcbd2:: ; cbd2
ds $14
-SECTION "CC33", WRAM0[$CC33] ; Please merge when more is disassembled
+SECTION "CC32", WRAM0[$CC32] ; Please merge when more is disassembled
+wVBlankJoyFrameCounter: db ; cc32
-wVBlankOccurred: db
+wVBlankOccurred: db ; cc33
ds 4
@@ -134,7 +160,35 @@ wSpriteOutputPtrCached : ds 2 ; ccba
wSpriteDecodeTable0Ptr : ds 2 ; ccbc
wSpriteDecodeTable1Ptr : ds 2 ; ccbe
-SECTION "CD4F", WRAM0[$CD4F]
+SECTION "CCC7", WRAM0[$CCC7]
+
+wDisableVBlankOAMUpdate:: db ; ccc7
+
+SECTION "CCCA", WRAM0[$CCCA]
+
+wBGP:: db ; ccca
+wOBP0:: db ; cccb
+wOBP1:: db ; cccc
+
+SECTION "CCCE", WRAM0[$CCCE]
+
+wDisableVBlankWYUpdate:: db ; ccce
+
+SECTION "CD26", WRAM0[$CD26]
+
+wcd26:: ; cd26
+ db
+
+SECTION "CD31", WRAM0[$CD31]
+
+wcd31:: ; cd31
+ db
+
+SECTION "CD4A", WRAM0[$CD4A]
+
+wTextDest:: ds 2; cd4a
+
+ ds 3 ; TODO
wPredefID:: ; cd4f
db
@@ -148,10 +202,29 @@ wPredefBC:: ; cd54
wFarCallBCBuffer:: ; cd54
dw
-SECTION "CD78", WRAM0[$CD78]
+SECTION "CD76", WRAM0[$CD76]
+
+wcd76:: ; cd76
+ db
+
+wcd77:: ;cd77
+ db
wMonDexIndex: ds 1 ; cd78
+SECTION "CD7D", WRAM0[$CD7D]
+
+wItemQuantity:: ; cd7d
+ db
+
+SECTION "CDBD", WRAM0[$CDBD]
+
+wLinkMode:: db ; cdbd
+; 00 -
+; 01 -
+; 02 -
+; 03 -
+
SECTION "CE00", WRAM0[$CE00]
wBattleMode:: ; ce00
@@ -164,83 +237,144 @@ wMonHeader::
wMonHIndex:: ; ce07
; In the ROM base stats data structure, this is the dex number, but it is
; overwritten with the dex number after the header is copied to WRAM.
- ds 1
+ ds 1
wMonHBaseStats:: ; ce08
wMonHBaseHP:: ; ce08
- ds 1
+ ds 1
wMonHBaseAttack:: ; ce09
- ds 1
+ ds 1
wMonHBaseDefense:: ; ce0a
- ds 1
+ ds 1
wMonHBaseSpeed:: ; ce0b
- ds 1
+ ds 1
wMonHBaseSpecialAtt:: ; ce0c
- ds 1
+ ds 1
wMonHBaseSpecialDef:: ; ce0d
- ds 1
+ ds 1
wMonHTypes:: ; ce0e
wMonHType1:: ; ce0e
- ds 1
+ ds 1
wMonHType2:: ; ce0f
- ds 1
+ ds 1
wMonHCatchRate:: ; ce10
- ds 1
+ ds 1
wMonHBaseEXP:: ; ce11
- ds 1
+ ds 1
wMonHItems:: ; ce12
wMonHItem1:: ; ce12
- ds 1
+ ds 1
wMonHItem2:: ; ce13
- ds 1
+ ds 1
wMonHGenderRatio:: ; ce14
- ds 1
+ ds 1
wMonHUnk0:: ; ce15
- ds 1
+ ds 1
wMonHUnk1:: ; ce16
- ds 1
+ ds 1
wMonHUnk2:: ; ce17
- ds 1
+ ds 1
wMonHSpriteDim:: ; ce18
- ds 1
+ ds 1
wMonHFrontSprite:: ; ce19
- ds 2
+ ds 2
wMonHBackSprite:: ; ce1b
- ds 2
+ ds 2
wMonHGrowthRate:: ; ce1d
- ds 1
+ ds 1
wMonHLearnset:: ; ce1e
; bit field
- flag_array 50 + 5
- ds 1
+ flag_array 50 + 5
+ ds 1
-SECTION "CE3C", WRAM0[$CE3C]
+SECTION "CE37", WRAM0[$CE37]
+
+wce37:: ; ce37
+ db
+
+SECTION "CE3B", WRAM0[$CE3B]
+
+wVBlankSavedROMBank:: ; ce3b
+ db
wBuffer:: ; ce3c
db
+wTimeOfDay:: db ; ce3d
+; based on RTC
+; Time of Day Regular Debug
+; 00 - Day 09--15h 00--30s
+; 01 - Night 15--06h 30--35s
+; 02 - Cave 35--50s
+; 03 - Morning 06--09h 50--59s
SECTION "CE5F", WRAM0[$CE5F]
wce5f:: ; ce5f ; TODO
db
+SECTION "CE63", WRAM0[$CE63]
+
+wce63:: db ; ce63
+; 76543210
+; \-- global debug enable
+
+SECTION "D152", WRAM0[$D152]
+
+wMapTimeOfDayPalette:: db ; d152
+; Applied according to wMapTimeOfDay from wMapTimeOfDayPaletteMap
+
+wd153:: db ; d153
+; 76543210
+; \-------- switch overworld palettes according to seconds not hours
+
+ ds 3 ; TODO
+wd157:: db ; d157
+; 76543210
+; \-------- disable overworld palette switch
+
+wMapTimeOfDayPaletteMap:: db ; d158
+; 76543210
+; \/\/\/\/
+; | | | \- Map Palette for TimeOfDay 0x00
+; | | \--- Map Palette for TimeOfDay 0x01
+; | \----- Map Palette for TimeOfDay 0x02
+; \------- Map Palette for TimeOfDay 0x03
+
+wMapTimeOfDay:: db ; d159
+
+SECTION "D19E", WRAM0[$D19E]
+
+wNumBagItems:: ; d19e
+ db
+
+SECTION "D4AB", WRAM0[$D4AB]
+
+wJoypadFlags:: db ; d4ab
+; 76543210
+; ||||\__/
+; |||| \-- unkn
+; |||\----- unkn
+; ||\------ don't wait for keypress to close text box
+; |\------- joypad sync mtx
+; \-------- joypad disabled
+
SECTION "PokeDexFlags", WRAM0[$D81A]
wPokedexOwned:: ; d81a
- flag_array NUM_POKEMON
+ flag_array NUM_POKEMON
wPokedexOwnedEnd:: ; d839
wPokedexSeen:: ; d83a
- flag_array NUM_POKEMON
+ flag_array NUM_POKEMON
wPokedexSeenEnd:: ; d859
wAnnonDex:: ds 26 ; d85a