jr page0_dispatch1
page0_stkld_w:
- call math_stkld_w
- jr page0_dispatch1
+ ;call math_stkld_w
+ ;jr page0_dispatch1
+ jp math_stkld_w
page0_imm_w:
- call math_imm_w
- jr page0_dispatch1
+ ;call math_imm_w
+ ;jr page0_dispatch1
+ jp math_imm_w
; page 0 to 2
jr page0_dispatch2
page0_stkld_l:
- call math_stkld_l
- jr page0_dispatch2
-
+ ;call math_stkld_l
+ ;jr page0_dispatch2
+ jp math_stkld_l
page0_imm_l:
- call math_imm_l
- jr page0_dispatch2
+ ;call math_imm_l
+ ;jr page0_dispatch2
+ jp math_imm_l
; page 1 interpreter
; word arithmetic operations
jr page1_dispatch0
page1_stkst_w:
- call math_stkst_w
- jr page1_dispatch0
+ ;call math_stkst_w
+ ;jr page1_dispatch0
+ jp math_stkst_w
page1_st_w:
pop hl
-; ld (hl),e
-; inc hl
-; ld (hl),d
- call xxxmath_st_w
+ ld (hl),e
+ inc hl
+ ld (hl),d
jr page1_dispatch0
page1_imm_cmprev_sw:
.db 0x3e ; ld a,
page1_cmp_sw:
pop hl
- call math_cmprev_sw
- jr page1_dispatch0
+ ;call math_cmprev_sw
+ ;jr page1_dispatch0
+ jp math_cmprev_sw
page1_imm_cmp_sw:
rst 0x28
.db 0x3e ; ld a,
page1_cmprev_sw:
pop hl
- call math_cmp_sw
- jr page1_dispatch0
+ ;call math_cmp_sw
+ ;jr page1_dispatch0
+ jp math_cmp_sw
page1_imm_cmprev_uw:
rst 0x28
jr page1_dispatch1
page1_imm_and_w:
- call math_and_imm_w
- jr page1_dispatch1
+ ;call math_and_imm_w
+ ;jr page1_dispatch1
+ jp math_and_imm_w
page1_and_w:
pop hl
- call math_and_w
- jr page1_dispatch1
+ ;call math_and_w
+ ;jr page1_dispatch1a
+ jp math_and_w
page1_imm_or_w:
- call math_or_imm_w
- jr page1_dispatch1
+ ;call math_or_imm_w
+ ;jr page1_dispatch1
+ jp math_or_imm_w
page1_or_w:
pop hl
- call math_or_w
- jr page1_dispatch1
+ ;call math_or_w
+ ;jr page1_dispatch1
+ jp math_or_w
page1_imm_xor_w:
- call math_xor_imm_w
- jr page1_dispatch1
+ ;call math_xor_imm_w
+ ;jr page1_dispatch1
+ jp math_xor_imm_w
page1_xor_w:
pop hl
- call math_xor_w
- jr page1_dispatch1
+ ;call math_xor_w
+ ;jr page1_dispatch1
+ jp math_xor_w
page1_imm_add_w:
rst 0x28
page1_ld_l:
ex de,hl
- call math_ld_l
- jr page1_dispatch2
+ ;call math_ld_l
+ ;jr page1_dispatch2
+ jp math_ld_l
page1_imm_slrev_l:
rst 0x38
jr page2_dispatch0
page2_stkst_l:
- call math_stkst_l
- jr page2_dispatch0
+ ;call math_stkst_l
+ ;jr page2_dispatch0
+ jp math_stkst_l
page2_st_l:
pop hl
- call math_st_l
- jr page2_dispatch0
+ ;call math_st_l
+ ;jr page2_dispatch0
+ jp math_st_l
page2_imm_cmprev_sl:
rst 0x38
.db 0x3e ; ld a,
page2_cmp_sl:
rst 0x30
- call math_cmprev_sl
- jr page2_dispatch0
+ ;call math_cmprev_sl
+ ;jr page2_dispatch0
+ jp math_cmprev_sl
page2_imm_cmprev_ul:
rst 0x38
.db 0x3e ; ld a,
page2_cmp_ul:
rst 0x30
- call math_cmprev_ul
- jr page2_dispatch0
+ ;call math_cmprev_ul
+ ;jr page2_dispatch0
+ jp math_cmprev_ul
page2_imm_cmp_sl:
rst 0x38
.db 0x3e ; ld a,
page2_cmprev_sl:
rst 0x30
- call math_cmp_sl
- jr page2_dispatch0
+ ;call math_cmp_sl
+ ;jr page2_dispatch0
+ jp math_cmp_sl
page2_imm_cmp_ul:
rst 0x38
.db 0x3e ; ld a,
page2_cmprev_ul:
rst 0x30
- call math_cmp_ul
- jr page2_dispatch0
-
+ ;call math_cmp_ul
+ ;jr page2_dispatch0
+ jp math_cmp_ul
; page 2 to 2
page2_imm_and_l:
- call math_and_imm_l
- jr page2_dispatch2
+ ;call math_and_imm_l
+ ;jr page2_dispatch2
+ jp math_and_imm_l
page2_and_l:
rst 0x30
- call math_and_l
- jr page2_dispatch2
+ ;call math_and_l
+ ;jr page2_dispatch2
+ jp math_and_l
page2_imm_or_l:
- call math_or_imm_l
- jr page2_dispatch2
+ ;call math_or_imm_l
+ ;jr page2_dispatch2
+ jp math_or_imm_l
page2_or_l:
rst 0x30
- call math_or_l
- jr page2_dispatch2
+ ;call math_or_l
+ ;jr page2_dispatch2
+ jp math_or_l
page2_imm_xor_l:
- call math_xor_imm_l
- jr page2_dispatch2
+ ;call math_xor_imm_l
+ ;jr page2_dispatch2
+ jp math_xor_imm_l
page2_xor_l:
rst 0x30
- call math_xor_l
- jr page2_dispatch2
+ ;call math_xor_l
+ ;jr page2_dispatch2
+ jp math_xor_l
page2_imm_add_l:
rst 0x38
; these can be duplicated without much cost, and will be called often, so the
; calling convention is geared to what the interpreter needs (de:hl' and so on)
+math_imm_w: ; immediate to de
+ ld a,(bc)
+ inc bc
+ ld e,a
+ ld a,(bc)
+ inc bc
+ ld d,a
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
+
math_imm_l: ; immediate to de:hl'
ld a,(bc)
inc bc
exx
ld h,a
exx
-math_imm_w: ; immediate to de
+;math_imm_w: ; immediate to de
ld a,(bc)
inc bc
ld e,a
ld a,(bc)
inc bc
ld d,a
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
math_stkld_w: ; sp(imm_w) to de
ld a,(bc)
ld e,(hl)
inc hl
ld d,(hl)
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
math_stkld_l: ; sp(imm_w) to de:hl'
ld a,(bc)
ld e,(hl)
inc hl
ld d,(hl)
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
math_stkst_w: ; de to sp(imm_w)
ld a,(bc)
inc bc
ld h,a
add hl,sp
-; use inline code for math_st_w
-xxxmath_st_w:
-.if 0
- call print_word
- ld a,':
- call print_char
- ex de,hl
- call print_word
- ex de,hl
- ld a,'
- call print_char
-.endif
ld (hl),e
inc hl
ld (hl),d
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
math_stkst_l: ; de:hl' to sp(imm_w)
ld a,(bc)
ld (hl),e
inc hl
ld (hl),d
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
math_and_imm_l: ; de:hl' &= imm_l
ld a,(bc)
inc bc
and d
ld d,a
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ;ld h,page1
+ jp (hl)
+
+math_and_w: ; de &= hl
+ ld a,e
+ and l
+ ld e,a
+ ld a,d
+ and h
+ ld d,a
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
math_and_l: ; de:hl' &= hl:de'
exx
and d
ld h,a
exx
-math_and_w: ; de &= hl
+;math_and_imm_w: ; de &= imm_w
ld a,e
and l
ld e,a
ld a,d
and h
ld d,a
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
+
+math_or_imm_w: ; de |= imm_w
+ ld a,(bc)
+ inc bc
+ or e
+ ld e,a
+ ld a,(bc)
+ inc bc
+ or d
+ ld d,a
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
math_or_imm_l: ; de:hl' |= imm_l
ld a,(bc)
or h
ld h,a
exx
-math_or_imm_w: ; de |= imm_w
+;math_or_imm_w: ; de |= imm_w
ld a,(bc)
inc bc
or e
inc bc
or d
ld d,a
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ;ld h,page2
+ jp (hl)
+
+math_or_w: ; de |= hl
+ ld a,e
+ or l
+ ld e,a
+ ld a,d
+ or h
+ ld d,a
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
math_or_l: ; de:hl' |= hl:de'
exx
or d
ld h,a
exx
-math_or_w: ; de |= hl
+;math_or_w: ; de |= hl
ld a,e
or l
ld e,a
ld a,d
or h
ld d,a
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
+
+math_xor_imm_w: ; de ^= imm_w
+ ld a,(bc)
+ inc bc
+ xor e
+ ld e,a
+ ld a,(bc)
+ inc bc
+ xor d
+ ld d,a
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ;ld h,page1
+ jp (hl)
math_xor_imm_l: ; de:hl' ^= imm_l
ld a,(bc)
xor h
ld h,a
exx
-math_xor_imm_w: ; de ^= imm_w
+;math_xor_imm_w: ; de ^= imm_w
ld a,(bc)
inc bc
xor e
inc bc
xor d
ld d,a
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ;ld h,page2
+ jp (hl)
+
+math_xor_w: ; de ^= hl
+ ld a,e
+ xor l
+ ld e,a
+ ld a,d
+ xor h
+ ld d,a
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page1
+ jp (hl)
math_xor_l: ; de:hl' ^= hl:de'
exx
xor d
ld h,a
exx
-math_xor_w: ; de ^= hl
+;math_xor_w: ; de ^= hl
ld a,e
xor l
ld e,a
ld a,d
xor h
ld d,a
- ret
-
-; use inline code for math_add_imm_w, math_add_w
-
-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'
- ex de,hl
- ret
-
-; use inline code for math_subrev_imm_w, math_subrev_w
-
-math_subrev_l: ; de:hl' = hl:de' - de:hl'
- ex de,hl
- ret
+ ;ret
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page2
+ jp (hl)
math_cmp_sw: ; cf=1 de < hl, zf=1 de == hl, signed
ex de,hl
sbc hl,de
ld a,h
rla
- ret po
+ ;ret po
+ jp po,1$
ccf
- ret
+ ;ret
+1$: ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
; use inline code for math_cmp_uw, math_cmprev_uw
jr z,cmp_l_entry
ld a,h
rla
- ret po
+ ;ret po
+ jp po,1$
ccf
- ret
+ ;ret
+1$: ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
math_cmp_ul: ; cf=1 de:hl' < hl:de', zf=1 de:hl' == hl:de', unsigned
ex de,hl
or a
sbc hl,de
- ret nz
+ ;ret nz
+ jr nz,cmp_l_dispatch
cmp_l_entry:
exx
sbc hl,de
exx
- ret
+ ;ret
+cmp_l_dispatch:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
math_cmprev_sl: ; cf=1 hl:de' < de:hl', zf=1 hl:de' == de:hl', signed
or a
jr z,cmprev_l_entry
ld a,h
rla
- ret po
+ ;ret po
+ jp po,1$
ccf
- ret
+ ;ret
+1$: ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
math_cmprev_ul: ; cf=1 de:hl' < de:de', zf=1 de:hl' == hl:de', unsigned
or a
sbc hl,de
- ret nz
+ ;ret nz
+ jr nz,cmprev_l_dispatch
cmprev_l_entry:
exx
ex de,hl
sbc hl,de
exx
- ret
+ ;ret
+cmprev_l_dispatch:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld h,page0
+ jp (hl)
; heavyweight routines
.db <page0_imm_w
.dw 0
.db <page1_stkst_w
- .dw 2+2
+ .dw 2;+2
digit_loop:
; while i < 5
.db <page0_stkld_w
- .dw 2+2
+ .dw 2;+2
.db <page1_imm_cmp_sw
.dw 5
.db <page0_jge
; get current value
.db <page0_stkld_w
- .dw 0+2
+ .dw 0;+2
; get place value
.db <page1_page0
.db <page0_stkld_w
- .dw 4+2
+ .dw 4;+2
.db <page1_imm_sl_w
.dw 1
.db <page1_imm_add_w
; replace current value with remainder
.db <page1_stkst_w
- .dw 2+2
+ .dw 2;+2
; print quotient plus '0
.db <page0_page1
; ++i
.db <page0_stkld_w
- .dw 2+2
+ .dw 2;+2
.db <page1_imm_add_w
.dw 1
.db <page1_stkst_w
- .dw 2+2
+ .dw 2;+2
; loop
.db <page0_imm_jmp
.db <page0_imm_w
.dw 0
.db <page1_stkst_w
- .dw 4+2
+ .dw 4;+2
digit_loop2:
; while i < 10
.db <page0_stkld_w
- .dw 4+2
+ .dw 4;+2
.db <page1_imm_cmp_sw
.dw 10
.db <page0_jge
; get current value
.db <page0_stkld_l
- .dw 0+2
+ .dw 0;+2
; get place value
.db <page2_page0
.db <page0_stkld_w
- .dw 8+2
+ .dw 8;+2
.db <page1_imm_sl_w
.dw 2
.db <page1_imm_add_w
; replace current value with remainder
.db <page2_stkst_l
- .dw 4+2
+ .dw 4;+2
; print quotient plus '0
.db <page0_page1
; ++i
.db <page0_stkld_w
- .dw 4+2
+ .dw 4;+2
.db <page1_imm_add_w
.dw 1
.db <page1_stkst_w
- .dw 4+2
+ .dw 4;+2
; loop
.db <page0_imm_jmp
sm_factorial:
; get argument
.db <page0_stkld_w
- .dw 4+2
+ .dw 4;+2
; is argument < 2?
.db <page1_imm_cmp_sw
; no, set up for *result =
.db <page0_stkld_w
- .dw 2+2
+ .dw 2;+2
; get argument
.db <page1_page0
.db <page0_stkld_w
- .dw 6+2
+ .dw 6;+2
; subtract 1
.db <page1_imm_add_w
; get argument
.db <page0_stkld_w
- .dw 8+2
+ .dw 8;+2
; multiply
.db <page1_mul_w
1$:
; yes, set up for *result =
.db <page0_stkld_w
- .dw 2+2
+ .dw 2;+2
; set *result = 1
.db <page1_page0
sm_factorial2:
; get argument
.db <page0_stkld_l
- .dw 4+2
+ .dw 4;+2
; is argument < 2?
.db <page2_imm_cmp_sl
; no, set up for *result =
.db <page0_stkld_w
- .dw 2+2
+ .dw 2;+2
; get argument
.db <page1_page0
.db <page0_stkld_l
- .dw 6+2
+ .dw 6;+2
; subtract 1
.db <page2_imm_add_l
; get argument
.db <page0_stkld_l
- .dw 10+2
+ .dw 10;+2
; multiply
.db <page2_mul_l
1$:
; yes, set up for *result =
.db <page0_stkld_w
- .dw 2+2
+ .dw 2;+2
; set *result = 1
.db <page1_page0