shithub: pokecrystal

Download patch

ref: b1dbadbdd397cb8c9e85fa48d9184949c921a8f3
parent: efd1006917b438ff683e8f702adbe6b4d0733a0f
author: Rangi <[email protected]>
date: Sun May 9 08:26:28 EDT 2021

Require rgbds 0.5.1

Use some new features: \<10> macro args, SECTION UNION, SIZEOF/STARTOF, and CHARLEN/CHARSUB

--- a/.travis.yml
+++ b/.travis.yml
@@ -9,7 +9,7 @@
           HOMEBREW_NO_AUTO_UPDATE=1 brew install bison
           export PATH="/usr/local/opt/bison/bin:$PATH"
         fi
-        git clone -b v0.5.0 --depth=1 https://github.com/gbdev/rgbds
+        git clone -b v0.5.1 --depth=1 https://github.com/gbdev/rgbds
         sudo make -C rgbds install
         rm -rf rgbds
     )
--- a/FAQ.md
+++ b/FAQ.md
@@ -41,15 +41,15 @@
 
 ### "ERROR: `UNION` already defined"
 
-Download [**rgbds 0.5.0**][rgbds] or newer. Older versions will not work.
+Download [**rgbds 0.5.1**][rgbds] or newer. Older versions will not work.
 
 ### "ERROR: Macro not defined"
 
-Download [**rgbds 0.5.0**][rgbds] or newer. Older versions will not work.
+Download [**rgbds 0.5.1**][rgbds] or newer. Older versions will not work.
 
 ### "Expression must be 8-bit"
 
-Download [**rgbds 0.5.0**][rgbds] or newer. Older versions will not work.
+Download [**rgbds 0.5.1**][rgbds] or newer. Older versions will not work.
 
 ### "Segmentation fault" from `rgbgfx`
 
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -42,9 +42,9 @@
 
 Double click on the text that says "**Skip**" next to each package to select the most recent version to install.
 
-Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/windows) for Windows with Cygwin to install **rgbds 0.5.0**.
+Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/windows) for Windows with Cygwin to install **rgbds 0.5.1**.
 
-**Note:** If you already have an older rgbds, you will need to update to 0.5.0. Ignore this if you have never installed rgbds before. If a version newer than 0.5.0 does not work, try downloading 0.5.0.
+**Note:** If you already have an older rgbds, you will need to update to 0.5.1. Ignore this if you have never installed rgbds before. If a version newer than 0.5.1 does not work, try downloading 0.5.1.
 
 Now open the **Cygwin terminal** and enter the following commands.
 
@@ -67,7 +67,7 @@
 
 Open **Terminal** and prepare to enter commands.
 
-Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/macos) for macOS to install **rgbds 0.5.0**.
+Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/macos) for macOS to install **rgbds 0.5.1**.
 
 Now you're ready to [build **pokecrystal**](#build-pokecrystal).
 
@@ -84,7 +84,7 @@
 sudo apt-get install make gcc git
 ```
 
-Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.0** from source.
+Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.1** from source.
 
 ### OpenSUSE
 
@@ -94,7 +94,7 @@
 sudo zypper install make gcc git
 ```
 
-Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.0** from source.
+Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.1** from source.
 
 ### Arch Linux
 
@@ -104,9 +104,9 @@
 sudo pacman -S make gcc git rgbds
 ```
 
-Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/arch) for Arch Linux to install **rgbds 0.5.0**.
+Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/arch) for Arch Linux to install **rgbds 0.5.1**.
 
-If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.0** from source.
+If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.1** from source.
 
 ### Termux
 
@@ -122,7 +122,7 @@
 sudo apt install rgbds
 ```
 
-If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.0** from source.
+If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.1** from source.
 
 ### Other distros
 
@@ -133,7 +133,7 @@
 - `git`
 - `rgbds`
 
-If `rgbds` is not available, you'll need to follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.0** from source.
+If `rgbds` is not available, you'll need to follow the [**rgbds** instructions](https://rgbds.gbdev.io/install/source) to build **rgbds 0.5.1** from source.
 
 Now you're ready to [build **pokecrystal**](#build-pokecrystal).
 
@@ -161,12 +161,12 @@
 
 ### Build with a local rgbds version
 
