; 0x80 - 0x90 are used by dma routines
.org 0xFF90
+ ; 16-bit math temporary registers
+ ; store in LE
+m16_a: .adv 2
+m16_b: .adv 2
+ ; flags for 16 bit math
+m16_flags: .adv 1
+
; $1: m16_a/b
#macro m16_write_bc
ld a, c
- ld [$1], a
+ ldh [$1], a
ld a, b
- ld [$1+1], a
+ ldh [$1+1], a
#endmacro
#macro m16_write_de
ld a, e
- ld [$1], a
+ ldh [$1], a
ld a, d
- ld [$1+1], a
+ ldh [$1+1], a
#endmacro
#macro m16_write_hl
ld a, l
- ld [$1], a
+ ldh [$1], a
ld a, h
- ld [$1+1], a
+ ldh [$1+1], a
#endmacro
; returns:
; r16: 16 bit integer
#macro m16_read_bc
- ld a, [$1]
+ ldh a, [$1]
ld c, a
- ld a, [$1+1]
+ ldh a, [$1+1]
ld b, a
#endmacro
#macro m16_read_de
- ld a, [$1]
+ ldh a, [$1]
ld e, a
- ld a, [$1+1]
+ ldh a, [$1+1]
ld d, a
#endmacro
#macro m16_read_hl
- ld a, [$1]
+ ldh a, [$1]
ld l, a
- ld a, [$1+1]
+ ldh a, [$1+1]
ld h, a
#endmacro
+ ; sets the carry flag
+ ; if required otehrwise jr @nc
+ ; inputs:
+ ; c: carry flag
+#macro m16_set_carry
+.beginscope
+ ; no carry? good to exit
+ jr nc, @no_carry REL
+
+ ; when carry is set -> set flag
+ ld b, M16_CARRY
+ ldh a, [m16_flags]
+ or a, b
+ ldh [m16_flags], a
+@no_carry:
+.endscope
+#endmacro
+
+ ; sets the zero flag
+ ; checks m16_a == 0
+ ; if so -> set zero flag
+ ; otherwise skip
+#macro m16_set_zero
+.beginscope
+ ldh a, [m16_a]
+ ld b, a
+ ldh a, [m16_a+1]
+ or a, b
+ jr nz, @not_zero REL
+ ld b, M16_ZERO
+ ldh a, [m16_flags]
+ or a, b
+ ldh [m16_flags], a
+@not_zero:
+.endscope
+#endmacro
+
; 16 bit add
; inputs:
; m16_a/m16_b
; m16_flags
m16_add:
xor a, a
- ld [m16_flags], a
+ ldh [m16_flags], a
- ld a, [m16_b]
+ ldh a, [m16_b]
ld b, a
- ld a, [m16_a]
+ ldh a, [m16_a]
; low is stored
add a, b
- ld [m16_a], a
+ ldh [m16_a], a
- ld a, [m16_b+1]
+ ldh a, [m16_b+1]
ld b, a
- ld a, [m16_a+1]
+ ldh a, [m16_a+1]
; high + carry stored
adc a, b
- ld [m16_a+1], a
- ret nc ; no carry? good to exit
+ ldh [m16_a+1], a
- ; when carry is set -> set flag
- ld b, M16_CARRY
- ld a, [m16_flags]
- or a, b
- ld [m16_flags], a
+ m16_set_carry
+ m16_set_zero
ret
; m16_flags
m16_sub:
xor a, a
- ld [m16_flags], a
+ ldh [m16_flags], a
- ld a, [m16_b]
+ ldh a, [m16_b]
ld b, a
- ld a, [m16_a]
+ ldh a, [m16_a]
; low is stored
sub a, b
- ld [m16_a], a
+ ldh [m16_a], a
- ld a, [m16_b+1]
+ ldh a, [m16_b+1]
ld b, a
- ld a, [m16_a+1]
+ ldh a, [m16_a+1]
; high + carry stored
sbc a, b
- ld [m16_a+1], a
- ret nc
-
- ; when carry is set -> set flag
- ld b, M16_CARRY
- ld a, [m16_flags]
- or a, b
- ld [m16_flags], a
+ ldh [m16_a+1], a
+
+ m16_set_carry
+ m16_set_zero
ret