.area SM (abs,ovr) .org 0x100 ld hl,0x308 ld de,8 ld bc,0x38 ;0x10 ldir call sm ; push argument .db esc dispatch_l7: ; tos in bc, pc in hl, d = >esc rst 0x28 ; print hl ld e,(hl) inc hl ex de,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 ld h,>esc dispatch_l4: ; tos in bc, pc in de, h = >esc rst 0x20 ; print de ld a,(de) ld l,a inc de rst 0x28 ; print hl rst 0x30 ; print stack jp (hl) ; 0x100 esc: ex de,hl jp (hl) call_i: ; same as imm_w, call rst 8 ; ld hl,(de)+ push bc ld c,e ld b,d jr dispatch_l6 _call: ex de,hl rst 0x10 ; ex bc,hl jr dispatch_l6 jmp_i: ; same as imm_w, jmp rst 8 ; ld hl,(de)+ jr dispatch_l7 jz_i: ; same as imm_w, jz rst 8 ; ld hl,(de)+ rst 0x10 ; ex bc, hl .db 0x3e ; ld a, jz: pop hl ld a,l or h jr nz,dispatch_mm1 jr dispatch_l5m1 jnz_i: ; same as imm_w, jnz rst 8 ; ld hl,(de)+ rst 0x10 ; ex bc, hl .db 0x3e ; ld a, jnz: pop hl ld a,l or h jr z,dispatch_mm1 jr dispatch_l5m1 ;jmp_x: ; same as xchg_w, jmp ; 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 jr dispatch_l4 imm_w: rst 8 ; ld hl,(de)+ 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 .db 0x3e ; ld a, add_sp: rst 0x10 ; ex bc,hl add hl,sp jr dispatch_l2 ld_iw: ; same as imm_w, ld_w rst 8 ; ld hl,(de)+ push bc .db 0x3e ; ld a, ld_w: rst 0x10 ; ex bc,hl ld c,(hl) inc hl ld b,(hl) jr dispatch_l3 ld_isb: ; same as imm_w, ld_sb rst 8 ; ld hl,(de)+ push bc .db 0x3e ; ld a, ld_sb: rst 0x10 ; ex bc,hl ld c,(hl) ld a,c rla sbc a,a ld b,a jr dispatch_l3 ld_iub: ; same as imm_w, ld_ub rst 8 ; ld hl,(de)+ push bc .db 0x3e ; ld a, ld_ub: rst 0x10 ; ex bc,hl ld c,(hl) ld b,0 jr dispatch_l3 ;st_ixw: ; same as imm_w, xchg_w, st_w ; rst 8 ; ld hl,(de)+ ; ld (hl),c ; inc hl ; ld (hl),b ; jr dispatch_mm1 st_iw: ; same as imm_w, st_w rst 8 ; ld hl,(de)+ rst 0x10 ; ex bc,hl .db 0x3e ; ld a, st_w: pop hl ld (hl),c inc hl ld (hl),b jr dispatch_mm1 st_ixb: ; same as imm_w, xchg_w, st_b rst 8 ; ld hl,(de)+ .db 0x3e ; ld a, st_b: pop hl ld (hl),c 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 ld h,>esc dispatch_m0: ; pc in de, h = >esc pop bc dispatch_m4: rst 0x20 ; print de ld a,(de) ld l,a inc de 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)+ ; .db 0x3e ; ld a, sub_xw: ; same as xchg_w, sub_w pop hl rst 0x10 .db 0x3e ; ld a, sub_w: ; same as neg_w, add_w pop hl or a sbc hl,bc jr dispatch_u2 mul_iw: rst 8 ; ld hl,(de)+ .db 0x3e ; ld a, mul_w: pop hl push de call mul_bc_hl pop de jr dispatch_u2 eq_iw: ; same as imm_w, eq_w rst 8 ; ld hl,(de)+ .db 0x3e ; ld a, eq_w: pop hl sub a sbc hl,bc ld c,a ld b,a jr nz,dispatch_u3 inc c jr dispatch_u3 lt_iuw: ; same as imm_w, lt_iuw rst 8 ; ld hl,(de)+ .db 0x3e ; ld a, gt_uw: ; same as xchg_w, lt_uw pop hl rst 0x10 ; ex bc,hl .db 0x3e ; ld a, lt_uw: pop hl sub a sbc hl,bc ld b,a adc a,a ld c,a jr dispatch_u3 lt_isw: ; same as imm_w, lt_isw rst 8 ; ld hl,(de)+ .db 0x3e ; ld a, gt_sw: ; same as xchg_w, lt_sw pop hl rst 0x10 ; ex bc,hl .db 0x3e ; ld a, lt_sw: pop hl sub a sbc hl,bc ld b,a jp pe,lt_sw_overflow add hl,hl adc a,a ld c,a jr dispatch_u3 lt_sw_overflow: add hl,hl ccf adc a,a ld c,a jr dispatch_u3 and_iw: ; same as imm_w, and_w rst 8 ; ld hl,(de)+ .db 0x3e ; ld a, and_w: pop hl ld a,l or c ld c,a ld a,h or b ld b,a jr dispatch_u3 or_iw: ; same as imm_w, and_w rst 8 ; ld hl,(de)+ .db 0x3e ; ld a, or_w: pop hl ld a,l or c ld c,a ld a,h or b ld b,a jr dispatch_u3 xor_iw: ; same as imm_w, and_w rst 8 ; ld hl,(de)+ .db 0x3e ; ld a, xor_w: pop hl ld a,l xor c ld c,a ld a,h xor b ld b,a jr dispatch_u3 sl_w: pop hl call sl_hl_c jr dispatch_u2 sr_uw: pop hl call srl_hl_c jr dispatch_u2 sr_sw: pop hl call sra_hl_c 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 ld h,>esc dispatch_u4: ; tos in bc, pc in de, h = >esc rst 0x20 ; print de ld a,(de) ld l,a inc de rst 0x28 ; print hl rst 0x30 ; print stack jp (hl) ; math package sl_hl_c: ld a,c sl_hl_a: and 0xf ret z ld b,a 1$: add hl,hl djnz 1$ ret srl_hl_c: ld a,c srl_hl_a: and 0xf ret z ld b,a ld a,l srl_hl_loop: srl h rra djnz srl_hl_loop ld l,a ret sra_hl_c: ld a,c sra_hl_a: and 0xf ret z ld b,a ld a,l sra_hl_loop: sra h rra djnz sra_hl_loop ld l,a ret mul_bc_hl: ex de,hl mul_bc_de: ld hl,0 ld a,b ld b,8 1$: add hl,hl rla jr nc,2$ add hl,de 2$: djnz 1$ ld a,c ld b,8 3$: add hl,hl rla jr nc,4$ add hl,de 4$: djnz 3$ ret