shithub: pokecrystal

Download patch

ref: 19aee926af86c1351ca85ca45da26f5d6f3cd8d6
parent: 93ed0ed19ce615f99a36062cd2133e8ee2e75cc1
parent: 164e1b89afc1773a14598c377c8c8d0bfa01a1a1
author: mid-kid <esteve.varela@gmail.com>
date: Fri Apr 17 14:25:59 EDT 2020

Merge pull request #712 from Rangi42/master

Miscellaneous fixes

--- a/FAQ.md
+++ b/FAQ.md
@@ -58,7 +58,7 @@
 
 If you have not changed any of the asm, make sure you have the latest version of pokecrystal and the correct version of rgbds (see [INSTALL.md](INSTALL.md)).
 
-If you added or changed any code, it has to fit in the **memory banks**. The 2MB ROM is divided into 128 banks of 4KB ($4000 bytes) each, numbered $00 to $7F. The linkerscript [pokecrystal.link](pokecrystal.link) lists which `SECTION`s go in which banks. Try moving some code into a new section.
+If you added or changed any code, it has to fit in the **memory banks**. The 2MB ROM is divided into 128 banks of 4KB ($4000 bytes) each, numbered $00 to $7F. The linkerscript [layout.link](layout.link) lists which `SECTION`s go in which banks. Try moving some code into a new section.
 
 ### "Invalid file or object file version"
 
--- a/Makefile
+++ b/Makefile
@@ -50,7 +50,7 @@
 crystal-au: pokecrystal-au.gbc
 
 clean:
-	rm -f $(roms) $(crystal_obj) $(crystal11_obj) $(crystal_au_obj) $(roms:.gbc=.map) $(roms:.gbc=.sym)
+	rm -f $(roms) $(crystal_obj) $(crystal11_obj) $(crystal_au_obj) $(roms:.gbc=.map) $(roms:.gbc=.sym) rgbdscheck.o
 	find gfx \( -name "*.[12]bpp" -o -name "*.lz" -o -name "*.gbcpal" -o -name "*.sgb.tilemap" \) -delete
 	find gfx/pokemon -mindepth 1 ! -path "gfx/pokemon/unown/*" \( -name "bitmask.asm" -o -name "frames.asm" -o -name "front.animated.tilemap" -o -name "front.dimensions" \) -delete
 	$(MAKE) clean -C tools/
@@ -71,11 +71,14 @@
 $(crystal11_obj):  RGBASMFLAGS += -D _CRYSTAL11
 $(crystal_au_obj): RGBASMFLAGS += -D _CRYSTAL11 -D _CRYSTAL_AU
 
+rgbdscheck.o: rgbdscheck.asm
+	$(RGMASM) -o $@ $<
+
 # The dep rules have to be explicit or else missing files won't be reported.
 # As a side effect, they're evaluated immediately instead of when the rule is invoked.
 # It doesn't look like $(shell) can be deferred so there might not be a better way.
 define DEP
-$1: $2 $$(shell tools/scan_includes $2)
+$1: $2 $$(shell tools/scan_includes $2) | rgbdscheck.o
 	$$(RGBASM) $$(RGBASMFLAGS) -o $$@ $$<
 endef
 
@@ -92,17 +95,17 @@
 endif
 
 
-pokecrystal.gbc: $(crystal_obj) pokecrystal.link
-	$(RGBLINK) -n pokecrystal.sym -m pokecrystal.map -l pokecrystal.link -o $@ $(crystal_obj)
-	$(RGBFIX) -Cjv -i BYTE -k 01 -l 0x33 -m 0x10 -p 0 -r 3 -t PM_CRYSTAL $@
+pokecrystal.gbc: $(crystal_obj) layout.link
+	$(RGBLINK) -n pokecrystal.sym -m pokecrystal.map -l layout.link -p 0 -o $@ $(crystal_obj)
+	$(RGBFIX) -Cjv -t PM_CRYSTAL -i BYTE -k 01 -l 0x33 -m 0x10 -r 3 -p 0 $@
 
-pokecrystal11.gbc: $(crystal11_obj) pokecrystal.link
-	$(RGBLINK) -n pokecrystal11.sym -m pokecrystal11.map -l pokecrystal.link -o $@ $(crystal11_obj)
-	$(RGBFIX) -Cjv -i BYTE -k 01 -l 0x33 -m 0x10 -n 1 -p 0 -r 3 -t PM_CRYSTAL $@
+pokecrystal11.gbc: $(crystal11_obj) layout.link
+	$(RGBLINK) -n pokecrystal11.sym -m pokecrystal11.map -l layout.link -p 0 -o $@ $(crystal11_obj)
+	$(RGBFIX) -Cjv -t PM_CRYSTAL -i BYTE -n 1 -k 01 -l 0x33 -m 0x10 -r 3 -p 0 $@
 