-If you have different projects that require different versions of `rgbds`, it might not be convenient to install rgbds 0.5.0 globally. Instead, you can put its files in a directory within pokecrystal, such as `pokecrystal/rgbds-0.5.0/`. Then specify it when you run `make`:
+If you have different projects that require different versions of `rgbds`, it might not be convenient to install rgbds 0.5.1 globally. Instead, you can put its files in a directory within pokecrystal, such as `pokecrystal/rgbds-0.5.1/`. Then specify it when you run `make`:
 
 ```bash
-make RGBDS=rgbds-0.5.0/
+make RGBDS=rgbds-0.5.1/
 ```
 
 ```bash
-make RGBDS=rgbds-0.5.0/ crystal11
+make RGBDS=rgbds-0.5.1/ crystal11
 ```
--- a/data/events/npc_trades.asm
+++ b/data/events/npc_trades.asm
@@ -1,9 +1,8 @@
 npctrade: MACRO
 ; dialog set, requested mon, offered mon, nickname, dvs, item, OT ID, OT name, gender requested
 	db \1, \2, \3, \4, \5, \6, \7
-	shift
-	dw \7
-	db \8, \9, 0
+	dw \8
+	db \9, \<10>, 0
 ENDM
 
 NPCTrades:
--- a/data/events/unown_walls.asm
+++ b/data/events/unown_walls.asm
@@ -1,18 +1,17 @@
 unownwall: MACRO
-rept _NARG
-if \1 == "-"
-x = $64
-elif \1 >= "Y"
-x = 2 * (\1 - "Y") + $60
-elif \1 >= "Q"
-x = 2 * (\1 - "Q") + $40
-elif \1 >= "I"
-x = 2 * (\1 - "I") + $20
+for n, CHARLEN(\1)
+x = CHARSUB(\1, n + 1)
+if x == "-"
+	db $64
+elif x >= "Y"
+	db 2 * (x - "Y") + $60
+elif x >= "Q"
+	db 2 * (x - "Q") + $40
+elif x >= "I"
+	db 2 * (x - "I") + $20
 else
-x = 2 * (\1 - "A")
+	db 2 * (x - "A")
 endc
-	db x
-	shift
 endr
 	db -1 ; end
 ENDM
@@ -19,17 +18,17 @@
 
 UnownWalls:
 ; UNOWNWORDS_ESCAPE
-	; db      $08, $44, $04, $00, $2e, $08, -1
-	unownwall "E", "S", "C", "A", "P", "E"
+	; db $08, $44, $04, $00, $2e, $08, -1
+	unownwall "ESCAPE"
 ; UNOWNWORDS_LIGHT
-	; db      $26, $20, $0c, $0e, $46, -1
-	unownwall "L", "I", "G", "H", "T"
+	; db $26, $20, $0c, $0e, $46, -1
+	unownwall "LIGHT"
 ; UNOWNWORDS_WATER
-	; db      $4c, $00, $46, $08, $42, -1
-	unownwall "W", "A", "T", "E", "R"
+	; db $4c, $00, $46, $08, $42, -1
+	unownwall "WATER"
 ; UNOWNWORDS_HO_OH
-	; db      $0e, $2c, $64, $2c, $0e, -1
-	unownwall "H", "O", "-", "O", "H"
+	; db $0e, $2c, $64, $2c, $0e, -1
+	unownwall "HO-OH"
 
 MenuHeaders_UnownWalls:
 ; UNOWNWORDS_ESCAPE
--- a/data/pokemon/unown_words.asm
+++ b/data/pokemon/unown_words.asm
@@ -1,6 +1,6 @@
 unownword: MACRO
-for x, STRLEN(\1)
-	db STRSUB(\1, x + 1, 1) - "A" + FIRST_UNOWN_CHAR
+for n, CHARLEN(\1)
+	db CHARSUB(\1, n + 1) - "A" + FIRST_UNOWN_CHAR
 endr
 	db -1
 ENDM
--- a/engine/games/unown_puzzle.asm
+++ b/engine/games/unown_puzzle.asm
@@ -14,8 +14,8 @@
 	xor a
 	ldh [hBGMapMode], a
 	call DisableLCD
-	ld hl, wUnownPuzzle ; includes wPuzzlePieces
-	ld bc, wUnownPuzzleEnd - wUnownPuzzle
+	ld hl, STARTOF("Miscellaneous") ; includes wPuzzlePieces
+	ld bc, SIZEOF("Miscellaneous")
 	xor a
 	call ByteFill
 	ld hl, UnownPuzzleCursorGFX
