Skip to content

Commit

Permalink
alternative sector size supported
Browse files Browse the repository at this point in the history
this let's .BIN files get used at the very least, maybe more depending
on how some of the other optical formats look
reverted a small SCSI phase change that causes problems
  • Loading branch information
Troy committed Jul 23, 2022
1 parent 30b794e commit 3a3d68c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 25 deletions.
33 changes: 18 additions & 15 deletions src/BlueSCSI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,8 +215,9 @@ bool VerifyISOPVD(SCSI_DEVICE *dev, unsigned sector_size, bool mode2)
bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)
{
dev->m_fileSize= 0;
dev->m_offset = 0;
dev->m_sector_offset = 0;
dev->m_blocksize = blocksize;
dev->m_rawblocksize = blocksize;
dev->m_file = file;
if(!dev->m_file->isOpen()) { goto failed; }

Expand All @@ -229,25 +230,25 @@ bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)

if(dev->m_type == SCSI_DEVICE_OPTICAL) {
LOG_FILE.print(" CDROM");
dev->m_blocksize = CDROM_COMMON_SECTORSIZE;

// Borrowed from PCEM
if(VerifyISOPVD(dev, CDROM_COMMON_SECTORSIZE, false)) {
dev->m_blocksize = CDROM_COMMON_SECTORSIZE;
dev->m_rawblocksize = CDROM_COMMON_SECTORSIZE;
dev->m_mode2 = false;
} else if(VerifyISOPVD(dev, CDROM_RAW_SECTORSIZE, false)) {
dev->m_blocksize = CDROM_RAW_SECTORSIZE;
dev->m_rawblocksize = CDROM_COMMON_SECTORSIZE;
dev->m_rawblocksize = CDROM_RAW_SECTORSIZE;
dev->m_mode2 = false;
dev->m_raw = true;
dev->m_offset = 16;
dev->m_sector_offset = 16;
} else if(VerifyISOPVD(dev, 2336, true)) {
dev->m_blocksize = 2336;
dev->m_rawblocksize = 2336;
dev->m_mode2 = true;
} else if(VerifyISOPVD(dev, CDROM_RAW_SECTORSIZE, true)) {
dev->m_blocksize = CDROM_RAW_SECTORSIZE;
dev->m_rawblocksize = CDROM_RAW_SECTORSIZE;
dev->m_mode2 = true;
dev->m_raw = true;
dev->m_offset = 16;
dev->m_sector_offset = 24;
} else {
// Last ditch effort
// size must be less than 700MB
Expand Down Expand Up @@ -282,7 +283,7 @@ bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)

if(dev->m_type == SCSI_DEVICE_OPTICAL) {
LOG_FILE.print(" MODE2:");LOG_FILE.print(dev->m_mode2);
LOG_FILE.print(" BlockSize:");LOG_FILE.println(dev->m_blocksize);
LOG_FILE.print(" BlockSize:");LOG_FILE.println(dev->m_rawblocksize);
}
return true; // File opened

Expand Down Expand Up @@ -927,7 +928,7 @@ void writeDataPhaseSD(SCSI_DEVICE *dev, uint32_t adds, uint32_t len)
LOG (" DI(SD) ");
SCSI_PHASE_CHANGE(SCSI_PHASE_DATAIN);
//Bus settle delay 400ns, file.seek() measured at over 1000ns.
uint64_t pos = (uint64_t)adds * dev->m_blocksize;
uint64_t pos = (uint64_t)adds * dev->m_rawblocksize;
dev->m_file->seekSet(pos);
#ifdef XCVR
TRANSCEIVER_IO_SET(vTR_DBP,TR_OUTPUT)
Expand All @@ -937,10 +938,10 @@ void writeDataPhaseSD(SCSI_DEVICE *dev, uint32_t adds, uint32_t len)
for(uint32_t i = 0; i < len; i++) {
// Asynchronous reads will make it faster ...
m_resetJmp = false;
dev->m_file->read(m_buf, dev->m_blocksize);
dev->m_file->read(m_buf, dev->m_rawblocksize);
enableResetJmp();

writeDataLoop(dev->m_blocksize, m_buf);
writeDataLoop(dev->m_blocksize, &m_buf[dev->m_sector_offset]);
}
}

Expand Down Expand Up @@ -1073,11 +1074,12 @@ void loop()
m_lun = 0xff;
SCSI_DEVICE *dev = (SCSI_DEVICE *)0; // HDD image for current SCSI-ID, LUN

do {} while( !SCSI_IN(vBSY) || SCSI_IN(vRST));
do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
//do {} while( !SCSI_IN(vBSY) || SCSI_IN(vRST));
// We're in ARBITRATION
//LOG(" A:"); LOGHEX(readIO()); LOG(" ");

do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
//do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
//LOG(" S:"); LOGHEX(readIO()); LOG(" ");
// We're in SELECTION

Expand Down Expand Up @@ -1368,6 +1370,7 @@ byte onReadCapacity(SCSI_DEVICE *dev, const byte *cdb)
(byte)(dev->m_blocksize >> 8),
(byte)(dev->m_blocksize)
};

writeDataPhase(sizeof(buf), buf);
return SCSI_STATUS_GOOD;
}
Expand Down Expand Up @@ -1552,7 +1555,7 @@ byte onModeSense(SCSI_DEVICE *dev, const byte *cdb)
0, //Reserve
(byte)(dev->m_blocksize >> 16),
(byte)(dev->m_blocksize >> 8),
(byte)(dev->m_blocksize),
(byte)(dev->m_blocksize),
};
memcpy(&m_buf[a], c, 8);
a += 8;
Expand Down
20 changes: 10 additions & 10 deletions src/BlueSCSI.h
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ enum SCSI_DEVICE_TYPE
// Put DB and DP in output mode
#define SCSI_DB_OUTPUT() { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_OUT; PBREG->CRH = 0x11111111*DB_MODE_OUT; }
// Put DB and DP in input mode
#define SCSI_DB_INPUT() { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_IN ; PBREG->CRH = (uint32_t)0x11111111*DB_MODE_IN; }
#define SCSI_DB_INPUT() { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_IN ; PBREG->CRH = (uint32_t)(0x11111111*DB_MODE_IN); }

// HDDiamge file
#define HDIMG_ID_POS 2 // Position to embed ID number
Expand Down Expand Up @@ -311,18 +311,18 @@ struct SCSI_INQUIRY_DATA
// HDD image
typedef __attribute__((aligned(4))) struct _SCSI_DEVICE
{
FsFile *m_file; // File object
uint64_t m_fileSize; // File size
uint16_t m_blocksize; // SCSI BLOCK size
uint16_t m_rawblocksize;
uint8_t m_type; // SCSI device type
uint32_t m_blockcount; // blockcount
bool m_raw; // Raw disk
SCSI_INQUIRY_DATA *inquiry_block; // SCSI information
FsFile *m_file; // File object
uint64_t m_fileSize; // File size
uint16_t m_blocksize; // SCSI BLOCK size
uint16_t m_rawblocksize; // OPTICAL raw sector size
uint8_t m_type; // SCSI device type
uint32_t m_blockcount; // blockcount
bool m_raw; // Raw disk
SCSI_INQUIRY_DATA *inquiry_block; // SCSI information
uint8_t m_senseKey; // Sense key
uint16_t m_additional_sense_code; // ASC/ASCQ
bool m_mode2; // MODE2 CDROM
uint8_t m_offset; // ISO offset for missing sync header
uint8_t m_sector_offset; // optical sector offset for missing sync header
} SCSI_DEVICE;


Expand Down

0 comments on commit 3a3d68c

Please sign in to comment.