⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ataiotrc.c

📁 ATADRVR是DOS下的磁盘驱动程序,采用PIO传输 ,PCI DMA传输,ATA包,等非常全面代码示例... 内部有C与Asm描述. 编译环境:Borland C/C++ 4.52 与 Bo
💻 C
📖 第 1 页 / 共 3 页
字号:
   if ( chtBuf[chtDmpNdx].flg == TRC_FLAG_SRST )
   {
      // TRC_TYPE_ASR -> DEV n, LBAnn, RESET ; nn nn xxH xxH

      //0        1         2         3         4         5         6         7
      //123456789012345678901234567890123456789012345678901234567890123456789012
      //DEV n, LBAnn, RESET                                  ; nn nn xxH xxH

      sprintf( trcDmpBuf,
         "DEV %d, LBA28, RESET                                 ",
            ( chtBuf[chtDmpNdx].dh1 & 0x10 ) ? 1 : 0 );
      strcat( trcDmpBuf, esStr );
   }
   else
   if ( chtBuf[chtDmpNdx].flg == TRC_FLAG_ATA )
   {
      // TRC_TYPE_ADMAI -> DEV n, LBAnn, DR      xxH sc lba    ; nn nn xxH xxH
      // TRC_TYPE_ADMAO -> DEV n, LBAnn, DW      xxH sc lba    ; nn nn xxH xxH
      // TRC_TYPE_AND   -> DEV n, LBAnn, ND  xxH xxH sc lba    ; nn nn xxH xxH
      // TRC_TYPE_APDI  -> DEV n, LBAnn, PDI xxH xxH sc lba mc ; nn nn xxH xxH
      // TRC_TYPE_APDO  -> DEV n, LBAnn, PDO xxH xxH sc lba mc ; nn nn xxH xxH

      // format the LBAxx/CHS and starting LBA/CHS
      if ( chtBuf[chtDmpNdx].lbaSize == 48 )
      {
         strcpy( atStr, "LBA48," );
         sprintf( saStr, " %12ld", chtBuf[chtDmpNdx].lbaLow1 );
      }
      else
      if ( chtBuf[chtDmpNdx].lbaSize == 28 )
      {
         strcpy( atStr, "LBA28," );
         sprintf( saStr, " %12ld", chtBuf[chtDmpNdx].lbaLow1 );
      }
      else
      {
         strcpy( atStr, "CHS,  " );
         sprintf( saStr, " %5u %2u %3u",
                  chtBuf[chtDmpNdx].cyl,
                  chtBuf[chtDmpNdx].head,
                  chtBuf[chtDmpNdx].sect );
      }

      // format the MC
      if (    ( chtBuf[chtDmpNdx].cmd == CMD_READ_MULTIPLE )
           || ( chtBuf[chtDmpNdx].cmd == CMD_READ_MULTIPLE_EXT )
           || ( chtBuf[chtDmpNdx].cmd == CMD_WRITE_MULTIPLE )
           || ( chtBuf[chtDmpNdx].cmd == CMD_WRITE_MULTIPLE_EXT )
           || ( chtBuf[chtDmpNdx].cmd == CMD_CFA_WRITE_MULTIPLE_WO_ERASE )
         )
         sprintf( mcStr, " %3d", chtBuf[chtDmpNdx].mc );
      else
         strcpy( mcStr, "    " );

        //0        1         2         3         4         5         6         7
        //123456789012345678901234567890123456789012345678901234567890123456789012
        //DEV n, LBAnn, ttttt xxH xxxxH nnnnn nnnnnnnnn    nnn ; nn nn xxH xxH
        //DEV n, CHS,   ttttt xxH xxxxH nnnnn ccccc hh sss nnn ; nn nn xxH xxH

      sprintf( trcDmpBuf,
         "DEV %d, %s %s %02XH %4XH %5u",
            ( chtBuf[chtDmpNdx].dh1 & 0x10 ) ? 1 : 0,
            atStr,
            chtTypeName[chtBuf[chtDmpNdx].ct],
            chtBuf[chtDmpNdx].cmd,
            chtBuf[chtDmpNdx].fr1,
            chtBuf[chtDmpNdx].ns );
      strcat( trcDmpBuf, saStr );
      strcat( trcDmpBuf, mcStr );
      strcat( trcDmpBuf, esStr );
   }
   else
   if ( chtBuf[chtDmpNdx].flg == TRC_FLAG_ATAPI )
   {
      // TRC_TYPE_PDMAI -> not used by ATACT
      // TRC_TYPE_PDMAO -> not used by ATACT
      // TRC_TYPE_PND   -> DEV n, PN bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH
      // TRC_TYPE_PPDI  -> DEV n, PR bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH
      // TRC_TYPE_PPDO  -> DEV n, PW bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH

      if ( chtBuf[chtDmpNdx].cdbSize == 12 )
      {
         //DEV n, t n x x x x x x x x x x x x ; nn nn xxH xxH
         sprintf( trcDmpBuf,
            "DEV %d, %3.3s %u %02XH %d %d %d %d %d %d %d %d %d %d %d",
               ( chtBuf[chtDmpNdx].dh1 & 0x10 ) ? 1 : 0,
               chtTypeName[chtBuf[chtDmpNdx].ct],
               chtBuf[chtDmpNdx].cyl,
               chtBuf[chtDmpNdx].cdbBuf[0], chtBuf[chtDmpNdx].cdbBuf[1],
               chtBuf[chtDmpNdx].cdbBuf[2], chtBuf[chtDmpNdx].cdbBuf[3],
               chtBuf[chtDmpNdx].cdbBuf[4], chtBuf[chtDmpNdx].cdbBuf[5],
               chtBuf[chtDmpNdx].cdbBuf[6], chtBuf[chtDmpNdx].cdbBuf[7],
               chtBuf[chtDmpNdx].cdbBuf[8], chtBuf[chtDmpNdx].cdbBuf[9],
               chtBuf[chtDmpNdx].cdbBuf[10], chtBuf[chtDmpNdx].cdbBuf[11] );
         strcat( trcDmpBuf, esStr );
      }
      else
      {
         //DEV n, tt n x x x x x x x x x x x x x x x x ; nn nn xxH xxH
         sprintf( trcDmpBuf,
            "DEV %d, %3.3s %u %02XH %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
               ( chtBuf[chtDmpNdx].dh1 & 0x10 ) ? 1 : 0,
               chtTypeName[chtBuf[chtDmpNdx].ct],
               chtBuf[chtDmpNdx].cyl,
               chtBuf[chtDmpNdx].cdbBuf[0], chtBuf[chtDmpNdx].cdbBuf[1],
               chtBuf[chtDmpNdx].cdbBuf[2], chtBuf[chtDmpNdx].cdbBuf[3],
               chtBuf[chtDmpNdx].cdbBuf[4], chtBuf[chtDmpNdx].cdbBuf[5],
               chtBuf[chtDmpNdx].cdbBuf[6], chtBuf[chtDmpNdx].cdbBuf[7],
               chtBuf[chtDmpNdx].cdbBuf[8], chtBuf[chtDmpNdx].cdbBuf[9],
               chtBuf[chtDmpNdx].cdbBuf[10], chtBuf[chtDmpNdx].cdbBuf[11],
               chtBuf[chtDmpNdx].cdbBuf[12], chtBuf[chtDmpNdx].cdbBuf[13],
               chtBuf[chtDmpNdx].cdbBuf[14], chtBuf[chtDmpNdx].cdbBuf[15] );
         strcat( trcDmpBuf, esStr );
      }
   }
   chtDmpNdx ++ ;
   if ( chtDmpNdx >= MAX_CHT )
      chtDmpNdx = 0;
   return trcDmpBuf;
}

