shithub: pokered

Download patch

ref: 7bdb3199aef4a7ec800c2a5057fd55fc5974d539
parent: 66aaa9a0cbb9b3c8e57098cf60ef4633b9cb0f3c
author: Mr Wint <[email protected]>
date: Wed Mar 13 11:11:41 EDT 2013

* added EQU constants for mon header RAM area
* analyzed and commented sprite loading routines
* experience calculation routine
* couple more small routines and data structures

--- a/constants.asm
+++ b/constants.asm
@@ -200,6 +200,8 @@
 W_PLAYERMOVEACCURACY EQU $CFD6
 W_PLAYERMOVEMAXPP    EQU $CFD7
 
+W_ENEMYMONNAME  EQU $CFDA
+
 W_ENEMYMONCURHP EQU $CFE6 ; active opponent's hp (16 bits)
 W_ENEMYMONNUMBER EQU $CFE8 ; active opponent's position in team (0 to 5)
 W_ENEMYMONSTATUS EQU $CFE9 ; active opponent's status condition
@@ -330,10 +332,48 @@
 ; 03: delay, but don't clean OAM buffer
 ; 04: delay, without cleaning OAM buffer, and do not advance [W_FBDESTADDR], so that the next frame block will overwrite this one
 
-W_DAMAGE EQU $D0D7
+; sprite data is written column by column, each byte contains 8 columns (one for ech bit)
+; for 2bpp sprites, pairs of two consecutive bytes (i.e. pairs of consecutive rows of sprite data)
+; contain the upper and lower bit of each of the 8 pixels, respectively
+SPRITEBUFFERSIZE   EQU $188 ; 7 * 7 (tiles) * 8 (bytes per tile)
+S_SPRITEBUFFER0    EQU $A000 + 0 * SPRITEBUFFERSIZE
+S_SPRITEBUFFER1    EQU $A000 + 1 * SPRITEBUFFERSIZE
+S_SPRITEBUFFER2    EQU $A000 + 2 * SPRITEBUFFERSIZE
 
+W_SPRITECURPOSX         EQU $D0A1
+W_SPRITECURPOSY         EQU $D0A2
+W_SPRITEWITDH           EQU $D0A3
+W_SPRITEHEIGHT          EQU $D0A4
+W_SPRITEINPUTCURBYTE    EQU $D0A5 ; current input byte
+W_SPRITEINPUTBITCOUNTER EQU $D0A6 ; bit offset of last read input bit
+
+; determines where in the output byte the two bits are placed. Each byte contains four columns (2bpp data)
+; 3 -> XX000000   1st column
+; 2 -> 00XX0000   2nd column
+; 1 -> 0000XX00   3rd column
+; 0 -> 000000XX   4th column
+W_SPRITEOUTPUTBITOFFSET EQU $D0A7
+
+; bit 0 determines used buffer (0 -> $a188, 1 -> $a310)
+; bit 1 loading last sprite chunk? (there are at most 2 chunks per load operation)
+W_SPRITELOADFLAGS       EQU $D0A8
+W_SPRITEUNPACKMODE      EQU $D0A9
+W_SPRITEFLIPPED         EQU $D0AA
+
+W_SPRITEINPUTPTR        EQU $D0AB ; pointer to next input byte
+W_SPRITEOUTPUTPTR       EQU $D0AD ; pointer to current output byte
+W_SPRITEOUTPUTPTRCACHED EQU $D0AF ; used to revert pointer for different bit offsets
+W_SPRITEDECODETABLE0PTR EQU $D0B1 ; pointer to differential decoding table (assuming initial value 0)
+W_SPRITEDECODETABLE1PTR EQU $D0B3 ; pointer to differential decoding table (assuming initial value 1)
+
+H_SPRITEWIDTH           EQU $FF8B ; in bytes
+H_SPRITEINTERLACECOUNTER EQU $FF8B
+H_SPRITEHEIGHT          EQU $FF8C ; in bytes
+H_SPRITEOFFSET          EQU $FF8D
+
 ; List type
 ; used in $D0B6
+W_LISTTYPE    EQU $D0B6
 MONSTER_NAME  EQU 1
 MOVE_NAME     EQU 2
 ; ???_NAME    EQU 3
@@ -342,6 +382,36 @@
 ENEMYOT_NAME  EQU 6
 TRAINER_NAME  EQU 7
 
+W_MONHEADER       EQU $d0b8
+W_MONHDEXNUM      EQU $d0b8
+W_MONHBASESTATS   EQU $d0b9
+;W_MONHBASEHP      EQU $d0b9
+;W_MONHBASEATTACK  EQU $d0ba
+;W_MONHBASEDEFENSE EQU $d0bb
+W_MONHBASESPEED   EQU $d0bc
+;W_MONHBASESPECIAL EQU $d0bd
+W_MONHTYPES       EQU $d0be
+W_MONHTYPE1       EQU $d0be
+W_MONHTYPE2       EQU $d0bf
+W_MONHCATCHRATE   EQU $d0c0
+;W_MONHBASEXP      EQU $d0c1
+W_MONHSPRITEDIM   EQU $d0c2
+W_MONHFRONTSPRITE EQU $d0c3
+W_MONHBACKSPRITE  EQU $d0c5
+W_MONHMOVES       EQU $d0c7
+;W_MONHMOVE1       EQU $d0c7
+;W_MONHMOVE2       EQU $d0c8
+;W_MONHMOVE3       EQU $d0c9
+;W_MONHMOVE4       EQU $d0ca
+W_MONHGROWTHRATE  EQU $d0cb
+W_MONHLEARNSET    EQU $d0cc ; bit field, 7 bytes
+;W_MONHPADDING     EQU $d0d7
+
+
+
+W_DAMAGE EQU $D0D7
+
+
 W_CURENEMYLVL EQU $D127
 
 W_ISLINKBATTLE EQU $D12B
@@ -833,6 +903,8 @@
 H_POWEROFTEN        EQU $FF99 ; 3 bytes, big endian order
 H_SAVEDNUMTOPRINT   EQU $FF9C ; 3 bytes, big endian order (to back out of a subtraction)
 
+H_LOADEDROMBANK     EQU $FFB8
+
 ; is automatic background transfer during V-blank enabled?
 ; if nonzero, yes
 ; if zero, no
@@ -1078,6 +1150,7 @@
 CHARMELEON EQU $B2
 WARTORTLE  EQU $B3
 CHARIZARD  EQU $B4
+MON_GHOST  EQU $B8
 ODDISH     EQU $B9
 GLOOM      EQU $BA
 VILEPLUME  EQU $BB
--- a/main.asm
+++ b/main.asm
@@ -24,7 +24,7 @@
 SECTION "lcdc",HOME[$48]
 	db $FF
 SECTION "timer",HOME[$50]
-	jp $2306
+	jp TimerHandler
 SECTION "serial",HOME[$58]
 	jp $2125
 SECTION "joypad",HOME[$60]
@@ -81,14 +81,14 @@
 FarCopyData: ; 009D
 ; copy bc bytes of data from a:hl to de
 	ld [$CEE9],a ; save future bank # for later
-	ld a,[$FFB8] ; get current bank #
+	ld a,[H_LOADEDROMBANK] ; get current bank #
 	push af
 	ld a,[$CEE9] ; get future bank #, switch
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call CopyData
 	pop af       ; okay, done, time to switch back
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 CopyData: ; 00B5
@@ -170,14 +170,14 @@
 ; [$ffb3] = keys pressed since last time
 ; [$ffb4] = currently pressed keys
 GetJoypadState: ; 19A
