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

  1. ; File......: RMPTR.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.0   01 Jan 1995 03:01:00   TED
  11. ;  Initial release
  12. ;
  13.  
  14. ;  $DOC$
  15. ;  $FUNCNAME$
  16. ;     cpmiRealPtr()
  17. ;  $CATEGORY$
  18. ;     CPMI
  19. ;  $ONELINER$
  20. ;     Generate a real mode pointer from a protected mode address
  21. ;  $SYNTAX$
  22. ;     void * pascal cpmiRealPtr( void * PMAddr )
  23. ;  $ARGUMENTS$
  24. ;     PMAddr is a protected mode address (selector:offset)
  25. ;  $RETURNS$
  26. ;     The actual real mode physical address (segment:offset)
  27. ;  $DESCRIPTION$
  28. ;     This function is used to obtain the real mode equivalent of a
  29. ;     protected mode pointer, which is useful when attempting to call
  30. ;     real mode interrupts.
  31. ;
  32. ;     Note that if the protected mode address falls above the real mode
  33. ;     address space (1 mb) then a null pointer will be returned.
  34. ;  $EXAMPLES$
  35. ;     auto char far * buffer;
  36. ;
  37. ;     FP_SEG( buffer ) = cpmiAllocDOSMem( 128 );
  38. ;     FP_OFF( buffer ) = 0;
  39. ;
  40. ;     buffer = cpmiRealPtr( buffer );
  41. ;  $INCLUDE$
  42. ;     CPMI.H
  43. ;  $SEEALSO$
  44. ;     cpmiProtectedPtr(), cpmiAllocDOSMem(), cpmiFreeDOSMem(),
  45. ;     cpmiResizeDOSMem(), cpmiInt86()
  46. ;  $END$
  47. ;
  48.  
  49. IDEAL
  50. P286
  51.  
  52. Public    cpmiRealPtr
  53.  
  54. Segment   _NanFor   Word      Public    "CODE"
  55.           Assume    CS:_NanFor
  56.  
  57. Proc      cpmiRealPtr         Far
  58.  
  59.           Enter     0,0                           ; Create stack frame
  60.  
  61.           Mov       AX,6                          ; DPMI -- get base address
  62.           Mov       BX,[Word Ptr BP + 8]          ; Load selector
  63.           Int       31h                           ; Call DPMI
  64.           JC        @@Null                        ; Bail if error
  65.  
  66.           Add       DX,[Word Ptr BP + 6]          ; Add offset to address
  67.           ADC       CX,0                          ; Carry into high word
  68.  
  69.           Mov       AX,DX                         ; Load low part of address
  70.           And       AX,1111b                      ; Mask off upper bits
  71.           SHR       CX,1                          ; Move CX low bit . . .
  72.           RCR       DX,1                          ; . . . into DX high bit
  73.           SHR       CX,1                          ; Move CX low bit . . .
  74.           RCR       DX,1                          ; . . . into DX high bit
  75.           SHR       CX,1                          ; Move CX low bit . . .
  76.           RCR       DX,1                          ; . . . into DX high bit
  77.           SHR       CX,1                          ; Move CX low bit . . .
  78.           RCR       DX,1                          ; . . . into DX high bit
  79.           Or        CX,CX                         ; See if CX is clear
  80.           JZ        @@Exit                        ; If so, okay
  81.  
  82. @@Null:   Xor       AX,AX                         ; Clear AX
  83.           Mov       DX,AX                         ; Create null pointer
  84.  
  85. @@Exit:   Leave
  86.           RetF      4
  87. Endp      cpmiRealPtr
  88. Ends      _NanFor
  89. End