--- a/home/text.asm
+++ b/home/text.asm
@@ -187,24 +187,22 @@
 
 CheckDict::
 dict: MACRO
+assert CHARLEN(\1) == 1
 if \1 == 0
 	and a
 else
 	cp \1
 endc
-
 if ISCONST(\2)
-; Replace a character with another one
-	jr nz, ._\@
+	; Replace a character with another one
+	jr nz, .not\@
 	ld a, \2
-._\@:
-else
-	if STRSUB("\2", 1, 1) == "."
+.not\@:
+elif STRSUB("\2", 1, 1) == "."
 	; Locals can use a short jump
 	jr z, \2
-	else
+else
 	jp z, \2
-	endc
 endc
 ENDM
 
--- a/layout.link
+++ b/layout.link
@@ -326,6 +326,7 @@
 	"Sprites"
 	"Tilemap"
 	"Miscellaneous"
+	"Unused Map Buffer"
 	align 8
 	"Overworld Map"
 	align 4
@@ -332,6 +333,8 @@
 	"Video"
 WRAMX 1
 	"WRAM 1"
+	"Miscellaneous WRAM 1"
+	"More WRAM 1"
 	"Enemy Party"
 	"Party"
 WRAMX 2
--- a/macros/legacy.asm
+++ b/macros/legacy.asm
@@ -224,12 +224,7 @@
 ENDM
 
 person_event: MACRO
-_s = \1
-_y = \2
-_x = \3
-_m = \4
-	shift 4
-	object_event _x, _y, _s, _m, \1, \2, \3, \4, \5, \6, \7, \8, \9
+	object_event \3, \2, \1, \4, \5, \6, \7, \8, \9, \<10>, \<11>, \<12>, \<13>
 ENDM
 
 PERSONTYPE_SCRIPT   EQUS "OBJECTTYPE_SCRIPT"
--- a/macros/scripts/maps.asm
+++ b/macros/scripts/maps.asm
@@ -102,21 +102,16 @@
 ;  * if h1 == -1, h2 is treated as a time-of-day value:
 ;    a combo of MORN, DAY, and/or NITE, or -1 to always appear
 ;\9: color: a PAL_NPC_* constant, or 0 for sprite default
-;\10: function: a OBJECTTYPE_* constant
-;\11: sight range: applies to OBJECTTYPE_TRAINER
-;\12: script pointer
-;\13: event flag: an EVENT_* constant, or -1 to always appear
+;\<10>: function: a OBJECTTYPE_* constant
+;\<11>: sight range: applies to OBJECTTYPE_TRAINER
+;\<12>: script pointer
+;\<13>: event flag: an EVENT_* constant, or -1 to always appear
 	db \3, \2 + 4, \1 + 4, \4
 	dn \6, \5
 	db \7, \8
-	shift
-	dn \8, \9
-	shift
-	db \9
-	shift
-	dw \9
-	shift
-	dw \9
+	dn \9, \<10>
+	db \<11>
+	dw \<12>, \<13>
 ; the dummy PlayerObjectTemplate object_event has no def_object_events
 if DEF(_NUM_OBJECT_EVENTS)
 {_NUM_OBJECT_EVENTS} = {_NUM_OBJECT_EVENTS} + 1
--- a/rgbdscheck.asm
+++ b/rgbdscheck.asm
@@ -1,9 +1,9 @@
 MAJOR EQU 0
 MINOR EQU 5
-PATCH EQU 0
+PATCH EQU 1
 
 wrong_rgbds: MACRO
-	fail "pokecrystal requires rgbds v0.5.0 or newer."
+	fail "pokecrystal requires rgbds v0.5.1 or newer."
 ENDM
 
 IF !DEF(__RGBDS_MAJOR__) || !DEF(__RGBDS_MINOR__) || !DEF(__RGBDS_PATCH__)
--- a/tools/unnamed.py
+++ b/tools/unnamed.py
@@ -82,7 +82,7 @@
     elif magic == b'RGB9':
         obj_ver = 10 + unpack_file("<I", f)[0]
 