//**********************************************************

// Low-level trace buffer

#define MAX_LLT 500

static struct
{
   unsigned char addr;
   unsigned char data;
   unsigned char type;
   unsigned char rep;
} lltBuf[MAX_LLT];

static int lltCur = 0;
static int lltDmpLine = 0;
static int lltDmpNdx = 0;

static unsigned char lltAddr = 0;
static unsigned char lltData = 0;
static unsigned char lltType = 0;
static unsigned long lltRep = 0L;

static struct
{
   unsigned char typeId;      // trace entry type
   unsigned char * typeNm;    // trace entry name
} type_nm[]
   =
   {
                     //<opr> <--register---> <data - note>
      TRC_LLT_INB   , "INB   " ,
      TRC_LLT_OUTB  , "OUTB  " ,
      TRC_LLT_INW   , "INW   " ,
      TRC_LLT_OUTW  , "OUTW  " ,
      TRC_LLT_INSB  , "INSB  " ,
      TRC_LLT_OUTSB , "OUTSB " ,
      TRC_LLT_INSW  , "INSW  " ,
      TRC_LLT_OUTSW , "OUTSW " ,
      TRC_LLT_INSD  , "INSD  " ,
      TRC_LLT_OUTSD , "OUTSD " ,

      TRC_LLT_S_CFG , "===== Start Dev Cnfg  ",
      TRC_LLT_S_RST , "===== Start Reset     ",
      TRC_LLT_S_ND  , "===== Start ND cmd    ",
      TRC_LLT_S_PDI , "===== Start PDI cmd   ",
      TRC_LLT_S_PDO , "===== Start PDO cmd   ",
      TRC_LLT_S_PI  , "===== Start PI cmd    ",
      TRC_LLT_S_RWD , "===== Start R/W DMA   ",
      TRC_LLT_S_PID , "===== Start PI DMA    ",
      TRC_LLT_WINT  , "..... Wait for INTRQ  ",
      TRC_LLT_INTRQ , "..... I N T R Q       ",
      TRC_LLT_PNBSY , "..... Poll for BSY=0  ",
      TRC_LLT_PRDY  , "..... Poll for DRDY=1 ",
      TRC_LLT_TOUT  , "..... T I M E O U T   ",
      TRC_LLT_ERROR , "..... E R R O R       ",
      TRC_LLT_DELAY1, "..... DELAY ~100ms    ",
      TRC_LLT_DELAY2, "..... DELAY 0-55ms    ",
      TRC_LLT_E_CFG , "===== End Dev Cnfg    ",
      TRC_LLT_E_RST , "===== End Reset       ",
      TRC_LLT_E_ND  , "===== End ND cmd      ",
      TRC_LLT_E_PDI , "===== End PDI cmd     ",
      TRC_LLT_E_PDO , "===== End PDO cmd     ",
      TRC_LLT_E_PI  , "===== End PI cmd      ",
      TRC_LLT_E_RWD , "===== End R/W DMA     ",
      TRC_LLT_E_PID , "===== End PI DMA      ",

      TRC_LLT_DMA1  , "..... Enable DMA Ch   ",
      TRC_LLT_DMA2  , "..... Poll DMA TC bit ",
      TRC_LLT_DMA3  , "..... Disable DMA Ch  ",

      TRC_LLT_DEBUG   , "..... DEBUG           ",
      TRC_LLT_P_CMD   , "..... ATAPI Cmd Code  ",
      TRC_LLT_R_BM_CR , "..... Rd BM Cmd Reg   ",
      TRC_LLT_R_BM_SR , "..... Rd BM Stat Reg  ",
      TRC_LLT_W_BM_CR , "..... Wr BM Cmd Reg   ",
      TRC_LLT_W_BM_SR , "..... Wr BM Stat Reg  ",
      0               , "????? " ,
   } ;

