diff options
author | mid-kid <esteve.varela@gmail.com> | 2018-03-25 19:14:26 +0200 |
---|---|---|
committer | mid-kid <esteve.varela@gmail.com> | 2018-03-25 19:14:26 +0200 |
commit | 05ba221eb53472d9c617d96a6aaed9c2e87e2ad7 (patch) | |
tree | c7064e3ef314a44531ed789c6594e81139d1dc75 /engine/smallflag.asm | |
parent | be76ee56a89e72c0b87a605321bb1670e86f8220 (diff) |
`flagpredef.asm` → `smallflag.asm`
Diffstat (limited to 'engine/smallflag.asm')
-rw-r--r-- | engine/smallflag.asm | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/engine/smallflag.asm b/engine/smallflag.asm new file mode 100644 index 000000000..2a6d91ee1 --- /dev/null +++ b/engine/smallflag.asm @@ -0,0 +1,70 @@ +SmallFarFlagAction: ; 4d7c1 +; Perform action b on bit c in flag array hl. +; If checking a flag, check flag array d:hl unless d is 0. + +; For longer flag arrays, see FlagAction. + + push hl + push bc + +; Divide by 8 to get the byte we want. + push bc + srl c + srl c + srl c + ld b, 0 + add hl, bc + pop bc + +; Which bit we want from the byte + ld a, c + and 7 + ld c, a + +; Shift left until we can mask the bit + ld a, 1 + jr z, .shifted +.shift + add a + dec c + jr nz, .shift +.shifted + ld c, a + +; What are we doing to this flag? + dec b + jr z, .set ; 1 + dec b + jr z, .check ; 2 + +.reset + ld a, c + cpl + and [hl] + ld [hl], a + jr .done + +.set + ld a, [hl] + or c + ld [hl], a + jr .done + +.check + ld a, d + cp 0 + jr nz, .farcheck + + ld a, [hl] + and c + jr .done + +.farcheck + call GetFarByte + and c + +.done + pop bc + pop hl + ld c, a + ret |