-    if obj_ver not in [6, 10, 11, 12, 13, 15, 16, 17]:
+    if obj_ver not in [6, 10, 11, 12, 13, 15, 16, 17, 18]:
         print("Error: File '%s' is of an unknown format." % objfile, file=stderr)
         exit(1)
 
@@ -89,7 +89,7 @@
     num_symbols = unpack_file("<I", f)[0]
     unpack_file("<I", f) # skip num sections
 
-    if obj_ver in [16, 17]:
+    if obj_ver in [16, 17, 18]:
         node_filenames = []
         num_nodes = unpack_file("<I", f)[0]
         for x in range(num_nodes):
@@ -109,7 +109,7 @@
         sym_type = symtype(unpack_file("<B", f)[0] & 0x7f)
         if sym_type == symtype.IMPORT:
             continue
-        if obj_ver in [16, 17]:
+        if obj_ver in [16, 17, 18]:
             sym_fileno = unpack_file("<I", f)[0]
             sym_filename = node_filenames[sym_fileno]
         else:
--- a/wram.asm
+++ b/wram.asm
@@ -323,16 +323,17 @@
 wTilemapEnd::
 
 
-SECTION "Miscellaneous", WRAM0
-
 ; This union spans 480 bytes.
-UNION
+SECTION UNION "Miscellaneous", WRAM0
+
 ; surrounding tiles
 ; This buffer determines the size for the rest of the union;
 ; it uses exactly 480 bytes.
 wSurroundingTiles:: ds SURROUNDING_WIDTH * SURROUNDING_HEIGHT
 
-NEXTU
+
+SECTION UNION "Miscellaneous", WRAM0
+
 ; box save buffer
 ; SaveBoxAddress uses this buffer in three steps because it
 ; needs more space than the buffer can hold.
@@ -339,11 +340,15 @@
 wBoxPartialData:: ds 480
 wBoxPartialDataEnd::
 
-NEXTU
+
+SECTION UNION "Miscellaneous", WRAM0
+
 ; battle tower temp struct
 wBT_OTTemp:: battle_tower_struct wBT_OTTemp
 
-NEXTU
+
+SECTION UNION "Miscellaneous", WRAM0
+
 ; battle data
 wBattle::
 wEnemyMoveStruct::  move_struct wEnemyMoveStruct
@@ -626,24 +631,22 @@
 wEnemyJustGotFrozen:: db
 wBattleEnd::
 
-NEXTU
-; unown puzzle
-wUnownPuzzle::
-	ds 200
-wPuzzlePieces:: ds 6 * 6
-	ds 244
-wUnownPuzzleEnd::
 
-NEXTU
+SECTION UNION "Miscellaneous", WRAM0
+
 ; link patch lists
 wPlayerPatchLists:: ds 200
 wOTPatchLists:: ds 200
 
-NEXTU
+
+SECTION UNION "Miscellaneous", WRAM0
+
+; mobile
 wMobileTransferData:: ds 480
 
-NEXTU
 
+SECTION UNION "Miscellaneous", WRAM0
+
 ; This union spans 200 bytes.
 UNION
 ; timeset temp storage
@@ -814,6 +817,10 @@
 wMemoryGameNumCardsMatched:: db
 
 NEXTU
+; unown puzzle
+wPuzzlePieces:: ds 6 * 6
+
+NEXTU
 ; mobile data
 wc6d0:: ds 56
 wc708:: db
@@ -839,8 +846,9 @@
 wc7d3:: ds 2
 ENDU
 
-ENDU
 
+SECTION "Unused Map Buffer", WRAM0
+
 ; This was a buffer for map-related pointers in the 1997 G/S prototype.
 ; See wMapBuffer in pokegold-spaceworld's wram.asm.
 wUnusedMapBuffer:: ds 24
@@ -847,14 +855,15 @@
 wUnusedMapBufferEnd::
 
 
-SECTION "Overworld Map", WRAM0
+SECTION UNION "Overworld Map", WRAM0
 
-UNION
 ; overworld map blocks
 wOverworldMapBlocks:: ds 1300
 wOverworldMapBlocksEnd::
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; GB Printer data
 wGameboyPrinterRAM::
 wGameboyPrinter2bppSource:: ds 40 tiles
@@ -888,7 +897,9 @@
 	ds 16
 wGameboyPrinterRAMEnd::
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; bill's pc data
 wBillsPCData::
 wBillsPCPokemonList::
