home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / fortran / mslang / f32int / int86qq.asm < prev    next >
Assembly Source File  |  1993-06-25  |  6KB  |  207 lines

  1. ;
  2. ; SUBROUTINE INT86QQ( intnum, inregs, outregs )
  3. ;
  4. ; Inputs: intnum - interrupt number to be executed (integer*2 value)
  5. ;         inregs - pointer to REGINFO structure, contains input register
  6. ;                  values for interrupt
  7. ;
  8. ; Outputs: outregs - pointer to REGINFO structure, contains the return
  9. ;                    registers for the interrupt
  10. ;
  11.  
  12.  
  13.     .386
  14.  
  15.       .MODEL  flat, stdcall
  16.  
  17. REGINFO         STRUCT  4      ; Register structure used in application
  18.  
  19.    RegEAX       DWORD   0
  20.    RegEBX       DWORD   0
  21.    RegECX       DWORD   0
  22.    RegEDX       DWORD   0
  23.    RegESI       DWORD   0
  24.    RegEDI       DWORD   0
  25.    RegCFLAG      WORD   0
  26.  
  27. REGINFO         ENDS
  28.  
  29.  
  30. REG_BLOCK      STRUCT          ; Register structure used by Phar Lap
  31.  
  32.    IntNum      WORD     ?
  33.    RealDS      WORD     ?
  34.    RealES      WORD     ?
  35.    RealFS      WORD     ?
  36.    RealGS      WORD     ?
  37.    RealEAX     DWORD    ?
  38.    RealEDX     DWORD    ?
  39.    
  40. REG_BLOCK      ENDS  
  41.                                                
  42.  
  43. TRANS_BLOCK    STRUCT          ; Register structure used by DPMI
  44.  
  45.    RegEDI      DWORD    ?
  46.    RegESI      DWORD    ?
  47.    RegEBP      DWORD    ?
  48.    Reserv1     DWORD    ?
  49.    RegEBX      DWORD    ?
  50.    RegEDX      DWORD    ?
  51.    RegECX      DWORD    ?
  52.    RegEAX      DWORD    ?
  53.    FlagReg      WORD    ?
  54.    RegES        WORD    ?
  55.    RegDS        WORD    ?
  56.    RegFS        WORD    ?
  57.    RegGS        WORD    ?
  58.    RegIP        WORD    ?
  59.    RegCS        WORD    ?
  60.    RegSP        WORD    ?
  61.    RegSS        WORD    ?
  62.  
  63.  
  64. TRANS_BLOCK    ENDS
  65.  
  66.  
  67. INT86QQ PROTO   STDCALL, intnum:WORD, inregs:PTR REGINFO, outregs:PTR REGINFO
  68.  
  69.       .DATA               
  70.  
  71. DPMI_block     TRANS_BLOCK <?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?>
  72. Parm_block     REG_BLOCK   <?,?,?,?,?,?,?>      
  73. check_DPMI     dd          0
  74. DPMI_avail     dd          0
  75.    
  76.       .CODE
  77.  
  78.                             
  79. INT86QQ   PROC STDCALL USES ebx esi edi,
  80.                             intnum:WORD,         ; interrupt number
  81.                             inregs:PTR REGINFO,  ; input registers
  82.                             outregs:PTR REGINFO  ; output registers
  83.                             
  84.       .IF   !check_DPMI           ; have we checked yet for DPMI?
  85.             mov   check_DPMI,1
  86.             mov   ax,1686H
  87.             int   2fH             ; check for DMPI here
  88.             or    ax,ax
  89.             jnz   no_DPMI
  90.             mov   DPMI_avail,1    ; We have DPMI, so set flag
  91.       .ELSE
  92.            .IF    !DPMI_avail
  93.                   jmp   no_DPMI
  94.            .ENDIF
  95.       .ENDIF
  96.             
  97. use_DPMI:
  98.  
  99.       mov    ecx,inregs      ; Load registers into DPMI structure
  100.       lea    edx,DPMI_block       
  101.       
  102.       mov    eax,[ecx]       ; EAX
  103.       mov    [edx+28],eax
  104.       
  105.       mov    eax,[ecx+4]     ; EBX
  106.       mov    [edx+16],eax
  107.       
  108.       mov    eax,[ecx+8]     ; ECX
  109.       mov    [edx+24],eax
  110.       
  111.       mov    eax,[ecx+12]    ; EDX
  112.       mov    [edx+20],eax
  113.      
  114.       mov    eax,[ecx+16]    ; ESI
  115.       mov    [edx+4],eax
  116.      
  117.       mov    eax,[ecx+20]    ; EDI
  118.       mov    [edx],eax
  119.      
  120.                             
  121.       mov    ax,0300h           ; simulate real mode interrupt
  122.       lea    edi,DPMI_block
  123.       mov    bx,intnum
  124.       mov    bh,1
  125.       sub    cx,cx
  126.       int    31H
  127.                             
  128.       mov    ecx,outregs                                    
  129.       
  130.       .IF    CARRY?                       ; store carry flag
  131.              mov    WORD PTR [ecx+22],1
  132.       .ELSE
  133.              mov    WORD PTR [ecx+22],0
  134.       .ENDIF        
  135.       
  136.       lea    edx,DPMI_block  ; Store registers into REGINFO structure
  137.       
  138.       mov    eax,[edx+28]
  139.       mov    [ecx],eax       ; EAX
  140.       
  141.       mov    eax,[edx+16]
  142.       mov    [ecx+4],eax     ; EBX
  143.       
  144.       mov    eax,[edx+24]
  145.       mov    [ecx+8],eax     ; ECX
  146.       
  147.       mov    eax,[edx+20]
  148.       mov    [ecx+12],eax    ; EDX
  149.      
  150.       mov    eax,[edx+4]
  151.       mov    [ecx+16],eax    ; ESI
  152.      
  153.       mov    eax,[edx]
  154.       mov    [ecx+20],eax    ; EDI
  155.      
  156.       jmp   We_are_done                                       
  157.  
  158. no_DPMI:               
  159.                                    
  160.       mov    cx,intnum     ; LOAD PARAMETER BLOCK
  161.       mov    Parm_block.Intnum,cx
  162.       
  163.       
  164.       mov    ecx,inregs    ; LOAD REGISTERS
  165.       mov    eax,[ecx+8]   ; get ecx register
  166.       push   eax           ;  and save
  167.       
  168.       mov    eax,[ecx]     ; load registers
  169.       mov    Parm_block.RealEAX,eax
  170.       mov    ebx,[ecx+4]
  171.       mov    edx,[ecx+12]
  172.       mov    Parm_block.RealEDX,edx
  173.       mov    esi,[ecx+16]
  174.       mov    edi,[ecx+20]
  175.       pop    ecx
  176.       
  177.       LEA    edx, Parm_block          
  178.       mov    ax,2511h      ; Issue real mode interrupt (Phar Lap)
  179.       int    21H           ; system call
  180.       
  181.       push   ecx
  182.       mov    ecx,outregs                                    
  183.       
  184.       .IF    CARRY?                       ; store carry flag
  185.              mov    WORD PTR [ecx+22],1
  186.       .ELSE
  187.              mov    WORD PTR [ecx+22],0
  188.       .ENDIF
  189.                                    
  190.       mov    [ecx],eax     ; store return registers
  191.       mov    [ecx+4],ebx
  192.       mov    edx,Parm_block.RealEDX
  193.       mov    [ecx+12],edx
  194.       mov    [ecx+16],esi
  195.       mov    [ecx+20],edi
  196.       
  197.       pop    ecx         
  198.       
  199. We_are_done:
  200.       
  201.       ret
  202.             
  203. INT86QQ ENDP
  204.  
  205.       
  206.       END
  207.