1//
2// sys_dosa.s
3// x86 assembly-language DOS-dependent routines.
4
5#include "asm_i386.h"
6#include "quakeasm.h"
7
8
9	.data
10
11	.align	4
12fpenv:
13	.long	0, 0, 0, 0, 0, 0, 0, 0
14
15	.text
16
17.globl C(MaskExceptions)
18C(MaskExceptions):
19	fnstenv	fpenv
20	orl		$0x3F,fpenv
21	fldenv	fpenv
22
23	ret
24
25#if 0
26.globl C(unmaskexceptions)
27C(unmaskexceptions):
28	fnstenv	fpenv
29	andl		$0xFFFFFFE0,fpenv
30	fldenv	fpenv
31
32	ret
33#endif
34
35	.data
36
37	.align	4
38.globl	ceil_cw, single_cw, full_cw, cw, pushed_cw
39ceil_cw:	.long	0
40single_cw:	.long	0
41full_cw:	.long	0
42cw:			.long	0
43pushed_cw:	.long	0
44
45	.text
46
47.globl C(Sys_LowFPPrecision)
48C(Sys_LowFPPrecision):
49	fldcw	single_cw
50
51	ret
52
53.globl C(Sys_HighFPPrecision)
54C(Sys_HighFPPrecision):
55	fldcw	full_cw
56
57	ret
58
59.globl C(Sys_PushFPCW_SetHigh)
60C(Sys_PushFPCW_SetHigh):
61	fnstcw	pushed_cw
62	fldcw	full_cw
63
64	ret
65
66.globl C(Sys_PopFPCW)
67C(Sys_PopFPCW):
68	fldcw	pushed_cw
69
70	ret
71
72.globl C(Sys_SetFPCW)
73C(Sys_SetFPCW):
74	fnstcw	cw
75	movl	cw,%eax
76#if	id386
77	andb	$0xF0,%ah
78	orb		$0x03,%ah	// round mode, 64-bit precision
79#endif
80	movl	%eax,full_cw
81
82#if	id386
83	andb	$0xF0,%ah
84	orb		$0x0C,%ah	// chop mode, single precision
85#endif
86	movl	%eax,single_cw
87
88#if	id386
89	andb	$0xF0,%ah
90	orb		$0x08,%ah	// ceil mode, single precision
91#endif
92	movl	%eax,ceil_cw
93
94	ret
95
96