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; using namespace ata_interface;
AtapiCdrom::AtapiCdrom(std::string name) : AtapiBaseDevice(name) { AtapiCdrom::AtapiCdrom(std::string name) : CdromDrive(), AtapiBaseDevice(name) {
this->set_error_callback( this->set_error_callback(
[this](uint8_t sense_key, uint8_t asc) { [this](uint8_t sense_key, uint8_t asc) {
this->status_error(sense_key, 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 <cinttypes>
#include <cstring> #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->chip_id = chip_id;
this->my_bus_id = my_id; this->my_bus_id = my_id;
@ -110,7 +110,7 @@ uint8_t Sc53C94::read(uint8_t reg_offset)
} }
break; break;
default: 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; return 0;
} }
@ -144,7 +144,7 @@ void Sc53C94::write(uint8_t reg_offset, uint8_t value)
break; break;
case Write::Reg53C94::Config_1: case Write::Reg53C94::Config_1:
if ((value & 7) != this->my_bus_id) { 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; this->config1 = value;
break; break;
@ -155,7 +155,8 @@ void Sc53C94::write(uint8_t reg_offset, uint8_t value)
this->config3 = value; this->config3 = value;
break; break;
default: 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) void Sc53C94::update_command_reg(uint8_t cmd)
{ {
if (this->on_reset && (cmd & 0x7F) != CMD_NOP) { 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; return;
} }
@ -228,7 +229,7 @@ void Sc53C94::update_command_reg(uint8_t cmd)
exec_command(); exec_command();
} }
} else { } 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 this->status |= STAT_GE; // signal IOE/Gross Error
} }
} }
@ -268,7 +269,7 @@ void Sc53C94::exec_command()
this->on_reset = true; // block the command register this->on_reset = true; // block the command register
return; return;
case CMD_RESET_BUS: 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 // assert RST line
this->bus_obj->assert_ctrl_line(this->my_bus_id, SCSI_CTRL_RST); this->bus_obj->assert_ctrl_line(this->my_bus_id, SCSI_CTRL_RST);
// release RST line after 25 us // 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); this->bus_obj->release_ctrl_line(this->my_bus_id, SCSI_CTRL_RST);
}); });
if (!(config1 & 0x40)) { 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; this->int_status |= INTSTAT_SRST;
} }
exec_next_command(); exec_next_command();
@ -303,7 +304,7 @@ void Sc53C94::exec_command()
{SeqState::CMD_COMPLETE, 0, INTSTAT_SR} {SeqState::CMD_COMPLETE, 0, INTSTAT_SR}
}; };
if (this->bus_obj->current_phase() != ScsiPhase::STATUS) { 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->seq_step = 0;
this->cmd_steps = complete_steps_desc; this->cmd_steps = complete_steps_desc;
@ -330,7 +331,7 @@ void Sc53C94::exec_command()
this->cmd_steps = sel_no_atn_desc; this->cmd_steps = sel_no_atn_desc;
this->cur_state = SeqState::BUS_FREE; this->cur_state = SeqState::BUS_FREE;
this->sequencer(); 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; break;
case CMD_SELECT_WITH_ATN: case CMD_SELECT_WITH_ATN:
static SeqDesc * sel_with_atn_desc = new SeqDesc[4]{ 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->cmd_steps = sel_with_atn_desc;
this->cur_state = SeqState::BUS_FREE; this->cur_state = SeqState::BUS_FREE;
this->sequencer(); 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; break;
case CMD_ENA_SEL_RESEL: case CMD_ENA_SEL_RESEL:
exec_next_command(); exec_next_command();
break; break;
default: 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->cmd_fifo_pos--; // remove invalid command from FIFO
this->int_status |= INTSTAT_ICMD; this->int_status |= INTSTAT_ICMD;
this->update_irq(); this->update_irq();
@ -373,7 +374,7 @@ void Sc53C94::fifo_push(const uint8_t data)
if (this->data_fifo_pos < DATA_FIFO_MAX) { if (this->data_fifo_pos < DATA_FIFO_MAX) {
this->data_fifo[this->data_fifo_pos++] = data; this->data_fifo[this->data_fifo_pos++] = data;
} else { } 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 this->status |= STAT_GE; // signal IOE/Gross Error
} }
} }
@ -383,7 +384,7 @@ uint8_t Sc53C94::fifo_pop()
uint8_t data = 0; uint8_t data = 0;
if (this->data_fifo_pos < 1) { 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 this->status |= STAT_GE; // signal IOE/Gross Error
} else { } else {
data = this->data_fifo[0]; data = this->data_fifo[0];
@ -421,7 +422,7 @@ void Sc53C94::sequencer()
break; break;
case SeqState::ARB_BEGIN: case SeqState::ARB_BEGIN:
if (!this->bus_obj->begin_arbitration(this->my_bus_id)) { 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->bus_obj->release_ctrl_lines(this->my_bus_id);
this->next_state = SeqState::BUS_FREE; this->next_state = SeqState::BUS_FREE;
this->seq_defer_state(BUS_CLEAR_DELAY); this->seq_defer_state(BUS_CLEAR_DELAY);
@ -435,7 +436,7 @@ void Sc53C94::sequencer()
this->next_state = this->cmd_steps->next_step; this->next_state = this->cmd_steps->next_step;
this->seq_defer_state(BUS_CLEAR_DELAY + BUS_SETTLE_DELAY); this->seq_defer_state(BUS_CLEAR_DELAY + BUS_SETTLE_DELAY);
} else { // arbitration lost } 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->bus_obj->release_ctrl_lines(this->my_bus_id);
this->next_state = SeqState::BUS_FREE; this->next_state = SeqState::BUS_FREE;
this->seq_defer_state(BUS_CLEAR_DELAY); this->seq_defer_state(BUS_CLEAR_DELAY);
@ -451,7 +452,7 @@ void Sc53C94::sequencer()
case SeqState::SEL_END: case SeqState::SEL_END:
if (this->bus_obj->end_selection(this->my_bus_id, this->target_id)) { 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); 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 } else { // selection timeout
this->seq_step = this->cmd_steps->step_num; this->seq_step = this->cmd_steps->step_num;
this->int_status |= this->cmd_steps->status; this->int_status |= this->cmd_steps->status;
@ -545,7 +546,7 @@ void Sc53C94::sequencer()
} }
break; break;
default: 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->cur_state = SeqState::SEL_END;
this->sequencer(); this->sequencer();
} else { } else {
LOG_F(WARNING, "SC53C94: ignore invalid selection confirmation message"); LOG_F(WARNING, "%s: ignore invalid selection confirmation message",
this->name.c_str());
} }
break; break;
case ScsiMsg::BUS_PHASE_CHANGE: case ScsiMsg::BUS_PHASE_CHANGE:
@ -581,7 +583,8 @@ void Sc53C94::notify(ScsiMsg msg_type, int param)
} }
break; break;
default: 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 { class ScsiDevice : public HWComponent {
public: 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->scsi_id = my_id;
this->cur_phase = ScsiPhase::BUS_FREE; this->cur_phase = ScsiPhase::BUS_FREE;
}; };

