More CD-ROM fixes, Little Big Adventure now looks again;

Made SCAT logging optional and disabled by default.
This commit is contained in:
OBattler
2018-03-21 14:46:54 +01:00
parent 0ed4750eac
commit 8e22d282d1
6 changed files with 181 additions and 87 deletions

View File

@@ -10,7 +10,7 @@
# settings, so we can avoid changing the main one for all of
# 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>
#
@@ -39,11 +39,14 @@ STUFF :=
# -DENABLE_KEYBOARD_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_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_IDE_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_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_DISK_LOG=N sets logging level at N.
# -DENABLE_X54X_LOG=N sets logging level at N.

View File

@@ -9,12 +9,13 @@
* Implementation of the CD-ROM drive with SCSI(-like)
* 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>
*
* Copyright 2016-2018 Miran Grca.
*/
#include <inttypes.h>
#include <stdio.h>
#include <stdint.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];
uint32_t bt;
uint32_t min_len = 0;
dev->max_transfer_len = dev->request_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 0xb9:
case 0xbe:
if (dev->max_transfer_len < block_len)
dev->max_transfer_len = block_len;
/* Make sure total length is not bigger than sum of the lengths of
all the requested blocks. */
bt = (dev->requested_blocks * block_len);
if (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:
dev->packet_len = len;
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 (!dev->max_transfer_len)
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;
}
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:
fatal("CD-ROM %i: 0x speed\n", id);
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)
{
switch(cdrom_drives[id].speed) {
cdrom_t *dev = cdrom[id];
switch(dev->cur_speed) {
case 0:
fatal("CD-ROM %i: 0x speed\n", id);
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 */
}
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)
{
cdrom_t *dev = cdrom[id];
@@ -868,6 +900,9 @@ static void cdrom_command_common(uint8_t id)
dev->phase = 1;
dev->pos = 0;
dev->callback = 0LL;
cdrom_log("CD-ROM %i: Current speed: %ix\n", id, dev->cur_speed);
if (dev->packet_status == CDROM_PHASE_COMPLETE) {
cdrom_phase_callback(id);
dev->callback = 0LL;
@@ -880,6 +915,7 @@ static void cdrom_command_common(uint8_t id)
period = cdrom_seek_time(id) * ((double) TIMER_USEC);
dev->callback += ((int64_t) period);
cdrom_set_callback(id);
cdrom_log("CD-ROM %i: Seek period: %" PRIu64 " us\n", id, (int64_t) cdrom_seek_time(id));
return;
case 0x08:
case 0x28:
@@ -887,6 +923,7 @@ static void cdrom_command_common(uint8_t id)
/* Seek time is in us. */
period = cdrom_seek_time(id) * ((double) TIMER_USEC);
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 0x42:
case 0x43:
@@ -898,7 +935,8 @@ static void cdrom_command_common(uint8_t id)
case 0xb9:
case 0xbe:
/* 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;
break;
default:
@@ -911,8 +949,10 @@ static void cdrom_command_common(uint8_t id)
}
period = 1000000.0 / bytes_per_second;
dusec = (double) TIMER_USEC;
dusec = dusec * period * (double) (dev->packet_len);
cdrom_log("CD-ROM %i: Byte transfer period: %" PRIu64 " us\n", id, (int64_t) period);
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);
}
cdrom_set_callback(id);
@@ -2443,7 +2483,7 @@ cdrom_readtoc_fallback:
max_len |= cdb[8];
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");
if ((cdrom_drives[id].handler->pass_through) && (cdb[3] != 1)) {
@@ -2533,6 +2573,13 @@ cdrom_readtoc_fallback:
len = MIN(len, max_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);
break;
@@ -2983,7 +3030,6 @@ int cdrom_read_from_dma(uint8_t 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;
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);
if (ret || (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)) {
cdrom_buf_free(id);
dev->packet_status = CDROM_PHASE_COMPLETE;
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
if (ret)
return 1;
else
return 0;
}
@@ -3059,6 +3096,7 @@ int cdrom_write_to_dma(uint8_t 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;
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI) {
@@ -3067,18 +3105,14 @@ int cdrom_write_to_dma(uint8_t id)
} else
ret = cdrom_write_to_ide_dma(cdrom_drives[id].ide_channel);
if (ret || (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)) {
cdrom_buf_free(id);
dev->packet_status = CDROM_PHASE_COMPLETE;
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
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
cdrom_log("CD-ROM %i: SCSI Output data length: %i\n", id, *BufLen);
else
cdrom_log("CD-ROM %i: ATAPI Output data length: %i\n", id, dev->packet_len);
if (ret)
return 1;
else
return 0;
}
@@ -3086,6 +3120,7 @@ int cdrom_write_to_dma(uint8_t id)
void cdrom_phase_callback(uint8_t id)
{
cdrom_t *dev = cdrom[id];
int ret;
switch(dev->packet_status) {
case CDROM_PHASE_IDLE:
@@ -3116,7 +3151,17 @@ void cdrom_phase_callback(uint8_t id)
return;
case CDROM_PHASE_DATA_OUT_DMA:
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;
case CDROM_PHASE_DATA_IN:
cdrom_log("CD-ROM %i: CDROM_PHASE_DATA_IN\n", id);
@@ -3126,7 +3171,16 @@ void cdrom_phase_callback(uint8_t id)
return;
case CDROM_PHASE_DATA_IN_DMA:
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;
case CDROM_PHASE_ERROR:
cdrom_log("CD-ROM %i: CDROM_PHASE_ERROR\n", id);

View File

@@ -412,6 +412,7 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
track.attr = DATA_TRACK;
track.mode2 = true;
} else if (type == "MODE2/2352") {
track.form = 1; /* Assume this is XA Mode 2 Form 1. */
track.sectorSize = RAW_SECTOR_SIZE;
track.attr = DATA_TRACK;
track.mode2 = true;
@@ -481,8 +482,8 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
track.number++;
track.track_number = 0xAA;
// track.attr = 0;//sync with load iso
// track.attr = 0x16; /* Was 0x00 but I believe 0x16 is appropriate. */
track.attr = last_attr | 0x02;
track.attr = 0x16; /* Was 0x00 but I believe 0x16 is appropriate. */
// track.attr = last_attr | 0x02;
track.start = 0;
track.length = 0;
track.file = NULL;

View File

@@ -57,8 +57,8 @@ void cdrom_image_log(const char *format, ...)
va_end(ap);
fflush(stdout);
}
#else
(void)format;
/* #else
(void)format; */
#endif
}
@@ -68,7 +68,6 @@ void image_audio_callback(uint8_t id, int16_t *output, int len)
{
cdrom_t *dev = cdrom[id];
return;
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);
@@ -767,10 +766,14 @@ read_mode2_xa_form2:
return 0;
}
if (mode2)
goto read_mode2_non_xa;
else
if (mode2 && (form == 1))
goto read_mode2_xa_form1;
else if (!mode2)
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 {
if (mode2)
if (form == 1)

View File

@@ -10,13 +10,14 @@
*
* 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.
* Fred N. van Kempen, <decwiz@yahoo.com>
*
* Copyright 2017,2018 Fred N. van Kempen.
*/
#include <stdarg.h>
#include <stdio.h>
#include <stdint.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);
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()
{
int i, val;
@@ -186,7 +205,7 @@ void scat_set_xms_bound(uint8_t val)
mem_mapping_disable(&scat_shadowram_mapping[i]);
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)
mem_set_mem_state(0x100000, scat_xms_bound - 0x100000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
if (scat_xms_bound < 0x160000)
@@ -200,7 +219,7 @@ void scat_set_xms_bound(uint8_t val)
if (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)
mem_set_mem_state(0x100000, scat_xms_bound - 0x100000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
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)
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)
scat_shadow_state_update();
if (scat_map_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;
case 0x92:
@@ -425,7 +444,7 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
case 0x218:
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;
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
scat_stat[index].regs_2x8 = val;
@@ -446,7 +465,7 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
case 0x219:
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;
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
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);
else mem_mapping_set_exec(&scat_mapping[index], NULL);
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
{
mem_mapping_set_exec(&scat_mapping[index], ram + base_addr);
mem_mapping_disable(&scat_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();
}
@@ -485,7 +504,7 @@ void scat_write(uint16_t port, uint8_t val, void *priv)
case 0x21A:
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;
}
break;
@@ -512,7 +531,7 @@ uint8_t scat_read(uint16_t port, void *priv)
val = scat_regs[scat_index];
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;
case 0x92:
@@ -523,7 +542,7 @@ uint8_t scat_read(uint16_t port, void *priv)
case 0x218:
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;
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
val = scat_stat[index].regs_2x8;
@@ -533,7 +552,7 @@ uint8_t scat_read(uint16_t port, void *priv)
case 0x219:
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;
else index = ((scat_ems_reg_2xA & 0x40) >> 4) + (scat_ems_reg_2xA & 0x3) + 24;
val = scat_stat[index].regs_2x9;
@@ -543,7 +562,7 @@ uint8_t scat_read(uint16_t port, void *priv)
case 0x21A:
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;
}
break;

