mirror of
https://github.com/akuker/RASCSI.git
synced 2024-12-25 18:32:56 +00:00
Feature baremetal removal (#140)
* Removed all BAREMETAL ifdefs * Cleaned up subfolders * Fixed regression * Re-added underscores * Fixed merge conflicts * Assume RASCSI is always defined * Fixed mege issue * Re-added result message * Fix typo Co-authored-by: akuker <34318535+akuker@users.noreply.github.com>
This commit is contained in:
parent
0032ce5010
commit
3c5a0003a4
@ -31,19 +31,10 @@
|
|||||||
// Constructor
|
// Constructor
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#ifdef RASCSI
|
|
||||||
SASIDEV::SASIDEV()
|
SASIDEV::SASIDEV()
|
||||||
#else
|
|
||||||
SASIDEV::SASIDEV(Device *dev)
|
|
||||||
#endif // RASCSI
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
// Remember host device
|
|
||||||
host = dev;
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Work initialization
|
// Work initialization
|
||||||
ctrl.phase = BUS::busfree;
|
ctrl.phase = BUS::busfree;
|
||||||
ctrl.m_scsi_id = UNKNOWN_SCSI_ID;
|
ctrl.m_scsi_id = UNKNOWN_SCSI_ID;
|
||||||
@ -94,9 +85,7 @@ void FASTCALL SASIDEV::Reset()
|
|||||||
ctrl.phase = BUS::busfree;
|
ctrl.phase = BUS::busfree;
|
||||||
ctrl.status = 0x00;
|
ctrl.status = 0x00;
|
||||||
ctrl.message = 0x00;
|
ctrl.message = 0x00;
|
||||||
#ifdef RASCSI
|
|
||||||
ctrl.execstart = 0;
|
ctrl.execstart = 0;
|
||||||
#endif // RASCSI
|
|
||||||
memset(ctrl.buffer, 0x00, ctrl.bufsize);
|
memset(ctrl.buffer, 0x00, ctrl.bufsize);
|
||||||
ctrl.blocks = 0;
|
ctrl.blocks = 0;
|
||||||
ctrl.next = 0;
|
ctrl.next = 0;
|
||||||
@ -111,80 +100,6 @@ void FASTCALL SASIDEV::Reset()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Save
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL SASIDEV::Save(Fileio *fio, int /*ver*/)
|
|
||||||
{
|
|
||||||
ASSERT(fio);
|
|
||||||
|
|
||||||
// Save size
|
|
||||||
DWORD sz = 2120;
|
|
||||||
if (!fio->Write(&sz, sizeof(sz))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save entity
|
|
||||||
PROP_EXPORT(fio, ctrl.phase);
|
|
||||||
PROP_EXPORT(fio, ctrl.id);
|
|
||||||
PROP_EXPORT(fio, ctrl.cmd);
|
|
||||||
PROP_EXPORT(fio, ctrl.status);
|
|
||||||
PROP_EXPORT(fio, ctrl.message);
|
|
||||||
if (!fio->Write(ctrl.buffer, 0x800)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
PROP_EXPORT(fio, ctrl.blocks);
|
|
||||||
PROP_EXPORT(fio, ctrl.next);
|
|
||||||
PROP_EXPORT(fio, ctrl.offset);
|
|
||||||
PROP_EXPORT(fio, ctrl.length);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Load
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL SASIDEV::Load(Fileio *fio, int ver)
|
|
||||||
{
|
|
||||||
ASSERT(fio);
|
|
||||||
|
|
||||||
// Not saved before version 3.11
|
|
||||||
if (ver <= 0x0311) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load size and check if the size matches
|
|
||||||
DWORD sz;
|
|
||||||
if (!fio->Read(&sz, sizeof(sz))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (sz != 2120) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load the entity
|
|
||||||
PROP_IMPORT(fio, ctrl.phase);
|
|
||||||
PROP_IMPORT(fio, ctrl.id);
|
|
||||||
PROP_IMPORT(fio, ctrl.cmd);
|
|
||||||
PROP_IMPORT(fio, ctrl.status);
|
|
||||||
PROP_IMPORT(fio, ctrl.message);
|
|
||||||
if (!fio->Read(ctrl.buffer, 0x800)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
PROP_IMPORT(fio, ctrl.blocks);
|
|
||||||
PROP_IMPORT(fio, ctrl.next);
|
|
||||||
PROP_IMPORT(fio, ctrl.offset);
|
|
||||||
PROP_IMPORT(fio, ctrl.length);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Connect the controller
|
// Connect the controller
|
||||||
@ -411,14 +326,11 @@ void FASTCALL SASIDEV::Selection()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL SASIDEV::Command()
|
void FASTCALL SASIDEV::Command()
|
||||||
{
|
{
|
||||||
#ifdef RASCSI
|
|
||||||
int count;
|
int count;
|
||||||
int i;
|
int i;
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Phase change
|
// Phase change
|
||||||
if (ctrl.phase != BUS::command) {
|
if (ctrl.phase != BUS::command) {
|
||||||
|
|
||||||
LOGTRACE("%s Command Phase", __PRETTY_FUNCTION__);
|
LOGTRACE("%s Command Phase", __PRETTY_FUNCTION__);
|
||||||
|
|
||||||
// Phase Setting
|
// Phase Setting
|
||||||
@ -434,7 +346,6 @@ void FASTCALL SASIDEV::Command()
|
|||||||
ctrl.length = 6;
|
ctrl.length = 6;
|
||||||
ctrl.blocks = 1;
|
ctrl.blocks = 1;
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// Command reception handshake (10 bytes are automatically received at the first command)
|
// Command reception handshake (10 bytes are automatically received at the first command)
|
||||||
count = ctrl.bus->CommandHandShake(ctrl.buffer);
|
count = ctrl.bus->CommandHandShake(ctrl.buffer);
|
||||||
|
|
||||||
@ -473,26 +384,7 @@ void FASTCALL SASIDEV::Command()
|
|||||||
|
|
||||||
Error(ERROR_CODES::sense_key::ILLEGAL_REQUEST, ERROR_CODES::asc::INVALID_LUN);
|
Error(ERROR_CODES::sense_key::ILLEGAL_REQUEST, ERROR_CODES::asc::INVALID_LUN);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
// Request the command
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
return;
|
|
||||||
#endif // RASCSI
|
|
||||||
}
|
}
|
||||||
#ifndef RASCSI
|
|
||||||
// Requesting
|
|
||||||
if (ctrl.bus->GetREQ()) {
|
|
||||||
// Sent by the initiator
|
|
||||||
if (ctrl.bus->GetACK()) {
|
|
||||||
Receive();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Request the initator to
|
|
||||||
if (!ctrl.bus->GetACK()) {
|
|
||||||
ReceiveNext();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -510,9 +402,7 @@ void FASTCALL SASIDEV::Execute()
|
|||||||
// Initialization for data transfer
|
// Initialization for data transfer
|
||||||
ctrl.offset = 0;
|
ctrl.offset = 0;
|
||||||
ctrl.blocks = 1;
|
ctrl.blocks = 1;
|
||||||
#ifdef RASCSI
|
|
||||||
ctrl.execstart = SysTimer::GetTimerLow();
|
ctrl.execstart = SysTimer::GetTimerLow();
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Discard pending sense data from the previous command if the current command is not REQUEST SENSE
|
// Discard pending sense data from the previous command if the current command is not REQUEST SENSE
|
||||||
if ((SASIDEV::scsi_command)ctrl.cmd[0] != eCmdRequestSense) {
|
if ((SASIDEV::scsi_command)ctrl.cmd[0] != eCmdRequestSense) {
|
||||||
@ -603,15 +493,11 @@ void FASTCALL SASIDEV::Execute()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL SASIDEV::Status()
|
void FASTCALL SASIDEV::Status()
|
||||||
{
|
{
|
||||||
#ifdef RASCSI
|
|
||||||
DWORD min_exec_time;
|
DWORD min_exec_time;
|
||||||
DWORD time;
|
DWORD time;
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Phase change
|
// Phase change
|
||||||
if (ctrl.phase != BUS::status) {
|
if (ctrl.phase != BUS::status) {
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// Minimum execution time
|
// Minimum execution time
|
||||||
if (ctrl.execstart > 0) {
|
if (ctrl.execstart > 0) {
|
||||||
min_exec_time = IsSASI() ? min_exec_time_sasi : min_exec_time_scsi;
|
min_exec_time = IsSASI() ? min_exec_time_sasi : min_exec_time_scsi;
|
||||||
@ -623,7 +509,6 @@ void FASTCALL SASIDEV::Status()
|
|||||||
} else {
|
} else {
|
||||||
SysTimer::SleepUsec(5);
|
SysTimer::SleepUsec(5);
|
||||||
}
|
}
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Phase Setting
|
// Phase Setting
|
||||||
ctrl.phase = BUS::status;
|
ctrl.phase = BUS::status;
|
||||||
@ -639,34 +524,13 @@ void FASTCALL SASIDEV::Status()
|
|||||||
ctrl.blocks = 1;
|
ctrl.blocks = 1;
|
||||||
ctrl.buffer[0] = (BYTE)ctrl.status;
|
ctrl.buffer[0] = (BYTE)ctrl.status;
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
// Request status
|
|
||||||
ctrl.bus->SetDAT(ctrl.buffer[0]);
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
LOGTRACE( "%s Status Phase $%02X",__PRETTY_FUNCTION__, (unsigned int)ctrl.status);
|
LOGTRACE( "%s Status Phase $%02X",__PRETTY_FUNCTION__, (unsigned int)ctrl.status);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// Send
|
// Send
|
||||||
Send();
|
Send();
|
||||||
#else
|
|
||||||
// Requesting
|
|
||||||
if (ctrl.bus->GetREQ()) {
|
|
||||||
// Initiator received
|
|
||||||
if (ctrl.bus->GetACK()) {
|
|
||||||
SendNext();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Initiator requests next
|
|
||||||
if (!ctrl.bus->GetACK()) {
|
|
||||||
Send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -707,17 +571,13 @@ void FASTCALL SASIDEV::MsgIn()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL SASIDEV::DataIn()
|
void FASTCALL SASIDEV::DataIn()
|
||||||
{
|
{
|
||||||
#ifdef RASCSI
|
|
||||||
DWORD min_exec_time;
|
DWORD min_exec_time;
|
||||||
DWORD time;
|
DWORD time;
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
ASSERT(ctrl.length >= 0);
|
ASSERT(ctrl.length >= 0);
|
||||||
|
|
||||||
// Phase change
|
// Phase change
|
||||||
if (ctrl.phase != BUS::datain) {
|
if (ctrl.phase != BUS::datain) {
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// Minimum execution time
|
// Minimum execution time
|
||||||
if (ctrl.execstart > 0) {
|
if (ctrl.execstart > 0) {
|
||||||
min_exec_time = IsSASI() ? min_exec_time_sasi : min_exec_time_scsi;
|
min_exec_time = IsSASI() ? min_exec_time_sasi : min_exec_time_scsi;
|
||||||
@ -727,7 +587,6 @@ void FASTCALL SASIDEV::DataIn()
|
|||||||
}
|
}
|
||||||
ctrl.execstart = 0;
|
ctrl.execstart = 0;
|
||||||
}
|
}
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// If the length is 0, go to the status phase
|
// If the length is 0, go to the status phase
|
||||||
if (ctrl.length == 0) {
|
if (ctrl.length == 0) {
|
||||||
@ -763,17 +622,13 @@ void FASTCALL SASIDEV::DataIn()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL SASIDEV::DataOut()
|
void FASTCALL SASIDEV::DataOut()
|
||||||
{
|
{
|
||||||
#ifdef RASCSI
|
|
||||||
DWORD min_exec_time;
|
DWORD min_exec_time;
|
||||||
DWORD time;
|
DWORD time;
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
ASSERT(ctrl.length >= 0);
|
ASSERT(ctrl.length >= 0);
|
||||||
|
|
||||||
// Phase change
|
// Phase change
|
||||||
if (ctrl.phase != BUS::dataout) {
|
if (ctrl.phase != BUS::dataout) {
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// Minimum execution time
|
// Minimum execution time
|
||||||
if (ctrl.execstart > 0) {
|
if (ctrl.execstart > 0) {
|
||||||
min_exec_time = IsSASI() ? min_exec_time_sasi : min_exec_time_scsi;
|
min_exec_time = IsSASI() ? min_exec_time_sasi : min_exec_time_scsi;
|
||||||
@ -783,7 +638,6 @@ void FASTCALL SASIDEV::DataOut()
|
|||||||
}
|
}
|
||||||
ctrl.execstart = 0;
|
ctrl.execstart = 0;
|
||||||
}
|
}
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// If the length is 0, go to the status phase
|
// If the length is 0, go to the status phase
|
||||||
if (ctrl.length == 0) {
|
if (ctrl.length == 0) {
|
||||||
@ -805,31 +659,11 @@ void FASTCALL SASIDEV::DataOut()
|
|||||||
ASSERT(ctrl.length > 0);
|
ASSERT(ctrl.length > 0);
|
||||||
ASSERT(ctrl.blocks > 0);
|
ASSERT(ctrl.blocks > 0);
|
||||||
ctrl.offset = 0;
|
ctrl.offset = 0;
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
// Request data
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
#endif // RASCSI
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// Receive
|
// Receive
|
||||||
Receive();
|
Receive();
|
||||||
#else
|
|
||||||
// Requesting
|
|
||||||
if (ctrl.bus->GetREQ()) {
|
|
||||||
// Sent by the initiator
|
|
||||||
if (ctrl.bus->GetACK()) {
|
|
||||||
Receive();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Request the initator to
|
|
||||||
if (!ctrl.bus->GetACK()) {
|
|
||||||
ReceiveNext();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -1292,9 +1126,7 @@ void FASTCALL SASIDEV::CmdInvalid()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL SASIDEV::Send()
|
void FASTCALL SASIDEV::Send()
|
||||||
{
|
{
|
||||||
#ifdef RASCSI
|
|
||||||
int len;
|
int len;
|
||||||
#endif // RASCSI
|
|
||||||
BOOL result;
|
BOOL result;
|
||||||
|
|
||||||
ASSERT(!ctrl.bus->GetREQ());
|
ASSERT(!ctrl.bus->GetREQ());
|
||||||
@ -1332,9 +1164,6 @@ void FASTCALL SASIDEV::Send()
|
|||||||
result = XferIn(ctrl.buffer);
|
result = XferIn(ctrl.buffer);
|
||||||
LOGTRACE("%s xfer in: %d",__PRETTY_FUNCTION__, result);
|
LOGTRACE("%s xfer in: %d",__PRETTY_FUNCTION__, result);
|
||||||
LOGTRACE("%s processing after data collection", __PRETTY_FUNCTION__);
|
LOGTRACE("%s processing after data collection", __PRETTY_FUNCTION__);
|
||||||
#ifndef RASCSI
|
|
||||||
ctrl.bus->SetDAT(ctrl.buffer[ctrl.offset]);
|
|
||||||
#endif // RASCSI
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1349,10 +1178,6 @@ void FASTCALL SASIDEV::Send()
|
|||||||
if (ctrl.blocks != 0){
|
if (ctrl.blocks != 0){
|
||||||
ASSERT(ctrl.length > 0);
|
ASSERT(ctrl.length > 0);
|
||||||
ASSERT(ctrl.offset == 0);
|
ASSERT(ctrl.offset == 0);
|
||||||
#ifndef RASCSI
|
|
||||||
// Signal line operated by the target
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
#endif // RASCSI
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1386,29 +1211,6 @@ void FASTCALL SASIDEV::Send()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Continue sending data
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void FASTCALL SASIDEV::SendNext()
|
|
||||||
{
|
|
||||||
// Req is up
|
|
||||||
ASSERT(ctrl.bus->GetREQ());
|
|
||||||
ASSERT(ctrl.bus->GetIO());
|
|
||||||
|
|
||||||
// Signal line operated by the target
|
|
||||||
ctrl.bus->SetREQ(FALSE);
|
|
||||||
|
|
||||||
// If there is data in the buffer, set it first.
|
|
||||||
if (ctrl.length > 1) {
|
|
||||||
ctrl.bus->SetDAT(ctrl.buffer[ctrl.offset + 1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Receive data
|
// Receive data
|
||||||
@ -1416,70 +1218,13 @@ void FASTCALL SASIDEV::SendNext()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL SASIDEV::Receive()
|
void FASTCALL SASIDEV::Receive()
|
||||||
{
|
{
|
||||||
// Req is up
|
|
||||||
ASSERT(ctrl.bus->GetREQ());
|
|
||||||
ASSERT(!ctrl.bus->GetIO());
|
|
||||||
|
|
||||||
// Get data
|
|
||||||
DWORD data = (DWORD)ctrl.bus->GetDAT();
|
|
||||||
|
|
||||||
// Signal line operated by the target
|
|
||||||
ctrl.bus->SetREQ(FALSE);
|
|
||||||
|
|
||||||
switch (ctrl.phase) {
|
|
||||||
// Command phase
|
|
||||||
case BUS::command:
|
|
||||||
ctrl.cmd[ctrl.offset] = data;
|
|
||||||
LOGTRACE( "%s Command phase $%02X", __PRETTY_FUNCTION__, data);
|
|
||||||
|
|
||||||
// Set the length again with the first data (offset 0)
|
|
||||||
if (ctrl.offset == 0) {
|
|
||||||
if (ctrl.cmd[0] >= 0x20 && ctrl.cmd[0] <= 0x7D) {
|
|
||||||
// 10 byte CDB
|
|
||||||
ctrl.length = 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Data out phase
|
|
||||||
case BUS::dataout:
|
|
||||||
ctrl.buffer[ctrl.offset] = (BYTE)data;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Other (impossible)
|
|
||||||
default:
|
|
||||||
ASSERT(FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Receive data
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void FASTCALL SASIDEV::Receive()
|
|
||||||
#else
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Continue receiving data
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void FASTCALL SASIDEV::ReceiveNext()
|
|
||||||
#endif // RASCSI
|
|
||||||
{
|
|
||||||
#ifdef RASCSI
|
|
||||||
int len;
|
int len;
|
||||||
#endif // RASCSI
|
|
||||||
BOOL result;
|
BOOL result;
|
||||||
|
|
||||||
// REQ is low
|
// REQ is low
|
||||||
ASSERT(!ctrl.bus->GetREQ());
|
ASSERT(!ctrl.bus->GetREQ());
|
||||||
ASSERT(!ctrl.bus->GetIO());
|
ASSERT(!ctrl.bus->GetIO());
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// Length != 0 if received
|
// Length != 0 if received
|
||||||
if (ctrl.length != 0) {
|
if (ctrl.length != 0) {
|
||||||
// Receive
|
// Receive
|
||||||
@ -1502,19 +1247,6 @@ void FASTCALL SASIDEV::ReceiveNext()
|
|||||||
{
|
{
|
||||||
LOGDEBUG("%s ctrl.length was 0", __PRETTY_FUNCTION__);
|
LOGDEBUG("%s ctrl.length was 0", __PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
// Offset and Length
|
|
||||||
ASSERT(ctrl.length >= 1);
|
|
||||||
ctrl.offset++;
|
|
||||||
ctrl.length--;
|
|
||||||
|
|
||||||
// If length != 0, set req again
|
|
||||||
if (ctrl.length != 0) {
|
|
||||||
// Signal line operated by the target
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Remove the control block and initialize the result
|
// Remove the control block and initialize the result
|
||||||
ctrl.blocks--;
|
ctrl.blocks--;
|
||||||
@ -1541,30 +1273,11 @@ void FASTCALL SASIDEV::ReceiveNext()
|
|||||||
if (ctrl.blocks != 0){
|
if (ctrl.blocks != 0){
|
||||||
ASSERT(ctrl.length > 0);
|
ASSERT(ctrl.length > 0);
|
||||||
ASSERT(ctrl.offset == 0);
|
ASSERT(ctrl.offset == 0);
|
||||||
#ifndef RASCSI
|
|
||||||
// Signal line operated by the target
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
#endif // RASCSI
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move to the next phase
|
// Move to the next phase
|
||||||
switch (ctrl.phase) {
|
switch (ctrl.phase) {
|
||||||
#ifndef RASCSI
|
|
||||||
// Command phase
|
|
||||||
case BUS::command:
|
|
||||||
// Execution Phase
|
|
||||||
try {
|
|
||||||
Execute();
|
|
||||||
}
|
|
||||||
catch (const lunexception& e) {
|
|
||||||
LOGINFO("%s unsupported LUN %d", __PRETTY_FUNCTION__, (int)e.getlun());
|
|
||||||
// LOGICAL UNIT NOT SUPPORTED
|
|
||||||
Error(SENSE_KEY_ILLEGAL_REQUEST, ASC_INVALID_LUN);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Data out phase
|
// Data out phase
|
||||||
case BUS::dataout:
|
case BUS::dataout:
|
||||||
LOGTRACE("%s transitioning to FlushUnit()",__PRETTY_FUNCTION__);
|
LOGTRACE("%s transitioning to FlushUnit()",__PRETTY_FUNCTION__);
|
||||||
|
@ -106,13 +106,11 @@ public:
|
|||||||
const int DEFAULT_BUFFER_SIZE = 0x800;
|
const int DEFAULT_BUFFER_SIZE = 0x800;
|
||||||
const int DAYNAPORT_BUFFER_SIZE = 0x1000000;
|
const int DAYNAPORT_BUFFER_SIZE = 0x1000000;
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// For timing adjustments
|
// For timing adjustments
|
||||||
enum {
|
enum {
|
||||||
min_exec_time_sasi = 100, // SASI BOOT/FORMAT 30:NG 35:OK
|
min_exec_time_sasi = 100, // SASI BOOT/FORMAT 30:NG 35:OK
|
||||||
min_exec_time_scsi = 50
|
min_exec_time_scsi = 50
|
||||||
};
|
};
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Internal data definition
|
// Internal data definition
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -126,10 +124,8 @@ public:
|
|||||||
DWORD status; // Status data
|
DWORD status; // Status data
|
||||||
DWORD message; // Message data
|
DWORD message; // Message data
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
// Run
|
// Run
|
||||||
DWORD execstart; // Execution start time
|
DWORD execstart; // Execution start time
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Transfer
|
// Transfer
|
||||||
BYTE *buffer; // Transfer data buffer
|
BYTE *buffer; // Transfer data buffer
|
||||||
@ -149,21 +145,10 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Basic Functions
|
// Basic Functions
|
||||||
#ifdef RASCSI
|
|
||||||
SASIDEV();
|
SASIDEV();
|
||||||
#else
|
|
||||||
|
|
||||||
SASIDEV(Device *dev); // Constructor
|
|
||||||
|
|
||||||
#endif //RASCSI
|
|
||||||
virtual ~SASIDEV(); // Destructor
|
virtual ~SASIDEV(); // Destructor
|
||||||
virtual void FASTCALL Reset(); // Device Reset
|
virtual void FASTCALL Reset(); // Device Reset
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
virtual BOOL FASTCALL Save(Fileio *fio, int ver); // Save
|
|
||||||
virtual BOOL FASTCALL Load(Fileio *fio, int ver); // Load
|
|
||||||
#endif //RASCSI
|
|
||||||
|
|
||||||
// External API
|
// External API
|
||||||
virtual BUS::phase_t FASTCALL Process(); // Run
|
virtual BUS::phase_t FASTCALL Process(); // Run
|
||||||
|
|
||||||
@ -219,16 +204,8 @@ protected:
|
|||||||
// データ転送
|
// データ転送
|
||||||
virtual void FASTCALL Send(); // Send data
|
virtual void FASTCALL Send(); // Send data
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
virtual void FASTCALL SendNext(); // Continue sending data
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
virtual void FASTCALL Receive(); // Receive data
|
virtual void FASTCALL Receive(); // Receive data
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
virtual void FASTCALL ReceiveNext(); // Continue receiving data
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
BOOL FASTCALL XferIn(BYTE* buf); // Data transfer IN
|
BOOL FASTCALL XferIn(BYTE* buf); // Data transfer IN
|
||||||
BOOL FASTCALL XferOut(BOOL cont); // Data transfer OUT
|
BOOL FASTCALL XferOut(BOOL cont); // Data transfer OUT
|
||||||
|
|
||||||
@ -238,8 +215,5 @@ protected:
|
|||||||
DWORD FASTCALL GetLun(); // Get the validated LUN
|
DWORD FASTCALL GetLun(); // Get the validated LUN
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
#ifndef RASCSI
|
|
||||||
Device *host; // Host device
|
|
||||||
#endif // RASCSI
|
|
||||||
ctrl_t ctrl; // Internal data
|
ctrl_t ctrl; // Internal data
|
||||||
};
|
};
|
||||||
|
@ -31,11 +31,7 @@
|
|||||||
// Constructor
|
// Constructor
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#ifdef RASCSI
|
|
||||||
SCSIDEV::SCSIDEV() : SASIDEV()
|
SCSIDEV::SCSIDEV() : SASIDEV()
|
||||||
#else
|
|
||||||
SCSIDEV::SCSIDEV(Device *dev) : SASIDEV(dev)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
// Synchronous transfer work initialization
|
// Synchronous transfer work initialization
|
||||||
scsi.syncenable = FALSE;
|
scsi.syncenable = FALSE;
|
||||||
@ -292,9 +288,7 @@ void FASTCALL SCSIDEV::Execute()
|
|||||||
// Initialization for data transfer
|
// Initialization for data transfer
|
||||||
ctrl.offset = 0;
|
ctrl.offset = 0;
|
||||||
ctrl.blocks = 1;
|
ctrl.blocks = 1;
|
||||||
#ifdef RASCSI
|
|
||||||
ctrl.execstart = SysTimer::GetTimerLow();
|
ctrl.execstart = SysTimer::GetTimerLow();
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// If the command is valid it must be contained in the command map
|
// If the command is valid it must be contained in the command map
|
||||||
if (!scsi_commands.count(static_cast<scsi_command>(ctrl.cmd[0]))) {
|
if (!scsi_commands.count(static_cast<scsi_command>(ctrl.cmd[0]))) {
|
||||||
@ -351,10 +345,6 @@ void FASTCALL SCSIDEV::MsgOut()
|
|||||||
ctrl.length = 1;
|
ctrl.length = 1;
|
||||||
ctrl.blocks = 1;
|
ctrl.blocks = 1;
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
// Request message
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
#endif // RASCSI
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1277,15 +1267,12 @@ void FASTCALL SCSIDEV::CmdEnableInterface()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL SCSIDEV::Send()
|
void FASTCALL SCSIDEV::Send()
|
||||||
{
|
{
|
||||||
#ifdef RASCSI
|
|
||||||
int len;
|
int len;
|
||||||
#endif // RASCSI
|
|
||||||
BOOL result;
|
BOOL result;
|
||||||
|
|
||||||
ASSERT(!ctrl.bus->GetREQ());
|
ASSERT(!ctrl.bus->GetREQ());
|
||||||
ASSERT(ctrl.bus->GetIO());
|
ASSERT(ctrl.bus->GetIO());
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
//if Length! = 0, send
|
//if Length! = 0, send
|
||||||
if (ctrl.length != 0) {
|
if (ctrl.length != 0) {
|
||||||
LOGTRACE("%s sending handhake with offset %lu, length %lu", __PRETTY_FUNCTION__, ctrl.offset, ctrl.length);
|
LOGTRACE("%s sending handhake with offset %lu, length %lu", __PRETTY_FUNCTION__, ctrl.offset, ctrl.length);
|
||||||
@ -1314,20 +1301,6 @@ void FASTCALL SCSIDEV::Send()
|
|||||||
ctrl.length = 0;
|
ctrl.length = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
// offset and length
|
|
||||||
ASSERT(ctrl.length >= 1);
|
|
||||||
ctrl.offset++;
|
|
||||||
ctrl.length--;
|
|
||||||
|
|
||||||
// Immediately after ACK is asserted, if the data has been
|
|
||||||
// set by SendNext, raise the request
|
|
||||||
if (ctrl.length != 0) {
|
|
||||||
// Signal line operated by the target
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// Block subtraction, result initialization
|
// Block subtraction, result initialization
|
||||||
ctrl.blocks--;
|
ctrl.blocks--;
|
||||||
@ -1339,9 +1312,6 @@ void FASTCALL SCSIDEV::Send()
|
|||||||
// set next buffer (set offset, length)
|
// set next buffer (set offset, length)
|
||||||
result = XferIn(ctrl.buffer);
|
result = XferIn(ctrl.buffer);
|
||||||
LOGTRACE("%s processing after data collection. Blocks: %lu", __PRETTY_FUNCTION__, ctrl.blocks);
|
LOGTRACE("%s processing after data collection. Blocks: %lu", __PRETTY_FUNCTION__, ctrl.blocks);
|
||||||
#ifndef RASCSI
|
|
||||||
ctrl.bus->SetDAT(ctrl.buffer[ctrl.offset]);
|
|
||||||
#endif // RASCSI
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1356,10 +1326,6 @@ void FASTCALL SCSIDEV::Send()
|
|||||||
LOGTRACE("%s Continuing to send. blocks = %lu", __PRETTY_FUNCTION__, ctrl.blocks);
|
LOGTRACE("%s Continuing to send. blocks = %lu", __PRETTY_FUNCTION__, ctrl.blocks);
|
||||||
ASSERT(ctrl.length > 0);
|
ASSERT(ctrl.length > 0);
|
||||||
ASSERT(ctrl.offset == 0);
|
ASSERT(ctrl.offset == 0);
|
||||||
#ifndef RASCSI
|
|
||||||
// Signal line operated by the target
|
|
||||||
ctrl.bus->SetREQ(TRUE);
|
|
||||||
#endif // RASCSI
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1403,28 +1369,6 @@ void FASTCALL SCSIDEV::Send()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Continue data transmission.....
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void FASTCALL SCSIDEV::SendNext()
|
|
||||||
{
|
|
||||||
// REQ is up
|
|
||||||
ASSERT(ctrl.bus->GetREQ());
|
|
||||||
ASSERT(ctrl.bus->GetIO());
|
|
||||||
|
|
||||||
// Signal line operated by the target
|
|
||||||
ctrl.bus->SetREQ(FALSE);
|
|
||||||
|
|
||||||
// If there is data in the buffer, set it first
|
|
||||||
if (ctrl.length > 1) {
|
|
||||||
ctrl.bus->SetDAT(ctrl.buffer[ctrl.offset + 1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Receive Data
|
// Receive Data
|
||||||
|
@ -109,13 +109,7 @@ private:
|
|||||||
void FASTCALL CmdEnableInterface(); // DaynaPort specific command
|
void FASTCALL CmdEnableInterface(); // DaynaPort specific command
|
||||||
// データ転送
|
// データ転送
|
||||||
void FASTCALL Send(); // Send data
|
void FASTCALL Send(); // Send data
|
||||||
#ifndef RASCSI
|
|
||||||
void FASTCALL SendNext(); // Continue sending data
|
|
||||||
#endif // RASCSI
|
|
||||||
void FASTCALL Receive(); // Receive data
|
void FASTCALL Receive(); // Receive data
|
||||||
#ifndef RASCSI
|
|
||||||
void FASTCALL ReceiveNext(); // Continue receiving data
|
|
||||||
#endif // RASCSI
|
|
||||||
BOOL FASTCALL XferMsg(DWORD msg); // Data transfer message
|
BOOL FASTCALL XferMsg(DWORD msg); // Data transfer message
|
||||||
|
|
||||||
scsi_t scsi; // Internal data
|
scsi_t scsi; // Internal data
|
||||||
|
@ -24,36 +24,6 @@
|
|||||||
#include "filepath.h"
|
#include "filepath.h"
|
||||||
#include "cfilesystem.h"
|
#include "cfilesystem.h"
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// FatFs用タイムスタンプ
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
#define FF_NORTC_HOUR 6
|
|
||||||
#define FF_NORTC_MINUTE 8
|
|
||||||
#define FF_NORTC_SECOND 0
|
|
||||||
|
|
||||||
static DWORD fattime = (
|
|
||||||
(DWORD)(FF_NORTC_YEAR - 1980) << 25 |
|
|
||||||
(DWORD)FF_NORTC_MON << 21 |
|
|
||||||
(DWORD)FF_NORTC_MDAY << 16 |
|
|
||||||
(DWORD)(FF_NORTC_HOUR << 11) |
|
|
||||||
(DWORD)(FF_NORTC_MINUTE << 5) |
|
|
||||||
(DWORD)(FF_NORTC_SECOND)
|
|
||||||
);
|
|
||||||
|
|
||||||
DWORD get_fattime(void)
|
|
||||||
{
|
|
||||||
return fattime;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_fattime(DWORD n)
|
|
||||||
{
|
|
||||||
fattime = n;
|
|
||||||
}
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// 漢字コード変換
|
// 漢字コード変換
|
||||||
@ -61,7 +31,6 @@ void set_fattime(DWORD n)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#define IC_BUF_SIZE 1024
|
#define IC_BUF_SIZE 1024
|
||||||
static char convert_buf[IC_BUF_SIZE];
|
static char convert_buf[IC_BUF_SIZE];
|
||||||
#ifndef BAREMETAL
|
|
||||||
#ifndef __NetBSD__
|
#ifndef __NetBSD__
|
||||||
// POSIX.1準拠iconv(3)を使用
|
// POSIX.1準拠iconv(3)を使用
|
||||||
#define CONVERT(src, dest, inbuf, outbuf, outsize) \
|
#define CONVERT(src, dest, inbuf, outbuf, outsize) \
|
||||||
@ -100,18 +69,6 @@ static void convert(char const *src, char const *dest,
|
|||||||
*outbuf = '\0';
|
*outbuf = '\0';
|
||||||
#endif //ifndef __macintosh__
|
#endif //ifndef __macintosh__
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
// Newlibの中にiconvが含まれてなかったので無変換
|
|
||||||
// ベアメタルのFatFS上はSJISでもOKだと思うよ
|
|
||||||
#define CONVERT(src, dest, inbuf, outbuf, outsize) \
|
|
||||||
convert(src, dest, (char *)inbuf, outbuf, outsize)
|
|
||||||
static void convert(char const *src, char const *dest,
|
|
||||||
char *inbuf, char *outbuf, size_t outsize)
|
|
||||||
{
|
|
||||||
strcpy(outbuf, inbuf);
|
|
||||||
strcpy(convert_buf, inbuf);
|
|
||||||
}
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
@ -463,16 +420,12 @@ void CHostDrv::GetVolume(TCHAR* szLabel)
|
|||||||
ASSERT(m_bEnable);
|
ASSERT(m_bEnable);
|
||||||
|
|
||||||
// ボリュームラベルの取得
|
// ボリュームラベルの取得
|
||||||
#ifdef RASCSI
|
|
||||||
strcpy(m_szVolumeCache, "RASDRV ");
|
strcpy(m_szVolumeCache, "RASDRV ");
|
||||||
if (m_szBase[0]) {
|
if (m_szBase[0]) {
|
||||||
strcat(m_szVolumeCache, m_szBase);
|
strcat(m_szVolumeCache, m_szBase);
|
||||||
} else {
|
} else {
|
||||||
strcat(m_szVolumeCache, "/");
|
strcat(m_szVolumeCache, "/");
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
m_szVolumeCache[0] = _T('\0');
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// キャッシュ更新
|
// キャッシュ更新
|
||||||
m_bVolumeCache = TRUE;
|
m_bVolumeCache = TRUE;
|
||||||
@ -1624,141 +1577,6 @@ BOOL CHostPath::isRefresh()
|
|||||||
return m_bRefresh;
|
return m_bRefresh;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
/// scandirエミュレーション
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
struct dirent {
|
|
||||||
char d_name[_MAX_FNAME];
|
|
||||||
};
|
|
||||||
|
|
||||||
int scandir(const char *dirname,
|
|
||||||
dirent ***ret_namelist,
|
|
||||||
int(*select)(const dirent *),
|
|
||||||
int(*compar)(const dirent **, const dirent **))
|
|
||||||
{
|
|
||||||
FRESULT fr;
|
|
||||||
DIR dir;
|
|
||||||
FILINFO fno;
|
|
||||||
char dirpath[256];
|
|
||||||
int len;
|
|
||||||
dirent went;
|
|
||||||
int used;
|
|
||||||
int allocated;
|
|
||||||
dirent **namelist = NULL;
|
|
||||||
int i;
|
|
||||||
dirent *ent;
|
|
||||||
|
|
||||||
// NULLチェック
|
|
||||||
strcpy(dirpath, dirname);
|
|
||||||
if (dirpath[0] == '\0') {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// '/'はOKだがそれ以外で最後が'/'だとディレクトリと認識されない)
|
|
||||||
if (dirpath[0] != '/' || dirpath[1] != '\0') {
|
|
||||||
len = strlen(dirpath);
|
|
||||||
if (dirpath[len - 1] == '/') {
|
|
||||||
dirpath[len - 1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ディレクトリオープン
|
|
||||||
fr = f_opendir(&dir, dirpath);
|
|
||||||
if (fr != FR_OK) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// リストを初期値で確保(とりあえず32)
|
|
||||||
used = 0;
|
|
||||||
allocated = 32;
|
|
||||||
namelist = (dirent **)malloc(allocated * sizeof(dirent *));
|
|
||||||
if (!namelist) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 配下のファイルまたはディレクトリを処理
|
|
||||||
i = 0;
|
|
||||||
while (TRUE) {
|
|
||||||
if (i == 0) {
|
|
||||||
// "."をFILINFOに見せかけて追加
|
|
||||||
strcpy(fno.fname, ".");
|
|
||||||
i++;
|
|
||||||
} else if (i == 1) {
|
|
||||||
// ".."をFILINFOに見せかけて追加
|
|
||||||
strcpy(fno.fname, "..");
|
|
||||||
i++;
|
|
||||||
} else if (f_readdir(&dir, &fno) != FR_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// このケースがあるか不明
|
|
||||||
if (fno.fname[0] == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// direntに見せかける
|
|
||||||
strcpy(went.d_name, fno.fname);
|
|
||||||
|
|
||||||
// 対象外のフィルタ処理
|
|
||||||
if (select != NULL && !select(&went)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ファイル名の長さに調整したdirentの領域を確保
|
|
||||||
len = offsetof(dirent, d_name) + strlen(fno.fname) + 1;
|
|
||||||
if ((ent = (dirent *)malloc(len)) == NULL) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ワーク用direntから返却用にコピー
|
|
||||||
memcpy(ent, &went, len);
|
|
||||||
|
|
||||||
// 使用量が越えそうならリストを再確保
|
|
||||||
if (used >= allocated) {
|
|
||||||
allocated *= 2;
|
|
||||||
namelist = (dirent **)realloc(namelist, allocated * sizeof(dirent *));
|
|
||||||
if (!namelist) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// リストに追加
|
|
||||||
namelist[used++] = ent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ディレクトリクローズ
|
|
||||||
f_closedir(&dir);
|
|
||||||
|
|
||||||
// ソート処理
|
|
||||||
if (compar) {
|
|
||||||
qsort(
|
|
||||||
namelist, used, sizeof(dirent *),
|
|
||||||
(int(*)(const void *, const void *)) compar);
|
|
||||||
}
|
|
||||||
|
|
||||||
// リストとエントリ数を返却
|
|
||||||
*ret_namelist = namelist;
|
|
||||||
return used;
|
|
||||||
|
|
||||||
error:
|
|
||||||
// ディレクトリクローズ
|
|
||||||
f_closedir(&dir);
|
|
||||||
|
|
||||||
// 途中まで確保したバッファをクローズ
|
|
||||||
if (namelist) {
|
|
||||||
while (used > 0) {
|
|
||||||
free(namelist[used - 1]);
|
|
||||||
used--;
|
|
||||||
}
|
|
||||||
free(namelist);
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/// ASCIIソート関数
|
/// ASCIIソート関数
|
||||||
@ -1859,12 +1677,8 @@ void CHostPath::Refresh()
|
|||||||
// 一致するものがなければ、実ファイルが存在するか確認
|
// 一致するものがなければ、実ファイルが存在するか確認
|
||||||
strcpy(szPath, m_szHost);
|
strcpy(szPath, m_szHost);
|
||||||
strcat(szPath, (const char*)pFilename->GetHuman()); /// @warning Unicode時要修正 → 済
|
strcat(szPath, (const char*)pFilename->GetHuman()); /// @warning Unicode時要修正 → 済
|
||||||
#ifndef BAREMETAL
|
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
if (stat(S2U(szPath), &sb))
|
if (stat(S2U(szPath), &sb))
|
||||||
#else
|
|
||||||
if (f_stat(S2U(szPath), NULL) != FR_OK)
|
|
||||||
#endif // BAREMETAL
|
|
||||||
break; // 利用可能パターンを発見
|
break; // 利用可能パターンを発見
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1880,7 +1694,6 @@ void CHostPath::Refresh()
|
|||||||
strcpy(szPath, m_szHost);
|
strcpy(szPath, m_szHost);
|
||||||
strcat(szPath, U2S(pe->d_name));
|
strcat(szPath, U2S(pe->d_name));
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
if (stat(S2U(szPath), &sb))
|
if (stat(S2U(szPath), &sb))
|
||||||
continue;
|
continue;
|
||||||
@ -1907,27 +1720,6 @@ void CHostPath::Refresh()
|
|||||||
}
|
}
|
||||||
pFilename->SetEntryDate(nHumanDate);
|
pFilename->SetEntryDate(nHumanDate);
|
||||||
pFilename->SetEntryTime(nHumanTime);
|
pFilename->SetEntryTime(nHumanTime);
|
||||||
#else
|
|
||||||
FILINFO fno;
|
|
||||||
if (f_stat(S2U(szPath), &fno) != FR_OK)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// 属性
|
|
||||||
BYTE nHumanAttribute = Human68k::AT_ARCHIVE;
|
|
||||||
if (fno.fattrib & AM_DIR)
|
|
||||||
nHumanAttribute = Human68k::AT_DIRECTORY;
|
|
||||||
if (fno.fattrib & AM_RDO)
|
|
||||||
nHumanAttribute |= Human68k::AT_READONLY;
|
|
||||||
pFilename->SetEntryAttribute(nHumanAttribute);
|
|
||||||
|
|
||||||
// サイズ
|
|
||||||
DWORD nHumanSize = (DWORD)fno.fsize;
|
|
||||||
pFilename->SetEntrySize(nHumanSize);
|
|
||||||
|
|
||||||
// 日付時刻
|
|
||||||
pFilename->SetEntryDate(fno.fdate);
|
|
||||||
pFilename->SetEntryTime(fno.ftime);
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
// クラスタ番号設定
|
// クラスタ番号設定
|
||||||
pFilename->SetEntryCluster(0);
|
pFilename->SetEntryCluster(0);
|
||||||
@ -1975,7 +1767,6 @@ void CHostPath::Refresh()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void CHostPath::Backup()
|
void CHostPath::Backup()
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT(m_szHost);
|
ASSERT(m_szHost);
|
||||||
ASSERT(strlen(m_szHost) < FILEPATH_MAX);
|
ASSERT(strlen(m_szHost) < FILEPATH_MAX);
|
||||||
|
|
||||||
@ -1992,28 +1783,6 @@ void CHostPath::Backup()
|
|||||||
if (stat(S2U(szPath), &sb) == 0)
|
if (stat(S2U(szPath), &sb) == 0)
|
||||||
m_tBackup = sb.st_mtime;
|
m_tBackup = sb.st_mtime;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
FILINFO fno;
|
|
||||||
|
|
||||||
ASSERT(m_szHost);
|
|
||||||
ASSERT(strlen(m_szHost) < FILEPATH_MAX);
|
|
||||||
|
|
||||||
TCHAR szPath[FILEPATH_MAX];
|
|
||||||
strcpy(szPath, m_szHost);
|
|
||||||
size_t len = strlen(szPath);
|
|
||||||
|
|
||||||
m_tBackupD = 0;
|
|
||||||
m_tBackupT = 0;
|
|
||||||
if (len > 1) { // ルートディレクトリの場合は何もしない
|
|
||||||
len--;
|
|
||||||
ASSERT(szPath[len] == _T('/'));
|
|
||||||
szPath[len] = _T('\0');
|
|
||||||
if (f_stat(S2U(szPath), &fno) == FR_OK) {
|
|
||||||
m_tBackupD = fno.fdate;
|
|
||||||
m_tBackupT = fno.ftime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2023,7 +1792,6 @@ void CHostPath::Backup()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void CHostPath::Restore() const
|
void CHostPath::Restore() const
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT(m_szHost);
|
ASSERT(m_szHost);
|
||||||
ASSERT(strlen(m_szHost) < FILEPATH_MAX);
|
ASSERT(strlen(m_szHost) < FILEPATH_MAX);
|
||||||
|
|
||||||
@ -2042,27 +1810,6 @@ void CHostPath::Restore() const
|
|||||||
ut.modtime = m_tBackup;
|
ut.modtime = m_tBackup;
|
||||||
utime(szPath, &ut);
|
utime(szPath, &ut);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
FILINFO fno;
|
|
||||||
|
|
||||||
ASSERT(m_szHost);
|
|
||||||
ASSERT(strlen(m_szHost) < FILEPATH_MAX);
|
|
||||||
|
|
||||||
TCHAR szPath[FILEPATH_MAX];
|
|
||||||
strcpy(szPath, m_szHost);
|
|
||||||
size_t len = strlen(szPath);
|
|
||||||
|
|
||||||
if (m_tBackupD) {
|
|
||||||
ASSERT(len);
|
|
||||||
len--;
|
|
||||||
ASSERT(szPath[len] == _T('/'));
|
|
||||||
szPath[len] = _T('\0');
|
|
||||||
|
|
||||||
fno.fdate = m_tBackupD;
|
|
||||||
fno.ftime = m_tBackupT;
|
|
||||||
f_utime(szPath, &fno);
|
|
||||||
}
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2683,13 +2430,8 @@ void CHostFilesManager::Free(CHostFiles* pFiles)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void CHostFcb::Init()
|
void CHostFcb::Init()
|
||||||
{
|
{
|
||||||
|
|
||||||
m_bUpdate = FALSE;
|
m_bUpdate = FALSE;
|
||||||
#ifndef BAREMETAL
|
|
||||||
m_pFile = NULL;
|
m_pFile = NULL;
|
||||||
#else
|
|
||||||
memset(&m_File, 0x00, sizeof(FIL));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2699,8 +2441,6 @@ void CHostFcb::Init()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
BOOL CHostFcb::SetMode(DWORD nHumanMode)
|
BOOL CHostFcb::SetMode(DWORD nHumanMode)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
switch (nHumanMode & Human68k::OP_MASK) {
|
switch (nHumanMode & Human68k::OP_MASK) {
|
||||||
case Human68k::OP_READ:
|
case Human68k::OP_READ:
|
||||||
m_pszMode = "rb";
|
m_pszMode = "rb";
|
||||||
@ -2714,21 +2454,6 @@ BOOL CHostFcb::SetMode(DWORD nHumanMode)
|
|||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
switch (nHumanMode & Human68k::OP_MASK) {
|
|
||||||
case Human68k::OP_READ:
|
|
||||||
m_Mode = FA_READ;
|
|
||||||
break;
|
|
||||||
case Human68k::OP_WRITE:
|
|
||||||
m_Mode = FA_WRITE;
|
|
||||||
break;
|
|
||||||
case Human68k::OP_FULL:
|
|
||||||
m_Mode = FA_WRITE | FA_READ;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
m_bFlag = (nHumanMode & Human68k::OP_SPECIAL) != 0;
|
m_bFlag = (nHumanMode & Human68k::OP_SPECIAL) != 0;
|
||||||
|
|
||||||
@ -2770,7 +2495,6 @@ void CHostFcb::SetHumanPath(const BYTE* szHumanPath)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
BOOL CHostFcb::Create(Human68k::fcb_t* pFcb, DWORD nHumanAttribute, BOOL bForce)
|
BOOL CHostFcb::Create(Human68k::fcb_t* pFcb, DWORD nHumanAttribute, BOOL bForce)
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT((nHumanAttribute & (Human68k::AT_DIRECTORY | Human68k::AT_VOLUME)) == 0);
|
ASSERT((nHumanAttribute & (Human68k::AT_DIRECTORY | Human68k::AT_VOLUME)) == 0);
|
||||||
ASSERT(strlen(m_szFilename) > 0);
|
ASSERT(strlen(m_szFilename) > 0);
|
||||||
ASSERT(m_pFile == NULL);
|
ASSERT(m_pFile == NULL);
|
||||||
@ -2786,28 +2510,6 @@ BOOL CHostFcb::Create(Human68k::fcb_t* pFcb, DWORD nHumanAttribute, BOOL bForce)
|
|||||||
m_pFile = fopen(S2U(m_szFilename), "w+b"); /// @warning 理想動作は属性ごと上書き
|
m_pFile = fopen(S2U(m_szFilename), "w+b"); /// @warning 理想動作は属性ごと上書き
|
||||||
|
|
||||||
return m_pFile != NULL;
|
return m_pFile != NULL;
|
||||||
#else
|
|
||||||
FRESULT fr;
|
|
||||||
|
|
||||||
ASSERT((nHumanAttribute & (Human68k::AT_DIRECTORY | Human68k::AT_VOLUME)) == 0);
|
|
||||||
ASSERT(strlen(m_szFilename) > 0);
|
|
||||||
|
|
||||||
// 重複チェック
|
|
||||||
if (bForce == FALSE) {
|
|
||||||
if (f_stat(S2U(m_szFilename), NULL) == FR_OK)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// RPIのベアメタルではRTCが無いのでHuman側の時刻を反映させる
|
|
||||||
DWORD nHumanTime = ((DWORD)pFcb->date) << 16 | ((DWORD)pFcb->time);
|
|
||||||
set_fattime(nHumanTime);
|
|
||||||
|
|
||||||
// ファイル作成
|
|
||||||
fr = f_open(&m_File, S2U(m_szFilename), FA_CREATE_ALWAYS | FA_WRITE | FA_READ);
|
|
||||||
/// @warning 理想動作は属性ごと上書き
|
|
||||||
|
|
||||||
return fr == FR_OK;
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2819,7 +2521,6 @@ BOOL CHostFcb::Create(Human68k::fcb_t* pFcb, DWORD nHumanAttribute, BOOL bForce)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
BOOL CHostFcb::Open()
|
BOOL CHostFcb::Open()
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
ASSERT(strlen(m_szFilename) > 0);
|
ASSERT(strlen(m_szFilename) > 0);
|
||||||
@ -2836,26 +2537,6 @@ BOOL CHostFcb::Open()
|
|||||||
m_pFile = fopen(S2U(m_szFilename), m_pszMode);
|
m_pFile = fopen(S2U(m_szFilename), m_pszMode);
|
||||||
|
|
||||||
return m_pFile != NULL || m_bFlag;
|
return m_pFile != NULL || m_bFlag;
|
||||||
#else
|
|
||||||
FRESULT fr;
|
|
||||||
FILINFO fno;
|
|
||||||
|
|
||||||
ASSERT(strlen(m_szFilename) > 0);
|
|
||||||
|
|
||||||
// ディレクトリなら失敗
|
|
||||||
if (f_stat(S2U(m_szFilename), &fno) == FR_OK) {
|
|
||||||
if (fno.fattrib & AM_DIR) {
|
|
||||||
return FALSE || m_bFlag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ファイルオープン
|
|
||||||
fr = FR_DISK_ERR;
|
|
||||||
if (m_File.obj.fs == NULL)
|
|
||||||
fr = f_open(&m_File, S2U(m_szFilename), m_Mode);
|
|
||||||
|
|
||||||
return fr == FR_OK || m_bFlag;
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2867,19 +2548,12 @@ BOOL CHostFcb::Open()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
BOOL CHostFcb::Rewind(DWORD nOffset)
|
BOOL CHostFcb::Rewind(DWORD nOffset)
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT(m_pFile);
|
ASSERT(m_pFile);
|
||||||
|
|
||||||
if (fseek(m_pFile, nOffset, SEEK_SET))
|
if (fseek(m_pFile, nOffset, SEEK_SET))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return ftell(m_pFile) != -1L;
|
return ftell(m_pFile) != -1L;
|
||||||
#else
|
|
||||||
if (f_lseek(&m_File, nOffset))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return f_tell(&m_File) != (DWORD)-1L;
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2892,7 +2566,6 @@ BOOL CHostFcb::Rewind(DWORD nOffset)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
DWORD CHostFcb::Read(BYTE* pBuffer, DWORD nSize)
|
DWORD CHostFcb::Read(BYTE* pBuffer, DWORD nSize)
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT(pBuffer);
|
ASSERT(pBuffer);
|
||||||
ASSERT(m_pFile);
|
ASSERT(m_pFile);
|
||||||
|
|
||||||
@ -2901,18 +2574,6 @@ DWORD CHostFcb::Read(BYTE* pBuffer, DWORD nSize)
|
|||||||
nResult = (size_t)-1;
|
nResult = (size_t)-1;
|
||||||
|
|
||||||
return (DWORD)nResult;
|
return (DWORD)nResult;
|
||||||
#else
|
|
||||||
FRESULT fr;
|
|
||||||
UINT nResult;
|
|
||||||
|
|
||||||
ASSERT(pBuffer);
|
|
||||||
|
|
||||||
fr = f_read(&m_File, pBuffer, nSize, &nResult);
|
|
||||||
if (fr != FR_OK)
|
|
||||||
nResult = (UINT)-1;
|
|
||||||
|
|
||||||
return (DWORD)nResult;
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2925,7 +2586,6 @@ DWORD CHostFcb::Read(BYTE* pBuffer, DWORD nSize)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
DWORD CHostFcb::Write(const BYTE* pBuffer, DWORD nSize)
|
DWORD CHostFcb::Write(const BYTE* pBuffer, DWORD nSize)
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT(pBuffer);
|
ASSERT(pBuffer);
|
||||||
ASSERT(m_pFile);
|
ASSERT(m_pFile);
|
||||||
|
|
||||||
@ -2934,18 +2594,6 @@ DWORD CHostFcb::Write(const BYTE* pBuffer, DWORD nSize)
|
|||||||
nResult = (size_t)-1;
|
nResult = (size_t)-1;
|
||||||
|
|
||||||
return (DWORD)nResult;
|
return (DWORD)nResult;
|
||||||
#else
|
|
||||||
FRESULT fr;
|
|
||||||
UINT nResult;
|
|
||||||
|
|
||||||
ASSERT(pBuffer);
|
|
||||||
|
|
||||||
fr = f_write(&m_File, pBuffer, nSize, &nResult);
|
|
||||||
if (fr != FR_OK)
|
|
||||||
nResult = (UINT)-1;
|
|
||||||
|
|
||||||
return (DWORD)nResult;
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2957,13 +2605,9 @@ DWORD CHostFcb::Write(const BYTE* pBuffer, DWORD nSize)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
BOOL CHostFcb::Truncate()
|
BOOL CHostFcb::Truncate()
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT(m_pFile);
|
ASSERT(m_pFile);
|
||||||
|
|
||||||
return ftruncate(fileno(m_pFile), ftell(m_pFile)) == 0;
|
return ftruncate(fileno(m_pFile), ftell(m_pFile)) == 0;
|
||||||
#else
|
|
||||||
return f_truncate(&m_File) == FR_OK;
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -2975,7 +2619,6 @@ BOOL CHostFcb::Truncate()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
DWORD CHostFcb::Seek(DWORD nOffset, DWORD nHumanSeek)
|
DWORD CHostFcb::Seek(DWORD nOffset, DWORD nHumanSeek)
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT(nHumanSeek == Human68k::SK_BEGIN ||
|
ASSERT(nHumanSeek == Human68k::SK_BEGIN ||
|
||||||
nHumanSeek == Human68k::SK_CURRENT || nHumanSeek == Human68k::SK_END);
|
nHumanSeek == Human68k::SK_CURRENT || nHumanSeek == Human68k::SK_END);
|
||||||
ASSERT(m_pFile);
|
ASSERT(m_pFile);
|
||||||
@ -2997,29 +2640,6 @@ DWORD CHostFcb::Seek(DWORD nOffset, DWORD nHumanSeek)
|
|||||||
return (DWORD)-1;
|
return (DWORD)-1;
|
||||||
|
|
||||||
return (DWORD)ftell(m_pFile);
|
return (DWORD)ftell(m_pFile);
|
||||||
#else
|
|
||||||
FRESULT fr;
|
|
||||||
|
|
||||||
ASSERT(nHumanSeek == Human68k::SK_BEGIN ||
|
|
||||||
nHumanSeek == Human68k::SK_CURRENT || nHumanSeek == Human68k::SK_END);
|
|
||||||
|
|
||||||
switch (nHumanSeek) {
|
|
||||||
case Human68k::SK_BEGIN:
|
|
||||||
fr = f_lseek(&m_File, nOffset);
|
|
||||||
break;
|
|
||||||
case Human68k::SK_CURRENT:
|
|
||||||
fr = f_lseek(&m_File, f_tell(&m_File) + nOffset);
|
|
||||||
break;
|
|
||||||
// case SK_END:
|
|
||||||
default:
|
|
||||||
fr = f_lseek(&m_File, f_size(&m_File) + nOffset);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (fr != FR_OK)
|
|
||||||
return (DWORD)-1;
|
|
||||||
|
|
||||||
return (DWORD)f_tell(&m_File);
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -3031,7 +2651,6 @@ DWORD CHostFcb::Seek(DWORD nOffset, DWORD nHumanSeek)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
BOOL CHostFcb::TimeStamp(DWORD nHumanTime)
|
BOOL CHostFcb::TimeStamp(DWORD nHumanTime)
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
ASSERT(m_pFile || m_bFlag);
|
ASSERT(m_pFile || m_bFlag);
|
||||||
|
|
||||||
struct tm t = { 0 };
|
struct tm t = { 0 };
|
||||||
@ -3053,19 +2672,6 @@ BOOL CHostFcb::TimeStamp(DWORD nHumanTime)
|
|||||||
fflush(m_pFile);
|
fflush(m_pFile);
|
||||||
|
|
||||||
return utime(S2U(m_szFilename), &ut) == 0 || m_bFlag;
|
return utime(S2U(m_szFilename), &ut) == 0 || m_bFlag;
|
||||||
#else
|
|
||||||
FILINFO fno;
|
|
||||||
|
|
||||||
ASSERT(m_bFlag);
|
|
||||||
|
|
||||||
// クローズ時に更新時刻が上書きされるのを防止するため
|
|
||||||
// タイムスタンプの更新前にフラッシュして同期させる
|
|
||||||
f_sync(&m_File);
|
|
||||||
|
|
||||||
fno.fdate = (WORD)(nHumanTime >> 16);
|
|
||||||
fno.ftime = (WORD)nHumanTime;
|
|
||||||
return f_utime(S2U(m_szFilename), &fno) == FR_OK || m_bFlag;
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -3077,19 +2683,14 @@ BOOL CHostFcb::TimeStamp(DWORD nHumanTime)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
BOOL CHostFcb::Close()
|
BOOL CHostFcb::Close()
|
||||||
{
|
{
|
||||||
|
|
||||||
BOOL bResult = TRUE;
|
BOOL bResult = TRUE;
|
||||||
|
|
||||||
// ファイルクローズ
|
// ファイルクローズ
|
||||||
// Close→Free(内部で再度Close)という流れもあるので必ず初期化すること。
|
// Close→Free(内部で再度Close)という流れもあるので必ず初期化すること。
|
||||||
#ifndef BAREMETAL
|
|
||||||
if (m_pFile) {
|
if (m_pFile) {
|
||||||
fclose(m_pFile);
|
fclose(m_pFile);
|
||||||
m_pFile = NULL;
|
m_pFile = NULL;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
f_close(&m_File);
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
return bResult;
|
return bResult;
|
||||||
}
|
}
|
||||||
@ -3409,11 +3010,7 @@ int CFileSys::MakeDir(DWORD nUnit, const Human68k::namests_t* pNamests)
|
|||||||
f.AddFilename();
|
f.AddFilename();
|
||||||
|
|
||||||
// ディレクトリ作成
|
// ディレクトリ作成
|
||||||
#ifndef BAREMETAL
|
|
||||||
if (mkdir(S2U(f.GetPath()), 0777))
|
if (mkdir(S2U(f.GetPath()), 0777))
|
||||||
#else
|
|
||||||
if (f_mkdir(S2U(f.GetPath())) != FR_OK)
|
|
||||||
#endif // BAREMETAL
|
|
||||||
return FS_INVALIDPATH;
|
return FS_INVALIDPATH;
|
||||||
|
|
||||||
// キャッシュ更新
|
// キャッシュ更新
|
||||||
@ -3463,11 +3060,7 @@ int CFileSys::RemoveDir(DWORD nUnit, const Human68k::namests_t* pNamests)
|
|||||||
m_cEntry.DeleteCache(nUnit, szHuman);
|
m_cEntry.DeleteCache(nUnit, szHuman);
|
||||||
|
|
||||||
// ディレクトリ削除
|
// ディレクトリ削除
|
||||||
#ifndef BAREMETAL
|
|
||||||
if (rmdir(S2U(f.GetPath())))
|
if (rmdir(S2U(f.GetPath())))
|
||||||
#else
|
|
||||||
if (f_rmdir(S2U(f.GetPath())) != FR_OK)
|
|
||||||
#endif // BAREMETAL
|
|
||||||
return FS_CANTDELETE;
|
return FS_CANTDELETE;
|
||||||
|
|
||||||
// キャッシュ更新
|
// キャッシュ更新
|
||||||
@ -3523,11 +3116,7 @@ int CFileSys::Rename(DWORD nUnit, const Human68k::namests_t* pNamests, const Hum
|
|||||||
char szTo[FILENAME_MAX];
|
char szTo[FILENAME_MAX];
|
||||||
SJIS2UTF8(f.GetPath(), szFrom, FILENAME_MAX);
|
SJIS2UTF8(f.GetPath(), szFrom, FILENAME_MAX);
|
||||||
SJIS2UTF8(fNew.GetPath(), szTo, FILENAME_MAX);
|
SJIS2UTF8(fNew.GetPath(), szTo, FILENAME_MAX);
|
||||||
#ifndef BAREMETAL
|
|
||||||
if (rename(szFrom, szTo)) {
|
if (rename(szFrom, szTo)) {
|
||||||
#else
|
|
||||||
if (f_rename(szFrom, szTo) != FR_OK) {
|
|
||||||
#endif // BAREMETAL
|
|
||||||
return FS_FILENOTFND;
|
return FS_FILENOTFND;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3569,11 +3158,7 @@ int CFileSys::Delete(DWORD nUnit, const Human68k::namests_t* pNamests)
|
|||||||
return FS_FILENOTFND;
|
return FS_FILENOTFND;
|
||||||
|
|
||||||
// ファイル削除
|
// ファイル削除
|
||||||
#ifndef BAREMETAL
|
|
||||||
if (unlink(S2U(f.GetPath())))
|
if (unlink(S2U(f.GetPath())))
|
||||||
#else
|
|
||||||
if (f_unlink(S2U(f.GetPath())) != FR_OK)
|
|
||||||
#endif // BAREMETAL
|
|
||||||
return FS_CANTDELETE;
|
return FS_CANTDELETE;
|
||||||
|
|
||||||
// キャッシュ更新
|
// キャッシュ更新
|
||||||
@ -3624,7 +3209,6 @@ int CFileSys::Attribute(DWORD nUnit, const Human68k::namests_t* pNamests, DWORD
|
|||||||
DWORD nAttribute = (nHumanAttribute & Human68k::AT_READONLY) |
|
DWORD nAttribute = (nHumanAttribute & Human68k::AT_READONLY) |
|
||||||
(f.GetAttribute() & ~Human68k::AT_READONLY);
|
(f.GetAttribute() & ~Human68k::AT_READONLY);
|
||||||
if (f.GetAttribute() != nAttribute) {
|
if (f.GetAttribute() != nAttribute) {
|
||||||
#ifndef BAREMETAL
|
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
if (stat(S2U(f.GetPath()), &sb))
|
if (stat(S2U(f.GetPath()), &sb))
|
||||||
return FS_FILENOTFND;
|
return FS_FILENOTFND;
|
||||||
@ -3637,17 +3221,6 @@ int CFileSys::Attribute(DWORD nUnit, const Human68k::namests_t* pNamests, DWORD
|
|||||||
// 属性設定
|
// 属性設定
|
||||||
if (chmod(S2U(f.GetPath()), m))
|
if (chmod(S2U(f.GetPath()), m))
|
||||||
return FS_FILENOTFND;
|
return FS_FILENOTFND;
|
||||||
#else
|
|
||||||
if (f_stat(S2U(f.GetPath()), NULL) != FR_OK)
|
|
||||||
return FS_FILENOTFND;
|
|
||||||
BYTE m = 0;
|
|
||||||
if (nAttribute & Human68k::AT_READONLY)
|
|
||||||
m = AM_RDO;
|
|
||||||
|
|
||||||
// 属性設定
|
|
||||||
if (f_chmod(S2U(f.GetPath()), m, AM_RDO))
|
|
||||||
return FS_FILENOTFND;
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// キャッシュ更新
|
// キャッシュ更新
|
||||||
|
@ -14,11 +14,6 @@
|
|||||||
#ifndef cfilesystem_h
|
#ifndef cfilesystem_h
|
||||||
#define cfilesystem_h
|
#define cfilesystem_h
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
#include "ffconf.h"
|
|
||||||
#include "ff.h"
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// ステータスコード定義
|
// ステータスコード定義
|
||||||
@ -572,12 +567,7 @@ private:
|
|||||||
///< 文字列比較 (ワイルドカード対応)
|
///< 文字列比較 (ワイルドカード対応)
|
||||||
|
|
||||||
CRing m_cRing; ///< CHostFilename連結用
|
CRing m_cRing; ///< CHostFilename連結用
|
||||||
#ifndef BAREMETAL
|
|
||||||
time_t m_tBackup; ///< 時刻復元用
|
time_t m_tBackup; ///< 時刻復元用
|
||||||
#else
|
|
||||||
WORD m_tBackupD; ///< 時刻復元用
|
|
||||||
WORD m_tBackupT; ///< 時刻復元用
|
|
||||||
#endif // BAREMETAL
|
|
||||||
BOOL m_bRefresh; ///< 更新フラグ
|
BOOL m_bRefresh; ///< 更新フラグ
|
||||||
DWORD m_nId; ///< 識別ID (値が変化した場合は更新を意味する)
|
DWORD m_nId; ///< 識別ID (値が変化した場合は更新を意味する)
|
||||||
BYTE m_szHuman[HUMAN68K_PATH_MAX]; ///< 該当エントリのHuman68k内部名
|
BYTE m_szHuman[HUMAN68K_PATH_MAX]; ///< 該当エントリのHuman68k内部名
|
||||||
@ -715,13 +705,8 @@ public:
|
|||||||
private:
|
private:
|
||||||
DWORD m_nKey; ///< Human68kのFCBバッファアドレス (0なら未使用)
|
DWORD m_nKey; ///< Human68kのFCBバッファアドレス (0なら未使用)
|
||||||
BOOL m_bUpdate; ///< 更新フラグ
|
BOOL m_bUpdate; ///< 更新フラグ
|
||||||
#ifndef BAREMETAL
|
|
||||||
FILE* m_pFile; ///< ホスト側のファイルオブジェクト
|
FILE* m_pFile; ///< ホスト側のファイルオブジェクト
|
||||||
const char* m_pszMode; ///< ホスト側のファイルオープンモード
|
const char* m_pszMode; ///< ホスト側のファイルオープンモード
|
||||||
#else
|
|
||||||
FIL m_File; ///< ホスト側のファイルオブジェクト
|
|
||||||
BYTE m_Mode; ///< ホスト側のファイルオープンモード
|
|
||||||
#endif // BAREMETAL
|
|
||||||
bool m_bFlag; ///< ホスト側のファイルオープンフラグ
|
bool m_bFlag; ///< ホスト側のファイルオープンフラグ
|
||||||
BYTE m_szHumanPath[HUMAN68K_PATH_MAX];
|
BYTE m_szHumanPath[HUMAN68K_PATH_MAX];
|
||||||
///< Human68kのパス名
|
///< Human68kのパス名
|
||||||
|
@ -21,21 +21,10 @@
|
|||||||
#include "xm6.h"
|
#include "xm6.h"
|
||||||
#include "filepath.h"
|
#include "filepath.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#ifdef RASCSI
|
|
||||||
#include "gpiobus.h"
|
#include "gpiobus.h"
|
||||||
#ifndef BAREMETAL
|
|
||||||
#include "ctapdriver.h"
|
#include "ctapdriver.h"
|
||||||
#endif // BAREMETAL
|
|
||||||
#include "cfilesystem.h"
|
#include "cfilesystem.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#else
|
|
||||||
#include "vm.h"
|
|
||||||
#include "disk.h"
|
|
||||||
#include "windrv.h"
|
|
||||||
#include "ctapdriver.h"
|
|
||||||
#include "mfc_com.h"
|
|
||||||
#include "mfc_host.h"
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
@ -157,13 +146,9 @@ BOOL FASTCALL DiskTrack::Load(const Filepath& path)
|
|||||||
ASSERT((dt.sectors > 0) && (dt.sectors <= 0x100));
|
ASSERT((dt.sectors > 0) && (dt.sectors <= 0x100));
|
||||||
|
|
||||||
if (dt.buffer == NULL) {
|
if (dt.buffer == NULL) {
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
if (posix_memalign((void **)&dt.buffer, 512, ((length + 511) / 512) * 512)) {
|
if (posix_memalign((void **)&dt.buffer, 512, ((length + 511) / 512) * 512)) {
|
||||||
LOGWARN("%s posix_memalign failed", __PRETTY_FUNCTION__);
|
LOGWARN("%s posix_memalign failed", __PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
dt.buffer = (BYTE *)malloc(length * sizeof(BYTE));
|
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
dt.length = length;
|
dt.length = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,13 +159,9 @@ BOOL FASTCALL DiskTrack::Load(const Filepath& path)
|
|||||||
// Reallocate if the buffer length is different
|
// Reallocate if the buffer length is different
|
||||||
if (dt.length != (DWORD)length) {
|
if (dt.length != (DWORD)length) {
|
||||||
free(dt.buffer);
|
free(dt.buffer);
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
if (posix_memalign((void **)&dt.buffer, 512, ((length + 511) / 512) * 512)) {
|
if (posix_memalign((void **)&dt.buffer, 512, ((length + 511) / 512) * 512)) {
|
||||||
LOGWARN("%s posix_memalign failed", __PRETTY_FUNCTION__);
|
LOGWARN("%s posix_memalign failed", __PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
dt.buffer = (BYTE *)malloc(length * sizeof(BYTE));
|
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
dt.length = length;
|
dt.length = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,11 +186,7 @@ BOOL FASTCALL DiskTrack::Load(const Filepath& path)
|
|||||||
memset(dt.changemap, 0x00, dt.sectors * sizeof(BOOL));
|
memset(dt.changemap, 0x00, dt.sectors * sizeof(BOOL));
|
||||||
|
|
||||||
// Read from File
|
// Read from File
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
if (!fio.OpenDIO(path, Fileio::ReadOnly)) {
|
if (!fio.OpenDIO(path, Fileio::ReadOnly)) {
|
||||||
#else
|
|
||||||
if (!fio.Open(path, Fileio::ReadOnly)) {
|
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (dt.raw) {
|
if (dt.raw) {
|
||||||
@ -783,138 +760,6 @@ void FASTCALL Disk::Reset()
|
|||||||
disk.reset = TRUE;
|
disk.reset = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Save
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Disk::Save(Fileio *fio, int ver)
|
|
||||||
{
|
|
||||||
DWORD padding;
|
|
||||||
|
|
||||||
ASSERT(fio);
|
|
||||||
|
|
||||||
// Save size
|
|
||||||
DWORD sz = 52;
|
|
||||||
if (!fio->Write(&sz, sizeof(sz))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save entity
|
|
||||||
PROP_EXPORT(fio, disk.id);
|
|
||||||
PROP_EXPORT(fio, disk.ready);
|
|
||||||
PROP_EXPORT(fio, disk.writep);
|
|
||||||
PROP_EXPORT(fio, disk.readonly);
|
|
||||||
PROP_EXPORT(fio, disk.removable);
|
|
||||||
PROP_EXPORT(fio, disk.lock);
|
|
||||||
PROP_EXPORT(fio, disk.attn);
|
|
||||||
PROP_EXPORT(fio, disk.reset);
|
|
||||||
PROP_EXPORT(fio, disk.size);
|
|
||||||
PROP_EXPORT(fio, disk.blocks);
|
|
||||||
PROP_EXPORT(fio, disk.lun);
|
|
||||||
PROP_EXPORT(fio, disk.code);
|
|
||||||
PROP_EXPORT(fio, padding);
|
|
||||||
|
|
||||||
// Save the path
|
|
||||||
if (!diskpath.Save(fio, ver)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Load
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Disk::Load(Fileio *fio, int ver)
|
|
||||||
{
|
|
||||||
DWORD sz;
|
|
||||||
disk_t buf;
|
|
||||||
DWORD padding;
|
|
||||||
Filepath path;
|
|
||||||
|
|
||||||
ASSERT(fio);
|
|
||||||
|
|
||||||
// Prior to version 2.03, the disk was not saved
|
|
||||||
if (ver <= 0x0202) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete the current disk cache
|
|
||||||
if (disk.dcache) {
|
|
||||||
disk.dcache->Save();
|
|
||||||
delete disk.dcache;
|
|
||||||
disk.dcache = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load size
|
|
||||||
if (!fio->Read(&sz, sizeof(sz))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (sz != 52) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load into buffer
|
|
||||||
PROP_IMPORT(fio, buf.id);
|
|
||||||
PROP_IMPORT(fio, buf.ready);
|
|
||||||
PROP_IMPORT(fio, buf.writep);
|
|
||||||
PROP_IMPORT(fio, buf.readonly);
|
|
||||||
PROP_IMPORT(fio, buf.removable);
|
|
||||||
PROP_IMPORT(fio, buf.lock);
|
|
||||||
PROP_IMPORT(fio, buf.attn);
|
|
||||||
PROP_IMPORT(fio, buf.reset);
|
|
||||||
PROP_IMPORT(fio, buf.size);
|
|
||||||
PROP_IMPORT(fio, buf.blocks);
|
|
||||||
PROP_IMPORT(fio, buf.lun);
|
|
||||||
PROP_IMPORT(fio, buf.code);
|
|
||||||
PROP_IMPORT(fio, padding);
|
|
||||||
|
|
||||||
// Load path
|
|
||||||
if (!path.Load(fio, ver)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move only if IDs match
|
|
||||||
if (disk.id == buf.id) {
|
|
||||||
// Do nothing if null
|
|
||||||
if (IsNULL()) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Same type of device as when saving
|
|
||||||
disk.ready = FALSE;
|
|
||||||
if (Open(path)) {
|
|
||||||
// Disk cache is created in Open
|
|
||||||
// move only properties
|
|
||||||
if (!disk.readonly) {
|
|
||||||
disk.writep = buf.writep;
|
|
||||||
}
|
|
||||||
disk.lock = buf.lock;
|
|
||||||
disk.attn = buf.attn;
|
|
||||||
disk.reset = buf.reset;
|
|
||||||
disk.lun = buf.lun;
|
|
||||||
disk.code = buf.code;
|
|
||||||
|
|
||||||
// Loaded successfully
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disk cache rebuild
|
|
||||||
if (!IsReady()) {
|
|
||||||
disk.dcache = NULL;
|
|
||||||
} else {
|
|
||||||
disk.dcache = new DiskCache(diskpath, disk.size, disk.blocks);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// NULL Check
|
// NULL Check
|
||||||
|
@ -60,14 +60,7 @@
|
|||||||
#define DISK_AUDIOCOMPLETE 0x00??0013 // AUDIO PLAY SUCCESSFULLY COMPLETED
|
#define DISK_AUDIOCOMPLETE 0x00??0013 // AUDIO PLAY SUCCESSFULLY COMPLETED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef RASCSI
|
|
||||||
#define BENDER_SIGNATURE "RaSCSI"
|
#define BENDER_SIGNATURE "RaSCSI"
|
||||||
// The following line was to mimic Apple's CDROM ID
|
|
||||||
// #define BENDER_SIGNATURE "SONY "
|
|
||||||
#else
|
|
||||||
#define BENDER_SIGNATURE "XM6"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
@ -192,10 +185,6 @@ public:
|
|||||||
Disk(); // Constructor
|
Disk(); // Constructor
|
||||||
virtual ~Disk(); // Destructor
|
virtual ~Disk(); // Destructor
|
||||||
virtual void FASTCALL Reset(); // Device Reset
|
virtual void FASTCALL Reset(); // Device Reset
|
||||||
#ifndef RASCSI
|
|
||||||
virtual BOOL FASTCALL Save(Fileio *fio, int ver); // Save
|
|
||||||
virtual BOOL FASTCALL Load(Fileio *fio, int ver); // Load
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// ID
|
// ID
|
||||||
DWORD FASTCALL GetID() const; // Get media ID
|
DWORD FASTCALL GetID() const; // Get media ID
|
||||||
|
@ -53,7 +53,7 @@ SCSIDaynaPort::SCSIDaynaPort() : Disk()
|
|||||||
// DaynaPort
|
// DaynaPort
|
||||||
disk.id = MAKEID('S', 'C', 'D', 'P');
|
disk.id = MAKEID('S', 'C', 'D', 'P');
|
||||||
|
|
||||||
#if defined(__linux__) && !defined(BAREMETAL)
|
#ifdef __linux__
|
||||||
// TAP Driver Generation
|
// TAP Driver Generation
|
||||||
m_tap = new CTapDriver();
|
m_tap = new CTapDriver();
|
||||||
m_bTapEnable = m_tap->Init();
|
m_bTapEnable = m_tap->Init();
|
||||||
@ -86,7 +86,7 @@ SCSIDaynaPort::SCSIDaynaPort() : Disk()
|
|||||||
m_mac_addr[4]=0x98;
|
m_mac_addr[4]=0x98;
|
||||||
m_mac_addr[5]=0xE3;
|
m_mac_addr[5]=0xE3;
|
||||||
|
|
||||||
#endif // RASCSI && !BAREMETAL
|
#endif // linux
|
||||||
LOGTRACE("SCSIDaynaPort Constructor End");
|
LOGTRACE("SCSIDaynaPort Constructor End");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -173,9 +173,6 @@ private:
|
|||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
|
|
||||||
CTapDriver *m_tap;
|
CTapDriver *m_tap;
|
||||||
// TAP driver
|
// TAP driver
|
||||||
BOOL m_bTapEnable;
|
BOOL m_bTapEnable;
|
||||||
@ -184,7 +181,4 @@ private:
|
|||||||
// MAC Address
|
// MAC Address
|
||||||
static const BYTE m_bcast_addr[6];
|
static const BYTE m_bcast_addr[6];
|
||||||
static const BYTE m_apple_talk_addr[6];
|
static const BYTE m_apple_talk_addr[6];
|
||||||
|
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -42,7 +42,7 @@ SCSIBR::SCSIBR() : Disk()
|
|||||||
// Host Bridge
|
// Host Bridge
|
||||||
disk.id = MAKEID('S', 'C', 'B', 'R');
|
disk.id = MAKEID('S', 'C', 'B', 'R');
|
||||||
|
|
||||||
#if defined(RASCSI) && defined(__linux__) && !defined(BAREMETAL)
|
#ifdef __linux__
|
||||||
// TAP Driver Generation
|
// TAP Driver Generation
|
||||||
tap = new CTapDriver();
|
tap = new CTapDriver();
|
||||||
m_bTapEnable = tap->Init();
|
m_bTapEnable = tap->Init();
|
||||||
@ -56,7 +56,7 @@ SCSIBR::SCSIBR() : Disk()
|
|||||||
|
|
||||||
// Packet reception flag OFF
|
// Packet reception flag OFF
|
||||||
packet_enable = FALSE;
|
packet_enable = FALSE;
|
||||||
#endif // RASCSI && !BAREMETAL
|
#endif
|
||||||
|
|
||||||
// Create host file system
|
// Create host file system
|
||||||
fs = new CFileSys();
|
fs = new CFileSys();
|
||||||
@ -70,13 +70,11 @@ SCSIBR::SCSIBR() : Disk()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
SCSIBR::~SCSIBR()
|
SCSIBR::~SCSIBR()
|
||||||
{
|
{
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
// TAP driver release
|
// TAP driver release
|
||||||
if (tap) {
|
if (tap) {
|
||||||
tap->Cleanup();
|
tap->Cleanup();
|
||||||
delete tap;
|
delete tap;
|
||||||
}
|
}
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
// Release host file system
|
// Release host file system
|
||||||
if (fs) {
|
if (fs) {
|
||||||
@ -139,12 +137,10 @@ int FASTCALL SCSIBR::Inquiry(
|
|||||||
// Optional function valid flag
|
// Optional function valid flag
|
||||||
buf[36] = '0';
|
buf[36] = '0';
|
||||||
|
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
// TAP Enable
|
// TAP Enable
|
||||||
if (m_bTapEnable) {
|
if (m_bTapEnable) {
|
||||||
buf[37] = '1';
|
buf[37] = '1';
|
||||||
}
|
}
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
// CFileSys Enable
|
// CFileSys Enable
|
||||||
buf[38] = '1';
|
buf[38] = '1';
|
||||||
@ -181,25 +177,20 @@ BOOL FASTCALL SCSIBR::TestUnitReady(const DWORD* /*cdb*/)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int FASTCALL SCSIBR::GetMessage10(const DWORD *cdb, BYTE *buf)
|
int FASTCALL SCSIBR::GetMessage10(const DWORD *cdb, BYTE *buf)
|
||||||
{
|
{
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
int func;
|
int func;
|
||||||
int total_len;
|
int total_len;
|
||||||
int i;
|
int i;
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
// Type
|
// Type
|
||||||
int type = cdb[2];
|
int type = cdb[2];
|
||||||
|
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
// Function number
|
// Function number
|
||||||
func = cdb[3];
|
func = cdb[3];
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
// Phase
|
// Phase
|
||||||
int phase = cdb[9];
|
int phase = cdb[9];
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
case 1: // Ethernet
|
case 1: // Ethernet
|
||||||
// Do not process if TAP is invalid
|
// Do not process if TAP is invalid
|
||||||
if (!m_bTapEnable) {
|
if (!m_bTapEnable) {
|
||||||
@ -248,7 +239,6 @@ int FASTCALL SCSIBR::GetMessage10(const DWORD *cdb, BYTE *buf)
|
|||||||
return total_len;
|
return total_len;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
case 2: // Host Drive
|
case 2: // Host Drive
|
||||||
switch (phase) {
|
switch (phase) {
|
||||||
@ -296,7 +286,6 @@ BOOL FASTCALL SCSIBR::SendMessage10(const DWORD *cdb, BYTE *buf)
|
|||||||
len |= cdb[8];
|
len |= cdb[8];
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
case 1: // Ethernet
|
case 1: // Ethernet
|
||||||
// Do not process if TAP is invalid
|
// Do not process if TAP is invalid
|
||||||
if (!m_bTapEnable) {
|
if (!m_bTapEnable) {
|
||||||
@ -313,7 +302,6 @@ BOOL FASTCALL SCSIBR::SendMessage10(const DWORD *cdb, BYTE *buf)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
case 2: // Host drive
|
case 2: // Host drive
|
||||||
switch (phase) {
|
switch (phase) {
|
||||||
@ -333,7 +321,6 @@ BOOL FASTCALL SCSIBR::SendMessage10(const DWORD *cdb, BYTE *buf)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Get MAC Address
|
// Get MAC Address
|
||||||
@ -433,7 +420,6 @@ void FASTCALL SCSIBR::SendPacket(BYTE *buf, int len)
|
|||||||
|
|
||||||
tap->Tx(buf, len);
|
tap->Tx(buf, len);
|
||||||
}
|
}
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
|
@ -26,9 +26,7 @@
|
|||||||
// SCSI Host Bridge
|
// SCSI Host Bridge
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
class CTapDriver;
|
class CTapDriver;
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
class CFileSys;
|
class CFileSys;
|
||||||
class SCSIBR : public Disk
|
class SCSIBR : public Disk
|
||||||
{
|
{
|
||||||
@ -44,7 +42,6 @@ public:
|
|||||||
BOOL FASTCALL SendMessage10(const DWORD *cdb, BYTE *buf); // SEND MESSAGE10 command
|
BOOL FASTCALL SendMessage10(const DWORD *cdb, BYTE *buf); // SEND MESSAGE10 command
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if defined(RASCSI) && !defined(BAREMETAL)
|
|
||||||
int FASTCALL GetMacAddr(BYTE *buf); // Get MAC address
|
int FASTCALL GetMacAddr(BYTE *buf); // Get MAC address
|
||||||
void FASTCALL SetMacAddr(BYTE *buf); // Set MAC address
|
void FASTCALL SetMacAddr(BYTE *buf); // Set MAC address
|
||||||
void FASTCALL ReceivePacket(); // Receive a packet
|
void FASTCALL ReceivePacket(); // Receive a packet
|
||||||
@ -57,7 +54,6 @@ private:
|
|||||||
int packet_len; // Receive packet size
|
int packet_len; // Receive packet size
|
||||||
BYTE packet_buf[0x1000]; // Receive packet buffer
|
BYTE packet_buf[0x1000]; // Receive packet buffer
|
||||||
BOOL packet_enable; // Received packet valid
|
BOOL packet_enable; // Received packet valid
|
||||||
#endif // RASCSI && !BAREMETAL
|
|
||||||
|
|
||||||
int FASTCALL ReadFsResult(BYTE *buf); // Read filesystem (result code)
|
int FASTCALL ReadFsResult(BYTE *buf); // Read filesystem (result code)
|
||||||
int FASTCALL ReadFsOut(BYTE *buf); // Read filesystem (return data)
|
int FASTCALL ReadFsOut(BYTE *buf); // Read filesystem (return data)
|
||||||
|
@ -286,103 +286,6 @@ SCSICD::~SCSICD()
|
|||||||
ClearTrack();
|
ClearTrack();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Load
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL SCSICD::Load(Fileio *fio, int ver)
|
|
||||||
{
|
|
||||||
DWORD sz;
|
|
||||||
disk_t buf;
|
|
||||||
DWORD padding;
|
|
||||||
Filepath path;
|
|
||||||
|
|
||||||
ASSERT(fio);
|
|
||||||
ASSERT(ver >= 0x0200);
|
|
||||||
|
|
||||||
// Prior to version 2.03, the disk was not saved
|
|
||||||
if (ver <= 0x0202) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// load size, match
|
|
||||||
if (!fio->Read(&sz, sizeof(sz))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (sz != 52) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// load into buffer
|
|
||||||
PROP_IMPORT(fio, buf.id);
|
|
||||||
PROP_IMPORT(fio, buf.ready);
|
|
||||||
PROP_IMPORT(fio, buf.writep);
|
|
||||||
PROP_IMPORT(fio, buf.readonly);
|
|
||||||
PROP_IMPORT(fio, buf.removable);
|
|
||||||
PROP_IMPORT(fio, buf.lock);
|
|
||||||
PROP_IMPORT(fio, buf.attn);
|
|
||||||
PROP_IMPORT(fio, buf.reset);
|
|
||||||
PROP_IMPORT(fio, buf.size);
|
|
||||||
PROP_IMPORT(fio, buf.blocks);
|
|
||||||
PROP_IMPORT(fio, buf.lun);
|
|
||||||
PROP_IMPORT(fio, buf.code);
|
|
||||||
PROP_IMPORT(fio, padding);
|
|
||||||
|
|
||||||
// Load path
|
|
||||||
if (!path.Load(fio, ver)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always eject
|
|
||||||
Eject(TRUE);
|
|
||||||
|
|
||||||
// move only if IDs match
|
|
||||||
if (disk.id != buf.id) {
|
|
||||||
// It was not a CD-ROM when saving. Maintain eject status
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to reopen
|
|
||||||
if (!Open(path, FALSE)) {
|
|
||||||
// Cannot reopen. Maintain eject status
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disk cache is created in Open. Move property only
|
|
||||||
if (!disk.readonly) {
|
|
||||||
disk.writep = buf.writep;
|
|
||||||
}
|
|
||||||
disk.lock = buf.lock;
|
|
||||||
disk.attn = buf.attn;
|
|
||||||
disk.reset = buf.reset;
|
|
||||||
disk.lun = buf.lun;
|
|
||||||
disk.code = buf.code;
|
|
||||||
|
|
||||||
// Discard the disk cache again
|
|
||||||
if (disk.dcache) {
|
|
||||||
delete disk.dcache;
|
|
||||||
disk.dcache = NULL;
|
|
||||||
}
|
|
||||||
disk.dcache = NULL;
|
|
||||||
|
|
||||||
// Tentative
|
|
||||||
disk.blocks = track[0]->GetBlocks();
|
|
||||||
if (disk.blocks > 0) {
|
|
||||||
// Recreate the disk cache
|
|
||||||
track[0]->GetPath(path);
|
|
||||||
disk.dcache = new DiskCache(path, disk.size, disk.blocks);
|
|
||||||
disk.dcache->SetRawMode(rawfile);
|
|
||||||
|
|
||||||
// Reset data index
|
|
||||||
dataindex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Open
|
// Open
|
||||||
|
@ -115,9 +115,6 @@ public:
|
|||||||
SCSICD(); // Constructor
|
SCSICD(); // Constructor
|
||||||
virtual ~SCSICD(); // Destructor
|
virtual ~SCSICD(); // Destructor
|
||||||
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); // Open
|
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); // Open
|
||||||
#ifndef RASCSI
|
|
||||||
BOOL FASTCALL Load(Fileio *fio, int ver); // Load
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// commands
|
// commands
|
||||||
int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); // INQUIRY command
|
int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); // INQUIRY command
|
||||||
|
@ -98,85 +98,6 @@ BOOL FASTCALL SCSIMO::Open(const Filepath& path, BOOL attn)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RASCSI
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Load
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL SCSIMO::Load(Fileio *fio, int ver)
|
|
||||||
{
|
|
||||||
DWORD sz;
|
|
||||||
disk_t buf;
|
|
||||||
DWORD padding;
|
|
||||||
Filepath path;
|
|
||||||
|
|
||||||
ASSERT(fio);
|
|
||||||
ASSERT(ver >= 0x0200);
|
|
||||||
|
|
||||||
// Prior to version 2.03, the disk was not saved
|
|
||||||
if (ver <= 0x0202) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// load size, match
|
|
||||||
if (!fio->Read(&sz, sizeof(sz))) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (sz != 52) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// load into buffer
|
|
||||||
PROP_IMPORT(fio, buf.id);
|
|
||||||
PROP_IMPORT(fio, buf.ready);
|
|
||||||
PROP_IMPORT(fio, buf.writep);
|
|
||||||
PROP_IMPORT(fio, buf.readonly);
|
|
||||||
PROP_IMPORT(fio, buf.removable);
|
|
||||||
PROP_IMPORT(fio, buf.lock);
|
|
||||||
PROP_IMPORT(fio, buf.attn);
|
|
||||||
PROP_IMPORT(fio, buf.reset);
|
|
||||||
PROP_IMPORT(fio, buf.size);
|
|
||||||
PROP_IMPORT(fio, buf.blocks);
|
|
||||||
PROP_IMPORT(fio, buf.lun);
|
|
||||||
PROP_IMPORT(fio, buf.code);
|
|
||||||
PROP_IMPORT(fio, padding);
|
|
||||||
|
|
||||||
// Load path
|
|
||||||
if (!path.Load(fio, ver)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always eject
|
|
||||||
Eject(TRUE);
|
|
||||||
|
|
||||||
// Move only if IDs match
|
|
||||||
if (disk.id != buf.id) {
|
|
||||||
// Not MO at the time of save. Maintain eject status
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Re-try opening
|
|
||||||
if (!Open(path, FALSE)) {
|
|
||||||
// Cannot reopen. Maintain eject status
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disk cache is created in Open. Move property only
|
|
||||||
if (!disk.readonly) {
|
|
||||||
disk.writep = buf.writep;
|
|
||||||
}
|
|
||||||
disk.lock = buf.lock;
|
|
||||||
disk.attn = buf.attn;
|
|
||||||
disk.reset = buf.reset;
|
|
||||||
disk.lun = buf.lun;
|
|
||||||
disk.code = buf.code;
|
|
||||||
|
|
||||||
// loaded successfully
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// INQUIRY
|
// INQUIRY
|
||||||
|
@ -30,9 +30,6 @@ public:
|
|||||||
// Basic Functions
|
// Basic Functions
|
||||||
SCSIMO(); // Constructor
|
SCSIMO(); // Constructor
|
||||||
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); // Open
|
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); // Open
|
||||||
#ifndef RASCSI
|
|
||||||
BOOL FASTCALL Load(Fileio *fio, int ver); // Load
|
|
||||||
#endif // RASCSI
|
|
||||||
|
|
||||||
// commands
|
// commands
|
||||||
int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); // INQUIRY command
|
int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); // INQUIRY command
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// コンストラクタ
|
// コンストラクタ
|
||||||
@ -332,263 +331,3 @@ void FASTCALL Fileio::Close()
|
|||||||
handle = -1;
|
handle = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// コンストラクタ
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
Fileio::Fileio()
|
|
||||||
{
|
|
||||||
// ワーク初期化
|
|
||||||
handle.obj.fs = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// デストラクタ
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
Fileio::~Fileio()
|
|
||||||
{
|
|
||||||
ASSERT(!handle.obj.fs);
|
|
||||||
|
|
||||||
// Releaseでの安全策
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// ロード
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Fileio::Load(const Filepath& path, void *buffer, int size)
|
|
||||||
{
|
|
||||||
ASSERT(buffer);
|
|
||||||
ASSERT(size > 0);
|
|
||||||
ASSERT(!handle.obj.fs);
|
|
||||||
|
|
||||||
// オープン
|
|
||||||
if (!Open(path, ReadOnly)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 読み込み
|
|
||||||
if (!Read(buffer, size)) {
|
|
||||||
Close();
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// クローズ
|
|
||||||
Close();
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// セーブ
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Fileio::Save(const Filepath& path, void *buffer, int size)
|
|
||||||
{
|
|
||||||
ASSERT(buffer);
|
|
||||||
ASSERT(size > 0);
|
|
||||||
ASSERT(!handle.obj.fs);
|
|
||||||
|
|
||||||
// オープン
|
|
||||||
if (!Open(path, WriteOnly)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 書き込み
|
|
||||||
if (!Write(buffer, size)) {
|
|
||||||
Close();
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// クローズ
|
|
||||||
Close();
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// オープン
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Fileio::Open(LPCTSTR fname, OpenMode mode)
|
|
||||||
{
|
|
||||||
FRESULT fr;
|
|
||||||
Filepath fpath;
|
|
||||||
ASSERT(fname);
|
|
||||||
ASSERT(!handle.obj.fs);
|
|
||||||
|
|
||||||
// ヌル文字列からの読み込みは必ず失敗させる
|
|
||||||
if (fname[0] == _T('\0')) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// モード別
|
|
||||||
switch (mode) {
|
|
||||||
// 読み込みのみ
|
|
||||||
case ReadOnly:
|
|
||||||
fr = f_open(&handle, fname, FA_READ);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// 書き込みのみ
|
|
||||||
case WriteOnly:
|
|
||||||
fr = f_open(&handle, fname, FA_CREATE_ALWAYS | FA_WRITE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// 読み書き両方
|
|
||||||
case ReadWrite:
|
|
||||||
fr = f_open(&handle, fname, FA_READ | FA_WRITE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// アペンド
|
|
||||||
case Append:
|
|
||||||
fr = f_open(&handle, fname, FA_OPEN_APPEND | FA_WRITE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// それ以外
|
|
||||||
default:
|
|
||||||
fr = FR_NO_PATH;
|
|
||||||
ASSERT(FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 結果評価
|
|
||||||
if (fr != FR_OK) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// オープン成功
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// オープン
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Fileio::Open(const Filepath& path, OpenMode mode)
|
|
||||||
{
|
|
||||||
ASSERT(!handle.obj.fs);
|
|
||||||
|
|
||||||
return Open(path.GetPath(), mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// 読み込み
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Fileio::Read(void *buffer, int size)
|
|
||||||
{
|
|
||||||
FRESULT fr;
|
|
||||||
UINT count;
|
|
||||||
|
|
||||||
ASSERT(buffer);
|
|
||||||
ASSERT(size > 0);
|
|
||||||
ASSERT(handle.obj.fs);
|
|
||||||
|
|
||||||
// 読み込み
|
|
||||||
fr = f_read(&handle, buffer, size, &count);
|
|
||||||
if (fr != FR_OK || count != (unsigned int)size) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// 書き込み
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Fileio::Write(const void *buffer, int size)
|
|
||||||
{
|
|
||||||
FRESULT fr;
|
|
||||||
UINT count;
|
|
||||||
|
|
||||||
ASSERT(buffer);
|
|
||||||
ASSERT(size > 0);
|
|
||||||
ASSERT(handle.obj.fs);
|
|
||||||
|
|
||||||
// 書き込み
|
|
||||||
fr = f_write(&handle, buffer, size, &count);
|
|
||||||
if (fr != FR_OK || count != (unsigned int)size) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// シーク
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
BOOL FASTCALL Fileio::Seek(off64_t offset, BOOL relative)
|
|
||||||
{
|
|
||||||
FRESULT fr;
|
|
||||||
|
|
||||||
ASSERT(offset >= 0);
|
|
||||||
ASSERT(handle.obj.fs);
|
|
||||||
|
|
||||||
// 相対シークならオフセットに現在値を追加
|
|
||||||
if (relative) {
|
|
||||||
offset += f_tell(&handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
fr = f_lseek(&handle, offset);
|
|
||||||
if (fr != FR_OK) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f_tell(&handle) != (DWORD)offset) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// ファイルサイズ取得
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
off64_t FASTCALL Fileio::GetFileSize()
|
|
||||||
{
|
|
||||||
ASSERT(handle.obj.fs);
|
|
||||||
|
|
||||||
return f_size(&handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// ファイル位置取得
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
off64_t FASTCALL Fileio::GetFilePos() const
|
|
||||||
{
|
|
||||||
ASSERT(handle.obj.fs);
|
|
||||||
|
|
||||||
return f_tell(&handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// クローズ
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void FASTCALL Fileio::Close()
|
|
||||||
{
|
|
||||||
|
|
||||||
if (handle.obj.fs) {
|
|
||||||
f_close(&handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif //BAREMETAL
|
|
@ -13,10 +13,6 @@
|
|||||||
|
|
||||||
#include "filepath.h"
|
#include "filepath.h"
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
#include "ff.h"
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// マクロ(Load,Save用)
|
// マクロ(Load,Save用)
|
||||||
@ -61,12 +57,10 @@ public:
|
|||||||
// オープン
|
// オープン
|
||||||
BOOL FASTCALL Open(const Filepath& path, OpenMode mode);
|
BOOL FASTCALL Open(const Filepath& path, OpenMode mode);
|
||||||
// オープン
|
// オープン
|
||||||
#ifndef BAREMETAL
|
|
||||||
BOOL FASTCALL OpenDIO(LPCTSTR fname, OpenMode mode);
|
BOOL FASTCALL OpenDIO(LPCTSTR fname, OpenMode mode);
|
||||||
// オープン
|
// オープン
|
||||||
BOOL FASTCALL OpenDIO(const Filepath& path, OpenMode mode);
|
BOOL FASTCALL OpenDIO(const Filepath& path, OpenMode mode);
|
||||||
// オープン
|
// オープン
|
||||||
#endif // BAREMETAL
|
|
||||||
BOOL FASTCALL Seek(off64_t offset, BOOL relative = FALSE);
|
BOOL FASTCALL Seek(off64_t offset, BOOL relative = FALSE);
|
||||||
// シーク
|
// シーク
|
||||||
BOOL FASTCALL Read(void *buffer, int size);
|
BOOL FASTCALL Read(void *buffer, int size);
|
||||||
@ -79,22 +73,14 @@ public:
|
|||||||
// ファイル位置取得
|
// ファイル位置取得
|
||||||
void FASTCALL Close();
|
void FASTCALL Close();
|
||||||
// クローズ
|
// クローズ
|
||||||
#ifndef BAREMETAL
|
|
||||||
BOOL FASTCALL IsValid() const { return (BOOL)(handle != -1); }
|
BOOL FASTCALL IsValid() const { return (BOOL)(handle != -1); }
|
||||||
#else
|
|
||||||
BOOL FASTCALL IsValid() const { return (BOOL)(handle.obj.fs != 0); }
|
|
||||||
#endif // BAREMETAL
|
|
||||||
// 有効チェック
|
// 有効チェック
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#ifndef BAREMETAL
|
|
||||||
BOOL FASTCALL Open(LPCTSTR fname, OpenMode mode, BOOL directIO);
|
BOOL FASTCALL Open(LPCTSTR fname, OpenMode mode, BOOL directIO);
|
||||||
// オープン
|
// オープン
|
||||||
|
|
||||||
int handle; // ファイルハンドル
|
int handle; // ファイルハンドル
|
||||||
#else
|
|
||||||
FIL handle; // ファイルハンドル
|
|
||||||
#endif // BAREMETAL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // fileio_h
|
#endif // fileio_h
|
||||||
|
@ -84,80 +84,6 @@ void FASTCALL Filepath::SetPath(LPCSTR path)
|
|||||||
Split();
|
Split();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// 互換関数(dirname) 結果は直ぐにコピーせよ
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
static char dirtmp[2];
|
|
||||||
char* dirname(char *path)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
if( path == NULL || *path == '\0' ) {
|
|
||||||
dirtmp[0] = '.';
|
|
||||||
dirtmp[1] = '\0';
|
|
||||||
return dirtmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = path + strlen(path) - 1;
|
|
||||||
while( *p == '/' ) {
|
|
||||||
if( p == path )
|
|
||||||
return path;
|
|
||||||
*p-- = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
while( p >= path && *p != '/' ) {
|
|
||||||
p--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p < path) {
|
|
||||||
dirtmp[0] = '.';
|
|
||||||
dirtmp[1] = '\0';
|
|
||||||
return dirtmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p == path) {
|
|
||||||
dirtmp[0] = '/';
|
|
||||||
dirtmp[1] = '\0';
|
|
||||||
return dirtmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p = 0;
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// 互換関数(basename) 結果は直ぐにコピーせよ
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
static char basetmp[2];
|
|
||||||
char* basename(char *path)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
if( path == NULL || *path == '\0' ) {
|
|
||||||
basetmp[0] = '/';
|
|
||||||
basetmp[1] = '\0';
|
|
||||||
return basetmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = path + strlen(path) - 1;
|
|
||||||
while( *p == '/' ) {
|
|
||||||
if( p == path ) {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
*p-- = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
while( p >= path && *p != '/' ) {
|
|
||||||
p--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return p + 1;
|
|
||||||
}
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// パス分離
|
// パス分離
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
#include "gpiobus.h"
|
#include "gpiobus.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
@ -80,42 +79,6 @@ DWORD bcm_host_get_peripheral_address(void)
|
|||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
#endif // __NetBSD__
|
#endif // __NetBSD__
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
// IO base address
|
|
||||||
extern uint32_t RPi_IO_Base_Addr;
|
|
||||||
|
|
||||||
// Core frequency
|
|
||||||
extern uint32_t RPi_Core_Freq;
|
|
||||||
|
|
||||||
#ifdef USE_SEL_EVENT_ENABLE
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Interrupt control function
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
extern "C" {
|
|
||||||
extern uintptr_t setIrqFuncAddress (void(*ARMaddress)(void));
|
|
||||||
extern void EnableInterrupts (void);
|
|
||||||
extern void DisableInterrupts (void);
|
|
||||||
extern void WaitForInterrupts (void);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Interrupt handler
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
static GPIOBUS *self;
|
|
||||||
extern "C"
|
|
||||||
void IrqHandler()
|
|
||||||
{
|
|
||||||
// Clear interrupt
|
|
||||||
self->ClearSelectEvent();
|
|
||||||
}
|
|
||||||
#endif // USE_SEL_EVENT_ENABLE
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
@ -124,9 +87,6 @@ void IrqHandler()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
GPIOBUS::GPIOBUS()
|
GPIOBUS::GPIOBUS()
|
||||||
{
|
{
|
||||||
#if defined(USE_SEL_EVENT_ENABLE) && defined(BAREMETAL)
|
|
||||||
self = this;
|
|
||||||
#endif // USE_SEL_EVENT_ENABLE && BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -153,21 +113,14 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode)
|
|||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
int pullmode;
|
int pullmode;
|
||||||
#ifndef BAREMETAL
|
|
||||||
int fd;
|
int fd;
|
||||||
#ifdef USE_SEL_EVENT_ENABLE
|
#ifdef USE_SEL_EVENT_ENABLE
|
||||||
struct epoll_event ev;
|
struct epoll_event ev;
|
||||||
#endif // USE_SEL_EVENT_ENABLE
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
// Save operation mode
|
// Save operation mode
|
||||||
actmode = mode;
|
actmode = mode;
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
// Get the base address
|
|
||||||
baseaddr = RPi_IO_Base_Addr;
|
|
||||||
map = (void*)baseaddr;
|
|
||||||
#else
|
|
||||||
// Get the base address
|
// Get the base address
|
||||||
baseaddr = (DWORD)bcm_host_get_peripheral_address();
|
baseaddr = (DWORD)bcm_host_get_peripheral_address();
|
||||||
|
|
||||||
@ -185,7 +138,7 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode)
|
|||||||
close(fd);
|
close(fd);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
// Determine the type of raspberry pi from the base address
|
// Determine the type of raspberry pi from the base address
|
||||||
if (baseaddr == 0xfe000000) {
|
if (baseaddr == 0xfe000000) {
|
||||||
rpitype = 4;
|
rpitype = 4;
|
||||||
@ -213,24 +166,10 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode)
|
|||||||
irpctl = (DWORD *)map;
|
irpctl = (DWORD *)map;
|
||||||
irpctl += IRPT_OFFSET / sizeof(DWORD);
|
irpctl += IRPT_OFFSET / sizeof(DWORD);
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
// Quad-A7 control
|
// Quad-A7 control
|
||||||
qa7regs = (DWORD *)map;
|
qa7regs = (DWORD *)map;
|
||||||
qa7regs += QA7_OFFSET / sizeof(DWORD);
|
qa7regs += QA7_OFFSET / sizeof(DWORD);
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
// Map GIC memory
|
|
||||||
if (rpitype == 4) {
|
|
||||||
map = (void*)ARM_GICD_BASE;
|
|
||||||
gicd = (DWORD *)map;
|
|
||||||
map = (void*)ARM_GICC_BASE;
|
|
||||||
gicc = (DWORD *)map;
|
|
||||||
} else {
|
|
||||||
gicd = NULL;
|
|
||||||
gicc = NULL;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// Map GIC memory
|
// Map GIC memory
|
||||||
if (rpitype == 4) {
|
if (rpitype == 4) {
|
||||||
map = mmap(NULL, 8192,
|
map = mmap(NULL, 8192,
|
||||||
@ -247,7 +186,6 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode)
|
|||||||
gicc = NULL;
|
gicc = NULL;
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
// Set Drive Strength to 16mA
|
// Set Drive Strength to 16mA
|
||||||
DrvConfig(7);
|
DrvConfig(7);
|
||||||
@ -292,7 +230,6 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode)
|
|||||||
|
|
||||||
// Initialize SEL signal interrupt
|
// Initialize SEL signal interrupt
|
||||||
#ifdef USE_SEL_EVENT_ENABLE
|
#ifdef USE_SEL_EVENT_ENABLE
|
||||||
#ifndef BAREMETAL
|
|
||||||
// GPIO chip open
|
// GPIO chip open
|
||||||
fd = open("/dev/gpiochip0", 0);
|
fd = open("/dev/gpiochip0", 0);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
@ -375,7 +312,6 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode)
|
|||||||
// Enable interrupts
|
// Enable interrupts
|
||||||
irpctl[IRPT_ENB_IRQ_2] = (1 << (GPIO_IRQ % 32));
|
irpctl[IRPT_ENB_IRQ_2] = (1 << (GPIO_IRQ % 32));
|
||||||
}
|
}
|
||||||
#endif // BAREMETAL
|
|
||||||
#endif // USE_SEL_EVENT_ENABLE
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
|
|
||||||
// Create work table
|
// Create work table
|
||||||
@ -405,9 +341,7 @@ void FASTCALL GPIOBUS::Cleanup()
|
|||||||
|
|
||||||
// Release SEL signal interrupt
|
// Release SEL signal interrupt
|
||||||
#ifdef USE_SEL_EVENT_ENABLE
|
#ifdef USE_SEL_EVENT_ENABLE
|
||||||
#ifndef BAREMETAL
|
|
||||||
close(selevreq.fd);
|
close(selevreq.fd);
|
||||||
#endif // BAREMETAL
|
|
||||||
#endif // USE_SEL_EVENT_ENABLE
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
|
|
||||||
// Set control signals
|
// Set control signals
|
||||||
@ -1227,17 +1161,6 @@ int FASTCALL GPIOBUS::PollSelectEvent()
|
|||||||
{
|
{
|
||||||
// clear errno
|
// clear errno
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
// Enable interrupts
|
|
||||||
EnableInterrupts();
|
|
||||||
|
|
||||||
// Wait for interrupts
|
|
||||||
WaitForInterrupts();
|
|
||||||
|
|
||||||
// Disable interrupts
|
|
||||||
DisableInterrupts();
|
|
||||||
#else
|
|
||||||
struct epoll_event epev;
|
struct epoll_event epev;
|
||||||
struct gpioevent_data gpev;
|
struct gpioevent_data gpev;
|
||||||
|
|
||||||
@ -1250,7 +1173,6 @@ int FASTCALL GPIOBUS::PollSelectEvent()
|
|||||||
LOGWARN("%s read failed", __PRETTY_FUNCTION__);
|
LOGWARN("%s read failed", __PRETTY_FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1262,21 +1184,6 @@ int FASTCALL GPIOBUS::PollSelectEvent()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL GPIOBUS::ClearSelectEvent()
|
void FASTCALL GPIOBUS::ClearSelectEvent()
|
||||||
{
|
{
|
||||||
#ifdef BAREMETAL
|
|
||||||
DWORD irq;
|
|
||||||
|
|
||||||
// Clear event
|
|
||||||
gpio[GPIO_EDS_0] = 1 << PIN_SEL;
|
|
||||||
|
|
||||||
// Response to GIC
|
|
||||||
if (rpitype == 4) {
|
|
||||||
// IRQ number
|
|
||||||
irq = gicc[GICC_IAR] & 0x3FF;
|
|
||||||
|
|
||||||
// Interrupt response
|
|
||||||
gicc[GICC_EOIR] = irq;
|
|
||||||
}
|
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
#endif // USE_SEL_EVENT_ENABLE
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
|
|
||||||
@ -1522,7 +1429,6 @@ BOOL FASTCALL GPIOBUS::WaitSignal(int pin, BOOL ast)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL GPIOBUS::DisableIRQ()
|
void FASTCALL GPIOBUS::DisableIRQ()
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
if (rpitype == 4) {
|
if (rpitype == 4) {
|
||||||
// RPI4 is disabled by GICC
|
// RPI4 is disabled by GICC
|
||||||
giccpmr = gicc[GICC_PMR];
|
giccpmr = gicc[GICC_PMR];
|
||||||
@ -1537,7 +1443,6 @@ void FASTCALL GPIOBUS::DisableIRQ()
|
|||||||
irptenb = irpctl[IRPT_ENB_IRQ_1];
|
irptenb = irpctl[IRPT_ENB_IRQ_1];
|
||||||
irpctl[IRPT_DIS_IRQ_1] = irptenb & 0xf;
|
irpctl[IRPT_DIS_IRQ_1] = irptenb & 0xf;
|
||||||
}
|
}
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -1547,7 +1452,6 @@ void FASTCALL GPIOBUS::DisableIRQ()
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL GPIOBUS::EnableIRQ()
|
void FASTCALL GPIOBUS::EnableIRQ()
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
if (rpitype == 4) {
|
if (rpitype == 4) {
|
||||||
// RPI4 enables interrupts via the GICC
|
// RPI4 enables interrupts via the GICC
|
||||||
gicc[GICC_PMR] = giccpmr;
|
gicc[GICC_PMR] = giccpmr;
|
||||||
@ -1558,7 +1462,6 @@ void FASTCALL GPIOBUS::EnableIRQ()
|
|||||||
// Restart the system timer interrupt with the interrupt controller
|
// Restart the system timer interrupt with the interrupt controller
|
||||||
irpctl[IRPT_ENB_IRQ_1] = irptenb & 0xf;
|
irpctl[IRPT_ENB_IRQ_1] = irptenb & 0xf;
|
||||||
}
|
}
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -1722,7 +1625,6 @@ volatile DWORD SysTimer::corefreq;
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void FASTCALL SysTimer::Init(DWORD *syst, DWORD *armt)
|
void FASTCALL SysTimer::Init(DWORD *syst, DWORD *armt)
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
// RPI Mailbox property interface
|
// RPI Mailbox property interface
|
||||||
// Get max clock rate
|
// Get max clock rate
|
||||||
// Tag: 0x00030004
|
// Tag: 0x00030004
|
||||||
@ -1736,7 +1638,6 @@ void FASTCALL SysTimer::Init(DWORD *syst, DWORD *armt)
|
|||||||
// 0x000000004: CORE
|
// 0x000000004: CORE
|
||||||
DWORD maxclock[32] = { 32, 0, 0x00030004, 8, 0, 4, 0, 0 };
|
DWORD maxclock[32] = { 32, 0, 0x00030004, 8, 0, 4, 0, 0 };
|
||||||
int fd;
|
int fd;
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
// Save the base address
|
// Save the base address
|
||||||
systaddr = syst;
|
systaddr = syst;
|
||||||
@ -1746,9 +1647,6 @@ void FASTCALL SysTimer::Init(DWORD *syst, DWORD *armt)
|
|||||||
armtaddr[ARMT_CTRL] = 0x00000282;
|
armtaddr[ARMT_CTRL] = 0x00000282;
|
||||||
|
|
||||||
// Get the core frequency
|
// Get the core frequency
|
||||||
#ifdef BAREMETAL
|
|
||||||
corefreq = RPi_Core_Freq / 1000000;
|
|
||||||
#else
|
|
||||||
corefreq = 0;
|
corefreq = 0;
|
||||||
fd = open("/dev/vcio", O_RDONLY);
|
fd = open("/dev/vcio", O_RDONLY);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
@ -1756,7 +1654,6 @@ void FASTCALL SysTimer::Init(DWORD *syst, DWORD *armt)
|
|||||||
corefreq = maxclock[6] / 1000000;
|
corefreq = maxclock[6] / 1000000;
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
@ -629,7 +629,6 @@ private:
|
|||||||
|
|
||||||
volatile DWORD *irpctl; // Interrupt control register
|
volatile DWORD *irpctl; // Interrupt control register
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
volatile DWORD irptenb; // Interrupt enabled state
|
volatile DWORD irptenb; // Interrupt enabled state
|
||||||
|
|
||||||
volatile DWORD *qa7regs; // QA7 register
|
volatile DWORD *qa7regs; // QA7 register
|
||||||
@ -639,7 +638,6 @@ private:
|
|||||||
volatile DWORD tintctl; // Interupt control
|
volatile DWORD tintctl; // Interupt control
|
||||||
|
|
||||||
volatile DWORD giccpmr; // GICC priority setting
|
volatile DWORD giccpmr; // GICC priority setting
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
volatile DWORD *gicd; // GIC Interrupt distributor register
|
volatile DWORD *gicd; // GIC Interrupt distributor register
|
||||||
|
|
||||||
@ -649,11 +647,11 @@ private:
|
|||||||
|
|
||||||
DWORD signals; // All bus signals
|
DWORD signals; // All bus signals
|
||||||
|
|
||||||
#if defined(USE_SEL_EVENT_ENABLE) && !defined(BAREMETAL)
|
#ifdef USE_SEL_EVENT_ENABLE
|
||||||
struct gpioevent_request selevreq = {}; // SEL signal event request
|
struct gpioevent_request selevreq = {}; // SEL signal event request
|
||||||
|
|
||||||
int epfd; // epoll file descriptor
|
int epfd; // epoll file descriptor
|
||||||
#endif // USE_SEL_EVENT_ENABLE && !BAREMETAL
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
|
|
||||||
#if SIGNAL_CONTROL_MODE == 0
|
#if SIGNAL_CONTROL_MODE == 0
|
||||||
DWORD tblDatMsk[3][256]; // Data mask table
|
DWORD tblDatMsk[3][256]; // Data mask table
|
||||||
|
@ -56,7 +56,6 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
@ -65,13 +64,6 @@
|
|||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#else
|
|
||||||
#include <machine/endian.h>
|
|
||||||
#define htonl(_x) __htonl(_x)
|
|
||||||
#define htons(_x) __htons(_x)
|
|
||||||
#define ntohl(_x) __ntohl(_x)
|
|
||||||
#define ntohs(_x) __ntohs(_x)
|
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
|
@ -47,11 +47,7 @@ using namespace rasctl_interface;
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#define CtrlMax 8 // Maximum number of SCSI controllers
|
#define CtrlMax 8 // Maximum number of SCSI controllers
|
||||||
#define UnitNum 2 // Number of units around controller
|
#define UnitNum 2 // Number of units around controller
|
||||||
#ifdef BAREMETAL
|
|
||||||
#define FPRT(fp, ...) printf( __VA_ARGS__ )
|
|
||||||
#else
|
|
||||||
#define FPRT(fp, ...) fprintf(fp, __VA_ARGS__ )
|
#define FPRT(fp, ...) fprintf(fp, __VA_ARGS__ )
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
@ -63,16 +59,11 @@ static volatile BOOL active; // Processing flag
|
|||||||
SASIDEV *ctrl[CtrlMax]; // Controller
|
SASIDEV *ctrl[CtrlMax]; // Controller
|
||||||
Disk *disk[CtrlMax * UnitNum]; // Disk
|
Disk *disk[CtrlMax * UnitNum]; // Disk
|
||||||
GPIOBUS *bus; // GPIO Bus
|
GPIOBUS *bus; // GPIO Bus
|
||||||
#ifdef BAREMETAL
|
|
||||||
FATFS fatfs; // FatFS
|
|
||||||
#else
|
|
||||||
int monsocket; // Monitor Socket
|
int monsocket; // Monitor Socket
|
||||||
pthread_t monthread; // Monitor Thread
|
pthread_t monthread; // Monitor Thread
|
||||||
pthread_mutex_t ctrl_mutex; // Semaphore for the ctrl array
|
pthread_mutex_t ctrl_mutex; // Semaphore for the ctrl array
|
||||||
static void *MonThread(void *param);
|
static void *MonThread(void *param);
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Signal Processing
|
// Signal Processing
|
||||||
@ -83,7 +74,6 @@ void KillHandler(int sig)
|
|||||||
// Stop instruction
|
// Stop instruction
|
||||||
running = FALSE;
|
running = FALSE;
|
||||||
}
|
}
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
@ -104,14 +94,12 @@ void Banner(int argc, char* argv[])
|
|||||||
if ((argc > 1 && strcmp(argv[1], "-h") == 0) ||
|
if ((argc > 1 && strcmp(argv[1], "-h") == 0) ||
|
||||||
(argc > 1 && strcmp(argv[1], "--help") == 0)){
|
(argc > 1 && strcmp(argv[1], "--help") == 0)){
|
||||||
FPRT(stdout,"\n");
|
FPRT(stdout,"\n");
|
||||||
FPRT(stdout,"Usage: %s [-IDn FILE] [-s LOG_LEVEL] ...\n\n", argv[0]);
|
FPRT(stdout,"Usage: %s [-IDn FILE] ...\n\n", argv[0]);
|
||||||
FPRT(stdout," n is SCSI identification number(0-7).\n");
|
FPRT(stdout," n is SCSI identification number(0-7).\n");
|
||||||
FPRT(stdout," FILE is disk image file.\n");
|
FPRT(stdout," FILE is disk image file.\n\n");
|
||||||
FPRT(stdout," LOG_LEVEL is {trace|debug|info|warn|err|critical|off}, default is 'trace'\n\n");
|
FPRT(stdout,"Usage: %s [-HDn FILE] ...\n\n", argv[0]);
|
||||||
FPRT(stdout,"Usage: %s [-HDn FILE] [-s LOG_LEVEL] ...\n\n", argv[0]);
|
|
||||||
FPRT(stdout," n is X68000 SASI HD number(0-15).\n");
|
FPRT(stdout," n is X68000 SASI HD number(0-15).\n");
|
||||||
FPRT(stdout," FILE is disk image file, \"daynaport\", or \"bridge\".\n");
|
FPRT(stdout," FILE is disk image file, \"daynaport\", or \"bridge\".\n\n");
|
||||||
FPRT(stdout," LOG_LEVEL is {trace|debug|info|warn|err|critical|off}, default is 'trace'\n\n");
|
|
||||||
FPRT(stdout," Image type is detected based on file extension.\n");
|
FPRT(stdout," Image type is detected based on file extension.\n");
|
||||||
FPRT(stdout," hdf : SASI HD image(XM6 SASI HD image)\n");
|
FPRT(stdout," hdf : SASI HD image(XM6 SASI HD image)\n");
|
||||||
FPRT(stdout," hds : SCSI HD image(XM6 SCSI HD image)\n");
|
FPRT(stdout," hds : SCSI HD image(XM6 SCSI HD image)\n");
|
||||||
@ -122,9 +110,7 @@ void Banner(int argc, char* argv[])
|
|||||||
FPRT(stdout," mos : SCSI MO image(XM6 SCSI MO image)\n");
|
FPRT(stdout," mos : SCSI MO image(XM6 SCSI MO image)\n");
|
||||||
FPRT(stdout," iso : SCSI CD image(ISO 9660 image)\n");
|
FPRT(stdout," iso : SCSI CD image(ISO 9660 image)\n");
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
exit(0);
|
exit(0);
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +121,6 @@ void Banner(int argc, char* argv[])
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
BOOL Init()
|
BOOL Init()
|
||||||
{
|
{
|
||||||
#ifndef BAREMETAL
|
|
||||||
struct sockaddr_in server;
|
struct sockaddr_in server;
|
||||||
int yes, result;
|
int yes, result;
|
||||||
|
|
||||||
@ -146,9 +131,9 @@ BOOL Init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create socket for monitor
|
// Create socket for monitor
|
||||||
monsocket = socket(AF_INET, SOCK_STREAM, 0);
|
monsocket = socket(PF_INET, SOCK_STREAM, 0);
|
||||||
memset(&server, 0, sizeof(server));
|
memset(&server, 0, sizeof(server));
|
||||||
server.sin_family = AF_INET;
|
server.sin_family = PF_INET;
|
||||||
server.sin_port = htons(6868);
|
server.sin_port = htons(6868);
|
||||||
server.sin_addr.s_addr = htonl(INADDR_ANY);
|
server.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
|
||||||
@ -179,7 +164,6 @@ BOOL Init()
|
|||||||
if (signal(SIGTERM, KillHandler) == SIG_ERR) {
|
if (signal(SIGTERM, KillHandler) == SIG_ERR) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
// GPIOBUS creation
|
// GPIOBUS creation
|
||||||
bus = new GPIOBUS();
|
bus = new GPIOBUS();
|
||||||
@ -238,14 +222,12 @@ void Cleanup()
|
|||||||
// Discard the GPIOBUS object
|
// Discard the GPIOBUS object
|
||||||
delete bus;
|
delete bus;
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
// Close the monitor socket
|
// Close the monitor socket
|
||||||
if (monsocket >= 0) {
|
if (monsocket >= 0) {
|
||||||
close(monsocket);
|
close(monsocket);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_destroy(&ctrl_mutex);
|
pthread_mutex_destroy(&ctrl_mutex);
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@ -460,12 +442,6 @@ bool MapController(Disk **map)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ReturnStatus(int fd, bool status = true, const string msg = "") {
|
bool ReturnStatus(int fd, bool status = true, const string msg = "") {
|
||||||
#ifdef BAREMETAL
|
|
||||||
if (msg.length()) {
|
|
||||||
FPRT(stderr, msg.c_str());
|
|
||||||
FPRT(stderr, "\n");
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
if (msg.length()) {
|
if (msg.length()) {
|
||||||
FPRT(stderr, msg.c_str());
|
FPRT(stderr, msg.c_str());
|
||||||
@ -475,12 +451,12 @@ bool ReturnStatus(int fd, bool status = true, const string msg = "") {
|
|||||||
else {
|
else {
|
||||||
Result result;
|
Result result;
|
||||||
result.set_status(status);
|
result.set_status(status);
|
||||||
|
result.set_msg(msg + "\n");
|
||||||
|
|
||||||
string data;
|
string data;
|
||||||
result.SerializeToString(&data);
|
result.SerializeToString(&data);
|
||||||
SerializeProtobufData(fd, data);
|
SerializeProtobufData(fd, data);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -515,7 +491,7 @@ void SetLogLevel(const string& log_level) {
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Command Processing. If fd is -1 error messages are displayed on the console.
|
// Command Processing
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
bool ProcessCmd(int fd, const Command &command)
|
bool ProcessCmd(int fd, const Command &command)
|
||||||
@ -734,177 +710,6 @@ bool has_suffix(const string& filename, const string& suffix) {
|
|||||||
// Argument Parsing
|
// Argument Parsing
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#ifdef BAREMETAL
|
|
||||||
BOOL ParseConfig(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
FIL fp;
|
|
||||||
char line[512];
|
|
||||||
int id;
|
|
||||||
int un;
|
|
||||||
DeviceType type;
|
|
||||||
char *argID;
|
|
||||||
char *argPath;
|
|
||||||
int len;
|
|
||||||
char *ext;
|
|
||||||
|
|
||||||
// Mount the SD card
|
|
||||||
FRESULT fr = f_mount(&fatfs, "", 1);
|
|
||||||
if (fr != FR_OK) {
|
|
||||||
FPRT(stderr, "Error : SD card mount failed.\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is no setting file, the processing is interrupted
|
|
||||||
fr = f_open(&fp, "rascsi.ini", FA_READ);
|
|
||||||
if (fr != FR_OK) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start Decoding
|
|
||||||
|
|
||||||
while (TRUE) {
|
|
||||||
// Get one Line
|
|
||||||
memset(line, 0x00, sizeof(line));
|
|
||||||
if (f_gets(line, sizeof(line) -1, &fp) == NULL) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete the CR/LF
|
|
||||||
len = strlen(line);
|
|
||||||
while (len > 0) {
|
|
||||||
if (line[len - 1] != '\r' && line[len - 1] != '\n') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
line[len - 1] = '\0';
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the ID and Path
|
|
||||||
argID = &line[0];
|
|
||||||
argPath = &line[4];
|
|
||||||
line[3] = '\0';
|
|
||||||
|
|
||||||
// Check if the line is an empty string
|
|
||||||
if (argID[0] == '\0' || argPath[0] == '\0') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strlen(argID) == 3 && xstrncasecmp(argID, "id", 2) == 0) {
|
|
||||||
// ID or ID Format
|
|
||||||
|
|
||||||
// Check that the ID number is valid (0-7)
|
|
||||||
if (argID[2] < '0' || argID[2] > '7') {
|
|
||||||
FPRT(stderr,
|
|
||||||
"Error : Invalid argument(IDn n=0-7) [%c]\n", argID[2]);
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The ID unit is good
|
|
||||||
id = argID[2] - '0';
|
|
||||||
un = 0;
|
|
||||||
} else if (xstrncasecmp(argID, "hd", 2) == 0) {
|
|
||||||
// HD or HD format
|
|
||||||
|
|
||||||
if (strlen(argID) == 3) {
|
|
||||||
// Check that the HD number is valid (0-9)
|
|
||||||
if (argID[2] < '0' || argID[2] > '9') {
|
|
||||||
FPRT(stderr,
|
|
||||||
"Error : Invalid argument(HDn n=0-15) [%c]\n", argID[2]);
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ID was confirmed
|
|
||||||
id = (argID[2] - '0') / UnitNum;
|
|
||||||
un = (argID[2] - '0') % UnitNum;
|
|
||||||
} else if (strlen(argID) == 4) {
|
|
||||||
// Check that the HD number is valid (10-15)
|
|
||||||
if (argID[2] != '1' || argID[3] < '0' || argID[3] > '5') {
|
|
||||||
FPRT(stderr,
|
|
||||||
"Error : Invalid argument(HDn n=0-15) [%c]\n", argID[2]);
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The ID unit is good - create the id and unit number
|
|
||||||
id = ((argID[3] - '0') + 10) / UnitNum;
|
|
||||||
un = ((argID[3] - '0') + 10) % UnitNum;
|
|
||||||
argPath++;
|
|
||||||
} else {
|
|
||||||
FPRT(stderr,
|
|
||||||
"Error : Invalid argument(IDn or HDn) [%s]\n", argID);
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
FPRT(stderr,
|
|
||||||
"Error : Invalid argument(IDn or HDn) [%s]\n", argID);
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip if there is already an active device
|
|
||||||
if (disk[id * UnitNum + un] &&
|
|
||||||
!disk[id * UnitNum + un]->IsNULL()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check ethernet and host bridge
|
|
||||||
if (!strcasecmp(argPath, "bridge")) {
|
|
||||||
type = BR;
|
|
||||||
} else {
|
|
||||||
// Check the path length
|
|
||||||
len = strlen(argPath);
|
|
||||||
if (len < 5) {
|
|
||||||
FPRT(stderr,
|
|
||||||
"Error : Invalid argument(File path is short) [%s]\n",
|
|
||||||
argPath);
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Does the file have an extension?
|
|
||||||
if (argPath[len - 4] != '.') {
|
|
||||||
FPRT(stderr,
|
|
||||||
"Error : Invalid argument(No extension) [%s]\n", argPath);
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Figure out what the type is
|
|
||||||
ext = &argPath[len - 3];
|
|
||||||
if (!strcasecmp(ext, "hdf") || !strcasecmp(ext, "hds") || !strcasecmp(ext, "hdn") ||
|
|
||||||
!strcasecmp(ext, "hdi") || !strcasecmp(ext, "nhd") || !strcasecmp(ext, "hda")) {
|
|
||||||
type = SASI_HD;
|
|
||||||
} else if (!strcasecmp(ext, "mos")) {
|
|
||||||
type = MO;
|
|
||||||
} else if (!strcasecmp(ext, "iso")) {
|
|
||||||
type = CD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Execute the command
|
|
||||||
Command command;
|
|
||||||
command.set_id(id);
|
|
||||||
command.set_un(un);
|
|
||||||
command.set_cmd(0);
|
|
||||||
command.set_type(type);
|
|
||||||
command.set_file(argPath);
|
|
||||||
if (!ProcessCmd(-1, command)) {
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the configuration file
|
|
||||||
f_close(&fp);
|
|
||||||
|
|
||||||
// Display the device list
|
|
||||||
fprintf(stdout, "%s", ListDevice().c_str());
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
parse_error:
|
|
||||||
|
|
||||||
// Close the configuration file
|
|
||||||
f_close(&fp);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
bool ParseArgument(int argc, char* argv[])
|
bool ParseArgument(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
int id = -1;
|
int id = -1;
|
||||||
@ -913,7 +718,7 @@ bool ParseArgument(int argc, char* argv[])
|
|||||||
string log_level = "trace";
|
string log_level = "trace";
|
||||||
|
|
||||||
int opt;
|
int opt;
|
||||||
while ((opt = getopt(argc, argv, "-IiHhL:s:D:d:")) != -1) {
|
while ((opt = getopt(argc, argv, "-IiHhL:l:D:d:")) != -1) {
|
||||||
switch (tolower(opt)) {
|
switch (tolower(opt)) {
|
||||||
case 'i':
|
case 'i':
|
||||||
is_sasi = false;
|
is_sasi = false;
|
||||||
@ -927,7 +732,7 @@ bool ParseArgument(int argc, char* argv[])
|
|||||||
id = -1;
|
id = -1;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case 's':
|
case 'l':
|
||||||
log_level = optarg;
|
log_level = optarg;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -999,9 +804,7 @@ bool ParseArgument(int argc, char* argv[])
|
|||||||
fprintf(stdout, "%s", ListDevice().c_str());
|
fprintf(stdout, "%s", ListDevice().c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Pin the thread to a specific CPU
|
// Pin the thread to a specific CPU
|
||||||
@ -1101,25 +904,14 @@ static void *MonThread(void *param)
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Main processing
|
// Main processing
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#ifdef BAREMETAL
|
|
||||||
extern "C"
|
|
||||||
int startrascsi(void)
|
|
||||||
{
|
|
||||||
int argc = 0;
|
|
||||||
char** argv = NULL;
|
|
||||||
#else
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
#endif // BAREMETAL
|
|
||||||
GOOGLE_PROTOBUF_VERIFY_VERSION;
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
int actid;
|
int actid;
|
||||||
DWORD now;
|
DWORD now;
|
||||||
@ -1127,9 +919,7 @@ int main(int argc, char* argv[])
|
|||||||
BYTE data;
|
BYTE data;
|
||||||
// added setvbuf to override stdout buffering, so logs are written immediately and not when the process exits.
|
// added setvbuf to override stdout buffering, so logs are written immediately and not when the process exits.
|
||||||
setvbuf(stdout, NULL, _IONBF, 0);
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
#ifndef BAREMETAL
|
|
||||||
struct sched_param schparam;
|
struct sched_param schparam;
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
set_level(level::trace);
|
set_level(level::trace);
|
||||||
// Create a thread-safe stdout logger to process the log messages
|
// Create a thread-safe stdout logger to process the log messages
|
||||||
@ -1148,29 +938,12 @@ int main(int argc, char* argv[])
|
|||||||
// Reset
|
// Reset
|
||||||
Reset();
|
Reset();
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
// BUSY assert (to hold the host side)
|
|
||||||
bus->SetBSY(TRUE);
|
|
||||||
|
|
||||||
// Argument parsing
|
|
||||||
if (!ParseConfig(argc, argv)) {
|
|
||||||
ret = EINVAL;
|
|
||||||
goto err_exit;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// Argument parsing
|
// Argument parsing
|
||||||
if (!ParseArgument(argc, argv)) {
|
if (!ParseArgument(argc, argv)) {
|
||||||
ret = EINVAL;
|
ret = EINVAL;
|
||||||
goto err_exit;
|
goto err_exit;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BAREMETAL
|
|
||||||
// Release the busy signal
|
|
||||||
bus->SetBSY(FALSE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BAREMETAL
|
|
||||||
// Set the affinity to a specific processor core
|
// Set the affinity to a specific processor core
|
||||||
FixCpu(3);
|
FixCpu(3);
|
||||||
|
|
||||||
@ -1179,7 +952,6 @@ int main(int argc, char* argv[])
|
|||||||
schparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
schparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||||
sched_setscheduler(0, SCHED_FIFO, &schparam);
|
sched_setscheduler(0, SCHED_FIFO, &schparam);
|
||||||
#endif // USE_SEL_EVENT_ENABLE
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
#endif // BAREMETAL
|
|
||||||
|
|
||||||
// Start execution
|
// Start execution
|
||||||
running = TRUE;
|
running = TRUE;
|
||||||
@ -1205,9 +977,7 @@ int main(int argc, char* argv[])
|
|||||||
#else
|
#else
|
||||||
bus->Aquire();
|
bus->Aquire();
|
||||||
if (!bus->GetSEL()) {
|
if (!bus->GetSEL()) {
|
||||||
#if !defined(BAREMETAL)
|
|
||||||
usleep(0);
|
usleep(0);
|
||||||
#endif // !BAREMETAL
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif // USE_SEL_EVENT_ENABLE
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
@ -1258,11 +1028,11 @@ int main(int argc, char* argv[])
|
|||||||
// Start target device
|
// Start target device
|
||||||
active = TRUE;
|
active = TRUE;
|
||||||
|
|
||||||
#if !defined(USE_SEL_EVENT_ENABLE) && !defined(BAREMETAL)
|
#ifndef USE_SEL_EVENT_ENABLE
|
||||||
// Scheduling policy setting (highest priority)
|
// Scheduling policy setting (highest priority)
|
||||||
schparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
schparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||||
sched_setscheduler(0, SCHED_FIFO, &schparam);
|
sched_setscheduler(0, SCHED_FIFO, &schparam);
|
||||||
#endif // !USE_SEL_EVENT_ENABLE && !BAREMETAL
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
|
|
||||||
// Loop until the bus is free
|
// Loop until the bus is free
|
||||||
while (running) {
|
while (running) {
|
||||||
@ -1277,11 +1047,11 @@ int main(int argc, char* argv[])
|
|||||||
pthread_mutex_unlock(&ctrl_mutex);
|
pthread_mutex_unlock(&ctrl_mutex);
|
||||||
|
|
||||||
|
|
||||||
#if !defined(USE_SEL_EVENT_ENABLE) && !defined(BAREMETAL)
|
#ifndef USE_SEL_EVENT_ENABLE
|
||||||
// Set the scheduling priority back to normal
|
// Set the scheduling priority back to normal
|
||||||
schparam.sched_priority = 0;
|
schparam.sched_priority = 0;
|
||||||
sched_setscheduler(0, SCHED_OTHER, &schparam);
|
sched_setscheduler(0, SCHED_OTHER, &schparam);
|
||||||
#endif // !USE_SEL_EVENT_ENABLE && !BAREMETAL
|
#endif // USE_SEL_EVENT_ENABLE
|
||||||
|
|
||||||
// End the target travel
|
// End the target travel
|
||||||
active = FALSE;
|
active = FALSE;
|
||||||
@ -1292,9 +1062,5 @@ err_exit:
|
|||||||
Cleanup();
|
Cleanup();
|
||||||
|
|
||||||
init_exit:
|
init_exit:
|
||||||
#if !defined(BAREMETAL)
|
|
||||||
exit(ret);
|
|
||||||
#else
|
|
||||||
return ret;
|
return ret;
|
||||||
#endif // BAREMETAL
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user