summaryrefslogtreecommitdiffstats
path: root/private/mvdm/softpc.new/base/ccpu386/adc.c
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/mvdm/softpc.new/base/ccpu386/adc.c
downloadNT4.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.c79
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 */
+ }