RASCSI/src/raspberrypi/scsi.cpp

95 lines
2.3 KiB
C++
Raw Normal View History

2018-05-03 13:47:57 +00:00
//---------------------------------------------------------------------------
//
// X68000 EMULATOR "XM6"
//
// Copyright (C) 2001-2006 (ytanaka@ipc-tokai.or.jp)
// Copyright (C) 2014-2020 GIMONS
2018-05-03 13:47:57 +00:00
//
// [ SCSI Common Functionality ]
2018-05-03 13:47:57 +00:00
//
//---------------------------------------------------------------------------
#include "os.h"
#include "xm6.h"
#include "scsi.h"
//---------------------------------------------------------------------------
//
// Phase Acquisition
2018-05-03 13:47:57 +00:00
//
//---------------------------------------------------------------------------
BUS::phase_t BUS::GetPhase()
2018-05-03 13:47:57 +00:00
{
// Selection Phase
2018-05-03 13:47:57 +00:00
if (GetSEL()) {
return selection;
}
// Bus busy phase
2018-05-03 13:47:57 +00:00
if (!GetBSY()) {
return busfree;
}
// Get target phase from bus signal line
DWORD mci = GetMSG() ? 0x04 : 0x00;
2018-05-03 13:47:57 +00:00
mci |= GetCD() ? 0x02 : 0x00;
mci |= GetIO() ? 0x01 : 0x00;
return GetPhase(mci);
}
//---------------------------------------------------------------------------
//
// Determine Phase String phase enum
//
//---------------------------------------------------------------------------
const char* BUS::GetPhaseStrRaw(phase_t current_phase){
if(current_phase <= phase_t::reserved){
return phase_str_table[current_phase];
}
else
{
return "INVALID";
}
}
2018-05-03 13:47:57 +00:00
//---------------------------------------------------------------------------
//
// Phase Table
// Reference Table 8: https://www.staff.uni-mainz.de/tacke/scsi/SCSI2-06.html
// This determines the phase based upon the Msg, C/D and I/O signals.
2018-05-03 13:47:57 +00:00
//
//---------------------------------------------------------------------------
const BUS::phase_t BUS::phase_table[8] = {
// | MSG|C/D|I/O |
dataout, // | 0 | 0 | 0 |
datain, // | 0 | 0 | 1 |
command, // | 0 | 1 | 0 |
status, // | 0 | 1 | 1 |
reserved, // | 1 | 0 | 0 |
reserved, // | 1 | 0 | 1 |
msgout, // | 1 | 1 | 0 |
msgin // | 1 | 1 | 1 |
};
//---------------------------------------------------------------------------
//
// Phase Table
// This MUST be kept in sync with the phase_t enum type!
//
//---------------------------------------------------------------------------
const char* BUS::phase_str_table[] = {
"busfree",
"arbitration",
"selection",
"reselection",
"command",
"execute",
"datain",
"dataout",
"status",
"msgin",
"msgout",
"reserved"
2018-05-03 13:47:57 +00:00
};