shithub: pokecrystal

Download patch

ref: 32b92ca51c73f1ad9be169bef476b9c93687e2a4
parent: 4e776d4fa6bb0510fa06416ad7a6dd9ffe0ff724
author: Rangi <remy.oukaour+rangi42@gmail.com>
date: Wed May 23 08:48:14 EDT 2018

Start improving sprite movement engine (to do: identify bit flags)
Introduce maskbits N[, S]: optionally shift the bitmask

--- a/constants/map_object_constants.asm
+++ b/constants/map_object_constants.asm
@@ -75,6 +75,16 @@
 	const MAPOBJECT_F ; unused
 OBJECT_LENGTH EQU const_value
 
+; SpriteMovementData struct members (see data/sprites/map_objects.asm)
+	const_def
+	const SPRITEMOVEATTR_MOVEMENT ; 0
+	const SPRITEMOVEATTR_FACING   ; 1
+	const SPRITEMOVEATTR_ACTION   ; 2
+	const SPRITEMOVEATTR_FLAGS1   ; 3
+	const SPRITEMOVEATTR_FLAGS2   ; 4
+	const SPRITEMOVEATTR_PALFLAGS ; 5
+NUM_SPRITEMOVEDATA_FIELDS EQU const_value
+
 MAPOBJECT_SCREEN_HEIGHT EQU 11
 MAPOBJECT_SCREEN_WIDTH EQU 12
 
@@ -119,7 +129,6 @@
 	const SPRITEMOVEDATA_GRASS                ; 23
 	const SPRITEMOVEDATA_SWIM_WANDER          ; 24
 NUM_SPRITEMOVEDATA EQU const_value
-SPRITEMOVEDATA_FIELDS EQU 6
 
 ; MapObjectMovementPattern.Pointers indexes (see engine/overworld/map_objects.asm)
 	const_def
--- a/data/sprites/map_objects.asm
+++ b/data/sprites/map_objects.asm
@@ -5,304 +5,304 @@
 	db SPRITEMOVEFN_00 ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STILL
 	db SPRITEMOVEFN_STANDING ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00001100 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 2 | 1 << 3 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_WANDER
 	db SPRITEMOVEFN_RANDOM_WALK_XY ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SPINRANDOM_SLOW
 	db SPRITEMOVEFN_SLOW_RANDOM_SPIN ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_WALK_UP_DOWN
 	db SPRITEMOVEFN_RANDOM_WALK_Y ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_WALK_LEFT_RIGHT
 	db SPRITEMOVEFN_RANDOM_WALK_X ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STANDING_DOWN
 	db SPRITEMOVEFN_STANDING ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STANDING_UP
 	db SPRITEMOVEFN_STANDING ; movement function
 	db UP ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STANDING_LEFT
 	db SPRITEMOVEFN_STANDING ; movement function
 	db LEFT ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STANDING_RIGHT
 	db SPRITEMOVEFN_STANDING ; movement function
 	db RIGHT ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SPINRANDOM_FAST
 	db SPRITEMOVEFN_FAST_RANDOM_SPIN ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_PLAYER
 	db SPRITEMOVEFN_OBEY_DPAD ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_0C
 	db SPRITEMOVEFN_08 ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_0D
 	db SPRITEMOVEFN_09 ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_0E
 	db SPRITEMOVEFN_0A ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_0F
 	db SPRITEMOVEFN_0B ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_10
 	db SPRITEMOVEFN_0C ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_11
 	db SPRITEMOVEFN_0D ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_12
 	db SPRITEMOVEFN_0E ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_FOLLOWING
 	db SPRITEMOVEFN_FOLLOW ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SCRIPTED
 	db SPRITEMOVEFN_SCRIPTED ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_BIGDOLLSYM
 	db SPRITEMOVEFN_BIG_SNORLAX ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BIG_DOLL_SYM ; action
-	db %00101110 ; flags1
-	db %00000001 ; flags2
-	db %11000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 ; flags1
+	db 1 << 0 ; flags2
+	db 1 << 6 | 1 << 7 ; palette flags
 
 ; SPRITEMOVEDATA_POKEMON
 	db SPRITEMOVEFN_BOUNCE ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BOUNCE ; action
-	db %00101110 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SUDOWOODO
 	db SPRITEMOVEFN_STANDING ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00001100 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 2 | 1 << 3 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SMASHABLE_ROCK
 	db SPRITEMOVEFN_STANDING ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00101110 ; flags1
-	db %00010000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 ; flags1
+	db 1 << 4 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STRENGTH_BOULDER
 	db SPRITEMOVEFN_STRENGTH ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00101110 ; flags1
