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

  1. ; File......: FARCALL.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. ;     cpmiFarCallReal()
  17. ;  $CATEGORY$
  18. ;     CPMI
  19. ;  $ONELINER$
  20. ;     Call a real mode function via pointer.
  21. ;  $SYNTAX$
  22. ;     int pascal cpmiFarCallReal( void * FuncAddr, CPUREGS * InRegs,
  23. ;                                                  CPUREGS * OutRegs )
  24. ;  $ARGUMENTS$
  25. ;     FuncAddr is the real mode address of the function to call.
  26. ;
  27. ;     InRegs is a pointer to a CPUREGS structure containing the incoming
  28. ;     register assignments.
  29. ;
  30. ;     OutRegs is a pointer to a CPUREGS structure where the outgoing
  31. ;     register contents will be stored.
  32. ;  $RETURNS$
  33. ;     SUCCEED if successful, FAIL otherwise
  34. ;  $DESCRIPTION$
  35. ;     Use cpmiFarCallReal() to execute a real mode function.  This function
  36. ;     allows you to set real mode segment register values from protected
  37. ;     mode.  A call to cpmiFarCallReal() sets the registers to the values
  38. ;     you provide in the structure to which InRegs points; then it invokes
  39. ;     the function at the address specified by FuncAddr.  After the call
  40. ;     has been completed, the register values will be stored in the structure
  41. ;     pointed to by OutRegs.  The structures pointed to by InRegs and OutRegs
  42. ;     are both of type CPUREGS.
  43. ;
  44. ;  $EXAMPLES$
  45. ;     auto CPUREGS Regs;
  46. ;
  47. ;     cpmiFarCallReal( ( void * ) 0xF000FFF0, &Regs, &Regs )   // Reboot
  48. ;  $INCLUDE$
  49. ;     CPMI.H
  50. ;  $SEEALSO$
  51. ;     cpmiAllocDOSMem(), cpmiFreeDOSMem(), cpmiRealPtr(), cpmiInt86()
  52. ;  $END$
  53. ;
  54.  
  55. IDEAL
  56. P286
  57.  
  58. Struc     CPUREGS
  59. DI        DW        ?
  60. DIHi      DW        ?
  61. SI        DW        ?
  62. SIHi      DW        ?
  63. BP        DW        ?
  64. BPHi      DW        ?
  65. Rsv       DW        ?
  66. RsvHi     DW        ?
  67. BX        DW        ?
  68. BXHi      DW        ?
  69. DX        DW        ?
  70. DXHi      DW        ?
  71. CX        DW        ?
  72. CXHi      DW        ?
  73. AX        DW        ?
  74. AXHi      DW        ?
  75. Flags     DW        ?
  76. ES        DW        ?
  77. DS        DW        ?
  78. FS        DW        ?
  79. GS        DW        ?
  80. IP        DW        ?
  81. CS        DW        ?
  82. SP        DW        ?
  83. SS        DW        ?
  84. Ends      CPUREGS
  85.  
  86. Public    cpmiFarCallReal
  87.  
  88. Extrn     __bset:Far
  89.  
  90. Regs      EQU       (CPUREGS Ptr BP - Size CPUREGS)
  91.  
  92. Segment   _NanFor   Word      Public    "CODE"
  93.  
  94. Proc      cpmiFarCallReal     Far
  95.  
  96.           Enter     Size CPUREGS,0                ; Create stack frame
  97.           Push      DS                            ; Save DS
  98.           Push      SI                            ; Save SI
  99.           Push      DI                            ; Save DI
  100.           Push      BP                            ; Save BP
  101.  
  102.           LEA       AX,[BP - Size CPUREGS]        ; Calc offset
  103.           Push      Size CPUREGS                  ; Set byte count
  104.           Push      0                             ; Set fill character
  105.           Push      SS                            ; Put segment on stack
  106.           Push      AX                            ; Put offset on stack
  107.           Call      __bset                        ; Init structure
  108.           Add       SP,8                          ; Realign stack
  109.  
  110.           LES       BX,[DWord Ptr BP + 10]        ; Load pointer to in regs
  111.           Push      [Word Ptr ES:BX]              ; Put AX value on stack
  112.           Push      [Word Ptr ES:BX + 2]          ; Put BX value on stack
  113.           Push      [Word Ptr ES:BX + 4]          ; Put CX value on stack
  114.           Push      [Word Ptr ES:BX + 6]          ; Put DX value on stack
  115.           Push      [Word Ptr ES:BX + 8]          ; Put SI value on stack
  116.           Push      [Word Ptr ES:BX + 10]         ; Put DI value on stack
  117.           Push      [Word Ptr ES:BX + 12]         ; Put BP value on stack
  118.           Push      [Word Ptr ES:BX + 14]         ; Put DS value on stack
  119.           Push      [Word Ptr ES:BX + 16]         ; Put ES value on stack
  120.           Push      [Word Ptr ES:BX + 18]         ; Put flags value on stack
  121.           Pop       [Regs.Flags]
  122.           Pop       [Regs.ES]
  123.           Pop       [Regs.DS]
  124.           Pop       [Regs.BP]
  125.           Pop       [Regs.DI]
  126.           Pop       [Regs.SI]
  127.           Pop       [Regs.DX]
  128.           Pop       [Regs.CX]
  129.           Pop       [Regs.BX]
  130.           Pop       [Regs.AX]
  131.  
  132.           Mov       AX,[Word Ptr BP + 14]
  133.           Mov       [Regs.IP],AX
  134.           Mov       AX,[Word Ptr BP + 16]
  135.           Mov       [Regs.CS],AX
  136.  
  137.           Mov       AX,301h                       ; DPMI -- real mode call
  138.           Xor       BX,BX                         ; Clear BX
  139.           Mov       CX,BX                         ; Clear CX
  140.           Push      SS                            ; Move SS . . .
  141.           Pop       ES                            ; . . . to ES
  142.           LEA       DI,[BP - Size CPUREGS]        ; Load register offset
  143.           Int       31h                           ; Call DPMI
  144.           Mov       AX,1                          ; Default to SUCCEED
  145.           SBB       AX,0                          ; Set to FAIL on error
  146.  
  147.           CLD                                     ; Restore preserved
  148.           Pop       BP                            ; registers just in case
  149.           Pop       DI                            ; DPMI host is ill-behaved
  150.           Pop       SI
  151.           Pop       DS
  152.  
  153.           LES       BX,[DWord Ptr BP + 6]         ; Load pointer to outregs
  154.           Push      [Regs.ES]                     ; Put register values on
  155.           Push      [Regs.DS]                     ; stack
  156.           Push      [Regs.BP]
  157.           Push      [Regs.DI]
  158.           Push      [Regs.SI]
  159.           Push      [Regs.DX]
  160.           Push      [Regs.CX]
  161.           Push      [Regs.BX]
  162.           Push      [Regs.AX]
  163.           Pop       [Word Ptr ES:BX]              ; Get AX value
  164.           Pop       [Word Ptr ES:BX + 2]          ; Get BX value
  165.           Pop       [Word Ptr ES:BX + 4]          ; Get CX value
  166.           Pop       [Word Ptr ES:BX + 6]          ; Get DX value
  167.           Pop       [Word Ptr ES:BX + 8]          ; Get SI value
  168.           Pop       [Word Ptr ES:BX + 10]         ; Get DI value
  169.           Pop       [Word Ptr ES:BX + 12]         ; Get BP value
  170.           Pop       [Word Ptr ES:BX + 14]         ; Get DS value
  171.           Pop       [Word Ptr ES:BX + 16]         ; Get ES value
  172.           Pop       [Word Ptr ES:BX + 18]         ; Get flags value
  173.  
  174.           Leave
  175.           RetF      10
  176. Endp      cpmiFarCallReal
  177. Ends      _NanFor
  178. End