ld h,page0
jp (hl)
-imm_call:
- push de
- dec h ; page 0
-page0_imm_call:
- ld a,(bc)
- inc bc
- ld l,a
- ld a,(bc)
- inc bc
- push bc
- ld b,a
- ld c,l
- ld a,(bc)
- inc bc
- ld l,a
- jp (hl)
-
page0_call:
pop de
_call:
ld l,a
jp (hl)
- .org page0 * 0x100 + 0x88
+ .org page0 * 0x100 + 0x84
-imm_stkptr:
+imm_call:
push de
-page0_imm_stkptr:
+ dec h ; page 0
+page0_imm_call:
ld a,(bc)
inc bc
ld l,a
ld a,(bc)
inc bc
- ld h,a
- .db 0x3e ; ld a,
-page0_stkptr:
- pop hl
+ push bc
+ ld b,a
+ ld c,l
+ ld a,(bc)
+ inc bc
+ ld l,a
+ jp (hl)
+
stkptr:
+ push de
+page0_stkptr:
+ ld a,(bc)
+ inc bc
+ ld l,a
+ ld a,(bc)
+ inc bc
+ ld h,a
add hl,sp
ex de,hl
ld a,(bc)
page0_ret:
pop bc
-page0_imm_stkadj:
-imm_stkadj:
+page0_stkadj:
+stkadj:
ld a,(bc)
inc bc
ld l,a
ld a,(bc)
inc bc
ld h,a
- .db 0x3e ; ld a,
-page0_stkadj:
- pop hl
-stkadj:
add hl,sp
ld sp,hl
ld a,(bc)
ld h,page0
jp (hl)
-imm_stkld_w:
+stkld_w:
push de
-page0_imm_stkld_w:
+page0_stkld_w:
ld a,(bc)
inc bc
ld l,a
ld a,(bc)
inc bc
ld h,a
- .db 0x3e ; ld a,
-page0_stkld_w:
- pop hl
-stkld_w:
add hl,sp
ld e,(hl)
inc hl
ld h,page1
jp (hl)
-page0_imm_xchg_stkst_w:
+page0_stkst_w:
pop de
-imm_xchg_stkst_w:
+stkst_w:
ld a,(bc)
inc bc
ld l,a
ld a,(bc)
inc bc
ld h,a
-stkst_entry:
add hl,sp
ld (hl),e
inc hl
ld h,page0
jp (hl)
-page0_stkst_w:
- pop de
-stkst_w:
- pop hl
-; add hl,sp
-; ld (hl),e
-; inc hl
-; ld (hl),d
-; ld a,(bc)
-; inc bc
-; ld l,a
-; ld h,page0
-; jp (hl)
-; the non-immediate stack load/store is hardly ever used and only for symmetry
- jr stkst_entry
-
page0_imm_w:
inc h ; page1
imm_w:
.org page1 * 0x100
-page1_imm_stkptr:
- jr imm_stkptr
+page1_imm_call:
+ jr imm_call
page1_stkptr:
- ex de,hl
jr stkptr
-page1_imm_stkadj:
- push de
- jr imm_stkadj
page1_stkadj:
- ex de,hl
+ push de
jr stkadj
-page1_imm_stkld_w:
- jr imm_stkld_w
page1_stkld_w:
- ex de,hl
jr stkld_w
-page1_imm_xchg_stkst_w:
- jr imm_xchg_stkst_w
page1_stkst_w:
jr stkst_w
page1_imm_w:
dec h ; page 0
jp (hl)
-page1_imm_call:
- jp imm_call
-
page1_call:
dec h ; page 0
jp _call
sm_main:
; create stack frame
- .db <page0_imm_stkadj
+ .db <page0_stkadj
.dw -2
; push argument
.dw 5
; push result pointer
- .db <page1_imm_stkptr
+ .db <page1_stkptr
.dw 2
; call sm_factorial(argument)
.dw 4
; print 10000s
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 0
.db <page1_imm_div_sw
.dw 10000
- .db <page1_imm_xchg_stkst_w
+ .db <page1_stkst_w
.dw 2
.db <page0_page1
.db page1_imm_add_w
.dw 2
; print 1000s
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 0
.db <page1_imm_div_sw
.dw 1000
- .db <page1_imm_xchg_stkst_w
+ .db <page1_stkst_w
.dw 2
.db <page0_page1
.db page1_imm_add_w
.dw 2
; print 100s
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 0
.db <page1_imm_div_sw
.dw 100
- .db <page1_imm_xchg_stkst_w
+ .db <page1_stkst_w
.dw 2
.db <page0_page1
.db page1_imm_add_w
.dw 2
; print 10s
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 0
.db <page1_imm_div_sw
.dw 10
- .db <page1_imm_xchg_stkst_w
+ .db <page1_stkst_w
.dw 2
.db <page0_page1
.db page1_imm_add_w
.dw 2
; print 1s
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 0
.db page1_imm_add_w
.dw '0
.dw 2
; destroy stack frame
- .db <page0_imm_stkadj
+ .db <page0_stkadj
.dw 2
; return
sm_factorial:
.db <page0_trace
; get argument
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 4
; is argument < 2?
.dw 1$
; no, set up for *result =
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 2
; get argument
- .db <page1_imm_stkld_w
+ .db <page1_stkld_w
.dw 6
; subtract 1
.dw -1
; push result pointer
- .db <page1_imm_stkptr
+ .db <page1_stkptr
.dw 0
; call sm_factorial(argument - 1)
.dw 2
; get argument
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 8
; multiply
1$:
; yes, set up for *result =
- .db <page0_imm_stkld_w
+ .db <page0_stkld_w
.dw 2
; set *result = 1