-	db %00000000 ; flags2
-	db %01000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 ; flags1
+	db 0 ; flags2
+	db 1 << 6 ; palette flags
 
 ; SPRITEMOVEDATA_FOLLOWNOTEXACT
 	db SPRITEMOVEFN_FOLLOWNOTEXACT ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SHADOW
 	db SPRITEMOVEFN_SHADOW ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_00 ; action
-	db %10001110 ; flags1
-	db %00000001 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 7 ; flags1
+	db 1 << 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_EMOTE
 	db SPRITEMOVEFN_EMOTE ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_EMOTE ; action
-	db %10001110 ; flags1
-	db %00000010 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 7 ; flags1
+	db 1 << 1 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SCREENSHAKE
 	db SPRITEMOVEFN_SCREENSHAKE ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_00 ; action
-	db %10000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 | 1 << 7 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SPINCOUNTERCLOCKWISE
 	db SPRITEMOVEFN_SPIN_COUNTERCLOCKWISE ; movement function
 	db LEFT ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SPINCLOCKWISE
 	db SPRITEMOVEFN_SPIN_CLOCKWISE ; movement function
 	db RIGHT ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_BIGDOLLASYM
 	db SPRITEMOVEFN_STRENGTH ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BIG_DOLL_ASYM ; action
-	db %00101110 ; flags1
-	db %00000001 ; flags2
-	db %11000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 ; flags1
+	db 1 << 0 ; flags2
+	db 1 << 6 | 1 << 7 ; palette flags
 
 ; SPRITEMOVEDATA_BIGDOLL
 	db SPRITEMOVEFN_STRENGTH ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BIG_DOLL ; action
-	db %00101110 ; flags1
-	db %00000001 ; flags2
-	db %11000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 ; flags1
+	db 1 << 0 ; flags2
+	db 1 << 6 | 1 << 7 ; palette flags
 
 ; SPRITEMOVEDATA_BOULDERDUST
 	db SPRITEMOVEFN_BOULDERDUST ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BOULDER_DUST ; action
-	db %10001110 ; flags1
-	db %00000001 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 7 ; flags1
+	db 1 << 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_GRASS
 	db SPRITEMOVEFN_GRASS ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_GRASS_SHAKE ; action
-	db %10001110 ; flags1
-	db %00000010 ; flags2
-	db %00000000 ; palette flags
+	db 1 << 1 | 1 << 2 | 1 << 3 | 1 << 7 ; flags1
+	db 1 << 1 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SWIM_WANDER
 	db SPRITEMOVEFN_RANDOM_WALK_XY ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00100000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 1 << 5 ; palette flags
 
 ; 25
 	db SPRITEMOVEFN_00 ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; 4357
--- a/engine/battle/ai/scoring.asm
+++ b/engine/battle/ai/scoring.asm
@@ -1055,7 +1055,7 @@
 	jr nz, .asm_38a91
 
 	ld a, [wPlayerSubStatus1]
-	and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
+	and 1 << SUBSTATUS_IN_LOVE | 1 << SUBSTATUS_ROLLOUT | 1 << SUBSTATUS_IDENTIFIED | 1 << SUBSTATUS_NIGHTMARE
 	jr nz, .asm_38a91
 
 ; Else, 50% chance to greatly encourage this move if it's the player's Pokemon first turn.
@@ -1847,7 +1847,7 @@
 ; 80% chance to greatly encourage this move if the player is either
 ; in love, identified, stuck in Rollout, or has a Nightmare.
 	ld a, [wPlayerSubStatus1]
-	and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
+	and 1 << SUBSTATUS_IN_LOVE | 1 << SUBSTATUS_ROLLOUT | 1 << SUBSTATUS_IDENTIFIED | 1 << SUBSTATUS_NIGHTMARE
 	jr nz, .asm_38e26
 
 ; Otherwise, discourage this move unless the player only has not very effective moves against the enemy.
--- a/engine/battle/effect_commands.asm
+++ b/engine/battle/effect_commands.asm
@@ -364,7 +364,7 @@
 	ld a, BATTLE_VARS_SUBSTATUS3
 	call GetBattleVarAddr
 	ld a, [hl]
-	and $ff ^ (1<<SUBSTATUS_BIDE + 1<<SUBSTATUS_RAMPAGE + 1<<SUBSTATUS_CHARGED)
+	and $ff ^ (1 << SUBSTATUS_BIDE | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_CHARGED)
 	ld [hl], a
 
 	call ResetFuryCutterCount
