home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / progmisc / nfsrc21.zip / AINT86.ASM < prev    next >
Assembly Source File  |  1992-06-20  |  5KB  |  136 lines

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