Clean up names for SCSI devices.

This commit is contained in:
Maxim Poliakovski 2023-12-04 22:41:01 +01:00
parent 8841c3e7f9
commit 65a343ce5c
8 changed files with 65 additions and 59 deletions

View File

@ -34,7 +34,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
using namespace ata_interface;
AtapiCdrom::AtapiCdrom(std::string name) : AtapiBaseDevice(name) {
AtapiCdrom::AtapiCdrom(std::string name) : CdromDrive(), AtapiBaseDevice(name) {
this->set_error_callback(
[this](uint8_t sense_key, uint8_t asc) {
this->status_error(sense_key, asc);

View File

@ -33,7 +33,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
#include <cinttypes>
#include <cstring>
Sc53C94::Sc53C94(uint8_t chip_id, uint8_t my_id) : ScsiDevice(my_id)
Sc53C94::Sc53C94(uint8_t chip_id, uint8_t my_id) : ScsiDevice("SC53C94", my_id)
{
this->chip_id = chip_id;
this->my_bus_id = my_id;
@ -110,7 +110,7 @@ uint8_t Sc53C94::read(uint8_t reg_offset)
}
break;
default:
LOG_F(INFO, "SC53C94: reading from register %d", reg_offset);
LOG_F(INFO, "%s: reading from register %d", this->name.c_str(), reg_offset);
}
return 0;
}
@ -144,7 +144,7 @@ void Sc53C94::write(uint8_t reg_offset, uint8_t value)
break;
case Write::Reg53C94::Config_1:
if ((value & 7) != this->my_bus_id) {
ABORT_F("SC53C94: HBA bus ID mismatch!");
ABORT_F("%s: HBA bus ID mismatch!", this->name.c_str());
}
this->config1 = value;
break;
@ -155,7 +155,8 @@ void Sc53C94::write(uint8_t reg_offset, uint8_t value)
this->config3 = value;
break;
default:
LOG_F(INFO, "SC53C94: writing 0x%X to %d register", value, reg_offset);
LOG_F(INFO, "%s: writing 0x%X to %d register", this->name.c_str(), value,
reg_offset);
}
}
@ -208,7 +209,7 @@ void Sc53C94::pseudo_dma_write(uint16_t data) {
void Sc53C94::update_command_reg(uint8_t cmd)
{
if (this->on_reset && (cmd & 0x7F) != CMD_NOP) {
LOG_F(WARNING, "SC53C94: command register blocked after RESET!");
LOG_F(WARNING, "%s: command register blocked after RESET!", this->name.c_str());
return;
}
@ -228,7 +229,7 @@ void Sc53C94::update_command_reg(uint8_t cmd)
exec_command();
}
} else {
LOG_F(ERROR, "SC53C94: the top of the command FIFO overwritten!");
LOG_F(ERROR, "%s: the top of the command FIFO overwritten!", this->name.c_str());
this->status |= STAT_GE; // signal IOE/Gross Error
}
}
@ -268,7 +269,7 @@ void Sc53C94::exec_command()
this->on_reset = true; // block the command register
return;
case CMD_RESET_BUS:
LOG_F(INFO, "SC53C94: resetting SCSI bus...");
LOG_F(INFO, "%s: resetting SCSI bus...", this->name.c_str());
// assert RST line
this->bus_obj->assert_ctrl_line(this->my_bus_id, SCSI_CTRL_RST);
// release RST line after 25 us
@ -278,7 +279,7 @@ void Sc53C94::exec_command()
this->bus_obj->release_ctrl_line(this->my_bus_id, SCSI_CTRL_RST);
});
if (!(config1 & 0x40)) {
LOG_F(INFO, "SC53C94: reset interrupt issued");
LOG_F(INFO, "%s: reset interrupt issued", this->name.c_str());
this->int_status |= INTSTAT_SRST;
}
exec_next_command();
@ -303,7 +304,7 @@ void Sc53C94::exec_command()
{SeqState::CMD_COMPLETE, 0, INTSTAT_SR}
};
if (this->bus_obj->current_phase() != ScsiPhase::STATUS) {
ABORT_F("Sc53C94: complete steps only works in the STATUS phase");
ABORT_F("%s: complete steps only works in the STATUS phase", this->name.c_str());
}
this->seq_step = 0;
this->cmd_steps = complete_steps_desc;
@ -330,7 +331,7 @@ void Sc53C94::exec_command()
this->cmd_steps = sel_no_atn_desc;
this->cur_state = SeqState::BUS_FREE;
this->sequencer();
LOG_F(9, "SC53C94: SELECT W/O ATN command started");
LOG_F(9, "%s: SELECT W/O ATN command started", this->name.c_str());
break;
case CMD_SELECT_WITH_ATN:
static SeqDesc * sel_with_atn_desc = new SeqDesc[4]{
@ -344,13 +345,13 @@ void Sc53C94::exec_command()
this->cmd_steps = sel_with_atn_desc;
this->cur_state = SeqState::BUS_FREE;
this->sequencer();
LOG_F(9, "SC53C94: SELECT WITH ATN command started");
LOG_F(9, "%s: SELECT WITH ATN command started", this->name.c_str());
break;
case CMD_ENA_SEL_RESEL:
exec_next_command();
break;
default:
LOG_F(ERROR, "SC53C94: invalid/unimplemented command 0x%X", cmd);
LOG_F(ERROR, "%s: invalid/unimplemented command 0x%X", this->name.c_str(), cmd);
this->cmd_fifo_pos--; // remove invalid command from FIFO
this->int_status |= INTSTAT_ICMD;
this->update_irq();
@ -373,7 +374,7 @@ void Sc53C94::fifo_push(const uint8_t data)
if (this->data_fifo_pos < DATA_FIFO_MAX) {
this->data_fifo[this->data_fifo_pos++] = data;
} else {
LOG_F(ERROR, "SC53C94: data FIFO overflow!");
LOG_F(ERROR, "%s: data FIFO overflow!", this->name.c_str());
this->status |= STAT_GE; // signal IOE/Gross Error
}
}
@ -383,7 +384,7 @@ uint8_t Sc53C94::fifo_pop()
uint8_t data = 0;
if (this->data_fifo_pos < 1) {
LOG_F(ERROR, "SC53C94: data FIFO underflow!");
LOG_F(ERROR, "%s: data FIFO underflow!", this->name.c_str());
this->status |= STAT_GE; // signal IOE/Gross Error
} else {
data = this->data_fifo[0];
@ -421,7 +422,7 @@ void Sc53C94::sequencer()
break;
case SeqState::ARB_BEGIN:
if (!this->bus_obj->begin_arbitration(this->my_bus_id)) {
LOG_F(ERROR, "SC53C94: arbitration error, bus not free!");
LOG_F(ERROR, "%s: arbitration error, bus not free!", this->name.c_str());
this->bus_obj->release_ctrl_lines(this->my_bus_id);
this->next_state = SeqState::BUS_FREE;
this->seq_defer_state(BUS_CLEAR_DELAY);
@ -435,7 +436,7 @@ void Sc53C94::sequencer()
this->next_state = this->cmd_steps->next_step;
this->seq_defer_state(BUS_CLEAR_DELAY + BUS_SETTLE_DELAY);
} else { // arbitration lost
LOG_F(INFO, "SC53C94: arbitration lost!");
LOG_F(INFO, "%s: arbitration lost!", this->name.c_str());
this->bus_obj->release_ctrl_lines(this->my_bus_id);
this->next_state = SeqState::BUS_FREE;
this->seq_defer_state(BUS_CLEAR_DELAY);
@ -451,7 +452,7 @@ void Sc53C94::sequencer()
case SeqState::SEL_END:
if (this->bus_obj->end_selection(this->my_bus_id, this->target_id)) {
this->bus_obj->release_ctrl_line(this->my_bus_id, SCSI_CTRL_SEL);
LOG_F(9, "SC53C94: selection completed");
LOG_F(9, "%s: selection completed", this->name.c_str());
} else { // selection timeout
this->seq_step = this->cmd_steps->step_num;
this->int_status |= this->cmd_steps->status;
@ -545,7 +546,7 @@ void Sc53C94::sequencer()
}
break;
default:
ABORT_F("SC53C94: unimplemented sequencer state %d", this->cur_state);
ABORT_F("%s: unimplemented sequencer state %d", this->name.c_str(), this->cur_state);
}
}
@ -569,7 +570,8 @@ void Sc53C94::notify(ScsiMsg msg_type, int param)
this->cur_state = SeqState::SEL_END;
this->sequencer();
} else {
LOG_F(WARNING, "SC53C94: ignore invalid selection confirmation message");
LOG_F(WARNING, "%s: ignore invalid selection confirmation message",
this->name.c_str());
}
break;
case ScsiMsg::BUS_PHASE_CHANGE:
@ -581,7 +583,8 @@ void Sc53C94::notify(ScsiMsg msg_type, int param)
}
break;
default:
LOG_F(9, "SC53C94: ignore notification message, type: %d", msg_type);
LOG_F(9, "%s: ignore notification message, type: %d", this->name.c_str(),
msg_type);
}
}

