diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/mvdm/softpc.new/base/ccpu386/adc.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/mvdm/softpc.new/base/ccpu386/adc.c')
-rw-r--r-- | private/mvdm/softpc.new/base/ccpu386/adc.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/base/ccpu386/adc.c b/private/mvdm/softpc.new/base/ccpu386/adc.c new file mode 100644 index 000000000..779d80034 --- /dev/null +++ b/private/mvdm/softpc.new/base/ccpu386/adc.c @@ -0,0 +1,79 @@ +/*[ + +adc.c + +LOCAL CHAR SccsID[]="@(#)adc.c 1.5 02/09/94"; + +ADC CPU functions. +------------------ + +]*/ + + +#include <insignia.h> + +#include <host_def.h> +#include <xt.h> +#include <c_main.h> +#include <c_addr.h> +#include <c_bsic.h> +#include <c_prot.h> +#include <c_seg.h> +#include <c_stack.h> +#include <c_xcptn.h> +#include <c_reg.h> +#include <adc.h> + + +/* + ===================================================================== + EXTERNAL FUNCTIONS START HERE. + ===================================================================== + */ + + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* Generic - one size fits all 'adc'. */ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +GLOBAL VOID +ADC + +IFN3( + IU32 *, pop1, /* pntr to dst/lsrc operand */ + IU32, op2, /* rsrc operand */ + IUM8, op_sz /* 8, 16 or 32-bit */ + ) + + + { + IU32 result; + IU32 carry; + IU32 msb; + IU32 op1_msb; + IU32 op2_msb; + IU32 res_msb; + + msb = SZ2MSB(op_sz); + /* Do operation */ + result = *pop1 + op2 + GET_CF() & SZ2MASK(op_sz); + op1_msb = (*pop1 & msb) != 0; /* Isolate all msb's */ + op2_msb = (op2 & msb) != 0; + res_msb = (result & msb) != 0; + carry = *pop1 ^ op2 ^ result; /* Isolate carries */ + /* Determine flags */ + /* + OF = (op1 == op2) & (op2 ^ res) + ie if operand signs same and res sign different set OF. + */ + SET_OF((op1_msb == op2_msb) & (op2_msb ^ res_msb)); + /* + Formally:- CF = op1 & op2 | !res & op1 | !res & op2 + Equivalently:- CF = OF ^ op1 ^ op2 ^ res + */ + SET_CF(((carry & msb) != 0) ^ GET_OF()); + SET_PF(pf_table[result & BYTE_MASK]); + SET_ZF(result == 0); + SET_SF((result & msb) != 0); /* SF = MSB */ + SET_AF((carry & BIT4_MASK) != 0); /* AF = Bit 4 carry */ + *pop1 = result; /* Return answer */ + } |