--- BasiliskII/src/AmigaOS/scsi_amiga.cpp 2002/06/23 08:27:05 1.7 +++ BasiliskII/src/AmigaOS/scsi_amiga.cpp 2002/09/01 12:01:46 1.8 @@ -53,6 +53,8 @@ static UBYTE cmd_buffer[12]; // Buffer const int SENSE_LENGTH = 256; static UBYTE *sense_buffer = NULL; // Buffer for autosense data +static bool direct_transfers_supported = false; // Direct data transfers (bypassing the buffer) are supported + /* * Initialization @@ -69,6 +71,7 @@ void SCSIInit(void) break; case 2: buffer_memf = MEMF_ANY | MEMF_PUBLIC; + direct_transfers_supported = true; break; default: buffer_memf = MEMF_CHIP | MEMF_PUBLIC; @@ -212,23 +215,29 @@ bool scsi_set_target(int id, int lun) bool scsi_send_cmd(size_t data_length, bool reading, int sg_size, uint8 **sg_ptr, uint32 *sg_len, uint16 *stat, uint32 timeout) { - // Check if buffer is large enough, allocate new buffer if needed - if (!try_buffer(data_length)) { - char str[256]; - sprintf(str, GetString(STR_SCSI_BUFFER_ERR), data_length); - ErrorAlert(str); - return false; - } + // Bypass the buffer if there's only one S/G table entry + bool do_direct_transfer = (sg_size == 1 && ((uint32)sg_ptr[0] & 1) == 0 && direct_transfers_supported); + + if (!do_direct_transfer) { + + // Check if buffer is large enough, allocate new buffer if needed + if (!try_buffer(data_length)) { + char str[256]; + sprintf(str, GetString(STR_SCSI_BUFFER_ERR), data_length); + ErrorAlert(str); + return false; + } - // Process S/G table when writing - if (!reading) { - D(bug(" writing to buffer\n")); - uint8 *buffer_ptr = buffer; - for (int i=0; i