; PC: instruction pointer (native code) ; SP: combined return and data stack ; DEHL: i32 bit top value ; HL: i8 bit top value ; A: i8 top value ; A,Z: boolean value ; - no top value ; BC: preserved: local variable(s) ; IX: tbd. ; IY: tbd. ; AF': tbd. ; exx: tbd. ; ========================================= ; immediate values ; ========================================= ; ----------------------------------------- ; ival ( -- i8 ) .macro ival_c &value if &value ld a, &value else xor a endif .endm ; ----------------------------------------- ; ival ( -- i1 ) .macro ival_b &value if &value xor a inc a else xor a endif .endm ; ========================================= ; global variables ; ========================================= ; ----------------------------------------- ; gget ( -- i8 ) .macro gget_c &address ld a, (&address) .endm ; ----------------------------------------- ; gset ( i8 -- ) .macro gset_c &address ld (&address), a .endm ; ----------------------------------------- ; gget ( -- bool ) .macro gget_b &address ld a, (&address) and a .endm ; ----------------------------------------- ; gset ( bool -- ) .macro gset_b &address ld (&address), a ; assumes z <=> a=0 .endm ; ========================================= ; stack ; ========================================= ; ----------------------------------------- ; push ( i8 -- ) .macro push_c push af ; high byte! .endm ; ----------------------------------------- ; pop ( -- i8 ) .macro pop_c pop af ; high byte! .endm ; ----------------------------------------- ; push ( i1 -- ) .macro push_b push af ; z flag! .endm ; ----------------------------------------- ; pop ( -- i1 ) .macro pop_b pop af ; z flag! .endm ; ========================================= ; i8 arithmetics ; ========================================= ; ----------------------------------------- ; neg ( i8 -- i8 ) .macro neg_c neg .endm ; ----------------------------------------- ; cpl ( i8 -- i8 ) .macro cpl_c cpl .endm ; ----------------------------------------- ; sign ( i8 -- i8 ) .macro sign_c and a jr z,$+6 add a ; vz => cy sbc a ; cy => a=255 & cy; nc => a=0 & nc or 1 .endm ; ----------------------------------------- ; abs ( i8 -- i8 ) .macro abs_c and a jp p,$+5 neg .endm ; ----------------------------------------- ; sl1 ( i8 -- i8 ) .macro sl1_c add a,a .endm ; ----------------------------------------- ; sr1 ( i8 -- i8 ) .macro sru1_c srl a .endm ; ----------------------------------------- ; sr1 ( i8 -- i8 ) .macro srs1_c sra a .endm ; ----------------------------------------- ; add ( i8 i8 -- i8 ) .macro add_c pop de ; d = op1 add a,d .endm .macro addi_c &value add a, &value .endm .macro incr_c inc a .endm ; ----------------------------------------- ; sub ( i8 i8 -- i8 ) .macro sub_c ld d,a ; d = op2 pop af ; a = op1 sub a,d .endm .macro subi_c &value sub a, &value .endm .macro decr_c dec a .endm ; ----------------------------------------- ; and ( i8 i8 -- i8 ) .macro and_c pop de and a,d .endm .macro andi_c &value and a,&value .endm ; ----------------------------------------- ; or ( i8 i8 -- i8 ) .macro or_c pop de or a,d .endm .macro ori_c &value or a,&value .endm ; ----------------------------------------- ; xor ( i8 i8 -- i8 ) .macro xor_c pop de xor a,d .endm .macro xori_c &value xor a,&value .endm ; ----------------------------------------- ; min ( i8 i8 -- i8 ) .macro min_u8 pop de ; d = op1 cp d jr nc,$+3 ld a,d .endm .macro min_i8 pop de ; d = op1 cp d jp po,$+4 ld a,d .endm ; ----------------------------------------- ; max ( i8 i8 -- i8 ) .macro max_u8 pop de ; d = op1 cp d jr c,$+3 ld a,d .endm .macro max_i8 pop de ; d = op1 cp d jp pe,$+4 ld a,d .endm ; ----------------------------------------- ; mul ( i8 i8 -- i8 ) .macro mul_c pop de call _mul_da_a .endm .macro muli_c &value ld d, &value call _mul_da_a .endm .macro mul2_c add a .endm .macro mul3_c ld d,a add a add d .endm .macro mul4_c add a add a .endm .macro mul5_c ld d,a add a add a add d .endm .macro mul6_c add a ld d,a add a add d .endm .macro mul7_c ld d,a add a add a add a sub d .endm .macro mul8_c add a add a add a .endm .macro mul9_c ld d,a add a add a add a add d .endm .macro mul10_c add a ld d,a add a add a add d .endm .macro mul11_c ld e,a add a add a ld d,a add a add d sub e .endm .macro mul12_c add a add a ld d,a add a add d .endm .macro mul13_c ld e,a add a add a ld d,a add a add d add e .endm .macro mul14_c add a ld d,a add a add a add a sub d .endm .macro mul15_c ld d,a add a add a add a add a sub d .endm .macro mul16_c add a add a add a add a .endm ; ----------------------------------------- ; div ( i8 i8 -- i8 ) .macro divu_c pop de call _divu_da_a .endm .macro divs_c pop de call _divs_da_a .endm .macro divui_c &value ld d, &value call _divu_da_a .endm .macro divsi_c &value ld d, &value call _divs_da_a .endm ; ----------------------------------------- ; rem ( i8 i8 -- i8 ) .macro remu_c pop de call _remu_da_a .endm .macro rems_c pop de call _rems_da_a .endm .macro remui_c &value ld d, &value call _remu_da_a .endm .macro remsi_c &value ld d, &value call _rems_da_a .endm ; ========================================= ; compare ; ========================================= ; variants for signed and unsigned ; variants which always set cy and ; variants which just set any flag ; ----------------------------------------- ; eq ( i8 i8 -- flag ) .macro eq_i8 pop de ; d = op1 sub d ; eq => a=0 sub 1 ; eq => cy .endm .macro ne_i8 pop de ; d = op1 sub d ; ne => a>0 add 255 ; ne => cy .macro .macro eq_i8_z pop de ; d = op1 sub d ; eq => a=0, z=1 .endm .macro ne_i8_nz pop de ; d = op1 sub d ; ne => a>0, nz .macro ; ----------------------------------------- ; gt ( i8 i8 -- flag ) .macro gt_u8 pop de ; d = op1 sub d ; gt => cy .endm .macro gt_i8 pop de ; d = op1 sub d ; gt => pe scf jp pe,$+4 ccf ; gt => cy .endm .macro gt_u8_cy pop de ; d = op1 sub d ; gt => cy .endm .macro gt_i8_pe pop de ; d = op1 sub d ; gt => pe .endm ; ----------------------------------------- ; le ( i8 i8 -- flag ) .macro le_u8 pop de ; d = op1 sub d ; le => nc ccf ; le => cy .endm .macro le_i8 pop de ; d = op1 sub d ; le => po scf jp po,$+4 ccf ; le => cy .endm .macro le_u8_nc pop de ; d = op1 sub d ; le => nc .endm .macro le_i8_po pop de ; d = op1 sub d ; le => po .endm ; ----------------------------------------- ; lt ( i8 i8 -- flag ) .macro lt_u8 ld d,a ; d = op2 pop af ; a = op1 sub d ; lt => cy .endm .macro lt_i8 ld d,a ; d = op2 pop af ; a = op1 sub d ; lt => pe scf jp pe,$+4 ccf ; lt => cy .endm .macro lt_u8_cy ld d,a ; d = op2 pop af ; a = op1 sub d ; lt => cy .endm .macro lt_i8_pe ld d,a ; d = op2 pop af ; a = op1 sub d ; lt => pe .endm ; ----------------------------------------- ; ge ( i8 i8 -- flag ) .macro ge_u8 ld d,a ; d = op2 pop af ; a = op1 sub d ; ge => nc ccf ; ge => cy .endm .macro ge_i8 ld d,a ; d = op2 pop af ; a = op1 sub d ; ge => po scf jp po,$+4 ccf ; ge => cy .endm .macro ge_u8_nc ld d,a ; d = op2 pop af ; a = op1 sub d ; ge => nc .endm .macro ge_i8_po ld d,a ; d = op2 pop af ; a = op1 sub d ; ge => po .endm