home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ida35bc.zip / DRIVER.IDC < prev    next >
Text File  |  1996-01-29  |  3KB  |  100 lines

  1. //
  2. //      This file is executed when a new device driver is loaded.
  3. //              Device drivers have extensions DRV or SYS.
  4. //
  5. // History:
  6. //
  7. // 08/12/95 20:16 by Alexey Kulentsov:
  8. // + Check for Device Request Block
  9. // + Cludge with Drv/Com supported
  10. // 04/01/96 04:21 by ig:
  11. // + 0000:0000 means end of devices chain too.
  12.  
  13. static main(void) {
  14.   auto x,i,base;
  15.   auto intr,strt;
  16.   auto attr,cmt;
  17.   auto nextbase;
  18.   auto DevReq;
  19.  
  20.   i = 0;
  21.   x = MinEA();
  22.   base = (x >> 4);   // The segment base
  23.  
  24.   while ( 1 ) {
  25.     Message(form("Device driver block at %04lX",x) + "\n");
  26.  
  27.     MakeName(x,form("NextDevice_%ld",i));
  28.     MakeWord(x);
  29.     OpNum(x);
  30.     if ( Word(x) == 0xFFFF ) {
  31.       MakeComm(x,"The last device");
  32.     } else {
  33.       nextbase = base + Word(x+2);
  34.       OpOffset(x,[nextbase,0]);
  35.       MakeComm(x,"Offset to the next device");
  36.     }
  37.  
  38.     MakeWord(x+2);
  39.     OpNum(x+2);
  40.  
  41.     MakeName(x+4,form("DevAttr_%ld",i));
  42.     MakeWord(x+4);
  43.     OpNum(x+4);
  44.     attr = Word(x+4);
  45.     cmt = "";
  46.     if ( attr & (1<< 0) ) cmt = cmt + "stdin device\n";
  47.     if ( attr & (1<< 1) ) cmt = cmt + ((attr & (1<<15)) ? "stdout device\n" : ">32M\n");
  48.     if ( attr & (1<< 2) ) cmt = cmt + "stdnull device\n";
  49.     if ( attr & (1<< 3) ) cmt = cmt + "clock device\n";
  50.     if ( attr & (1<< 6) ) cmt = cmt + "supports logical devices\n";
  51.     if ( attr & (1<<11) ) cmt = cmt + "supports open/close/RM\n";
  52.     if ( attr & (1<<13) ) cmt = cmt + "non-IBM block device\n";
  53.     if ( attr & (1<<14) ) cmt = cmt + "supports IOCTL\n";
  54.     cmt = cmt + ((attr & (1<<15)) ? "character device" : "block device");
  55.     MakeComm(x+4,cmt);
  56.  
  57.     MakeName(x+6,form("Strategy_%ld",i));
  58.     MakeWord(x+6);
  59.     OpOffset(x+6,MinEA());
  60.  
  61.     MakeName(x+8,form("Interrupt_%ld",i));
  62.     MakeWord(x+8);
  63.     OpOffset(x+8,MinEA());
  64.  
  65.     MakeName(x+0xA,form("DeviceName_%ld",i));
  66.     MakeStr (x+0xA,8);
  67.     MakeComm(x+0xA,"May be device number");
  68.  
  69.     strt = [ base, Word(x+6) ];
  70.     intr = [ base, Word(x+8) ];
  71.     MakeCode( strt );
  72.     MakeCode( intr );
  73.     MakeName( strt, form("Strategy_Routine_%ld",i));
  74.     MakeName( intr, form("Interrupt_Routine_%ld",i));
  75.     MakeComm( strt, "ES:BX -> Device Request Block");
  76.     MakeComm( intr, "Device Request Block:\n"
  77.           "0 db length\n"
  78.       "1 db unit number\n"
  79.       "2 db command code\n"
  80.       "5 d? reserved\n"
  81.       "0D d? command specific data");
  82.  
  83.     if( Byte( strt )==0x2E && Word(strt+1)==0x1E89
  84.      && Byte(strt+5)==0x2E && Word(strt+6)==0x068C
  85.      && Word(strt+3)==Word(strt+8)-2)
  86.     {
  87.      DevReq=Word(strt+3);
  88.      Message(form("DevReq at %x",DevReq) + "\n");
  89.      MakeUnkn(x+DevReq,0);MakeUnkn(x+DevReq+2,0);
  90.      MakeDword(x+DevReq);MakeName(x+DevReq,form("DevRequest_%ld",i));
  91.     }
  92.  
  93.     if ( Word(x) == 0xFFFF ||
  94.        ((Byte(x)==0xE9 || Byte(x)==0xEB) && i==0) ) break;
  95.     if ( Dword(x) == 0 ) break;    // 04.01.96
  96.     x = [ nextbase, Word(x) ];
  97.     i = i + 1;
  98.   }
  99. }
  100.