Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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