View File

@ -1,6 +1,6 @@
/* /*
DingusPPC - The Experimental PowerPC Macintosh emulator DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-22 divingkatae and maximum Copyright (C) 2018-23 divingkatae and maximum
(theweirdo) spatium (theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info) (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_product_id[] = "CD-ROM CDU-8003A";
static char cdu8003a_revision_id[] = "1.9a"; 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; this->sector_size = 2048;
@ -50,7 +50,7 @@ ScsiCdrom::ScsiCdrom(int my_id) : ScsiDevice(my_id)
void ScsiCdrom::insert_image(std::string filename) void ScsiCdrom::insert_image(std::string filename)
{ {
if (!this->cdr_img.open(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(); this->img_size = this->cdr_img.size();
@ -104,7 +104,7 @@ void ScsiCdrom::process_command()
lba = READ_DWORD_BE_U(&this->cmd_buf[2]); lba = READ_DWORD_BE_U(&this->cmd_buf[2]);
xfer_len = READ_WORD_BE_U(&this->cmd_buf[7]); xfer_len = READ_WORD_BE_U(&this->cmd_buf[7]);
if (this->cmd_buf[1] & 1) { 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); read(lba, xfer_len, 10);
break; break;
@ -112,7 +112,7 @@ void ScsiCdrom::process_command()
this->read_toc(); this->read_toc();
break; break;
default: 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: case ScsiPhase::STATUS:
break; break;
default: 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 false;
} }
return true; return true;
@ -163,11 +163,11 @@ void ScsiCdrom::inquiry()
int alloc_len = cmd_buf[4]; int alloc_len = cmd_buf[4];
if (page_num) { 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) { 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 this->data_buf[0] = 5; // device type: CD-ROM
@ -225,7 +225,7 @@ void ScsiCdrom::mode_sense()
this->data_buf[0] += 23; this->data_buf[0] += 23;
break; break;
default: 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]; this->bytes_out = this->data_buf[0];
@ -242,11 +242,11 @@ void ScsiCdrom::read_toc()
bool is_msf = !!(this->cmd_buf[1] & 2); bool is_msf = !!(this->cmd_buf[1] & 2);
if (this->cmd_buf[2] & 0xF) { 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) { 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; return;
} }
@ -260,7 +260,8 @@ void ScsiCdrom::read_toc()
} else if (start_track <= this->num_tracks) { } else if (start_track <= this->num_tracks) {
tot_tracks = (this->num_tracks - start_track) + 2; tot_tracks = (this->num_tracks - start_track) + 2;
} else { } 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->status = ScsiStatus::CHECK_CONDITION;
this->sense = ScsiSense::ILLEGAL_REQ; this->sense = ScsiSense::ILLEGAL_REQ;
this->switch_phase(ScsiPhase::STATUS); this->switch_phase(ScsiPhase::STATUS);
@ -313,11 +314,11 @@ void ScsiCdrom::read_capacity()
uint32_t lba = READ_DWORD_BE_U(&this->cmd_buf[2]); uint32_t lba = READ_DWORD_BE_U(&this->cmd_buf[2]);
if (this->cmd_buf[1] & 1) { 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) { 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->status = ScsiStatus::CHECK_CONDITION;
this->sense = ScsiSense::ILLEGAL_REQ; this->sense = ScsiSense::ILLEGAL_REQ;
this->switch_phase(ScsiPhase::STATUS); this->switch_phase(ScsiPhase::STATUS);

View File

@ -1,6 +1,6 @@
/* /*
DingusPPC - The Experimental PowerPC Macintosh emulator DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-22 divingkatae and maximum Copyright (C) 2018-23 divingkatae and maximum
(theweirdo) spatium (theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info) (Contact divingkatae#1017 or powermax#2286 on Discord for more info)
@ -51,11 +51,11 @@ typedef struct {
class ScsiCdrom : public ScsiDevice { class ScsiCdrom : public ScsiDevice {
public: public:
ScsiCdrom(int my_id); ScsiCdrom(std::string name, int my_id);
~ScsiCdrom() = default; ~ScsiCdrom() = default;
static std::unique_ptr<HWComponent> create() { 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); 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; using namespace std;
ScsiHardDisk::ScsiHardDisk(int my_id) : ScsiDevice(my_id) { ScsiHardDisk::ScsiHardDisk(std::string, int my_id) : ScsiDevice(name, my_id) {
supports_types(HWCompType::SCSI_DEV);
} }
void ScsiHardDisk::insert_image(std::string filename) { void ScsiHardDisk::insert_image(std::string filename) {
//We don't want to store everything in memory, but //We don't want to store everything in memory, but
//we want to keep the hard disk available. //we want to keep the hard disk available.
if (!this->hdd_img.open(filename)) 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->img_size = this->hdd_img.size();
this->total_blocks = (this->img_size + HDD_SECTOR_SIZE - 1) / HDD_SECTOR_SIZE; this->total_blocks = (this->img_size + HDD_SECTOR_SIZE - 1) / HDD_SECTOR_SIZE;
@ -122,7 +121,7 @@ void ScsiHardDisk::process_command() {
read_buffer(); read_buffer();
break; break;
default: 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; this->data_size = 1;
break; break;
default: 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; return false;
} }
@ -163,7 +162,8 @@ int ScsiHardDisk::test_unit_ready() {
int ScsiHardDisk::req_sense(uint16_t alloc_len) { int ScsiHardDisk::req_sense(uint16_t alloc_len) {
if (alloc_len != 252) { 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 return ScsiError::NO_ERROR; // placeholder - no sense
} }
@ -173,7 +173,7 @@ void ScsiHardDisk::inquiry() {
int alloc_len = cmd_buf[4]; int alloc_len = cmd_buf[4];
if (page_num) { 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) { if (alloc_len >= 36) {
@ -194,7 +194,8 @@ void ScsiHardDisk::inquiry() {
this->switch_phase(ScsiPhase::DATA_IN); this->switch_phase(ScsiPhase::DATA_IN);
} }
else { 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); std::memcpy(&this->img_buffer[14], Apple_Copyright_Page_Data, 22);
break; break;
default: 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 // 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]); uint32_t lba = READ_DWORD_BE_U(&this->cmd_buf[2]);
if (this->cmd_buf[1] & 1) { 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) { 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->status = ScsiStatus::CHECK_CONDITION;
this->sense = ScsiSense::ILLEGAL_REQ; this->sense = ScsiSense::ILLEGAL_REQ;
this->switch_phase(ScsiPhase::STATUS); this->switch_phase(ScsiPhase::STATUS);
@ -304,10 +305,10 @@ void ScsiHardDisk::read_capacity_10() {
void ScsiHardDisk::format() { 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) 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]() { TimerManager::get_instance()->add_oneshot_timer(NS_PER_SEC, [this]() {
this->switch_phase(ScsiPhase::STATUS); 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 WRITE_DWORD_BE_A(&this->img_buffer[0], 0x10000); // report buffer size of 64K
break; break;
default: 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; this->bytes_out = alloc_len;

View File

@ -1,6 +1,6 @@
/* /*
DingusPPC - The Experimental PowerPC Macintosh emulator DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-22 divingkatae and maximum Copyright (C) 2018-23 divingkatae and maximum
(theweirdo) spatium (theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info) (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 { class ScsiHardDisk : public ScsiDevice {
public: public:
ScsiHardDisk(int my_id); ScsiHardDisk(std::string name, int my_id);
~ScsiHardDisk() = default; ~ScsiHardDisk() = default;
static std::unique_ptr<HWComponent> create() { 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); void insert_image(std::string filename);

View File

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