View File

@ -164,7 +164,9 @@ typedef std::function<void()> action_callback;
class ScsiDevice : public HWComponent {
public:
ScsiDevice(int my_id) {
ScsiDevice(std::string name, int my_id) {
this->set_name(name);
supports_types(HWCompType::SCSI_DEV);
this->scsi_id = my_id;
this->cur_phase = ScsiPhase::BUS_FREE;
};

View File

@ -1,6 +1,6 @@
/*
DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-22 divingkatae and maximum
Copyright (C) 2018-23 divingkatae and maximum
(theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
@ -37,9 +37,9 @@ static char cdrom_vendor_sony_id[] = "SONY ";
static char cdu8003a_product_id[] = "CD-ROM CDU-8003A";
static char cdu8003a_revision_id[] = "1.9a";
ScsiCdrom::ScsiCdrom(int my_id) : ScsiDevice(my_id)
ScsiCdrom::ScsiCdrom(std::string name, int my_id) : ScsiDevice(name, my_id)
{
supports_types(HWCompType::SCSI_DEV);
//supports_types(HWCompType::SCSI_DEV);
this->sector_size = 2048;
@ -50,7 +50,7 @@ ScsiCdrom::ScsiCdrom(int my_id) : ScsiDevice(my_id)
void ScsiCdrom::insert_image(std::string filename)
{
if (!this->cdr_img.open(filename)) {
ABORT_F("SCSI-CDROM: could not open image file");
ABORT_F("%s: could not open image file", this->name.c_str());
}
this->img_size = this->cdr_img.size();
@ -104,7 +104,7 @@ void ScsiCdrom::process_command()
lba = READ_DWORD_BE_U(&this->cmd_buf[2]);
xfer_len = READ_WORD_BE_U(&this->cmd_buf[7]);
if (this->cmd_buf[1] & 1) {
ABORT_F("SCSI-CDROM: RelAdr bit set in READ_10");
ABORT_F("%s: RelAdr bit set in READ_10", this->name.c_str());
}
read(lba, xfer_len, 10);
break;
@ -112,7 +112,7 @@ void ScsiCdrom::process_command()
this->read_toc();
break;
default:
ABORT_F("SCSI_CDROM: unsupported command %d", this->cmd_buf[0]);
ABORT_F("%s: unsupported command %d", this->name.c_str(), this->cmd_buf[0]);
}
}
@ -130,7 +130,7 @@ bool ScsiCdrom::prepare_data()
case ScsiPhase::STATUS:
break;
default:
LOG_F(WARNING, "SCSI_CDROM: unexpected phase in prepare_data");
LOG_F(WARNING, "%s: unexpected phase in prepare_data", this->name.c_str());
return false;
}
return true;
@ -163,11 +163,11 @@ void ScsiCdrom::inquiry()
int alloc_len = cmd_buf[4];
if (page_num) {
ABORT_F("SCSI_CDROM: invalid page number in INQUIRY");
ABORT_F("%s: invalid page number in INQUIRY", this->name.c_str());
}
if (alloc_len > 36) {
LOG_F(WARNING, "SCSI_CDROM: more than 36 bytes requested in INQUIRY");
LOG_F(WARNING, "%s: more than 36 bytes requested in INQUIRY", this->name.c_str());
}
this->data_buf[0] = 5; // device type: CD-ROM
@ -225,7 +225,7 @@ void ScsiCdrom::mode_sense()
this->data_buf[0] += 23;
break;
default:
ABORT_F("SCSI-HD: unsupported page %d in MODE_SENSE_6", page_code);
ABORT_F("%s: unsupported page %d in MODE_SENSE_6", this->name.c_str(), page_code);
}
this->bytes_out = this->data_buf[0];
@ -242,11 +242,11 @@ void ScsiCdrom::read_toc()
bool is_msf = !!(this->cmd_buf[1] & 2);
if (this->cmd_buf[2] & 0xF) {
ABORT_F("SCSI-CDROM: unsupported format in READ_TOC");
ABORT_F("%s: unsupported format in READ_TOC", this->name.c_str());
}
if (!alloc_len) {
LOG_F(WARNING, "SCSI-CDROM: zero allocation length passed to READ_TOC");
LOG_F(WARNING, "%s: zero allocation length passed to READ_TOC", this->name.c_str());
return;
}
@ -260,7 +260,8 @@ void ScsiCdrom::read_toc()
} else if (start_track <= this->num_tracks) {
tot_tracks = (this->num_tracks - start_track) + 2;
} else {
LOG_F(ERROR, "SCSI-CDROM: invalid starting track %d in READ_TOC", start_track);
LOG_F(ERROR, "%s: invalid starting track %d in READ_TOC", this->name.c_str(),
start_track);
this->status = ScsiStatus::CHECK_CONDITION;
this->sense = ScsiSense::ILLEGAL_REQ;
this->switch_phase(ScsiPhase::STATUS);
@ -313,11 +314,11 @@ void ScsiCdrom::read_capacity()
uint32_t lba = READ_DWORD_BE_U(&this->cmd_buf[2]);
if (this->cmd_buf[1] & 1) {
ABORT_F("SCSI-CDROM: RelAdr bit set in READ_CAPACITY_10");
ABORT_F("%s: RelAdr bit set in READ_CAPACITY_10", this->name.c_str());
}
if (!(this->cmd_buf[8] & 1) && lba) {
LOG_F(ERROR, "SCSI-CDROM: non-zero LBA for PMI=0");
LOG_F(ERROR, "%s: non-zero LBA for PMI=0", this->name.c_str());
this->status = ScsiStatus::CHECK_CONDITION;
this->sense = ScsiSense::ILLEGAL_REQ;
this->switch_phase(ScsiPhase::STATUS);

View File

@ -1,6 +1,6 @@
/*
DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-22 divingkatae and maximum
Copyright (C) 2018-23 divingkatae and maximum
(theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
@ -51,11 +51,11 @@ typedef struct {
class ScsiCdrom : public ScsiDevice {
public:
ScsiCdrom(int my_id);
ScsiCdrom(std::string name, int my_id);
~ScsiCdrom() = default;
static std::unique_ptr<HWComponent> create() {
return std::unique_ptr<ScsiCdrom>(new ScsiCdrom(3));
return std::unique_ptr<ScsiCdrom>(new ScsiCdrom("SCSI-CDROM", 3));
}
void insert_image(std::string filename);

View File

@ -36,15 +36,14 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
using namespace std;
ScsiHardDisk::ScsiHardDisk(int my_id) : ScsiDevice(my_id) {
supports_types(HWCompType::SCSI_DEV);
ScsiHardDisk::ScsiHardDisk(std::string, int my_id) : ScsiDevice(name, my_id) {
}
void ScsiHardDisk::insert_image(std::string filename) {
//We don't want to store everything in memory, but
//we want to keep the hard disk available.
if (!this->hdd_img.open(filename))
ABORT_F("SCSI-HD: could not open image file %s", filename.c_str());
ABORT_F("%s: could not open image file %s", this->name.c_str(), filename.c_str());
this->img_size = this->hdd_img.size();
this->total_blocks = (this->img_size + HDD_SECTOR_SIZE - 1) / HDD_SECTOR_SIZE;
@ -122,7 +121,7 @@ void ScsiHardDisk::process_command() {
read_buffer();
break;
default:
LOG_F(WARNING, "SCSI-HD: unrecognized command: %x", cmd[0]);
LOG_F(WARNING, "%s: unrecognized command: %x", this->name.c_str(), cmd[0]);
}
}
@ -149,7 +148,7 @@ bool ScsiHardDisk::prepare_data() {
this->data_size = 1;
break;
default:
LOG_F(WARNING, "SCSI-HD: unexpected phase in prepare_data");
LOG_F(WARNING, "%s: unexpected phase in prepare_data", this->name.c_str());
return false;
}
@ -163,7 +162,8 @@ int ScsiHardDisk::test_unit_ready() {
int ScsiHardDisk::req_sense(uint16_t alloc_len) {
if (alloc_len != 252) {
LOG_F(WARNING, "Inappropriate Allocation Length: %d", alloc_len);
LOG_F(WARNING, "%s: inappropriate Allocation Length: %d", this->name.c_str(),
alloc_len);
}
return ScsiError::NO_ERROR; // placeholder - no sense
}
@ -173,7 +173,7 @@ void ScsiHardDisk::inquiry() {
int alloc_len = cmd_buf[4];
if (page_num) {
ABORT_F("SCSI-HD: invalid page number in INQUIRY");
ABORT_F("%s: invalid page number in INQUIRY", this->name.c_str());
}
if (alloc_len >= 36) {
@ -194,7 +194,8 @@ void ScsiHardDisk::inquiry() {
this->switch_phase(ScsiPhase::DATA_IN);
}
else {
LOG_F(WARNING, "Allocation length too small: %d", alloc_len);
LOG_F(WARNING, "%s: allocation length too small: %d", this->name.c_str(),
alloc_len);
}
}
@ -265,7 +266,7 @@ void ScsiHardDisk::mode_sense_6() {
std::memcpy(&this->img_buffer[14], Apple_Copyright_Page_Data, 22);
break;
default:
ABORT_F("SCSI-HD: unsupported page %d in MODE_SENSE_6", page_code);
ABORT_F("%s: unsupported page %d in MODE_SENSE_6", this->name.c_str(), page_code);
};
// adjust for overall mode sense data length
@ -280,11 +281,11 @@ void ScsiHardDisk::read_capacity_10() {
uint32_t lba = READ_DWORD_BE_U(&this->cmd_buf[2]);
if (this->cmd_buf[1] & 1) {
ABORT_F("SCSI-HD: RelAdr bit set in READ_CAPACITY_10");
ABORT_F("%s: RelAdr bit set in READ_CAPACITY_10", this->name.c_str());
}
if (!(this->cmd_buf[8] & 1) && lba) {
LOG_F(ERROR, "SCSI-HD: non-zero LBA for PMI=0");
LOG_F(ERROR, "%s: non-zero LBA for PMI=0", this->name.c_str());
this->status = ScsiStatus::CHECK_CONDITION;
this->sense = ScsiSense::ILLEGAL_REQ;
this->switch_phase(ScsiPhase::STATUS);
@ -304,10 +305,10 @@ void ScsiHardDisk::read_capacity_10() {
void ScsiHardDisk::format() {
LOG_F(WARNING, "SCSI-HD: attempt to format the disk!");
LOG_F(WARNING, "%s: attempt to format the disk!", this->name.c_str());
if (this->cmd_buf[1] & 0x10)
ABORT_F("SCSI-HD: defect list isn't supported yet");
ABORT_F("%s: defect list isn't supported yet", this->name.c_str());
TimerManager::get_instance()->add_oneshot_timer(NS_PER_SEC, [this]() {
this->switch_phase(ScsiPhase::STATUS);
@ -368,7 +369,7 @@ void ScsiHardDisk::read_buffer() {
WRITE_DWORD_BE_A(&this->img_buffer[0], 0x10000); // report buffer size of 64K
break;
default:
ABORT_F("SCSI-HD: unsupported mode %d in READ_BUFFER", mode);
ABORT_F("%s: unsupported mode %d in READ_BUFFER", this->name.c_str(), mode);
}
this->bytes_out = alloc_len;

View File

@ -1,6 +1,6 @@
/*
DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-22 divingkatae and maximum
Copyright (C) 2018-23 divingkatae and maximum
(theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
@ -33,11 +33,11 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
class ScsiHardDisk : public ScsiDevice {
public:
ScsiHardDisk(int my_id);
ScsiHardDisk(std::string name, int my_id);
~ScsiHardDisk() = default;
static std::unique_ptr<HWComponent> create() {
return std::unique_ptr<ScsiHardDisk>(new ScsiHardDisk(0));
return std::unique_ptr<ScsiHardDisk>(new ScsiHardDisk("SCSI_HD", 0));
}
void insert_image(std::string filename);

View File

@ -67,10 +67,9 @@ public:
uint32_t report_capacity(uint8_t *data_ptr);
uint32_t read_toc(uint8_t *cmd_ptr, uint8_t *data_ptr);
AddrMsf lba_to_msf(const int lba);
protected:
std::function<void(uint8_t, uint8_t)> set_error;
AddrMsf lba_to_msf(const int lba);
TrackDescriptor tracks[CDROM_MAX_TRACKS];
int num_tracks;