home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / misc / driver.idc < prev    next >
Text File  |  1994-12-26  |  2KB  |  81 lines

  1. //
  2. //      This file is executed when a new device driver is loaded.
  3. //              Device drivers have extensions DRV or SYS.
  4. //
  5. //
  6.  
  7. static main(void) {
  8.   auto x,i,base;
  9.   auto intr,strt;
  10.   auto attr,cmt;
  11.   auto nextbase;
  12.   
  13.   i = 0;
  14.   x = MinEA();
  15.   base = (x >> 4);            // The segment base
  16.  
  17.   while ( 1 ) {
  18.     Message(form("Device driver block at %04lX",x) + "\n");
  19.  
  20.     MakeName(x,form("NextDevice_%ld",i));
  21.     MakeWord(x);
  22.     OpNum(x);
  23.     if ( Word(x) == 0xFFFF ) {
  24.       MakeComm(x,"The last device");
  25.     } else {
  26.       nextbase = base + Word(x+2);
  27.       OpOffset(x,[nextbase,0]);
  28.       MakeComm(x,"Offset to the next device");
  29.     }
  30.  
  31.     MakeWord(x+2);
  32.     OpNum(x+2);
  33.  
  34.     MakeName(x+4,form("DevAttr_%ld",i));
  35.     MakeWord(x+4);
  36.     OpNum(x+4);
  37.     attr = Word(x+4);
  38.     cmt = "";
  39.     if ( attr & (1<< 0) ) cmt = cmt + "stdin device\n";
  40.     if ( attr & (1<< 1) ) cmt = cmt + ((attr & (1<<15)) ? "stdout device\n" : ">32M\n");
  41.     if ( attr & (1<< 2) ) cmt = cmt + "stdnull device\n";
  42.     if ( attr & (1<< 3) ) cmt = cmt + "clock device\n";
  43.     if ( attr & (1<< 6) ) cmt = cmt + "supports logical devices\n";
  44.     if ( attr & (1<<11) ) cmt = cmt + "supports open/close/RM\n";
  45.     if ( attr & (1<<13) ) cmt = cmt + "non-IBM block device\n";
  46.     if ( attr & (1<<14) ) cmt = cmt + "supports IOCTL\n";
  47.     cmt = cmt + ((attr & (1<<15)) ? "character device" : "block device");
  48.     MakeComm(x+4,cmt);
  49.  
  50.     MakeName(x+6,form("Strategy_%ld",i));
  51.     MakeWord(x+6);
  52.     OpOffset(x+6,MinEA());
  53.  
  54.     MakeName(x+8,form("Interrupt_%ld",i));
  55.     MakeWord(x+8);
  56.     OpOffset(x+8,MinEA());
  57.  
  58.     MakeName(x+0xA,form("DeviceName_%ld",i));
  59.     MakeStr (x+0xA,8);
  60.     MakeComm(x+0xA,"May be device number");
  61.  
  62.     strt = [ base, Word(x+6) ];
  63.     intr = [ base, Word(x+8) ];
  64.     MakeCode( strt );
  65.     MakeCode( intr );
  66.     MakeName( strt, form("Strategy_Routine_%ld",i));
  67.     MakeName( intr, form("Interrupt_Routine_%ld",i));
  68.     MakeComm( strt, "ES:BX -> Device Request Block");
  69.     MakeComm( intr, "Device Request Block:\n"
  70.                 "0 db length\n"
  71.             "1 db unit number\n"
  72.             "2 db command code\n"
  73.             "5 d? reserved\n"
  74.             "0D d? command specific data");
  75.  
  76.     if ( Word(x) == 0xFFFF ) break;
  77.     x = [ nextbase, Word(x) ];
  78.     i = i + 1;
  79.   }
  80. }
  81.