Rev 49 | Blame | Compare with Previous | Last modification | View Log | Download
TRUE=0xffFALSE=0x00_JPHL.EXPORT _JPHL.jp (hl);l << e;out: l_SHLB.EXPORT _SHLB.;inc edec eret zld b,esla ldjnz $-2ret;hl << de;out: hl_SHL.EXPORT _SHL.inc edec eret zld b,eadd hl,hldjnz $-1ret;hl, de << bc, ix;out: hl(high), de(low)_SHLLONG.EXPORT _SHLLONG.ld b,lxinc bdec bret zex de,hladd hl,hlrl erl ddjnz $-2-2-1ex de,hlret;l >> e;out: l_SHRB.EXPORT _SHRB.inc edec eret zld b,esrl ldjnz $-2ret;ld h,0;hl >> de;out: hl_SHR.EXPORT _SHR.inc edec eret zld b,esrl hrr ldjnz $-2-2ret;hl >> de;out: hl_SHRSIGNED.EXPORT _SHRSIGNED.inc edec eret zld b,esra hrr ldjnz $-2-2ret;hl, de >> bc, ix;out: hl(high), de(low)_SHRLONG.EXPORT _SHRLONG.ld b,lxinc bdec bret zsrl hrr lrr drr edjnz $-2-2-2-2ret;l * e;out: l_MULB.EXPORT _MULB.xor ald b,8_MULB0.add a,arl ljr nc,$+3add a,edjnz _MULB0.ld l,aret;hl * de;out: hl_MULSIGNED.EXPORT _MULSIGNED.;signed mul is equal to unsigned mul;bit 7,h;jr z,_MUL.;xor a;sub l;ld l,a;sbc a,h;sub l;ld h,a;call _MUL.;xor a;sub l;ld l,a;sbc a,h;sub l;ld h,a;ret;hl * de;out: hl_MUL.EXPORT _MUL.ld a,hld c,lld hl,0ld b,16_MUL0.add hl,hlrl crlajr nc,$+3add hl,dedjnz _MUL0.ret;hl, de * bc, ix;out: hl(high), de(low)_MULLONG.EXPORT _MULLONG.;signed mul is equal to unsigned mul;hlde*bcix = hlde*b000 + hlde*c00 + hlde*i0 + hlde*xld a,lxpush af ;lxpush ix ;hxld a,cpush af ;cld a,b;bcde <= hlde:ld b,hld c,l;hlix <= 0ld hl,0;ld ix,0push hlpop ixcall _MULLONGP. ;hlix = (hlix<<8) + "b*hlde"pop af ;ccall _MULLONGP. ;hlix = (hlix<<8) + "c*hlde"pop af ;hxcall _MULLONGP. ;hlix = (hlix<<8) + "hx*hlde"pop af ;lxcall _MULLONGP. ;hlix = (hlix<<8) + "lx*hlde"push ixpop deret;hlix = (hlix<<8) + a*bcde_MULLONGP.exxld b,8_MULLONG0.exxadd ix,ixadc hl,hlrlajr nc,$+2+2+2add ix,deadc hl,bcexxdjnz _MULLONG0. ;ьюцэю яю a==0 (яхЁт√щ тїюф ё scf:rla, фрыхх add a,a)exxret;l / e;out: l_DIVB.EXPORT _DIVB.ld h,0ld d,h;ret;hl / de;out: hl_DIV.EXPORT _DIV.ld c,hld a,lld hl,0ld b,16;don't mind carry_DIV0.;shift left hlcarlarl cadc hl,hl;no carry;try subsbc hl,dejr nc,$+3add hl,de;carry = inverted bit of resultdjnz _DIV0.rlacplld l,ald a,crlacplld h,aret;hl / de;out: hl_DIVSIGNED.EXPORT _DIVSIGNED.ld a,hxor dpush af;bit 7,h;call nz,invhl.ld a,hrlacall c,invhl.;jr z,$+2+6;xor a;sub l;ld l,a;sbc a,h;sub l;ld h,a;hl>=0;bit 7,d;jr z,$+2+6ld a,drlajr nc,$+2+6xor asub eld e,asbc a,dsub eld d,a;de>=0call _DIV.pop afret p;zinvhl.xor asub lld l,asbc a,hsub lld h,aret;hl, de / bc, ix;out: hl(high), de(low)_DIVLONG.EXPORT _DIVLONG.;unsigned!!!;hl'hl,de'de <= hlde,bcix:push bcexxpop de ;de' = "bc_in"ld hl,0exxld a,eex af,af' ;e_inpush de ;d_inld c,l ;l_inld a,h ;h_inld hl,0push ixpop de ;de = "ix_in";a="h_in";hl'hla <= 0000h_incall _DIVLONGP. ;"h"ld b,c ;"l_in"ld c,a ;"h"ld a,b ;a="l_in";hl'hla <= 000hl_incall _DIVLONGP. ;"l"ld b,a ;"l"pop af ;a="d_in"push bc ;b="l";hl'hla <= 00hld_incall _DIVLONGP. ;"d"ex af,af' ;a="e_in", a'="d";a="e_in";hl'hla <= 0hlde_incall _DIVLONGP. ;"e"ld e,a ;"e"ex af,af' ;"d"ld d,apop hl ;h="l"ld l,hld h,c ;"h"ret;a = hl'hla/de'de;c not used_DIVLONGP.;do 8 bitsld b,8_DIVLONG0.;shift left hl'hlarlaadc hl,hlexxadc hl,hlexx;no carry;try subsbc hl,deexxsbc hl,deexxjr nc,$+2+1+1+2+1add hl,deexxadc hl,deexx;carry = inverted bit of resultdjnz _DIVLONG0.rlacplret