-pokecrystal-au.gbc: $(crystal_au_obj) pokecrystal.link
-	$(RGBLINK) -n pokecrystal-au.sym -m pokecrystal-au.map -l pokecrystal.link -o $@ $(crystal_au_obj)
-	$(RGBFIX) -Cjv -i BYTU -k 01 -l 0x33 -m 0x10 -p 0 -r 3 -t PM_CRYSTAL $@
+pokecrystal-au.gbc: $(crystal_au_obj) layout.link
+	$(RGBLINK) -n pokecrystal-au.sym -m pokecrystal-au.map -l layout.link -p 0 -o $@ $(crystal_au_obj)
+	$(RGBFIX) -Cjv -t PM_CRYSTAL -i BYTU -k 01 -l 0x33 -m 0x10 -r 3 -p 0 $@
 
 
 # For files that the compressor can't match, there will be a .lz file suffixed with the md5 hash of the correct uncompressed file.
--- a/constants.asm
+++ b/constants.asm
@@ -1,7 +1,3 @@
-if __RGBDS_MAJOR__ <= 0 && __RGBDS_MINOR__ < 4
-	fail "pokecrystal requires rgbds 0.4.0 or newer."
-endc
-
 INCLUDE "charmap.asm"
 
 INCLUDE "macros.asm"
--- a/docs/design_flaws.md
+++ b/docs/design_flaws.md
@@ -85,7 +85,7 @@
 
 ```asm
 ; PokemonPicPointers and UnownPicPointers are assumed to start at the same
-; address, but in different banks. This is enforced in pokecrystal.link.
+; address, but in different banks. This is enforced in layout.link.
 
 
 SECTION "Pic Pointers", ROMX
@@ -98,7 +98,7 @@
 INCLUDE "data/pokemon/unown_pic_pointers.asm"
 ```
 
