; long arithmetic operations
; top stack long cached in de:hl'
- .org page2 * 0x100 - 12
+ .org page2 * 0x100 - 13
page2_dispatch0:
ld a,(bc)
ld h,page0
jp (hl)
+add_l_done:
+ ex de,hl
page2_dispatch2:
ld a,(bc)
inc bc
call math_st_l
jr page2_dispatch0
+page2_imm_cmprev_sl:
+ rst 0x38
+ .db 0x3e ; ld a,
+page2_cmp_sl:
+ rst 0x30
+ call math_cmprev_sl
+ jr page2_dispatch0
+
+page2_imm_cmprev_ul:
+ rst 0x38
+ .db 0x3e ; ld a,
+page2_cmp_ul:
+ rst 0x30
+ call math_cmprev_ul
+ jr page2_dispatch0
+
+page2_imm_cmp_sl:
+ rst 0x38
+ .db 0x3e ; ld a,
+page2_cmprev_sl:
+ rst 0x30
+ call math_cmp_sl
+ jr page2_dispatch0
+
+page2_imm_cmp_ul:
+ rst 0x38
+ .db 0x3e ; ld a,
+page2_cmprev_ul:
+ rst 0x30
+ call math_cmp_ul
+ jr page2_dispatch0
+
+
; page 2 to 2
page2_imm_and_l:
.db 0x3e ; ld a,
page2_add_l:
rst 0x30
- call math_add_l
- jr page2_dispatch2
+ exx
+ add hl,de
+ exx
+ adc hl,de
+ jr add_l_done
page2_imm_subrev_l:
rst 0x38
.db 0x3e ; ld a,
page2_sub_l:
rst 0x30
- call math_subrev_l
- jr page2_dispatch2
+ exx
+ ex de,hl
+ or a
+ sbc hl,de
+ exx
+ sbc hl,de
+ jr add_l_done
; use addition for page2_imm_sub_l
page2_subrev_l:
rst 0x30
- call math_sub_l
- jr page2_dispatch2
-
-page2_imm_cmprev_sl:
- rst 0x38
- .db 0x3e ; ld a,
-page2_cmp_sl:
- rst 0x30
- call math_cmprev_sl
- jr page2_dispatch2
-
-page2_imm_cmprev_ul:
- rst 0x38
- .db 0x3e ; ld a,
-page2_cmp_ul:
- rst 0x30
- call math_cmprev_ul
- jr page2_dispatch2
-
-page2_imm_cmp_sl:
- rst 0x38
- .db 0x3e ; ld a,
-page2_cmprev_sl:
- rst 0x30
- call math_cmp_sl
- jr page2_dispatch2
-
-page2_imm_cmp_ul:
- rst 0x38
- .db 0x3e ; ld a,
-page2_cmprev_ul:
- rst 0x30
- call math_cmp_ul
- jr page2_dispatch2
+ exx
+ or a
+ sbc hl,de
+ exx
+ ex de,hl
+ sbc hl,de
+ jr add_l_done
page2_imm_sl_l:
rst 0x28
pop hl
ex de,hl
call math_sl_l
- jr page2_dispatch2
+ jr mul_l_done
page2_imm_sr_sl:
rst 0x28
pop hl
ex de,hl
call math_sr_sl
- jr page2_dispatch2h
+ jr mul_l_done
page2_imm_sr_ul:
rst 0x28
pop hl
ex de,hl
call math_sr_ul
- jr page2_dispatch2h
+ jr mul_l_done
page2_imm_mul_ul:
call math_mul_imm_l
- jr page2_dispatch2h
+ jr mul_l_done
page2_mul_l:
rst 0x30
call math_mul_l
- jr page2_dispatch2h
+ jr mul_l_done
page1_imm_divrev_sl:
rst 0x30
ex de,hl
call math_div_ul
div_l_done:
- ex de,hl
- push hl
+ push de
exx
push de
exx
-page2_dispatch2h:
+mul_l_done:
+ ex de,hl
+;page2_dispatch2h:
ld a,(bc)
inc bc
ld l,a
; use inline code for math_add_imm_w, math_add_w
-math_add_l: ; de:hl' += hl:de'
- exx
- add hl,de
- exx
- adc hl,de
- ex de,hl
- ret
+math_add_l: ; hl:hl' += de:de'
+ret
; use addition for math_sub_imm_w, math_sub_imm_l
; use inline code for math_sub_w
math_sub_l: ; de:hl' -= hl:de'
- exx
- or a
- sbc hl,de
- exx
- ex de,hl
- sbc hl,de
ex de,hl
ret
; use inline code for math_subrev_imm_w, math_subrev_w
math_subrev_l: ; de:hl' = hl:de' - de:hl'
- exx
- ex de,hl
- or a
- sbc hl,de
- exx
- sbc hl,de
ex de,hl
ret