static unsigned char * reg_nm[]  // register names for trace
   =
   {
  //<opr> <--register---> <data - note>
         "Data            " , // 0 data reg
         "Error/Feature   " , // 1 error & feature
         "SectorCount     " , // 2 sector count
         "SectorNumber    " , // 3 sector number
         "CylinderLow     " , // 4 cylinder low
         "CylinderHigh    " , // 5 cylinder high
         "DeviceHead      " , // 6 device head
         "Status/Cmd      " , // 7 primary status & command
         "AltStat/DevCtrl " , // 8 alternate status & device control
         "DevAddr         " , // 9 device address
   } ;

//*********************************************************

// place an entry into the low level trace buffer

void trc_llt( unsigned char addr,
              unsigned char data,
              unsigned char type )

{

   if ( ( addr == lltAddr )
        &&
        ( data == lltData )
        &&
        ( type == lltType )
      )
   {
      lltRep ++ ;
      return;
   }
   lltBuf[lltCur].addr = lltAddr;
   lltBuf[lltCur].data = lltData;
   lltBuf[lltCur].type = lltType;
   lltBuf[lltCur].rep = (unsigned char) ( lltRep > 255L ? 255 : lltRep );
   lltRep = 0L;
   lltCur ++ ;
   if ( lltCur >= MAX_LLT )
      lltCur = 0;
   lltBuf[lltCur].addr = lltAddr = addr;
   lltBuf[lltCur].data = lltData = data;
   lltBuf[lltCur].type = lltType = type;
   lltBuf[lltCur].rep  = 0;
}

//**************************************************************

// clear the low level trace buffer

void trc_llt_dump0( void )

{

   for ( lltCur = 0; lltCur < MAX_LLT; lltCur ++ )
      lltBuf[lltCur].type = 0;
   lltCur = 0;
}

//**************************************************************

// start a dump of the low level trace buffer

void trc_llt_dump1( void )

{

   trc_llt( 0, 0, TRC_LLT_NONE );
   lltDmpLine = 0;
   lltDmpNdx = lltCur + 1;
   if ( lltDmpNdx >= MAX_LLT )
      lltDmpNdx = 0;
}

//**************************************************************

// return one line of the low level trace,
// returns NULL at end.

