home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR13 / OS2ASM.ZIP / GETTHD.ASM < prev    next >
Assembly Source File  |  1991-08-10  |  3KB  |  177 lines

  1. ;_ getthd.asm
  2.  
  3. include macros.asm
  4.  
  5. noerrno    equ    1
  6. include stdio.asm
  7. include flthead.asm
  8.  
  9.     begdata
  10.  
  11.     extrn    __thread1:word
  12.     extrn    _errno:dword
  13.  
  14.     ifdef _MT
  15.     else
  16.     extrn    __fe_cur_env:word
  17.     endif
  18.  
  19.     enddata
  20.  
  21.     if LCODE
  22.     extrn    _calloc:far
  23.     else
  24.     extrn    _calloc:near
  25.     endif
  26.  
  27.     begcode    getthd
  28.  
  29. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  30. ; Get pointer to thread data for current thread.
  31. ;    struct THREAD *_getthreaddata();
  32. ; Returns:
  33. ;    NULL    can't get thread data
  34.  
  35.     c_public _getthreaddata
  36. func    _getthreaddata
  37.     ifdef _MT
  38.     else ;single threaded
  39.     mov    EAX,offset DGROUP:__thread1
  40.     if LPTR
  41.     clr    EDX
  42.     mov    DX,DS
  43.     endif
  44.     endif
  45.     ret
  46. c_endp    _getthreaddata
  47.  
  48. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  49. ; Set errno based on value in EAX.
  50. ; Preserve contents of all registers and flags.
  51.  
  52.     public __errno_set
  53.     if LCODE
  54. __errno_set proc far
  55.     else
  56. __errno_set proc near
  57.     endif
  58.  
  59.     ifdef _MT
  60.     pushf
  61.     .push    <EBX,ECX,EDX,ES>
  62.     push    EAX
  63.     callm    _getthreaddata
  64.     if SPTR
  65.     mov    EBX,EAX
  66.     pop    EAX
  67.     pop    t_errno[EBX],EAX
  68.     else
  69.     mov    ES,DX
  70.     mov    EBX,EAX
  71.     pop    EAX
  72.     mov    ES:t_errno[EBX],EAX
  73.     endif
  74.     .pop    <ES,EDX,ECX,EBX>
  75.     popf
  76.     else
  77.     mov    _errno,EAX    ;for link compatibility with non-_MT code
  78.     endif
  79.     ret
  80. __errno_set endp
  81.  
  82. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  83. ; Retrieve pointer to where errno is stored.
  84. ;    int *_errno();
  85.  
  86.     public __errno
  87.  
  88.     if LCODE
  89. __errno    proc    far
  90.     else
  91. __errno    proc    near
  92.     endif
  93.  
  94.     ifdef _MT
  95.       if LCODE
  96.     push    CS
  97.       endif
  98.     call    near ptr __getthreaddata
  99.     add    EAX,t_errno
  100.     else
  101.       if LPTR
  102.     clr    EDX
  103.     mov    DX,DS
  104.       endif
  105.     mov    EAX,offset DGROUP:_errno
  106.     endif
  107.     ret
  108.  
  109. __errno    endp
  110.  
  111. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  112. ; Set exception bits.
  113. ; No registers modified except AX.
  114.  
  115.     public __FEEXCEPT
  116.     if LCODE
  117. __FEEXCEPT proc far
  118.     else
  119. __FEEXCEPT proc near
  120.     endif
  121.     push    EBP
  122.     mov    EBP,ESP
  123.     ifdef _MT
  124.     .push    <EBX,ECX,EDX,ES>
  125.     push    P[EBP]
  126.     callm    _getthreaddata
  127.       if SPTR
  128.     mov    EBX,EAX
  129.     pop    EAX
  130.     or    t_fe_status[EBX],AX
  131.       else
  132.     mov    ES,DX
  133.     mov    EBX,EAX
  134.     pop    EAX
  135.     or    ES:t_fe_status[EBX],AX
  136.       endif
  137.     .pop    <ES,EDX,ECX,EBX>
  138.     else
  139.     mov    EAX,P[EBP]
  140.     or    __fe_cur_env.status,AX
  141.     endif
  142.     pop    EBP
  143.     ret    2
  144. __FEEXCEPT endp
  145.  
  146. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  147. ; Get rounding mode in AX.
  148. ; No registers modified.
  149.  
  150.     public __FEROUND
  151.     if LCODE
  152. __FEROUND proc far
  153.     else
  154. __FEROUND proc near
  155.     endif
  156.     ifdef _MT
  157.     .push    <EBX,ECX,EDX,ES>
  158.     callm    _getthreaddata
  159.       if SPTR
  160.     mov    EBX,EAX
  161.     movzx    EAX,t_fe_round[EBX]
  162.       else
  163.     mov    ES,DX
  164.     mov    EBX,EAX
  165.     movzx    EAX,ES:t_fe_round[EBX]
  166.       endif
  167.     .pop    <ES,EDX,ECX,EBX>
  168.     else
  169.     movzx    EAX,__fe_cur_env.round
  170.     endif
  171.     ret
  172. __FEROUND endp
  173.  
  174.     endcode    getthd
  175.  
  176.     end
  177.