mirror of
https://github.com/simh/simh.git
synced 2026-02-25 00:18:26 +00:00
HP2100, HP3000: HP2100 release 26 and HP3000 release 5 (Dave Bryan)
master branch code is identical
This commit is contained in:
112
HP3000/hp3000_cpu_fp.h
Normal file
112
HP3000/hp3000_cpu_fp.h
Normal file
@@ -0,0 +1,112 @@
|
||||
/* hp3000_cpu_fp.h: HP 3000 floating-point interface declarations
|
||||
|
||||
Copyright (c) 2016, J. David Bryan
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of the author shall not be used
|
||||
in advertising or otherwise to promote the sale, use or other dealings in
|
||||
this Software without prior written authorization from the author.
|
||||
|
||||
11-Jun-16 JDB Bit mask constants are now unsigned
|
||||
21-Jan-16 JDB First release version
|
||||
29-Mar-15 JDB Created
|
||||
|
||||
|
||||
This file contains declarations used by the CPU to interface with the
|
||||
floating-point operations executor.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* Program constants */
|
||||
|
||||
#define SIGN_BIT 0100000u
|
||||
#define EXPONENT_BITS 0077700u
|
||||
#define ASSUMED_BIT 0000100u
|
||||
#define FRACTION_BITS 0000077u
|
||||
|
||||
|
||||
/* Operand precisions:
|
||||
|
||||
- S = 1-word integer
|
||||
- D = 2-word integer
|
||||
- F = 2-word single-precision floating-point
|
||||
- X = 3-word extended-precision floating-point
|
||||
- E = 4-word double-precision floating-point
|
||||
|
||||
|
||||
Implementation notes:
|
||||
|
||||
1. The ordering of the enumeration constants is important, as we depend on
|
||||
the "fp" type codes to reflect the number of words used by the packed
|
||||
representation.
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
in_s = 0, /* 1-word integer */
|
||||
in_d = 1, /* 2-word integer */
|
||||
fp_f = 2, /* 2-word single-precision floating-point */
|
||||
fp_x = 3, /* 3-word extended-precision floating-point */
|
||||
fp_e = 4 /* 4-word double-precision floating-point */
|
||||
} FP_OPSIZE;
|
||||
|
||||
|
||||
/* Conversion from operand size to word count */
|
||||
|
||||
#define TO_COUNT(s) ((uint32) (s + (s < fp_f)))
|
||||
|
||||
|
||||
/* Floating point operations */
|
||||
|
||||
typedef enum {
|
||||
fp_add,
|
||||
fp_sub,
|
||||
fp_mpy,
|
||||
fp_div,
|
||||
fp_flt,
|
||||
fp_fixr,
|
||||
fp_fixt
|
||||
} FP_OPR;
|
||||
|
||||
|
||||
/* General operand.
|
||||
|
||||
An in-memory representation of an integer or packed floating-point number.
|
||||
An actual value will use one, two, three, or four words, as indicated by the
|
||||
"precision" specified.
|
||||
|
||||
"trap" is significant only for result values; it is ignored for operand
|
||||
values. A good result will have trap_None.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
HP_WORD words [4]; /* integer or floating-point value */
|
||||
FP_OPSIZE precision; /* operand size descriptor */
|
||||
uint32 trap; /* validity of the result */
|
||||
} FP_OPND;
|
||||
|
||||
|
||||
/* Special operands */
|
||||
|
||||
static const FP_OPND FP_NOP = { { 0, 0, 0, 0 }, in_s, trap_None }; /* an unneeded operand */
|
||||
|
||||
|
||||
/* Floating-point global routines */
|
||||
|
||||
extern FP_OPND fp_exec (FP_OPR operator, FP_OPND left, FP_OPND right);
|
||||
Reference in New Issue
Block a user