summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/t10sbc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/t10sbc.cpp')
-rw-r--r--src/devices/machine/t10sbc.cpp80
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);
}