Added the 3Com 3C503 Network card;

Several bug fixes;
Preliminar addition of the SDL 2 renderer (does not yet work correctly in full screen mode);
SCSI devices no longer have configurable LUN's (this matches the configurability of real SCSI devices);
SCSI LUN's are now handed by the device's handler;
Removed all unused strings;
Removed some unused code files;
Significantly rewrote the bus mouse emulation.
This commit is contained in:
OBattler
2018-07-15 01:41:53 +02:00
parent fe2ef61f84
commit 950ce8f5aa
74 changed files with 9930 additions and 9714 deletions

View File

@@ -9,7 +9,7 @@
* Implementation of the CD-ROM drive with SCSI(-like)
* commands, for both ATAPI and SCSI usage.
*
* Version: @(#)cdrom.c 1.0.47 2018/05/10
* Version: @(#)cdrom.c 1.0.48 2018/05/28
*
* Author: Miran Grca, <mgrca8@gmail.com>
*
@@ -62,22 +62,8 @@ cdrom_t *cdrom[CDROM_NUM];
cdrom_image_t cdrom_image[CDROM_NUM];
cdrom_drive_t cdrom_drives[CDROM_NUM];
uint8_t atapi_cdrom_drives[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
uint8_t scsi_cdrom_drives[16][8] = { { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } };
uint8_t scsi_cdrom_drives[16] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
#pragma pack(push,1)
@@ -106,90 +92,90 @@ static struct
/* Table of all SCSI commands and their flags, needed for the new disc change / not ready handler. */
const uint8_t cdrom_command_flags[0x100] =
{
IMPLEMENTED | CHECK_READY | NONDATA,
IMPLEMENTED | ALLOW_UA | NONDATA | SCSI_ONLY,
0,
IMPLEMENTED | ALLOW_UA,
0, 0, 0, 0,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED | CHECK_READY | NONDATA,
0, 0, 0, 0, 0, 0,
IMPLEMENTED | ALLOW_UA,
IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY,
0,
IMPLEMENTED,
0, 0, 0, 0,
IMPLEMENTED,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED | CHECK_READY,
0, 0, 0, 0, 0, 0,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED | CHECK_READY | NONDATA,
0, 0, 0,
IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,
IMPLEMENTED | CHECK_READY,
IMPLEMENTED | CHECK_READY, /* Read TOC - can get through UNIT_ATTENTION, per VIDE-CDD.SYS
IMPLEMENTED | CHECK_READY | NONDATA, /* 0x00 */
IMPLEMENTED | ALLOW_UA | NONDATA | SCSI_ONLY, /* 0x01 */
0, /* 0x02 */
IMPLEMENTED | ALLOW_UA, /* 0x03 */
0, 0, 0, 0, /* 0x04-0x07 */
IMPLEMENTED | CHECK_READY, /* 0x08 */
0, 0, /* 0x09-0x0A */
IMPLEMENTED | CHECK_READY | NONDATA, /* 0x0B */
0, 0, 0, 0, 0, 0, /* 0x0C-0x11 */
IMPLEMENTED | ALLOW_UA, /* 0x12 */
IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0x13 */
0, /* 0x14 */
IMPLEMENTED, /* 0x15 */
0, 0, 0, 0, /* 0x16-0x19 */
IMPLEMENTED, /* 0x1A */
IMPLEMENTED | CHECK_READY, /* 0x1B */
0, 0, /* 0x1C-0x1D */
IMPLEMENTED | CHECK_READY, /* 0x1E */
0, 0, 0, 0, 0, 0, /* 0x1F-0x24 */
IMPLEMENTED | CHECK_READY, /* 0x25 */
0, 0, /* 0x26-0x27 */
IMPLEMENTED | CHECK_READY, /* 0x28 */
0, 0, /* 0x29-0x2A */
IMPLEMENTED | CHECK_READY | NONDATA, /* 0x2B */
0, 0, 0, /* 0x2C-0x2E */
IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0x2F */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3F */
0, 0, /* 0x40-0x41 */
IMPLEMENTED | CHECK_READY, /* 0x42 */
IMPLEMENTED | CHECK_READY, /* 0x43 - Read TOC - can get through UNIT_ATTENTION, per VIDE-CDD.SYS
NOTE: The ATAPI reference says otherwise, but I think this is a question of
interpreting things right - the UNIT ATTENTION condition we have here
is a tradition from not ready to ready, by definition the drive
eventually becomes ready, make the condition go away. */
IMPLEMENTED | CHECK_READY,
IMPLEMENTED | CHECK_READY,
IMPLEMENTED | ALLOW_UA,
IMPLEMENTED | CHECK_READY,
IMPLEMENTED | CHECK_READY,
0,
IMPLEMENTED | ALLOW_UA,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED | CHECK_READY,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED,
0, 0, 0, 0,
IMPLEMENTED,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED | CHECK_READY,
0, 0, 0, 0,
IMPLEMENTED | CHECK_READY,
0,
IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY,
0, 0, 0, 0,
IMPLEMENTED | CHECK_READY | ATAPI_ONLY,
0, 0, 0,
IMPLEMENTED | CHECK_READY | ATAPI_ONLY,
IMPLEMENTED | CHECK_READY,
IMPLEMENTED | CHECK_READY,
IMPLEMENTED,
IMPLEMENTED | CHECK_READY,
IMPLEMENTED,
IMPLEMENTED | CHECK_READY,
IMPLEMENTED | CHECK_READY,
0, 0,
IMPLEMENTED | CHECK_READY | SCSI_ONLY,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
IMPLEMENTED | CHECK_READY | SCSI_ONLY,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
IMPLEMENTED | SCSI_ONLY,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
IMPLEMENTED | CHECK_READY, /* 0x44 */
IMPLEMENTED | CHECK_READY, /* 0x45 */
IMPLEMENTED | ALLOW_UA, /* 0x46 */
IMPLEMENTED | CHECK_READY, /* 0x47 */
IMPLEMENTED | CHECK_READY, /* 0x48 */
0, /* 0x49 */
IMPLEMENTED | ALLOW_UA, /* 0x4A */
IMPLEMENTED | CHECK_READY, /* 0x4B */
0, 0, /* 0x4C-0x4D */
IMPLEMENTED | CHECK_READY, /* 0x4E */
0, 0, /* 0x4F-0x50 */
IMPLEMENTED | CHECK_READY, /* 0x51 */
IMPLEMENTED | CHECK_READY, /* 0x52 */
0, 0, /* 0x53-0x54 */
IMPLEMENTED, /* 0x55 */
0, 0, 0, 0, /* 0x56-0x59 */
IMPLEMENTED, /* 0x5A */
0, 0, 0, 0, 0, /* 0x5B-0x5F */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6F */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7F */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8F */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9F */
0, 0, 0, 0, 0, /* 0xA0-0xA4 */
IMPLEMENTED | CHECK_READY, /* 0xA5 */
0, 0, /* 0xA6-0xA7 */
IMPLEMENTED | CHECK_READY, /* 0xA8 */
0, 0, 0, 0, /* 0xA9-0xAC */
IMPLEMENTED | CHECK_READY, /* 0xAD */
0, /* 0xAE */
IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0xAF */
0, 0, 0, 0, /* 0xB0-0xB3 */
IMPLEMENTED | CHECK_READY | ATAPI_ONLY, /* 0xB4 */
0, 0, 0, /* 0xB5-0xB7 */
IMPLEMENTED | CHECK_READY | ATAPI_ONLY, /* 0xB8 */
IMPLEMENTED | CHECK_READY, /* 0xB9 */
IMPLEMENTED | CHECK_READY, /* 0xBA */
IMPLEMENTED, /* 0xBB */
IMPLEMENTED | CHECK_READY, /* 0xBC */
IMPLEMENTED, /* 0xBD */
IMPLEMENTED | CHECK_READY, /* 0xBE */
IMPLEMENTED | CHECK_READY, /* 0xBF */
0, 0, /* 0xC0-0xC1 */
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC2 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC3-0xCC */
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCD */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xCE-0xD9 */
IMPLEMENTED | SCSI_ONLY, /* 0xDA */
0, 0, 0, 0, 0, /* 0xDB-0xDF */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0-0xEF */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 0xF0-0xFF */
};
static uint64_t cdrom_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE |
@@ -397,12 +383,12 @@ build_atapi_cdrom_map()
int
find_cdrom_for_scsi_id(uint8_t scsi_id, uint8_t scsi_lun)
find_cdrom_for_scsi_id(uint8_t scsi_id)
{
uint8_t i = 0;
for (i = 0; i < CDROM_NUM; i++) {
if ((cdrom_drives[i].bus_type == CDROM_BUS_SCSI) && (cdrom_drives[i].scsi_device_id == scsi_id) && (cdrom_drives[i].scsi_device_lun == scsi_lun))
if ((cdrom_drives[i].bus_type == CDROM_BUS_SCSI) && (cdrom_drives[i].scsi_device_id == scsi_id))
return i;
}
return 0xff;
@@ -413,15 +399,11 @@ void
build_scsi_cdrom_map()
{
uint8_t i = 0;
uint8_t j = 0;
memset(scsi_cdrom_drives, 0xff, 16);
for (i = 0; i < 16; i++)
memset(scsi_cdrom_drives[i], 0xff, 8);
for (i = 0; i < 16; i++) {
for (j = 0; j < 8; j++)
scsi_cdrom_drives[i][j] = find_cdrom_for_scsi_id(i, j);
}
scsi_cdrom_drives[i] = find_cdrom_for_scsi_id(i);
}
@@ -772,6 +754,8 @@ cdrom_update_request_length(cdrom_t *dev, int len, int block_len)
if ((len <= dev->max_transfer_len) && (len >= min_len))
dev->request_length = dev->max_transfer_len = len;
else if (len > dev->max_transfer_len)
dev->request_length = dev->max_transfer_len;
return;
}
@@ -1008,7 +992,7 @@ static void cdrom_data_command_finish(cdrom_t *dev, int len, int block_len, int
{
cdrom_log("CD-ROM %i: Finishing command (%02X): %i, %i, %i, %i, %i\n",
dev->id, dev->current_cdb[0], len, block_len, alloc_len, direction, dev->request_length);
dev->pos=0;
dev->pos = 0;
if (alloc_len >= 0) {
if (alloc_len < len)
len = alloc_len;
@@ -1053,12 +1037,11 @@ static void
cdrom_set_phase(cdrom_t *dev, uint8_t phase)
{
uint8_t scsi_id = dev->drv->scsi_device_id;
uint8_t scsi_lun = dev->drv->scsi_device_lun;
if (dev->drv->bus_type != CDROM_BUS_SCSI)
return;
SCSIDevices[scsi_id][scsi_lun].Phase = phase;
SCSIDevices[scsi_id].Phase = phase;
}
@@ -1482,7 +1465,7 @@ cdrom_pre_execution_check(cdrom_t *dev, uint8_t *cdb)
int ready = 0, status = 0;
if (dev->drv->bus_type == CDROM_BUS_SCSI) {
if (((dev->request_length >> 5) & 7) != dev->drv->scsi_device_lun) {
if ((cdb[0] != GPCMD_REQUEST_SENSE) && (cdb[1] & 0xe0)) {
cdrom_log("CD-ROM %i: Attempting to execute a unknown command targeted at SCSI LUN %i\n",
dev->id, ((dev->request_length >> 5) & 7));
cdrom_invalid_lun(dev);
@@ -1733,7 +1716,7 @@ cdrom_command(cdrom_t *dev, uint8_t *cdb)
uint32_t profiles[2] = { MMC_PROFILE_CD_ROM, MMC_PROFILE_DVD_ROM };
if (dev->drv->bus_type == CDROM_BUS_SCSI) {
BufLen = &SCSIDevices[dev->drv->scsi_device_id][dev->drv->scsi_device_lun].BufferLength;
BufLen = &SCSIDevices[dev->drv->scsi_device_id].BufferLength;
dev->status &= ~ERR_STAT;
} else {
BufLen = &blen;
@@ -2772,7 +2755,6 @@ cdrom_phase_data_out(cdrom_t *dev)
static void
cdrom_pio_request(cdrom_t *dev, uint8_t out)
{
int old_pos = 0;
int ret = 0;
if (dev->drv->bus_type < CDROM_BUS_SCSI) {
@@ -2807,10 +2789,13 @@ cdrom_pio_request(cdrom_t *dev, uint8_t out)
cdrom_log("CD-ROM %i: Packet length %i, request length %i\n", dev->id, dev->packet_len,
dev->max_transfer_len);
old_pos = dev->pos;
dev->packet_status = out ? CDROM_PHASE_DATA_OUT : CDROM_PHASE_DATA_IN;
cdrom_command_common(dev);
dev->pos = old_pos;
dev->status = BUSY_STAT;
dev->phase = 1;
cdrom_phase_callback(dev);
dev->callback = 0LL;
cdrom_set_callback(dev);
dev->request_pos = 0;
}
@@ -2849,12 +2834,12 @@ cdrom_read_from_ide_dma(uint8_t channel)
static int
cdrom_read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
cdrom_read_from_scsi_dma(uint8_t scsi_id)
{
cdrom_t *dev;
uint8_t id = scsi_cdrom_drives[scsi_id][scsi_lun];
int32_t *BufLen = &SCSIDevices[scsi_id][scsi_lun].BufferLength;
uint8_t id = scsi_cdrom_drives[scsi_id];
int32_t *BufLen = &SCSIDevices[scsi_id].BufferLength;
if (id > CDROM_NUM)
return 0;
@@ -2862,7 +2847,7 @@ cdrom_read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
dev = cdrom[id];
cdrom_log("Reading from SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, *BufLen);
memcpy(cdbufferb, SCSIDevices[scsi_id][scsi_lun].CmdBuffer, *BufLen);
memcpy(cdbufferb, SCSIDevices[scsi_id].CmdBuffer, *BufLen);
return 1;
}
@@ -2878,11 +2863,11 @@ cdrom_irq_raise(cdrom_t *dev)
static int
cdrom_read_from_dma(cdrom_t *dev)
{
int32_t *BufLen = &SCSIDevices[dev->drv->scsi_device_id][dev->drv->scsi_device_lun].BufferLength;
int32_t *BufLen = &SCSIDevices[dev->drv->scsi_device_id].BufferLength;
int ret = 0;
if (dev->drv->bus_type == CDROM_BUS_SCSI)
ret = cdrom_read_from_scsi_dma(dev->drv->scsi_device_id, dev->drv->scsi_device_lun);
ret = cdrom_read_from_scsi_dma(dev->drv->scsi_device_id);
else
ret = cdrom_read_from_ide_dma(dev->drv->ide_channel);
@@ -2933,12 +2918,12 @@ cdrom_write_to_ide_dma(uint8_t channel)
static int
cdrom_write_to_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
cdrom_write_to_scsi_dma(uint8_t scsi_id)
{
cdrom_t *dev;
uint8_t id = scsi_cdrom_drives[scsi_id][scsi_lun];
int32_t *BufLen = &SCSIDevices[scsi_id][scsi_lun].BufferLength;
uint8_t id = scsi_cdrom_drives[scsi_id];
int32_t *BufLen = &SCSIDevices[scsi_id].BufferLength;
if (id > CDROM_NUM)
return 0;
@@ -2946,15 +2931,15 @@ cdrom_write_to_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
dev = cdrom[id];
cdrom_log("Writing to SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, *BufLen);
memcpy(SCSIDevices[scsi_id][scsi_lun].CmdBuffer, cdbufferb, *BufLen);
memcpy(SCSIDevices[scsi_id].CmdBuffer, cdbufferb, *BufLen);
cdrom_log("CD-ROM %i: Data from CD buffer: %02X %02X %02X %02X %02X %02X %02X %02X\n", id,
cdbufferb[0], cdbufferb[1], cdbufferb[2], cdbufferb[3], cdbufferb[4], cdbufferb[5],
cdbufferb[6], cdbufferb[7]);
cdrom_log("CD-ROM %i: Data from SCSI DMA : %02X %02X %02X %02X %02X %02X %02X %02X\n", id,
SCSIDevices[scsi_id][scsi_lun].CmdBuffer[0], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[1],
SCSIDevices[scsi_id][scsi_lun].CmdBuffer[2], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[3],
SCSIDevices[scsi_id][scsi_lun].CmdBuffer[4], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[5],
SCSIDevices[scsi_id][scsi_lun].CmdBuffer[6], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[7]);
SCSIDevices[scsi_id].CmdBuffer[0], SCSIDevices[scsi_id].CmdBuffer[1],
SCSIDevices[scsi_id].CmdBuffer[2], SCSIDevices[scsi_id].CmdBuffer[3],
SCSIDevices[scsi_id].CmdBuffer[4], SCSIDevices[scsi_id].CmdBuffer[5],
SCSIDevices[scsi_id].CmdBuffer[6], SCSIDevices[scsi_id].CmdBuffer[7]);
return 1;
}
@@ -2962,12 +2947,12 @@ cdrom_write_to_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
static int
cdrom_write_to_dma(cdrom_t *dev)
{
int32_t *BufLen = &SCSIDevices[dev->drv->scsi_device_id][dev->drv->scsi_device_lun].BufferLength;
int32_t *BufLen = &SCSIDevices[dev->drv->scsi_device_id].BufferLength;
int ret = 0;
if (dev->drv->bus_type == CDROM_BUS_SCSI) {
cdrom_log("Write to SCSI DMA: (%02X:%02X)\n", dev->drv->scsi_device_id, dev->drv->scsi_device_lun);
ret = cdrom_write_to_scsi_dma(dev->drv->scsi_device_id, dev->drv->scsi_device_lun);
cdrom_log("Write to SCSI DMA: (ID %02X)\n", dev->drv->scsi_device_id);
ret = cdrom_write_to_scsi_dma(dev->drv->scsi_device_id);
} else
ret = cdrom_write_to_ide_dma(dev->drv->ide_channel);
@@ -2980,7 +2965,6 @@ cdrom_write_to_dma(cdrom_t *dev)
}
/* If the result is 1, issue an IRQ, otherwise not. */
void
cdrom_phase_callback(cdrom_t *dev)
{
@@ -2989,13 +2973,13 @@ cdrom_phase_callback(cdrom_t *dev)
switch(dev->packet_status) {
case CDROM_PHASE_IDLE:
cdrom_log("CD-ROM %i: CDROM_PHASE_IDLE\n", dev->id);
dev->pos=0;
dev->pos = 0;
dev->phase = 1;
dev->status = READY_STAT | DRQ_STAT | (dev->status & ERR_STAT);
return;
case CDROM_PHASE_COMMAND:
cdrom_log("CD-ROM %i: CDROM_PHASE_COMMAND\n", dev->id);
dev->status = BUSY_STAT | (dev->status &ERR_STAT);
dev->status = BUSY_STAT | (dev->status & ERR_STAT);
memcpy(dev->atapi_cdb, cdbufferb, dev->cdb_len);
cdrom_command(dev, dev->atapi_cdb);
return;
@@ -3040,14 +3024,14 @@ cdrom_phase_callback(cdrom_t *dev)
ret = cdrom_write_to_dma(dev);
if ((ret == 1) || (dev->drv->bus_type == CDROM_BUS_SCSI)) {
cdrom_log("CD-ROM %i: DMA data in phase done\n");
cdrom_log("CD-ROM %i: DMA data in phase done\n", dev->id);
cdrom_buf_free(dev);
cdrom_command_complete(dev);
} else if (ret == 2) {
cdrom_log("CD-ROM %i: DMA in not enabled, wait\n");
cdrom_log("CD-ROM %i: DMA in not enabled, wait\n", dev->id);
cdrom_command_bus(dev);
} else {
cdrom_log("CD-ROM %i: DMA data in phase failure\n");
cdrom_log("CD-ROM %i: DMA data in phase failure\n", dev->id);
cdrom_buf_free(dev);
}
return;
@@ -3109,17 +3093,17 @@ cdrom_read(uint8_t channel, int length)
}
if (dev->packet_status == CDROM_PHASE_DATA_IN) {
cdrom_log("CD-ROM %i: Returning: %04X (buffer position: %05i, request position: %05i)\n",
id, temp, (dev->pos - 2) & 0xffff, (dev->request_pos - 2) & 0xffff);
if ((dev->request_pos >= dev->max_transfer_len) || (dev->pos >= dev->packet_len)) {
/* Time for a DRQ. */
cdrom_log("CD-ROM %i: Issuing read callback\n", id);
cdrom_pio_request(dev, 0);
}
cdrom_log("CD-ROM %i: Returning: %02X (buffer position: %i, request position: %i)\n", id,
temp, dev->pos, dev->request_pos);
return temp;
} else {
cdrom_log("CD-ROM %i: Returning zero (buffer position: %i, request position: %i)\n", id,
dev->pos, dev->request_pos);
cdrom_log("CD-ROM %i: Returning: 0000 (buffer position: %05i, request position: %05i)\n",
id, (dev->pos - 2) & 0xffff, (dev->request_pos - 2) & 0xffff);
return 0;
}
}
@@ -3169,7 +3153,6 @@ cdrom_write(uint8_t channel, uint32_t val, int length)
return;
}
cdrom_log("CD-ROM %i: Write: %u\n", id, dev->pos);
if (dev->packet_status == CDROM_PHASE_DATA_OUT) {
if ((dev->request_pos >= dev->max_transfer_len) || (dev->pos >= dev->packet_len)) {
/* Time for a DRQ. */
@@ -3178,8 +3161,7 @@ cdrom_write(uint8_t channel, uint32_t val, int length)
return;
} else if (dev->packet_status == CDROM_PHASE_IDLE) {
if (dev->pos >= dev->cdb_len) {
cdrom_log("CD-ROM %i: Write: %u > 12\n", id, dev->pos);
dev->pos=0;
dev->pos = 0;
dev->status = BUSY_STAT;
dev->packet_status = CDROM_PHASE_COMMAND;
timer_process();
@@ -3198,10 +3180,6 @@ cdrom_global_init(void)
/* Clear the global data. */
memset(cdrom, 0x00, sizeof(cdrom));
memset(cdrom_drives, 0x00, sizeof(cdrom_drives));
/* Set all drives to NULL mode. */
/* If this even needed? cdrom_hard_reset() is called before anything
attempts to talk to it, and that intializes everything. */
}
@@ -3213,7 +3191,7 @@ cdrom_hard_reset(void)
for (c = 0; c < CDROM_NUM; c++) {
if (cdrom_drives[c].bus_type) {
cdrom_log("CDROM hard_reset drive=%d host=%02x\n", c, cdrom_drives[c].host_drive);
cdrom_log("CDROM hard_reset drive=%d\n", c);
if (!cdrom[c]) {
cdrom[c] = (cdrom_t *) malloc(sizeof(cdrom_t));