-page0 = 1
-page1 = 2
-page2 = 3
+page0 = 2
+page1 = 4
+page2 = 6
.area SM (abs,ovr)
+ .org 0x100
+
+ ld hl,restarts
+ ld de,0x28
+ ld bc,restarts_end - restarts
+ ldir
+
+ ld bc,sm_start
+ jp page0_dispatch0
+sm_start:
+ .db <page0_imm_call
+ .dw sm_main
+ .dw 0
+ .db <page0_esc
+ jp 0
+
+restarts:
+ ; rst 0x28, immediate to hl
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld a,(bc)
+ inc bc
+ ld h,a
+ ret
+ .db 0
+ ; rst 0x30, pop hl:de'
+ pop hl
+ exx
+ pop de
+ exx
+ ex (sp),hl
+ ret
+ .db 0,0
+ ; rst 0x38, immediate to hl:de'
+ ld a,(bc)
+ inc bc
+ exx
+ ld e,a
+ exx
+ ld a,(bc)
+ inc bc
+ exx
+ ld d,a
+ exx
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld a,(bc)
+ inc bc
+ ld h,a
+ ret
+restarts_end:
+
; page 0 interpreter
; stack and control transfer
- .org page0 * 0x100
+ .org page0 * 0x100 - 18
-; administrative
+page0_dispatch0:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
+
+page0_dispatch1:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
+
+page0_dispatch2:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
+
+; page 0 administrative
page0_trace:
- jp start ; will be overwritten with print_trace
+ jp print_trace
page0_esc:
ld l,c
ld h,b
jp (hl)
-page0_page2:
- exx
- pop hl
- exx
- inc h ; page 1
-page0_page1:
- pop de
- ld a,(bc)
- inc bc
- ld l,a
- inc h ; page 1 (or 2 if came from page0_page2)
- jp (hl)
+; page 0 to 0
page0_jeq:
jr nz,not_taken
jr nc,page0_imm_jmp
jr not_taken
+page0_imm_call:
+ rst 0x28
+ push bc
+ ld c,l
+ ld b,h
+ jr page0_dispatch0
+
+page0_ret:
+ pop bc
+page0_stkadj:
+ rst 0x28
+ add hl,sp
+ ld sp,hl
+ jr page0_dispatch0
+
+; page 0 to 1
+
+page0_page1:
+ pop de
+ jr page0_dispatch1
+
page0_peq:
call test_eq
jr page0_dispatch1
call test_ge
jr page0_dispatch1
-page0_imm_call:
- rst 0x28
- push bc
- ld c,l
- ld b,h
- jr page0_dispatch0
-
-page0_ret:
- pop bc
-page0_stkadj:
- rst 0x28
- add hl,sp
- ld sp,hl
-page0_dispatch0:
- ld a,(bc)
- inc bc
- ld l,a
- ld h,page0
- jp (hl)
-
page0_stkptr:
rst 0x28
add hl,sp
ex de,hl
-page0_dispatch1:
- ld a,(bc)
- inc bc
- ld l,a
- ld h,page1
- jp (hl)
+ jr page0_dispatch1
page0_stkld_w:
call math_stkld_w
jr page0_dispatch1
-page0_stkld_l:
- call math_stkld_l
-page0_dispatch2:
- ld a,(bc)
- inc bc
- ld l,a
- ld h,page2
- jp (hl)
-
page0_imm_w:
call math_imm_w
jr page0_dispatch1
+; page 0 to 2
+
+page0_page2:
+ exx
+ pop hl
+ exx
+ pop de
+ jr page0_dispatch2
+
+page0_stkld_l:
+ call math_stkld_l
+ jr page0_dispatch2
+
+
page0_imm_l:
call math_imm_l
jr page0_dispatch2
; word arithmetic operations
; top stack word cached in de
- .org page1 * 0x100
+ .org page1 * 0x100 - 13
+
+page1_dispatch0:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
+
+add_w_done:
+ ex de,hl
+page1_dispatch1:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
+
+; page 1 administrative
page1_trace:
jp print_trace
+; page 1 to 0
+
page1_page0:
push de
jr page1_dispatch0
page1_stkst_w:
call math_stkst_w
-page1_dispatch0:
- ld a,(bc)
- inc bc
- ld l,a
- ld h,page0
- jp (hl)
-
-page1_ld_w:
- ex de,hl
- ld e,(hl)
- inc hl
- ld d,(hl)
- jr page1_dispatch1
-
-page1_ld_l:
- ex de,hl
- call math_ld_l
-page1_dispatch2:
- ld a,(bc)
- inc bc
- ld l,a
- ld h,page2
- jp (hl)
+ jr page1_dispatch0
page1_st_w:
pop hl
ld (hl),d
jr page1_dispatch0
+page1_imm_cmprev_sw:
+ rst 0x28
+ .db 0x3e ; ld a,
+page1_cmp_sw:
+ pop hl
+ call math_cmprev_sw
+ jr page1_dispatch0
+
+page1_imm_cmp_sw:
+ rst 0x28
+ .db 0x3e ; ld a,
+page1_cmprev_sw:
+ pop hl
+ call math_cmp_sw
+ jr page1_dispatch0
+
+page1_imm_cmprev_uw:
+ rst 0x28
+ .db 0x3e ; ld a,
+page1_cmp_uw:
+ pop hl
+ or a
+ sbc hl,de
+ jr page1_dispatch0
+
+page1_imm_cmp_uw:
+ rst 0x28
+ .db 0x3e ; ld a,
+page1_cmprev_uw:
+ pop hl
+ ex de,hl
+ or a
+ sbc hl,de
+ jr page1_dispatch0
+
+; page 1 to 1
+
+page1_ld_w:
+ ex de,hl
+ ld e,(hl)
+ inc hl
+ ld d,(hl)
+ jr page1_dispatch1
+
page1_imm_and_w:
call math_and_imm_w
jr page1_dispatch1
page1_add_w:
pop hl
add hl,de
- ex de,hl
- jr page1_dispatch1
+ jr add_w_done
page1_imm_subrev_w:
rst 0x28
pop hl
or a
sbc hl,de
- ex de,hl
- jr page1_dispatch1
+ jr add_w_done
; use addition for page1_imm_sub_w
page1_subrev_w:
ex de,hl
or a
sbc hl,de
- ex de,hl
- jr page1_dispatch1
-
-page1_imm_cmprev_sw:
- rst 0x28
- .db 0x3e ; ld a,
-page1_cmp_sw:
- pop hl
- call math_cmprev_sw
- jr page1_dispatch0
-
-page1_imm_cmp_sw:
- rst 0x28
- .db 0x3e ; ld a,
-page1_cmprev_sw:
- pop hl
- call math_cmp_sw
- jr page1_dispatch0
-
-page1_imm_cmprev_uw:
- rst 0x28
- .db 0x3e ; ld a,
-page1_cmp_uw:
- pop hl
- or a
- sbc hl,de
- jr page1_dispatch0
-
-page1_imm_cmp_uw:
- rst 0x28
- .db 0x3e ; ld a,
-page1_cmprev_uw:
- pop hl
- ex de,hl
- or a
- sbc hl,de
- jr page1_dispatch0
+ jr add_w_done
page1_imm_slrev_w:
rst 0x28
.db 0x3e ; ld a,
page1_sl_w:
pop hl
- call math_slrev_w
-page1_dispatch1:
- ld a,(bc)
- inc bc
- ld l,a
- ld h,page1
- jp (hl)
+ call math_sl_w
+ jr mul_w_done
page1_imm_sl_w:
- ld a,(bc)
- inc bc
- ld l,a
+ rst 0x28
.db 0x3e ; ld a,
page1_slrev_w:
pop hl
- call math_sl_w
- jr page1_dispatch1
-
-page1_imm_slrev_l:
- ex de,hl
- call math_imm_l
- call math_sl_l
- jr page1_dispatch2
-
-page1_sl_l:
- exx
- pop hl
- exx
- pop hl
- call math_sl_l0
- jr page1_dispatch2
+ call math_sl_w0
+ jr mul_w_done
page1_imm_srrev_sw:
rst 0x28
.db 0x3e ; ld a,
page1_sr_sw:
pop hl
- call math_srrev_sw
- jr page1_dispatch1
+ call math_sr_sw
+ jr mul_w_done
page1_imm_sr_sw:
- ld a,(bc)
- inc bc
- ex de,hl
- call math_srrev_sw0
- jr page1_dispatch1
-
+ rst 0x28
+ .db 0x3e ; ld a,
page1_srrev_sw:
pop hl
- call math_sr_sw
- jr page1_dispatch1
-
-page1_imm_srrev_sl:
- ex de,hl
- call math_imm_l
- call math_sr_sl
- jr page1_dispatch2
-
-page1_sr_sl:
- exx
- pop hl
- exx
- pop hl
- call math_sr_sl0
- jr page1_dispatch2
+ call math_sr_sw0
+ jr mul_w_done
page1_imm_srrev_uw:
rst 0x28
.db 0x3e ; ld a,
page1_sr_uw:
pop hl
- call math_srrev_uw
- jr page1_dispatch1
+ call math_sr_uw
+ jr mul_w_done
page1_imm_sr_uw:
- ld a,(bc)
- inc bc
- ex de,hl
- call math_srrev_uw0
- jr page1_dispatch1
-
+ rst 0x28
+ .db 0x3e ; ld a,
page1_srrev_uw:
pop hl
- call math_sr_uw
- jr page1_dispatch1
-
-page1_imm_srrev_ul:
- ex de,hl
- call math_imm_l
- call math_sr_ul
- jr page1_dispatch2
-
-page1_sr_ul:
- exx
- pop hl
- exx
- pop hl
- call math_sr_ul0
- jr page1_dispatch2
+ call math_sr_uw0
+ jr mul_w_done
page1_imm_mul_uw:
call math_mul_imm_w
- jr page1_dispatch1
+ jr mul_w_done
page1_mul_w:
pop hl
call math_mul_w
- jr page1_dispatch1
+ jr mul_w_done
page1_imm_divrev_sw:
rst 0x28
.db 0x3e ; ld a,
page1_div_sw:
pop hl
- call math_divrev_sw
- push hl
- jr page1_dispatch1
+ call math_div_sw
+ jr div_w_done
page1_imm_div_sw:
rst 0x28
.db 0x3e ; ld a,
page1_divrev_sw:
pop hl
- call math_div_sw
- push hl
- jr page1_dispatch1
+ call math_div_sw0
+ jr div_w_done
page1_imm_divrev_uw:
rst 0x28
.db 0x3e ; ld a,
page1_div_uw:
pop hl
- call math_divrev_uw
- push hl
- jr page1_dispatch1
+ call math_div_uw
+ jr div_w_done
page1_imm_div_uw:
rst 0x28
.db 0x3e ; ld a,
page1_divrev_uw:
pop hl
- call math_div_uw
- push hl
- jr page1_dispatch1
+ call math_div_uw0
+ jr div_w_done
+
+; page 1 to 2
+
+page1_ld_l:
+ ex de,hl
+ call math_ld_l
+ jr page1_dispatch2
+
+page1_imm_slrev_l:
+ rst 0x38
+ .db 0x3e ; ld a,
+page1_sl_l:
+ rst 0x30
+ call math_sl_l0
+ jr page1_dispatch2
+
+page1_imm_srrev_sl:
+ rst 0x38
+ .db 0x3e ; ld a,
+page1_sr_sl:
+ rst 0x30
+ call math_sr_sl0
+ jr page1_dispatch2
+
+page1_imm_srrev_ul:
+ rst 0x38
+ .db 0x3e ; ld a,
+page1_sr_ul:
+ rst 0x30
+ call math_sr_ul0
+page1_dispatch2:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
+
+div_w_done:
+ push de
+mul_w_done:
+ ex de,hl
+;page1_dispatch1h:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
+
+; page 2 interpreter
+; long arithmetic operations
+; top stack long cached in de:hl'
+
+ .org page2 * 0x100 - 12
+
+page2_dispatch0:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
-; page 2 interpreter
-; long arithmetic operations
-; top stack long cached in de:hl'
+page2_dispatch2:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
- .org page2 * 0x100
+; page 2 administrative
page2_trace:
jp print_trace
+; page 2 to 0
+
page2_page0:
push de
exx
page2_stkst_l:
call math_stkst_l
-page2_dispatch0:
- ld a,(bc)
- inc bc
- ld l,a
- ld h,page0
- jp (hl)
+ jr page2_dispatch0
page2_st_l:
pop hl
call math_st_l
jr page2_dispatch0
+; page 2 to 2
+
page2_imm_and_l:
call math_and_imm_l
jr page2_dispatch2
page2_and_l:
- exx
- pop de
- exx
- pop hl
+ rst 0x30
call math_and_l
jr page2_dispatch2
jr page2_dispatch2
page2_or_l:
- exx
- pop de
- exx
- pop hl
+ rst 0x30
call math_or_l
jr page2_dispatch2
jr page2_dispatch2
page2_xor_l:
- exx
- pop de
- exx
- pop hl
+ rst 0x30
call math_xor_l
jr page2_dispatch2
call math_cmp_ul
jr page2_dispatch2
-page1_imm_sl_l:
- ld a,(bc)
- inc bc
- ld l,a
+page2_imm_sl_l:
+ rst 0x28
.db 0x3e ; ld a,
page2_slrev_l:
pop hl
- call math_sl_l
-page2_dispatch2:
- ld a,(bc)
- inc bc
- ld l,a
- ld h,page2
- jp (hl)
-
-page2_imm_sr_sl:
- ld a,(bc)
- inc bc
ex de,hl
- call math_sr_sl1
+ call math_sl_l
jr page2_dispatch2
+page2_imm_sr_sl:
+ rst 0x28
+ .db 0x3e ; ld a,
page2_srrev_sl:
pop hl
+ ex de,hl
call math_sr_sl
- jr page2_dispatch2
+ jr page2_dispatch2h
page2_imm_sr_ul:
- ld a,(bc)
- inc bc
- ex de,hl
- call math_sr_ul1
- jr page2_dispatch2
-
+ rst 0x28
+ .db 0x3e ; ld a,
page2_srrev_ul:
pop hl
+ ex de,hl
call math_sr_ul
- jr page2_dispatch2
+ jr page2_dispatch2h
page2_imm_mul_ul:
call math_mul_imm_l
- jr page2_dispatch2
+ jr page2_dispatch2h
page2_mul_l:
- exx
- pop de
- exx
- pop hl
+ rst 0x30
call math_mul_l
- jr page2_dispatch2
-
-page2_imm_divrev_sl:
- exx
- ex de,hl
- exx
- call math_imm_l
- jr div_sl_entry
+ jr page2_dispatch2h
-page2_div_sl:
- exx
- ex de,hl
- pop hl
- exx
- pop hl
-div_sl_entry:
+page1_imm_divrev_sl:
+ rst 0x30
+ .db 0x3e ; ld a,
+page1_div_sl:
+ rst 0x38
call math_div_sl0
-div_sl_done:
- push hl
- exx
- push de
- exx
- jr page2_dispatch2
-
-page2_imm_div_sl:
- call math_div_imm_sl
- jr div_sl_done
+ jr div_l_done
-page2_divrev_sl:
- exx
- pop de
- exx
- pop hl
+page1_imm_div_sl:
+ rst 0x30
+ .db 0x3e ; ld a,
+page1_divrev_sl:
+ rst 0x38
+ ex de,hl
call math_div_sl
- jr div_sl_done
+ jr div_l_done
-page2_imm_divrev_ul:
- exx
- ex de,hl
- exx
- call math_imm_l
- jr div_ul_entry
+page1_imm_divrev_ul:
+ rst 0x30
+ .db 0x3e ; ld a,
+page1_div_ul:
+ rst 0x38
+ call math_div_ul0
+ jr div_l_done
-page2_div_ul:
- exx
+page1_imm_div_ul:
+ rst 0x30
+ .db 0x3e ; ld a,
+page1_divrev_ul:
+ rst 0x38
+ ex de,hl
+ call math_div_ul
+div_l_done:
ex de,hl
- pop hl
- exx
- pop hl
-div_ul_entry:
- call math_div_ul0
-div_ul_done:
push hl
exx
push de
exx
- jr page2_dispatch2
-
-page2_imm_div_ul:
- call math_div_imm_ul
- jr div_ul_done
-
-page2_divrev_ul:
- exx
- pop de
- exx
- pop hl
- call math_div_ul
- jr div_ul_done
+page2_dispatch2h:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
; conditionals
; use inline code for math_add_imm_w, math_add_w
-math_add_imm_l: ; de:hl' += imm_l
- call math_imm_l0
math_add_l: ; de:hl' += hl:de'
exx
add hl,de
; use inline code for math_subrev_imm_w, math_subrev_w
-math_subrev_imm_l: ; de:hl' = imm_l - de:hl'
- call math_imm_l0
math_subrev_l: ; de:hl' = hl:de' - de:hl'
exx
ex de,hl
ex de,hl
ret
-; use rst 8 then math_cmp_sw for math_cmp_imm_sw
math_cmp_sw: ; cf=1 de < hl, zf=1 de == hl, signed
ex de,hl
-; use rst 8 then math_cmprev_sw for math_cmprev_imm_sw
math_cmprev_sw: ; cf=1 hl < de, zf=1 hl == de, signed
or a
sbc hl,de
ccf
ret
-; use rst 8 then inline code for math_cmp_imm_uw, math_cmprev_imm_uw
; use inline code for math_cmp_uw, math_cmprev_uw
-math_cmp_imm_sl: ; cf=1 de:hl' < imm_l, zf=1 de:hl' == imm_l, signed
- call math_imm_l0
math_cmp_sl: ; cf=1 de:hl' < hl:de', zf=1 de:hl' == hl:de', signed
ex de,hl
or a
ccf
ret
-math_cmp_imm_ul: ; cf=1 de:hl' < imm_l, zf=1 de:hl' == imm_l, unsigned
- call math_imm_l0
math_cmp_ul: ; cf=1 de:hl' < hl:de', zf=1 de:hl' == hl:de', unsigned
ex de,hl
or a
exx
ret
-math_cmprev_imm_sl: ; cf=1 hl:de' < imm_l, zf=1 hl:de' == imm_l, signed
- call math_imm_l0
math_cmprev_sl: ; cf=1 hl:de' < de:hl', zf=1 hl:de' == de:hl', signed
or a
sbc hl,de
ccf
ret
-math_cmprev_imm_ul: ; cf=1 de:hl' < imm_l, zf=1 de:hl' == imm_l, unsigned
- call math_imm_l0
math_cmprev_ul: ; cf=1 de:hl' < de:de', zf=1 de:hl' == hl:de', unsigned
or a
sbc hl,de
ld hl,0
call mul_w0
pop af
- call mul_w
mul_w: ; bit 0
add hl,hl
mul_w0: rla
sbc hl,de
jr div_l_n_done
-div_l_nn: ; negative dividend, negative divisor
- call div_l_n0
+math_div_ul0: ; hl:hl', de:de' = hl:de' % de:hl', hl:de' / de:hl', unsigned
+ exx
+ ex de,hl
+ exx
+math_div_ul: ; ; hl:hl', de:de' = hl:hl' % de:de', hl:hl' / de:de', unsigned
+ push bc
+ exx
+ ld c,l
+ ld b,h
+ ld hl,0
+ exx
+ ld a,h
+ ld c,l
+ ld hl,0
+div_l_pp: ; positive dividend, positive divisor
+ call div_l0
ld b,a
ld a,c
- call div_l_ncf
+ call div_lcf
ld c,a
exx
ld a,b
exx
- call div_l_ncf
+ call div_lcf
exx
ld b,a
ld a,c
exx
- call div_l_ncf
- jr nc,div_l_n_done
+ call div_lcf
+ jr nc,div_l_p_done
exx
add hl,de
exx
adc hl,de
-div_l_n_done:
+div_l_p_done:
exx
ld e,a
ld d,b
ld e,c
ld d,b
pop bc
-inc_l: ; get into range divisor+1..0
- exx
- inc hl
- ld a,l
- or h
- exx
- ret nz
- inc hl
ret
-math_div_ul0: ; hl:hl', de:de' = hl:de' % de:hl', hl:de' / de:hl', unsigned
- exx
- ex de,hl
- exx
-math_div_ul: ; ; hl:hl', de:de' = hl:hl' % de:de', hl:hl' / de:de', unsigned
- push bc
- exx
- ld c,l
- ld b,h
- ld hl,0
- exx
- ld a,h
- ld c,l
- ld hl,0
-div_l_pp: ; positive dividend, positive divisor
- call div_l0
+div_l_nn: ; negative dividend, negative divisor
+ call div_l_n0
ld b,a
ld a,c
- call div_lcf
+ call div_l_ncf
ld c,a
exx
ld a,b
exx
- call div_lcf
+ call div_l_ncf
exx
ld b,a
ld a,c
exx
- call div_lcf
- jr nc,div_l_p_done
+ call div_l_ncf
+ jr nc,div_l_n_done
exx
add hl,de
exx
adc hl,de
-div_l_p_done:
+div_l_n_done:
exx
ld e,a
ld d,b
ld e,c
ld d,b
pop bc
+inc_l: ; get into range divisor+1..0
+ exx
+ inc hl
+ ld a,l
+ or h
+ exx
+ ret nz
+ inc hl
ret
dec_l:
; non-restoring division routine
; see earlier comments for the word version, this extends the concept to long
+; changed all jr to jp, revisit this
+
div_lcf:
- jr c,div_l1
+ jp c,div_l1
div_l0: ; bit 0, above
scf
rla
sbc hl,de
exx
sbc hl,de
- jr nc,div_l01
+ jp nc,div_l01
dec a
div_l11: ; bit 1, below
add a,a
add hl,de
exx
adc hl,de
- jr nc,div_l12
+ jp nc,div_l12
inc a
div_l02: ; bit 2, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr nc,div_l03
+ jp nc,div_l03
dec a
div_l13: ; bit 3, below
add a,a
add hl,de
exx
adc hl,de
- jr nc,div_l14
+ jp nc,div_l14
inc a
div_l04: ; bit 4, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr nc,div_l05
+ jp nc,div_l05
dec a
div_l15: ; bit 5, below
add a,a
add hl,de
exx
adc hl,de
- jr nc,div_l16
+ jp nc,div_l16
inc a
div_l06: ; bit 6, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr nc,div_l07
+ jp nc,div_l07
dec a
div_l17: ; bit 7, below
add a,a
add hl,de
exx
adc hl,de
- jr nc,div_l18
+ jp nc,div_l18
inc a
div_l08: ; done, above
add a,a
add hl,de
exx
adc hl,de
- jr nc,div_l11
+ jp nc,div_l11
inc a
div_l01: ; bit 1, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr nc,div_l02
+ jp nc,div_l02
dec a
div_l12: ; bit 2, below
add a,a
add hl,de
exx
adc hl,de
- jr nc,div_l13
+ jp nc,div_l13
inc a
div_l03: ; bit 3, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr nc,div_l04
+ jp nc,div_l04
dec a
div_l14: ; bit 4, below
add a,a
add hl,de
exx
adc hl,de
- jr nc,div_l15
+ jp nc,div_l15
inc a
div_l05: ; bit 5, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr nc,div_l06
+ jp nc,div_l06
dec a
div_l16: ; bit 6, below
add a,a
add hl,de
exx
adc hl,de
- jr nc,div_l17
+ jp nc,div_l17
inc a
div_l07: ; bit 7, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr nc,div_l08
+ jp nc,div_l08
dec a
div_l18: ; done, below
add a,a
; see earlier comments for the word version, this extends the concept to long
div_l_ncf:
- jr c,div_l_n1
+ jp c,div_l_n1
div_l_n0: ; bit 0, above
scf
rla
sbc hl,de
exx
sbc hl,de
- jr c,div_l_n01
+ jp c,div_l_n01
dec a
div_l_n11: ; bit 1, below
add a,a
add hl,de
exx
adc hl,de
- jr c,div_l_n12
+ jp c,div_l_n12
inc a
div_l_n02: ; bit 2, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr c,div_l_n03
+ jp c,div_l_n03
dec a
div_l_n13: ; bit 3, below
add a,a
add hl,de
exx
adc hl,de
- jr c,div_l_n14
+ jp c,div_l_n14
inc a
div_l_n04: ; bit 4, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr c,div_l_n05
+ jp c,div_l_n05
dec a
div_l_n15: ; bit 5, below
add a,a
add hl,de
exx
adc hl,de
- jr c,div_l_n16
+ jp c,div_l_n16
inc a
div_l_n06: ; bit 6, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr c,div_l_n07
+ jp c,div_l_n07
dec a
div_l_n17: ; bit 7, below
add a,a
add hl,de
exx
adc hl,de
- jr c,div_l_n18
+ jp c,div_l_n18
inc a
div_l_n08: ; done, above
add a,a
add hl,de
exx
adc hl,de
- jr c,div_l_n11
+ jp c,div_l_n11
inc a
div_l_n01: ; bit 1, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr c,div_l_n02
+ jp c,div_l_n02
dec a
div_l_n12: ; bit 2, below
add a,a
add hl,de
exx
adc hl,de
- jr c,div_l_n13
+ jp c,div_l_n13
inc a
div_l_n03: ; bit 3, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr c,div_l_n04
+ jp c,div_l_n04
dec a
div_l_n14: ; bit 4, below
add a,a
add hl,de
exx
adc hl,de
- jr c,div_l_n15
+ jp c,div_l_n15
inc a
div_l_n05: ; bit 5, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr c,div_l_n06
+ jp c,div_l_n06
dec a
div_l_n16: ; bit 6, below
add a,a
add hl,de
exx
adc hl,de
- jr c,div_l_n17
+ jp c,div_l_n17
inc a
div_l_n07: ; bit 7, above
add a,a
sbc hl,de
exx
sbc hl,de
- jr c,div_l_n08
+ jp c,div_l_n08
dec a
div_l_n18: ; done, below
add a,a
; sm code
-start:
- ld hl,print_trace
- ld (page0_trace + 1),hl
-
- ld hl,restarts
- ld de,0x28
- ld bc,restarts_end - restarts
- ldir
-
- ld bc,sm_start
- jp page0_dispatch0
-sm_start:
- .db <page0_imm_call
- .dw sm_main
- .dw 0
- .db <page0_esc
- jp 0
-
-restarts:
- ; rst 0x28, immediate to hl
- ld a,(bc)
- inc bc
- ld l,a
- ld a,(bc)
- inc bc
- ld h,a
- ret
- .db 0
- ; rst 0x30, pop hl:de'
- pop hl
- exx
- pop de
- exx
- ex (sp),hl
- ret
- .db 0,0
- ; rst 0x38, immediate to hl:de'
- ld a,(bc)
- inc bc
- exx
- ld e,a
- exx
- ld a,(bc)
- inc bc
- exx
- ld d,a
- exx
- ld a,(bc)
- inc bc
- ld l,a
- ld a,(bc)
- inc bc
- ld h,a
- ret
-restarts_end:
-
sm_main:
; create stack frame
.db <page0_stkadj