summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/omti8621.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/isa/omti8621.cpp')
-rw-r--r--src/devices/bus/isa/omti8621.cpp426
1 files changed, 209 insertions, 217 deletions
diff --git a/src/devices/bus/isa/omti8621.cpp b/src/devices/bus/isa/omti8621.cpp
index f61ab0e905f..149638160c3 100644
--- a/src/devices/bus/isa/omti8621.cpp
+++ b/src/devices/bus/isa/omti8621.cpp
@@ -15,18 +15,17 @@
#include "emu.h"
#include "omti8621.h"
#include "image.h"
-#include "formats/pc_dsk.h"
+#include "imagedev/harddriv.h"
#include "formats/naslite_dsk.h"
#include "formats/apollo_dsk.h"
-#define VERBOSE 0
+#define LOG_LEVEL0 (0x1U << 1)
+#define LOG_LEVEL1 (0x3U << 1)
+#define LOG_LEVEL2 (0x7U << 1)
+#define LOG_LEVEL3 (0xfU << 1)
-static int verbose = VERBOSE;
-
-#define LOG(x) { logerror ("%s: ", cpu_context()); logerror x; logerror ("\n"); }
-#define LOG1(x) { if (verbose > 0) LOG(x)}
-#define LOG2(x) { if (verbose > 1) LOG(x)}
-#define LOG3(x) { if (verbose > 2) LOG(x)}
+#define VERBOSE (LOG_LEVEL0)
+#include "logmacro.h"
#define OMTI_DISK_SECTOR_SIZE 1056
@@ -47,30 +46,22 @@ static int verbose = VERBOSE;
// forward declaration of image class
DECLARE_DEVICE_TYPE(OMTI_DISK, omti_disk_image_device)
-class omti_disk_image_device : public device_t,
- public device_image_interface
+class omti_disk_image_device : public harddisk_image_base_device
{
public:
// construction/destruction
omti_disk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // image-level overrides
- virtual iodevice_t image_type() const noexcept override { return IO_HARDDISK; }
-
- virtual bool is_readable() const noexcept override { return true; }
- virtual bool is_writeable() const noexcept override { return true; }
- virtual bool is_creatable() const noexcept override { return true; }
- virtual bool must_be_loaded() const noexcept override { return false; }
- virtual bool is_reset_on_load() const noexcept override { return false; }
+ // device_image_interface implementation
virtual bool support_command_line_image_creation() const noexcept override { return true; }
virtual const char *file_extensions() const noexcept override { return "awd"; }
- virtual const char *custom_instance_name() const noexcept override { return "winchester"; }
- virtual const char *custom_brief_instance_name() const noexcept override { return "disk"; }
+ virtual const char *image_type_name() const noexcept override { return "winchester"; }
+ virtual const char *image_brief_type_name() const noexcept override { return "disk"; }
- virtual image_init_result call_create(int format_type, util::option_resolution *format_options) override;
+ virtual std::pair<std::error_condition, std::string> call_create(int format_type, util::option_resolution *format_options) override;
protected:
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
virtual void device_reset() override;
@@ -112,7 +103,7 @@ public:
#define OMTI_STATUS_REQ 0x01 // Request (1 = request transfer of data via data in/out register)
#define OMTI_STATUS_IO 0x02 // In/Out (1 = direction of transfer is from controller to host)
-#define OMTI_STATUS_CD 0x04 // Command/Data ( 1 = byte transferred is command or status byte)
+#define OMTI_STATUS_CD 0x04 // Command/Data (1 = byte transferred is command or status byte)
#define OMTI_STATUS_BUSY 0x08 // Busy (0 = controller is idle, 1 = controller selected)
#define OMTI_STATUS_DREQ 0x10 // Data Request (0 = no DMA request, 1 = DMA cycle requested)
#define OMTI_STATUS_IREQ 0x20 // Interrupt Request (0 = no interrupt, 1 = command complete)
@@ -288,15 +279,15 @@ ioport_constructor omti8621_device::device_input_ports() const
void omti8621_device::device_start()
{
- LOG2(("device_start"));
+ LOGMASKED(LOG_LEVEL2, "device_start");
set_isa_device();
m_installed = false;
- sector_buffer.resize(OMTI_DISK_SECTOR_SIZE*OMTI_MAX_BLOCK_COUNT);
+ m_sector_buffer.resize(OMTI_DISK_SECTOR_SIZE*OMTI_MAX_BLOCK_COUNT);
- m_timer = timer_alloc(0, nullptr);
+ m_timer = timer_alloc(FUNC(omti8621_device::trigger_interrupt), this);
our_disks[0] = subdevice<omti_disk_image_device>(OMTI_DISK0_TAG);
our_disks[1] = subdevice<omti_disk_image_device>(OMTI_DISK1_TAG);
@@ -310,7 +301,7 @@ void omti8621_device::device_reset()
{
static const int io_bases[8] = { 0x320, 0x324, 0x328, 0x32c, 0x1a0, 0x1a4, 0x1a8, 0x1ac };
- LOG2(("device_reset"));
+ LOGMASKED(LOG_LEVEL2, "device_reset");
// you can't read I/O ports in device_start() even if they're required_ioport<> in your class!
if (!m_installed)
@@ -338,38 +329,38 @@ void omti8621_device::device_reset()
set_jumper(our_disks[0]->m_type);
// should go from reset to idle after 100 us
- // state->omti_state = OMTI_STATE_RESET;
- omti_state = OMTI_STATE_IDLE;
+ // m_omti_state = OMTI_STATE_RESET;
+ m_omti_state = OMTI_STATE_IDLE;
- status_port = OMTI_STATUS_NU6 | OMTI_STATUS_NU7;
- config_port = ~jumper;
- mask_port = 0;
+ m_status_port = OMTI_STATUS_NU6 | OMTI_STATUS_NU7;
+ m_config_port = ~m_jumper;
+ m_mask_port = 0;
// default the sector data buffer with model and status information
// (i.e. set sector data buffer for cmd=0x0e READ SECTOR BUFFER)
- memset(&sector_buffer[0], 0, OMTI_DISK_SECTOR_SIZE);
- memcpy(&sector_buffer[0], "8621VB.4060487xx", 0x10);
- sector_buffer[0x10] = 0; // ROM Checksum error
- sector_buffer[0x11] = 0; // Processor Register error
- sector_buffer[0x12] = 0; // Buffer RAM error
- sector_buffer[0x13] = 0; // Sequencer Register File error
- sector_buffer[0x14] = 0xc0; // 32K buffer size
+ memset(&m_sector_buffer[0], 0, OMTI_DISK_SECTOR_SIZE);
+ memcpy(&m_sector_buffer[0], "8621VB.4060487xx", 0x10);
+ m_sector_buffer[0x10] = 0; // ROM Checksum error
+ m_sector_buffer[0x11] = 0; // Processor Register error
+ m_sector_buffer[0x12] = 0; // Buffer RAM error
+ m_sector_buffer[0x13] = 0; // Sequencer Register File error
+ m_sector_buffer[0x14] = 0xc0; // 32K buffer size
// TODO: add missing Default values for LUN 0, 1 and 3
- command_length = 0;
- command_index = 0;
- command_status = 0;
+ m_command_length = 0;
+ m_command_index = 0;
+ m_command_status = 0;
- data_index = 0;
- data_length = 0;
+ m_data_index = 0;
+ m_data_length = 0;
clear_sense_data();
- diskaddr_ecc_error = 0;
- diskaddr_format_bad_track = 0;
- alternate_track_address[0] = 0;
- alternate_track_address[1] = 0;
+ m_diskaddr_ecc_error = 0;
+ m_diskaddr_format_bad_track = 0;
+ m_alternate_track_address[0] = 0;
+ m_alternate_track_address[1] = 0;
fd_moten_w(0);
fd_rate_w(0);
@@ -402,8 +393,22 @@ omti8621_device::omti8621_device(
, m_floppy(*this, OMTI_FDC_TAG":%u", 0U)
, m_iobase(*this, "IO_BASE")
, m_biosopts(*this, "BIOS_OPTS")
- , jumper(0), omti_state(0), status_port(0), config_port(0), mask_port(0), command_length(0), command_index(0), command_status(0), data_buffer(nullptr)
- , data_length(0), data_index(0), diskaddr_ecc_error(0), diskaddr_format_bad_track(0), m_timer(nullptr), m_moten(0), m_installed(false)
+ , m_jumper(0)
+ , m_omti_state(0)
+ , m_status_port(0)
+ , m_config_port(0)
+ , m_mask_port(0)
+ , m_command_length(0)
+ , m_command_index(0)
+ , m_command_status(0)
+ , m_data_buffer(nullptr)
+ , m_data_length(0)
+ , m_data_index(0)
+ , m_diskaddr_ecc_error(0)
+ , m_diskaddr_format_bad_track(0)
+ , m_timer(nullptr)
+ , m_moten(0)
+ , m_installed(false)
{
}
@@ -411,13 +416,13 @@ omti8621_device::omti8621_device(
set_interrupt - update the IRQ state
-------------------------------------------------*/
-void omti8621_device::set_interrupt(enum line_state line_state)
+void omti8621_device::set_interrupt(line_state state)
{
- LOG2(("set_interrupt: status_port=%x, line_state %d", status_port, line_state));
- m_isa->irq14_w(line_state);
+ LOGMASKED(LOG_LEVEL2, "%s: set_interrupt: status_port=%x, line_state %d", cpu_context(), m_status_port, state);
+ m_isa->irq14_w(state);
}
-void omti8621_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+TIMER_CALLBACK_MEMBER(omti8621_device::trigger_interrupt)
{
set_interrupt(ASSERT_LINE);
}
@@ -427,8 +432,8 @@ void omti8621_device::device_timer(emu_timer &timer, device_timer_id id, int par
***************************************************************************/
void omti8621_device::clear_sense_data() {
- LOG2(("clear_sense_data"));
- memset(sense_data, 0, sizeof(sense_data));
+ LOGMASKED(LOG_LEVEL2, "%s: clear_sense_data", cpu_context());
+ std::fill_n(m_sense_data, std::size(m_sense_data), 0);
}
/***************************************************************************
@@ -436,11 +441,11 @@ void omti8621_device::clear_sense_data() {
***************************************************************************/
void omti8621_device::set_sense_data(uint8_t code, const uint8_t * cdb) {
- LOG2(("set_sense_data code=%x", code));
- sense_data[0]=code;
- sense_data[1]=cdb[1];
- sense_data[2]=cdb[2];
- sense_data[3]=cdb[3];
+ LOGMASKED(LOG_LEVEL2, "%s: set_sense_data code=%x", cpu_context(), code);
+ m_sense_data[0] = code;
+ m_sense_data[1] = cdb[1];
+ m_sense_data[2] = cdb[2];
+ m_sense_data[3] = cdb[3];
}
/***************************************************************************
@@ -448,7 +453,7 @@ void omti8621_device::set_sense_data(uint8_t code, const uint8_t * cdb) {
***************************************************************************/
void omti8621_device::set_configuration_data(uint8_t lun) {
- LOG2(("set_configuration_data lun=%x", lun));
+ LOGMASKED(LOG_LEVEL2, "%s: set_configuration_data lun=%x", cpu_context(), lun);
// initialize the configuration data
omti_disk_image_device *disk = our_disks[lun];
@@ -492,7 +497,7 @@ uint8_t omti8621_device::check_disk_address(const uint8_t *cdb)
uint32_t disk_addr = (disk_track * disk->m_sectors) + sector;
if (block_count > OMTI_MAX_BLOCK_COUNT) {
- LOG(("########### check_disk_address: unexpected block count %x", block_count));
+ LOGMASKED(LOG_LEVEL0, "%s: ########### check_disk_address: unexpected block count %x", cpu_context(), block_count);
sense_code = OMTI_SENSE_CODE_ILLEGAL_ADDRESS | OMTI_SENSE_CODE_ADDRESS_VALID;
}
@@ -506,18 +511,18 @@ uint8_t omti8621_device::check_disk_address(const uint8_t *cdb)
sense_code = OMTI_SENSE_CODE_ILLEGAL_ADDRESS | OMTI_SENSE_CODE_ADDRESS_VALID;
} else if (cylinder >= disk->m_cylinders) {
sense_code = OMTI_SENSE_CODE_ILLEGAL_ADDRESS | OMTI_SENSE_CODE_ADDRESS_VALID;
- } else if ( disk_track == diskaddr_format_bad_track && disk_track != 0) {
+ } else if (disk_track == m_diskaddr_format_bad_track && disk_track != 0) {
sense_code = OMTI_SENSE_CODE_BAD_TRACK;
- } else if (disk_addr == diskaddr_ecc_error && disk_addr != 0) {
+ } else if (disk_addr == m_diskaddr_ecc_error && disk_addr != 0) {
sense_code = OMTI_SENSE_CODE_ECC_ERROR;
- } else if (disk_track == alternate_track_address[1] && disk_track != 0) {
+ } else if (disk_track == m_alternate_track_address[1] && disk_track != 0) {
sense_code = OMTI_SENSE_CODE_ALTERNATE_TRACK;
}
if (sense_code == OMTI_SENSE_CODE_NO_ERROR) {
clear_sense_data();
} else {
- command_status |= OMTI_COMMAND_STATUS_ERROR;
+ m_command_status |= OMTI_COMMAND_STATUS_ERROR;
set_sense_data(sense_code, cdb);
}
return sense_code == OMTI_SENSE_CODE_NO_ERROR;
@@ -551,29 +556,29 @@ uint32_t omti8621_device::get_disk_address(const uint8_t * cdb) {
void omti8621_device::set_data_transfer(uint8_t *data, uint16_t length)
{
// set controller for read data transfer
- omti_state = OMTI_STATE_DATA;
- status_port |= OMTI_STATUS_REQ | OMTI_STATUS_IO | OMTI_STATUS_BUSY;
- status_port &= ~OMTI_STATUS_CD;
+ m_omti_state = OMTI_STATE_DATA;
+ m_status_port |= OMTI_STATUS_REQ | OMTI_STATUS_IO | OMTI_STATUS_BUSY;
+ m_status_port &= ~OMTI_STATUS_CD;
- data_buffer = data;
- data_length = length;
- data_index = 0;
+ m_data_buffer = data;
+ m_data_length = length;
+ m_data_index = 0;
}
/***************************************************************************
- read_sectors_from_disk - read sectors starting at diskaddr into sector_buffer
+ read_sectors_from_disk - read sectors starting at diskaddr into m_sector_buffer
***************************************************************************/
void omti8621_device::read_sectors_from_disk(int32_t diskaddr, uint8_t count, uint8_t lun)
{
- uint8_t *data_buffer = &sector_buffer[0];
+ uint8_t *data_buffer = &m_sector_buffer[0];
device_image_interface *image = our_disks[lun]->m_image;
while (count-- > 0) {
- LOG2(("read_sectors_from_disk lun=%d diskaddr=%x", lun, diskaddr));
+ LOGMASKED(LOG_LEVEL2, "%s: read_sectors_from_disk lun=%d diskaddr=%x", cpu_context(), lun, diskaddr);
- image->fseek( diskaddr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
- image->fread( data_buffer, OMTI_DISK_SECTOR_SIZE);
+ image->fseek(diskaddr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
+ image->fread(data_buffer, OMTI_DISK_SECTOR_SIZE);
diskaddr++;
data_buffer += OMTI_DISK_SECTOR_SIZE;
@@ -581,23 +586,23 @@ void omti8621_device::read_sectors_from_disk(int32_t diskaddr, uint8_t count, ui
}
/***************************************************************************
- write_sectors_to_disk - write sectors starting at diskaddr from sector_buffer
+ write_sectors_to_disk - write sectors starting at diskaddr from m_sector_buffer
***************************************************************************/
void omti8621_device::write_sectors_to_disk(int32_t diskaddr, uint8_t count, uint8_t lun)
{
- uint8_t *data_buffer = &sector_buffer[0];
+ uint8_t *data_buffer = &m_sector_buffer[0];
device_image_interface *image = our_disks[lun]->m_image;
while (count-- > 0) {
- LOG2(("write_sectors_to_disk lun=%d diskaddr=%x", lun, diskaddr));
+ LOGMASKED(LOG_LEVEL2, "%s: write_sectors_to_disk lun=%d diskaddr=%x", cpu_context(), lun, diskaddr);
- image->fseek( diskaddr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
- image->fwrite( data_buffer, OMTI_DISK_SECTOR_SIZE);
+ image->fseek(diskaddr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
+ image->fwrite(data_buffer, OMTI_DISK_SECTOR_SIZE);
- if (diskaddr == diskaddr_ecc_error) {
+ if (diskaddr == m_diskaddr_ecc_error) {
// reset previous ECC error
- diskaddr_ecc_error = 0;
+ m_diskaddr_ecc_error = 0;
}
diskaddr++;
@@ -613,18 +618,18 @@ void omti8621_device::copy_sectors(int32_t dst_addr, int32_t src_addr, uint8_t c
{
device_image_interface *image = our_disks[lun]->m_image;
- LOG2(("copy_sectors lun=%d src_addr=%x dst_addr=%x count=%x", lun, src_addr, dst_addr, count));
+ LOGMASKED(LOG_LEVEL2, "%s: copy_sectors lun=%d src_addr=%x dst_addr=%x count=%x", cpu_context(), lun, src_addr, dst_addr, count);
while (count-- > 0) {
- image->fseek( src_addr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
- image->fread( &sector_buffer[0], OMTI_DISK_SECTOR_SIZE);
+ image->fseek(src_addr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
+ image->fread(&m_sector_buffer[0], OMTI_DISK_SECTOR_SIZE);
- image->fseek( dst_addr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
- image->fwrite( &sector_buffer[0], OMTI_DISK_SECTOR_SIZE);
+ image->fseek(dst_addr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
+ image->fwrite(&m_sector_buffer[0], OMTI_DISK_SECTOR_SIZE);
- if (dst_addr == diskaddr_ecc_error) {
+ if (dst_addr == m_diskaddr_ecc_error) {
// reset previous ECC error
- diskaddr_ecc_error = 0;
+ m_diskaddr_ecc_error = 0;
}
src_addr++;
@@ -642,29 +647,29 @@ void omti8621_device::format_track(const uint8_t * cdb)
uint32_t disk_addr = get_disk_address(cdb);
uint32_t disk_track = get_disk_track(cdb);
- if (diskaddr_ecc_error == disk_addr) {
+ if (m_diskaddr_ecc_error == disk_addr) {
// reset previous ECC error
- diskaddr_ecc_error = 0;
+ m_diskaddr_ecc_error = 0;
}
- if (diskaddr_format_bad_track == disk_track) {
+ if (m_diskaddr_format_bad_track == disk_track) {
// reset previous bad track formatting
- diskaddr_format_bad_track = 0;
+ m_diskaddr_format_bad_track = 0;
}
- if (alternate_track_address[0] == disk_track) {
+ if (m_alternate_track_address[0] == disk_track) {
// reset source of alternate track address
- alternate_track_address[0] = 0;
+ m_alternate_track_address[0] = 0;
}
- if (alternate_track_address[1] == disk_track) {
+ if (m_alternate_track_address[1] == disk_track) {
// reset alternate track address
- alternate_track_address[1] = 0;
+ m_alternate_track_address[1] = 0;
}
if (check_disk_address(cdb) ) {
if ((cdb[5] & 0x40) == 0) {
- memset(&sector_buffer[0], 0x6C, OMTI_DISK_SECTOR_SIZE * our_disks[lun]->m_sectors);
+ memset(&m_sector_buffer[0], 0x6C, OMTI_DISK_SECTOR_SIZE * our_disks[lun]->m_sectors);
}
write_sectors_to_disk(disk_addr, our_disks[lun]->m_sectors, lun);
}
@@ -703,8 +708,7 @@ void omti8621_device::logerror(Format &&fmt, Params &&... args) const
void omti8621_device::log_command(const uint8_t cdb[], const uint16_t cdb_length)
{
- if (verbose > 0) {
- int i;
+ if (VERBOSE & (LOG_LEVEL1 | LOG_LEVEL2 | LOG_LEVEL3)) {
logerror("%s: OMTI command ", cpu_context());
switch (cdb[0]) {
case OMTI_CMD_TEST_DRIVE_READY: // 0x00
@@ -777,7 +781,7 @@ void omti8621_device::log_command(const uint8_t cdb[], const uint16_t cdb_length
logerror("!!! Unexpected Command !!!");
}
// logerror(" (%02x, length=%02x)", cdb[0], cdb_length);
- for (i = 0; i < cdb_length; i++) {
+ for (int i = 0; i < cdb_length; i++) {
logerror(" %02x", cdb[i]);
}
@@ -802,15 +806,14 @@ void omti8621_device::log_command(const uint8_t cdb[], const uint16_t cdb_length
void omti8621_device::log_data()
{
- if (verbose > 0) {
- int i;
- logerror("%s: OMTI data (length=%02x)", cpu_context(),
- data_length);
- for (i = 0; i < data_length && i < OMTI_DISK_SECTOR_SIZE; i++) {
- logerror(" %02x", data_buffer[i]);
+ if (VERBOSE & LOG_LEVEL1) {
+ logerror("%s: OMTI data (length=%02x)", cpu_context(), m_data_length);
+ uint16_t i;
+ for (i = 0; i < m_data_length && i < OMTI_DISK_SECTOR_SIZE; i++) {
+ logerror(" %02x", m_data_buffer[i]);
}
- if (i < data_length) {
+ if (i < m_data_length) {
logerror(" ...");
}
logerror("\n");
@@ -827,19 +830,19 @@ void omti8621_device::do_command(const uint8_t cdb[], const uint16_t cdb_length)
omti_disk_image_device *disk = our_disks[lun];
int command_duration = 0; // ms
- log_command( cdb, cdb_length);
+ log_command(cdb, cdb_length);
// default to read status and status is successful completion
- omti_state = OMTI_STATE_STATUS;
- status_port |= OMTI_STATUS_IO | OMTI_STATUS_CD;
- command_status = lun ? OMTI_COMMAND_STATUS_LUN : 0;
+ m_omti_state = OMTI_STATE_STATUS;
+ m_status_port |= OMTI_STATUS_IO | OMTI_STATUS_CD;
+ m_command_status = lun ? OMTI_COMMAND_STATUS_LUN : 0;
- if (mask_port & OMTI_MASK_INTE) {
+ if (m_mask_port & OMTI_MASK_INTE) {
set_interrupt(CLEAR_LINE);
}
if (!disk->m_image->exists()) {
- command_status |= OMTI_COMMAND_STATUS_ERROR; // no such drive
+ m_command_status |= OMTI_COMMAND_STATUS_ERROR; // no such drive
}
switch (cdb[0]) {
@@ -854,7 +857,7 @@ void omti8621_device::do_command(const uint8_t cdb[], const uint16_t cdb_length)
break;
case OMTI_CMD_REQUEST_SENSE: // 0x03
- set_data_transfer(sense_data, sizeof(sense_data));
+ set_data_transfer(m_sense_data, sizeof(m_sense_data));
break;
case OMTI_CMD_READ_VERIFY: // 0x05
@@ -866,14 +869,14 @@ void omti8621_device::do_command(const uint8_t cdb[], const uint16_t cdb_length)
break;
case OMTI_CMD_FORMAT_BAD_TRACK: // 0x07
- diskaddr_format_bad_track = get_disk_address(cdb);
+ m_diskaddr_format_bad_track = get_disk_address(cdb);
break;
case OMTI_CMD_READ: // 0x08
if (check_disk_address(cdb)) {
// read data from controller
read_sectors_from_disk(get_disk_address(cdb), cdb[4], lun);
- set_data_transfer(&sector_buffer[0], OMTI_DISK_SECTOR_SIZE*cdb[4]);
+ set_data_transfer(&m_sector_buffer[0], OMTI_DISK_SECTOR_SIZE*cdb[4]);
}
break;
@@ -889,7 +892,7 @@ void omti8621_device::do_command(const uint8_t cdb[], const uint16_t cdb_length)
break;
case OMTI_CMD_READ_SECTOR_BUFFER: // 0x0E
- set_data_transfer(&sector_buffer[0], OMTI_DISK_SECTOR_SIZE*cdb[4]);
+ set_data_transfer(&m_sector_buffer[0], OMTI_DISK_SECTOR_SIZE*cdb[4]);
break;
case OMTI_CMD_WRITE_SECTOR_BUFFER: // 0x0F
@@ -911,8 +914,8 @@ void omti8621_device::do_command(const uint8_t cdb[], const uint16_t cdb_length)
#if 0 // this command seems unused by Domain/OS, and it's unclear what the intent of the code is (it makes some versions of GCC quite unhappy)
case OMTI_CMD_ASSIGN_ALTERNATE_TRACK: // 0x11
log_data();
- alternate_track_address[0] = get_disk_track(cdb);
- alternate_track_address[1] = get_disk_track(alternate_track_buffer-1);
+ m_alternate_track_address[0] = get_disk_track(cdb);
+ m_alternate_track_address[1] = get_disk_track(m_alternate_track_buffer - 1);
break;
#endif
@@ -942,7 +945,7 @@ void omti8621_device::do_command(const uint8_t cdb[], const uint16_t cdb_length)
if (check_disk_address(cdb)) {
// read data from controller
read_sectors_from_disk(get_disk_address(cdb), cdb[4], lun);
- set_data_transfer(&sector_buffer[0], OMTI_DISK_SECTOR_SIZE+6);
+ set_data_transfer(&m_sector_buffer[0], OMTI_DISK_SECTOR_SIZE+6);
}
break;
@@ -952,7 +955,7 @@ void omti8621_device::do_command(const uint8_t cdb[], const uint16_t cdb_length)
uint32_t diskaddr = get_disk_address(cdb);
write_sectors_to_disk(diskaddr, cdb[4], lun);
// this will spoil the ECC code
- diskaddr_ecc_error = diskaddr;
+ m_diskaddr_ecc_error = diskaddr;
}
break;
@@ -963,28 +966,28 @@ void omti8621_device::do_command(const uint8_t cdb[], const uint16_t cdb_length)
case OMTI_CMD_INVALID_COMMAND: // 0xFF
set_sense_data(OMTI_SENSE_CODE_INVALID_COMMAND, cdb);
- command_status |= OMTI_COMMAND_STATUS_ERROR;
+ m_command_status |= OMTI_COMMAND_STATUS_ERROR;
break;
default:
- LOG(("do_command: UNEXPECTED command %02x",cdb[0]));
+ LOGMASKED(LOG_LEVEL0, "%s: do_command: UNEXPECTED command %02x", cpu_context(), cdb[0]);
set_sense_data(OMTI_SENSE_CODE_INVALID_COMMAND, cdb);
- command_status |= OMTI_COMMAND_STATUS_ERROR;
+ m_command_status |= OMTI_COMMAND_STATUS_ERROR;
break;
}
- if (mask_port & OMTI_MASK_INTE) {
-// if (omti_state != OMTI_STATE_STATUS) {
-// LOG(("do_command: UNEXPECTED omti_state %02x",omti_state));
+ if (m_mask_port & OMTI_MASK_INTE) {
+// if (m_omti_state != OMTI_STATE_STATUS) {
+// LOGMASKED(LOG_LEVEL0, "%s: do_command: UNEXPECTED omti_state %02x", cpu_context(), m_omti_state));
// }
- status_port |= OMTI_STATUS_IREQ;
+ m_status_port |= OMTI_STATUS_IREQ;
if (command_duration == 0)
{
set_interrupt(ASSERT_LINE);
}
else
{
- // FIXME: should delay omti_state and status_port as well
+ // FIXME: should delay m_omti_state and m_status_port as well
m_timer->adjust(attotime::from_msec(command_duration), 0);
}
}
@@ -1006,16 +1009,16 @@ uint8_t omti8621_device::get_command_length(uint8_t command_byte)
uint16_t omti8621_device::get_data()
{
uint16_t data = 0xff;
- if (data_index < data_length) {
- data = data_buffer[data_index++];
- data |= data_buffer[data_index++] << 8;
- if (data_index >= data_length) {
- omti_state = OMTI_STATE_STATUS;
- status_port |= OMTI_STATUS_IO | OMTI_STATUS_CD;
+ if (m_data_index < m_data_length) {
+ data = m_data_buffer[m_data_index++];
+ data |= m_data_buffer[m_data_index++] << 8;
+ if (m_data_index >= m_data_length) {
+ m_omti_state = OMTI_STATE_STATUS;
+ m_status_port |= OMTI_STATUS_IO | OMTI_STATUS_CD;
log_data();
}
} else {
- LOG(("UNEXPECTED reading OMTI 8621 data (buffer length exceeded)"));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED reading OMTI 8621 data (buffer length exceeded)", cpu_context());
}
return data;
}
@@ -1026,14 +1029,14 @@ uint16_t omti8621_device::get_data()
void omti8621_device::set_data(uint16_t data)
{
- if (data_index < data_length) {
- data_buffer[data_index++] = data & 0xff;
- data_buffer[data_index++] = data >> 8;
- if (data_index >= data_length) {
- do_command(command_buffer, command_index);
+ if (m_data_index < m_data_length) {
+ m_data_buffer[m_data_index++] = data & 0xff;
+ m_data_buffer[m_data_index++] = data >> 8;
+ if (m_data_index >= m_data_length) {
+ do_command(m_command_buffer, m_command_index);
}
} else {
- LOG(("UNEXPECTED writing OMTI 8621 data (buffer length exceeded)"));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED writing OMTI 8621 data (buffer length exceeded)", cpu_context());
}
}
@@ -1064,91 +1067,89 @@ void omti8621_device::write8(offs_t offset, uint8_t data)
switch (offset)
{
case OMTI_PORT_DATA_OUT: // 0x00
- switch (omti_state) {
+ switch (m_omti_state) {
case OMTI_STATE_COMMAND:
- LOG2(("writing OMTI 8621 Command Register at offset %02x = %02x", offset, data));
- if (command_index == 0) {
- command_length = get_command_length(data);
+ LOGMASKED(LOG_LEVEL2, "%s: writing OMTI 8621 Command Register at offset %02x = %02x", cpu_context(), offset, data);
+ if (m_command_index == 0) {
+ m_command_length = get_command_length(data);
}
- if (command_index < command_length) {
- command_buffer[command_index++] = data;
+ if (m_command_index < m_command_length) {
+ m_command_buffer[m_command_index++] = data;
} else {
- LOG(("UNEXPECTED writing OMTI 8621 Data Register at offset %02x = %02x (command length exceeded)", offset, data));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED writing OMTI 8621 Data Register at offset %02x = %02x (command length exceeded)", cpu_context(), offset, data);
}
- if (command_index == command_length) {
- switch (command_buffer[0]) {
+ if (m_command_index == m_command_length) {
+ switch (m_command_buffer[0]) {
case OMTI_CMD_WRITE: // 0x0A
// TODO: check diskaddr
- // Fall through
+ [[fallthrough]];
case OMTI_CMD_WRITE_SECTOR_BUFFER: // 0x0F
- set_data_transfer(&sector_buffer[0],
- OMTI_DISK_SECTOR_SIZE * command_buffer[4]);
- status_port &= ~OMTI_STATUS_IO;
+ set_data_transfer(&m_sector_buffer[0], OMTI_DISK_SECTOR_SIZE * m_command_buffer[4]);
+ m_status_port &= ~OMTI_STATUS_IO;
break;
case OMTI_CMD_ASSIGN_ALTERNATE_TRACK: // 0x11
- set_data_transfer(alternate_track_buffer, sizeof(alternate_track_buffer));
- status_port &= ~OMTI_STATUS_IO;
+ set_data_transfer(m_alternate_track_buffer, sizeof(m_alternate_track_buffer));
+ m_status_port &= ~OMTI_STATUS_IO;
break;
case OMTI_CMD_WRITE_LONG: // 0xE6
// TODO: check diskaddr
- set_data_transfer(&sector_buffer[0],
- (OMTI_DISK_SECTOR_SIZE +6) * command_buffer[4]);
- status_port &= ~OMTI_STATUS_IO;
+ set_data_transfer(&m_sector_buffer[0], (OMTI_DISK_SECTOR_SIZE +6) * m_command_buffer[4]);
+ m_status_port &= ~OMTI_STATUS_IO;
break;
default:
- do_command(command_buffer, command_index);
+ do_command(m_command_buffer, m_command_index);
break;
}
}
break;
case OMTI_STATE_DATA:
- LOG(("UNEXPECTED: writing OMTI 8621 Data Register at offset %02x = %02x", offset, data));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED: writing OMTI 8621 Data Register at offset %02x = %02x", cpu_context(), offset, data);
break;
default:
- LOG(("UNEXPECTED writing OMTI 8621 Data Register at offset %02x = %02x (omti state = %02x)", offset, data, omti_state));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED writing OMTI 8621 Data Register at offset %02x = %02x (omti state = %02x)", cpu_context(), offset, data, m_omti_state);
break;
}
break;
case OMTI_PORT_RESET: // 0x01
- LOG2(("writing OMTI 8621 Reset Register at offset %02x = %02x", offset, data));
+ LOGMASKED(LOG_LEVEL2, "%s: writing OMTI 8621 Reset Register at offset %02x = %02x", cpu_context(), offset, data);
device_reset();
break;
case OMTI_PORT_SELECT: // 0x02
- LOG2(("writing OMTI 8621 Select Register at offset %02x = %02x (omti state = %02x)", offset, data, omti_state));
- omti_state = OMTI_STATE_COMMAND;
+ LOGMASKED(LOG_LEVEL2, "%s: writing OMTI 8621 Select Register at offset %02x = %02x (omti state = %02x)", cpu_context(), offset, data, m_omti_state);
+ m_omti_state = OMTI_STATE_COMMAND;
- status_port |= OMTI_STATUS_BUSY | OMTI_STATUS_REQ | OMTI_STATUS_CD;
- status_port &= ~OMTI_STATUS_IO;
+ m_status_port |= OMTI_STATUS_BUSY | OMTI_STATUS_REQ | OMTI_STATUS_CD;
+ m_status_port &= ~OMTI_STATUS_IO;
- command_status = 0;
- command_index = 0;
+ m_command_status = 0;
+ m_command_index = 0;
break;
case OMTI_PORT_MASK: // 0x03
- LOG2(("writing OMTI 8621 Mask Register at offset %02x = %02x", offset, data));
- mask_port = data;
+ LOGMASKED(LOG_LEVEL2, "%s: writing OMTI 8621 Mask Register at offset %02x = %02x", cpu_context(), offset, data);
+ m_mask_port = data;
if ((data & OMTI_MASK_INTE) == 0) {
- status_port &= ~OMTI_STATUS_IREQ;
+ m_status_port &= ~OMTI_STATUS_IREQ;
set_interrupt(CLEAR_LINE);
}
if ((data & OMTI_MASK_DMAE) == 0) {
- status_port &= ~OMTI_STATUS_DREQ;
+ m_status_port &= ~OMTI_STATUS_DREQ;
}
break;
default:
- LOG(("UNEXPECTED writing OMTI 8621 Register at offset %02x = %02x", offset, data));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED writing OMTI 8621 Register at offset %02x = %02x", cpu_context(), offset, data);
break;
}
}
@@ -1173,69 +1174,64 @@ uint8_t omti8621_device::read8(offs_t offset)
switch (offset) {
case OMTI_PORT_DATA_IN: // 0x00
- if (status_port & OMTI_STATUS_CD)
+ if (m_status_port & OMTI_STATUS_CD)
{
- data = command_status;
- switch (omti_state)
+ data = m_command_status;
+ switch (m_omti_state)
{
case OMTI_STATE_COMMAND:
- LOG2(("reading OMTI 8621 Data Status Register 1 at offset %02x = %02x (omti state = %02x)", offset, data, omti_state));
+ LOGMASKED(LOG_LEVEL2, "%s: reading OMTI 8621 Data Status Register 1 at offset %02x = %02x (omti state = %02x)", cpu_context(), offset, data, m_omti_state);
break;
case OMTI_STATE_STATUS:
- omti_state = OMTI_STATE_IDLE;
- status_port &= ~(OMTI_STATUS_BUSY | OMTI_STATUS_CD | OMTI_STATUS_IO | OMTI_STATUS_REQ);
- LOG2(("reading OMTI 8621 Data Status Register 2 at offset %02x = %02x", offset, data));
+ m_omti_state = OMTI_STATE_IDLE;
+ m_status_port &= ~(OMTI_STATUS_BUSY | OMTI_STATUS_CD | OMTI_STATUS_IO | OMTI_STATUS_REQ);
+ LOGMASKED(LOG_LEVEL2, "%s: reading OMTI 8621 Data Status Register 2 at offset %02x = %02x", cpu_context(), offset, data);
break;
default:
- LOG(("UNEXPECTED reading OMTI 8621 Data Status Register 3 at offset %02x = %02x (omti state = %02x)", offset, data, omti_state));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED reading OMTI 8621 Data Status Register 3 at offset %02x = %02x (omti state = %02x)", cpu_context(), offset, data, m_omti_state);
break;
}
}
else
{
- LOG(("UNEXPECTED reading OMTI 8621 Data Register 4 at offset %02x = %02x (status bit C/D = 0)", offset, data));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED reading OMTI 8621 Data Register 4 at offset %02x = %02x (status bit C/D = 0)", cpu_context(), offset, data);
}
break;
case OMTI_PORT_STATUS: // 0x01
- data = status_port;
+ data = m_status_port;
// omit excessive logging
if (data != last_data)
{
- LOG2(("reading OMTI 8621 Status Register 5 at offset %02x = %02x", offset, data));
+ LOGMASKED(LOG_LEVEL2, "%s: reading OMTI 8621 Status Register 5 at offset %02x = %02x", cpu_context(), offset, data);
// last_data = data;
}
break;
case OMTI_PORT_CONFIG: // 0x02
- data = config_port;
- LOG2(("reading OMTI 8621 Configuration Register at offset %02x = %02x", offset, data));
+ data = m_config_port;
+ LOGMASKED(LOG_LEVEL2, "%s: reading OMTI 8621 Configuration Register at offset %02x = %02x", cpu_context(), offset, data);
break;
case OMTI_PORT_MASK: // 0x03
- data = mask_port ;
+ data = m_mask_port;
// win.dex will update the mask register with read-modify-write
- // LOG2(("reading OMTI 8621 Mask Register at offset %02x = %02x (UNEXPECTED!)", offset, data));
+ // LOGMASKED(LOG_LEVEL2, "%s: reading OMTI 8621 Mask Register at offset %02x = %02x (UNEXPECTED!)", cpu_context(), offset, data);
break;
default:
- LOG(("UNEXPECTED reading OMTI 8621 Register at offset %02x = %02x", offset, data));
+ LOGMASKED(LOG_LEVEL0, "%s: UNEXPECTED reading OMTI 8621 Register at offset %02x = %02x", cpu_context(), offset, data);
break;
}
return data;
}
-void omti8621_device::set_verbose(int on_off)
-{
- verbose = on_off == 0 ? 0 : VERBOSE > 1 ? VERBOSE : 1;
-}
-
/***************************************************************************
get_sector - get sector diskaddr of logical unit lun into data_buffer
***************************************************************************/
-uint32_t omti8621_apollo_device::get_sector(int32_t diskaddr, uint8_t *data_buffer, uint32_t length, uint8_t lun)
+uint32_t omti8621_apollo_device::get_sector(int32_t diskaddr, uint8_t *buffer, uint32_t length, uint8_t lun)
{
omti_disk_image_device *disk = our_disks[lun];
@@ -1245,13 +1241,13 @@ uint32_t omti8621_apollo_device::get_sector(int32_t diskaddr, uint8_t *data_buff
}
else
{
-// LOG1(("omti8621_get_sector %x on lun %d", diskaddr, lun));
+// LOGMASKED(LOG_LEVEL1, "%s: omti8621_get_sector %x on lun %d", cpu_context(), diskaddr, lun);
// restrict length to size of 1 sector (i.e. 1024 Byte)
length = length < OMTI_DISK_SECTOR_SIZE ? length : OMTI_DISK_SECTOR_SIZE;
disk->m_image->fseek(diskaddr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
- disk->m_image->fread(data_buffer, length);
+ disk->m_image->fread(buffer, length);
return length;
}
@@ -1263,29 +1259,29 @@ uint32_t omti8621_apollo_device::get_sector(int32_t diskaddr, uint8_t *data_buff
void omti8621_device::set_jumper(uint16_t disk_type)
{
- LOG1(("set_jumper: disk type=%x", disk_type));
+ LOGMASKED(LOG_LEVEL1, "%s: set_jumper: disk type=%x", cpu_context(), disk_type);
switch (disk_type)
{
case OMTI_DISK_TYPE_348_MB: // Maxtor 380 MB (348-MB FA formatted)
- jumper = OMTI_CONFIG_W22 | OMTI_CONFIG_W23;
+ m_jumper = OMTI_CONFIG_W22 | OMTI_CONFIG_W23;
break;
case OMTI_DISK_TYPE_155_MB: // Micropolis 170 MB (155-MB formatted)
default:
- jumper = OMTI_CONFIG_W20;
+ m_jumper = OMTI_CONFIG_W20;
break;
}
}
// FDC uses the standard IRQ 6 / DMA 2, doesn't appear to be configurable
-WRITE_LINE_MEMBER( omti8621_device::fdc_irq_w )
+void omti8621_device::fdc_irq_w(int state)
{
if (BIT(m_moten, 3))
m_isa->irq6_w(state ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE_LINE_MEMBER( omti8621_device::fdc_drq_w )
+void omti8621_device::fdc_drq_w(int state)
{
if (BIT(m_moten, 3))
m_isa->drq2_w(state ? ASSERT_LINE : CLEAR_LINE);
@@ -1383,8 +1379,7 @@ uint8_t omti8621_device::fd_disk_chg_r()
DEFINE_DEVICE_TYPE(OMTI_DISK, omti_disk_image_device, "omti_disk_image", "OMTI 8621 ESDI disk")
omti_disk_image_device::omti_disk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, OMTI_DISK, tag, owner, clock)
- , device_image_interface(mconfig, *this)
+ : harddisk_image_base_device(mconfig, OMTI_DISK, tag, owner, clock)
, m_type(0), m_cylinders(0), m_heads(0), m_sectors(0), m_sectorbytes(0), m_sector_count(0), m_image(nullptr)
{
}
@@ -1473,7 +1468,7 @@ void omti_disk_image_device::device_reset()
disk image create callback
-------------------------------------------------*/
-image_init_result omti_disk_image_device::call_create(int format_type, util::option_resolution *format_options)
+std::pair<std::error_condition, std::string> omti_disk_image_device::call_create(int format_type, util::option_resolution *format_options)
{
logerror("device_create_omti_disk: creating OMTI Disk with %d blocks\n", m_sector_count);
@@ -1482,12 +1477,9 @@ image_init_result omti_disk_image_device::call_create(int format_type, util::opt
for (int x = 0; x < m_sector_count; x++)
{
- if (fwrite(sectordata, OMTI_DISK_SECTOR_SIZE)
- < OMTI_DISK_SECTOR_SIZE)
- {
- return image_init_result::FAIL;
- }
+ if (fwrite(sectordata, OMTI_DISK_SECTOR_SIZE) < OMTI_DISK_SECTOR_SIZE)
+ return std::make_pair(image_error::UNSPECIFIED, std::string());
}
- return image_init_result::PASS;
+ return std::make_pair(std::error_condition(), std::string());
}