$title (extended math routine) $mod51 $nolist $nosymbols $include(z80.inc) $include(mymon.inc) $include(controls.inc) $list temp data 22h Z equ 0D5h ; zero flag M equ 0e7h ; negative flag if(school=1) org 7800h else org 0f800h endif eadd: ljmp exadd esub: ljmp exsub emul: ljmp exmul ediv: ljmp exdiv ;============================================================================= ; HL = HL + DE EXADD: mov a,Hreg xrl a,Dreg anl a,#80h ; clear sign dadd jnz esign rrc a xrl a,Hreg rlc a jnc esign call overflow ;set sign and zero flags to reflect HL esign: clr c clr a add a,Hreg jz esgn1 ret esgn1: add a,Lreg jnz esgn2 ret esgn2: clr a clr c inc a ret ;============================================================================= ; HL = HL - DE EXSUB: pushde xchg NEGHL call exadd popde ret ;============================================================================= ; HL = HL * DE EXMUL: pushbc pushde call rsltsign ; b = sign of result mov a,Hreg ; get hi byte jz hlsmall ; if 8 bit ok mov a,Dreg ; get hi byte jz exm1 ; if 8 bit ok call overflow exm1: xchg hlsmall: mov a,Lreg ; get multiplier mov Lreg,#0 ; clear result mov Hreg,#0 xmloop: clr c rrc a push acc push psw clr a rrc a add a,#30h lcall sndchr pop psw pop acc jnc shiftop ; if no carry * 2 dadd ; * 1 jnc shiftop lcall overflow shiftop: xchg dadh jnc emx2 lcall overflow emx2: xchg jnz xmloop popde signrcl: mov a,Hreg rlc a jnc srcl1 call overflow srcl1: mov a,Breg rlc a ; get result sign jnc srcl2 NEGHL srcl2: popbc jmp esign ;============================================================================= ; HL = HL / DE EXDIV: pushbc ; save BC pair clr a clr c orl a,Ereg orl a,Dreg jnz ed1 call overflow ed1: call rsltsign mov a,Hreg orl a,Dreg rlc a jnc ed2 call overflow ed2: pushbc mov a,Ereg mov Creg,a mov a,Dreg mov Breg,a mov Dreg,#0 mov Ereg,#0 pushde xchg mov Hreg,#0 mov Lreg,#1 dbldiv: dadh xchg dadh call cmpbh xchg jnc dbldiv xchg hafdiv: xchg call divby2 jb Z,divdun xchg call divby2 call cmpbh jb M,hafdiv clr c mov a,Creg subb a,Lreg mov Creg,a mov a,Breg subb a,Hreg mov Breg,a XTHL DADD XTHL sjmp hafdiv divdun: pophl mov a,Creg mov Ereg,a ; remainder mov a,Breg mov Dreg,a popbc jmp signrcl ; compute sign of result for exmul and exdiv RSLTSIGN: mov a,Hreg mov Breg,a rlc a ; shift sign to carry jnc rslt1 ; is positive NEGHL ; 2's compliment rslt1: xchg mov a,Hreg xrl a,Breg ; xor both sign bits mov Breg,a ; save mov a,Hreg rlc a jnc rs2 NEGHL rs2: ret CMPBH: CLR C MOV a,Creg SUBB a,Lreg mov a,Breg subb a,Hreg ret ; divide HL pair by 2 (CHECKED) divby2: clr C mov a,Hreg rrc a mov Hreg,a mov a,Lreg rrc a mov Lreg,a orl a,Hreg clr Z jnz db2 setb Z db2: ret ; overflow: lcall ilprt db cr,lf,7,'Overflow @',0 xthl mov dph,r7 mov dpl,r6 xthl lcall prtaddr lcall ilprt db 'HL: ',0 mov dph,r7 mov dpl,r6 lcall prtaddr mov a,#' ' lcall sndchr lcall ilprt db 'DE: ',0 mov dpl,4 mov dph,5 lcall prtaddr lcall crlf setb ov pop acc pop acc ljmp warm lastcode equ $ end