home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / tvision / dpmi / clib / int86.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-29  |  6.4 KB  |  270 lines

  1. //=====================================================================
  2. //
  3. //  int86.cpp
  4. //
  5. //  call dos / bios 
  6. //
  7. //  Protected Mode version
  8. //
  9. //  Copyright (c) 1994, Kevin Morgan, All rights reserved.
  10. //
  11. //=====================================================================
  12.  
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <dos.h>
  16.  
  17. #include "dpmish.h"
  18. #include "dosext.h"
  19.  
  20. class RealInt {
  21.     public:
  22.     unsigned char opcode;
  23.     unsigned char intnr;
  24.     unsigned char retf;
  25.     RealInt(unsigned anOp, unsigned anInt, unsigned aRet) :
  26.         opcode(anOp), intnr(anInt), retf(aRet) { }
  27. };
  28.  
  29. //=====================================================================
  30. //
  31. //  int86x
  32. //
  33. //  handle int86 calls from protected mode
  34. //=====================================================================
  35. int int86x(int intNr, REGS far *inregs, REGS far *outregs, SREGS far *segregs)
  36. {
  37.     RealInt *code = new RealInt( 0xcd, intNr, 0xcb);    // int x; retf
  38.     void far (far *newCode)(void);
  39.     unsigned ExecuteSeg;
  40.     if (Dpmi.createAlias(FP_SEG(code), ExecuteSeg)!=DPMI_OK) {
  41.         return -1;
  42.     }
  43.     if (Dpmi.setAccessRights(ExecuteSeg, AccessRightsCode)!=DPMI_OK)
  44.         return -1;
  45.  
  46.     FP_SEG(newCode) = ExecuteSeg;            // use alias effect
  47.     FP_OFF(newCode) = FP_OFF( code );
  48.  
  49.     asm{
  50.         lds     si, segregs
  51.         mov     ax, [si].(SREGS)es
  52.         push ax
  53.         mov     ax, [si].(SREGS)ds
  54.         push ax
  55.  
  56.         lds     si, inregs
  57.         mov     ax, [si].(REGS)x.ax
  58.         mov     bx, [si].(REGS)x.bx
  59.         mov     cx, [si].(REGS)x.cx
  60.         mov     dx, [si].(REGS)x.dx
  61.         mov     di, [si].(REGS)x.di
  62.         mov     si, [si].(REGS)x.si
  63.         pop     ds
  64.         pop     es
  65.  
  66.         push    bp              /* just to be safe */
  67.     }
  68.         (*newCode)();
  69.     asm {
  70.         pop     bp
  71.  
  72.         /* Set register structure with registers */
  73.         push    ax
  74.         pushf
  75.         pushf
  76.         push    si
  77.         push    ds
  78.         push    es
  79.  
  80.         lds     si, segregs
  81.         pop     ax; mov [si].(SREGS)es, ax
  82.         pop     ax; mov [si].(SREGS)ds, ax
  83.  
  84.         lds     si, outregs
  85.         pop     ax; mov [si].si, ax
  86.         pop     ax; mov [si].(union REGS)x.flags, ax
  87.         pop     ax; mov [si].cflag, ax
  88.         and     word ptr [si].cflag, 1
  89.         pop     ax
  90.  
  91.         mov     [si].di, di
  92.         mov     [si].dx, dx
  93.         mov     [si].cx, cx
  94.         mov     [si].bx, bx
  95.         mov     [si].ax, ax
  96.         pop     ds
  97.     }
  98.     int returnCode = _AX;
  99.     Dpmi.freeSelector(ExecuteSeg);
  100.     delete code;
  101.     return(returnCode);
  102. }
  103.  
  104.  
  105. //=====================================================================
  106. //
  107. //  int86
  108. //
  109. //  handle int86 calls from protected mode
  110. //=====================================================================
  111. int int86(int intNr, REGS far *inregs, REGS far *outregs)
  112. {
  113.     RealInt *code = new RealInt( 0xcd, intNr, 0xcb);    // int x; retf
  114.  
  115.     void far (far *newCode)(void);
  116.  
  117.     unsigned ExecuteSeg;
  118.     if (Dpmi.createAlias(FP_SEG(code), ExecuteSeg)!=DPMI_OK) {
  119.         return -1;
  120.     }
  121.     if (Dpmi.setAccessRights(ExecuteSeg, AccessRightsCode)!=DPMI_OK)
  122.         return -1;
  123.  
  124.     FP_SEG(newCode) = ExecuteSeg;            // use alias effect
  125.     FP_OFF(newCode) = FP_OFF( code );
  126.  
  127.     asm{
  128.         push    ds
  129.         lds     si, inregs
  130.         mov     ax, [si].ax
  131.         mov     bx, [si].bx
  132.         mov     cx, [si].cx
  133.         mov     dx, [si].dx
  134.         mov     di, [si].di
  135.         mov     si, [si].si
  136.  
  137.         push    bp              /* just to be safe */
  138.     }
  139.     (*newCode)();
  140.     asm {
  141.         pop     bp
  142.  
  143.         /* Set register structure with registers */
  144.         push    ax
  145.         pushf
  146.         pushf
  147.         push    si
  148.  
  149.         lds     si, outregs
  150.         pop ax; mov [si].si, ax
  151.         pop ax; mov [si].(union REGS)x.flags, ax
  152.         pop ax; mov [si].cflag, ax
  153.         and     word ptr [si].cflag, 1
  154.         pop ax
  155.         mov     [si].di, di
  156.         mov     [si].dx, dx
  157.         mov     [si].cx, cx
  158.         mov     [si].bx, bx
  159.         mov     [si].ax, ax
  160.         pop     ds
  161.     }
  162.     int returnCode = _AX;
  163.     Dpmi.freeSelector(ExecuteSeg);
  164.     delete code;
  165.     return(returnCode);
  166. }
  167.  
  168. //=====================================================================
  169. //
  170. //  intdosx
  171. //
  172. //  handle int86 calls from protected mode
  173. //=====================================================================
  174. int intdosx(REGS far *inregs, REGS far *outregs, SREGS far *segregs)
  175. {
  176.     asm{
  177.         lds     si, segregs
  178.         mov     ax, [si].(SREGS)es
  179.         push ax
  180.         mov     ax, [si].(SREGS)ds
  181.         push ax
  182.  
  183.         lds     si, inregs
  184.         mov     ax, [si].(REGS)x.ax
  185.         mov     bx, [si].(REGS)x.bx
  186.         mov     cx, [si].(REGS)x.cx
  187.         mov     dx, [si].(REGS)x.dx
  188.         mov     di, [si].(REGS)x.di
  189.         mov     si, [si].(REGS)x.si
  190.         pop     ds
  191.         pop     es
  192.  
  193.         push    bp              /* just to be safe */
  194.         int        21h
  195.         pop     bp
  196.  
  197.         /* Set register structure with registers */
  198.         push    ax
  199.         pushf
  200.         pushf
  201.         push    si
  202.         push    ds
  203.         push    es
  204.  
  205.         lds     si, segregs
  206.         pop     ax; mov [si].(SREGS)es, ax
  207.         pop     ax; mov [si].(SREGS)ds, ax
  208.  
  209.         lds     si, outregs
  210.         pop     ax; mov [si].si, ax
  211.         pop     ax; mov [si].(union REGS)x.flags, ax
  212.         pop     ax; mov [si].cflag, ax
  213.         and     word ptr [si].cflag, 1
  214.         pop     ax
  215.  
  216.         mov     [si].di, di
  217.         mov     [si].dx, dx
  218.         mov     [si].cx, cx
  219.         mov     [si].bx, bx
  220.         mov     [si].ax, ax
  221.         pop     ds
  222.     }
  223.     return _AX;
  224. }
  225.  
  226.  
  227. //=====================================================================
  228. //
  229. //  intdos
  230. //
  231. //  handle int86 calls from protected mode
  232. //=====================================================================
  233. int intdos(REGS far *inregs, REGS far *outregs)
  234. {
  235.     asm{
  236.         push    ds
  237.         lds     si, inregs
  238.         mov     ax, [si].ax
  239.         mov     bx, [si].bx
  240.         mov     cx, [si].cx
  241.         mov     dx, [si].dx
  242.         mov     di, [si].di
  243.         mov     si, [si].si
  244.  
  245.         push    bp              /* just to be safe */
  246.         int        21h
  247.         pop     bp
  248.  
  249.         /* Set register structure with registers */
  250.         push    ax
  251.         pushf
  252.         pushf
  253.         push    si
  254.  
  255.         lds     si, outregs
  256.         pop ax; mov [si].si, ax
  257.         pop ax; mov [si].(union REGS)x.flags, ax
  258.         pop ax; mov [si].cflag, ax
  259.         and     word ptr [si].cflag, 1
  260.         pop ax
  261.         mov     [si].di, di
  262.         mov     [si].dx, dx
  263.         mov     [si].cx, cx
  264.         mov     [si].bx, bx
  265.         mov     [si].ax, ax
  266.         pop     ds
  267.     }
  268.     return _AX;
  269. }
  270.