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

  1. ; File......: AINT86.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. ;
  11. ;     Rev 1.2   20 Jun 1992 02:59:24   GLENN
  12. ;  Rodgers Moore [75730,2244] added mod to save and restore the stack
  13. ;  segment and stack pointer registers around the interrupt vector.  He
  14. ;  was trying to call INT 2E and apparently some versions of DOS trash
  15. ;  SS and SP.
  16. ;
  17. ;     Rev 1.1   15 Aug 1991 23:07:24   GLENN
  18. ;  Forest Belt proofread/edited/cleaned up doc
  19. ;
  20. ;     Rev 1.0   27 May 1991 13:21:48   GLENN
  21. ;  Initial revision.
  22. ;
  23.  
  24.  
  25. ; This file is a part of the ft_int86() package.  For complete
  26. ; documentation, read cint86.c, available elsewhere in the
  27. ; Nanforum Toolkit.
  28. ;
  29. ; This module should be compiled with TASM.
  30.  
  31. IDEAL
  32.  
  33. Public   __ftint86
  34.  
  35. Segment  _NanFor   Word      Public    "CODE"
  36.          Assume    CS:_NanFor
  37.  
  38. Proc     __ftint86 Far
  39.  
  40.          Pop       CX                        ; Remove return address from
  41.          Pop       DX                        ; stack
  42.  
  43.          Pop       [CS:RegOfs]               ; Get pointer to register
  44.          Pop       [CS:RegSeg]               ; structure from stack
  45.  
  46.          Pop       AX                        ; Get desired interrupt
  47.  
  48.          Push      DX                        ; Put return address back onto
  49.          Push      CX                        ; stack to prevent underflow
  50.  
  51.          Push      DS                        ; Save modified registers
  52.          Push      SI
  53.          Push      DI
  54.          Push      BP
  55.  
  56.          Mov       AH,35h                    ; DOS service -- get vector
  57.          Int       21h                       ; Call DOS
  58.          Mov       [CS:HndSeg],ES            ; Store address of desired
  59.          Mov       [CS:HndOfs],BX            ; interrupt handler
  60.  
  61.          LDS       BX,[CS:RegPtr]            ; Load pointer to register values
  62.          Push      [Word Ptr BX + 16]        ; Put ES value on stack
  63.          Push      [Word Ptr BX + 14]        ; Put DS value on stack
  64.          Push      [Word Ptr BX + 12]        ; Put BP value on stack
  65.          Push      [Word Ptr BX + 10]        ; Put DI value on stack
  66.          Push      [Word Ptr BX + 8]         ; Put SI value on stack
  67.          Push      [Word Ptr BX + 6]         ; Put DX value on stack
  68.          Push      [Word Ptr BX + 4]         ; Put CX value on stack
  69.          Push      [Word Ptr BX + 2]         ; Put BX value on stack
  70.          Mov       AX,[Word Ptr BX + 0]      ; Get AX value
  71.          Pop       BX                        ; Get BX value
  72.          Pop       CX                        ; Get CX value
  73.          Pop       DX                        ; Get DX value
  74.          Pop       SI                        ; Get SI value
  75.          Pop       DI                        ; Get DI value
  76.          Pop       BP                        ; Get BP value
  77.          Pop       DS                        ; Get DS value
  78.          Pop       ES                        ; Get ES value
  79.  
  80.          Mov       [CS:SavSS],SS             ; Save Stack Segment
  81.          Mov       [CS:SavSP],SP             ; and Stack Pointer Registers
  82.  
  83.          PushF                               ; Simulate INT instruction by
  84.          CLI                                 ; using PushF and CLI
  85.          Call      [CS:Handler]              ; Call the interrupt handler
  86.  
  87.          Mov       SS,[CS:SavSS]             ; Restore Stack Segment
  88.          Mov       SP,[CS:SavSP]             ; and Stack Pointer Registers
  89.  
  90.          Push      AX                        ; Save all registers to preserve
  91.          Push      BX                        ; the state of the CPU after
  92.          Push      CX                        ; the interrupt executed
  93.          Push      DX
  94.          Push      SI
  95.          Push      DI
  96.          Push      BP
  97.          Push      DS
  98.          Push      ES
  99.          PushF
  100.  
  101.          LDS       BX,[CS:RegPtr]            ; Load pointer to register values
  102.          Pop       [Word Ptr BX + 18]        ; Get saved registers and load
  103.          Pop       [Word Ptr BX + 16]        ; into data structure
  104.          Pop       [Word Ptr BX + 14]
  105.          Pop       [Word Ptr BX + 12]
  106.          Pop       [Word Ptr BX + 10]
  107.          Pop       [Word Ptr BX + 8]
  108.          Pop       [Word Ptr BX + 6]
  109.          Pop       [Word Ptr BX + 4]
  110.          Pop       [Word Ptr BX + 2]
  111.          Pop       [Word Ptr BX + 0]
  112.  
  113.          Pop       BP                        ; Restore registers
  114.          Pop       DI
  115.          Pop       SI
  116.          Pop       DS
  117.          Ret
  118. Endp     __ftint86
  119.  
  120. SavSS    DW        0
  121. SavSP    DW        0
  122.  
  123. Label    Handler   DWord
  124. HndOfs   DW        ?
  125. HndSeg   DW        ?
  126.  
  127. Label    RegPtr    DWord
  128. RegOfs   DW        ?
  129. RegSeg   DW        ?
  130.  
  131. Ends     _NanFor
  132. End