home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / NFSRC305.ZIP / CPMI / ISPROT.ASM < prev    next >
Encoding:
Assembly Source File  |  1995-05-01  |  3.2 KB  |  103 lines

  1. ; File......: ISPROT.ASM
  2. ; Author....: Ted Means
  3. ; CIS ID....: 73067,3332
  4. ;
  5. ; This is an original work by Ted Means and is placed in the
  6. ; public domain.
  7. ;
  8. ; Modification history:
  9. ; ---------------------
  10. ;     Rev 1.1   01 Feb 1995 03:02:00   TED
  11. ;  Fixed bug in which function would report incorrect mode when run under
  12. ;  OS/2 Warp.
  13. ;
  14. ;     Rev 1.0   01 Jan 1995 03:01:00   TED
  15. ;  Initial release
  16. ;
  17.  
  18. ;  $DOC$
  19. ;  $FUNCNAME$
  20. ;     cpmiIsProtected()
  21. ;  $CATEGORY$
  22. ;     CPMI
  23. ;  $ONELINER$
  24. ;     Determine if the CPU is in protected mode
  25. ;  $SYNTAX$
  26. ;     int pascal cpmiIsProtected( void )
  27. ;  $ARGUMENTS$
  28. ;     None
  29. ;  $RETURNS$
  30. ;     Zero if the CPU is in real mode, or a non-zero value if it is running
  31. ;     in protected mode.
  32. ;  $DESCRIPTION$
  33. ;     This functions is useful for writing bi-modal code since you can take
  34. ;     different actions depending on the CPU mode.
  35. ;  $EXAMPLES$
  36. ;     if ( cpmiIsProtected() )
  37. ;     {
  38. ;        // Do protected mode stuff
  39. ;     }
  40. ;     else
  41. ;     {
  42. ;        // Do real mode stuff
  43. ;     }
  44. ;  $INCLUDE$
  45. ;     CPMI.H
  46. ;  $SEEALSO$
  47. ;  $END$
  48. ;
  49.  
  50. IDEAL
  51. P286
  52.  
  53. Public    cpmiIsProtected
  54.  
  55. Group     DGROUP    _DATA
  56.  
  57. Segment   _DATA     Word      Public    "DATA"
  58.  
  59. ModeFlag  DW        -1
  60.  
  61. Ends      _DATA
  62.  
  63.  
  64.  
  65. Segment   _NanFor   Word      Public    "CODE"
  66.           Assume    CS:_NanFor,DS:DGROUP
  67.  
  68. Proc      cpmiIsProtected    Far
  69.  
  70.           Mov       AX,[ModeFlag]                 ; Get mode indicator
  71.           Cmp       AX,-1                         ; See if checked already
  72.           JNE       @@Exit
  73.  
  74. @@Init:   Inc       AX                            ; Default to FALSE
  75.           Push      SP                            ; Put SP on stack
  76.           Pop       DX                            ; Now get it back
  77.           Cmp       DX,SP                         ; If not ==, 8088/8086
  78.           JNE       @@Done                        ; Return FALSE
  79.  
  80.           SMSW      AX                            ; Get status word
  81.           And       AX,1                          ; Check for pmode bit
  82.           JZ        @@Done                        ; Return FALSE if clear
  83.  
  84.           PushF                                   ; Mov flag word . . .
  85.           Pop       DX                            ; . . . to DX
  86.           And       DH,11001111b                  ; Set IOPL to zero
  87.           Push      DX                            ; Move DX . . .
  88.           PopF                                    ; . . . back to flag word
  89.           PushF                                   ; Now move flags . . .
  90.           Pop       DX                            ; . . . back to DX
  91.           Test      DH,110000b                    ; Is IOPL still zero?
  92.           JZ        @@Done                        ; If so, return TRUE
  93.           Mov       AX,1686h                      ; DPMI -- get CPU mode
  94.           Int       2Fh                           ; Call DPMI
  95.           Cmp       AX,1                          ; Check for return >= 1
  96.           Mov       AX,0                          ; Default to real mode
  97.           ADC       AX,0                          ; CF set means protected
  98.  
  99. @@Done:   Mov       [ModeFlag],AX
  100. @@Exit:   RetF
  101. Endp      cpmiIsProtected
  102. Ends      _NanFor
  103. End