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

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