More CD-ROM fixes, Little Big Adventure now looks again;
Made SCAT logging optional and disabled by default.
This commit is contained in:
@@ -10,7 +10,7 @@
|
|||||||
# settings, so we can avoid changing the main one for all of
|
# settings, so we can avoid changing the main one for all of
|
||||||
# our local setups.
|
# our local setups.
|
||||||
#
|
#
|
||||||
# Version: @(#)Makefile.local 1.0.9 2017/12/28
|
# Version: @(#)Makefile.local 1.0.10 2018/03/20
|
||||||
#
|
#
|
||||||
# Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
# Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
#
|
#
|
||||||
@@ -39,11 +39,14 @@ STUFF :=
|
|||||||
# -DENABLE_KEYBOARD_LOG=N sets logging level at N.
|
# -DENABLE_KEYBOARD_LOG=N sets logging level at N.
|
||||||
# -DENABLE_PCI_LOG=N sets logging level at N.
|
# -DENABLE_PCI_LOG=N sets logging level at N.
|
||||||
# -DENABLE_CDROM_LOG=N sets logging level at N.
|
# -DENABLE_CDROM_LOG=N sets logging level at N.
|
||||||
|
# -DENABLE_CDROM_IMAGE_LOG=N sets logging level at N.
|
||||||
|
# -DENABLE_CDROM_IOCTL_LOG=N sets logging level at N.
|
||||||
# -DENABLE_HDD_LOG=N sets logging level at N.
|
# -DENABLE_HDD_LOG=N sets logging level at N.
|
||||||
# -DENABLE_IDE_LOG=N sets logging level at N.
|
# -DENABLE_IDE_LOG=N sets logging level at N.
|
||||||
# -DENABLE_FDC_LOG=N sets logging level at N.
|
# -DENABLE_FDC_LOG=N sets logging level at N.
|
||||||
# -DENABLE_D86F_LOG=N sets logging level at N.
|
# -DENABLE_D86F_LOG=N sets logging level at N.
|
||||||
# -DENABLE_NIC_LOG=N sets logging level at N.
|
# -DENABLE_NIC_LOG=N sets logging level at N.
|
||||||
|
# -DENABLE_SCAT_LOG=N sets logging level at N.
|
||||||
# -DENABLE_SCSI_BUS_LOG=N sets logging level at N.
|
# -DENABLE_SCSI_BUS_LOG=N sets logging level at N.
|
||||||
# -DENABLE_SCSI_DISK_LOG=N sets logging level at N.
|
# -DENABLE_SCSI_DISK_LOG=N sets logging level at N.
|
||||||
# -DENABLE_X54X_LOG=N sets logging level at N.
|
# -DENABLE_X54X_LOG=N sets logging level at N.
|
||||||
|
|||||||
@@ -9,12 +9,13 @@
|
|||||||
* Implementation of the CD-ROM drive with SCSI(-like)
|
* Implementation of the CD-ROM drive with SCSI(-like)
|
||||||
* commands, for both ATAPI and SCSI usage.
|
* commands, for both ATAPI and SCSI usage.
|
||||||
*
|
*
|
||||||
* Version: @(#)cdrom.c 1.0.43 2018/03/20
|
* Version: @(#)cdrom.c 1.0.44 2018/03/21
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
* Copyright 2016-2018 Miran Grca.
|
* Copyright 2016-2018 Miran Grca.
|
||||||
*/
|
*/
|
||||||
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -732,6 +733,8 @@ void cdrom_update_request_length(uint8_t id, int len, int block_len)
|
|||||||
cdrom_t *dev = cdrom[id];
|
cdrom_t *dev = cdrom[id];
|
||||||
uint32_t bt;
|
uint32_t bt;
|
||||||
|
|
||||||
|
uint32_t min_len = 0;
|
||||||
|
|
||||||
dev->max_transfer_len = dev->request_length;
|
dev->max_transfer_len = dev->request_length;
|
||||||
|
|
||||||
/* For media access commands, make sure the requested DRQ length matches the block length. */
|
/* For media access commands, make sure the requested DRQ length matches the block length. */
|
||||||
@@ -741,11 +744,23 @@ void cdrom_update_request_length(uint8_t id, int len, int block_len)
|
|||||||
case 0xa8:
|
case 0xa8:
|
||||||
case 0xb9:
|
case 0xb9:
|
||||||
case 0xbe:
|
case 0xbe:
|
||||||
if (dev->max_transfer_len < block_len)
|
/* Make sure total length is not bigger than sum of the lengths of
|
||||||
dev->max_transfer_len = block_len;
|
all the requested blocks. */
|
||||||
bt = (dev->requested_blocks * block_len);
|
bt = (dev->requested_blocks * block_len);
|
||||||
if (len > bt)
|
if (len > bt)
|
||||||
len = bt;
|
len = bt;
|
||||||
|
|
||||||
|
min_len = block_len;
|
||||||
|
|
||||||
|
if (len <= block_len) {
|
||||||
|
/* Total length is less or equal to block length. */
|
||||||
|
if (dev->max_transfer_len < block_len) {
|
||||||
|
/* Transfer a minimum of (block size) bytes. */
|
||||||
|
dev->max_transfer_len = block_len;
|
||||||
|
dev->packet_len = block_len;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
dev->packet_len = len;
|
dev->packet_len = len;
|
||||||
break;
|
break;
|
||||||
@@ -756,14 +771,18 @@ void cdrom_update_request_length(uint8_t id, int len, int block_len)
|
|||||||
/* If the DRQ length is smaller or equal in size to the total remaining length, set it to that. */
|
/* If the DRQ length is smaller or equal in size to the total remaining length, set it to that. */
|
||||||
if (!dev->max_transfer_len)
|
if (!dev->max_transfer_len)
|
||||||
dev->max_transfer_len = 65534;
|
dev->max_transfer_len = 65534;
|
||||||
if (len <= dev->max_transfer_len)
|
|
||||||
dev->max_transfer_len = len;
|
if ((len <= dev->max_transfer_len) && (len >= min_len)) {
|
||||||
|
dev->request_length = dev->max_transfer_len = len;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double cdrom_get_short_seek(uint8_t id)
|
static double cdrom_get_short_seek(uint8_t id)
|
||||||
{
|
{
|
||||||
switch(cdrom_drives[id].speed) {
|
cdrom_t *dev = cdrom[id];
|
||||||
|
|
||||||
|
switch(dev->cur_speed) {
|
||||||
case 0:
|
case 0:
|
||||||
fatal("CD-ROM %i: 0x speed\n", id);
|
fatal("CD-ROM %i: 0x speed\n", id);
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@@ -793,7 +812,9 @@ static double cdrom_get_short_seek(uint8_t id)
|
|||||||
|
|
||||||
static double cdrom_get_long_seek(uint8_t id)
|
static double cdrom_get_long_seek(uint8_t id)
|
||||||
{
|
{
|
||||||
switch(cdrom_drives[id].speed) {
|
cdrom_t *dev = cdrom[id];
|
||||||
|
|
||||||
|
switch(dev->cur_speed) {
|
||||||
case 0:
|
case 0:
|
||||||
fatal("CD-ROM %i: 0x speed\n", id);
|
fatal("CD-ROM %i: 0x speed\n", id);
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@@ -857,6 +878,17 @@ static double cdrom_bus_speed(uint8_t id)
|
|||||||
return 3333333.333333333333333; /* 3.3 MB/s PIO-0 speed */
|
return 3333333.333333333333333; /* 3.3 MB/s PIO-0 speed */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cdrom_command_bus(uint8_t id)
|
||||||
|
{
|
||||||
|
cdrom_t *dev = cdrom[id];
|
||||||
|
|
||||||
|
dev->status = BUSY_STAT;
|
||||||
|
dev->phase = 1;
|
||||||
|
dev->pos = 0;
|
||||||
|
dev->callback = 1LL * CDROM_TIME;
|
||||||
|
cdrom_set_callback(id);
|
||||||
|
}
|
||||||
|
|
||||||
static void cdrom_command_common(uint8_t id)
|
static void cdrom_command_common(uint8_t id)
|
||||||
{
|
{
|
||||||
cdrom_t *dev = cdrom[id];
|
cdrom_t *dev = cdrom[id];
|
||||||
@@ -868,6 +900,9 @@ static void cdrom_command_common(uint8_t id)
|
|||||||
dev->phase = 1;
|
dev->phase = 1;
|
||||||
dev->pos = 0;
|
dev->pos = 0;
|
||||||
dev->callback = 0LL;
|
dev->callback = 0LL;
|
||||||
|
|
||||||
|
cdrom_log("CD-ROM %i: Current speed: %ix\n", id, dev->cur_speed);
|
||||||
|
|
||||||
if (dev->packet_status == CDROM_PHASE_COMPLETE) {
|
if (dev->packet_status == CDROM_PHASE_COMPLETE) {
|
||||||
cdrom_phase_callback(id);
|
cdrom_phase_callback(id);
|
||||||
dev->callback = 0LL;
|
dev->callback = 0LL;
|
||||||
@@ -880,6 +915,7 @@ static void cdrom_command_common(uint8_t id)
|
|||||||
period = cdrom_seek_time(id) * ((double) TIMER_USEC);
|
period = cdrom_seek_time(id) * ((double) TIMER_USEC);
|
||||||
dev->callback += ((int64_t) period);
|
dev->callback += ((int64_t) period);
|
||||||
cdrom_set_callback(id);
|
cdrom_set_callback(id);
|
||||||
|
cdrom_log("CD-ROM %i: Seek period: %" PRIu64 " us\n", id, (int64_t) cdrom_seek_time(id));
|
||||||
return;
|
return;
|
||||||
case 0x08:
|
case 0x08:
|
||||||
case 0x28:
|
case 0x28:
|
||||||
@@ -887,6 +923,7 @@ static void cdrom_command_common(uint8_t id)
|
|||||||
/* Seek time is in us. */
|
/* Seek time is in us. */
|
||||||
period = cdrom_seek_time(id) * ((double) TIMER_USEC);
|
period = cdrom_seek_time(id) * ((double) TIMER_USEC);
|
||||||
dev->callback += ((int64_t) period);
|
dev->callback += ((int64_t) period);
|
||||||
|
cdrom_log("CD-ROM %i: Seek period: %" PRIu64 " us\n", id, (int64_t) cdrom_seek_time(id));
|
||||||
case 0x25:
|
case 0x25:
|
||||||
case 0x42:
|
case 0x42:
|
||||||
case 0x43:
|
case 0x43:
|
||||||
@@ -898,7 +935,8 @@ static void cdrom_command_common(uint8_t id)
|
|||||||
case 0xb9:
|
case 0xb9:
|
||||||
case 0xbe:
|
case 0xbe:
|
||||||
/* bytes_per_second = 150.0 * 1024.0; */
|
/* bytes_per_second = 150.0 * 1024.0; */
|
||||||
bytes_per_second = (1000000.0 / 12000.0) * 2048.0; /* Account for seek time. */
|
/* bytes_per_second = (1000000.0 / 12000.0) * 2048.0; */ /* Account for seek time. */
|
||||||
|
bytes_per_second = 176.0 * 1024.0;
|
||||||
bytes_per_second *= (double) dev->cur_speed;
|
bytes_per_second *= (double) dev->cur_speed;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -911,8 +949,10 @@ static void cdrom_command_common(uint8_t id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
period = 1000000.0 / bytes_per_second;
|
period = 1000000.0 / bytes_per_second;
|
||||||
dusec = (double) TIMER_USEC;
|
cdrom_log("CD-ROM %i: Byte transfer period: %" PRIu64 " us\n", id, (int64_t) period);
|
||||||
dusec = dusec * period * (double) (dev->packet_len);
|
period = period * (double) (dev->packet_len);
|
||||||
|
cdrom_log("CD-ROM %i: Sector transfer period: %" PRIu64 " us\n", id, (int64_t) period);
|
||||||
|
dusec = period * ((double) TIMER_USEC);
|
||||||
dev->callback += ((int64_t) dusec);
|
dev->callback += ((int64_t) dusec);
|
||||||
}
|
}
|
||||||
cdrom_set_callback(id);
|
cdrom_set_callback(id);
|
||||||
@@ -2443,7 +2483,7 @@ cdrom_readtoc_fallback:
|
|||||||
max_len |= cdb[8];
|
max_len |= cdb[8];
|
||||||
msf = (cdb[1] >> 1) & 1;
|
msf = (cdb[1] >> 1) & 1;
|
||||||
|
|
||||||
cdrom_buf_alloc(id, 65536);
|
cdrom_buf_alloc(id, 32);
|
||||||
|
|
||||||
cdrom_log("CD-ROM %i: Getting page %i (%s)\n", id, cdb[3], msf ? "MSF" : "LBA");
|
cdrom_log("CD-ROM %i: Getting page %i (%s)\n", id, cdb[3], msf ? "MSF" : "LBA");
|
||||||
if ((cdrom_drives[id].handler->pass_through) && (cdb[3] != 1)) {
|
if ((cdrom_drives[id].handler->pass_through) && (cdb[3] != 1)) {
|
||||||
@@ -2533,6 +2573,13 @@ cdrom_readtoc_fallback:
|
|||||||
len = MIN(len, max_len);
|
len = MIN(len, max_len);
|
||||||
cdrom_set_buf_len(id, BufLen, &len);
|
cdrom_set_buf_len(id, BufLen, &len);
|
||||||
|
|
||||||
|
cdrom_log("CD-ROM %i: Read subchannel:", id);
|
||||||
|
for (i = 0; i < 32; i += 8) {
|
||||||
|
pclog("[%02X] %02X %02X %02X %02X %02X %02X %02X %02X\n", i,
|
||||||
|
cdbufferb[i], cdbufferb[i + 1], cdbufferb[i + 2], cdbufferb[i + 3],
|
||||||
|
cdbufferb[i + 4], cdbufferb[i + 5], cdbufferb[i + 6], cdbufferb[i + 7]);
|
||||||
|
}
|
||||||
|
|
||||||
cdrom_data_command_finish(id, len, len, len, 0);
|
cdrom_data_command_finish(id, len, len, len, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2983,7 +3030,6 @@ int cdrom_read_from_dma(uint8_t id)
|
|||||||
cdrom_t *dev = cdrom[id];
|
cdrom_t *dev = cdrom[id];
|
||||||
|
|
||||||
int32_t *BufLen = &SCSIDevices[cdrom_drives[id].scsi_device_id][cdrom_drives[id].scsi_device_lun].BufferLength;
|
int32_t *BufLen = &SCSIDevices[cdrom_drives[id].scsi_device_id][cdrom_drives[id].scsi_device_lun].BufferLength;
|
||||||
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
|
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
|
||||||
@@ -3001,18 +3047,9 @@ int cdrom_read_from_dma(uint8_t id)
|
|||||||
|
|
||||||
ret = cdrom_phase_data_out(id);
|
ret = cdrom_phase_data_out(id);
|
||||||
|
|
||||||
if (ret || (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)) {
|
if (ret)
|
||||||
cdrom_buf_free(id);
|
return 1;
|
||||||
dev->packet_status = CDROM_PHASE_COMPLETE;
|
else
|
||||||
dev->status = READY_STAT;
|
|
||||||
dev->phase = 3;
|
|
||||||
ui_sb_update_icon(SB_CDROM | id, 0);
|
|
||||||
cdrom_irq_raise(id);
|
|
||||||
if (ret)
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
} else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3059,6 +3096,7 @@ int cdrom_write_to_dma(uint8_t id)
|
|||||||
{
|
{
|
||||||
cdrom_t *dev = cdrom[id];
|
cdrom_t *dev = cdrom[id];
|
||||||
|
|
||||||
|
int32_t *BufLen = &SCSIDevices[cdrom_drives[id].scsi_device_id][cdrom_drives[id].scsi_device_lun].BufferLength;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI) {
|
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI) {
|
||||||
@@ -3067,18 +3105,14 @@ int cdrom_write_to_dma(uint8_t id)
|
|||||||
} else
|
} else
|
||||||
ret = cdrom_write_to_ide_dma(cdrom_drives[id].ide_channel);
|
ret = cdrom_write_to_ide_dma(cdrom_drives[id].ide_channel);
|
||||||
|
|
||||||
if (ret || (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)) {
|
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
|
||||||
cdrom_buf_free(id);
|
cdrom_log("CD-ROM %i: SCSI Output data length: %i\n", id, *BufLen);
|
||||||
dev->packet_status = CDROM_PHASE_COMPLETE;
|
else
|
||||||
dev->status = READY_STAT;
|
cdrom_log("CD-ROM %i: ATAPI Output data length: %i\n", id, dev->packet_len);
|
||||||
dev->phase = 3;
|
|
||||||
ui_sb_update_icon(SB_CDROM | id, 0);
|
if (ret)
|
||||||
cdrom_irq_raise(id);
|
return 1;
|
||||||
if (ret)
|
else
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
} else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3086,6 +3120,7 @@ int cdrom_write_to_dma(uint8_t id)
|
|||||||
void cdrom_phase_callback(uint8_t id)
|
void cdrom_phase_callback(uint8_t id)
|
||||||
{
|
{
|
||||||
cdrom_t *dev = cdrom[id];
|
cdrom_t *dev = cdrom[id];
|
||||||
|
int ret;
|
||||||
|
|
||||||
switch(dev->packet_status) {
|
switch(dev->packet_status) {
|
||||||
case CDROM_PHASE_IDLE:
|
case CDROM_PHASE_IDLE:
|
||||||
@@ -3116,7 +3151,17 @@ void cdrom_phase_callback(uint8_t id)
|
|||||||
return;
|
return;
|
||||||
case CDROM_PHASE_DATA_OUT_DMA:
|
case CDROM_PHASE_DATA_OUT_DMA:
|
||||||
cdrom_log("CD-ROM %i: CDROM_PHASE_DATA_OUT_DMA\n", id);
|
cdrom_log("CD-ROM %i: CDROM_PHASE_DATA_OUT_DMA\n", id);
|
||||||
cdrom_read_from_dma(id);
|
ret = cdrom_read_from_dma(id);
|
||||||
|
cdrom_command_complete(id);
|
||||||
|
|
||||||
|
if (ret || (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)) {
|
||||||
|
cdrom_log("CD-ROM %i: DMA data out phase done\n");
|
||||||
|
cdrom_buf_free(id);
|
||||||
|
cdrom_command_complete(id);
|
||||||
|
} else {
|
||||||
|
cdrom_log("CD-ROM %i: DMA data out phase failure\n");
|
||||||
|
cdrom_command_bus(id);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case CDROM_PHASE_DATA_IN:
|
case CDROM_PHASE_DATA_IN:
|
||||||
cdrom_log("CD-ROM %i: CDROM_PHASE_DATA_IN\n", id);
|
cdrom_log("CD-ROM %i: CDROM_PHASE_DATA_IN\n", id);
|
||||||
@@ -3126,7 +3171,16 @@ void cdrom_phase_callback(uint8_t id)
|
|||||||
return;
|
return;
|
||||||
case CDROM_PHASE_DATA_IN_DMA:
|
case CDROM_PHASE_DATA_IN_DMA:
|
||||||
cdrom_log("CD-ROM %i: CDROM_PHASE_DATA_IN_DMA\n", id);
|
cdrom_log("CD-ROM %i: CDROM_PHASE_DATA_IN_DMA\n", id);
|
||||||
cdrom_write_to_dma(id);
|
ret = cdrom_write_to_dma(id);
|
||||||
|
|
||||||
|
if (ret || (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)) {
|
||||||
|
cdrom_log("CD-ROM %i: DMA data in phase done\n");
|
||||||
|
cdrom_buf_free(id);
|
||||||
|
cdrom_command_complete(id);
|
||||||
|
} else {
|
||||||
|
cdrom_log("CD-ROM %i: DMA data in phase failure\n");
|
||||||
|
cdrom_command_bus(id);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case CDROM_PHASE_ERROR:
|
case CDROM_PHASE_ERROR:
|
||||||
cdrom_log("CD-ROM %i: CDROM_PHASE_ERROR\n", id);
|
cdrom_log("CD-ROM %i: CDROM_PHASE_ERROR\n", id);
|
||||||
|
|||||||
@@ -412,6 +412,7 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
|
|||||||
track.attr = DATA_TRACK;
|
track.attr = DATA_TRACK;
|
||||||
track.mode2 = true;
|
track.mode2 = true;
|
||||||
} else if (type == "MODE2/2352") {
|
} else if (type == "MODE2/2352") {
|
||||||
|
track.form = 1; /* Assume this is XA Mode 2 Form 1. */
|
||||||
track.sectorSize = RAW_SECTOR_SIZE;
|
track.sectorSize = RAW_SECTOR_SIZE;
|
||||||
track.attr = DATA_TRACK;
|
track.attr = DATA_TRACK;
|
||||||
track.mode2 = true;
|
track.mode2 = true;
|
||||||
@@ -481,8 +482,8 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
|
|||||||
track.number++;
|
track.number++;
|
||||||
track.track_number = 0xAA;
|
track.track_number = 0xAA;
|
||||||
// track.attr = 0;//sync with load iso
|
// track.attr = 0;//sync with load iso
|
||||||
// track.attr = 0x16; /* Was 0x00 but I believe 0x16 is appropriate. */
|
track.attr = 0x16; /* Was 0x00 but I believe 0x16 is appropriate. */
|
||||||
track.attr = last_attr | 0x02;
|
// track.attr = last_attr | 0x02;
|
||||||
track.start = 0;
|
track.start = 0;
|
||||||
track.length = 0;
|
track.length = 0;
|
||||||
track.file = NULL;
|
track.file = NULL;
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ void cdrom_image_log(const char *format, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
#else
|
/* #else
|
||||||
(void)format;
|
(void)format; */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,7 +68,6 @@ void image_audio_callback(uint8_t id, int16_t *output, int len)
|
|||||||
{
|
{
|
||||||
cdrom_t *dev = cdrom[id];
|
cdrom_t *dev = cdrom[id];
|
||||||
|
|
||||||
return;
|
|
||||||
if (!cdrom_drives[id].sound_on || (dev->cd_state != CD_PLAYING) || cdrom_image[id].image_is_iso)
|
if (!cdrom_drives[id].sound_on || (dev->cd_state != CD_PLAYING) || cdrom_image[id].image_is_iso)
|
||||||
{
|
{
|
||||||
cdrom_image_log("image_audio_callback(i): Not playing\n", id);
|
cdrom_image_log("image_audio_callback(i): Not playing\n", id);
|
||||||
@@ -767,10 +766,14 @@ read_mode2_xa_form2:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode2)
|
if (mode2 && (form == 1))
|
||||||
goto read_mode2_non_xa;
|
goto read_mode2_xa_form1;
|
||||||
else
|
else if (!mode2)
|
||||||
goto read_mode1;
|
goto read_mode1;
|
||||||
|
else {
|
||||||
|
cdrom_image_log("CD-ROM %i: [Any Data] Attempting to read a data sector whose cooked size is not 2048 bytes\n", id);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (mode2)
|
if (mode2)
|
||||||
if (form == 1)
|
if (form == 1)
|
||||||
|
|||||||
@@ -10,13 +10,14 @@
|
|||||||
*
|
*
|
||||||
* Re-worked version based on the 82C235 datasheet and errata.
|
* Re-worked version based on the 82C235 datasheet and errata.
|
||||||
*
|
*
|
||||||
* Version: @(#)m_at_scat.c 1.0.12 2018/03/20
|
* Version: @(#)m_at_scat.c 1.0.13 2018/03/20
|
||||||
*
|
*
|
||||||
* Authors: Original by GreatPsycho for PCem.
|
* Authors: Original by GreatPsycho for PCem.
|
||||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
*
|
*
|
||||||
* Copyright 2017,2018 Fred N. van Kempen.
|
* Copyright 2017,2018 Fred N. van Kempen.
|
||||||
*/
|
*/
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -84,6 +85,24 @@ static int scatsx_mem_conf_val[33] = { 0x00, 0x01, 0x03, 0x04, 0x05, 0x08, 0x06,
|
|||||||
uint8_t scat_read(uint16_t port, void *priv);
|
uint8_t scat_read(uint16_t port, void *priv);
|
||||||
void scat_write(uint16_t port, uint8_t val, void *priv);
|
void scat_write(uint16_t port, uint8_t val, void *priv);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_SCAT_LOG
|
||||||
|
int scat_do_log = ENABLE_SCAT_LOG;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
scat_log(const char *format, ...)
|
||||||
|
{
|
||||||
|
#ifdef ENABLE_SCAT_LOG
|
||||||
|
if (scat_do_log) {
|
||||||
|
va_start(ap, format);
|
||||||
|
pclog_ex(format, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void scat_shadow_state_update()
|
void scat_shadow_state_update()
|
||||||
{
|
{
|
||||||
int i, val;
|
int i, val;
|
||||||
@@ -186,7 +205,7 @@ void scat_set_xms_bound(uint8_t val)
|
|||||||
mem_mapping_disable(&scat_shadowram_mapping[i]);
|
mem_mapping_disable(&scat_shadowram_mapping[i]);
|
||||||
if(mem_size > 1024) mem_mapping_enable(&ram_high_mapping);
|
if(mem_size > 1024) mem_mapping_enable(&ram_high_mapping);
|
||||||
}
|
}
|
||||||
pclog("Set XMS bound(%02X) = %06X(%dKbytes for EMS access)\n", val, scat_xms_bound, (0x160000 - scat_xms_bound) >> 10);
|
scat_log("Set XMS bound(%02X) = %06X(%dKbytes for EMS access)\n", val, scat_xms_bound, (0x160000 - scat_xms_bound) >> 10);
|
||||||
if (scat_xms_bound > 0x100000)
|
if (scat_xms_bound > 0x100000)
|
||||||
mem_set_mem_state(0x100000, scat_xms_bound - 0x100000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
|
mem_set_mem_state(0x100000, scat_xms_bound - 0x100000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
|
||||||
if (scat_xms_bound < 0x160000)
|
if (scat_xms_bound < 0x160000)
|
||||||
@@ -200,7 +219,7 @@ void scat_set_xms_bound(uint8_t val)
|
|||||||
|
|
||||||
if (scat_xms_bound > max_xms_size)
|
if (scat_xms_bound > max_xms_size)
|
||||||
scat_xms_bound = max_xms_size;
|
scat_xms_bound = max_xms_size;
|
||||||
pclog("Set XMS bound(%02X) = %06X(%dKbytes for EMS access)\n", val, scat_xms_bound, ((mem_size << 10) - scat_xms_bound) >> 10);
|
scat_log("Set XMS bound(%02X) = %06X(%dKbytes for EMS access)\n", val, scat_xms_bound, ((mem_size << 10) - scat_xms_bound) >> 10);
|
||||||
if (scat_xms_bound > 0x100000)
|
if (scat_xms_bound > 0x100000)
|
||||||
mem_set_mem_state(0x100000, scat_xms_bound - 0x100000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
|
mem_set_mem_state(0x100000, scat_xms_bound - 0x100000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
|
||||||
if (scat_xms_bound < (mem_size << 10))
|
if (scat_xms_bound < (mem_size << 10))
|
||||||
@@ -399,12 +418,12 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
}
|
}
|
||||||
if (scat_reg_valid)
|
if (scat_reg_valid)
|
||||||
scat_regs[scat_index] = val;
|
scat_regs[scat_index] = val;
|
||||||
else pclog("Attemped to write unimplemented SCAT register %02X at %04X:%04X\n", scat_index, val, CS, cpu_state.pc);
|
else scat_log("Attemped to write unimplemented SCAT register %02X at %04X:%04X\n", scat_index, val, CS, cpu_state.pc);
|
||||||
if (scat_shadow_update)
|
if (scat_shadow_update)
|
||||||
scat_shadow_state_update();
|
scat_shadow_state_update();
|
||||||
if (scat_map_update)
|
if (scat_map_update)
|
||||||
scat_memmap_state_update();
|
scat_memmap_state_update();
|
||||||
// pclog("Write SCAT Register %02X to %02X at %04X:%04X\n", scat_index, val, CS, cpu_state.pc);
|
// scat_log("Write SCAT Register %02X to %02X at %04X:%04X\n", scat_index, val, CS, cpu_state.pc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x92:
|
case 0x92:
|
||||||
@@ -425,7 +444,7 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case 0x218:
|
case 0x218:
|
||||||
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
||||||
{
|
{
|
||||||
// pclog("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
// scat_log("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
||||||
if((scat_regs[SCAT_VERSION] & 0xF0) == 0) index = scat_ems_reg_2xA & 0x1F;
|
if((scat_regs[SCAT_VERSION] & 0xF0) == 0) index = scat_ems_reg_2xA & 0x1F;
|
||||||
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
|
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
|
||||||
scat_stat[index].regs_2x8 = val;
|
scat_stat[index].regs_2x8 = val;
|
||||||
@@ -446,7 +465,7 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case 0x219:
|
case 0x219:
|
||||||
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
||||||
{
|
{
|
||||||
// pclog("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
// scat_log("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
||||||
if((scat_regs[SCAT_VERSION] & 0xF0) == 0) index = scat_ems_reg_2xA & 0x1F;
|
if((scat_regs[SCAT_VERSION] & 0xF0) == 0) index = scat_ems_reg_2xA & 0x1F;
|
||||||
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
|
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
|
||||||
scat_stat[index].regs_2x9 = val;
|
scat_stat[index].regs_2x9 = val;
|
||||||
@@ -463,14 +482,14 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
if(virt_addr < (mem_size << 10)) mem_mapping_set_exec(&scat_mapping[index], ram + virt_addr);
|
if(virt_addr < (mem_size << 10)) mem_mapping_set_exec(&scat_mapping[index], ram + virt_addr);
|
||||||
else mem_mapping_set_exec(&scat_mapping[index], NULL);
|
else mem_mapping_set_exec(&scat_mapping[index], NULL);
|
||||||
mem_mapping_enable(&scat_mapping[index]);
|
mem_mapping_enable(&scat_mapping[index]);
|
||||||
// pclog("Map page %d(address %05X) to address %06X\n", scat_ems_reg_2xA & 0x1f, base_addr, virt_addr);
|
// scat_log("Map page %d(address %05X) to address %06X\n", scat_ems_reg_2xA & 0x1f, base_addr, virt_addr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mem_mapping_set_exec(&scat_mapping[index], ram + base_addr);
|
mem_mapping_set_exec(&scat_mapping[index], ram + base_addr);
|
||||||
mem_mapping_disable(&scat_mapping[index]);
|
mem_mapping_disable(&scat_mapping[index]);
|
||||||
if(index < 24) mem_mapping_enable(&scat_4000_9FFF_mapping[index]);
|
if(index < 24) mem_mapping_enable(&scat_4000_9FFF_mapping[index]);
|
||||||
// pclog("Unmap page %d(address %06X)\n", scat_ems_reg_2xA & 0x1f, base_addr);
|
// scat_log("Unmap page %d(address %06X)\n", scat_ems_reg_2xA & 0x1f, base_addr);
|
||||||
}
|
}
|
||||||
flushmmucache();
|
flushmmucache();
|
||||||
}
|
}
|
||||||
@@ -485,7 +504,7 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case 0x21A:
|
case 0x21A:
|
||||||
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
||||||
{
|
{
|
||||||
// pclog("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
// scat_log("Write SCAT EMS Control Port %04X to %02X at %04X:%04X\n", port, val, CS, cpu_state.pc);
|
||||||
scat_ems_reg_2xA = ((scat_regs[SCAT_VERSION] & 0xF0) == 0) ? val : val & 0xc3;
|
scat_ems_reg_2xA = ((scat_regs[SCAT_VERSION] & 0xF0) == 0) ? val : val & 0xc3;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -512,7 +531,7 @@ uint8_t scat_read(uint16_t port, void *priv)
|
|||||||
val = scat_regs[scat_index];
|
val = scat_regs[scat_index];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// pclog("Read SCAT Register %02X at %04X:%04X\n", scat_index, CS, cpu_state.pc);
|
// scat_log("Read SCAT Register %02X at %04X:%04X\n", scat_index, CS, cpu_state.pc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x92:
|
case 0x92:
|
||||||
@@ -523,7 +542,7 @@ uint8_t scat_read(uint16_t port, void *priv)
|
|||||||
case 0x218:
|
case 0x218:
|
||||||
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
||||||
{
|
{
|
||||||
// pclog("Read SCAT EMS Control Port %04X at %04X:%04X\n", port, CS, cpu_state.pc);
|
// scat_log("Read SCAT EMS Control Port %04X at %04X:%04X\n", port, CS, cpu_state.pc);
|
||||||
if((scat_regs[SCAT_VERSION] & 0xF0) == 0) index = scat_ems_reg_2xA & 0x1F;
|
if((scat_regs[SCAT_VERSION] & 0xF0) == 0) index = scat_ems_reg_2xA & 0x1F;
|
||||||
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
|
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
|
||||||
val = scat_stat[index].regs_2x8;
|
val = scat_stat[index].regs_2x8;
|
||||||
@@ -533,7 +552,7 @@ uint8_t scat_read(uint16_t port, void *priv)
|
|||||||
case 0x219:
|
case 0x219:
|
||||||
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
||||||
{
|
{
|
||||||
// pclog("Read SCAT EMS Control Port %04X at %04X:%04X\n", port, CS, cpu_state.pc);
|
// scat_log("Read SCAT EMS Control Port %04X at %04X:%04X\n", port, CS, cpu_state.pc);
|
||||||
if((scat_regs[SCAT_VERSION] & 0xF0) == 0) index = scat_ems_reg_2xA & 0x1F;
|
if((scat_regs[SCAT_VERSION] & 0xF0) == 0) index = scat_ems_reg_2xA & 0x1F;
|
||||||
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
|
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
|
||||||
val = scat_stat[index].regs_2x9;
|
val = scat_stat[index].regs_2x9;
|
||||||
@@ -543,7 +562,7 @@ uint8_t scat_read(uint16_t port, void *priv)
|
|||||||
case 0x21A:
|
case 0x21A:
|
||||||
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
if ((scat_regs[SCAT_EMS_CONTROL] & 0x41) == (0x40 | ((port & 0x10) >> 4)))
|
||||||
{
|
{
|
||||||
// pclog("Read SCAT EMS Control Port %04X at %04X:%04X\n", port, CS, cpu_state.pc);
|
// scat_log("Read SCAT EMS Control Port %04X at %04X:%04X\n", port, CS, cpu_state.pc);
|
||||||
val = scat_ems_reg_2xA;
|
val = scat_ems_reg_2xA;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -22,10 +22,12 @@
|
|||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <ntddcdrm.h>
|
#include <ntddcdrm.h>
|
||||||
#include <ntddscsi.h>
|
#include <ntddscsi.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
#define HAVE_STDARG_H
|
||||||
#include "../86box.h"
|
#include "../86box.h"
|
||||||
#include "../device.h"
|
#include "../device.h"
|
||||||
#include "../scsi/scsi.h"
|
#include "../scsi/scsi.h"
|
||||||
@@ -52,8 +54,8 @@ typedef struct {
|
|||||||
|
|
||||||
cdrom_ioctl_windows_t cdrom_ioctl_windows[CDROM_NUM];
|
cdrom_ioctl_windows_t cdrom_ioctl_windows[CDROM_NUM];
|
||||||
|
|
||||||
#ifdef ENABLE_CDROM_LOG
|
#ifdef ENABLE_CDROM_IOCTL_LOG
|
||||||
int cdrom_ioctl_do_log = ENABLE_CDROM_LOG;
|
int cdrom_ioctl_do_log = ENABLE_CDROM_IOCTL_LOG;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -63,13 +65,13 @@ static CDROM ioctl_cdrom;
|
|||||||
static void
|
static void
|
||||||
cdrom_ioctl_log(const char *format, ...)
|
cdrom_ioctl_log(const char *format, ...)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_CDROM_LOG
|
#ifdef ENABLE_CDROM_IOCTL_LOG
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
if (cdrom_ioctl_do_log) {
|
if (cdrom_ioctl_do_log) {
|
||||||
va_list ap;
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vfprintf(stdlog, format, ap);
|
pclog_ex(format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
fflush(stdlog);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -88,15 +90,19 @@ void ioctl_audio_callback(uint8_t id, int16_t *output, int len)
|
|||||||
if (dev->cd_state == CD_PLAYING)
|
if (dev->cd_state == CD_PLAYING)
|
||||||
{
|
{
|
||||||
dev->seek_pos += (len >> 11);
|
dev->seek_pos += (len >> 11);
|
||||||
}
|
cdrom_ioctl_log("ioctl_audio_callback(): playing but mute\n");
|
||||||
|
} else
|
||||||
|
cdrom_ioctl_log("ioctl_audio_callback(): not playing\n");
|
||||||
|
cdrom_ioctl_windows[id].is_playing = 0;
|
||||||
memset(output, 0, len * 2);
|
memset(output, 0, len * 2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
cdrom_ioctl_log("ioctl_audio_callback(): dev->cd_buflen = %i, len = %i\n", dev->cd_buflen, len);
|
||||||
while (dev->cd_buflen < len)
|
while (dev->cd_buflen < len)
|
||||||
{
|
{
|
||||||
if (dev->seek_pos < dev->cd_end)
|
if (dev->seek_pos < dev->cd_end)
|
||||||
{
|
{
|
||||||
in.DiskOffset.LowPart = (dev->seek_pos - 150) * 2048;
|
in.DiskOffset.LowPart = dev->seek_pos * 2048;
|
||||||
in.DiskOffset.HighPart = 0;
|
in.DiskOffset.HighPart = 0;
|
||||||
in.SectorCount = 1;
|
in.SectorCount = 1;
|
||||||
in.TrackMode = CDDA;
|
in.TrackMode = CDDA;
|
||||||
@@ -107,11 +113,13 @@ void ioctl_audio_callback(uint8_t id, int16_t *output, int len)
|
|||||||
ioctl_close(id);
|
ioctl_close(id);
|
||||||
dev->cd_state = CD_STOPPED;
|
dev->cd_state = CD_STOPPED;
|
||||||
dev->cd_buflen = len;
|
dev->cd_buflen = len;
|
||||||
|
cdrom_ioctl_log("ioctl_audio_callback(): read sector error, stopped\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dev->seek_pos++;
|
dev->seek_pos++;
|
||||||
dev->cd_buflen += (2352 / 2);
|
dev->cd_buflen += (2352 / 2);
|
||||||
|
cdrom_ioctl_log("ioctl_audio_callback(): dev->seek_pos = %i\n", dev->seek_pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -121,6 +129,7 @@ void ioctl_audio_callback(uint8_t id, int16_t *output, int len)
|
|||||||
ioctl_close(id);
|
ioctl_close(id);
|
||||||
dev->cd_state = CD_STOPPED;
|
dev->cd_state = CD_STOPPED;
|
||||||
dev->cd_buflen = len;
|
dev->cd_buflen = len;
|
||||||
|
cdrom_ioctl_log("ioctl_audio_callback(): reached the end\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memcpy(output, dev->cd_buffer, len * 2);
|
memcpy(output, dev->cd_buffer, len * 2);
|
||||||
@@ -146,27 +155,32 @@ static int get_track_nr(uint8_t id, uint32_t pos)
|
|||||||
if (dev->disc_changed)
|
if (dev->disc_changed)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
cdrom_ioctl_log("get_track_nr(): disc changed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cdrom_ioctl[id].last_track_pos == pos)
|
if (cdrom_ioctl[id].last_track_pos == pos)
|
||||||
{
|
{
|
||||||
|
cdrom_ioctl_log("get_track_nr(): cdrom_ioctl[id].last_track_pos == pos\n");
|
||||||
return cdrom_ioctl[id].last_track_nr;
|
return cdrom_ioctl[id].last_track_nr;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (c = cdrom_ioctl_windows[id].toc.FirstTrack; c < cdrom_ioctl_windows[id].toc.LastTrack; c++)
|
/* for (c = cdrom_ioctl_windows[id].toc.FirstTrack; c < cdrom_ioctl_windows[id].toc.LastTrack; c++) */
|
||||||
|
for (c = 0; c < cdrom_ioctl_windows[id].toc.LastTrack; c++)
|
||||||
{
|
{
|
||||||
uint32_t track_address = cdrom_ioctl_windows[id].toc.TrackData[c].Address[3] +
|
uint32_t track_address = MSFtoLBA(cdrom_ioctl_windows[id].toc.TrackData[c].Address[1],
|
||||||
(cdrom_ioctl_windows[id].toc.TrackData[c].Address[2] * 75) +
|
cdrom_ioctl_windows[id].toc.TrackData[c].Address[2],
|
||||||
(cdrom_ioctl_windows[id].toc.TrackData[c].Address[1] * 75 * 60);
|
cdrom_ioctl_windows[id].toc.TrackData[c].Address[3]) - 150;
|
||||||
|
|
||||||
if (track_address <= pos)
|
if (track_address <= pos)
|
||||||
{
|
{
|
||||||
|
cdrom_ioctl_log("get_track_nr(): track = %i\n", c);
|
||||||
track = c;
|
track = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cdrom_ioctl[id].last_track_pos = pos;
|
cdrom_ioctl[id].last_track_pos = pos;
|
||||||
cdrom_ioctl[id].last_track_nr = track;
|
cdrom_ioctl[id].last_track_nr = track;
|
||||||
|
|
||||||
|
cdrom_ioctl_log("get_track_nr(): return %i\n", track);
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,6 +213,7 @@ static void ioctl_playaudio(uint8_t id, uint32_t pos, uint32_t len, int ismsf)
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
cdrom_ioctl_log("Play audio - %08X %08X %i\n", pos, len, ismsf);
|
||||||
if (ismsf == 2)
|
if (ismsf == 2)
|
||||||
{
|
{
|
||||||
start_msf = get_track_msf(id, pos);
|
start_msf = get_track_msf(id, pos);
|
||||||
@@ -214,11 +229,11 @@ static void ioctl_playaudio(uint8_t id, uint32_t pos, uint32_t len, int ismsf)
|
|||||||
m = (start_msf >> 16) & 0xff;
|
m = (start_msf >> 16) & 0xff;
|
||||||
s = (start_msf >> 8) & 0xff;
|
s = (start_msf >> 8) & 0xff;
|
||||||
f = start_msf & 0xff;
|
f = start_msf & 0xff;
|
||||||
pos = MSFtoLBA(m, s, f);
|
pos = MSFtoLBA(m, s, f) - 150;
|
||||||
m = (end_msf >> 16) & 0xff;
|
m = (end_msf >> 16) & 0xff;
|
||||||
s = (end_msf >> 8) & 0xff;
|
s = (end_msf >> 8) & 0xff;
|
||||||
f = end_msf & 0xff;
|
f = end_msf & 0xff;
|
||||||
len = MSFtoLBA(m, s, f);
|
len = MSFtoLBA(m, s, f) - 150;
|
||||||
}
|
}
|
||||||
else if (ismsf == 1)
|
else if (ismsf == 1)
|
||||||
{
|
{
|
||||||
@@ -233,13 +248,13 @@ static void ioctl_playaudio(uint8_t id, uint32_t pos, uint32_t len, int ismsf)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pos = MSFtoLBA(m, s, f);
|
pos = MSFtoLBA(m, s, f) - 150;
|
||||||
}
|
}
|
||||||
|
|
||||||
m = (len >> 16) & 0xff;
|
m = (len >> 16) & 0xff;
|
||||||
s = (len >> 8) & 0xff;
|
s = (len >> 8) & 0xff;
|
||||||
f = len & 0xff;
|
f = len & 0xff;
|
||||||
len = MSFtoLBA(m, s, f);
|
len = MSFtoLBA(m, s, f) - 150;
|
||||||
}
|
}
|
||||||
else if (ismsf == 0)
|
else if (ismsf == 0)
|
||||||
{
|
{
|
||||||
@@ -252,11 +267,7 @@ static void ioctl_playaudio(uint8_t id, uint32_t pos, uint32_t len, int ismsf)
|
|||||||
}
|
}
|
||||||
dev->seek_pos = pos;
|
dev->seek_pos = pos;
|
||||||
dev->cd_end = len;
|
dev->cd_end = len;
|
||||||
if (dev->seek_pos < 150)
|
|
||||||
{
|
|
||||||
/* Adjust because the host expects a minimum adjusted LBA of 0 which is equivalent to an absolute LBA of 150. */
|
|
||||||
dev->seek_pos = 150;
|
|
||||||
}
|
|
||||||
if (!cdrom_ioctl_windows[id].is_playing)
|
if (!cdrom_ioctl_windows[id].is_playing)
|
||||||
{
|
{
|
||||||
ioctl_hopen(id);
|
ioctl_hopen(id);
|
||||||
@@ -462,9 +473,11 @@ static uint8_t ioctl_getcurrentsubchannel(uint8_t id, uint8_t *b, int msf)
|
|||||||
if (dev->cd_state == CD_PLAYING || dev->cd_state == CD_PAUSED)
|
if (dev->cd_state == CD_PLAYING || dev->cd_state == CD_PAUSED)
|
||||||
{
|
{
|
||||||
track = get_track_nr(id, cdpos);
|
track = get_track_nr(id, cdpos);
|
||||||
track_address = cdrom_ioctl_windows[id].toc.TrackData[track].Address[3] + (cdrom_ioctl_windows[id].toc.TrackData[track].Address[2] * 75) + (cdrom_ioctl_windows[id].toc.TrackData[track].Address[1] * 75 * 60);
|
track_address = MSFtoLBA(cdrom_ioctl_windows[id].toc.TrackData[track].Address[1],
|
||||||
|
cdrom_ioctl_windows[id].toc.TrackData[track].Address[2],
|
||||||
|
cdrom_ioctl_windows[id].toc.TrackData[track].Address[3]) - 150;
|
||||||
|
|
||||||
cdrom_ioctl_log("cdpos = %i, track = %i, track_address = %i\n", cdpos, track, track_address);
|
cdrom_ioctl_log("ioctl_getcurrentsubchannel(): cdpos = %i, track = %i, track_address = %i\n", cdpos, track, track_address);
|
||||||
|
|
||||||
b[pos++] = sub.CurrentPosition.Control;
|
b[pos++] = sub.CurrentPosition.Control;
|
||||||
b[pos++] = track + 1;
|
b[pos++] = track + 1;
|
||||||
@@ -478,7 +491,7 @@ static uint8_t ioctl_getcurrentsubchannel(uint8_t id, uint8_t *b, int msf)
|
|||||||
b[pos + 1] = (uint8_t)dat;
|
b[pos + 1] = (uint8_t)dat;
|
||||||
b[pos] = 0;
|
b[pos] = 0;
|
||||||
pos += 4;
|
pos += 4;
|
||||||
dat = cdpos - track_address - 150;
|
dat = cdpos - track_address;
|
||||||
b[pos + 3] = (uint8_t)(dat % 75); dat /= 75;
|
b[pos + 3] = (uint8_t)(dat % 75); dat /= 75;
|
||||||
b[pos + 2] = (uint8_t)(dat % 60); dat /= 60;
|
b[pos + 2] = (uint8_t)(dat % 60); dat /= 60;
|
||||||
b[pos + 1] = (uint8_t)dat;
|
b[pos + 1] = (uint8_t)dat;
|
||||||
@@ -522,12 +535,12 @@ static uint8_t ioctl_getcurrentsubchannel(uint8_t id, uint8_t *b, int msf)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uint32_t temp = MSFtoLBA(sub.CurrentPosition.AbsoluteAddress[1], sub.CurrentPosition.AbsoluteAddress[2], sub.CurrentPosition.AbsoluteAddress[3]);
|
uint32_t temp = MSFtoLBA(sub.CurrentPosition.AbsoluteAddress[1], sub.CurrentPosition.AbsoluteAddress[2], sub.CurrentPosition.AbsoluteAddress[3]) - 150;
|
||||||
b[pos++] = temp >> 24;
|
b[pos++] = temp >> 24;
|
||||||
b[pos++] = temp >> 16;
|
b[pos++] = temp >> 16;
|
||||||
b[pos++] = temp >> 8;
|
b[pos++] = temp >> 8;
|
||||||
b[pos++] = temp;
|
b[pos++] = temp;
|
||||||
temp = MSFtoLBA(sub.CurrentPosition.TrackRelativeAddress[1], sub.CurrentPosition.TrackRelativeAddress[2], sub.CurrentPosition.TrackRelativeAddress[3]);
|
temp = MSFtoLBA(sub.CurrentPosition.TrackRelativeAddress[1], sub.CurrentPosition.TrackRelativeAddress[2], sub.CurrentPosition.TrackRelativeAddress[3]) - 150;
|
||||||
b[pos++] = temp >> 24;
|
b[pos++] = temp >> 24;
|
||||||
b[pos++] = temp >> 16;
|
b[pos++] = temp >> 16;
|
||||||
b[pos++] = temp >> 8;
|
b[pos++] = temp >> 8;
|
||||||
@@ -1273,6 +1286,7 @@ int ioctl_open(uint8_t id, char d)
|
|||||||
cdrom_ioctl_windows[id].hIOCTL = CreateFile(cdrom_ioctl[id].ioctl_path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
cdrom_ioctl_windows[id].hIOCTL = CreateFile(cdrom_ioctl[id].ioctl_path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
||||||
cdrom_drives[id].handler = &ioctl_cdrom;
|
cdrom_drives[id].handler = &ioctl_cdrom;
|
||||||
dev->handler_inited=1;
|
dev->handler_inited=1;
|
||||||
|
cdrom_ioctl_windows[id].is_playing = 0;
|
||||||
cdrom_ioctl[id].capacity_read=0; /* With these two lines, we read the READ CAPACITY command output from the host drive into our cache buffer. */
|
cdrom_ioctl[id].capacity_read=0; /* With these two lines, we read the READ CAPACITY command output from the host drive into our cache buffer. */
|
||||||
ioctl_read_capacity(id, NULL);
|
ioctl_read_capacity(id, NULL);
|
||||||
pclog(rcs, drb[0], drb[1], drb[2], drb[3], drb[4], drb[5], drb[6], drb[7],
|
pclog(rcs, drb[0], drb[1], drb[2], drb[3], drb[4], drb[5], drb[6], drb[7],
|
||||||
|
|||||||
Reference in New Issue
Block a user