diff options
Diffstat (limited to 'src/devices/machine/t10sbc.cpp')
-rw-r--r-- | src/devices/machine/t10sbc.cpp | 80 |
1 files changed, 32 insertions, 48 deletions
diff --git a/src/devices/machine/t10sbc.cpp b/src/devices/machine/t10sbc.cpp index 4b81c5a4a9c..47f4daa0795 100644 --- a/src/devices/machine/t10sbc.cpp +++ b/src/devices/machine/t10sbc.cpp @@ -3,6 +3,8 @@ #include "emu.h" #include "t10sbc.h" +#include "multibyte.h" + void t10sbc::t10_start(device_t &device) { m_device = &device; @@ -20,16 +22,14 @@ void t10sbc::t10_reset() m_blocks = 0; m_sector_bytes = 512; - m_disk = m_image->get_hard_disk_file(); - if (!m_disk) + if (!m_image->exists()) { m_device->logerror("T10SBC %s: no HD found!\n", m_image->owner()->tag()); } else { // get hard disk sector size from CHD metadata - const hard_disk_info *hdinfo = hard_disk_get_info(m_disk); - m_sector_bytes = hdinfo->sectorbytes; + m_sector_bytes = m_image->get_info().sectorbytes; } } @@ -45,7 +45,7 @@ void t10sbc::ExecCommand() break; case T10SBC_CMD_SEEK_6: - m_lba = (command[1]&0x1f)<<16 | command[2]<<8 | command[3]; + m_lba = get_u24be(&command[1])&0x1fffff; m_device->logerror("S1410: SEEK to LBA %x\n", m_lba); @@ -54,7 +54,7 @@ void t10sbc::ExecCommand() break; case T10SBC_CMD_READ_6: - m_lba = (command[1]&0x1f)<<16 | command[2]<<8 | command[3]; + m_lba = get_u24be(&command[1])&0x1fffff; m_blocks = SCSILengthFromUINT8( &command[4] ); m_device->logerror("T10SBC: READ at LBA %x for %x blocks\n", m_lba, m_blocks); @@ -65,7 +65,7 @@ void t10sbc::ExecCommand() break; case T10SBC_CMD_WRITE_6: - m_lba = (command[1]&0x1f)<<16 | command[2]<<8 | command[3]; + m_lba = get_u24be(&command[1])&0x1fffff; m_blocks = SCSILengthFromUINT8( &command[4] ); m_device->logerror("T10SBC: WRITE to LBA %x for %x blocks\n", m_lba, m_blocks); @@ -101,7 +101,7 @@ void t10sbc::ExecCommand() break; case T10SBC_CMD_READ_10: - m_lba = command[2]<<24 | command[3]<<16 | command[4]<<8 | command[5]; + m_lba = get_u32be(&command[2]); m_blocks = SCSILengthFromUINT16( &command[7] ); m_device->logerror("T10SBC: READ at LBA %x for %x blocks\n", m_lba, m_blocks); @@ -112,7 +112,7 @@ void t10sbc::ExecCommand() break; case T10SBC_CMD_WRITE_10: - m_lba = command[2]<<24 | command[3]<<16 | command[4]<<8 | command[5]; + m_lba = get_u32be(&command[2]); m_blocks = SCSILengthFromUINT16( &command[7] ); m_device->logerror("T10SBC: WRITE to LBA %x for %x blocks\n", m_lba, m_blocks); @@ -123,8 +123,8 @@ void t10sbc::ExecCommand() break; case T10SBC_CMD_READ_12: - m_lba = command[2]<<24 | command[3]<<16 | command[4]<<8 | command[5]; - m_blocks = command[6]<<24 | command[7]<<16 | command[8]<<8 | command[9]; + m_lba = get_u32be(&command[2]); + m_blocks = get_u32be(&command[6]); m_device->logerror("T10SBC: READ at LBA %x for %x blocks\n", m_lba, m_blocks); @@ -142,7 +142,7 @@ void t10sbc::ExecCommand() void t10sbc::ReadData( uint8_t *data, int dataLength ) { // if we're a drive without a disk, return all zeroes - if (!m_disk) + if (!m_image->exists()) { memset(data, 0, dataLength); return; @@ -273,12 +273,12 @@ void t10sbc::ReadData( uint8_t *data, int dataLength ) case T10SBC_CMD_READ_6: case T10SBC_CMD_READ_10: case T10SBC_CMD_READ_12: - if ((m_disk) && (m_blocks)) + if (m_image->exists() && (m_blocks)) { m_device->logerror("T10SBC: Reading %d bytes from HD\n", dataLength); while (dataLength > 0) { - if (!hard_disk_read(m_disk, m_lba, data)) + if (!m_image->read(m_lba, data)) { m_device->logerror("T10SBC: HD read error!\n"); } @@ -303,7 +303,7 @@ void t10sbc::ReadData( uint8_t *data, int dataLength ) void t10sbc::WriteData( uint8_t *data, int dataLength ) { - if (!m_disk) + if (!m_image->exists()) { return; } @@ -315,12 +315,12 @@ void t10sbc::WriteData( uint8_t *data, int dataLength ) case T10SBC_CMD_WRITE_6: case T10SBC_CMD_WRITE_10: - if ((m_disk) && (m_blocks)) + if (m_image->exists() && (m_blocks)) { m_device->logerror("T10SBC: Writing %d bytes to HD\n", dataLength); while (dataLength > 0) { - if (!hard_disk_write(m_disk, m_lba, data)) + if (!m_image->write(m_lba, data)) { m_device->logerror("T10SBC: HD write error!\n"); } @@ -338,58 +338,42 @@ void t10sbc::WriteData( uint8_t *data, int dataLength ) } } -void t10sbc::GetDevice( void **_disk ) -{ - *(hard_disk_file **)_disk = m_disk; -} - -void t10sbc::SetDevice( void *_disk ) -{ - m_disk = (hard_disk_file *)_disk; -} - void t10sbc::GetFormatPage( format_page_t *page ) { - hard_disk_info *info = hard_disk_get_info(m_disk); + const auto &info = m_image->get_info(); memset(page, 0, sizeof(format_page_t)); page->m_page_code = 0x03; page->m_page_length = 0x16; - page->m_sectors_per_track_msb = (uint8_t)(info->sectors >> 8); - page->m_sectors_per_track_lsb = (uint8_t)info->sectors; - page->m_bytes_per_sector_msb = (uint8_t)(info->sectorbytes >> 8); - page->m_bytes_per_sector_lsb = (uint8_t)info->sectorbytes; + page->m_sectors_per_track_msb = (uint8_t)(info.sectors >> 8); + page->m_sectors_per_track_lsb = (uint8_t)info.sectors; + page->m_bytes_per_sector_msb = (uint8_t)(info.sectorbytes >> 8); + page->m_bytes_per_sector_lsb = (uint8_t)info.sectorbytes; page->m_format = 0x80; // SSEC, Soft-Sectored } void t10sbc::GetGeometryPage( geometry_page_t *page ) { - hard_disk_info *info = hard_disk_get_info(m_disk); + const auto &info = m_image->get_info(); memset(page, 0, sizeof(geometry_page_t)); page->m_page_code = 0x04; page->m_page_length = 0x16; - page->m_num_cylinders_msb = (uint8_t)(info->cylinders >> 16); - page->m_num_cylinders_2nd = (uint8_t)(info->cylinders >> 8); - page->m_num_cylinders_lsb = (uint8_t)info->cylinders; - page->m_num_heads = (uint8_t)info->heads; + page->m_num_cylinders_msb = (uint8_t)(info.cylinders >> 16); + page->m_num_cylinders_2nd = (uint8_t)(info.cylinders >> 8); + page->m_num_cylinders_lsb = (uint8_t)info.cylinders; + page->m_num_heads = (uint8_t)info.heads; page->m_rot_rate_msb = (uint8_t)(3600 >> 8); page->m_rot_rate_lsb = (uint8_t)3600; } void t10sbc::ReadCapacity( uint8_t *data ) { - hard_disk_info *info = hard_disk_get_info(m_disk); + const auto &info = m_image->get_info(); // get # of sectors - uint32_t temp = info->cylinders * info->heads * info->sectors - 1; - - data[0] = (temp>>24) & 0xff; - data[1] = (temp>>16) & 0xff; - data[2] = (temp>>8) & 0xff; - data[3] = (temp & 0xff); - data[4] = (info->sectorbytes>>24)&0xff; - data[5] = (info->sectorbytes>>16)&0xff; - data[6] = (info->sectorbytes>>8)&0xff; - data[7] = (info->sectorbytes & 0xff); + uint32_t temp = info.cylinders * info.heads * info.sectors - 1; + + put_u32be(&data[0], temp); + put_u32be(&data[4], info.sectorbytes); } |