--- a/engine/pokemon/move_mon.asm
+++ b/engine/pokemon/move_mon.asm
@@ -1497,17 +1497,17 @@
 	jr z, .Special
 	cp STAT_SDEF
 	jr z, .Special
-; DV_HP = (DV_ATK & 1) << 3 + (DV_DEF & 1) << 2 + (DV_SPD & 1) << 1 + (DV_SPC & 1)
+; DV_HP = (DV_ATK & 1) << 3 | (DV_DEF & 1) << 2 | (DV_SPD & 1) << 1 | (DV_SPC & 1)
 	push bc
 	ld a, [hl]
 	swap a
-	and $1
+	and 1
 	add a
 	add a
 	add a
 	ld b, a
 	ld a, [hli]
-	and $1
+	and 1
 	add a
 	add a
 	add b
@@ -1514,12 +1514,12 @@
 	ld b, a
 	ld a, [hl]
 	swap a
-	and $1
+	and 1
 	add a
 	add b
 	ld b, a
 	ld a, [hl]
-	and $1
+	and 1
 	add b
 	pop bc
 	jr .GotDV
--- a/home/map_objects.asm
+++ b/home/map_objects.asm
@@ -482,10 +482,10 @@
 	xor a
 
 .ok
-	ld hl, SpriteMovementData
+	ld hl, SpriteMovementData + SPRITEMOVEATTR_MOVEMENT
 	ld e, a
 	ld d, 0
-rept SPRITEMOVEDATA_FIELDS
+rept NUM_SPRITEMOVEDATA_FIELDS
 	add hl, de
 endr
 	ld a, [hl]
@@ -497,8 +497,8 @@
 	push de
 	ld e, a
 	ld d, 0
-	ld hl, SpriteMovementData + 1 ; init facing
-rept SPRITEMOVEDATA_FIELDS
+	ld hl, SpriteMovementData + SPRITEMOVEATTR_FACING
+rept NUM_SPRITEMOVEDATA_FIELDS
 	add hl, de
 endr
 	ld a, BANK(SpriteMovementData)
@@ -505,7 +505,7 @@
 	call GetFarByte
 	add a
 	add a
-	and $c
+	maskbits NUM_DIRECTIONS, 2
 	pop de
 	pop bc
 	ret
@@ -537,8 +537,8 @@
 	push de
 	ld e, a
 	ld d, 0
-	ld hl, SpriteMovementData + 1 ; init facing
-rept SPRITEMOVEDATA_FIELDS
+	ld hl, SpriteMovementData + SPRITEMOVEATTR_FACING
+rept NUM_SPRITEMOVEDATA_FIELDS
 	add hl, de
 endr
 	ld b, h
@@ -549,7 +549,7 @@
 	inc bc
 	rlca
 	rlca
-	and %00001100
+	maskbits NUM_DIRECTIONS, 2
 	ld hl, OBJECT_FACING
 	add hl, de
 	ld [hl], a
@@ -654,7 +654,7 @@
 	and %11110011
 	ld e, a
 	pop af
-	and %00001100
+	maskbits NUM_DIRECTIONS, 2
 	or e
 	ld [hl], a
 	ret
@@ -664,6 +664,6 @@
 	ld hl, OBJECT_FACING
 	add hl, bc
 	ld a, [hl]
-	and %00001100
+	maskbits NUM_DIRECTIONS, 2
 	ret
 ; 1b0f
--- a/macros/code.asm
+++ b/macros/code.asm
@@ -36,8 +36,10 @@
 ENDM
 
 maskbits: MACRO
-; masks just enough bits to cover the argument
+; masks just enough bits to cover the first argument
+; the second argument is an optional shift amount
 ; e.g. "maskbits 26" becomes "and %00011111" (since 26 - 1 = %00011001)
+; and "maskbits 3, 2" becomes "and %00001100" (since "maskbits 3" becomes %00000011)
 ; example usage in rejection sampling:
 ; .loop
 ; 	call Random
@@ -50,7 +52,11 @@
 x = x << 1 | 1
 endc
 endr
+if _NARG == 2
+	and x << (\2)
+else
 	and x
+endc
 ENDM
 
 calc_sine_wave: MACRO
--- a/mobile/mobile_40.asm
+++ b/mobile/mobile_40.asm
@@ -83,7 +83,7 @@
 	call DoubleSpeed
 	xor a
 	ld [rIF], a
-	ld a, 1 << VBLANK + 1 << LCD_STAT + 1 << TIMER + 1 << SERIAL
+	ld a, 1 << VBLANK | 1 << LCD_STAT | 1 << TIMER | 1 << SERIAL
 	ld [rIE], a
 	xor a
 	ld [hMapAnims], a