ld hl,0x308
ld de,8
- ld bc,0x38 ;0x10
+ ld bc,0x30 ;0x38 ;0x10
ldir
+ pop de
call sm
; push argument
.dw 2
.db esc
- rst 0x10 ; ex bc,hl
+ ex de,hl
call print_word
jp print_crlf
add hl,sp
call print_word
call print_space
- rst 0x10 ; ex bc,hl
+ ex de,hl
call print_word
- rst 0x10 ; ex bc,hl
+ ex de,hl
call print_space
ld e,(hl)
inc hl
.org 0x308
-; ld hl,(de)+
- ex de,hl
- ld e,(hl)
+; ld hl,(bc)+
+ rst 0x10 ; ex bc,hl
+ ld c,(hl)
inc hl
- ld d,(hl)
+ ld b,(hl)
inc hl
- ex de,hl
+ rst 0x10 ; ex bc,hl
ret
.org 0x310
.org 0x318
-; print bc
- rst 0x10 ; ex bc,hl
+; print de
+ ex de,hl
call print_word
- rst 0x10 ; ex bc,hl
+ ex de,hl
jp print_space
.org 0x320
-; print de
- ex de,hl
+; print bc
+ rst 0x10 ; ex bc,hl
call print_word
- ex de,hl
+ rst 0x10 ; ex bc,hl
jp print_space
.org 0x328
sm:
pop hl
- .db 0x11 ; ld de,
+ .db 1 ; ld bc,
-dispatch_l5m1: ; pc in bc
- rst 0x10 ; ex bc,hl
+dispatch_l5m1: ; pc in de
+ ex de,hl
dispatch_l5: ; pc in hl
- pop bc
-dispatch_l6: ; tos in bc, pc in hl, d clobbered
- ld d,>esc
-dispatch_l7: ; tos in bc, pc in hl, d = >esc
+ pop de
+dispatch_l6: ; tos in de, pc in hl, b clobbered
+ ld b,>esc
+dispatch_l7: ; tos in de, pc in hl, b = >esc
rst 0x28 ; print hl
- ld e,(hl)
+ ld c,(hl)
inc hl
- ex de,hl
+ rst 0x10 ; ex bc,hl
rst 0x28 ; print hl
rst 0x30 ; print stack
jp (hl)
-dispatch_l1: ; tos in bc and hl, pc in de
- push bc
-dispatch_l2: ; tos in hl, pc in de
- ld c,l
- ld b,h
-dispatch_l3: ; tos in bc, pc in de, h clobbered
+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
+dispatch_l3: ; tos in de, pc in bc, h clobbered
ld h,>esc
-dispatch_l4: ; tos in bc, pc in de, h = >esc
- rst 0x20 ; print de
- ld a,(de)
+dispatch_l4: ; tos in de, pc in bc, h = >esc
+ rst 0x20 ; print bc
+ ld a,(bc)
ld l,a
- inc de
+ inc bc
rst 0x28 ; print hl
rst 0x30 ; print stack
jp (hl)
; 0x100
esc:
- ex de,hl
+ rst 0x10 ; ex bc,hl
jp (hl)
call_i: ; same as imm_w, call
- rst 8 ; ld hl,(de)+
- push bc
- ld c,e
- ld b,d
+ rst 8 ; ld hl,(bc)+
+ push de
+ ld e,c
+ ld d,b
jr dispatch_l6
_call:
- ex de,hl
rst 0x10 ; ex bc,hl
+ ex de,hl
jr dispatch_l6
jmp_i: ; same as imm_w, jmp
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
jr dispatch_l7
jz_i: ; same as imm_w, jz
- rst 8 ; ld hl,(de)+
- rst 0x10 ; ex bc, hl
+ rst 8 ; ld hl,(bc)+
+ ex de,hl
.db 0x3e ; ld a,
jz:
pop hl
jr dispatch_l5m1
jnz_i: ; same as imm_w, jnz
- rst 8 ; ld hl,(de)+
- rst 0x10 ; ex bc, hl
+ rst 8 ; ld hl,(bc)+
+ ex de,hl
.db 0x3e ; ld a,
jnz:
pop hl
; pop hl
; jr dispatch_l6
-jmp: ; also means ret
- ld e,c
- ld d,b
- jr dispatch_m0
-
xchg_w:
pop hl
jr dispatch_l1
dup_w:
- push bc
+ push de
jr dispatch_l4
imm_w:
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
jr dispatch_l1
-adj_isp: ; same as imm_w, adj_sp
- rst 8 ; ld hl,(de)+
- push bc
- .db 0x3e ; ld a,
-adj_sp: ; same as add_sp, st_sp
- rst 0x10 ; ex bc,hl
- add hl,sp
- .db 0x3e ; ld a,
-st_sp:
- rst 0x10 ; ex bc,hl
- ld sp,hl
- jr dispatch_mm1
-
add_isp: ; same as imm_w, add_sp
- rst 8 ; ld hl,(de)+
- push bc
+ rst 8 ; ld hl,(bc)+
+ push de
.db 0x3e ; ld a,
add_sp:
- rst 0x10 ; ex bc,hl
+ ex de,hl
add hl,sp
jr dispatch_l2
ld_iw: ; same as imm_w, ld_w
- rst 8 ; ld hl,(de)+
- push bc
+ rst 8 ; ld hl,(bc)+
+ push de
.db 0x3e ; ld a,
ld_w:
- rst 0x10 ; ex bc,hl
- ld c,(hl)
+ ex de,hl
+ ld e,(hl)
inc hl
- ld b,(hl)
+ ld d,(hl)
jr dispatch_l3
ld_isb: ; same as imm_w, ld_sb
- rst 8 ; ld hl,(de)+
- push bc
+ rst 8 ; ld hl,(bc)+
+ push de
.db 0x3e ; ld a,
ld_sb:
- rst 0x10 ; ex bc,hl
- ld c,(hl)
- ld a,c
+ ex de,hl
+ ld e,(hl)
+ ld a,e
rla
sbc a,a
- ld b,a
+ ld d,a
jr dispatch_l3
ld_iub: ; same as imm_w, ld_ub
- rst 8 ; ld hl,(de)+
- push bc
+ rst 8 ; ld hl,(bc)+
+ push de
.db 0x3e ; ld a,
ld_ub:
- rst 0x10 ; ex bc,hl
- ld c,(hl)
- ld b,0
+ ex de,hl
+ ld e,(hl)
+ ld d,0
jr dispatch_l3
+neg_w:
+ dec de
+not_w:
+ ld a,e
+ cpl
+ ld e,a
+ ld a,d
+ cpl
+ ld d,a
+ jr dispatch_l4
+
+add_iw: ; same as imm_w, add_w
+ rst 8 ; ld hl,(bc)+
+ .db 0x3e ; ld a,
+add_w:
+ pop hl
+ add hl,de
+ jr dispatch_l2
+
+; middle dispatch routines
+
+jmp: ; also means ret
+ ld c,e
+ ld b,d
+ jr dispatch_m0
+
+adj_isp: ; same as imm_w, adj_sp
+ rst 8 ; ld hl,(bc)+
+ push de
+ .db 0x3e ; ld a,
+adj_sp: ; same as add_sp, st_sp
+ ex de,hl
+ add hl,sp
+ .db 0x3e ; ld a,
+st_sp:
+ ex de,hl
+ ld sp,hl
+ jr dispatch_mm1
+
;st_ixw: ; same as imm_w, xchg_w, st_w
-; rst 8 ; ld hl,(de)+
-; ld (hl),c
+; rst 8 ; ld hl,(bc)+
+; ld (hl),e
; inc hl
-; ld (hl),b
+; ld (hl),d
; jr dispatch_mm1
st_iw: ; same as imm_w, st_w
- rst 8 ; ld hl,(de)+
- rst 0x10 ; ex bc,hl
+ rst 8 ; ld hl,(bc)+
+ ex de,hl
.db 0x3e ; ld a,
st_w:
pop hl
- ld (hl),c
+ ld (hl),e
inc hl
- ld (hl),b
+ ld (hl),d
jr dispatch_mm1
-st_ixb: ; same as imm_w, xchg_w, st_b
- rst 8 ; ld hl,(de)+
+st_ixb: ; same as imm_w, xchg_w, st_d
+ rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
-st_b:
+st_d:
pop hl
- ld (hl),c
+ ld (hl),e
jr dispatch_mm1
-neg_w:
- dec bc
-not_w:
- ld a,c
- cpl
- ld c,a
- ld a,b
- cpl
- ld b,a
- jr dispatch_l4
-
; middle dispatcher, near 0x180, smaller in size
; used for store-type routines that empty stack and need it to be popped
-dispatch_mm1: ; pc in de
+dispatch_mm1: ; pc in bc
ld h,>esc
-dispatch_m0: ; pc in de, h = >esc
- pop bc
+dispatch_m0: ; pc in bc, h = >esc
+ pop de
dispatch_m4:
- rst 0x20 ; print de
- ld a,(de)
+ rst 0x20 ; print bc
+ ld a,(bc)
ld l,a
- inc de
+ inc bc
rst 0x28 ; print hl
rst 0x30 ; print stack
jp (hl)
-add_iw: ; same as imm_w, add_w
- rst 8 ; ld hl,(de)+
- .db 0x3e ; ld a,
-add_w:
- pop hl
- add hl,bc
- jr dispatch_u2
-
;sub_iw: ; same as imm_w, sub_w
-; rst 8 ; ld hl,(de)+
+; rst 8 ; ld hl,(bc)+
; .db 0x3e ; ld a,
sub_xw: ; same as xchg_w, sub_w
pop hl
sub_w: ; same as neg_w, add_w
pop hl
or a
- sbc hl,bc
+ sbc hl,de
jr dispatch_u2
mul_iw:
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
mul_w:
pop hl
- push de
- call mul_bc_hl
- pop de
+ push bc
+ call mul_de_hl
+ pop bc
jr dispatch_u2
eq_iw: ; same as imm_w, eq_w
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
eq_w:
pop hl
sub a
- sbc hl,bc
- ld c,a
- ld b,a
+ sbc hl,de
+ ld e,a
+ ld d,a
jr nz,dispatch_u3
- inc c
+ inc e
jr dispatch_u3
lt_iuw: ; same as imm_w, lt_iuw
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
gt_uw: ; same as xchg_w, lt_uw
pop hl
- rst 0x10 ; ex bc,hl
+ ex de,hl
.db 0x3e ; ld a,
lt_uw:
pop hl
sub a
- sbc hl,bc
- ld b,a
+ sbc hl,de
+ ld d,a
adc a,a
- ld c,a
+ ld e,a
jr dispatch_u3
lt_isw: ; same as imm_w, lt_isw
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
gt_sw: ; same as xchg_w, lt_sw
pop hl
- rst 0x10 ; ex bc,hl
+ ex de,hl
.db 0x3e ; ld a,
lt_sw:
pop hl
sub a
- sbc hl,bc
- ld b,a
+ sbc hl,de
+ ld d,a
jp pe,lt_sw_overflow
add hl,hl
adc a,a
- ld c,a
+ ld e,a
jr dispatch_u3
lt_sw_overflow:
add hl,hl
ccf
adc a,a
- ld c,a
+ ld e,a
jr dispatch_u3
and_iw: ; same as imm_w, and_w
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
and_w:
pop hl
ld a,l
- or c
- ld c,a
+ or e
+ ld e,a
ld a,h
- or b
- ld b,a
+ or d
+ ld d,a
jr dispatch_u3
or_iw: ; same as imm_w, and_w
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
or_w:
pop hl
ld a,l
- or c
- ld c,a
+ or e
+ ld e,a
ld a,h
- or b
- ld b,a
+ or d
+ ld d,a
jr dispatch_u3
xor_iw: ; same as imm_w, and_w
- rst 8 ; ld hl,(de)+
+ rst 8 ; ld hl,(bc)+
.db 0x3e ; ld a,
xor_w:
pop hl
ld a,l
- xor c
- ld c,a
+ xor e
+ ld e,a
ld a,h
- xor b
- ld b,a
+ xor d
+ ld d,a
jr dispatch_u3
sl_w:
pop hl
- call sl_hl_c
+ push bc
+ call sl_hl_e
+ pop bc
jr dispatch_u2
sr_uw:
pop hl
- call srl_hl_c
+ push bc
+ call srl_hl_e
+ pop bc
jr dispatch_u2
sr_sw:
pop hl
- call sra_hl_c
+ push bc
+ call sra_hl_e
+ pop bc
jr dispatch_u2
; upper dispatcher, after 0x200
-dispatch_u1: ; tos in bc and hl, pc in de
- push bc
-dispatch_u2: ; tos in hl, pc in de
- ld c,l
- ld b,h
-dispatch_u3: ; tos in bc, pc in de, h clobbered
+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
+dispatch_u3: ; tos in de, pc in bc, h clobbered
ld h,>esc
-dispatch_u4: ; tos in bc, pc in de, h = >esc
- rst 0x20 ; print de
- ld a,(de)
+dispatch_u4: ; tos in de, pc in bc, h = >esc
+ rst 0x20 ; print bc
+ ld a,(bc)
ld l,a
- inc de
+ inc bc
rst 0x28 ; print hl
rst 0x30 ; print stack
jp (hl)
; math package
-sl_hl_c:
- ld a,c
+sl_hl_e:
+ ld a,e
sl_hl_a:
and 0xf
ret z
djnz 1$
ret
-srl_hl_c:
- ld a,c
+srl_hl_e:
+ ld a,e
srl_hl_a:
and 0xf
ret z
ld l,a
ret
-sra_hl_c:
- ld a,c
+sra_hl_e:
+ ld a,e
sra_hl_a:
and 0xf
ret z
ld l,a
ret
-mul_bc_hl:
- ex de,hl
-mul_bc_de:
+mul_de_hl:
+ ld a,h
+ ld c,l
ld hl,0
- ld a,b
ld b,8
1$: add hl,hl
rla