diff options
author | PikalaxALT <PikalaxALT@gmail.com> | 2015-11-19 18:07:20 -0500 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2015-11-19 18:09:11 -0500 |
commit | 93a129eb6dc261faccaf2b2d58daf3db204ab3ba (patch) | |
tree | 9095a3735deb1608ce6e4a23dcea4a5f43b4be95 /engine/engine_flags.asm | |
parent | 8a6a1a7d77fdcd1f8468f0c411795a8f039d4bd8 (diff) |
main.asm is now under 30k lines
Diffstat (limited to 'engine/engine_flags.asm')
-rw-r--r-- | engine/engine_flags.asm | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/engine/engine_flags.asm b/engine/engine_flags.asm index 49a7d82e1..74113b4a5 100644 --- a/engine/engine_flags.asm +++ b/engine/engine_flags.asm @@ -1,3 +1,90 @@ +EngineFlagAction:: ; 80430 +; Do action b on engine flag de +; +; b = 0: reset flag +; = 1: set flag +; > 1: check flag, result in c +; +; Setting/resetting does not return a result. + + +; 16-bit flag ids are considered invalid, but it's nice +; to know that the infrastructure is there. + + ld a, d + cp 0 + jr z, .ceiling + jr c, .read ; cp 0 can't set carry! + jr .invalid + +; There are only $a2 engine flags, so +; anything beyond that is invalid too. + +.ceiling + ld a, e + cp NUM_ENGINE_FLAGS + jr c, .read + +; Invalid flags are treated as flag 00. + +.invalid + xor a + ld e, a + ld d, a + +; Get this flag's location. + +.read + ld hl, EngineFlags +; location +rept 2 + add hl, de +endr +; bit + add hl, de + +; location + ld e, [hl] + inc hl + ld d, [hl] + inc hl +; bit + ld c, [hl] + +; What are we doing with this flag? + + ld a, b + cp 1 + jr c, .reset ; b = 0 + jr z, .set ; b = 1 + +; Return the given flag in c. +.check + ld a, [de] + and c + ld c, a + ret + +; Set the given flag. +.set + ld a, [de] + or c + ld [de], a + ret + +; Reset the given flag. +.reset + ld a, c + cpl ; AND all bits except the one in question + ld c, a + ld a, [de] + and c + ld [de], a + ret +; 80462 + + +EngineFlags: ; 80462 ; All locations are in WRAM bank 1. engine_flag: MACRO dwb \1, 1 << \2 |