@@ -908,20 +919,27 @@
 wBillsPCDataEnd::
 
 
-NEXTU
+SECTION UNION "Overworld Map", WRAM0
+
 ; Hall of Fame data
 wHallOfFamePokemonList:: hall_of_fame wHallOfFamePokemonList
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; debug color picker
 wDebugOriginalColors:: ds 256 * 4
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; raw link data
 wLinkData:: ds 1300
 wLinkDataEnd::
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; link data members
 wLinkPlayerName:: ds NAME_LENGTH
 wLinkPartyCount:: db
@@ -974,7 +992,9 @@
 wLinkPatchList2:: ds SERIAL_PATCH_LIST_LENGTH
 ENDU
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; link data prep
 	ds 1000
 wCurLinkOTPartyMonTypePointer:: dw
@@ -985,7 +1005,9 @@
 wLinkOTPartyMon{d:n}Type:: dw
 endr
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; link mail data
 	ds 500
 wLinkPlayerMail::
@@ -1002,13 +1024,17 @@
 wLinkOTMailEnd::
 	ds 10
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; received link mail data
 	ds 500
 wLinkReceivedMail:: ds MAIL_STRUCT_LENGTH * PARTY_LENGTH
 wLinkReceivedMailEnd:: db
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; mystery gift data
 wMysteryGiftStaging:: ds 80
 
@@ -1052,22 +1078,28 @@
 	ds 1
 wMysteryGiftPlayerDataEnd::
 
-NEXTU
-	ds $200
 
-UNION
-; blank credits tile buffer
-wCreditsBlankFrame2bpp:: ds 4 * 4 tiles
-wCreditsBlankFrame2bppEnd::
+SECTION UNION "Overworld Map", WRAM0
 
-NEXTU
+	ds $200
+
 ; mystery gift data
 wUnusedMysteryGiftStagedDataLength:: db
 wMysteryGiftMessageCount:: db
 wMysteryGiftStagedDataLength:: db
-ENDU
 
-NEXTU
+
+SECTION UNION "Overworld Map", WRAM0
+
+	ds $200
+
+; blank credits tile buffer
+wCreditsBlankFrame2bpp:: ds 4 * 4 tiles
+wCreditsBlankFrame2bppEnd::
+
+
+SECTION UNION "Overworld Map", WRAM0
+
 ; mobile
 	ds 7
 wc807:: ds 1
@@ -1096,9 +1128,9 @@
 wccb9:: ds 1
 wccba:: ds 90
 
+
 if DEF(_DEBUG)
-NEXTU
-; debug room
+SECTION UNION "Overworld Map", WRAM0
 
 ; debug room RTC values
 wDebugRoomRTCSec::  db
@@ -1138,9 +1170,7 @@
 
 endc
 
-ENDU
 
-
 SECTION "Video", WRAM0
 
 UNION
@@ -1671,7 +1701,9 @@
 
 wDefaultSpawnpoint:: db
 
-UNION
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; mon buffer
 wBufferMonNickname:: ds MON_NAME_LENGTH
 wBufferMonOT:: ds NAME_LENGTH
@@ -1680,7 +1712,9 @@
 wMonOrItemNameBuffer:: ds NAME_LENGTH
 	ds NAME_LENGTH
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; poke seer
 wSeerAction:: db
 wSeerNickname:: ds MON_NAME_LENGTH
@@ -1693,11 +1727,15 @@
 wSeerCaughtData:: db
 wSeerCaughtGender:: db
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; mail temp storage
 wTempMail:: mailmsg wTempMail
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; bug-catching contest
 wBugContestResults::
 	bugcontestwinner wBugContestFirstPlace
@@ -1708,7 +1746,9 @@
 	ds 4
 wBugContestWinnerName:: ds NAME_LENGTH
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; mart items
 wMartItem1BCD:: ds 3
 wMartItem2BCD:: ds 3
@@ -1721,7 +1761,9 @@
 wMartItem9BCD:: ds 3
 wMartItem10BCD:: ds 3
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; town map data
 wTownMapPlayerIconLandmark:: db
 UNION
@@ -1733,12 +1775,16 @@
 wEndFlypoint:: db
 ENDU
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; phone call data
 wPhoneScriptBank:: db
 wPhoneCaller:: dw
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; radio data
 wCurRadioLine:: db
 wNextRadioLine:: db
