diff --git a/src/Makefile.local b/src/Makefile.local index c02156f0f..9b9b7f2a7 100644 --- a/src/Makefile.local +++ b/src/Makefile.local @@ -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, # @@ -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. diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 45086635a..485db1dcc 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -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, * * Copyright 2016-2018 Miran Grca. */ +#include #include #include #include @@ -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); diff --git a/src/cdrom/cdrom_dosbox.cpp b/src/cdrom/cdrom_dosbox.cpp index a7347abf7..7fffa01b9 100644 --- a/src/cdrom/cdrom_dosbox.cpp +++ b/src/cdrom/cdrom_dosbox.cpp @@ -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; diff --git a/src/cdrom/cdrom_image.cc b/src/cdrom/cdrom_image.cc index 1df0c3a2d..6a7c74e8c 100644 --- a/src/cdrom/cdrom_image.cc +++ b/src/cdrom/cdrom_image.cc @@ -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) diff --git a/src/machine/m_at_scat.c b/src/machine/m_at_scat.c index fdb56fe72..420c474a0 100644 --- a/src/machine/m_at_scat.c +++ b/src/machine/m_at_scat.c @@ -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, * * Copyright 2017,2018 Fred N. van Kempen. */ +#include #include #include #include @@ -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; diff --git a/src/win/win_cdrom_ioctl.c b/src/win/win_cdrom_ioctl.c index a54231037..3261fc441 100644 --- a/src/win/win_cdrom_ioctl.c +++ b/src/win/win_cdrom_ioctl.c @@ -22,10 +22,12 @@ #include #include #include +#include #include #include #include #include +#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],