Files
TeslaRel410/BORLAND/BC45/SOURCE/RTL/RTLINC/COMMON16/_MATH.H
T
CydandClaude Fable 5 63312e07f9 source410: literal 4.10 source reconstruction + BC++ 4.52 fleet toolchain archived
- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
  is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
  Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
  (extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
  BT game source (never mixed into CODE/). Round 1-3 state:
  * 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
    (BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
    since 1996.
  * BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
    its binary-recorded line 400 exactly.
  * BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
    (Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
    TeamScore=12 flagged [T4]).
  * MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
    (VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
    the period compiler is the drift detector).
  * Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
    (per-TU verification sweep under authentic OPT.MAK flags).
  * README: corrected roadmap - MECH.HPP is the capstone grown with the mech
    TU reconstructions; BTREG.CPP green = the header-family milestone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 07:33:26 -05:00

286 lines
7.6 KiB
C++

/*------------------------------------------------------------------------
* filename - _math.h
*
* Access to the Floating Point Support Library.
*-----------------------------------------------------------------------*/
/*
* C/C++ Run Time Library - Version 6.5
*
* Copyright (c) 1987, 1994 by Borland International
* All Rights Reserved.
*
*/
#if !defined(__MATH_H)
#include <math.h>
#endif
/*
* Parameters must be supplied on the iNDP stack and are consumed.
* Result will be in the iNDP TOS.
*/
/*
* An iNDP_image is put into memory by the FSTENV instruction.
*/
typedef struct
{
unsigned control;
unsigned status_;
unsigned tags;
unsigned ip;
unsigned ip_opcode;
unsigned dp;
unsigned dptop;
}
iNDP_env;
#if defined(__OS2__) || defined(_Windows)
#ifdef __cplusplus
extern "C" {
#endif
void near _f87_Sine(void);
void near _f87_Cosine(void);
void near _f87_Tangent(void);
void near _f87_ArcTan(void);
void near _f87_Log(void);
void near _f87_Log2(void);
void near _f87_Log10(void);
void near _f87_Exp(void);
void near _f87_Exp2(void);
void near _f87_Exp10(void);
#ifdef __cplusplus
}
#endif
#else /* not __OS2__ or _Windows */
/*
These shortcut codes are like emulated 8087 instructions, but they enter
the emulator at a level which bypasses simulation of that chip's status
registers. Therefore the emulation is not strict. Also the addressing
modes are fixed, none of the '87 flexibility is available (nor do you pay
the time penalty of emulating the instruction decode). They are designed
to match the sequences the compiler frequently generates.
These shortcuts MUST be called in a fixed pattern. For most operations
the sequence is:
*/
#define _FAST_(shortCode) int 3Eh; asm db shortCode, 90h
/*
A few operations require a 4-byte sequence with two trailing bytes.
The second trailing byte supplies a register count or some other parameter.
*/
#define _FAST4_(shortCode,rNum) int 3Eh; asm db shortCode, rNum
#define shortcutInt 0x3E
typedef enum _shortCodes_
{
_FSCALEAX_ = 0xA2,
_FCOM_ = 0xA4,
_FSTCWAX_ = 0xA6,
_FLDSTN_ = 0xA8, /* FAST4 */
_FASC2BIN_ = 0xAA,
_FBIN2ASC_ = 0xAC,
_FNINIT_ = 0xAE,
_FLDCW_ = 0xB0,
_FSTSWAX_ = 0xB2,
_FERROR_ = 0xB4,
_FFRAC_ = 0xB6,
_FSTPRI_ = 0xB8,
_FSTPRUI_ = 0xBA,
_FSTPRL_ = 0xBC,
_FSTPRUL_ = 0xBE,
_FSTPTI_ = 0xC0,
_FSTPTUI_ = 0xC2,
_FSTPTL_ = 0xC4,
_FSTPTUL_ = 0xC6,
_FLDI_ = 0xC8,
_FLDUI_ = 0xCA,
_FLDL_ = 0xCC,
_FLDUL_ = 0xCE,
_FLDLEC_ = 0xD0,
_FLDULEC_ = 0xD2,
_FLDSDA_ = 0xD4,
_FLDSEC_ = 0xD6,
_FSTPSDA_ = 0xD8,
_FXCHN_ = 0xDA, /* FAST4 */
/* The following 8 compiler-support short-cuts are supported by the
emulator even when true emulation is used and the other short-cuts
are suppressed.
*/
_FSPILLN_ = 0xDC, /* FAST4 */
_FRELOADN_ = 0xDE, /* FAST4 */
_FCMPPS_ = 0xE0,
_FCMPPD_ = 0xE2,
_FCMPP_ = 0xE4,
_FCMP_ = 0xE6,
_FTST_ = 0xE8,
_FXAM_ = 0xEA,
/* The following 10 transcendental short-cuts are supported by the
emulator even when true emulation is used and the other short-cuts
are suppressed.
*/
_FSIN_ = 0xEC,
_FCOS_ = 0xEE,
_FTAN_ = 0xF0,
_FATAN_ = 0xF2,
_FLOG_ = 0xF4,
_FLOG2_ = 0xF6,
_FLOG10_ = 0xF8,
_FEXP_ = 0xFA,
_FEXP2_ = 0xFC,
_FEXP10_ = 0xFE,
/* negatives have no simple in-line equivalents, though some (like FXCHN)
will be patched in-line. Positives can be inline patched by a uniform
look-up table.
*/
_FSADD_ = 0x00,
_FSSUB_ = 0x02,
_FSSUBR_ = 0x04,
_FSMUL_ = 0x06,
_FSDIV_ = 0x08,
_FSDIVR_ = 0x0A,
_FSSQRT_ = 0x0C,
_FLDSES_ = 0x0E,
_FLDSCS_ = 0x10,
_FLDSSS_ = 0x12,
_FLDSDS_ = 0x14,
_FLDDES_ = 0x16,
_FLDDCS_ = 0x18,
_FLDDSS_ = 0x1A,
_FLDDDS_ = 0x1C,
_FLDXES_ = 0x1E,
_FLDXCS_ = 0x20,
_FLDXSS_ = 0x22,
_FLDXDS_ = 0x24,
_FLDCES_ = 0x26,
_FLDCCS_ = 0x28,
_FLDCSS_ = 0x2A,
_FLDCDS_ = 0x2C,
_FLDBXES_ = 0x2E,
_FLDBXCS_ = 0x30,
_FLDBXSS_ = 0x32,
_FLDBXDS_ = 0x34,
_FSTPSES_ = 0x36,
_FSTPSCS_ = 0x38,
_FSTPSSS_ = 0x3A,
_FSTPSDS_ = 0x3C,
_FSTPDES_ = 0x3E,
_FSTPDCS_ = 0x40,
_FSTPDSS_ = 0x42,
_FSTPDDS_ = 0x44,
_FSTPXES_ = 0x46,
_FSTPXCS_ = 0x48,
_FSTPXSS_ = 0x4A,
_FSTPXDS_ = 0x4C,
_FSTPCES_ = 0x4E,
_FSTPCCS_ = 0x50,
_FSTPCSS_ = 0x52,
_FSTPCDS_ = 0x54,
_FADD_ = 0x56,
_FSUB_ = 0x58,
_FSUBR_ = 0x5A,
_FMUL_ = 0x5C,
_FDIV_ = 0x5E,
_FDIVR_ = 0x60,
_FSQRT_ = 0x62,
_FCHS_ = 0x64,
_FABS_ = 0x66,
_FLDST0_ = 0x68,
_FSTPST0_ = 0x6A,
_FXCH_ = 0x6C,
_FRNDINT_ = 0x6E,
_FLDZ_ = 0x70,
_FLD1_ = 0x72,
_FPREM_ = 0x74,
_FXTRACT_ = 0x76,
_FLDPI_ = 0x78,
};
#endif /* not __OS2__ */
/* The flag _8087 says whether coprocessor is in use.
It is only valid floating point is used in the program.
The values are:
0 - nocoprocessor, or ignored because of SET 87=N.
1 - 8087 or 80187, or using coprocessor because of SET 87=Y.
2 - 80287
3 - 80387
*/
extern int cdecl _8087;
/* some 80387 opcodes */
#define OPCODE_FSIN 0D9h, 0FEh
#define OPCODE_FCOS 0D9h, 0FFh
#define OPCODE_FSINCOS 0D9h, 0FBh
#define OPCODE_FSTSWAX 0DFh, 0E0h
#ifdef __cplusplus
extern "C" {
#endif
/* helper functions and variables for math library */
void pascal near __expld(void);
void pascal near __round(void);
long double pascal near __pow10(int __p);
extern char *_mathwhy[];
#ifdef __cplusplus
}
#endif
#if MSC
#include "msc.h"
#endif
/* The customary matherr() exception handler for math functions is
not compatible with the x3j11 draft standard for C. _matherr() is
provided as a compromise.
*/
double _Cdecl _FARFUNC __matherr(_mexcep __why, char _FAR *__fun, double _FAR *__arg1p,
double _FAR *__arg2p, double __retval);
long double _Cdecl _FARFUNC __matherrl(_mexcep __why, char _FAR *__fun,
long double _FAR *__arg1p, long double _FAR *__arg2p,
long double __retval);