@@ -1748,11 +1794,15 @@
 	ds 5
 wRadioText:: ds 2 * SCREEN_WIDTH
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; lucky number show
 wLuckyNumberDigitsBuffer:: ds 5
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; movement buffer data
 wMovementBufferCount:: db
 wMovementBufferObject:: db
@@ -1760,7 +1810,9 @@
 wUnusedMovementBufferPointer:: dw
 wMovementBuffer:: ds 55
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; box printing
 wWhichBoxMonToPrint:: db
 wFinishedPrintingBox:: db
@@ -1768,18 +1820,24 @@
 wBankOfBoxToPrint:: db
 wWhichBoxToPrint:: db
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; Unown printing
 wPrintedUnownTileSource:: ds 1 tiles
 wPrintedUnownTileDest:: ds 1 tiles
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; trainer HUD data
 	ds 1
 wPlaceBallsDirection:: db
 wTrainerHUDTiles:: ds 4
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; mobile participant nicknames
 	ds 4
 wMobileParticipant1Nickname:: ds NAME_LENGTH_JAPANESE
@@ -1786,28 +1844,40 @@
 wMobileParticipant2Nickname:: ds NAME_LENGTH_JAPANESE
 wMobileParticipant3Nickname:: ds NAME_LENGTH_JAPANESE
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; battle exp gain
 wExperienceGained:: ds 3
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; earthquake data buffer
 wEarthquakeMovementDataBuffer:: ds 5
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; switching items in pack
 wSwitchItemBuffer:: ds 2 ; may store 1 or 2 bytes
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; switching pokemon in party
 ; may store NAME_LENGTH, PARTYMON_STRUCT_LENGTH, or MAIL_STRUCT_LENGTH bytes
 wSwitchMonBuffer:: ds 48
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; giving pokemon mail
 wMonMailMessageBuffer:: ds MAIL_MSG_LENGTH + 1
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; bill's pc
 UNION
 wBoxNameBuffer:: ds BOX_NAME_LENGTH
@@ -1817,12 +1887,16 @@
 wBillsPCTempBoxCount:: db
 ENDU
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; prof. oak's pc
 wTempPokedexSeenCount:: db
 wTempPokedexCaughtCount:: db
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; player's room pc
 UNION
 wDecoNameBuffer:: ds ITEM_NAME_LENGTH
@@ -1831,13 +1905,17 @@
 wOwnedDecoCategories:: ds 16
 ENDU
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; trade
 wCurTradePartyMon:: db
 wCurOTTradePartyMon:: db
 wBufferTrademonNickname:: ds MON_NAME_LENGTH
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; link battle record data
 wLinkBattleRecordBuffer::
 wLinkBattleRecordName::   ds NAME_LENGTH
@@ -1845,7 +1923,9 @@
 wLinkBattleRecordLosses:: dw
 wLinkBattleRecordDraws::  dw
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; miscellaneous
 wTempDayOfWeek::
 wPrevPartyLevel::
@@ -1858,13 +1938,17 @@
 wSuicuneFrame::
 	db
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; debug color picker
 wDebugColorIsTrainer:: db
 wDebugColorIsShiny:: db
 wDebugColorCurTMHM:: db
 
-NEXTU
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
 ; mobile?
 wd002:: ds 1
 wd003:: ds 1
@@ -1892,9 +1976,11 @@
 wd034:: ds 2
 wd036:: ds 2
 
-NEXTU
-; Every previous NEXTU takes up 60 or fewer bytes,
-; except the initial "mon buffer" UNION.
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; Every previous SECTION UNION takes up 60 or fewer bytes,
+; except the initial "mon buffer" one.
 	ds 60
 
 UNION
@@ -2018,8 +2104,10 @@
 ENDU
 
 	ds 23
-ENDU
 
+
+SECTION "More WRAM 1", WRAMX
+
 wTMHMMoveNameBackup:: ds MOVE_NAME_LENGTH
 
 wStringBuffer1:: ds STRING_BUFFER_LENGTH
@@ -2928,7 +3016,6 @@
 
 	ds 2
 
-; 8 chars + $50
 wBoxNames:: ds BOX_NAME_LENGTH * NUM_BOXES
 
 wCelebiEvent::