-In [pokecrystal.link](https://github.com/pret/pokecrystal/blob/master/pokecrystal.link):
+In [layout.link](https://github.com/pret/pokecrystal/blob/master/layout.link):
 
 ```
 ROMX $48
@@ -113,7 +113,7 @@
 
 **Fix:**
 
-Don't enforce `org $4000` in [pokecrystal.link](https://github.com/pret/pokecrystal/blob/master/pokecrystal.link).
+Don't enforce `org $4000` in [layout.link](https://github.com/pret/pokecrystal/blob/master/layout.link).
 
 Edit `GetFrontpicPointer`:
 
--- a/engine/events/diploma.asm
+++ b/engine/events/diploma.asm
@@ -52,7 +52,7 @@
 PrintDiplomaPage2:
 	hlcoord 0, 0
 	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
-	ld a, $7f
+	ld a, " "
 	call ByteFill
 	ld hl, DiplomaPage2Tilemap
 	decoord 0, 0
--- a/engine/events/print_unown.asm
+++ b/engine/events/print_unown.asm
@@ -112,7 +112,7 @@
 	ld a, [hl]
 	and a
 	jr nz, .wrap_around_left
-	ld [hl], 26 + 1
+	ld [hl], NUM_UNOWN + 1
 .wrap_around_left
 	dec [hl]
 	jr .return
@@ -120,7 +120,7 @@
 .press_right
 	ld hl, wJumptableIndex
 	ld a, [hl]
-	cp 26
+	cp NUM_UNOWN
 	jr c, .wrap_around_right
 	ld [hl], -1
 .wrap_around_right
@@ -132,7 +132,7 @@
 
 .UpdateUnownFrontpic:
 	ld a, [wJumptableIndex]
-	cp 26
+	cp NUM_UNOWN
 	jr z, .vacant
 	inc a
 	ld [wUnownLetter], a
--- a/engine/events/print_unown_2.asm
+++ b/engine/events/print_unown_2.asm
@@ -1,7 +1,7 @@
 RotateUnownFrontpic:
 ; something to do with Unown printer
 	push de
-	xor a ; sScratch
+	xor a ; BANK(sScratch)
 	call GetSRAMBank
 	ld hl, sScratch
 	ld bc, 0
--- a/engine/menus/init_gender.asm
+++ b/engine/menus/init_gender.asm
@@ -59,9 +59,9 @@
 InitGenderScreen:
 	ld a, $10
 	ld [wMusicFade], a
-	ld a, MUSIC_NONE
+	ld a, LOW(MUSIC_NONE)
 	ld [wMusicFadeID], a
-	ld a, $0
+	ld a, HIGH(MUSIC_NONE)
 	ld [wMusicFadeID + 1], a
 	ld c, 8
 	call DelayFrames
--- a/engine/menus/intro_menu.asm
+++ b/engine/menus/intro_menu.asm
@@ -1206,7 +1206,7 @@
 	inc [hl]
 
 ; Fade out the title screen music
-	xor a
+	xor a ; MUSIC_NONE
 	ld [wMusicFadeID], a
 	ld [wMusicFadeID + 1], a
 	ld hl, wMusicFade
--- a/engine/menus/options_menu.asm
+++ b/engine/menus/options_menu.asm
@@ -1,12 +1,24 @@
+; GetOptionPointer.Pointers indexes
+	const_def
+	const OPT_TEXT_SPEED   ; 0
+	const OPT_BATTLE_SCENE ; 1
+	const OPT_BATTLE_STYLE ; 2
+	const OPT_SOUND        ; 3
+	const OPT_PRINT        ; 4
+	const OPT_MENU_ACCOUNT ; 5
+	const OPT_FRAME        ; 6
+	const OPT_CANCEL       ; 7
+NUM_OPTIONS EQU const_value    ; 8
+
 _OptionsMenu:
 	ld hl, hInMenu
 	ld a, [hl]
 	push af
-	ld [hl], $1
+	ld [hl], TRUE
 	call ClearBGPalettes
 	hlcoord 0, 0
-	ld b, 16
-	ld c, 18
+	ld b, SCREEN_HEIGHT - 2
+	ld c, SCREEN_WIDTH - 2
 	call Textbox
 	hlcoord 2, 2
 	ld de, StringOptions
@@ -13,9 +25,10 @@
 	call PlaceString
 	xor a
 	ld [wJumptableIndex], a
-	ld c, $6 ; number of items on the menu minus 1 (for cancel)
 
-.print_text_loop ; this next will display the settings of each option when the menu is opened
+; display the settings of each option when the menu is opened
+	ld c, NUM_OPTIONS - 2 ; omit frame type, the last option
+.print_text_loop
 	push bc
 	xor a
 	ldh [hJoyLast], a
@@ -25,8 +38,8 @@
 	inc [hl]
 	dec c
 	jr nz, .print_text_loop
+	call UpdateFrame ; display the frame type
 
-	call UpdateFrame
 	xor a
 	ld [wJumptableIndex], a
 	inc a
@@ -78,8 +91,8 @@
 	db "CANCEL@"
 
 GetOptionPointer:
-	ld a, [wJumptableIndex] ; load the cursor position to a
-	ld e, a ; copy it to de
+	ld a, [wJumptableIndex]
+	ld e, a
 	ld d, 0
 	ld hl, .Pointers
 	add hl, de
@@ -87,9 +100,10 @@
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
-	jp hl ; jump to the code of the current highlighted item
+	jp hl
 
 .Pointers:
+; entries correspond to OPT_* constants
 	dw Options_TextSpeed
 	dw Options_BattleScene
 	dw Options_BattleStyle
@@ -346,7 +360,7 @@
 	ld [wGBPrinterBrightness], a
 
 .NonePressed:
-	ld b, $0
+	ld b, 0
 	ld hl, .Strings
 	add hl, bc
 	add hl, bc
@@ -500,17 +514,17 @@
 	ret
 
 .DownPressed:
-	ld a, [hl] ; load the cursor position to a
-	cp $7 ; maximum number of items in option menu
-	jr nz, .CheckFive
-	ld [hl], $0
+	ld a, [hl]
+	cp OPT_CANCEL ; maximum option index
+	jr nz, .CheckMenuAccount
+	ld [hl], OPT_TEXT_SPEED ; first option
 	scf
 	ret
 
-.CheckFive: ; I have no idea why this exists...
-	cp $5
+.CheckMenuAccount: ; I have no idea why this exists...
+	cp OPT_MENU_ACCOUNT
 	jr nz, .Increase
-	ld [hl], $5
+	ld [hl], OPT_MENU_ACCOUNT
 
 .Increase:
 	inc [hl]
@@ -519,16 +533,18 @@
 
 .UpPressed:
 	ld a, [hl]
-	cp $6
-	jr nz, .NotSix
-	ld [hl], $5 ; Another thing where I'm not sure why it exists
+
+; Another thing where I'm not sure why it exists
+	cp OPT_FRAME
+	jr nz, .NotFrame
+	ld [hl], OPT_MENU_ACCOUNT
 	scf
 	ret
 
-.NotSix:
-	and a
+.NotFrame:
+	and a ; OPT_TEXT_SPEED, minimum option index
 	jr nz, .Decrease
-	ld [hl], $8 ; number of option items +1
+	ld [hl], NUM_OPTIONS ; decrements to OPT_CANCEL, maximum option index
 
 .Decrease:
 	dec [hl]
@@ -538,7 +554,7 @@
 Options_UpdateCursorPosition:
 	hlcoord 1, 1
 	ld de, SCREEN_WIDTH
-	ld c, $10
+	ld c, SCREEN_HEIGHT - 2
 .loop
 	ld [hl], " "
 	add hl, de
--- a/engine/movie/credits.asm
+++ b/engine/movie/credits.asm
@@ -85,7 +85,7 @@
 	xor a
 	ldh [hBGMapMode], a
 	ld [wCreditsPos], a
-	ld [wCreditsUnusedCD21], a
+	ld [wCreditsPos + 1], a
 	ld [wCreditsTimer], a
 
 .execution_loop
--- a/engine/overworld/map_setup.asm
+++ b/engine/overworld/map_setup.asm
@@ -226,9 +226,9 @@
 	ret
 
 FadeMapMusicAndPalettes:
-	ld e, 0
+	ld e, LOW(MUSIC_NONE)
 	ld a, [wMusicFadeID]
-	ld d, 0
+	ld d, HIGH(MUSIC_NONE)
 	ld a, [wMusicFadeID + 1]
 	ld a, $4
 	ld [wMusicFade], a
--- a/gfx/pics.asm
+++ b/gfx/pics.asm
@@ -2,7 +2,7 @@
 
 
 ; PokemonPicPointers and UnownPicPointers are assumed to start at the same
-; address, but in different banks. This is enforced in pokecrystal.link.
+; address, but in different banks. This is enforced in layout.link.
 
 
 SECTION "Pic Pointers", ROMX
--- /dev/null
+++ b/layout.link
@@ -1,0 +1,367 @@
+ROM0
+	org $0000
+	"NULL"
+	org $0000
+	"rst0"
+	org $0008
+	"rst8"
+	org $0010
+	"rst10"
+	org $0018
+	"rst18"
+	org $0020
+	"rst20"
+	org $0028
+	"rst28"
+	org $0038
+	"rst38"
+	org $0040
+	"vblank"
+	org $0048
+	"lcd"
+	org $0050
+	"timer"
+	org $0058
+	"serial"
+	org $0060
+	"joypad"
+	org $0100
+	"Header"
+	org $0150
+	"Home"
+ROMX $01
+	"bank1"
+ROMX $02
+	"bank2"
+ROMX $03
+	"bank3"
+ROMX $04
+	"bank4"
+ROMX $05
+	"bank5"
+ROMX $06
+	"Tileset Data 1"
+ROMX $07
+	"Roofs"
+	"Tileset Data 2"
+	"Extra Songs 1"
+ROMX $08
+	"Clock Reset"
+	"Tileset Data 3"
+	"Egg Moves"
+ROMX $09
+	"bank9"
+ROMX $0a
+	"bankA"
+ROMX $0b
+	"bankB"
+ROMX $0c
+	"Tileset Data 4"
+ROMX $0d
+	"Effect Commands"
+ROMX $0e
+	"Enemy Trainers"
+ROMX $0f
+	"Battle Core"
+ROMX $10
+	"bank10"
+	"Evolutions and Attacks"
+ROMX $11
+	"bank11"
+ROMX $12
+	"Crystal Features 1"
+ROMX $13
+	"bank13"
+ROMX $14
+	"bank14"
+ROMX $15
+	"Map Scripts 1"
+ROMX $16
+	"Map Scripts 2"
+ROMX $17
+	"Map Scripts 3"
+ROMX $18
+	"Map Scripts 4"
+ROMX $19
+	"Crystal Phone Text"
+ROMX $1a
+	"Map Scripts 5"
+ROMX $1b
+	"Map Scripts 6"
+ROMX $1c
+	"Map Scripts 7"
+ROMX $1d
+	"Map Scripts 8"
+ROMX $1e
+	"Map Scripts 9"
+ROMX $1f
+	"Map Scripts 10"
+ROMX $20
+	"bank20"
+ROMX $21
+	"bank21"
+ROMX $22
+	"Crystal Features 2"
+ROMX $23
+	"bank23"
+ROMX $24
+	"bank24"
+ROMX $25
+	"Maps"
+	"Events"
+ROMX $26
+	"Map Scripts 11"
+ROMX $27
+	"Map Scripts 12"
+ROMX $28
+	"Phone Scripts 1"
+ROMX $29
+	"Phone Text"
+ROMX $2a
+	"Map Blocks 1"
+ROMX $2b
+	"Map Blocks 2"
+ROMX $2c
+	"Map Blocks 3"
+ROMX $2d
+	"Tileset Data 5"
+ROMX $2e
+	"bank2E"
+ROMX $2f
+	"Phone Scripts 2"
+ROMX $30
+	"Sprites 1"
+ROMX $31
+	"Sprites 2"
+ROMX $32
+	"bank32"
+ROMX $33
+	"Move Animations"
+	"Extra Songs 2"
+ROMX $34
+	"Pic Animations 1"
+ROMX $35
+	"Pic Animations 2"
+ROMX $36
+	"Font Inversed"
+	"Pic Animations 3"
+ROMX $37
+	"Tileset Data 6"
+ROMX $38
+	"bank38"
+ROMX $39
+	"bank39"
+ROMX $3a
+	"Audio"
+	"Songs 1"
+ROMX $3b
+	"Songs 2"
+ROMX $3c
+	"Songs 3"
+	"Sound Effects"
+	"Cries"
+ROMX $3d
+	"Songs 4"
+ROMX $3e
+	"bank3E"
+ROMX $3f
+	"bank3F"
+ROMX $40
+	"mobile40"
+ROMX $41
+	"bank41"
+ROMX $42
+	"mobile42"
+	"Intro Logo"
+	"Credits"
+ROMX $43
+	"Title"
+ROMX $44
+	"Mobile Adapter SDK"
+ROMX $45
+	"mobile45"
+ROMX $46
+	"mobile46"
+ROMX $47
+	"Battle Tower"
+ROMX $48
+	org $4000
+	"Pic Pointers"
+	"Pics 1"
+ROMX $49
+	org $4000
+	"Unown Pic Pointers"
+	"Pics 2"
+ROMX $4a
+	"Trainer Pic Pointers"
+	"Pics 3"
+ROMX $4b
+	"Pics 4"
+ROMX $4c
+	"Pics 5"
+ROMX $4d
+	"Pics 6"
+ROMX $4e
+	"Pics 7"
+ROMX $4f
+	"Pics 8"
+ROMX $50
+	"Pics 9"
+ROMX $51
+	"Pics 10"
+ROMX $52
+	"Pics 11"
+ROMX $53
+	"Pics 12"
+ROMX $54
+	"Pics 13"
+ROMX $55
+	"Pics 14"
+ROMX $56
+	"Pics 15"
+ROMX $57
+	"Pics 16"
+ROMX $58
+	"Pics 17"
+ROMX $59
+	"Pics 18"
+ROMX $5a
+	"Pics 19"
+ROMX $5b
+	"bank5B"
+	"Pics 20"
+ROMX $5c
+	"mobile5C"
+	"Pics 21"
+ROMX $5d
+	"Crystal Phone Text 2"
+	"Pics 22"
+ROMX $5e
+	"UpdateBattleHUDs"
+	"Songs 5"
+	"Crystal Sound Effects"
+	"mobile5E"
+	"Pics 23"
+ROMX $5f
+	"mobile5F"
+	"Pics 24"
+ROMX $60
+	"Map Scripts 13"
+	"Pokedex Entries 001-064"
+ROMX $61
+	"Map Scripts 14"
+ROMX $62
+	"Map Scripts 15"
+ROMX $63
+	"Map Scripts 16"
+ROMX $64
+	"Map Scripts 17"
+ROMX $65
+	"Map Scripts 18"
+ROMX $66
+	"Map Scripts 19"
+ROMX $67
+	"Map Scripts 20"
+ROMX $68
+	"Map Scripts 21"
+ROMX $69
+	"Map Scripts 22"
+ROMX $6a
+	"Map Scripts 23"
+ROMX $6b
+	"Map Scripts 24"
+ROMX $6c
+	"Phone Text 2"
+	"Map Scripts 25"
+ROMX $6d
+	"Special Phone Text"
+ROMX $6e
+	"Pokedex Entries 065-128"
+ROMX $6f
+	"Text 1"
+ROMX $70
+	"Text 2"
+ROMX $71
+	"Text 3"
+ROMX $72
+	"Miscellaneous Text"
+ROMX $73
+	"Pokedex Entries 129-192"
+ROMX $74
+	"Pokedex Entries 193-251"
+ROMX $77
+	"bank77"
+	"Tileset Data 7"
+	"bank77_2"
+ROMX $78
+	"Tileset Data 8"
+ROMX $7b
+	"Battle Tower Text"
+ROMX $7c
+	"Battle Tower Trainer Data"
+ROMX $7d
+	"Mobile News Data"
+ROMX $7e
+	"Crystal Events"
+ROMX $7f
+	org $7de0
+	"Mobile Stadium 2"
+WRAM0
+	"Stack"
+	"Audio RAM"
+	"WRAM"
+	"wSpriteAnims"
+	align 8
+	"Sprites"
+	"Tilemap"
+	"Miscellaneous"
+	"Overworld Map"
+	"Video"
+WRAMX 1
+	"WRAM 1"
+	"Enemy Party"
+	"Party"
+WRAMX 2
+	"Pic Animations"
+WRAMX 3
+	"Battle Tower RAM"
+WRAMX 5
+	align 8
+	"GBC Video"
+	org $d300
+	"Battle Animations"
+	org $d800
+	"Mobile RAM"
+WRAMX 6
+	"Scratch RAM"
+WRAMX 7
+	"Stack RAM"
+VRAM $00
+	"VRAM0"
+VRAM $01
+	"VRAM1"
+SRAM $00
+	"Scratch"
+	org $a600
+	"SRAM Bank 0"
+	org $b200
+	"Backup Save"
+SRAM $01
+	"Save"
+	"Active Box"
+	"Link Battle Data"
+	"SRAM Hall of Fame"
+	"SRAM Crystal Data"
+	"SRAM Battle Tower"
+SRAM $02
+	"Boxes 1-7"
+SRAM $03
+	"Boxes 8-14"
+SRAM $04
+	"SRAM Mobile 1"
+SRAM $05
+	"SRAM Mobile 2"
+SRAM $06
+	"SRAM Mobile 3"
+HRAM
+	"HRAM"
--- a/mobile/mobile_45_sprite_engine.asm
+++ b/mobile/mobile_45_sprite_engine.asm
@@ -704,9 +704,9 @@
 .asm_11642a
 	ld a, $8
 	ld [wMusicFade], a
-	ld a, $0
+	ld a, LOW(MUSIC_NONE)
 	ld [wMusicFadeID], a
-	ld a, $0
+	ld a, HIGH(MUSIC_NONE)
 	ld [wMusicFadeID + 1], a
 
 .asm_116439
--- a/pokecrystal.link
+++ /dev/null
@@ -1,367 +1,0 @@
-ROM0
-	org $0000
-	"NULL"
-	org $0000
-	"rst0"
-	org $0008
-	"rst8"
-	org $0010
-	"rst10"
-	org $0018
-	"rst18"
-	org $0020
-	"rst20"
-	org $0028
-	"rst28"
-	org $0038
-	"rst38"
-	org $0040
-	"vblank"
-	org $0048
-	"lcd"
-	org $0050
-	"timer"
-	org $0058
-	"serial"
-	org $0060
-	"joypad"
-	org $0100
-	"Header"
-	org $0150
-	"Home"
-ROMX $01
-	"bank1"
-ROMX $02
-	"bank2"
-ROMX $03
-	"bank3"
-ROMX $04
-	"bank4"
-ROMX $05
-	"bank5"
-ROMX $06
-	"Tileset Data 1"
-ROMX $07
-	"Roofs"
-	"Tileset Data 2"
-	"Extra Songs 1"
-ROMX $08
-	"Clock Reset"
-	"Tileset Data 3"
-	"Egg Moves"
-ROMX $09
-	"bank9"
-ROMX $0a
-	"bankA"
-ROMX $0b
-	"bankB"
-ROMX $0c
-	"Tileset Data 4"
-ROMX $0d
-	"Effect Commands"
-ROMX $0e
-	"Enemy Trainers"
-ROMX $0f
-	"Battle Core"
-ROMX $10
-	"bank10"
-	"Evolutions and Attacks"
-ROMX $11
-	"bank11"
-ROMX $12
-	"Crystal Features 1"
-ROMX $13
-	"bank13"
-ROMX $14
-	"bank14"
-ROMX $15
-	"Map Scripts 1"
-ROMX $16
-	"Map Scripts 2"
-ROMX $17
-	"Map Scripts 3"
-ROMX $18
-	"Map Scripts 4"
-ROMX $19
-	"Crystal Phone Text"
-ROMX $1a
-	"Map Scripts 5"
-ROMX $1b
-	"Map Scripts 6"
-ROMX $1c
-	"Map Scripts 7"
-ROMX $1d
-	"Map Scripts 8"
-ROMX $1e
-	"Map Scripts 9"
-ROMX $1f
-	"Map Scripts 10"
-ROMX $20
-	"bank20"
-ROMX $21
-	"bank21"
-ROMX $22
-	"Crystal Features 2"
-ROMX $23
-	"bank23"
-ROMX $24
-	"bank24"
-ROMX $25
-	"Maps"
-	"Events"
-ROMX $26
-	"Map Scripts 11"
-ROMX $27
-	"Map Scripts 12"
-ROMX $28
-	"Phone Scripts 1"
-ROMX $29
-	"Phone Text"
-ROMX $2a
-	"Map Blocks 1"
-ROMX $2b
-	"Map Blocks 2"
-ROMX $2c
-	"Map Blocks 3"
-ROMX $2d
-	"Tileset Data 5"
-ROMX $2e
-	"bank2E"
-ROMX $2f
-	"Phone Scripts 2"
-ROMX $30
-	"Sprites 1"
-ROMX $31
-	"Sprites 2"
-ROMX $32
-	"bank32"
-ROMX $33
-	"Move Animations"
-	"Extra Songs 2"
-ROMX $34
-	"Pic Animations 1"
-ROMX $35
-	"Pic Animations 2"
-ROMX $36
-	"Font Inversed"
-	"Pic Animations 3"
-ROMX $37
-	"Tileset Data 6"
-ROMX $38
-	"bank38"
-ROMX $39
-	"bank39"
-ROMX $3a
-	"Audio"
-	"Songs 1"
-ROMX $3b
-	"Songs 2"
-ROMX $3c
-	"Songs 3"
-	"Sound Effects"
-	"Cries"
-ROMX $3d
-	"Songs 4"
-ROMX $3e
-	"bank3E"
-ROMX $3f
-	"bank3F"
-ROMX $40
-	"mobile40"
-ROMX $41
-	"bank41"
-ROMX $42
-	"mobile42"
-	"Intro Logo"
-	"Credits"
-ROMX $43
-	"Title"
-ROMX $44
-	"Mobile Adapter SDK"
-ROMX $45
-	"mobile45"
-ROMX $46
-	"mobile46"
-ROMX $47
-	"Battle Tower"
-ROMX $48
-	org $4000
-	"Pic Pointers"
-	"Pics 1"
-ROMX $49
-	org $4000
-	"Unown Pic Pointers"
-	"Pics 2"
-ROMX $4a
-	"Trainer Pic Pointers"
-	"Pics 3"
-ROMX $4b
-	"Pics 4"
-ROMX $4c
-	"Pics 5"
-ROMX $4d
-	"Pics 6"
-ROMX $4e
-	"Pics 7"
-ROMX $4f
-	"Pics 8"
-ROMX $50
-	"Pics 9"
-ROMX $51
-	"Pics 10"
-ROMX $52
-	"Pics 11"
-ROMX $53
-	"Pics 12"
-ROMX $54
-	"Pics 13"
-ROMX $55
-	"Pics 14"
-ROMX $56
-	"Pics 15"
-ROMX $57
-	"Pics 16"
-ROMX $58
-	"Pics 17"
-ROMX $59
-	"Pics 18"
-ROMX $5a
-	"Pics 19"
-ROMX $5b
-	"bank5B"
-	"Pics 20"
-ROMX $5c
-	"mobile5C"
-	"Pics 21"
-ROMX $5d
-	"Crystal Phone Text 2"
-	"Pics 22"
-ROMX $5e
-	"UpdateBattleHUDs"
-	"Songs 5"
-	"Crystal Sound Effects"
-	"mobile5E"
-	"Pics 23"
-ROMX $5f
-	"mobile5F"
-	"Pics 24"
-ROMX $60
-	"Map Scripts 13"
-	"Pokedex Entries 001-064"
-ROMX $61
-	"Map Scripts 14"
-ROMX $62
-	"Map Scripts 15"
-ROMX $63
-	"Map Scripts 16"
-ROMX $64
-	"Map Scripts 17"
-ROMX $65
-	"Map Scripts 18"
-ROMX $66
-	"Map Scripts 19"
-ROMX $67
-	"Map Scripts 20"
-ROMX $68
-	"Map Scripts 21"
-ROMX $69
-	"Map Scripts 22"
-ROMX $6a
-	"Map Scripts 23"
-ROMX $6b
-	"Map Scripts 24"
-ROMX $6c
-	"Phone Text 2"
-	"Map Scripts 25"
-ROMX $6d
-	"Special Phone Text"
-ROMX $6e
-	"Pokedex Entries 065-128"
-ROMX $6f
-	"Text 1"
-ROMX $70
-	"Text 2"
-ROMX $71
-	"Text 3"
-ROMX $72
-	"Miscellaneous Text"
-ROMX $73
-	"Pokedex Entries 129-192"
-ROMX $74
-	"Pokedex Entries 193-251"
-ROMX $77
-	"bank77"
-	"Tileset Data 7"
-	"bank77_2"
-ROMX $78
-	"Tileset Data 8"
-ROMX $7b
-	"Battle Tower Text"
-ROMX $7c
-	"Battle Tower Trainer Data"
-ROMX $7d
-	"Mobile News Data"
-ROMX $7e
-	"Crystal Events"
-ROMX $7f
-	org $7de0
-	"Mobile Stadium 2"
-WRAM0
-	"Stack"
-	"Audio RAM"
-	"WRAM"
-	"wSpriteAnims"
-	align 8
-	"Sprites"
-	"Tilemap"
-	"Miscellaneous"
-	"Overworld Map"
-	"Video"
-WRAMX 1
-	"WRAM 1"
-	"Enemy Party"
-	"Party"
-WRAMX 2
-	"Pic Animations"
-WRAMX 3
-	"Battle Tower RAM"
-WRAMX 5
-	align 8
-	"GBC Video"
-	org $d300
-	"Battle Animations"
-	org $d800
-	"Mobile RAM"
-WRAMX 6
-	"Scratch RAM"
-WRAMX 7
-	"Stack RAM"
-VRAM $00
-	"VRAM0"
-VRAM $01
-	"VRAM1"
-SRAM $00
-	"Scratch"
-	org $a600
-	"SRAM Bank 0"
-	org $b200
-	"Backup Save"
-SRAM $01
-	"Save"
-	"Active Box"
-	"Link Battle Data"
-	"SRAM Hall of Fame"
-	"SRAM Crystal Data"
-	"SRAM Battle Tower"
-SRAM $02
-	"Boxes 1-7"
-SRAM $03
-	"Boxes 8-14"
-SRAM $04
-	"SRAM Mobile 1"
-SRAM $05
-	"SRAM Mobile 2"
-SRAM $06
-	"SRAM Mobile 3"
-HRAM
-	"HRAM"
--- /dev/null
+++ b/rgbdscheck.asm
@@ -1,0 +1,12 @@
+; pokecrystal requires rgbds 0.4.0 or newer.
+MAJOR EQU 0
+MINOR EQU 4
+PATCH EQU 0
+
+if !DEF(__RGBDS_MAJOR__) || !DEF(__RGBDS_MINOR__) || !DEF(__RGBDS_PATCH__)
+	fail "pokecrystal requires rgbds {MAJOR}.{MINOR}.{PATCH} or newer."
+elif (__RGBDS_MAJOR__ < MAJOR) || \
+	(__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ < MINOR) || \
+	(__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ == MINOR && __RGBDS_PATCH__ < PATCH)
+	fail "pokecrystal requires rgbds {MAJOR}.{MINOR}.{PATCH} or newer."
+endc
--- a/wram.asm
+++ b/wram.asm
@@ -1176,8 +1176,7 @@
 
 NEXTU ; cd20
 ; credits
-wCreditsPos:: db
-wCreditsUnusedCD21:: db
+wCreditsPos:: dw
 wCreditsTimer:: db
 
 NEXTU ; cd20