unsigned char * trc_llt_dump2( void )

{
   int ndx;

   lltDmpLine ++ ;
   if ( lltDmpLine == 1 )     // 1st line is heading
   {
                        //0        1         2         3
                        //123456789012345678901234567890123456
      strcpy( trcDmpBuf, "<opr> <--register---> <data - note>" );
      return trcDmpBuf;
   }

   while ( 1 )
   {
      if ( lltDmpNdx == lltCur )
         return NULL;
      if ( lltBuf[lltDmpNdx].type != 0 )
         break;
      lltDmpNdx ++ ;
      if ( lltDmpNdx >= MAX_LLT )
         lltDmpNdx = 0;
   }

   ndx = 0;
   while ( type_nm[ndx].typeId )
   {
      if ( lltBuf[lltDmpNdx].type == type_nm[ndx].typeId )
         break;
      ndx ++ ;
   }
   strcpy( trcDmpBuf, type_nm[ ndx ].typeNm );

   if ( lltBuf[lltDmpNdx].type < TRC_LLT_S_CFG )
   {
      strcat( trcDmpBuf, reg_nm[ lltBuf[lltDmpNdx].addr ] );
      if ( lltBuf[lltDmpNdx].addr == CB_DATA )
         strcpy( prtBuf, "-- " );
      else
         sprintf( prtBuf, "%02X ", lltBuf[lltDmpNdx].data );
      strcat( trcDmpBuf, prtBuf );
      if (    ( lltBuf[lltDmpNdx].addr == CB_DC )
           && ( lltBuf[lltDmpNdx].type == TRC_LLT_OUTB )
         )
      {
         if ( lltBuf[lltDmpNdx].data & CB_DC_SRST )
         {
            strcat( trcDmpBuf, "START COMMAND: " );
            strcat( trcDmpBuf, trc_get_cmd_name( CMD_SRST ) );
            strcat( trcDmpBuf, ", " );
         }
         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & CB_DC_HOB )
                       ? "HOB=1" : "HOB=0" );
         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & CB_DC_NIEN )
                       ? " nIEN=1" : " nIEN=0" );
      }
      if (    ( lltBuf[lltDmpNdx].addr == CB_CMD )
           && ( lltBuf[lltDmpNdx].type == TRC_LLT_OUTB )
         )
      {
         strcat( trcDmpBuf, "START COMMAND: " );
         strcat( trcDmpBuf, trc_get_cmd_name( lltBuf[lltDmpNdx].data ) );
      }
      if (    ( lltBuf[lltDmpNdx].addr == CB_DH )
           && ( lltBuf[lltDmpNdx].type == TRC_LLT_OUTB )
         )
      {
         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x10 )
                       ? "DEV=1" : "DEV=0" );
         strcat( trcDmpBuf, ( lltBuf[lltDmpNdx].data & 0x40 )
                       ? " LBA=1" : " LBA=0" );
      }
      if (    (    ( lltBuf[lltDmpNdx].addr == CB_STAT )
                || ( lltBuf[lltDmpNdx].addr == CB_ASTAT )
              )
           && ( lltBuf[lltDmpNdx].type == TRC_LLT_INB )
         )
         strcat( trcDmpBuf, trc_get_st_bit_name( lltBuf[lltDmpNdx].data ) );
      if (    ( lltBuf[lltDmpNdx].addr == CB_ERR )
           && ( lltBuf[lltDmpNdx].type == TRC_LLT_INB )
         )
         strcat( trcDmpBuf, trc_get_er_bit_name( lltBuf[lltDmpNdx].data ) );
   }
   else
   if ( lltBuf[lltDmpNdx].type >= TRC_LLT_DEBUG )
   {
      sprintf( prtBuf, "%02X ", lltBuf[lltDmpNdx].data );
      strcat( trcDmpBuf, prtBuf );
   }
   else
   if ( lltBuf[lltDmpNdx].type == TRC_LLT_ERROR )
      strcat( trcDmpBuf, trc_get_err_name( lltBuf[lltDmpNdx].data ) );

   if ( lltBuf[lltDmpNdx].rep )
   {
      if ( lltBuf[lltDmpNdx].rep == 255 )
         strcpy( prtBuf, "repeated 255 or more times " );
      else
         sprintf( prtBuf, "repeated %u more times ", lltBuf[lltDmpNdx].rep );
      strcat( trcDmpBuf, prtBuf );
   }

   lltDmpNdx ++ ;
   if ( lltDmpNdx >= MAX_LLT )
      lltDmpNdx = 0;

   return trcDmpBuf;
}

// end ataiotrc.c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -