NAME CFLDA CSEG PUBLIC CFLDA EXTRN C@PUSH,C@POP,C@ACC0,C@ZERO CFLDA: CALL C@PUSH MOV E,M ;GET OP 0 INX H MOV D,M ;GET OP 1 INX H MOV B,M ;GET OP 2S MOV A,B ORI 80H MOV C,A MOV A,B ANI 80H MOV B,A INX H MOV A,M ;GET OP E ANA A JZ C@ZERO LXI H,C@ACC0 MOV M,E ;STORE ACC 0 INX H MOV M,D ;STORE ACC 1 INX H MOV M,C ;STORE ACC 2 INX H MOV M,B ;STORE ACC S INX H MOV M,A ;STORE ACC E CALL C@POP RET END NAME CFSTA CSEG PUBLIC CFSTA EXTRN C@PUSH,C@POP,C@ACC0 CFSTA: CALL C@PUSH LXI H,C@ACC0 MOV E,M ;GET ACC 0 INX H MOV D,M ;GET ACC 1 INX H MOV A,M ;GET ACC 2 ANI 7FH INX H ORA M ;GET ACC S INX H MOV B,M ;GET ACC E POP H PUSH H MOV M,E ;STORE OP 0 INX H MOV M,D ;STORE OP 1 INX H MOV M,A ;STORE OP 2S INX H MOV M,B ;STORE OP E CALL C@POP RET END NAME CFXCHG CSEG PUBLIC CFXCHG EXTRN C@PUSH,C@POP,C@ACC0 CFXCHG: CALL C@PUSH LXI B,C@ACC0 MOV E,M ;GET OP 0 LDAX B ;GET ACC 0 MOV M,A ;STORE OP 0 MOV A,E STAX B ;STORE ACC 0 INX H INX B MOV E,M ;GET OP 1 LDAX B ;GET ACC 1 MOV M,A ;STORE IN OP 1 MOV A,E STAX B ;STORE IN ACC 1 INX H INX B MOV E,M ;GET OP 2S LDAX B ;GET ACC 2 ANI 7FH MOV D,A MOV A,E ORI 80H STAX B ;STORE ACC 2 INX B LDAX B ;GET ACC S ORA D MOV M,A ;STORE OP 2S MOV A,E ANI 80H STAX B ;STORE ACC S INX H INX B MOV E,M ;GET OP E LDAX B ;GET ACC E MOV M,A ;STORE OP E MOV A,E STAX B ;STORE ACC E CALL C@POP RET END NAME CFCMA CSEG PUBLIC CFCMA EXTRN C@ACCE,C@ACCS CFCMA: PUSH PSW LDA C@ACCE ANA A JZ CFCMA0 LDA C@ACCS XRI 80H CFCMA0: STA C@ACCS POP PSW RET END NAME CFCMP CSEG PUBLIC CFCMP EXTRN C@PUSH,C@ACCE CFCMP: CALL C@PUSH LXI B,C@ACCE INX H INX H INX H LDAX B ORA M JZ SAME ;BOTH ZERO DCX B DCX H MOV D,M ;GET OP 2S LDAX B ;GET ACC S MOV E,A XRA D ;OP S JM DIFSGN INX H INX B LDAX B ;GET ACC E SUB M ;OP E JC DIFF JNZ DIFF DCX H DCX B DCX B LDAX B ;GET ACC 2 ANI 7FH ORA E ;MAKE IT LOOK THE SAME AS SUB D ;OP 2S JC DIFF JNZ DIFF DCX H DCX B LDAX B ;GET ACC 1 SUB M ;OP 1 JC DIFF JNZ DIFF DCX H DCX B LDAX B ;GET ACC 0 SUB M ;OP 0 JC DIFF JZ SAME DIFF: RAR DIFSGN: XRA D ;CHANGE SENSE OF RESULT IF NEG ORI 1 ;CAN'T LEAVE ZERO SAME: POP H POP B MOV A,B ;DON'T POP FLAGS POP B POP D RET END NAME CFADD CSEG PUBLIC CFSUB,CFADD,C@EXIT,C@AD10,C@RSH,C@ZERO,C@ROND,C@OVFL EXTRN C@PUSH,C@POP,C@ACCS,C@ACC0,C@ACC1,C@ACC2,C@ACCE,CFLDA CFSUB: CALL C@PUSH MVI A,80H JMP SUB1 CFADD: CALL C@PUSH XRA A SUB1: MOV E,M ;GET OP 0 INX H MOV D,M ;GET OP 1 INX H XRA M ;GET OP 2S - CHANGE SIGN IF SUB MOV C,A INX H MOV B,M ;GET OP E MOV A,B ANA A JZ NOCHNG ;ADD OR SUB ZERO MOV L,C MOV A,C ORI 80H MOV C,A ;C NOW IN STD FORM MOV A,L ANI 80H LXI H,C@ACCS XRA M STA SF ;SUBTRACT FLAG INX H MOV A,M ;GET ACC E ANA A JZ ADD17 ;ACC = 0 SUB B ;(ACC E) - (OP E) JC ADD2 ;OP > ACC JM NOCHNG ;OP IS INSIGNIFICANT CPI 25 JC ADD3 JMP NOCHNG ;OP IS INSIGNIFICANT ADD2: JP ADD17 ;ACC IS INSIGNIFICANT CPI -25 JC ADD17 ;ACC IS INSIGNIFICANT MOV M,B ;STORE ACC E MOV B,A LDA SF DCX H XRA M ;ACC S MOV M,A ;STORE ACC S XRA A SUB B ;A = POS DIFF OF EXPS DCX H ;PREPARE TO SWOP OPERANDS MOV B,M ;GET ACC2 MOV M,C ;STORE ACC 2 MOV C,B DCX H MOV B,M ;GET ACC 1 MOV M,D ;STORE ACC 1 MOV D,B DCX H MOV B,M ;GET ACC 0 MOV M,E ;STORE ACC 0 MOV E,B ADD3: CALL C@RSH ;RIGHT SHIFT THE SMALLER ONE A TIMES LXI H,C@ACC0 LDA SF ANA A JM ADD9 ;SUBTRACT REQUIRED ;*************************** ADDITION MOV A,M ;GET ACC 0 ADD E ;ADD OP 0 MOV E,A INX H MOV A,M ;GET ACC 1 ADC D ;ADD OP 1 MOV D,A INX H MOV A,M ;GET ACC 2 ADC C ;ADD OP 2 MOV C,A JNC ADD11 ;*************************** CARRY SO RT SHFT 1 RAR MOV C,A MOV A,D RAR MOV D,A MOV A,E RAR MOV E,A RAR MOV B,A ;B MSB HOLD EXTRA BIT FOR ROUNDING INX H INX H INR M ;INCR ACC E JZ C@OVFL ;EXPONENT OVERFLOW JMP ADD11 ;*************************** SUBTRACTION ADD9: XRA A SUB B MOV B,A MOV A,M ;GET ACC 0 SBB E ;SUB OP 0 MOV E,A INX H MOV A,M ;GET ACC 1 SBB D ;SUB OP 1 MOV D,A INX H MOV A,M ;GET ACC 2 SBB C ;SUB OP 2 MOV C,A C@AD10: CC COMP ;IF NEG THEN COMPLIMENT CP NORM ;NORMALIZE IF NECESSARY JP C@ZERO ;RESULT IS ZERO ADD11: CALL C@ROND ;ROUND IN BIT IN B JZ C@OVFL ;EXPONENT OVERFLOW C@EXIT: LXI H,C@ACC0 MOV M,E ;STORE ACC 0 INX H MOV M,D ;STORE ACC 1 INX H MOV M,C ;STORE ACC 2 NOCHNG: CALL C@POP RET ADD17: LDA SF LXI H,C@ACCS XRA M XTHL CALL CFLDA XTHL MOV M,A JMP NOCHNG C@ROND: MVI A,1 ORA B RP ;NO ROUNDING TO DO INR E RNZ ;NO PROPAGATION INR D RNZ ;NO PROPAGATION INR C RNZ ;NO PROPAGATION MVI C,80H ;REPLACE BIT IN C LXI H,C@ACCE INR M ;AND CHANGE EXP RET ;RETURN WITH ZERO INDICATES OVERFLOW COMP: LXI H,C@ACCS MOV A,M XRI 80H MOV M,A XRA A MOV L,A ;A USEFULL ZERO SUB B MOV B,A MOV A,L SBB E MOV E,A MOV A,L SBB D MOV D,A MOV A,L SBB C MOV C,A RET NORM: MVI L,32 NORM1: MOV A,C ANA A JNZ NORM3 MOV C,D MOV D,E ;AT LEAST 8 BITS TO GO - MOV E,B ; - SO MOVE WHOLE REGS MOV B,A ;A WILL BE ZERO MOV A,L SUI 8 MOV L,A JNZ NORM1 RET NORM2: DCR L MOV A,B RAL MOV B,A MOV A,E RAL MOV E,A MOV A,D RAL MOV D,A MOV A,C ADC A ;RAL DOESN'T SET M FLAG MOV C,A NORM3: JP NORM2 MOV A,L SUI 32 LXI H,C@ACCE ADD M MOV M,A RZ RAR ANA A ;SET P FLAG TO INDICATE NUMBER TOO SMALL RET C@RSH: MVI B,0 ;SUBRTN MOVES CDEB RIGHT A PLACES MVI L,8 RSH1: CMP L JM RSH2 MOV B,E MOV E,D ;AT LEAST 8 PLACES - MOV D,C ; - SO MOVE WHOLE REGS MVI C,0 ; - AND FILL WITH ZEROS SUB L JNZ RSH1 RSH2: ANA A RZ MOV L,A RSH3: ANA A MOV A,C RAR MOV C,A MOV A,D RAR MOV D,A MOV A,E RAR MOV E,A MOV A,B RAR MOV B,A DCR L JNZ RSH3 RET C@OVFL: LXI D,0FFFFH MOV C,E MOV A,D STA C@ACCE JMP C@EXIT C@ZERO: XRA A STA C@ACCS LXI D,0 JMP C@OVFL+3 DSEG SF: DS 1 END NAME CFMULT CSEG PUBLIC CFMULT,CFDIV EXTRN C@PUSH,C@EXIT,C@ZERO,C@ROND,C@OVFL,C@ACC0,C@ACC1,C@ACC2,C@ACCS,C@ACCE CFMULT: CALL C@PUSH MOV E,M ;GET OP 0 INX H MOV D,M ;GET OP 1 INX H MOV C,M ;GET OP 2S INX H XRA A ADD M ;GET OP E CNZ MDEX ;GET ACC AND ADJUST ACC E AND S JZ C@ZERO ;MULT 0 JC C@OVFL ;OVERFLOW CALL MULX3 ;3BYTE BY 3BYTE FIXED MULTIPLY MOV A,C ANA A JM RNDA LXI H,C@ACCE DCR M ;POSSIBLE FOR EXP TO BE 1 OUT JZ C@ZERO ;UNDERFLOW CALL LSH RNDA: CALL C@ROND JZ C@OVFL ;OVERFLOW JMP C@EXIT CFDIV: CALL C@PUSH MOV E,M ;GET OP 0 INX H MOV D,M ;GET OP 1 INX H MOV C,M ;GET OP 2S INX H XRA A SUB M ;GET MINUS (OP E) CPI 1 CNC MDEX JC C@OVFL JZ C@ZERO CALL DIVX3 ;3BYTE BY 3BYTE FIXED DIVISION JNC C@OVFL JMP RNDA LSH: MOV A,B RAL MOV B,A MOV A,E RAL MOV E,A MOV A,D RAL MOV D,A MOV A,C RAL MOV C,A RET MDEX: MOV B,A LXI H,C@ACCE MOV A,M ;GET ACC E ANA A RZ ;MULT OR DIV 0 ADD B MOV B,A RAR XRA B ;TESTING FOR SIGN AND CARRY DIFFERENT MOV A,B MVI B,80H; ;BIAS (ALSO USED AS CONST LATER) JP OVUN SUB B RZ MOV M,A ;STORE ACC E DCX H MOV A,M ;GET ACC S XRA C ANA B MOV M,A ;STORE ACC S MOV A,C ORA B ;OP 2 IN STD FORM RET OVUN: RLC RC ;OVERFLOW XRA A RET ;UNDERFLOW MULX3: LXI H,MULP0 MOV M,E INX H MOV M,D INX H MOV M,A XRA A MOV C,A MOV D,A MOV E,A LXI H,C@ACC0 CALL MUL1 LXI H,C@ACC1 CALL MUL1 LXI H,C@ACC2 CALL MUL1 RET MUL1: MOV A,E MOV B,D MOV E,C MOV C,M MOV L,A XRA A MOV D,A SUB C JC MUL3 MOV D,E MOV E,B RET MUL3: MOV A,L ADC A RZ MOV L,A ;A 1 MOVEING UP IN L IS COUNTER MOV A,B RAL MOV B,A MOV A,E ;1 BIT LFT SHFT OF CDEB RAL MOV E,A MOV A,D RAL MOV D,A MOV A,C RAL MOV C,A JNC MUL3 PUSH H LXI H,MULP0 MOV A,B ADD M MOV B,A INX H MOV A,E ADC M MOV E,A INX H MOV A,D ADC M MOV D,A POP H JNC MUL3 INR C ANA A ;CLEAR CARRY JMP MUL3 DIVX3: MOV C,A LXI H,C@ACC0 MOV A,M SUB E MOV M,A INX H MOV A,M SBB D MOV M,A INX H MOV A,M SBB C MOV M,A MOV A,C RAL MOV A,C RAR LXI H,DIVR3 MOV M,A DCX H MOV A,D RAR MOV M,A DCX H MOV A,E RAR MOV M,A DCX H MVI C,0 MOV A,C RAR MOV M,A LXI H,C@ACC0 MOV E,M INX H MOV D,M INX H MOV A,M ANA A JM DIV4 INX H INX H INR M ;INCR EXP RZ ;OVERFLOW MOV L,E MOV H,D MOV B,A MVI E,1 MOV D,C DIV1: XRA A PUSH D XCHG LXI H,DIVR0 SUB M INX H MOV A,E SBB M MOV E,A INX H MOV A,D SBB M MOV D,A INX H MOV A,B SBB M MOV B,A XCHG POP D DIV2: LDA DIVR0 RLC MOV A,C RAL RC RAR MOV A,L RAL MOV L,A MOV A,H RAL MOV H,A CALL LSH MOV A,E RRC JC DIV1 DIV3: LDA DIVR1 ADD L MOV L,A LDA DIVR2 ADC H MOV H,A LDA DIVR3 ADC B MOV B,A JMP DIV2 DIV4: MOV L,E MOV H,D MOV B,A MOV E,C MOV D,C JMP DIV3 DSEG MULP0: DS 1 MULP1: DS 1 MULP2: DS 1 DIVR0: DS 1 DIVR1: DS 1 DIVR2: DS 1 DIVR3: DS 1 END NAME CFIX CSEG PUBLIC CFIX EXTRN C@ACCE,C@ACCS,C@RSH CFIX: PUSH D PUSH B PUSH PSW ;NO PUSH H LXI H,C@ACCE MOV A,M ANA A JNZ FIX1 FIX0: LXI H,0 JMP FIXEX FIX1: DCX H DCX H MOV C,M DCX H MOV D,M DCX H MOV E,M SUI 128+16 JNC FIXOFL JP FIX0 CPI -16 JM FIX0 CMA INR A CALL C@RSH MOV H,C MOV L,D LDA C@ACCS ANA A JP FIXEX XRA A SUB L MOV L,A MVI A,0 SBB H MOV H,A FIXEX: POP PSW POP B POP D RET FIXOFL: LDA C@ACCS ANA A LXI H,7FFFH JP FIXEX INX H JMP FIXEX END NAME CFLOAT CSEG PUBLIC CFLOAT EXTRN C@PUSH,C@ACCS,C@AD10 CFLOAT: CALL C@PUSH MOV D,C MOV C,B XRA A MOV E,A MOV B,A ADD C ANI 80H RAL LXI H,9000H ;ACC E = 128+16 SHLD C@ACCS ;ACC S = + JMP C@AD10 END NAME CFPA CSEG PUBLIC C@PUSH,C@POP,C@ACC0,C@ACC1,C@ACC2,C@ACCS,C@ACCE C@PUSH: XCHG XTHL PUSH B PUSH PSW PUSH D XCHG PUSH D RET C@POP: POP H POP D POP PSW POP B XTHL XCHG RET DSEG C@ACC0: DS 1 C@ACC1: DS 1 C@ACC2: DS 1 C@ACCS: DS 1 C@ACCE: DS 1 END