void ata_mass_storage_device::ide_build_identify_device() { memset(m_identify_buffer, 0, sizeof(m_identify_buffer)); int total_sectors = m_num_cylinders * m_num_heads * m_num_sectors; /* basic geometry */ m_identify_buffer[0] = 0x045a; /* 0: configuration bits */ m_identify_buffer[1] = m_num_cylinders; /* 1: logical cylinders */ m_identify_buffer[2] = 0; /* 2: reserved */ m_identify_buffer[3] = m_num_heads; /* 3: logical heads */ m_identify_buffer[4] = 0; /* 4: vendor specific (obsolete) */ m_identify_buffer[5] = 0; /* 5: vendor specific (obsolete) */ m_identify_buffer[6] = m_num_sectors; /* 6: logical sectors per logical track */ m_identify_buffer[7] = 0; /* 7: vendor-specific */ m_identify_buffer[8] = 0; /* 8: vendor-specific */ m_identify_buffer[9] = 0; /* 9: vendor-specific */ swap_strncpy(&m_identify_buffer[10], /* 10-19: serial number */ "00000000000000000000", 10); m_identify_buffer[20] = 0; /* 20: vendor-specific */ m_identify_buffer[21] = 0; /* 21: vendor-specific */ m_identify_buffer[22] = 4; /* 22: # of vendor-specific bytes on read/write long commands */ swap_strncpy(&m_identify_buffer[23], /* 23-26: firmware revision */ "1.0", 4); swap_strncpy(&m_identify_buffer[27], /* 27-46: model number */ "MAME Compressed Hard Disk", 20); m_identify_buffer[47] = 0x8001; /* 47: read/write multiple support */ m_identify_buffer[48] = 0; /* 48: reserved */ m_identify_buffer[49] = 0x0f03; /* 49: capabilities */ m_identify_buffer[50] = 0; /* 50: reserved */ m_identify_buffer[51] = 2; /* 51: PIO data transfer cycle timing mode */ m_identify_buffer[52] = 2; /* 52: single word DMA transfer cycle timing mode */ m_identify_buffer[53] = 3; /* 53: field validity */ m_identify_buffer[54] = m_num_cylinders; /* 54: number of current logical cylinders */ m_identify_buffer[55] = m_num_heads; /* 55: number of current logical heads */ m_identify_buffer[56] = m_num_sectors; /* 56: number of current logical sectors per track */ m_identify_buffer[57] = total_sectors & 0xffff; /* 57-58: current capacity in sectors (ATA-1 through ATA-5; obsoleted in ATA-6) */ m_identify_buffer[58] = total_sectors >> 16; m_identify_buffer[59] = 0; /* 59: multiple sector timing */ m_identify_buffer[60] = total_sectors & 0xffff; /* 60-61: total user addressable sectors for LBA mode (ATA-1 through ATA-7) */ m_identify_buffer[61] = total_sectors >> 16; m_identify_buffer[62] = 0x0007; /* 62: single word dma transfer */ m_identify_buffer[63] = 0x0407; /* 63: multiword DMA transfer */ m_identify_buffer[64] = 0x0003; /* 64: flow control PIO transfer modes supported */ m_identify_buffer[65] = 0x78; /* 65: minimum multiword DMA transfer cycle time per word */ m_identify_buffer[66] = 0x78; /* 66: mfr's recommended multiword DMA transfer cycle time */ m_identify_buffer[67] = 0x014d; /* 67: minimum PIO transfer cycle time without flow control */ m_identify_buffer[68] = 0x78; /* 68: minimum PIO transfer cycle time with IORDY */ m_identify_buffer[69] = 0x00; /* 69-70: reserved */ m_identify_buffer[71] = 0x00; /* 71: reserved for IDENTIFY PACKET command */ m_identify_buffer[72] = 0x00; /* 72: reserved for IDENTIFY PACKET command */ m_identify_buffer[73] = 0x00; /* 73: reserved for IDENTIFY PACKET command */ m_identify_buffer[74] = 0x00; /* 74: reserved for IDENTIFY PACKET command */ m_identify_buffer[75] = 0x00; /* 75: queue depth */ m_identify_buffer[76] = 0x00; /* 76-79: reserved */ m_identify_buffer[80] = 0x00; /* 80: major version number */ m_identify_buffer[81] = 0x00; /* 81: minor version number */ m_identify_buffer[82] = 0x00; /* 82: command set supported */ m_identify_buffer[83] = 0x00; /* 83: command sets supported */ m_identify_buffer[84] = 0x00; /* 84: command set/feature supported extension */ m_identify_buffer[85] = 0x00; /* 85: command set/feature enabled */ m_identify_buffer[86] = 0x00; /* 86: command set/feature enabled */ m_identify_buffer[87] = 0x00; /* 87: command set/feature default */ m_identify_buffer[88] = 0x00; /* 88: additional DMA modes */ m_identify_buffer[89] = 0x00; /* 89: time required for security erase unit completion */ m_identify_buffer[90] = 0x00; /* 90: time required for enhanced security erase unit completion */ m_identify_buffer[91] = 0x00; /* 91: current advanced power management value */ m_identify_buffer[92] = 0x00; /* 92: master password revision code */ m_identify_buffer[93] = 0x00; /* 93: hardware reset result */ m_identify_buffer[94] = 0x00; /* 94: acoustic management values */ m_identify_buffer[95] = 0x00; /* 95-99: reserved */ m_identify_buffer[100] = total_sectors & 0xffff; /* 100-103: maximum 48-bit LBA */ m_identify_buffer[101] = total_sectors >> 16; m_identify_buffer[102] = 0x00; m_identify_buffer[103] = 0x00; m_identify_buffer[104] = 0x00; /* 104-126: reserved */ m_identify_buffer[127] = 0x00; /* 127: removable media status notification */ m_identify_buffer[128] = 0x00; /* 128: security status */ m_identify_buffer[129] = 0x00; /* 129-159: vendor specific */ m_identify_buffer[160] = 0x00; /* 160: CFA power mode 1 */ m_identify_buffer[161] = 0x00; /* 161-175: reserved for CompactFlash */ m_identify_buffer[176] = 0x00; /* 176-205: current media serial number */ m_identify_buffer[206] = 0x00; /* 206-254: reserved */ m_identify_buffer[255] = 0x00; /* 255: integrity word */ }
static void ide_build_features(struct ide_state *ide) { int total_sectors = ide->num_cylinders * ide->num_heads * ide->num_sectors; int sectors_per_track = ide->num_heads * ide->num_sectors; memset(ide->buffer, 0, IDE_DISK_SECTOR_SIZE); /* basic geometry */ ide->features[ 0*2+0] = 0x5a; /* 0: configuration bits */ ide->features[ 0*2+1] = 0x04; ide->features[ 1*2+0] = ide->num_cylinders & 0xff; /* 1: logical cylinders */ ide->features[ 1*2+1] = ide->num_cylinders >> 8; ide->features[ 2*2+0] = 0; /* 2: reserved */ ide->features[ 2*2+1] = 0; ide->features[ 3*2+0] = ide->num_heads & 0xff; /* 3: logical heads */ ide->features[ 3*2+1] = ide->num_heads >> 8; ide->features[ 4*2+0] = 0; /* 4: vendor specific (obsolete) */ ide->features[ 4*2+1] = 0; ide->features[ 5*2+0] = 0; /* 5: vendor specific (obsolete) */ ide->features[ 5*2+1] = 0; ide->features[ 6*2+0] = ide->num_sectors & 0xff; /* 6: logical sectors per logical track */ ide->features[ 6*2+1] = ide->num_sectors >> 8; ide->features[ 7*2+0] = 0; /* 7: vendor-specific */ ide->features[ 7*2+1] = 0; ide->features[ 8*2+0] = 0; /* 8: vendor-specific */ ide->features[ 8*2+1] = 0; ide->features[ 9*2+0] = 0; /* 9: vendor-specific */ ide->features[ 9*2+1] = 0; swap_strncpy(&ide->features[10*2+0], /* 10-19: serial number */ "00000000000000000000", 10); ide->features[20*2+0] = 0; /* 20: vendor-specific */ ide->features[20*2+1] = 0; ide->features[21*2+0] = 0; /* 21: vendor-specific */ ide->features[21*2+1] = 0; ide->features[22*2+0] = 4; /* 22: # of vendor-specific bytes on read/write long commands */ ide->features[22*2+1] = 0; swap_strncpy(&ide->features[23*2+0], /* 23-26: firmware revision */ "1.0", 4); swap_strncpy(&ide->features[27*2+0], /* 27-46: model number */ "MAME Compressed Hard Disk", 20); ide->features[47*2+0] = 0x01; /* 47: read/write multiple support */ ide->features[47*2+1] = 0x80; ide->features[48*2+0] = 0; /* 48: reserved */ ide->features[48*2+1] = 0; ide->features[49*2+0] = 0x03; /* 49: capabilities */ ide->features[49*2+1] = 0x0f; ide->features[50*2+0] = 0; /* 50: reserved */ ide->features[50*2+1] = 0; ide->features[51*2+0] = 2; /* 51: PIO data transfer cycle timing mode */ ide->features[51*2+1] = 0; ide->features[52*2+0] = 2; /* 52: single word DMA transfer cycle timing mode */ ide->features[52*2+1] = 0; ide->features[53*2+0] = 3; /* 53: field validity */ ide->features[53*2+1] = 0; ide->features[54*2+0] = ide->num_cylinders & 0xff; /* 54: number of current logical cylinders */ ide->features[54*2+1] = ide->num_cylinders >> 8; ide->features[55*2+0] = ide->num_heads & 0xff; /* 55: number of current logical heads */ ide->features[55*2+1] = ide->num_heads >> 8; ide->features[56*2+0] = ide->num_sectors & 0xff; /* 56: number of current logical sectors per track */ ide->features[56*2+1] = ide->num_sectors >> 8; ide->features[57*2+0] = sectors_per_track & 0xff; /* 57-58: number of current logical sectors per track */ ide->features[57*2+1] = sectors_per_track >> 8; ide->features[58*2+0] = sectors_per_track >> 16; ide->features[58*2+1] = sectors_per_track >> 24; ide->features[59*2+0] = 0; /* 59: multiple sector timing */ ide->features[59*2+1] = 0; ide->features[60*2+0] = total_sectors & 0xff; /* 60-61: total user addressable sectors */ ide->features[60*2+1] = total_sectors >> 8; ide->features[61*2+0] = total_sectors >> 16; ide->features[61*2+1] = total_sectors >> 24; ide->features[62*2+0] = 0x07; /* 62: single word dma transfer */ ide->features[62*2+1] = 0x00; ide->features[63*2+0] = 0x07; /* 63: multiword DMA transfer */ ide->features[63*2+1] = 0x04; ide->features[64*2+0] = 0x03; /* 64: flow control PIO transfer modes supported */ ide->features[64*2+1] = 0x00; ide->features[65*2+0] = 0x78; /* 65: minimum multiword DMA transfer cycle time per word */ ide->features[65*2+1] = 0x00; ide->features[66*2+0] = 0x78; /* 66: mfr's recommended multiword DMA transfer cycle time */ ide->features[66*2+1] = 0x00; ide->features[67*2+0] = 0x4d; /* 67: minimum PIO transfer cycle time without flow control */ ide->features[67*2+1] = 0x01; ide->features[68*2+0] = 0x78; /* 68: minimum PIO transfer cycle time with IORDY */ ide->features[68*2+1] = 0x00; ide->features[69*2+0] = 0x00; /* 69-70: reserved */ ide->features[69*2+1] = 0x00; ide->features[71*2+0] = 0x00; /* 71: reserved for IDENTIFY PACKET command */ ide->features[71*2+1] = 0x00; ide->features[72*2+0] = 0x00; /* 72: reserved for IDENTIFY PACKET command */ ide->features[72*2+1] = 0x00; ide->features[73*2+0] = 0x00; /* 73: reserved for IDENTIFY PACKET command */ ide->features[73*2+1] = 0x00; ide->features[74*2+0] = 0x00; /* 74: reserved for IDENTIFY PACKET command */ ide->features[74*2+1] = 0x00; ide->features[75*2+0] = 0x00; /* 75: queue depth */ ide->features[75*2+1] = 0x00; ide->features[76*2+0] = 0x00; /* 76-79: reserved */ ide->features[76*2+1] = 0x00; ide->features[80*2+0] = 0x00; /* 80: major version number */ ide->features[80*2+1] = 0x00; ide->features[81*2+0] = 0x00; /* 81: minor version number */ ide->features[81*2+1] = 0x00; ide->features[82*2+0] = 0x00; /* 82: command set supported */ ide->features[82*2+1] = 0x00; ide->features[83*2+0] = 0x00; /* 83: command sets supported */ ide->features[83*2+1] = 0x00; ide->features[84*2+0] = 0x00; /* 84: command set/feature supported extension */ ide->features[84*2+1] = 0x00; ide->features[85*2+0] = 0x00; /* 85: command set/feature enabled */ ide->features[85*2+1] = 0x00; ide->features[86*2+0] = 0x00; /* 86: command set/feature enabled */ ide->features[86*2+1] = 0x00; ide->features[87*2+0] = 0x00; /* 87: command set/feature default */ ide->features[87*2+1] = 0x00; ide->features[88*2+0] = 0x00; /* 88: additional DMA modes */ ide->features[88*2+1] = 0x00; ide->features[89*2+0] = 0x00; /* 89: time required for security erase unit completion */ ide->features[89*2+1] = 0x00; ide->features[90*2+0] = 0x00; /* 90: time required for enhanced security erase unit completion */ ide->features[90*2+1] = 0x00; ide->features[91*2+0] = 0x00; /* 91: current advanced power management value */ ide->features[91*2+1] = 0x00; ide->features[92*2+0] = 0x00; /* 92: master password revision code */ ide->features[92*2+1] = 0x00; ide->features[93*2+0] = 0x00; /* 93: hardware reset result */ ide->features[93*2+1] = 0x00; ide->features[94*2+0] = 0x00; /* 94: acoustic management values */ ide->features[94*2+1] = 0x00; ide->features[95*2+0] = 0x00; /* 95-99: reserved */ ide->features[95*2+1] = 0x00; ide->features[100*2+0] = total_sectors & 0xff; /* 100-103: maximum 48-bit LBA */ ide->features[100*2+1] = total_sectors >> 8; ide->features[101*2+0] = total_sectors >> 16; ide->features[101*2+1] = total_sectors >> 24; ide->features[102*2+0] = 0x00; ide->features[102*2+1] = 0x00; ide->features[103*2+0] = 0x00; ide->features[103*2+1] = 0x00; ide->features[104*2+0] = 0x00; /* 104-126: reserved */ ide->features[104*2+1] = 0x00; ide->features[127*2+0] = 0x00; /* 127: removable media status notification */ ide->features[127*2+1] = 0x00; ide->features[128*2+0] = 0x00; /* 128: security status */ ide->features[128*2+1] = 0x00; ide->features[129*2+0] = 0x00; /* 129-159: vendor specific */ ide->features[129*2+1] = 0x00; ide->features[160*2+0] = 0x00; /* 160: CFA power mode 1 */ ide->features[160*2+1] = 0x00; ide->features[161*2+0] = 0x00; /* 161-175: reserved for CompactFlash */ ide->features[161*2+1] = 0x00; ide->features[176*2+0] = 0x00; /* 176-205: current media serial number */ ide->features[176*2+1] = 0x00; ide->features[206*2+0] = 0x00; /* 206-254: reserved */ ide->features[206*2+1] = 0x00; ide->features[255*2+0] = 0x00; /* 255: integrity word */ ide->features[255*2+1] = 0x00; }