home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / fortran / mslang / biosasm / interrpt.asm < prev    next >
Assembly Source File  |  1991-08-05  |  6KB  |  195 lines

  1. ; INTERRUPT.ASM  The assembler source listing of the INTERRUPT and
  2. ;  INTERRUPTX routines.
  3. ;
  4. ; NOTE:
  5. ; THIS PROGRAM, ITS USE, OPERATION AND SUPPORT IS PROVIDED "AS
  6. ; IS," WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
  7. ; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  8. ; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE
  9. ; ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THIS PROGRAM
  10. ; IS WITH THE USER.  IN NO EVENT SHALL MICROSOFT BE LIABLE FOR ANY
  11. ; DAMAGES INCLUDING, WITHOUT LIMITATION, ANY LOST PROFITS, LOST
  12. ; SAVINGS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
  13. ; FROM THE USE OR INABILITY TO USE SUCH PROGRAM, EVEN IF
  14. ; MICROSOFT HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
  15. ; OR FOR ANY CLAIM BY ANY OTHER PARTY.                               
  16. ;
  17. ; 15 october 1990
  18. ; Program written by Thom Bierenbroodspot
  19. ; Microsoft B.V. 
  20. ; The Netherlands
  21.  
  22. .model large,fortran
  23.  
  24. .code
  25.  
  26. INTERRUPT proc far
  27.      push bp                  ;Save necessary registers that 
  28.      mov bp,sp                ;will be altered
  29.      push di
  30.      push si
  31.      push es
  32.  
  33.      mov bx,[bp+0ch]          ;Get segment of inregs
  34.      mov es,bx                ;move segment in es
  35.      mov si,[bp+0ah]          ;Get offset of inregs
  36.      mov cx,07h               ;Number of registers to load
  37.      mov bx,02h               ;Replacement of offset index
  38.  
  39. getregs:
  40.      mov ax,es:[si]           ;get value of ax from inregs and save
  41.      push ax                  ;continue with bx,cx..flags 
  42.      add si,bx                ;Adjust offset with replacement
  43.      loop getregs
  44.  
  45. ;get far address interrupt from vectortable
  46.  
  47.      ;get interrupt number
  48.      mov bx,[bp+10h]          ;Get segment of intnum
  49.      mov es,bx                ;move segment in es
  50.      mov si,[bp+0eh]          ;get offset of intnum
  51.      mov bx,es:[si]           ;get value of intnum
  52.  
  53.      ;adjust to offset in vectortable
  54.      sal bx,1                 ;ShiftL*2 for for 4 byte replacement in
  55.      sal bx,1                 ;vector table
  56.  
  57.      mov si,bx                ;save in si
  58.      xor bx,bx                ;zero bx
  59.      mov es,bx                ;load 0 segment in es
  60.      mov bx,es:[si]           ;load offset of interrupt from table
  61.      mov ax,bx                ;save offset in ax
  62.      mov bx,es:[si+2]         ;load segment of interrupt from table
  63.  
  64.      ;and save far address on stack       
  65.      mov [bp+0eh],ax          ;save offset on stack for use with call
  66.      mov [bp+10h],bx          ;save segment on stack for use with call
  67.  
  68.      popf                     ;load flags and registers
  69.      pop di
  70.      pop si
  71.      pop dx
  72.      pop cx
  73.      pop bx
  74.      pop ax
  75.      pushf                    ;do the actual int x
  76.      call  dword ptr [bp+0eh]
  77.  
  78. endprocint:
  79.      pushf
  80.      push di
  81.      push si
  82.      push dx
  83.      push cx
  84.      push bx
  85.      push ax
  86.      mov bx,[bp+08h]          ;Get segment of outregs
  87.      mov es,bx                ;move segment in es
  88.      mov si,[bp+06h]          ;Get offset of outregs
  89.  
  90.      mov cx,07h               ;Number of registers to save
  91.      mov bx,02h               ;Replacement for offset index
  92.  
  93. saveregs:
  94.      pop ax                   ;get value of ax and store it in outregs
  95.      mov es:[si],ax           ;continue with bx,cx..flags
  96.      add si,bx                ;Adjust offset with replacement
  97.      loop saveregs
  98.  
  99.      pop es
  100.      pop si                    ;restore values of saved registers
  101.      pop di                    ;before returning from the procedure
  102.      pop bp
  103.      ret 12                    ;and finish procedure
  104.  
  105. INTERRUPT endp
  106.  
  107. INTERRUPTX proc far
  108.      push bp                  ;Save necessary registers that 
  109.      mov bp,sp                ;will be altered
  110.      push di
  111.      push si
  112.      push es
  113.      push ds
  114.  
  115.      mov bx,[bp+0ch]          ;Get segment of inregs
  116.      mov es,bx                ;move segment in es
  117.      mov si,[bp+0ah]          ;Get offset of inregs
  118.      mov cx,09h               ;Number of registers to load
  119.      mov bx,02h               ;Replacement of offset index
  120.  
  121. getregsX:
  122.      mov ax,es:[si]           ;get value of ax from inregs and save
  123.      push ax                  ;continue with bx,cx..flags 
  124.      add si,bx                ;Adjust offset with replacement
  125.      loop getregsX
  126.  
  127. ;get far address interrupt from vectortable
  128.  
  129.      ;get interrupt number
  130.      mov bx,[bp+10h]          ;Get segment of intnum
  131.      mov es,bx                ;move segment in es
  132.      mov si,[bp+0eh]          ;get offset of intnum
  133.      mov bx,es:[si]           ;get value of intnum
  134.  
  135.      ;adjust to offset in vectortable
  136.      sal bx,1                 ;ShiftL*2 for for 4 byte replacement in
  137.      sal bx,1                 ;vector table
  138.  
  139.      mov si,bx                ;save in si
  140.      xor bx,bx                ;zero bx
  141.      mov es,bx                ;load 0 segment in es
  142.      mov bx,es:[si]           ;load offset of interrupt from table
  143.      mov ax,bx                ;save offset in ax
  144.      mov bx,es:[si+2]         ;load segment of interrupt from table
  145.  
  146.      ;and save far address on stack       
  147.      mov [bp+0eh],ax          ;save offset on stack for use with call
  148.      mov [bp+10h],bx          ;save segment on stack for use with call
  149.  
  150.      popf                     ;load flags and registers
  151.      pop ds
  152.      pop es
  153.      pop di
  154.      pop si
  155.      pop dx
  156.      pop cx
  157.      pop bx
  158.      pop ax
  159.      pushf                    ;do the actual int x
  160.      call  dword ptr [bp+0eh]
  161.  
  162. ;end procedure
  163.      pushf
  164.      push ds
  165.      push es
  166.      push di
  167.      push si
  168.      push dx
  169.      push cx
  170.      push bx
  171.      push ax
  172.      mov bx,[bp+08h]          ;Get segment of outregs
  173.      mov es,bx                ;move segment in es
  174.      mov si,[bp+06h]          ;Get offset of outregs
  175.  
  176.      mov cx,09h               ;Number of registers to save
  177.      mov bx,02h               ;Replacement for offset index
  178.  
  179. saveregsX:
  180.      pop ax                   ;get value of ax and store it in outregs
  181.      mov es:[si],ax           ;continue with bx,cx..flags
  182.      add si,bx                ;Adjust offset with replacement
  183.      loop saveregsX
  184.  
  185.      pop ds
  186.      pop es
  187.      pop si                    ;restore values of saved registers
  188.      pop di                    ;before returning from the procedure
  189.      pop bp
  190.      ret 12                    ;and finish procedure
  191.  
  192. INTERRUPTX endp
  193.  
  194. end
  195.