home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / caway349.zip / BIN / INTC.C < prev    next >
C/C++ Source or Header  |  1996-06-17  |  2KB  |  96 lines

  1. // INTC.C
  2. // Demonstrates calling interrupt not natively supported by CauseWay
  3. //  that uses segment:offset pointers.
  4. // C language version, assembly language version is INTASM.ASM
  5. //
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <i86.h>
  9.  
  10. typedef unsigned short int SELECTOR;
  11. typedef long int REGISTER32;
  12. typedef short int REGISTER16;
  13. typedef unsigned short int RMSEGMENT;
  14.  
  15. struct RMRL        // Used by IntXX
  16. {
  17.    REGISTER32  EDI;
  18.    REGISTER32  ESI;
  19.    REGISTER32  EBP;
  20.    long        Reserved;
  21.    REGISTER32  EBX;
  22.    REGISTER32  EDX;
  23.    REGISTER32  ECX;
  24.    REGISTER32  EAX;
  25.    REGISTER16  Flags;
  26.    SELECTOR    ES;
  27.    SELECTOR    DS;
  28.    SELECTOR    FS;
  29.    SELECTOR    GS;
  30.    REGISTER16  IP;
  31.    SELECTOR    CS;
  32.    REGISTER16  SP;
  33.    SELECTOR    SS;
  34. };
  35.  
  36. char FileName[128]="INTC.EXE";
  37.  
  38. unsigned short int ASCIIZSegment;
  39. unsigned short int ASCIIZSelector;
  40. unsigned short int CanonicalSegment;
  41. unsigned short int CanonicalSelector;
  42.  
  43. union REGS regs;
  44. struct SREGS sregs;
  45. struct RMRL RealRegs;
  46.  
  47. // optionally pass a different file name than current on command line
  48. int    main(int argc, char *argv[])
  49. {
  50.     if(argc>1){
  51.         strcpy(FileName,argv[1]);
  52.     }
  53.     regs.w.bx=8;
  54.     regs.w.ax=0xff21;
  55.     int386(0x31,®s,®s);    // get low dos memory
  56.     if(regs.x.cflag & 1){    // carry set
  57.         bail();
  58.     }
  59.     ASCIIZSelector=regs.w.dx;
  60.     ASCIIZSegment=regs.w.ax;
  61.  
  62.     regs.w.bx=8;
  63.     regs.w.ax=0xff21;
  64.     int386(0x31,®s,®s);    // get low dos memory
  65.     if(regs.x.cflag & 1){    // carry set
  66.         bail();
  67.     }
  68.     CanonicalSelector=regs.w.dx;
  69.     CanonicalSegment=regs.w.ax;
  70.  
  71.     movedata(FP_SEG(FileName),FP_OFF(FileName),ASCIIZSelector,0,strlen(FileName)+1);
  72.  
  73.     RealRegs.ESI=0;
  74.     RealRegs.EDI=0;
  75.     RealRegs.DS=ASCIIZSegment;
  76.     RealRegs.ES=CanonicalSegment;
  77.     RealRegs.EAX=0x6000;
  78.     regs.w.ax=0xff01;
  79.     regs.h.bl=0x21;
  80.     regs.x.edi=(long)&RealRegs;
  81.     int386(0x31,®s,®s);
  82.     if(RealRegs.Flags & 1){    // carry set
  83.         bail();
  84.     }
  85.  
  86.     printf("\n%Fs",MK_FP(CanonicalSelector,0));
  87.  
  88.     return(0);
  89. }
  90.  
  91. void bail(void)
  92. {
  93.     printf("\nError occurred!");
  94.     exit(1);
  95. }
  96.