.db esc
ex de,hl
call print_word
- jp print_crlf
+ call print_crlf
+ rst 0 ; can't return into ccp as clobbered by stack growth
sm_factorial:
; get argument
ld a,(hl)
pop hl
pop de
- jr print_char
+ jp print_char
print_space:
push af
ret
print_stack:
+ push af
+ push bc
push de
push hl
- ld hl,6
- add hl,sp
+ ld a,'p
+ call print_char
+ ld a,'c
+ call print_char
+ ld a,'=
+ call print_char
+ rst 0x10 ; ex bc,hl
call print_word
+ rst 0x10 ; ex bc,hl
call print_space
- ex de,hl
+ ld a,'o
+ call print_char
+ ld a,'p
+ call print_char
+ ld a,'=
+ call print_char
call print_word
- ex de,hl
call print_space
- ld e,(hl)
- inc hl
- ld d,(hl)
- inc hl
- ex de,hl
+ ld a,'s
+ call print_char
+ ld a,'p
+ call print_char
+ ld a,'=
+ call print_char
+ ld hl,10
+ add hl,sp
call print_word
- ex de,hl
call print_space
- ld e,(hl)
- inc hl
- ld d,(hl)
- inc hl
+ ld a,'t
+ call print_char
+ ld a,'o
+ call print_char
+ ld a,'s
+ call print_char
+ ld a,'=
+ call print_char
ex de,hl
call print_word
ex de,hl
call print_space
+ ld a,'s
+ call print_char
+ ld a,'t
+ call print_char
+ ld a,'k
+ call print_char
+ ld b,4
+ ld a,'=
+1$: call print_char
ld e,(hl)
inc hl
ld d,(hl)
- ;inc hl
+ inc hl
ex de,hl
call print_word
ex de,hl
+ ld a,'
+ djnz 1$
pop hl
pop de
+ pop bc
+ pop af
print_crlf:
push af
ld a,0xd
.org 0x338
-; print 'A'
+; print 'A
push af
- ld a,0x41
+ ld a,'A
call print_char
pop af
ret
; lower dispatcher, just before 0x100
- .org 0x3ed
+ .org 0x3eb ;d
-sm:
- pop hl
- .db 1 ; ld bc,
-dispatch_l5: ; tos in hl, pc in de
+dispatch_l5: ; pc in de
ex de,hl
pop de
dispatch_l6: ; tos in de, pc in hl
- rst 0x28 ; print hl
ld c,l
ld b,h
- inc bc
ld l,(hl)
ld h,>esc
- rst 0x28 ; print hl
rst 0x30 ; print stack
+ inc bc
jp (hl)
+sm:
+ pop bc
+ .db 0x21 ; ld hl,
dispatch_l1: ; tos in de and hl, pc in bc
push de
dispatch_l2: ; tos in hl, pc in bc
- ld e,l
- ld d,h
+ ex de,hl
dispatch_l3: ; tos in de, pc in bc, h clobbered
ld h,>esc
dispatch_l4: ; tos in de, pc in bc, h = >esc
- rst 0x20 ; print bc
ld a,(bc)
ld l,a
inc bc
- rst 0x28 ; print hl
rst 0x30 ; print stack
jp (hl)
add hl,de
jr dispatch_l2
+;sub_iw: ; same as imm_w, sub_w
+; rst 8 ; ld hl,(bc)+
+; .db 0x3e ; ld a,
+sub_xw: ; same as xchg_w, sub_w
+ pop hl
+ rst 0x10 ; ex bc,hl
+ .db 0x3e ; ld a,
+sub_w: ; same as neg_w, add_w
+ pop hl
+ or a
+ sbc hl,de
+ jr dispatch_l2
+
+eq_iw: ; same as imm_w, eq_w
+ rst 8 ; ld hl,(bc)+
+ .db 0x3e ; ld a,
+eq_w:
+ pop hl
+ sub a
+ sbc hl,de
+ ld e,a
+ ld d,a
+ jr nz,dispatch_l3
+ inc e
+ jr dispatch_l3
+
; middle dispatch routines
jmp: ; also means ret
dispatch_m0: ; pc in bc, h = >esc
pop de
dispatch_m4:
- rst 0x20 ; print bc
ld a,(bc)
ld l,a
- inc bc
- rst 0x28 ; print hl
rst 0x30 ; print stack
+ inc bc
jp (hl)
-;sub_iw: ; same as imm_w, sub_w
-; rst 8 ; ld hl,(bc)+
-; .db 0x3e ; ld a,
-sub_xw: ; same as xchg_w, sub_w
- pop hl
- rst 0x10 ; ex bc,hl
- .db 0x3e ; ld a,
-sub_w: ; same as neg_w, add_w
- pop hl
- or a
- sbc hl,de
- jr dispatch_u2
-
-mul_iw:
- rst 8 ; ld hl,(bc)+
- .db 0x3e ; ld a,
-mul_w:
- pop hl
- push bc
- call mul_de_hl
- pop bc
- jr dispatch_u2
-
-eq_iw: ; same as imm_w, eq_w
- rst 8 ; ld hl,(bc)+
- .db 0x3e ; ld a,
-eq_w:
- pop hl
- sub a
- sbc hl,de
- ld e,a
- ld d,a
- jr nz,dispatch_u3
- inc e
- jr dispatch_u3
-
lt_iuw: ; same as imm_w, lt_iuw
rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
ld d,a
jr dispatch_u3
+;sl_xw:
+; pop hl
+; ex de,hl
+; .db 0x3e ; ld a,
sl_w:
pop hl
- push bc
call sl_hl_e
- pop bc
jr dispatch_u2
+;sr_xuw:
+; pop hl
+; ex de,hl
+; .db 0x3e ; ld a,
sr_uw:
pop hl
- push bc
call srl_hl_e
- pop bc
jr dispatch_u2
+;sr_xsw:
+; pop hl
+; ex de,hl
+; .db 0x3e ; ld a,
sr_sw:
pop hl
- push bc
call sra_hl_e
- pop bc
jr dispatch_u2
+mul_iw:
+ rst 8 ; ld hl,(bc)+
+ .db 0x3e ; ld a,
+mul_w:
+ pop hl
+ call mul_hl_de
+ jr dispatch_u2
+
+div_iuw:
+ rst 8 ; ld hl,(bc)+
+ .db 0x3e ; ld a,
+div_xuw:
+ pop hl
+ ex de,hl
+ .db 0x3e ; ld a,
+div_uw:
+ pop hl
+ call div_hl_de
+; jr dispatch_um1
+
; upper dispatcher, after 0x200
-dispatch_u1: ; tos in de and hl, pc in bc
- push de
+dispatch_um1: ; tos in hl and de, pc in bc
+ push hl
+ .db 0x3e ; ld a,
+;dispatch_u1: ; tos in de and hl, pc in bc
+; push de
dispatch_u2: ; tos in hl, pc in bc
- ld e,l
- ld d,h
+ ex de,hl
dispatch_u3: ; tos in de, pc in bc, h clobbered
ld h,>esc
dispatch_u4: ; tos in de, pc in bc, h = >esc
- rst 0x20 ; print bc
ld a,(bc)
ld l,a
- inc bc
- rst 0x28 ; print hl
rst 0x30 ; print stack
+ inc bc
jp (hl)
; math package
sl_hl_e:
ld a,e
-sl_hl_a:
and 0xf
ret z
- ld b,a
1$: add hl,hl
- djnz 1$
+ dec a
+ jr nz,1$
ret
srl_hl_e:
ld a,e
-srl_hl_a:
and 0xf
ret z
+ push bc
ld b,a
ld a,l
srl_hl_loop:
rra
djnz srl_hl_loop
ld l,a
+ pop bc
ret
sra_hl_e:
ld a,e
-sra_hl_a:
and 0xf
ret z
+ push bc
ld b,a
ld a,l
sra_hl_loop:
rra
djnz sra_hl_loop
ld l,a
+ pop bc
ret
-mul_de_hl:
+mul_hl_de:
+ push bc
ld a,h
ld c,l
ld hl,0
jr nc,4$
add hl,de
4$: djnz 3$
+ pop bc
+ ret
+
+div_hl_de:
+ push bc
+ ld a,h
+ ld c,l
+ ld hl,0
+ ld b,8
+1$: rla
+ adc hl,hl
+ sbc hl,de
+ jr nc,2$
+ add hl,de
+2$: djnz 1$
+ rla
+ cpl
+ push af
+ ld a,c
+ ld b,8
+3$: rla
+ adc hl,hl
+ sbc hl,de
+ jr nc,4$
+ add hl,de
+4$: djnz 3$
+ rla
+ cpl
+ pop de
+ ld e,a
+ pop bc
ret