-	ld a, [$ffb8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a,$3
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call $4000
 	pop af
-	ld [$ff00+$b8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -1205,7 +1205,7 @@
 	ld hl,$d72e
 	res 5,[hl]
 	ld a,$01
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call $40b0
 	call $62ce
@@ -1236,7 +1236,7 @@
 	res 5,[hl]
 	call DoFlyOrTeleportAwayGraphics
 	ld a,$01
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call $62ce
 	jp $5d5f
@@ -1805,10 +1805,10 @@
 
 ; this builds a tile map from the tile block map based on the current X/Y coordinates of the player's character
 LoadCurrentMapView: ; CAA
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,[$d52b] ; tile data ROM bank
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a ; switch to ROM bank that contains tile data
 	ld a,[$d35f] ; address of upper left corner of current map view
 	ld e,a
@@ -1890,7 +1890,7 @@
 	dec b
 	jr nz,.rowLoop2
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a ; restore previous ROM bank
 	ret
 
@@ -2738,10 +2738,10 @@
 	ld a,[W_CURMAP]
 	ld c,a
 	ld b,$00
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,$03
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld hl,$404d
 	add hl,bc
@@ -2751,7 +2751,7 @@
 	ld a,[hl]
 	ld [$d35c],a ; music 2
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -2769,7 +2769,7 @@
 
 ; function to load map data
 LoadMapData: ; 1241
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	call DisableLCD
 	ld a,$98
@@ -2826,7 +2826,7 @@
 	call $2312 ; music related
 .restoreRomBank
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -2845,7 +2845,7 @@
 	ld [$ffe8],a ; save map ROM bank
 	call BankswitchBack
 	ld a,[$ffe8]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a ; switch to map ROM bank
 	pop bc
 	pop hl
@@ -2907,10 +2907,10 @@
 ; a = ID of destination warp within destination map
 LoadDestinationWarpPosition: ; 1313
 	ld b,a
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,[$cf12]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld a,b
 	add a
@@ -2922,7 +2922,7 @@
 	ld de,$d35f
 	call CopyData
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -3001,12 +3001,21 @@
 	ld b,BANK(LoadMonData_)
 	jp Bankswitch
 
-INCBIN "baserom.gbc",$137a,$1384 - $137a
+; no known jump sources
+; writes c to $d0dc+b
+Func_137a: ; 137a (0:137a)
+	ld hl, $d0dc
+	ld e, b
+	ld d, $0
+	add hl, de
+	ld a, c
+	ld [hl], a
+	ret
 
 ; known jump sources: 617a (1:617a), 12a6e (4:6a6e), 403b0 (10:43b0), 415c0 (10:55c0), 7bebf (1e:7ebf)
 Func_1384: ; 1384 (0:1384)
 	ld a, $1
-	ld [$d0aa], a
+	ld [W_SPRITEFLIPPED], a
 
 ; known jump sources: 4530 (1:4530), 702a3 (1c:42a3), 740ec (1d:40ec), 76643 (1d:6643), 797ab (1e:57ab)
 Func_1389: ; 1389 (0:1389)
@@ -3033,20 +3042,20 @@
 .asm_13ad
 	push hl
 	ld de, $9000
-	call Func_1665
+	call LoadMonFrontSprite
 	pop hl
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a, $f
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	xor a
 	ld [$FF00+$e1], a
 	call asm_3f0d0
 	xor a
-	ld [$d0aa], a
+	ld [W_SPRITEFLIPPED], a
 	pop af
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ret
 ; 13d0 (0:13d0)
@@ -3239,15 +3248,15 @@
 	and a
 	ret
 PrintStatusConditionNotFainted ; 14f6
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,BANK(Unknown_747de)
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call Unknown_747de ; print status condition
 	pop bc
 	ld a,b
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -3292,14 +3301,14 @@
 	ld a,[hl]
 	ret
 
-; copies the base stat data of a pokemon to $D0B8
+; copies the base stat data of a pokemon to $D0B8 (W_MONHEADER)
 ; INPUT:
 ; [$D0B5] = pokemon ID
-GetBaseStats: ; 1537
-	ld a,[$ffb8]
+GetMonHeader: ; 1537
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,BANK(BulbasaurBaseStats)
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	push bc
 	push de
@@ -3328,21 +3337,21 @@
 	ld bc,28
 	ld hl,BulbasaurBaseStats
 	call AddNTimes
-	ld de,$d0b8
+	ld de,W_MONHEADER
 	ld bc,28
 	call CopyData
 	jr .done
 .specialID
-	ld hl,$d0c2
-	ld [hl],b
+	ld hl,W_MONHSPRITEDIM
+	ld [hl],b ; write sprite dimensions
 	inc hl
-	ld [hl],e
+	ld [hl],e ; write front sprite pointer
 	inc hl
 	ld [hl],d
 	jr .done
 .mew
 	ld hl,MewBaseStats
-	ld de,$d0b8
+	ld de,W_MONHEADER
 	ld bc,28
 	ld a,BANK(MewBaseStats)
 	call FarCopyData
@@ -3355,7 +3364,7 @@
 	pop de
 	pop bc
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -3456,17 +3465,16 @@
 	inc hl ; if right-aligned, "print" a space by advancing the pointer
 	ret
 
-;XXX what does this do
-;XXX what points to this
-Unknown_1627: ; 0x1627
-	ld bc,$D0B8
+; 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: ; 0x1627
+	ld bc,W_MONHEADER
 	add hl,bc
 	ld a,[hli]
-	ld [$D0AB],a
+	ld [W_SPRITEINPUTPTR],a    ; fetch sprite input pointer
 	ld a,[hl]
-	ld [$D0AC],a
-
-Unknown_1633: ; 0x1633
+	ld [W_SPRITEINPUTPTR+1],a
 ; define (by index number) the bank that a pokemon's image is in
 ; index = Mew, bank 1
 ; index = Kabutops fossil, bank $B
@@ -3502,34 +3510,40 @@
 	jr c,.GotBank
 	ld a,$0D
 .GotBank
-	jp $24FD
+	jp UncompressSpriteData
 
 ; known jump sources: 13b1 (0:13b1), 3ca4f (f:4a4f), 3d17d (f:517d), 3efce (f:6fce), 3efda (f:6fda), 5dbfd (17:5bfd)
-Func_1665: ; 1665 (0:1665)
+; de: destination location
+LoadMonFrontSprite: ; 1665 (0:1665)
 	push de
-	ld hl, $b
-	call Unknown_1627
-	ld hl, $d0c2
+	ld hl, W_MONHFRONTSPRITE - W_MONHEADER
+	call UncompressMonSprite
+	ld hl, W_MONHSPRITEDIM
 	ld a, [hli]
 	ld c, a
 	pop de
+	; fall through
 
 ; known jump sources: 3f066 (f:7066)
-Func_1672: ; 1672 (0:1672)
+; 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: ; 1672 (0:1672)
 	push de
 	and $f
-	ld [H_DOWNARROWBLINKCNT1], a ; $FF00+$8b
+	ld [H_SPRITEWIDTH], a ; each byte contains 8 pixels (in 1bpp), so tiles=bytes for width
 	ld b, a
 	ld a, $7
-	sub b
-	inc a
-	srl a
+	sub b      ; 7-w
+	inc a      ; 8-w
+	srl a      ; (8-w)/2     ; horizontal center (in tiles, rounded up)
 	ld b, a
 	add a
 	add a
 	add a
-	sub b
-	ld [$FF00+$8d], a
+	sub b      ; 7*((8-w)/2) ; skip for horizontal center (in tiles)
+	ld [H_SPRITEOFFSET], a
 	ld a, c
 	swap a
 	and $f
@@ -3536,117 +3550,123 @@
 	ld b, a
 	add a
 	add a
-	add a
-	ld [H_DOWNARROWBLINKCNT2], a ; $FF00+$8c
+	add a     ; 8*tiles is height in bytes
+	ld [H_SPRITEHEIGHT], a ; $FF00+$8c
 	ld a, $7
-	sub b
+	sub b      ; 7-h         ; skip for vertical center (in tiles, relative to current column)
 	ld b, a
-	ld a, [$FF00+$8d]
-	add b
+	ld a, [H_SPRITEOFFSET]
+	add b     ; 7*((8-w)/2) + 7-h ; combined overall offset (in tiles)
 	add a
 	add a
-	add a
-	ld [$FF00+$8d], a
+	add a     ; 8*(7*((8-w)/2) + 7-h) ; combined overall offset (in bytes)
+	ld [H_SPRITEOFFSET], a
 	xor a
 	ld [$4000], a
-	ld hl, $a000
-	call Func_16df
-	ld de, $a188
-	ld hl, $a000
-	call Func_16c2
-	ld hl, $a188
-	call Func_16df
-	ld de, $a310
-	ld hl, $a188
-	call Func_16c2
+	ld hl, S_SPRITEBUFFER0
+	call ZeroSpriteBuffer   ; zero buffer 0
+	ld de, S_SPRITEBUFFER1
+	ld hl, S_SPRITEBUFFER0
+	call AlignSpriteDataCentered    ; copy and align buffer 1 to 0 (containing the MSB of the 2bpp sprite)
+	ld hl, S_SPRITEBUFFER1
+	call ZeroSpriteBuffer   ; zero buffer 1
+	ld de, S_SPRITEBUFFER2
+	ld hl, S_SPRITEBUFFER1
+	call AlignSpriteDataCentered    ; copy and align buffer 2 to 1 (containing the LSB of the 2bpp sprite)
 	pop de
-	jp Func_16ea
+	jp InterlaceMergeSpriteBuffers
 
 ; known jump sources: 16ac (0:16ac), 16bb (0:16bb)
-Func_16c2: ; 16c2 (0:16c2)
-	ld a, [$FF00+$8d]
+; 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: ; 16c2 (0:16c2)
+	ld a, [H_SPRITEOFFSET]
 	ld b, $0
 	ld c, a
 	add hl, bc
-	ld a, [H_DOWNARROWBLINKCNT1] ; $FF00+$8b
-.asm_16ca
+	ld a, [H_SPRITEWIDTH] ; $FF00+$8b
+.columnLoop
 	push af
 	push hl
-	ld a, [H_DOWNARROWBLINKCNT2] ; $FF00+$8c
+	ld a, [H_SPRITEHEIGHT] ; $FF00+$8c
 	ld c, a
-.asm_16cf
+.columnInnerLoop
 	ld a, [de]
 	inc de
 	ld [hli], a
 	dec c
-	jr nz, .asm_16cf
+	jr nz, .columnInnerLoop
 	pop hl
-	ld bc, $38
-	add hl, bc
+	ld bc, 7*8    ; 7 tiles
+	add hl, bc    ; advance one full column
 	pop af
 	dec a
-	jr nz, .asm_16ca
+	jr nz, .columnLoop
 	ret
 
-; known jump sources: 16a3 (0:16a3), 16b2 (0:16b2)
-Func_16df: ; 16df (0:16df)
-	ld bc, $188
-.asm_16e2
+; fills the sprite buffer (pointed to in hl) with zeros
+ZeroSpriteBuffer: ; 16df (0:16df)
+	ld bc, SPRITEBUFFERSIZE
+.nextByteLoop
 	xor a
 	ld [hli], a
 	dec bc
 	ld a, b
 	or c
-	jr nz, .asm_16e2
+	jr nz, .nextByteLoop
 	ret
 
 ; known jump sources: 16bf (0:16bf), 62b8 (1:62b8), 3ecd8 (f:6cd8), 3f121 (f:7121), 70355 (1c:4355), 70368 (1c:4368)
-Func_16ea: ; 16ea (0:16ea)
+; 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: ; 16ea (0:16ea)
 	xor a
 	ld [$4000], a
 	push de
-	ld hl, $a497
-	ld de, $a30f
-	ld bc, $a187
-	ld a, $c4
-	ld [H_DOWNARROWBLINKCNT1], a ; $FF00+$8b
-.asm_16fc
+	ld hl, S_SPRITEBUFFER2 + (SPRITEBUFFERSIZE - 1) ; destination: end of buffer 2
+	ld de, S_SPRITEBUFFER1 + (SPRITEBUFFERSIZE - 1) ; source 2: end of buffer 1
+	ld bc, S_SPRITEBUFFER0 + (SPRITEBUFFERSIZE - 1) ; source 1: end of buffer 0
+	ld a, SPRITEBUFFERSIZE/2 ; $c4
+	ld [H_SPRITEINTERLACECOUNTER], a ; $FF00+$8b
+.interlaceLoop
 	ld a, [de]
 	dec de
-	ld [hld], a
+	ld [hld], a   ; write byte of source 2
 	ld a, [bc]
 	dec bc
-	ld [hld], a
+	ld [hld], a   ; write byte of source 1
 	ld a, [de]
 	dec de
-	ld [hld], a
+	ld [hld], a   ; write byte of source 2
 	ld a, [bc]
 	dec bc
-	ld [hld], a
-	ld a, [H_DOWNARROWBLINKCNT1] ; $FF00+$8b
+	ld [hld], a   ; write byte of source 1
+	ld a, [H_SPRITEINTERLACECOUNTER] ; $FF00+$8b
 	dec a
-	ld [H_DOWNARROWBLINKCNT1], a ; $FF00+$8b
-	jr nz, .asm_16fc
-	ld a, [$d0aa]
+	ld [H_SPRITEINTERLACECOUNTER], a ; $FF00+$8b
+	jr nz, .interlaceLoop
+	ld a, [W_SPRITEFLIPPED]
 	and a
-	jr z, .asm_1723
-	ld bc, $310
-	ld hl, $a188
-.asm_171b
-	swap [hl]
+	jr z, .notFlipped
+	ld bc, 2*SPRITEBUFFERSIZE
+	ld hl, S_SPRITEBUFFER1
+.swapLoop
+	swap [hl]    ; if flipped swap nybbles in all bytes
 	inc hl
 	dec bc
 	ld a, b
 	or c
-	jr nz, .asm_171b
-.asm_1723
+	jr nz, .swapLoop
+.notFlipped
 	pop hl
-	ld de, $a188
-	ld c, $31
-	ld a, [$FF00+$b8]
+	ld de, S_SPRITEBUFFER1
+	ld c, (2*SPRITEBUFFERSIZE)/16 ; $31, number of 16 byte chunks to be copied
+	ld a, [H_LOADEDROMBANK]
 	ld b, a
 	jp CopyVideoData
 ; 172f (0:172f)
+
 Tset0B_Coll: ; 0x172F
 	INCBIN "gfx/tilesets/0b.tilecoll"
 Tset00_Coll: ; 0x1735
@@ -3692,14 +3712,14 @@
 ; copy bc bytes of data from a:hl to de
 FarCopyData2: ; 17F7
 	ld [$ff8b],a
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,[$ff8b]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call CopyData
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -3707,10 +3727,10 @@
 ; copy bc bytes of data from a:de to hl
 FarCopyData3: ; 180D
 	ld [$ff8b],a
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,[$ff8b]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	push hl
 	push de
@@ -3722,7 +3742,7 @@
 	pop de
 	pop hl
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -3730,10 +3750,10 @@
 ; copy bc source bytes from a:hl to de
 FarCopyDataDouble: ; 182B
 	ld [$ff8b],a
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,[$ff8b]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 .loop
 	ld a,[hli]
@@ -3746,7 +3766,7 @@
 	or b
 	jr nz,.loop
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -3757,10 +3777,10 @@
 	push af
 	xor a
 	ld [H_AUTOBGTRANSFERENABLED],a ; disable auto-transfer while copying
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	ld [$ff8b],a
 	ld a,b
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld a,e
 	ld [H_VBCOPYSRC],a
@@ -3778,7 +3798,7 @@
 	ld [H_VBCOPYSIZE],a
 	call DelayFrame ; wait for V-blank handler to perform the copy
 	ld a,[$ff8b]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	pop af
 	ld [H_AUTOBGTRANSFERENABLED],a ; restore original auto-transfer enabled flag
@@ -3800,10 +3820,10 @@
 	push af
 	xor a
 	ld [H_AUTOBGTRANSFERENABLED],a ; disable auto-transfer while copying
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	ld [$ff8b],a
 	ld a,b
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld a,e
 	ld [H_VBCOPYDOUBLESRC],a
@@ -3821,7 +3841,7 @@
 	ld [H_VBCOPYDOUBLESIZE],a
 	call DelayFrame ; wait for V-blank handler to perform the copy
 	ld a,[$ff8b]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	pop af
 	ld [H_AUTOBGTRANSFERENABLED],a ; restore original auto-transfer enabled flag
@@ -4122,7 +4142,7 @@
 
 	ld h,b
 	ld l,c
-	ld de,$CFDA ; enemy active monster name
+	ld de,W_ENEMYMONNAME ; enemy active monster name
 
 FinishDTE:
 	call PlaceString
@@ -4587,7 +4607,7 @@
 ; BB = bank
 TextCommand17: ; 1CA3
 	pop hl
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,[hli]
 	ld e,a
@@ -4594,7 +4614,7 @@
 	ld a,[hli]
 	ld d,a
 	ld a,[hli]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	push hl
 	ld l,e
@@ -4602,7 +4622,7 @@
 	call TextCommandProcessor
 	pop hl
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	jp NextTextCommand
 
@@ -5111,13 +5131,13 @@
 	ret
 
 FlowerTilePattern1: ; 1F19
-INCBIN "baserom.gbc",$1f19,16
+INCBIN "gfx/tilesets/flower/flower1.2bpp"
 
 FlowerTilePattern2: ; 1F29
-INCBIN "baserom.gbc",$1f29,16
+INCBIN "gfx/tilesets/flower/flower2.2bpp"
 
 FlowerTilePattern3: ; 1F39
-INCBIN "baserom.gbc",$1f39,16
+INCBIN "gfx/tilesets/flower/flower3.2bpp"
 
 ; known jump sources: c047 (3:4047)
 Func_1f49: ; 1f49 (0:1f49)
@@ -5172,7 +5192,7 @@
 	call $36e0 ; zero HRAM
 	call CleanLCD_OAM ; this is unnecessary since it was already cleared above
 	ld a,$01
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call $4bed ; copy DMA code to HRAM
 	xor a
@@ -5240,12 +5260,13 @@
 	dec a
 	jp Func_23b1
 ; 2024 (0:2024)
+
 VBlankHandler: ; 2024
 	push af
 	push bc
 	push de
 	push hl
-	ld a,[$ffb8] ; current ROM bank
+	ld a,[H_LOADEDROMBANK] ; current ROM bank
 	ld [$d122],a
 	ld a,[$ffae]
 	ld [rSCX],a
@@ -5265,7 +5286,7 @@
 	call UpdateMovingBgTiles
 	call $ff80 ; OAM DMA
 	ld a,$01
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call $4b0f ; update OAM buffer with current sprite data
 	call GenRandom
@@ -5283,7 +5304,7 @@
 .handleMusic
 	call $28cb
 	ld a,[$c0ef] ; music ROM bank
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	cp a,$02
 	jr nz,.checkIfBank08
@@ -5307,7 +5328,7 @@
 	and a
 	call z,ReadJoypadRegister
 	ld a,[$d122]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	pop hl
 	pop de
@@ -5652,7 +5673,14 @@
 	jr nz, .asm_2253
 	ret
 
-INCBIN "baserom.gbc",$226e,$227f - $226e
+; no known jump sources (dead code?)
+Func_226e: ; 226e (0:226e)
+	call Func_3719
+	ld hl, $4c05
+	ld b, $1
+	call Bankswitch
+	call Func_227f
+	jp Func_3725
 
 ; known jump sources: 53b5 (1:53b5), 7263 (1:7263)
 Func_227f: ; 227f (0:227f)
@@ -5740,7 +5768,9 @@
 	ld [$FF00+$2], a
 	ret
 
-INCBIN "baserom.gbc",$2306,$2307 - $2306
+; timer interrupt is apparently not invoked anyway
+TimerHandler: ; 0x2306
+	reti
 
 ; known jump sources: 100d (0:100d), 12f5 (0:12f5), d993 (3:5993), d9ae (3:59ae), d9da (3:59da), da22 (3:5a22), e234 (3:6234), 17daa (5:7daa), 19624 (6:5624), 1cbf4 (7:4bf4), 1ce82 (7:4e82), 1cf1b (7:4f1b), 1cfda (7:4fda), 1ebc9 (7:6bc9), 3aef3 (e:6ef3), 51165 (14:5165), 51d35 (14:5d35), 605cf (18:45cf), 614d2 (18:54d2), 61917 (18:5917), 70558 (1c:4558), 7bf61 (1e:7f61), 7d15f (1f:515f)
 Func_2307: ; 2307 (0:2307)
@@ -5889,10 +5919,10 @@
 .asm_23e3
 	xor a
 	ld [$c0ee], a
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	ld [$FF00+$b9], a
 	ld a, [$c0ef]
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	cp $2
 	jr nz, .asm_23fd
@@ -5910,7 +5940,7 @@
 	call $58ea
 .asm_240b
 	ld a, [$FF00+$b9]
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	jr .asm_2425
 .asm_2414
@@ -5932,14 +5962,14 @@
 	ld a, [$cfcb]
 	dec a
 	ret nz
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a, $1
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	call Func_4c34
 	pop af
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ret
 ; 2442 (0:2442)
@@ -6054,46 +6084,47 @@
 	call Predef
 	jp TextScriptEnd
 
-; known jump sources: 1662 (0:1662), 36f1 (0:36f1)
-Func_24fd: ; 24fd (0:24fd)
+; bankswitches and runs _UncompressSpriteData
+; bank is given in a, sprite input stream is pointed to in W_SPRITEINPUTPTR
+UncompressSpriteData: ; 24fd (0:24fd)
 	ld b, a
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a, b
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ld a, $a
 	ld [$0], a
 	xor a
 	ld [$4000], a
-	call Func_251a
+	call _UncompressSpriteData
 	pop af
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ret
 
-; known jump sources: 2510 (0:2510)
-Func_251a: ; 251a (0:251a)
-	ld hl, $a188
-	ld c, $10
-	ld b, $3
+; initializes necessary data to load a sprite and runs UncompressSpriteDataLoop
+_UncompressSpriteData: ; 251a (0:251a)
+	ld hl, S_SPRITEBUFFER1
+	ld c, (2*SPRITEBUFFERSIZE) % $100
+	ld b, (2*SPRITEBUFFERSIZE) / $100
 	xor a
-	call FillMemory
+	call FillMemory           ; clear sprite buffer 1 and 2
 	ld a, $1
-	ld [$d0a6], a
+	ld [W_SPRITEINPUTBITCOUNTER], a
 	ld a, $3
-	ld [$d0a7], a
+	ld [W_SPRITEOUTPUTBITOFFSET], a
 	xor a
-	ld [$d0a1], a
-	ld [$d0a2], a
-	ld [$d0a8], a
-	call Func_268b
+	ld [W_SPRITECURPOSX], a
+	ld [W_SPRITECURPOSY], a
+	ld [W_SPRITELOADFLAGS], a ; $d0a8
+	call ReadNextInputByte    ; first byte of input determines sprite width (high nybble) and height (low nybble) in tiles (8x8 pixels)
 	ld b, a
 	and $f
 	add a
 	add a
 	add a
-	ld [$d0a4], a
+	ld [W_SPRITEHEIGHT], a
 	ld a, b
 	swap a
 	and $f
@@ -6100,181 +6131,188 @@
 	add a
 	add a
 	add a
-	ld [$d0a3], a
-	call Func_2670
-	ld [$d0a8], a
+	ld [W_SPRITEWITDH], a
+	call ReadNextInputBit
+	ld [W_SPRITELOADFLAGS], a ; initialite bit1 to 0 and bit0 to the first input bit
+	                          ; this will load two chunks of data to S_SPRITEBUFFER1 and S_SPRITEBUFFER2
+	                          ; bit 0 decides in which one the first chunk is placed
+	; fall through
 
-; known jump sources: 2643 (0:2643)
-Func_2556: ; 2556 (0:2556)
-	ld hl, $a188
-	ld a, [$d0a8]
+; uncompresses a chunk from the sprite input data stream (pointed to at $d0da) into S_SPRITEBUFFER1 or S_SPRITEBUFFER2
+; 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: ; 2556 (0:2556)
+	ld hl, S_SPRITEBUFFER1
+	ld a, [W_SPRITELOADFLAGS]  ; $d0a8
 	bit 0, a
-	jr z, .asm_2563
-	ld hl, $a310
-.asm_2563
-	call Func_2897
-	ld a, [$d0a8]
+	jr z, .useSpriteBuffer1    ; check which buffer to use
+	ld hl, S_SPRITEBUFFER2
+.useSpriteBuffer1
+	call StoreSpriteOutputPointer
+	ld a, [W_SPRITELOADFLAGS]  ; $d0a8
 	bit 1, a
-	jr z, .asm_257a
-	call Func_2670
+	jr z, .startDecompression  ; check if last iteration
+	call ReadNextInputBit      ; if last chunk, read 1-2 bit unpacking mode
 	and a
-	jr z, .asm_2577
-	call Func_2670
-	inc a
-.asm_2577
-	ld [$d0a9], a
-.asm_257a
-	call Func_2670
+	jr z, .unpackingMode0      ; 0   -> mode 0
+	call ReadNextInputBit      ; 1 0 -> mode 1
+	inc a                      ; 1 1 -> mode 2
+.unpackingMode0
+	ld [W_SPRITEUNPACKMODE], a
+.startDecompression
+	call ReadNextInputBit     
 	and a
-	jr z, .asm_2595
-.asm_2580
-	call Func_2670
+	jr z, .readRLEncodedZeros ; if first bit is 0, the input starts with zeroes, otherwise with (non-zero) input
+.readNextInput
+	call ReadNextInputBit
 	ld c, a
-	call Func_2670
+	call ReadNextInputBit
 	sla c
-	or c
+	or c                       ; read next two bits into c
 	and a
-	jr z, .asm_2595
-	call Func_2649
-	call Func_25d8
-	jr .asm_2580
-.asm_2595
-	ld c, $0
-.asm_2597
-	call Func_2670
+	jr z, .readRLEncodedZeros ; 00 -> RLEncoded zeroes following
+	call WriteSpriteBitsToBuffer  ; otherwise write input to output and repeat
+	call MoveToNextBufferPosition
+	jr .readNextInput
+.readRLEncodedZeros
+	ld c, $0                   ; number of zeroes it length encoded, the number
+.countConsecutiveOnesLoop      ; of consecutive ones determines the number of bits the number has
+	call ReadNextInputBit
 	and a
-	jr z, .asm_25a0
+	jr z, .countConsecutiveOnesFinished
 	inc c
-	jr .asm_2597
-.asm_25a0
+	jr .countConsecutiveOnesLoop
+.countConsecutiveOnesFinished
 	ld a, c
 	add a
-	ld hl, $269f
+	ld hl, LengthEncodingOffsetList
 	add l
 	ld l, a
-	jr nc, .asm_25aa
+	jr nc, .noCarry
 	inc h
-.asm_25aa
-	ld a, [hli]
-	ld e, a
-	ld d, [hl]
+.noCarry
+	ld a, [hli]                ; read offset that is added to the number later on
+	ld e, a                    ; adding an offset of 2^length - 1 makes every integer uniquely 
+	ld d, [hl]                 ; representable in the length encoding and saves bits
 	push de
 	inc c
 	ld e, $0
 	ld d, e
-.asm_25b2
-	call Func_2670
+.readNumberOfZerosLoop        ; reads the next c+1 bits of input
+	call ReadNextInputBit
 	or e
 	ld e, a
 	dec c
-	jr z, .asm_25c0
+	jr z, .readNumberOfZerosDone
 	sla e
 	rl d
-	jr .asm_25b2
-.asm_25c0
-	pop hl
+	jr .readNumberOfZerosLoop
+.readNumberOfZerosDone
+	pop hl                     ; add the offset
 	add hl, de
 	ld e, l
 	ld d, h
-.asm_25c4
+.writeZerosLoop
 	ld b, e
-	xor a
-	call Func_2649
+	xor a                      ; write 00 to buffer
+	call WriteSpriteBitsToBuffer
 	ld e, b
-	call Func_25d8
+	call MoveToNextBufferPosition
 	dec de
 	ld a, d
 	and a
-	jr nz, .asm_25d4
+	jr nz, .continueLoop
 	ld a, e
 	and a
-.asm_25d4
-	jr nz, .asm_25c4
-	jr .asm_2580
+.continueLoop
+	jr nz, .writeZerosLoop
+	jr .readNextInput
 
-; known jump sources: 2590 (0:2590), 25ca (0:25ca)
-Func_25d8: ; 25d8 (0:25d8)
-	ld a, [$d0a4]
+; 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: ; 25d8 (0:25d8)
+	ld a, [W_SPRITEHEIGHT]
 	ld b, a
-	ld a, [$d0a2]
+	ld a, [W_SPRITECURPOSY]
 	inc a
 	cp b
-	jr z, .asm_25f6
-	ld [$d0a2], a
-	ld a, [$d0ad]
+	jr z, .curColumnDone
+	ld [W_SPRITECURPOSY], a
+	ld a, [W_SPRITEOUTPUTPTR]
 	inc a
-	ld [$d0ad], a
+	ld [W_SPRITEOUTPUTPTR], a
 	ret nz
-	ld a, [$d0ae]
+	ld a, [W_SPRITEOUTPUTPTR+1]
 	inc a
-	ld [$d0ae], a
+	ld [W_SPRITEOUTPUTPTR+1], a
 	ret
-.asm_25f6
+.curColumnDone
 	xor a
-	ld [$d0a2], a
-	ld a, [$d0a7]
+	ld [W_SPRITECURPOSY], a
+	ld a, [W_SPRITEOUTPUTBITOFFSET]
 	and a
-	jr z, .asm_2610
+	jr z, .bitOffsetsDone
 	dec a
-	ld [$d0a7], a
-	ld hl, $d0af
+	ld [W_SPRITEOUTPUTBITOFFSET], a
+	ld hl, W_SPRITEOUTPUTPTRCACHED
 	ld a, [hli]
-	ld [$d0ad], a
+	ld [W_SPRITEOUTPUTPTR], a
 	ld a, [hl]
-	ld [$d0ae], a
+	ld [W_SPRITEOUTPUTPTR+1], a
 	ret
-.asm_2610
+.bitOffsetsDone
 	ld a, $3
-	ld [$d0a7], a
-	ld a, [$d0a1]
+	ld [W_SPRITEOUTPUTBITOFFSET], a
+	ld a, [W_SPRITECURPOSX]
 	add $8
-	ld [$d0a1], a
+	ld [W_SPRITECURPOSX], a
 	ld b, a
-	ld a, [$d0a3]
+	ld a, [W_SPRITEWITDH]
 	cp b
-	jr z, .asm_2630
-	ld a, [$d0ad]
+	jr z, .allColumnsDone
+	ld a, [W_SPRITEOUTPUTPTR]
 	ld l, a
-	ld a, [$d0ae]
+	ld a, [W_SPRITEOUTPUTPTR+1]
 	ld h, a
 	inc hl
-	jp Func_2897
-.asm_2630
+	jp StoreSpriteOutputPointer
+.allColumnsDone
 	pop hl
 	xor a
-	ld [$d0a1], a
-	ld a, [$d0a8]
+	ld [W_SPRITECURPOSX], a
+	ld a, [W_SPRITELOADFLAGS] ; $d0a8
 	bit 1, a
-	jr nz, .asm_2646
+	jr nz, .done            ; test if there is one more sprite to go
 	xor $1
 	set 1, a
-	ld [$d0a8], a
-	jp Func_2556
-.asm_2646
-	jp Func_26bf
+	ld [W_SPRITELOADFLAGS], a ; $d0a8
+	jp UncompressSpriteDataLoop
+.done
+	jp UnpackSprite
 
-; known jump sources: 258d (0:258d), 25c6 (0:25c6)
-Func_2649: ; 2649 (0:2649)
+; writes 2 bits (from a) to the output buffer (pointed to from W_SPRITEOUTPUTPTR)
+WriteSpriteBitsToBuffer: ; 2649 (0:2649)
 	ld e, a
-	ld a, [$d0a7]
+	ld a, [W_SPRITEOUTPUTBITOFFSET]
 	and a
-	jr z, .asm_2664
+	jr z, .offset0
 	cp $2
-	jr c, .asm_265c
-	jr z, .asm_2662
+	jr c, .offset1
+	jr z, .offset2
+	rrc e ; offset 3
 	rrc e
-	rrc e
-	jr .asm_2664
-.asm_265c
+	jr .offset0
+.offset1
 	sla e
 	sla e
-	jr .asm_2664
-.asm_2662
+	jr .offset0
+.offset2
 	swap e
-.asm_2664
-	ld a, [$d0ad]
+.offset0
+	ld a, [W_SPRITEOUTPUTPTR]
 	ld l, a
-	ld a, [$d0ae]
+	ld a, [W_SPRITEOUTPUTPTR+1]
 	ld h, a
 	ld a, [hl]
 	or e
@@ -6281,219 +6319,273 @@
 	ld [hl], a
 	ret
 
-; known jump sources: 2550 (0:2550), 256d (0:256d), 2573 (0:2573), 257a (0:257a), 2580 (0:2580), 2584 (0:2584), 2597 (0:2597), 25b2 (0:25b2)
-Func_2670: ; 2670 (0:2670)
-	ld a, [$d0a6]
+; reads next bit from input stream and returns it in a
+ReadNextInputBit: ; 2670 (0:2670)
+	ld a, [W_SPRITEINPUTBITCOUNTER]
 	dec a
-	jr nz, .asm_267e
-	call Func_268b
-	ld [$d0a5], a
+	jr nz, .curByteHasMoreBitsToRead
+	call ReadNextInputByte
+	ld [W_SPRITEINPUTCURBYTE], a
 	ld a, $8
-.asm_267e
-	ld [$d0a6], a
-	ld a, [$d0a5]
+.curByteHasMoreBitsToRead
+	ld [W_SPRITEINPUTBITCOUNTER], a
+	ld a, [W_SPRITEINPUTCURBYTE]
 	rlca
-	ld [$d0a5], a
+	ld [W_SPRITEINPUTCURBYTE], a
 	and $1
 	ret
 
-; known jump sources: 2539 (0:2539), 2676 (0:2676)
-Func_268b: ; 268b (0:268b)
-	ld a, [$d0ab]
+; reads next byte from input stream and returns it in a
+ReadNextInputByte: ; 268b (0:268b)
+	ld a, [W_SPRITEINPUTPTR]
 	ld l, a
-	ld a, [$d0ac]
+	ld a, [W_SPRITEINPUTPTR+1]
 	ld h, a
 	ld a, [hli]
 	ld b, a
 	ld a, l
-	ld [$d0ab], a
+	ld [W_SPRITEINPUTPTR], a
 	ld a, h
-	ld [$d0ac], a
+	ld [W_SPRITEINPUTPTR+1], a
 	ld a, b
 	ret
 
-INCBIN "baserom.gbc",$269f,$26bf - $269f
+; the nth item is 2^n - 1
+LengthEncodingOffsetList:
+	dw $0001
+	dw $0003
+	dw $0007
+	dw $000F
+	dw $001F
+	dw $003F
+	dw $007F
+	dw $00FF
+	dw $01FF
+	dw $03FF
+	dw $07FF
+	dw $0FFF
+	dw $1FFF
+	dw $3FFF
+	dw $7FFF
+	dw $FFFF
 
-; known jump sources: 2646 (0:2646)
-Func_26bf: ; 26bf (0:26bf)
-	ld a, [$d0a9]
+; unpacks the sprite data depending on the unpack mode
+UnpackSprite: ; 26bf (0:26bf)
+	ld a, [W_SPRITEUNPACKMODE]
 	cp $2
-	jp z, Func_2877
+	jp z, UnpackSpriteMode2
 	and a
-	jp nz, Func_27c7
-	ld hl, $a188
-	call Func_26d4
-	ld hl, $a310
+	jp nz, XorSpriteChunks
+	ld hl, S_SPRITEBUFFER1
+	call SpriteDifferentialDecode
+	ld hl, S_SPRITEBUFFER2
+	; fall through
 
-; known jump sources: 26ce (0:26ce), 27d9 (0:27d9), 288a (0:288a)
-Func_26d4: ; 26d4 (0:26d4)
+; 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: ; 26d4 (0:26d4)
 	xor a
-	ld [$d0a1], a
-	ld [$d0a2], a
-	call Func_2897
-	ld a, [$d0aa]
+	ld [W_SPRITECURPOSX], a
+	ld [W_SPRITECURPOSY], a
+	call StoreSpriteOutputPointer
+	ld a, [W_SPRITEFLIPPED]
 	and a
-	jr z, .asm_26ec
-	ld hl, $27b7
-	ld de, $27bf
-	jr .asm_26f2
-.asm_26ec
-	ld hl, $27a7
-	ld de, $27af
-.asm_26f2
+	jr z, .notFlipped
+	ld hl, DecodeNybble0TableFlipped
+	ld de, DecodeNybble1TableFlipped
+	jr .storeDecodeTablesPointers
+.notFlipped
+	ld hl, DecodeNybble0Table
+	ld de, DecodeNybble1Table
+.storeDecodeTablesPointers
 	ld a, l
-	ld [$d0b1], a
+	ld [W_SPRITEDECODETABLE0PTR], a
 	ld a, h
-	ld [$d0b2], a
+	ld [W_SPRITEDECODETABLE0PTR+1], a
 	ld a, e
-	ld [$d0b3], a
+	ld [W_SPRITEDECODETABLE1PTR], a
 	ld a, d
-	ld [$d0b4], a
-	ld e, $0
-.asm_2704
-	ld a, [$d0ad]
+	ld [W_SPRITEDECODETABLE1PTR+1], a
+	ld e, $0                          ; last decoded nybble, initialized to 0
+.decodeNextByteLoop
+	ld a, [W_SPRITEOUTPUTPTR]
 	ld l, a
-	ld a, [$d0ae]
+	ld a, [W_SPRITEOUTPUTPTR+1]
 	ld h, a
 	ld a, [hl]
 	ld b, a
 	swap a
 	and $f
-	call Func_276d
+	call DifferentialDecodeNybble     ; decode high nybble
 	swap a
 	ld d, a
 	ld a, b
 	and $f
-	call Func_276d
+	call DifferentialDecodeNybble     ; decode low nybble
 	or d
 	ld b, a
-	ld a, [$d0ad]
+	ld a, [W_SPRITEOUTPUTPTR]
 	ld l, a
-	ld a, [$d0ae]
+	ld a, [W_SPRITEOUTPUTPTR+1]
 	ld h, a
 	ld a, b
-	ld [hl], a
-	ld a, [$d0a4]
-	add l
-	jr nc, .asm_2731
+	ld [hl], a                        ; write back decoded data
+	ld a, [W_SPRITEHEIGHT]
+	add l                             ; move on to next column
+	jr nc, .noCarry
 	inc h
-.asm_2731
-	ld [$d0ad], a
+.noCarry
+	ld [W_SPRITEOUTPUTPTR], a
 	ld a, h
-	ld [$d0ae], a
-	ld a, [$d0a1]
+	ld [W_SPRITEOUTPUTPTR+1], a
+	ld a, [W_SPRITECURPOSX]
 	add $8
-	ld [$d0a1], a
+	ld [W_SPRITECURPOSX], a
 	ld b, a
-	ld a, [$d0a3]
+	ld a, [W_SPRITEWITDH]
 	cp b
-	jr nz, .asm_2704
+	jr nz, .decodeNextByteLoop        ; test if current row is done
 	xor a
 	ld e, a
-	ld [$d0a1], a
-	ld a, [$d0a2]
+	ld [W_SPRITECURPOSX], a
+	ld a, [W_SPRITECURPOSY]           ; move on to next row
 	inc a
-	ld [$d0a2], a
+	ld [W_SPRITECURPOSY], a
 	ld b, a
-	ld a, [$d0a4]
+	ld a, [W_SPRITEHEIGHT]
 	cp b
-	jr z, .asm_2768
-	ld a, [$d0af]
+	jr z, .done                       ; test if all rows finished
+	ld a, [W_SPRITEOUTPUTPTRCACHED]
 	ld l, a
-	ld a, [$d0b0]
+	ld a, [W_SPRITEOUTPUTPTRCACHED+1]
 	ld h, a
 	inc hl
-	call Func_2897
-	jr .asm_2704
-.asm_2768
+	call StoreSpriteOutputPointer
+	jr .decodeNextByteLoop
+.done
 	xor a
-	ld [$d0a2], a
+	ld [W_SPRITECURPOSY], a
 	ret
 
-; known jump sources: 2712 (0:2712), 271b (0:271b)
-Func_276d: ; 276d (0:276d)
-	srl a
+; 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: ; 276d (0:276d)
+	srl a               ; c=a%2, a/=2
 	ld c, $0
-	jr nc, .asm_2775
+	jr nc, .evenNumber
 	ld c, $1
-.asm_2775
+.evenNumber
 	ld l, a
-	ld a, [$d0aa]
+	ld a, [W_SPRITEFLIPPED]
 	and a
-	jr z, .asm_2780
-	bit 3, e
-	jr .asm_2782
-.asm_2780
-	bit 0, e
-.asm_2782
+	jr z, .notFlipped     ; determine if initial value is 0 or one
+	bit 3, e              ; if flipped, consider MSB of last data
+	jr .selectLookupTable
+.notFlipped
+	bit 0, e              ; else consider LSB
+.selectLookupTable
 	ld e, l
-	jr nz, .asm_278e
-	ld a, [$d0b1]
+	jr nz, .initialValue1 ; load the appropriate table
+	ld a, [W_SPRITEDECODETABLE0PTR]
 	ld l, a
-	ld a, [$d0b2]
-	jr .asm_2795
-.asm_278e
-	ld a, [$d0b3]
+	ld a, [W_SPRITEDECODETABLE0PTR+1]
+	jr .tableLookup
+.initialValue1
+	ld a, [W_SPRITEDECODETABLE1PTR]
 	ld l, a
-	ld a, [$d0b4]
-.asm_2795
+	ld a, [W_SPRITEDECODETABLE1PTR+1]
+.tableLookup
 	ld h, a
 	ld a, e
 	add l
 	ld l, a
-	jr nc, .asm_279c
+	jr nc, .noCarry
 	inc h
-.asm_279c
+.noCarry
 	ld a, [hl]
 	bit 0, c
-	jr nz, .asm_27a3
-	swap a
-.asm_27a3
+	jr nz, .selectLowNybble
+	swap a  ; select high nybble
+.selectLowNybble
 	and $f
-	ld e, a
+	ld e, a ; update last decoded data
 	ret
 
-INCBIN "baserom.gbc",$27a7,$27c7 - $27a7
+DecodeNybble0Table: ; 0x27a7
+	dn $0, $1
+	dn $3, $2
+	dn $7, $6
+	dn $4, $5
+	dn $f, $e
+	dn $c, $d
+	dn $8, $9
+	dn $b, $a
+DecodeNybble1Table: ; 0x27af
+	dn $f, $e
+	dn $c, $d
+	dn $8, $9
+	dn $b, $a
+	dn $0, $1
+	dn $3, $2
+	dn $7, $6
+	dn $4, $5
+DecodeNybble0TableFlipped: ; 0x27b7
+	dn $0, $8
+	dn $c, $4
+	dn $e, $6
+	dn $2, $a
+	dn $f, $7
+	dn $3, $b
+	dn $1, $9
+	dn $d, $5
+DecodeNybble1TableFlipped: ; 0x27bf
+	dn $f, $7
+	dn $3, $b
+	dn $1, $9
+	dn $d, $5
+	dn $0, $8
+	dn $c, $4
+	dn $e, $6
+	dn $2, $a
 
-; known jump sources: 26c8 (0:26c8), 2894 (0:2894)
-Func_27c7: ; 27c7 (0:27c7)
+; combines the two loaded chunks with xor (the chunk loaded second is the destination). The source chunk is differeintial decoded beforehand.
+XorSpriteChunks: ; 27c7 (0:27c7)
 	xor a
-	ld [$d0a1], a
-	ld [$d0a2], a
-	call Func_2841
-	ld a, [$d0ad]
+	ld [W_SPRITECURPOSX], a
+	ld [W_SPRITECURPOSY], a
+	call ResetSpriteBufferPointers
+	ld a, [W_SPRITEOUTPUTPTR]          ; points to buffer 1 or 2, depending on flags
 	ld l, a
-	ld a, [$d0ae]
+	ld a, [W_SPRITEOUTPUTPTR+1]
 	ld h, a
-	call Func_26d4
-	call Func_2841
-	ld a, [$d0ad]
+	call SpriteDifferentialDecode      ; decode buffer 1 or 2, depending on flags
+	call ResetSpriteBufferPointers
+	ld a, [W_SPRITEOUTPUTPTR]          ; source buffer, points to buffer 1 or 2, depending on flags
 	ld l, a
-	ld a, [$d0ae]
+	ld a, [W_SPRITEOUTPUTPTR+1]
 	ld h, a
-	ld a, [$d0af]
+	ld a, [W_SPRITEOUTPUTPTRCACHED]    ; destination buffer, points to buffer 2 or 1, depending on flags
 	ld e, a
-	ld a, [$d0b0]
+	ld a, [W_SPRITEOUTPUTPTRCACHED+1]
 	ld d, a
-.asm_27ef
-	ld a, [$d0aa]
+.xorChunksLoop
+	ld a, [W_SPRITEFLIPPED]
 	and a
-	jr z, .asm_280b
+	jr z, .notFlipped
 	push de
 	ld a, [de]
 	ld b, a
 	swap a
 	and $f
-	call Func_2837
+	call ReverseNybble                 ; if flipped reverse the nybbles in the destination buffer
 	swap a
 	ld c, a
 	ld a, b
 	and $f
-	call Func_2837
+	call ReverseNybble
 	or c
 	pop de
 	ld [de], a
-.asm_280b
+.notFlipped
 	ld a, [hli]
 	ld b, a
 	ld a, [de]
@@ -6500,29 +6592,29 @@
 	xor b
 	ld [de], a
 	inc de
-	ld a, [$d0a2]
+	ld a, [W_SPRITECURPOSY]
 	inc a
-	ld [$d0a2], a
+	ld [W_SPRITECURPOSY], a             ; go to next row
 	ld b, a
-	ld a, [$d0a4]
+	ld a, [W_SPRITEHEIGHT]
 	cp b
-	jr nz, .asm_27ef
+	jr nz, .xorChunksLoop               ; test if column finished
 	xor a
-	ld [$d0a2], a
-	ld a, [$d0a1]
+	ld [W_SPRITECURPOSY], a
+	ld a, [W_SPRITECURPOSX]
 	add $8
-	ld [$d0a1], a
+	ld [W_SPRITECURPOSX], a             ; go to next column
 	ld b, a
-	ld a, [$d0a3]
+	ld a, [W_SPRITEWITDH]
 	cp b
-	jr nz, .asm_27ef
+	jr nz, .xorChunksLoop               ; test if all columns finished
 	xor a
-	ld [$d0a1], a
+	ld [W_SPRITECURPOSX], a
 	ret
 
-; known jump sources: 27fc (0:27fc), 2805 (0:2805)
-Func_2837: ; 2837 (0:2837)
-	ld de, $2867
+; reverses the bits in the nybble given in register a
+ReverseNybble: ; 2837 (0:2837)
+	ld de, NybbleReverseTable
 	add e
 	ld e, a
 	jr nc, .asm_283f
@@ -6531,55 +6623,57 @@
 	ld a, [de]
 	ret
 
-; known jump sources: 27ce (0:27ce), 27dc (0:27dc), 2877 (0:2877), 288d (0:288d)
-Func_2841: ; 2841 (0:2841)
-	ld a, [$d0a8]
+; resets sprite buffer pointers to buffer 1 and 2, depending on W_SPRITELOADFLAGS
+ResetSpriteBufferPointers: ; 2841 (0:2841)
+	ld a, [W_SPRITELOADFLAGS] ; $d0a8
 	bit 0, a
-	jr nz, .asm_2850
-	ld de, $a188
-	ld hl, $a310
-	jr .asm_2856
-.asm_2850
-	ld de, $a310
-	ld hl, $a188
-.asm_2856
+	jr nz, .buffer2Selected
+	ld de, S_SPRITEBUFFER1
+	ld hl, S_SPRITEBUFFER2
+	jr .storeBufferPointers
+.buffer2Selected
+	ld de, S_SPRITEBUFFER2
+	ld hl, S_SPRITEBUFFER1
+.storeBufferPointers
 	ld a, l
-	ld [$d0ad], a
+	ld [W_SPRITEOUTPUTPTR], a
 	ld a, h
-	ld [$d0ae], a
+	ld [W_SPRITEOUTPUTPTR+1], a
 	ld a, e
-	ld [$d0af], a
+	ld [W_SPRITEOUTPUTPTRCACHED], a
 	ld a, d
-	ld [$d0b0], a
+	ld [W_SPRITEOUTPUTPTRCACHED+1], a
 	ret
 
-INCBIN "baserom.gbc",$2867,$2877 - $2867
+; maps each nybble to its reverse
+NybbleReverseTable: ; 0x2867
+	db $0, $8, $4, $c, $2, $a, $6 ,$e, $1, $9, $5, $d, $3, $b, $7 ,$f
 
-; known jump sources: 26c4 (0:26c4)
-Func_2877: ; 2877 (0:2877)
-	call Func_2841
-	ld a, [$d0aa]
+; combines the two loaded chunks with xor (the chunk loaded second is the destination). Both chunks are differeintial decoded beforehand.
+UnpackSpriteMode2: ; 2877 (0:2877)
+	call ResetSpriteBufferPointers
+	ld a, [W_SPRITEFLIPPED]
 	push af
 	xor a
-	ld [$d0aa], a
-	ld a, [$d0af]
+	ld [W_SPRITEFLIPPED], a            ; temporarily clear flipped flag for decoding the destination chunk
+	ld a, [W_SPRITEOUTPUTPTRCACHED]
 	ld l, a
-	ld a, [$d0b0]
+	ld a, [W_SPRITEOUTPUTPTRCACHED+1]
 	ld h, a
-	call Func_26d4
-	call Func_2841
+	call SpriteDifferentialDecode
+	call ResetSpriteBufferPointers
 	pop af
-	ld [$d0aa], a
-	jp Func_27c7
+	ld [W_SPRITEFLIPPED], a
+	jp XorSpriteChunks
 
-; known jump sources: 2563 (0:2563), 262d (0:262d), 26db (0:26db), 2763 (0:2763)
-Func_2897: ; 2897 (0:2897)
+; stores hl into the output pointers
+StoreSpriteOutputPointer: ; 2897 (0:2897)
 	ld a, l
-	ld [$d0ad], a
-	ld [$d0af], a
+	ld [W_SPRITEOUTPUTPTR], a
+	ld [W_SPRITEOUTPUTPTRCACHED], a
 	ld a, h
-	ld [$d0ae], a
-	ld [$d0b0], a
+	ld [W_SPRITEOUTPUTPTR+1], a
+	ld [W_SPRITEOUTPUTPTRCACHED+1], a
 	ret
 
 ; known jump sources: 5d6e (1:5d6e), 6210 (1:6210)
@@ -6657,7 +6751,7 @@
 ; this function is used to display sign messages, sprite dialog, etc.
 ; INPUT: [$ff8c] = sprite ID or text ID
 DisplayTextID: ; 2920
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld b,BANK(DisplayTextIDInit)
 	ld hl,DisplayTextIDInit ; initialization
@@ -6793,7 +6887,7 @@
 	dec c
 	jr nz,.restoreSpriteFacingDirectionLoop
 	ld a,BANK(InitMapSprites)
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call InitMapSprites ; reload sprite tile pattern data (since it was partially overwritten by text tile patterns)
 	ld hl,$cfc4
@@ -6803,7 +6897,7 @@
 	call z,LoadPlayerSpriteGraphics
 	call LoadCurrentMapView
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	jp $2429 ; move sprites
 
@@ -6816,14 +6910,14 @@
 	call LoadItemList
 	ld a,$02
 	ld [$cf94],a ; selects between subtypes of menus
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,$01
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call DisplayPokemartDialogue_
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	jp AfterDisplayingTextID
 
@@ -6853,14 +6947,14 @@
 	ld [$ff8c],a
 	ld [$ff8d],a
 	inc hl
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,$01
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call DisplayPokemonCenterDialogue_
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	jp AfterDisplayingTextID
 
@@ -6902,7 +6996,7 @@
 
 DisplayStartMenu: ; 2ACD
 	ld a,$04
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a ; ROM bank 4
 	ld a,[$d700] ; walking/biking/surfing
 	ld [$d11a],a
@@ -7045,14 +7139,14 @@
 ; [$CF92] = index (within the inventory) of the item to remove
 ; [$CF96] = quantity to remove
 RemoveItemFromInventory: ; 2BBB
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,BANK(RemoveItemFromInventory_)
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call RemoveItemFromInventory_
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -7064,15 +7158,15 @@
 ; sets carry flag if successful, unsets carry flag if unsuccessful
 AddItemToInventory: ; 2BCF
 	push bc
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,BANK(AddItemToInventory_)
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call AddItemToInventory_
 	pop bc
 	ld a,b
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	pop bc
 	ret
@@ -7614,10 +7708,10 @@
 
 GetMonName: ; 2F9E
 	push hl
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,BANK(MonsterNames) ; 07
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld a,[$d11e]
 	dec a
@@ -7633,7 +7727,7 @@
 	ld [hl],$50
 	pop de
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	pop hl
 	ret
@@ -7649,7 +7743,7 @@
 
 	ld [$D0B5],a
 	ld a,ITEM_NAME
-	ld [$D0B6],a
+	ld [W_LISTTYPE],a
 	ld a,BANK(ItemNames)
 	ld [$D0B7],a
 	call GetName
@@ -7746,7 +7840,7 @@
 GetMoveName: ; 3058
 	push hl
 	ld a,MOVE_NAME
-	ld [$d0b6],a
+	ld [W_LISTTYPE],a
 	ld a,[$d11e]
 	ld [$d0b5],a
 	ld a,BANK(MoveNames)
@@ -7758,7 +7852,7 @@
 
 ; reloads text box tile patterns, current map view, and tileset tile patterns
 ReloadMapData: ; 3071
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,[W_CURMAP]
 	call SwitchToMapRomBank
@@ -7768,13 +7862,13 @@
 	call LoadTilesetTilePatternData
 	call EnableLCD
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
 ; reloads tileset tile patterns
 ReloadTilesetTilePatterns: ; 3090
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,[W_CURMAP]
 	call SwitchToMapRomBank
@@ -7782,7 +7876,7 @@
 	call LoadTilesetTilePatternData
 	call EnableLCD
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -7823,15 +7917,15 @@
 ; OUTPUT:
 ; clears carry flag if the item is tossed, sets carry flag if not
 TossItem: ; 30C4
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,BANK(TossItem_)
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call TossItem_
 	pop de
 	ld a,d
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -7858,15 +7952,15 @@
 ; INPUT:
 ; [$D125] = text box ID
 DisplayTextBoxID: ; 30E8
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,BANK(DisplayTextBoxID_)
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call DisplayTextBoxID_
 	pop bc
 	ld a,b
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -7900,15 +7994,15 @@
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a, [$cc58]
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ld a, [$cf10]
 	call CallFunctionInTable
 	pop af
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ret
 
@@ -8008,7 +8102,7 @@
 ; known jump sources: 31de (0:31de), 3299 (0:3299), 3324 (0:3324)
 Func_31c7: ; 31c7 (0:31c7)
 	ld a, $10
-	jp Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	jp Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 ; 31cc (0:31cc)
 LoadTrainerHeader: ; 0x31cc
 	call $3157
@@ -8228,7 +8322,7 @@
 
 ; known jump sources: 3201 (0:3201), 19585 (6:5585), 19697 (6:5697), 1cdea (7:4dea), 48a40 (12:4a40), 49ea0 (12:5ea0), 510c5 (14:50c5), 514dd (14:54dd), 51ca3 (14:5ca3), 5c47d (17:447d), 5c7a0 (17:47a0), 5cb4c (17:4b4c), 5d147 (17:5147), 60602 (18:4602), 614fa (18:54fa), 622a0 (18:62a0), 74ab3 (1d:4ab3), 75563 (1d:5563), 75909 (1d:5909), 75985 (1d:5985), 75f92 (1d:5f92)
 Func_3354: ; 3354 (0:3354)
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	ld [$d092], a
 	ld a, h
 	ld [$d08c], a
@@ -8263,10 +8357,10 @@
 	res 7, [hl]
 	pop hl
 	ret z
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a, [$d092]
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	push hl
 	ld b, BANK(SaveTrainerName)
@@ -8276,7 +8370,7 @@
 	call PrintText
 	pop hl
 	pop af
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ld b, BANK(Func_1a5e7)
 	ld hl, Func_1a5e7
@@ -8642,10 +8736,10 @@
 ; switches to bank # in a
 ; Only use this when in the home bank!
 	ld [$CF09],a
-	ld a,[$FFB8]
+	ld a,[H_LOADEDROMBANK]
 	ld [$CF08],a
 	ld a,[$CF09]
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -8652,7 +8746,7 @@
 BankswitchBack: ; 35CD
 ; returns from BankswitchHome
 	ld a,[$CF08]
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -8659,10 +8753,10 @@
 Bankswitch: ; 0x35d6
 ; self-contained bankswitch, use this when not in the home bank
 ; switches to the bank in b
-	ld a,[$FFB8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,b
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld bc,.Return
 	push bc
@@ -8670,7 +8764,7 @@
 .Return
 	pop bc
 	ld a,b
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -8839,12 +8933,13 @@
 	ret
 
 ; known jump sources: 62a6 (1:62a6), 3eca0 (f:6ca0), 3f05d (f:705d), 70343 (1c:4343), 7035d (1c:435d)
-Func_36eb: ; 36eb (0:36eb)
-	ld hl, $d0ab
+; loads sprite that de points to
+UncompressSpriteFromDE: ; 36eb (0:36eb)
+	ld hl, W_SPRITEINPUTPTR
 	ld [hl], e
 	inc hl
 	ld [hl], d
-	jp Func_24fd
+	jp UncompressSpriteData
 
 ; known jump sources: 2b44 (0:2b44), 3460 (0:3460), 346a (0:346a), 438f (1:438f), efae (3:6fae), 17e2c (5:7e2c), 1da57 (7:5a57), 1e915 (7:6915), 213cb (8:53cb), 3cffd (f:4ffd), 3d0ce (f:50ce), 71ad9 (1c:5ad9)
 Func_36f4: ; 36f4 (0:36f4)
@@ -8935,7 +9030,7 @@
 GetName: ; 376B
 ; arguments:
 ; [$D0B5] = which name
-; [$D0B6] = which list
+; [$D0B6] = which list (W_LISTTYPE)
 ; [$D0B7] = bank of list
 ;
 ; returns pointer to name in de
@@ -8943,12 +9038,12 @@
 	ld [$d11e],a
 	cp a,$C4        ;it's TM/HM
 	jp nc,GetMachineName
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	push hl
 	push bc
 	push de
-	ld a,[$d0b6]    ;List3759_entrySelector
+	ld a,[W_LISTTYPE]    ;List3759_entrySelector
 	dec a
 	jr nz,.otherEntries
 	;1 = MON_NAMES
@@ -8961,9 +9056,9 @@
 .otherEntries ; $378d
 	;2-7 = OTHER ENTRIES
 	ld a,[$d0b7]
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
-	ld a,[$d0b6]    ;VariousNames' entryID
+	ld a,[W_LISTTYPE]    ;VariousNames' entryID
 	dec a
 	add a
 	ld d,0
@@ -9009,13 +9104,13 @@
 	pop bc
 	pop hl
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
 ; known jump sources: 2cdc (0:2cdc), 2ee0 (0:2ee0)
 Func_37df: ; 37df (0:37df)
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a, [W_LISTMENUID] ; $cf94
 	cp $1
@@ -9023,7 +9118,7 @@
 	jr nz, .asm_37ed
 	ld a, $f
 .asm_37ed
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ld hl, $cf8f
 	ld a, [hli]
@@ -9047,13 +9142,13 @@
 	jr .asm_381c
 .asm_3812
 	ld a, $1e
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	call Func_7bf86
 .asm_381c
 	ld de, H_DOWNARROWBLINKCNT1 ; $ff8b
 	pop af
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ret
 
@@ -9196,14 +9291,14 @@
 	push hl
 	push de
 	push bc
-	ld a,[$ffb8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,$0d
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call $7da5
 	pop af
-	ld [$ffb8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	pop bc
 	pop de
@@ -9317,7 +9412,7 @@
 	ld a, b
 	ld d, a
 	push hl
-	ld hl, $d0b8
+	ld hl, W_MONHEADER
 	ld b, $0
 	add hl, bc
 	ld a, [hl]
@@ -9492,15 +9587,15 @@
 
 ; known jump sources: 215e8 (8:55e8), 2165c (8:565c)
 Func_3a68: ; 3a68 (0:3a68)
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a, $3
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	call Func_f51e
 	pop bc
 	ld a, b
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld [$2000], a
 	ret
 
@@ -10278,13 +10373,13 @@
 
 	ld [$CC4E],a ; save the predef routine's ID for later
 
-	ld a,[$FFB8]
+	ld a,[H_LOADEDROMBANK]
 	ld [$CF12],a
 
 	; save bank and call 13:7E49
 	push af
 	ld a,BANK(GetPredefPointer)
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	call GetPredefPointer
 
@@ -10291,7 +10386,7 @@
 	; call the predef function
 	; ($D0B7 has the bank of the predef routine)
 	ld a,[$D0B7]
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld de,.Return
 	push de
@@ -10299,7 +10394,7 @@
 	; after the predefined function finishes it returns here
 .Return
 	pop af
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ret
 
@@ -10329,7 +10424,7 @@
 
 ; known jump sources: 46b (0:46b)
 Func_3eb5: ; 3eb5 (0:3eb5)
-	ld a, [$FF00+$b8]
+	ld a, [H_LOADEDROMBANK]
 	push af
 	ld a, [$FF00+$b4]
 	bit 0, a
@@ -10336,7 +10431,7 @@
 	jr z, .asm_3eea
 	ld a, $11
 	ld [$2000], a
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	call Func_469a0
 	ld a, [$FF00+$ee]
 	and a
@@ -10343,7 +10438,7 @@
 	jr nz, .asm_3edd
 	ld a, [$cd3e]
 	ld [$2000], a
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ld de, $3eda
 	push de
 	jp [hl]
@@ -10362,7 +10457,7 @@
 	ld [$FF00+$eb], a
 	pop af
 	ld [$2000], a
-	ld [$FF00+$b8], a
+	ld [H_LOADEDROMBANK], a
 	ret
 
 ; known jump sources: fb74 (3:7b74), 1ea22 (7:6a22), 1eb88 (7:6b88), 1eb92 (7:6b92), 1ebd9 (7:6bd9), 526ab (14:66ab), 526e0 (14:66e0), 5dbba (17:5bba), 5dbd0 (17:5bd0), 5de0e (17:5e0e), 5de7a (17:5e7a), 62526 (18:6526), 766b5 (1d:66b5)
@@ -10574,8 +10669,8 @@
 	push hl
 	ld a, [$cfe5]
 	ld [$d0b5], a
-	call GetBaseStats
-	ld a, [$d0c0]
+	call GetMonHeader
+	ld a, [W_MONHCATCHRATE]
 	ld [$d007], a
 	pop hl
 .asm_429f
@@ -10932,7 +11027,7 @@
 	ld [$cf91], a
 	ld [$d0b5], a
 	ld hl, $c46d
-	call GetBaseStats
+	call GetMonHeader
 	jp Func_1389
 
 ; known jump sources: 43a2 (1:43a2), 43b1 (1:43b1), 4420 (1:4420), 4473 (1:4473), 4478 (1:4478), 4498 (1:4498)
@@ -11054,16 +11149,16 @@
 	ld [$cf91],a
 	ld a,[$cc49]
 	cp a,$03
-	jr z,.getBaseStats
+	jr z,.GetMonHeader
 	ld a,[$cf92]
 	ld e,a
 	ld hl,$5c37
 	ld b,$0e
 	call Bankswitch ; get pokemon ID
-.getBaseStats
+.GetMonHeader
 	ld a,[$cf91]
-	ld [$d0b5],a ; input for GetBaseStats
-	call GetBaseStats ; load base stats to $d0b8
+	ld [$d0b5],a ; input for GetMonHeader
+	call GetMonHeader ; load base stats to $d0b8
 	ld hl,W_PARTYMON1DATA
 	ld bc,44
 	ld a,[$cc49]
@@ -13773,12 +13868,12 @@
 	jr nz,.next
 	ld hl,OakSpeechText3
 	call PrintText
-.next	ld a,[$FFB8]
+.next	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,$9C
 	call $23B1
 	pop af
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld c,4
 	call DelayFrames
@@ -13795,7 +13890,7 @@
 	ld bc,$0400
 	call IntroPredef3B
 	call $28A6
-	ld a,[$FFB8]
+	ld a,[H_LOADEDROMBANK]
 	push af
 	ld a,2
 	ld [$C0EF],a
@@ -13806,7 +13901,7 @@
 	ld [$C0EE],a
 	call $23B1 ; stop music
 	pop af
-	ld [$FFB8],a
+	ld [H_LOADEDROMBANK],a
 	ld [$2000],a
 	ld c,$14
 	call DelayFrames
@@ -13881,7 +13976,7 @@
 	push bc
 	ld a,b
 	call $36EB
-	ld hl,$A188
+	ld hl,S_SPRITEBUFFER1
 	ld de,$A000
 	ld bc,$0310
 	call CopyData
@@ -16732,8 +16827,8 @@
 Func_78e6: ; 78e6 (1:78e6)
 	ld hl, $d730
 	set 6, [hl]
-	ld a, $4
-	ld [$d0b6], a
+	ld a, ITEM_NAME
+	ld [W_LISTTYPE], a
 	call Func_3719
 	xor a
 	ld [$cc2c], a
@@ -24129,7 +24224,7 @@
 	add hl,bc ; hl now points to level
 	ld a,[hl] ; a = level
 	ld [$d127],a ; store level
-	call GetBaseStats
+	call GetMonHeader
 	push de
 	ld a,d
 	ld hl,W_PARTYMON1NAME
@@ -25627,7 +25722,7 @@
 	ld [de], a
 	cp $ff
 	jr nz, .asm_e7b1
-	call GetBaseStats
+	call GetMonHeader
 	ld hl, $dd2a
 	ld bc, $b
 	ld a, [W_NUMINBOX] ; $da80
@@ -25743,9 +25838,9 @@
 	push de
 	ld a, [W_CURENEMYLVL] ; $d127
 	ld d, a
-	ld hl, Func_58f6a
-	ld b, BANK(Func_58f6a)
-	call Bankswitch ; indirect jump to Func_58f6a (58f6a (16:4f6a))
+	ld hl, CalcExperience
+	ld b, BANK(CalcExperience)
+	call Bankswitch ; indirect jump to CalcExperience (58f6a (16:4f6a))
 	pop de
 	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
 	ld [de], a
@@ -26477,7 +26572,7 @@
 	ld b, $1
 	ld hl, $d70b
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 .asm_f125
 	ld hl, $48f5
 	ld a, [W_CURMAP] ; $d35e
@@ -26835,8 +26930,8 @@
 	push hl
 	ld a, [$cf91]
 	ld [$d0b5], a
-	call GetBaseStats
-	ld hl, $d0b8
+	call GetMonHeader
+	ld hl, W_MONHEADER
 	ld a, [hli]
 	ld [de], a
 	inc de
@@ -26858,7 +26953,7 @@
 	ld c, a
 	ld b, $2
 	ld hl, W_OWNEDPOKEMON ; $d2f7
-	call Func_f669
+	call _HandleBitArray
 	ld a, c
 	ld [$d153], a
 	ld a, [$d11e]
@@ -26866,10 +26961,10 @@
 	ld c, a
 	ld b, $1
 	push bc
-	call Func_f669
+	call _HandleBitArray
 	pop bc
 	ld hl, W_SEENPOKEMON ; $d30a
-	call Func_f669
+	call _HandleBitArray
 	pop hl
 	push hl
 	ld a, [W_ISINBATTLE] ; $d057
@@ -26924,7 +27019,7 @@
 	ld [de], a
 	inc de
 .asm_f3f4
-	ld hl, $d0be
+	ld hl, W_MONHTYPES
 	ld a, [hli]
 	ld [de], a
 	inc de
@@ -26933,7 +27028,7 @@
 	inc de
 	ld a, [hli]
 	ld [de], a
-	ld hl, $d0c7
+	ld hl, W_MONHMOVES
 	ld a, [hli]
 	inc de
 	push de
@@ -26965,9 +27060,9 @@
 	push de
 	ld a, [W_CURENEMYLVL] ; $d127
 	ld d, a
-	ld hl, Func_58f6a
-	ld b, BANK(Func_58f6a)
-	call Bankswitch ; indirect jump to Func_58f6a (58f6a (16:4f6a))
+	ld hl, CalcExperience
+	ld b, BANK(CalcExperience)
+	call Bankswitch ; indirect jump to CalcExperience (58f6a (16:4f6a))
 	pop de
 	inc de
 	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
@@ -27221,12 +27316,18 @@
 	and a
 	ret
 
-; known jump sources: 31c9 (0:31c9), d8cb (3:58cb), d8d9 (3:58d9), dbd9 (3:5bd9), dbeb (3:5beb), e787 (3:6787), f122 (3:7122), 13760 (4:7760), 1ea8f (7:6a8f), 1ead5 (7:6ad5), 3b059 (e:7059), 3c1eb (f:41eb), 3c1f4 (f:41f4), 3c74c (f:474c), 3c810 (f:4810), 3c819 (f:4819), 3c91c (f:491c), 3c927 (f:4927), 3d1d9 (f:51d9), 3d1e2 (f:51e2), 3ec17 (f:6c17), 402cb (10:42cb), 4fe29 (13:7e29), 51245 (14:5245), 51358 (14:5358), 5137f (14:537f), 55271 (15:5271), 5542e (15:542e), 5545e (15:545e), 55469 (15:5469), 71b2c (1c:5b2c), 71c43 (1c:5c43), 757f3 (1d:57f3), 7669c (1d:669c), 76776 (1d:6776)
-Func_f666: ; f666 (3:7666)
+; predef $10
+; executes operations on a field of bits
+; b = 0 -> reset bit
+; b = 1 -> set bit
+; b = 2 -> read bit (into c and z-flag)
+; hl: base address
+; c: bit index
+HandleBitArray: ; f666 (3:7666)
 	call Load16BitRegisters
 
 ; known jump sources: f38b (3:738b), f39a (3:739a), f3a1 (3:73a1)
-Func_f669: ; f669 (3:7669)
+_HandleBitArray: ; f669 (3:7669)
 	push hl
 	push de
 	push bc
@@ -27233,46 +27334,46 @@
 	ld a, c
 	ld d, a
 	and $7
-	ld e, a
+	ld e, a        ; store bit offset in e
 	ld a, d
 	srl a
 	srl a
-	srl a
+	srl a          ; calc byte offset
 	add l
 	ld l, a
-	jr nc, .asm_f67d
+	jr nc, .noCarry
 	inc h
-.asm_f67d
+.noCarry
 	inc e
 	ld d, $1
-.asm_f680
+.shiftLeftLoop     ; d = 1 << e, bitmask for the used bit
 	dec e
-	jr z, .asm_f687
+	jr z, .operationSelect
 	sla d
-	jr .asm_f680
-.asm_f687
+	jr .shiftLeftLoop
+.operationSelect
 	ld a, b
 	and a
-	jr z, .asm_f695
+	jr z, .resetBit
 	cp $2
-	jr z, .asm_f69d
-	ld b, [hl]
+	jr z, .readBit
+	ld b, [hl] ; set bit
 	ld a, d
 	or b
 	ld [hl], a
-	jr .asm_f6a0
-.asm_f695
+	jr .done
+.resetBit
 	ld b, [hl]
 	ld a, d
 	xor $ff
 	and b
 	ld [hl], a
-	jr .asm_f6a0
-.asm_f69d
+	jr .done
+.readBit
 	ld b, [hl]
 	ld a, d
 	and b
-.asm_f6a0
+.done
 	pop bc
 	pop de
 	pop hl
@@ -27279,6 +27380,7 @@
 	ld c, a
 	ret
 ; f6a5 (3:76a5)
+
 HealParty:
 	ld hl, W_PARTYMON1
 	ld de, W_PARTYMON1_HP
@@ -27362,6 +27464,10 @@
 	jr nz,.restoreBonusPPLoop
 	ret
 
+; predef $9
+; predef $a
+; predef $d
+; predef $e
 ; known jump sources: 2df5 (0:2df5), 40ed (1:40ed)
 Func_f71e: ; f71e (3:771e)
 	call Load16BitRegisters
@@ -29989,33 +30095,36 @@
 	ret
 
 ; known jump sources: e50c (3:650c), 12d79 (4:6d79)
-Func_1373e: ; 1373e (4:773e)
+; tests if mon [$cf91] can learn move [$d0e0]
+TestMonMoveCompatibility: ; 1373e (4:773e)
 	ld a, [$cf91]
 	ld [$d0b5], a
-	call GetBaseStats
-	ld hl, $d0cc
+	call GetMonHeader
+	ld hl, W_MONHLEARNSET
 	push hl
 	ld a, [$d0e0]
 	ld b, a
 	ld c, $0
-	ld hl, $7773
-.asm_13754
+	ld hl, TechnicalMachines
+.findTMloop
 	ld a, [hli]
 	cp b
-	jr z, .asm_1375b
+	jr z, .TMfoundLoop
 	inc c
-	jr .asm_13754
-.asm_1375b
+	jr .findTMloop
+.TMfoundLoop
 	pop hl
-	ld b, $2
+	ld b, $2  ; read corresponding bit from TM compatibility array
 	ld a, $10
-	jp Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	jp Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 
 ; known jump sources: e490 (3:6490)
-Func_13763: ; 13763 (4:7763)
+; converts TM/HM number in $d11e into move number
+; HMs start at 51
+TMToMove: ; 13763 (4:7763)
 	ld a, [$d11e]
 	dec a
-	ld hl, $7773
+	ld hl, TechnicalMachines
 	ld b, $0
 	ld c, a
 	add hl, bc
@@ -30023,6 +30132,7 @@
 	ld [$d11e], a
 	ret
 ; 13773 (4:7773)
+
 TechnicalMachines: ; 0x13773
 	db MEGA_PUNCH
 	db RAZOR_WIND
@@ -30368,8 +30478,8 @@
 	cp $2b
 	jr z, .asm_13a86
 	ld [$d0b5], a
-	ld a, $7
-	ld [$d0b6], a
+	ld a, TRAINER_NAME
+	ld [W_LISTTYPE], a
 	ld a, $e
 	ld [$d0b7], a
 	call GetName
@@ -32505,7 +32615,7 @@
 	ld [$CF10],a
 	ld a,1
 	ld [$CC57],a
-	ld a,[$FFB8]
+	ld a,[H_LOADEDROMBANK]
 	ld [$CC58],a
 
 	; trigger the next script
@@ -40422,7 +40532,7 @@
 Func_1ea8a: ; 1ea8a (7:6a8a)
 	ld hl, $d79c
 	ld a, $10
-	jp Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	jp Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 
 ; known jump sources: 1ea55 (7:6a55)
 Func_1ea92: ; 1ea92 (7:6a92)
@@ -40456,7 +40566,7 @@
 	ld b, $2
 	ld hl, $d79a
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	ld a, c
 	and a
 	ret nz
@@ -40777,8 +40887,8 @@
 	set 6, [hl]
 	xor a
 	ld [$ccd3], a
-	inc a
-	ld [$d0b6], a
+	inc a               ; MONSTER_NAME
+	ld [W_LISTTYPE], a
 	call LoadHpBarAndStatusTilePatterns
 	ld a, [W_LISTSCROLLOFFSET] ; $cc36
 	push af
@@ -41015,8 +41125,8 @@
 	xor a
 	ld [$cf93], a
 	ld [W_LISTMENUID], a ; $cf94
-	inc a
-	ld [$d0b6], a
+	inc a                ; MONSTER_NAME
+	ld [W_LISTTYPE], a
 	ld a, [$cc2b]
 	ld [W_CURMENUITEMID], a ; $cc26
 	call DisplayListMenuID
@@ -43000,14 +43110,14 @@
 Func_27d6b: ; 27d6b (9:7d6b)
 	call Load16BitRegisters
 	push hl
-	call GetBaseStats
+	call GetMonHeader
 	pop hl
 	push hl
-	ld a, [$d0be]
+	ld a, [W_MONHTYPE1]
 	call Func_27d89
-	ld a, [$d0be]
+	ld a, [W_MONHTYPE1]
 	ld b, a
-	ld a, [$d0bf]
+	ld a, [W_MONHTYPE2]
 	cp b
 	pop hl
 	jr z, asm_27d8c
@@ -43616,84 +43726,138 @@
 ; 0x2fe3b + 5 bytes
 
 ; known jump sources: 3eca5 (f:6ca5), 3f11b (f:711b), 70362 (1c:4362)
-Func_2fe40: ; 2fe40 (b:7e40)
-	ld de, $a203
-	ld hl, $a187
-	call Func_2fe7d
-	call Func_2fe55
-	ld de, $a38b
-	ld hl, $a30f
-	call Func_2fe7d
+; scales both uncompressed sprite chunks by two in every dimension (creating 2x2 output pixels per input pixel)
+; assumes that input sprite chunks are 4x4 tiles, and the rightmost and bottommost 4 pixels will be ignored
+; resulting in a 7*7 tile output sprite chunk
+ScaleSpriteByTwo: ; 2fe40 (b:7e40)
+	ld de, S_SPRITEBUFFER1 + (4*4*8) - 5          ; last byte of input data, last 4 rows already skipped
+	ld hl, S_SPRITEBUFFER0 + SPRITEBUFFERSIZE - 1 ; end of destination buffer
+	call ScaleLastSpriteColumnByTwo               ; last tile column is special case
+	call ScaleFirstThreeSpriteColumnsByTwo        ; scale first 3 tile columns
+	ld de, S_SPRITEBUFFER2 + (4*4*8) - 5          ; last byte of input data, last 4 rows already skipped
+	ld hl, S_SPRITEBUFFER1 + SPRITEBUFFERSIZE - 1 ; end of destination buffer
+	call ScaleLastSpriteColumnByTwo               ; last tile column is special case
 
 ; known jump sources: 2fe49 (b:7e49)
-Func_2fe55: ; 2fe55 (b:7e55)
-	ld b, $3
-.asm_2fe57
-	ld c, $1c
-.asm_2fe59
+ScaleFirstThreeSpriteColumnsByTwo: ; 2fe55 (b:7e55)
+	ld b, $3 ; 3 tile columns
+.columnLoop
+	ld c, 4*8 - 4 ; $1c, 4 tiles minus 4 unused rows
+.columnInnerLoop
 	push bc
 	ld a, [de]
-	ld bc, H_VBCOPYDEST ; $ffc9
-	call Func_2fe97
+	ld bc, -(7*8)+1       ; $ffc9, scale lower nybble and seek to previous output column
+	call ScalePixelsByTwo
 	ld a, [de]
 	dec de
 	swap a
-	ld bc, $37
-	call Func_2fe97
+	ld bc, 7*8+1-2        ; $37, scale upper nybble and seek back to current output column and to the next 2 rows
+	call ScalePixelsByTwo
 	pop bc
 	dec c
-	jr nz, .asm_2fe59
+	jr nz, .columnInnerLoop
 	dec de
 	dec de
 	dec de
 	dec de
 	ld a, b
-	ld bc, $ffc8
+	ld bc, -7*8 ; $ffc8, skip one output column (which has already been written along with the current one)
 	add hl, bc
 	ld b, a
 	dec b
-	jr nz, .asm_2fe57
+	jr nz, .columnLoop
 	ret
 
 ; known jump sources: 2fe46 (b:7e46), 2fe52 (b:7e52)
-Func_2fe7d: ; 2fe7d (b:7e7d)
-	ld a, $1c
-	ld [H_DOWNARROWBLINKCNT1], a ; $FF00+$8b
-	ld bc, rIE ; $ffff
-.asm_2fe84
+ScaleLastSpriteColumnByTwo: ; 2fe7d (b:7e7d)
+	ld a, 4*8 - 4 ; $1c, 4 tiles minus 4 unused rows
+	ld [H_SPRITEINTERLACECOUNTER], a ; $FF00+$8b
+	ld bc, -1 ; $ffff
+.columnInnerLoop
 	ld a, [de]
 	dec de
-	swap a
-	call Func_2fe97
-	ld a, [H_DOWNARROWBLINKCNT1] ; $FF00+$8b
+	swap a                    ; only high nybble contains information
+	call ScalePixelsByTwo
+	ld a, [H_SPRITEINTERLACECOUNTER] ; $FF00+$8b
 	dec a
-	ld [H_DOWNARROWBLINKCNT1], a ; $FF00+$8b
-	jr nz, .asm_2fe84
+	ld [H_SPRITEINTERLACECOUNTER], a ; $FF00+$8b
+	jr nz, .columnInnerLoop
+	dec de                    ; skip last 4 rows of new column
 	dec de
 	dec de
 	dec de
-	dec de
 	ret
 
 ; known jump sources: 2fe5e (b:7e5e), 2fe68 (b:7e68), 2fe88 (b:7e88)
-Func_2fe97: ; 2fe97 (b:7e97)
+; scales the given 4 bits in a (4x1 pixels) to 2 output bytes (8x2 pixels)
+; hl: destination pointer
+; bc: destination pointer offset (added after the two bytes have been written)
+ScalePixelsByTwo: ; 2fe97 (b:7e97)
 	push hl
 	and $f
-	ld hl, $7ea8
+	ld hl, DuplicateBitsTable
 	add l
 	ld l, a
-	jr nc, .asm_2fea2
+	jr nc, .noCarry
 	inc h
-.asm_2fea2
+.noCarry
 	ld a, [hl]
 	pop hl
-	ld [hld], a
+	ld [hld], a  ; write output byte twice to make it 2 pixels high
 	ld [hl], a
-	add hl, bc
+	add hl, bc   ; add offset
 	ret
 
-INCBIN "baserom.gbc",$2fea8,$2ff04 - $2fea8
+; repeats each input bit twice
+DuplicateBitsTable: ; 0x2fea8
+db $00, $03, $0c, $0f
+db $30, $33, $3c, $3f
+db $c0, $c3, $cc, $cf
+db $f0, $f3, $fc, $ff
 
+; no known jump sources
+Func_2feb8 ; 0x2feb8
+	xor a
+	ld hl, $cd6d
+	ld [hli], a
+	ld a, [$ff00+$f3]
+	and a
+	ld a, [$d022]
+	jr z, .asm_2fec8 ; 0x2fec3 $3
+	ld a, [$cff3]
+.asm_2fec8
+	add a
+	ld [$ff00+$98], a
+	xor a
+	ld [$ff00+$95], a
+	ld [$ff00+$96], a
+	ld [$ff00+$97], a
+	ld a, $64
+	ld [$ff00+$99], a
+	ld b, $4
+	call Divide
+	ld a, [$ff00+$98]
+	ld [hli], a
+	ld a, [$ff00+$99]
+	ld [$ff00+$98], a
+	ld a, $a
+	ld [$ff00+$99], a
+	ld b, $4
+	call Divide
+	ld a, [$ff00+$98]
+	swap a
+	ld b, a
+	ld a, [$ff00+$99]
+	add b
+	ld [hl], a
+	ld de, $cce7
+	ld c, $3
+	ld a, $b
+	call Predef
+	ld hl, $7f04
+	jp PrintText
+; 0x2ff04
+
 UnnamedText_2ff04: ; 0x2ff04
 	TX_FAR _UnnamedText_2ff04
 	db $50
@@ -50897,8 +51061,8 @@
 	ld [$d0b5], a
 	ld a, $2c
 	ld [$d0b7], a
-	ld a, $2
-	ld [$d0b6], a
+	ld a, MOVE_NAME
+	ld [W_LISTTYPE], a
 	call GetName
 	ld hl, $cd6d
 .asm_39ba7
@@ -50970,9 +51134,9 @@
 .asm_39c10
 	ld hl, $cf7b
 	ld de, $472b
-	ld a, $4
+	ld a, ITEM_NAME
 .asm_39c18
-	ld [$d0b6], a
+	ld [W_LISTTYPE], a
 	ld a, l
 	ld [$cf8b], a
 	ld a, h
@@ -52798,8 +52962,8 @@
 	ld [$d0b5], a
 	ld [$cf98], a
 	ld [$ceea], a
-	ld a, $1
-	ld [$d0b6], a
+	ld a, MONSTER_NAME
+	ld [W_LISTTYPE], a
 	ld a, $e
 	ld [$d0b7], a
 	call GetName
@@ -52824,7 +52988,7 @@
 	ld hl, $43de
 	ld bc, $1c
 	call AddNTimes
-	ld de, $d0b8
+	ld de, W_MONHEADER
 	call CopyData
 	ld a, [$d0b5]
 	ld [$d0b8], a
@@ -52871,7 +53035,7 @@
 	call Func_3af5b
 	pop hl
 	ld a, $42
-	call Predef ; indirect jump to Func_5db5e (5db5e (17:5b5e))
+	call Predef ; indirect jump to SetPartyMonTypes (5db5e (17:5b5e))
 	ld a, [W_ISINBATTLE] ; $d057
 	and a
 	call z, Func_3af52
@@ -53167,7 +53331,7 @@
 ; known jump sources: 3ad19 (e:6d19), 3ad47 (e:6d47), 3aec4 (e:6ec4), 3aecb (e:6ecb)
 Func_3b057: ; 3b057 (e:7057)
 	ld a, $10
-	jp Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	jp Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 ; 3b05c (e:705c)
 EvosMovesPointerTable: ; 705C
 	dw Mon112_EvosMoves
@@ -55912,11 +56076,11 @@
 	push bc
 	ld hl, $d058
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	ld hl, $ccf5
 	pop bc
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	call Func_3cba6
 	call Func_3725
 	call Func_3cc91
@@ -56669,7 +56833,7 @@
 	ld hl, $d058
 	ld b, $0
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	ld hl, W_ENEMYBATTSTATUS1 ; $d067
 	res 2, [hl]
 	ld a, [$d083]
@@ -56769,11 +56933,11 @@
 	ld b, $1
 	push bc
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	pop bc
 	ld hl, $ccf5
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	call Func_3cba6
 	call GBPalWhiteOut
 	call Func_3ee5b
@@ -57295,7 +57459,7 @@
 	call CopyData
 	ld a, [$cfd9]
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld hl, W_PARTYMON1NAME ; $d2b5
 	ld a, [W_PLAYERMONNUMBER] ; $cc2f
 	call Func_3a7d
@@ -57339,11 +57503,11 @@
 	call CopyData
 	ld a, [$cfe5]
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld hl, $d9ee
 	ld a, [W_WHICHPOKEMON] ; $cf92
 	call Func_3a7d
-	ld de, $cfda
+	ld de, W_ENEMYMONNAME
 	ld bc, $b
 	call CopyData
 	ld hl, W_ENEMYMONLEVEL ; $cff3
@@ -57351,7 +57515,7 @@
 	ld bc, $b
 	call CopyData
 	call Func_3ed1e
-	ld hl, $d0b9
+	ld hl, W_MONHBASESTATS
 	ld de, $d002
 	ld b, $5
 .asm_3cc79
@@ -57386,7 +57550,7 @@
 Func_3cca4: ; 3cca4 (f:4ca4)
 	call Func_3cd60
 	ld a, $4
-	call Predef ; indirect jump to Func_3f103 (3f103 (f:7103))
+	call Predef ; indirect jump to LoadMonBackSprite (3f103 (f:7103))
 	xor a
 	ld [$FF00+$e1], a
 	ld hl, $cc2d
@@ -57549,7 +57713,7 @@
 	ld hl, Func_3a919
 	ld b, BANK(Func_3a919)
 	call Bankswitch ; indirect jump to Func_3a919 (3a919 (e:6919))
-	ld de, $cfda
+	ld de, W_ENEMYMONNAME
 	ld hl, $c3a1
 	call Func_3ce9c
 	call PlaceString
@@ -58008,9 +58172,9 @@
 	ld a, [$cfe5]
 	ld [$cf91], a
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld de, $9000
-	call Func_1665
+	call LoadMonFrontSprite
 	jr .asm_3d187
 .asm_3d182
 	ld b, $1e
@@ -58053,11 +58217,11 @@
 	push bc
 	ld hl, $d058
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	pop bc
 	ld hl, $ccf5
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	call Func_3cba6
 	call Func_3cc91
 	call Func_3719
@@ -58784,7 +58948,7 @@
 	ld a,[W_PLAYERMOVENUM]
 	call $6F07
 	call $6ED3
-	call $4D60
+	call Func_3cd60
 	ld a,[W_PLAYERBATTSTATUS2]
 	bit 4,a
 	ld hl,$5771
@@ -59969,7 +60133,7 @@
 	ld [W_CURENEMYLVL], a ; $d127
 	ld a, [$cfe5]
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld hl, $cff1
 	ld de, $cfaf
 	ld a, [hli]
@@ -60115,8 +60279,10 @@
 
 INCBIN "baserom.gbc",$3e01e,$3e023 - $3e01e
 
-; known jump sources: 3d6eb (f:56eb), 3e762 (f:6762)
-Func_3e023: ; 3e023 (f:6023)
+; determines if attack is a critical hit
+; azure heights claims "the fastest pokémon (who are,not coincidentally,
+; among the most popular) tend to CH about 20 to 25% of the time."
+CriticalHitTest: ; 3e023 (f:6023)
 	xor a
 	ld [$d05e], a
 	ld a, [H_WHOSETURN] ; $FF00+$f3
@@ -60126,22 +60292,18 @@
 	ld a, [$d014]
 .asm_3e032
 	ld [$d0b5], a
-	call GetBaseStats
-	ld a, [$d0bc]
+	call GetMonHeader
+	ld a, [W_MONHBASESPEED]
 	ld b, a
-	srl b
+	srl b                        ; (effective (base speed/2))
 	ld a, [H_WHOSETURN] ; $FF00+$f3
 	and a
 	ld hl, W_PLAYERMOVEPOWER ; $cfd4
 	ld de, W_PLAYERBATTSTATUS2 ; $d063
-	jr z, CriticalHitProbability
+	jr z, .calcCriticalHitProbability
 	ld hl, W_ENEMYMOVEPOWER ; $cfce
 	ld de, W_ENEMYBATTSTATUS2 ; $d068
-; 3e04f (f:604f)
-
-; azure heights claims "the fastest pokémon (who are,not coincidentally,
-; among the most popular) tend to CH about 20 to 25% of the time."
-CriticalHitProbability: ; 0x3e04f
+.calcCriticalHitProbability      ; 0x3e04f
 	ld a, [hld]                  ; read base power from RAM
 	and a
 	ret z                        ; do nothing if zero
@@ -60148,15 +60310,16 @@
 	dec hl
 	ld c, [hl]                   ; read move id
 	ld a, [de]
-	bit 2, a
-	jr nz, .asm_3e061
-	sla b
-	jr nc, .asm_3e063
-	ld b, $ff
-	jr .asm_3e063
-.asm_3e061
+	bit 2, a                     ; test for focus energy
+	jr nz, .focusEnergyUsed      ; bug: using focus energy causes a shift to the right instead of left,
+	                             ; resulting in 1/4 the usual crit chance
+	sla b                        ; (effective (base speed/2)*2)
+	jr nc, .noFocusEnergyUsed
+	ld b, $ff                    ; cap at 255/256
+	jr .noFocusEnergyUsed
+.focusEnergyUsed
 	srl b
-.asm_3e063
+.noFocusEnergyUsed
 	ld hl, HighCriticalMoves      ; table of high critical hit moves
 .Loop
 	ld a, [hli]                  ; read move from move table
@@ -60164,14 +60327,14 @@
 	jr z, .HighCritical          ; if so, the move about to be used is a high critical hit ratio move 
 	inc a                        ; move on to the next move, FF terminates loop
 	jr nz, .Loop                 ; check the next move in HighCriticalMoves
-	srl b                        ; /2 for regular move (effective 1/512?)
+	srl b                        ; /2 for regular move (effective (base speed / 2))
 	jr .SkipHighCritical         ; continue as a normal move
 .HighCritical
 	sla b                        ; *2 for high critical hit moves
-	jr nc, .asm_3e077
-	ld b, $ff                    ; set to FF (max) on overflow
-.asm_3e077
-	sla b                        ; *4 for high critical move (effective 1/64?)
+	jr nc, .noCarry
+	ld b, $ff                    ; cap at 255/256
+.noCarry
+	sla b                        ; *4 for high critical move (effective (base speed/2)*8))
 	jr nc, .SkipHighCritical
 	ld b, $ff
 .SkipHighCritical
@@ -60179,7 +60342,7 @@
 	rlc a
 	rlc a
 	rlc a
-	cp b                         ; check a against $ff
+	cp b                         ; check a against calculated crit rate
 	ret nc                       ; no critical hit if no borrow
 	ld a, $1
 	ld [$d05e], a                ; set critical hit flag
@@ -61223,8 +61386,8 @@
 	ld [$d0b5], a
 	ld a, $2c
 	ld [$d0b7], a
-	ld a, $2
-	ld [$d0b6], a
+	ld a, MOVE_NAME
+	ld [W_LISTTYPE], a
 	call GetName
 	ld de, $cd6d
 	call Func_3826
@@ -61248,7 +61411,7 @@
 	ld de, $1
 	call IsInArray
 	jp c, Func_3e77f
-	call Func_3e023
+	call CriticalHitTest
 	call HandleCounterMove
 	jr z, asm_3e782
 	call Func_3ec81
@@ -61719,7 +61882,7 @@
 	ld a, $2c
 	ld [$d0b7], a
 	ld a, $2
-	ld [$d0b6], a
+	ld [W_LISTTYPE], a
 	call GetName
 	ld de, $cd6d
 	jp Func_3826
@@ -61732,7 +61895,7 @@
 	ld a, [$cfd8]
 	ld [$cfe5], a
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld a, [W_ENEMYBATTSTATUS3] ; $d069
 	bit 3, a
 	ld hl, $cceb
@@ -61768,7 +61931,7 @@
 	jr nz, .asm_3eb86
 	ld a, [W_ENEMYMONMAXHP] ; $cff4
 	ld [hli], a
-	ld a, [$cff5]
+	ld a, [W_ENEMYMONMAXHP+1]
 	ld [hli], a
 	xor a
 	inc hl
@@ -61775,7 +61938,7 @@
 	ld [hl], a
 	jr .asm_3eb86
 .asm_3eb65
-	ld hl, W_WATERMONS ; $d8a5 (aliases: W_ENEMYMON1HP)
+	ld hl, W_ENEMYMON1HP ; $d8a5 (aliases: W_WATERMONS)
 	ld a, [W_WHICHPOKEMON] ; $cf92
 	ld bc, $2c
 	call AddNTimes
@@ -61790,15 +61953,15 @@
 	ld [W_ENEMYMONSTATUS], a ; $cfe9
 	jr .asm_3eb86
 .asm_3eb86
-	ld hl, $d0be
-	ld de, W_ENEMYMONTYPE1 ; $cfea (aliases: W_ENEMYMONTYPES)
-	ld a, [hli]
+	ld hl, W_MONHTYPES
+	ld de, W_ENEMYMONTYPES ; $cfea
+	ld a, [hli]            ; copy type 1
 	ld [de], a
 	inc de
-	ld a, [hli]
+	ld a, [hli]            ; copy type 2
 	ld [de], a
 	inc de
-	ld a, [hli]
+	ld a, [hli]            ; copy catch rate
 	ld [de], a
 	inc de
 	ld a, [W_ISINBATTLE] ; $d057
@@ -61812,7 +61975,7 @@
 	call CopyData
 	jr .asm_3ebca
 .asm_3ebb0
-	ld hl, $d0c7
+	ld hl, W_MONHMOVES
 	ld a, [hli]
 	ld [de], a
 	inc de
@@ -61836,7 +61999,7 @@
 	ld de, $cffd
 	ld a, $5e
 	call Predef ; indirect jump to Func_f473 (f473 (3:7473))
-	ld hl, $d0b9
+	ld hl, W_MONHBASESTATS
 	ld de, $d002
 	ld b, $5
 .asm_3ebdd
@@ -61845,17 +62008,17 @@
 	inc de
 	dec b
 	jr nz, .asm_3ebdd
-	ld hl, $d0c0
+	ld hl, W_MONHCATCHRATE
 	ld a, [hli]
 	ld [de], a
 	inc de
-	ld a, [hl]
+	ld a, [hl]     ; base exp
 	ld [de], a
 	ld a, [$cfd8]
 	ld [$d11e], a
 	call GetMonName
 	ld hl, $cd6d
-	ld de, $cfda
+	ld de, W_ENEMYMONNAME
 	ld bc, $b
 	call CopyData
 	ld a, [$cfd8]
@@ -61868,7 +62031,7 @@
 	ld b, $1
 	ld hl, W_SEENPOKEMON ; $d30a
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	ld hl, W_ENEMYMONLEVEL ; $cff3
 	ld de, $cd23
 	ld bc, $b
@@ -61943,9 +62106,9 @@
 	ld de, $7e9a
 .asm_3ec9e
 	ld a, $c
-	call Func_36eb
+	call UncompressSpriteFromDE
 	ld a, $3
-	call Predef ; indirect jump to Func_2fe40 (2fe40 (b:7e40))
+	call Predef ; indirect jump to ScaleSpriteByTwo (2fe40 (b:7e40))
 	ld hl, $c300
 	xor a
 	ld [H_DOWNARROWBLINKCNT1], a ; $FF00+$8b
@@ -61978,14 +62141,14 @@
 	dec b
 	jr nz, .asm_3ecb2
 	ld de, $9310
-	call Func_16ea
+	call InterlaceMergeSpriteBuffers
 	ld a, $a
 	ld [$0], a
 	xor a
 	ld [$4000], a
 	ld hl, $8000
-	ld de, $a188
-	ld a, [$FF00+$b8]
+	ld de, S_SPRITEBUFFER1
+	ld a, [H_LOADEDROMBANK]
 	ld b, a
 	ld c, $31
 	call CopyVideoData
@@ -62429,43 +62592,43 @@
 	call Func_3eb01
 	call Func_3ec32
 	ld a, [W_CUROPPONENT] ; $d059
-	cp $91
-	jr z, .asm_3efa2
+	cp MAROWAK
+	jr z, .isGhost
 	call Function583A
-	jr nz, .asm_3efd7
-.asm_3efa2
-	ld hl, $d0c2
+	jr nz, .isNoGhost
+.isGhost
+	ld hl, W_MONHSPRITEDIM
 	ld a, $66
-	ld [hli], a
+	ld [hli], a   ; write sprite dimensions
 	ld bc, $66b5
 	ld a, c
-	ld [hli], a
+	ld [hli], a   ; write  front sprite pointer
 	ld [hl], b
-	ld hl, $cfda
-	ld a, $86
+	ld hl, W_ENEMYMONNAME  ; set name to "GHOST"
+	ld a, "G"
 	ld [hli], a
-	ld a, $87
+	ld a, "H"
 	ld [hli], a
-	ld a, $8e
+	ld a, "O"
 	ld [hli], a
-	ld a, $92
+	ld a, "S"
 	ld [hli], a
-	ld a, $93
+	ld a, "T"
 	ld [hli], a
 	ld [hl], $50
 	ld a, [$cf91]
 	push af
-	ld a, $b8
+	ld a, MON_GHOST
 	ld [$cf91], a
 	ld de, $9000
-	call Func_1665
+	call LoadMonFrontSprite ; load ghost sprite
 	pop af
 	ld [$cf91], a
-	jr .asm_3efdd
-.asm_3efd7
+	jr .spriteLoaded
+.isNoGhost
 	ld de, $9000
-	call Func_1665
-.asm_3efdd
+	call LoadMonFrontSprite ; load mon sprite
+.spriteLoaded
 	xor a
 	ld [W_TRAINERCLASS], a ; $d031
 	ld [$FF00+$e1], a
@@ -62480,7 +62643,7 @@
 	call Func_3c04c
 	xor a
 	ld [H_AUTOBGTRANSFERENABLED], a ; $FF00+$ba
-	ld hl, $704a
+	ld hl, Unknown_3f04a
 	call PrintText
 	call Func_3719
 	call ClearScreen
@@ -62515,7 +62678,8 @@
 	scf
 	ret
 
-INCBIN "baserom.gbc",$3f04a,$3f04b - $3f04a
+Unknown_3f04a:
+	db $50
 
 ; known jump sources: 396e1 (e:56e1), 3ef69 (f:6f69)
 Func_3f04b: ; 3f04b (f:704b)
@@ -62529,11 +62693,11 @@
 	jr z, .asm_3f05d
 	ld a, $4
 .asm_3f05d
-	call Func_36eb
+	call UncompressSpriteFromDE
 	ld de, $9000
 	ld a, $77
 	ld c, a
-	jp Func_1672
+	jp LoadUncompressedSpriteData
 
 INCBIN "baserom.gbc",$3f069,$3f073 - $3f069
 
@@ -62591,7 +62755,7 @@
 	ld bc, $707
 	ld de, $14
 	push af
-	ld a, [$d0aa]
+	ld a, [W_SPRITEFLIPPED]
 	and a
 	jr nz, .asm_3f0ed
 	pop af
@@ -62634,7 +62798,9 @@
 	ret
 
 ; known jump sources: 3cca9 (f:4ca9), 702a8 (1c:42a8), 797c2 (1e:57c2)
-Func_3f103: ; 3f103 (f:7103)
+; loads back sprite of mon to $8000
+; assumes the corresponding mon header is already loaded
+LoadMonBackSprite: ; 3f103 (f:7103)
 	ld a, [$cfd9]
 	ld [$cf91], a
 	ld hl, $c405
@@ -62641,16 +62807,16 @@
 	ld b, $7
 	ld c, $8
 	call ClearScreenArea
-	ld hl, $d
-	call Unknown_1627
+	ld hl,  W_MONHBACKSPRITE - W_MONHEADER
+	call UncompressMonSprite
 	ld a, $3
-	call Predef ; indirect jump to Func_2fe40 (2fe40 (b:7e40))
+	call Predef ; indirect jump to ScaleSpriteByTwo (2fe40 (b:7e40))
 	ld de, $9310
-	call Func_16ea
+	call InterlaceMergeSpriteBuffers ; combine the two buffers to a single 2bpp sprite
 	ld hl, $8000
 	ld de, $9310
-	ld c, $31
-	ld a, [$FF00+$b8]
+	ld c, (2*SPRITEBUFFERSIZE)/16 ; count of 16-byte chunks to be copied
+	ld a, [H_LOADEDROMBANK]
 	ld b, a
 	jp CopyVideoData
 
@@ -66721,7 +66887,7 @@
 	ld a, [H_AUTOBGTRANSFERENABLED] ; $FF00+$ba
 	xor $1
 	ld [H_AUTOBGTRANSFERENABLED], a ; $FF00+$ba
-	call GetBaseStats
+	call GetMonHeader
 	ld hl, $c3cf
 	call Func_1384
 	ld c, $a
@@ -75775,7 +75941,7 @@
 	ld hl, W_OWNEDPOKEMON ; $d2f7
 	ld b, $1
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	pop af
 	ld [$d11e], a
 	call GetMonName
@@ -75854,23 +76020,24 @@
 PredefPointers: ; 7E79
 ; these are pointers to ASM routines.
 ; they appear to be used in overworld map scripts.
-	dbw $0F,$4D60
-	dbw $0F,$70C6
-	dbw $0F,$7073
-	dbw $0B,$7E40
-	dbw $0F,$7103
-	dbw $1E,$5ABA
+	dbw BANK(Func_3cd60),Func_3cd60
+	dbw BANK(Func_3f0c6),Func_3f0c6
+	dbw BANK(Func_3f073),Func_3f073
+	dbw BANK(ScaleSpriteByTwo), ScaleSpriteByTwo
+	db BANK(LoadMonBackSprite) ; dbw macro gives an error for some reason
+	dw LoadMonBackSprite
+	dbw BANK(Func_79aba),Func_79aba
 	dbw $03,$7132
 HealPartyPredef:
 	dbw BANK(HealParty),HealParty
 MoveAnimationPredef:
 	dbw BANK(MoveAnimation),MoveAnimation; 08 play move animation
-	dbw $03,$771E
-	dbw $03,$771E
+	dbw BANK(Func_f71e),Func_f71e
+	dbw BANK(Func_f71e),Func_f71e
 	dbw $03,$781D
 	dbw $03,$7836
-	dbw $03,$771E
-	dbw $03,$771E
+	dbw BANK(Func_f71e),Func_f71e
+	dbw BANK(Func_f71e),Func_f71e
 	dbw $03,$7850
 	dbw $03,$7666
 	dbw $03,$71D7
@@ -77423,7 +77590,7 @@
 	ld b, $2
 	ld hl, W_OBTAINEDBADGES ; $d356
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	ld a, c
 	and a
 	jr nz, .asm_5136e
@@ -77441,7 +77608,7 @@
 	ld b, $1
 	ld hl, $d7ed
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	ld a, $2
 	ld [$d667], a
 	ret
@@ -78876,11 +79043,11 @@
 	jr nz, .asm_0f7ee ; 0x51e33
 	ld hl, UnnamedText_51e46
 	call PrintText
-	jr .asm_27a32 ; 0x51e3b
+	jr .selectLowNybble2 ; 0x51e3b
 .asm_0f7ee ; 0x51e3d
 	ld hl, UnnamedText_51e4b
 	call PrintText
-.asm_27a32 ; 0x51e43
+.selectLowNybble2 ; 0x51e43
 	jp TextScriptEnd
 
 UnnamedText_51e46: ; 0x51e46
@@ -80767,7 +80934,7 @@
 	ld c, a
 	ld b, $2
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	ld a, c
 	and a
 	pop hl
@@ -80863,11 +81030,11 @@
 	add hl, bc
 	ld a, [hl]
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld d, $64
-	ld hl, Func_58f6a
-	ld b, BANK(Func_58f6a)
-	call Bankswitch ; indirect jump to Func_58f6a (58f6a (16:4f6a))
+	ld hl, CalcExperience
+	ld b, BANK(CalcExperience)
+	call Bankswitch ; indirect jump to CalcExperience (58f6a (16:4f6a))
 	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
 	ld b, a
 	ld a, [$FF00+$97]
@@ -80921,7 +81088,7 @@
 	ld a, [hl]
 	ld [$d0b5], a
 	ld [$d11e], a
-	call GetBaseStats
+	call GetMonHeader
 	ld bc, $23
 	add hl, bc
 	push hl
@@ -81017,7 +81184,7 @@
 	ld c, a
 	ld b, $1
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	pop hl
 	pop af
 	ld [W_CURENEMYLVL], a ; $d127
@@ -81044,13 +81211,13 @@
 	ld b, $1
 	push bc
 	ld a, $10
-	call Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	call Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 	ld hl, $ccf5
 	xor a
 	ld [hl], a
 	pop bc
 	ld a, $10
-	jp Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	jp Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 
 ; known jump sources: 55255 (15:5255)
 Func_5546c: ; 5546c (15:546c)
@@ -85153,11 +85320,11 @@
 Func_58f43: ; 58f43 (16:4f43)
 	ld a, [$cf98]
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld d, $1
 .asm_58f4e
 	inc d
-	call Func_58f6a
+	call CalcExperience
 	push hl
 	ld hl, $cfa8
 	ld a, [$FF00+$98]
@@ -85178,122 +85345,184 @@
 	ret
 
 ; known jump sources: de9a (3:5e9a), e88c (3:688c), f431 (3:7431), 12c94 (4:6c94), 55312 (15:5312), 58f4f (16:4f4f)
-Func_58f6a: ; 58f6a (16:4f6a)
-	ld a, [$d0cb]
+; calculates the amount of experience needed for level d
+CalcExperience: ; 58f6a (16:4f6a)
+	ld a, [W_MONHGROWTHRATE]
 	add a
 	add a
 	ld c, a
 	ld b, $0
-	ld hl, $501d
+	ld hl, GrowthRateTable
 	add hl, bc
-	call Func_59010
+	call CalcDSquared
 	ld a, d
-	ld [H_REMAINDER], a ; $FF00+$99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+	ld [H_MULTIPLIER], a ; $FF00+$99
 	call Multiply
 	ld a, [hl]
 	and $f0
 	swap a
-	ld [H_REMAINDER], a ; $FF00+$99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+	ld [H_MULTIPLIER], a ; $FF00+$99
 	call Multiply
 	ld a, [hli]
 	and $f
-	ld [H_REMAINDER], a ; $FF00+$99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+	ld [H_DIVISOR], a ; $FF00+$99
 	ld b, $4
 	call Divide
-	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
+	ld a, [H_MULTIPLICAND] ; $FF00+$96 (aliases: H_NUMTOPRINT)
 	push af
-	ld a, [$FF00+$97]
+	ld a, [H_MULTIPLICAND+1]
 	push af
-	ld a, [$FF00+$98]
+	ld a, [H_MULTIPLICAND+2]
 	push af
-	call Func_59010
+	call CalcDSquared
 	ld a, [hl]
 	and $7f
-	ld [H_REMAINDER], a ; $FF00+$99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+	ld [H_MULTIPLIER], a ; $FF00+$99
 	call Multiply
-	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
+	ld a, [H_MULTIPLICAND] ; $FF00+$96 (aliases: H_NUMTOPRINT)
 	push af
-	ld a, [$FF00+$97]
+	ld a, [H_MULTIPLICAND+1]
 	push af
-	ld a, [$FF00+$98]
+	ld a, [H_MULTIPLICAND+2]
 	push af
 	ld a, [hli]
 	push af
 	xor a
-	ld [H_NUMTOPRINT], a ; $FF00+$96 (aliases: H_MULTIPLICAND)
-	ld [$FF00+$97], a
+	ld [H_MULTIPLICAND], a ; $FF00+$96
+	ld [H_MULTIPLICAND+1], a
 	ld a, d
-	ld [$FF00+$98], a
+	ld [H_MULTIPLICAND+2], a
 	ld a, [hli]
-	ld [H_REMAINDER], a ; $FF00+$99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+	ld [H_MULTIPLIER], a
 	call Multiply
 	ld b, [hl]
-	ld a, [$FF00+$98]
+	ld a, [H_MULTIPLICAND+2]
 	sub b
-	ld [$FF00+$98], a
+	ld [H_MULTIPLICAND+2], a
 	ld b, $0
-	ld a, [$FF00+$97]
+	ld a, [H_MULTIPLICAND+1]
 	sbc b
-	ld [$FF00+$97], a
-	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
+	ld [H_MULTIPLICAND+1], a
+	ld a, [H_MULTIPLICAND] ; $FF00+$96
 	sbc b
-	ld [H_NUMTOPRINT], a ; $FF00+$96 (aliases: H_MULTIPLICAND)
+	ld [H_MULTIPLICAND], a ; $FF00+$96
 	pop af
 	and $80
-	jr nz, .asm_58feb
+	jr nz, .subtractSquaredTerm ; check sign
 	pop bc
-	ld a, [$FF00+$98]
+	ld a, [H_MULTIPLICAND+2]
 	add b
-	ld [$FF00+$98], a
+	ld [H_MULTIPLICAND+2], a
 	pop bc
-	ld a, [$FF00+$97]
+	ld a, [H_MULTIPLICAND+1]
 	adc b
-	ld [$FF00+$97], a
+	ld [H_MULTIPLICAND+1], a
 	pop bc
-	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
+	ld a, [H_MULTIPLICAND]
 	adc b
-	ld [H_NUMTOPRINT], a ; $FF00+$96 (aliases: H_MULTIPLICAND)
-	jr .asm_58ffd
-.asm_58feb
+	ld [H_MULTIPLICAND], a
+	jr .addCubedTerm
+.subtractSquaredTerm
 	pop bc
-	ld a, [$FF00+$98]
+	ld a, [H_MULTIPLICAND+2]
 	sub b
-	ld [$FF00+$98], a
+	ld [H_MULTIPLICAND+2], a
 	pop bc
-	ld a, [$FF00+$97]
+	ld a, [H_MULTIPLICAND+1]
 	sbc b
-	ld [$FF00+$97], a
+	ld [H_MULTIPLICAND+1], a
 	pop bc
-	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
+	ld a, [H_MULTIPLICAND]
 	sbc b
-	ld [H_NUMTOPRINT], a ; $FF00+$96 (aliases: H_MULTIPLICAND)
-.asm_58ffd
+	ld [H_MULTIPLICAND], a
+.addCubedTerm
 	pop bc
-	ld a, [$FF00+$98]
+	ld a, [H_MULTIPLICAND+2]
 	add b
-	ld [$FF00+$98], a
+	ld [H_MULTIPLICAND+2], a
 	pop bc
-	ld a, [$FF00+$97]
+	ld a, [H_MULTIPLICAND+1]
 	adc b
-	ld [$FF00+$97], a
+	ld [H_MULTIPLICAND+1], a
 	pop bc
-	ld a, [H_NUMTOPRINT] ; $FF00+$96 (aliases: H_MULTIPLICAND)
+	ld a, [H_MULTIPLICAND]
 	adc b
-	ld [H_NUMTOPRINT], a ; $FF00+$96 (aliases: H_MULTIPLICAND)
+	ld [H_MULTIPLICAND], a
 	ret
 
 ; known jump sources: 58f76 (16:4f76), 58f9c (16:4f9c)
-Func_59010: ; 59010 (16:5010)
+; calculates d*d
+CalcDSquared: ; 59010 (16:5010)
 	xor a
-	ld [H_NUMTOPRINT], a ; $FF00+$96 (aliases: H_MULTIPLICAND)
-	ld [$FF00+$97], a
+	ld [H_MULTIPLICAND], a ; $FF00+$96 (aliases: H_NUMTOPRINT)
+	ld [H_MULTIPLICAND+1], a
 	ld a, d
-	ld [$FF00+$98], a
-	ld [H_REMAINDER], a ; $FF00+$99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+	ld [H_MULTIPLICAND+2], a
+	ld [H_MULTIPLIER], a ; $FF00+$99 (aliases: H_DIVISOR, H_REMAINDER, H_POWEROFTEN)
 	jp Multiply
 
-INCBIN "baserom.gbc",$5901d,$59091 - $5901d
+; each entry has the following scheme:
+; %AAAABBBB %SCCCCCCC %DDDDDDDD %EEEEEEEE
+; resulting in 
+;  (a*n^3)/b + sign*c*n^2 + d*n - e
+; where sign = -1 <=> S=1
+GrowthRateTable: ; 0x5901d
+db $11,$00,$00,$00 ; medium fast      n^3
+db $34,$0A,$00,$1E ; (unused?)    3/4 n^3 + 10 n^2         - 30
+db $34,$14,$00,$46 ; (unused?)    3/4 n^3 + 20 n^2         - 70
+db $65,$8F,$64,$8C ; medium slow: 6/5 n^3 - 15 n^2 + 100 n - 140
+db $45,$00,$00,$00 ; fast:        4/5 n^3
+db $54,$00,$00,$00 ; slow:        5/4 n^3
 
+; no known jump sources
+Func_59035 ; 0x59035
+	ld hl, $5091
+	call PrintText
+	call Func_35ec
+	ld a, [$cc26]
+	and a
+	jr nz, .asm_59086 ; 0x59042 $42
+	ld hl, $d2f7
+	ld b, $13
+	call CountSetBits
+	ld a, [$d11e]
+	ld [$ff00+$dd], a
+	ld b, a
+	ld a, [$ff00+$db]
+	cp b
+	jr z, .asm_59059 ; 0x59055 $2
+	jr nc, .asm_5907c ; 0x59057 $23
+.asm_59059
+	ld hl, $50a0
+	call PrintText
+	ld a, [$ff00+$dc]
+	ld b, a
+	ld c, $1
+	call GiveItem
+	jr nc, .asm_59073 ; 0x59067 $a
+	ld hl, $50a5
+	call PrintText
+	ld a, $1
+	jr .asm_5908e ; 0x59071 $1b
+.asm_59073
+	ld hl, $50ab
+	call PrintText
+	xor a
+	jr .asm_5908e ; 0x5907a $12
+.asm_5907c
+	ld hl, $5096
+	call PrintText
+	ld a, $80
+	jr .asm_5908e ; 0x59084 $8
+.asm_59086
+	ld hl, $509b
+	call PrintText
+	ld a, $ff
+.asm_5908e
+	ld [$ff00+$db], a
+	ret
+; 0x59091
+
 UnnamedText_59091: ; 0x59091
 	TX_FAR _UnnamedText_59091
 	db $50
@@ -92073,18 +92302,19 @@
 	INCBIN "maps/victoryroad1.blk"
 
 ; known jump sources: 3aeaa (e:6eaa)
-Func_5db5e: ; 5db5e (17:5b5e)
+; updates the types of a party mon (pointed to in hl) to the ones of the mon specified in $d11e
+SetPartyMonTypes: ; 5db5e (17:5b5e)
 	call Load16BitRegisters
-	ld bc, $5
+	ld bc, W_PARTYMON1_TYPE1 - W_PARTYMON1DATA ; $5
 	add hl, bc
 	ld a, [$d11e]
 	ld [$d0b5], a
 	push hl
-	call GetBaseStats
+	call GetMonHeader
 	pop hl
-	ld a, [$d0be]
+	ld a, [W_MONHTYPE1]
 	ld [hli], a
-	ld a, [$d0bf]
+	ld a, [W_MONHTYPE2]
 	ld [hl], a
 	ret
 
@@ -92142,9 +92372,9 @@
 	call Func_2429
 	ld a, [$cf91]
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld de, $8b10
-	call Func_1665
+	call LoadMonFrontSprite
 	ld a, $80
 	ld [$FF00+$e1], a
 	ld hl, $c486
@@ -96458,7 +96688,7 @@
 	xor a
 	ld [$cfcb], a
 	ld [$FF00+$d7], a
-	ld [$d0aa], a
+	ld [W_SPRITEFLIPPED], a
 	ld [$d358], a
 	ld [$cd40], a
 	inc a
@@ -96550,10 +96780,10 @@
 	jr .asm_702ab
 .asm_7029d
 	ld hl, $c410
-	call GetBaseStats
+	call GetMonHeader
 	call Func_1389
 	ld a, $4
-	call Predef ; indirect jump to Func_3f103 (3f103 (f:7103))
+	call Predef ; indirect jump to LoadMonBackSprite (3f103 (f:7103))
 .asm_702ab
 	ld b, $b
 	ld c, $0
@@ -96622,20 +96852,20 @@
 Func_7033e: ; 7033e (1c:433e)
 	ld de, $6ede
 	ld a, $4
-	call Func_36eb
-	ld hl, $a188
+	call UncompressSpriteFromDE
+	ld hl, S_SPRITEBUFFER1
 	ld de, $a000
 	ld bc, $310
 	call CopyData
 	ld de, $9000
-	call Func_16ea
+	call InterlaceMergeSpriteBuffers
 	ld de, $7e0a
 	ld a, $c
-	call Func_36eb
+	call UncompressSpriteFromDE
 	ld a, $3
-	call Predef ; indirect jump to Func_2fe40 (2fe40 (b:7e40))
+	call Predef ; indirect jump to ScaleSpriteByTwo (2fe40 (b:7e40))
 	ld de, $9310
-	call Func_16ea
+	call InterlaceMergeSpriteBuffers
 	ld c, $1
 
 ; known jump sources: 702b8 (1c:42b8), 702ce (1c:42ce)
@@ -102756,7 +102986,7 @@
 	db $08 ; asm
 	ld a, [$d78e]
 	bit 0, a
-	jr nz, .asm_58feb ; 0x750c8
+	jr nz, .subtract ; 0x750c8
 	ld b,GOLD_TEETH
 	call $3493
 	jr nz, .asm_3f30f ; 0x750cf
@@ -102795,7 +103025,7 @@
 	ld hl, $d78e
 	set 0, [hl]
 	jr .asm_52039 ; 0x75122
-.asm_58feb ; 0x75124
+.subtract ; 0x75124
 	ld hl, HM04ExplanationText
 	call PrintText
 	jr .asm_52039 ; 0x7512a
@@ -103775,7 +104005,7 @@
 
 Unknown_757f1:
 	ld a, $10
-	jp Predef ; indirect jump to Func_f666 (f666 (3:7666))
+	jp Predef ; indirect jump to HandleBitArray (f666 (3:7666))
 ; 757f6 (1d:57f6)
 CinnabarGymScript2: ; 0x757f6
 	ld a, [$d057]
@@ -105641,7 +105871,7 @@
 	push af
 	xor a
 	ld [$FF00+$D7], a
-	ld [$D0AA], a
+	ld [W_SPRITEFLIPPED], a
 	ld [$CFCB], a
 	ld [$CD41], a
 	ld [$CD42], a
@@ -105725,7 +105955,7 @@
 	ld c, 0
 	call GoPAL_SET
 	ld hl, $C410
-	call GetBaseStats
+	call GetMonHeader
 	call $1389
 	call GBPalNormal
 	ld hl, $C4A4
@@ -107708,8 +107938,8 @@
 	ld [$cf91], a
 	ld [$d0b5], a
 	xor a
-	ld [$d0aa], a
-	call GetBaseStats
+	ld [W_SPRITEFLIPPED], a
+	call GetMonHeader
 	ld hl, $c3ac
 	call Func_1389
 	jr .asm_797d3
@@ -107719,9 +107949,9 @@
 	ld a, [$ceea]
 	ld [$cfd9], a
 	ld [$d0b5], a
-	call GetBaseStats
+	call GetMonHeader
 	ld a, $4
-	call Predef ; indirect jump to Func_3f103 (3f103 (f:7103))
+	call Predef ; indirect jump to LoadMonBackSprite (3f103 (f:7103))
 	xor a
 	call Func_79842
 	call Func_79820
@@ -108623,7 +108853,7 @@
 
 ; known jump sources: 7be27 (1e:7e27), 7be3f (1e:7e3f)
 Func_7beb9: ; 7beb9 (1e:7eb9)
-	call GetBaseStats
+	call GetMonHeader
 	ld hl, $c3cf
 	jp Func_1384
 asm_7bec2: ; 7bec2 (1e:7ec2)
@@ -113603,7 +113833,7 @@
 	db 1
 	dw $D04A
 	db 0," with-",$4F,"drew @",1
-	dw $CFDA
+	dw W_ENEMYMONNAME
 	db 0,"!",$58
 _AIBattleUseItemText:
 	db 1
@@ -113611,7 +113841,7 @@
 	db 0,$4F,"used @",1
 	dw $CD6D
 	db 0,$55,"on @",1
-	dw $CFDA
+	dw W_ENEMYMONNAME
 	db 0,"!",$58
 
 _UnnamedText_4160c: ; 0x880ef
@@ -114390,7 +114620,7 @@
 
 _UnnamedText_3c229: ; 0x89666
 	db $0, "Wild @"
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db $0, $4f
 	db "ran!", $58
 ; 0x89666 + 17 bytes = 0x89677
@@ -114397,7 +114627,7 @@
 
 _UnnamedText_3c22e: ; 0x89677
 	db $0, "Enemy @"
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db $0, $4f
 	db "ran!", $58
 ; 0x89677 + 18 bytes = 0x89689
@@ -114419,7 +114649,7 @@
 
 _UnnamedText_3c63e: ; 0x896c7
 	db $0, "Enemy @"
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db $0, $4f
 	db "fainted!", $58
 ; 0x896c7 + 22 bytes = 0x896dd
@@ -114473,7 +114703,7 @@
 	dw $D04A
 	db 0," is",$4F
 	db "about to use",$55,"@",1
-	dw $CFDA
+	dw W_ENEMYMONNAME
 	db 0,"!",$51
 	db "Will ",$52,$4F
 	db "change #MON?",$57
@@ -114483,7 +114713,7 @@
 	dw $D04A
 	db 0," sent",$4F
 	db "out @",1
-	dw $CFDA
+	dw W_ENEMYMONNAME
 	db 0,"!",$57
 
 _UnnamedText_3cab4: ; 0x897c9
@@ -114779,7 +115009,7 @@
 
 _UnnamedText_58e3b: ; 0x89c1d
 	db $0, "Wild @"
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db $0, $4f
 	db "appeared!", $58
 ; 0x89c1d + 22 bytes
@@ -114787,13 +115017,13 @@
 _UnnamedText_58e40: ; 0x89c33
 	db $0, "The hooked", $4f
 	db "@"
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db $0, $55
 	db "attacked!", $58
 ; 0x89c33 + 28 bytes
 
 _UnnamedText_58e45: ; 0x89c4f
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db $0, $4f
 	db "appeared!", $58
 ; 0x89c4f + 15 bytes
@@ -114862,7 +115092,7 @@
 
 SafariZoneEatingText: ; 0x89d53
 	db $0, "Wild @"
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db $0, $4f
 	db "is eating!", $58
 ; 0x89d53 + 23 bytes
@@ -114869,7 +115099,7 @@
 
 SafariZoneAngryText: ; 0x89d6a
 	db $0, "Wild @"
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db $0, $4f
 	db "is angry!", $58
 ; 0x89d6a + 22 bytes
@@ -125478,7 +125708,7 @@
 
 _ItemUseBallText05:
 	db 0,"All right!",$4F,"@",1
-	dw $CFDA
+	dw W_ENEMYMONNAME
 	db 0," was",$55
 	db "caught!@@"
 
@@ -125499,7 +125729,7 @@
 _ItemUseBallText06:
 	db 0,"New #DEX data",$4F
 	db "will be added for",$55,"@"
-	TX_RAM $cfda
+	TX_RAM W_ENEMYMONNAME
 	db 0,"!@@"
 
 _SurfingGotOnText: ; 0xa685e