View File

@@ -22,10 +22,12 @@
#include <io.h>
#include <ntddcdrm.h>
#include <ntddscsi.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <wchar.h>
#define HAVE_STDARG_H
#include "../86box.h"
#include "../device.h"
#include "../scsi/scsi.h"
@@ -52,8 +54,8 @@ typedef struct {
cdrom_ioctl_windows_t cdrom_ioctl_windows[CDROM_NUM];
#ifdef ENABLE_CDROM_LOG
int cdrom_ioctl_do_log = ENABLE_CDROM_LOG;
#ifdef ENABLE_CDROM_IOCTL_LOG
int cdrom_ioctl_do_log = ENABLE_CDROM_IOCTL_LOG;
#endif
@@ -63,13 +65,13 @@ static CDROM ioctl_cdrom;
static void
cdrom_ioctl_log(const char *format, ...)
{
#ifdef ENABLE_CDROM_LOG
#ifdef ENABLE_CDROM_IOCTL_LOG
va_list ap;
if (cdrom_ioctl_do_log) {
va_list ap;
va_start(ap, format);
vfprintf(stdlog, format, ap);
pclog_ex(format, ap);
va_end(ap);
fflush(stdlog);
}
#endif
}
@@ -88,15 +90,19 @@ void ioctl_audio_callback(uint8_t id, int16_t *output, int len)
if (dev->cd_state == CD_PLAYING)
{
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);
return;
}
cdrom_ioctl_log("ioctl_audio_callback(): dev->cd_buflen = %i, len = %i\n", dev->cd_buflen, len);
while (dev->cd_buflen < len)
{
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.SectorCount = 1;
in.TrackMode = CDDA;
@@ -107,11 +113,13 @@ void ioctl_audio_callback(uint8_t id, int16_t *output, int len)
ioctl_close(id);
dev->cd_state = CD_STOPPED;
dev->cd_buflen = len;
cdrom_ioctl_log("ioctl_audio_callback(): read sector error, stopped\n");
}
else
{
dev->seek_pos++;
dev->cd_buflen += (2352 / 2);
cdrom_ioctl_log("ioctl_audio_callback(): dev->seek_pos = %i\n", dev->seek_pos);
}
}
else
@@ -121,6 +129,7 @@ void ioctl_audio_callback(uint8_t id, int16_t *output, int len)
ioctl_close(id);
dev->cd_state = CD_STOPPED;
dev->cd_buflen = len;
cdrom_ioctl_log("ioctl_audio_callback(): reached the end\n");
}
}
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)
{
return 0;
cdrom_ioctl_log("get_track_nr(): disc changed\n");
}
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;
}
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] +
(cdrom_ioctl_windows[id].toc.TrackData[c].Address[2] * 75) +
(cdrom_ioctl_windows[id].toc.TrackData[c].Address[1] * 75 * 60);
uint32_t track_address = MSFtoLBA(cdrom_ioctl_windows[id].toc.TrackData[c].Address[1],
cdrom_ioctl_windows[id].toc.TrackData[c].Address[2],
cdrom_ioctl_windows[id].toc.TrackData[c].Address[3]) - 150;
if (track_address <= pos)
{
cdrom_ioctl_log("get_track_nr(): track = %i\n", c);
track = c;
}
}
cdrom_ioctl[id].last_track_pos = pos;
cdrom_ioctl[id].last_track_nr = track;
cdrom_ioctl_log("get_track_nr(): return %i\n", track);
return track;
}
@@ -199,6 +213,7 @@ static void ioctl_playaudio(uint8_t id, uint32_t pos, uint32_t len, int ismsf)
{
return;
}
cdrom_ioctl_log("Play audio - %08X %08X %i\n", pos, len, ismsf);
if (ismsf == 2)
{
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;
s = (start_msf >> 8) & 0xff;
f = start_msf & 0xff;
pos = MSFtoLBA(m, s, f);
pos = MSFtoLBA(m, s, f) - 150;
m = (end_msf >> 16) & 0xff;
s = (end_msf >> 8) & 0xff;
f = end_msf & 0xff;
len = MSFtoLBA(m, s, f);
len = MSFtoLBA(m, s, f) - 150;
}
else if (ismsf == 1)
{
@@ -233,13 +248,13 @@ static void ioctl_playaudio(uint8_t id, uint32_t pos, uint32_t len, int ismsf)
}
else
{
pos = MSFtoLBA(m, s, f);
pos = MSFtoLBA(m, s, f) - 150;
}
m = (len >> 16) & 0xff;
s = (len >> 8) & 0xff;
f = len & 0xff;
len = MSFtoLBA(m, s, f);
len = MSFtoLBA(m, s, f) - 150;
}
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->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)
{
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)
{
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++] = 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] = 0;
pos += 4;
dat = cdpos - track_address - 150;
dat = cdpos - track_address;
b[pos + 3] = (uint8_t)(dat % 75); dat /= 75;
b[pos + 2] = (uint8_t)(dat % 60); dat /= 60;
b[pos + 1] = (uint8_t)dat;
@@ -522,12 +535,12 @@ static uint8_t ioctl_getcurrentsubchannel(uint8_t id, uint8_t *b, int msf)
}
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 >> 16;
b[pos++] = temp >> 8;
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 >> 16;
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_drives[id].handler = &ioctl_cdrom;
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. */
ioctl_read_capacity(id, NULL);
pclog(rcs, drb[0], drb[1], drb[2], drb[3], drb[4], drb[5], drb[6], drb[7],