From 5b1379482d3e2d0f93ab3ef3247b8cf7f2f6da2b Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Tue, 10 Nov 2020 16:07:20 +0900 Subject: [PATCH] [VM][FMTOWNS][CDROM] towns_cdrom.cpp: Revert to cdfc81b7398812d0f9206d5b978808fcbc5ebf0e and fit to new APIs. --- source/src/vm/fmtowns/towns_cdrom.cpp | 178 +++++++++++++++++++--------------- 1 file changed, 99 insertions(+), 79 deletions(-) diff --git a/source/src/vm/fmtowns/towns_cdrom.cpp b/source/src/vm/fmtowns/towns_cdrom.cpp index 6a63bb79e..f0a1febc0 100644 --- a/source/src/vm/fmtowns/towns_cdrom.cpp +++ b/source/src/vm/fmtowns/towns_cdrom.cpp @@ -100,7 +100,6 @@ void TOWNS_CDROM::initialize() { DEVICE::initialize(); __CDROM_DEBUG_LOG = osd->check_feature(_T("_CDROM_DEBUG_LOG")); - __CDROM_DEBUG_LOG = true; _USE_CDROM_PREFETCH = osd->check_feature(_T("USE_CDROM_PREFETCH")); force_logging = false; @@ -169,7 +168,6 @@ void TOWNS_CDROM::release() } - void TOWNS_CDROM::reset() { cdrom_debug_log("RESET"); @@ -296,7 +294,6 @@ void TOWNS_CDROM::write_signal(int id, uint32_t data, uint32_t mask) void TOWNS_CDROM::status_not_ready(bool forceint) { cdrom_debug_log(_T("CMD (%02X) BUT DISC NOT ACTIVE"), latest_command); - read_mode = TOWNS_CD_READ_NONE; set_status((forceint) ? true : req_status, 0, TOWNS_CD_STATUS_CMD_ABEND, TOWNS_CD_ABEND_DRIVE_NOT_READY, 0, 0); } @@ -304,7 +301,6 @@ void TOWNS_CDROM::status_not_ready(bool forceint) void TOWNS_CDROM::status_media_changed(bool forceint) { if(media_changed) { - read_mode = TOWNS_CD_READ_NONE; set_status((forceint) ? true : req_status, 0, TOWNS_CD_STATUS_CMD_ABEND, TOWNS_CD_ABEND_MEDIA_CHANGED, 0, 0); } @@ -313,14 +309,12 @@ void TOWNS_CDROM::status_media_changed(bool forceint) void TOWNS_CDROM::status_hardware_error(bool forceint) { - read_mode = TOWNS_CD_READ_NONE; set_status((forceint) ? true : req_status, 0, TOWNS_CD_STATUS_CMD_ABEND, TOWNS_CD_ABEND_HARDWARE_ERROR_04, 0, 0); } void TOWNS_CDROM::status_parameter_error(bool forceint) { - read_mode = TOWNS_CD_READ_NONE; set_status((forceint) ? true : req_status, 0, TOWNS_CD_STATUS_CMD_ABEND, TOWNS_CD_ABEND_PARAMETER_ERROR, 0, 0); } @@ -328,7 +322,6 @@ void TOWNS_CDROM::status_parameter_error(bool forceint) void TOWNS_CDROM::status_read_done(bool forceint) { if(forceint) stat_reply_intr = true; - read_mode = TOWNS_CD_READ_NONE; set_status_2(req_status, 0, TOWNS_CD_STATUS_READ_DONE, 0, 0, 0); // cdrom_debug_log(_T("READ DONE")); } @@ -341,7 +334,6 @@ void TOWNS_CDROM::status_data_ready(bool forceint) void TOWNS_CDROM::status_illegal_lba(int extra, uint8_t s1, uint8_t s2, uint8_t s3) { - read_mode = TOWNS_CD_READ_NONE; cdrom_debug_log(_T("Error on reading (ILLGLBLKADDR): EXTRA=%d s0=%02X s1=%02X s2=%02X s3=%02X POSITION=%d\n"), extra, TOWNS_CD_STATUS_CMD_ABEND, s1, s2, s3, position); set_status(req_status, extra, TOWNS_CD_STATUS_CMD_ABEND, s1, s2, s3); } @@ -408,6 +400,7 @@ void TOWNS_CDROM::set_delay_ready() // But, some software (i.e. Star Cruiser II) failes to loading at 300uS. // May need *at least* 1000uS. - 20200517 K.O force_register_event(this, EVENT_CDROM_DELAY_READY, 1000.0, false, event_delay_ready); +// register_event(this, EVENT_CDROM_DELAY_READY, 2000.0, false, &event_delay_ready); } void TOWNS_CDROM::set_delay_ready2() @@ -425,7 +418,7 @@ void TOWNS_CDROM::set_delay_ready3() void TOWNS_CDROM::set_delay_ready4() { - force_register_event(this, EVENT_CDROM_DELAY_READY4, 1.0e3, false, event_delay_ready); + force_register_event(this, EVENT_CDROM_DELAY_READY4, 1000.0, false, event_delay_ready); } void TOWNS_CDROM::status_not_accept(int extra, uint8_t s1, uint8_t s2, uint8_t s3) @@ -476,6 +469,7 @@ void TOWNS_CDROM::execute_command(uint8_t command) case CDROM_COMMAND_READ_MODE2: // 01h cdrom_debug_log(_T("CMD READ MODE2(%02X)"), command); read_cdrom_mode2(); +// status_not_accept(0, 0xff, 0xff, 0xff); break; case CDROM_COMMAND_READ_MODE1: // 02h cdrom_debug_log(_T("CMD READ MODE1(%02X)"), command); @@ -564,72 +558,75 @@ void TOWNS_CDROM::execute_command(uint8_t command) #if 0 if(toc_table[current_track].is_audio) { // if((param_queue[0] == 0x08)) { - switch(read_mode) + switch(prev_command & 0x9f) { - case TOWNS_CD_STOP_CDDA: - if(cdda_status != CDDA_OFF) { + case CDROM_COMMAND_SEEK: + set_status(true, 0, TOWNS_CD_STATUS_SEEK_COMPLETED, 0x00, 0x00, 0x00); + break; + case CDROM_COMMAND_PLAY_TRACK: + if(cdda_status == CDDA_PLAYING) { + set_status(true, 0, TOWNS_CD_STATUS_PLAY_DONE, 0x00, 0x00, 0x00); + } else { +// set_status(true, 0, TOWNS_CD_STATUS_PLAY_DONE, 0x00, 0x00, 0x00); + status_accept(0, 0x00, 0x00); + } + break; + case CDROM_COMMAND_STOP_CDDA: + if(cdda_status == CDDA_ENDED) { + set_status(true, 1, TOWNS_CD_STATUS_STOP_DONE, 0x00, 0x00, 0x00); set_cdda_status(CDDA_OFF); - status_accept(1, 0x00, 0x00); } else { - read_mode = TOWNS_CD_READ_NONE; - status_accept(1, 0x00, 0x00); + status_accept(0, 0x00, 0x00); +// set_status(true, 1, TOWNS_CD_STATUS_STOP_DONE, 0x00, 0x00, 0x00); } break; - case TOWNS_CD_PAUSE_CDDA: + case CDROM_COMMAND_PAUSE_CDDA: set_status(true, 0, TOWNS_CD_STATUS_PAUSE_DONE, 0x00, 0x00, 0x00); break; - case TOWNS_CD_UNPAUSE_CDDA: + case CDROM_COMMAND_RESUME_CDDA: set_status(true, 0, TOWNS_CD_STATUS_RESUME_DONE, 0x00, 0x00, 0x00); break; default: - if(cdda_status == CDDA_PLAYING) { - set_status(true, 0, TOWNS_CD_STATUS_PLAY_DONE, 0x00, 0x00, 0x00); + if(cdda_status == CDDA_ENDED) { + status_accept(1, 0x00, 0x00); + set_cdda_status(CDDA_OFF); } else { -// set_status(true, 0, TOWNS_CD_STATUS_PLAY_DONE, 0x00, 0x00, 0x00); status_accept(0, 0x00, 0x00); } break; } - break; +// } else { +// if(cdda_status == CDDA_ENDED) { +// status_accept(1, 0x00, 0x00); +// set_cdda_status(CDDA_OFF); +// } else { +// status_accept(0, 0x00, 0x00); +// } +// } } else { // DATA - #if 1 // status_accept(1, 0x00, 0x00); - if((param_queue[0] == 0x08) /*&& (param_queue[1] == 0x00)*/) { + if((param_queue[0] == 0x08) && (param_queue[1] == 0x00)) { switch(prev_command & 0x9f) { case CDROM_COMMAND_SEEK: - read_mode = TOWNS_CD_READ_NONE; set_status(true, 0, TOWNS_CD_STATUS_SEEK_COMPLETED, 0x00, 0x00, 0x00); - break; case CDROM_COMMAND_READ_MODE1: case CDROM_COMMAND_READ_MODE2: case CDROM_COMMAND_READ_RAW: - if((read_length <= 0) && (databuffer->empty()) && (read_mode != TOWNS_CD_READ_NONE)) { - read_mode = TOWNS_CD_READ_NONE; - status_read_done(false); - //set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00); - } else { - status_accept(0, 0x00, 0x00); - } + set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00); break; default: status_accept(0, 0x00, 0x00); break; } + } else { + status_accept(0, 0x00, 0x00); } - else { - if((read_length <= 0) && (databuffer->empty()) && (read_mode != TOWNS_CD_READ_NONE)) { - read_mode = TOWNS_CD_READ_NONE; - status_read_done(false); - } else { - status_accept(0, 0x00, 0x00); - } - } - #endif } -#else - status_accept(0, 0x00, 0x00); #endif +// stat_reply_intr = true; + status_accept(0, 0x00, 0x00); +// if(stat_reply_intr) set_mcu_intr(true); } break; case CDROM_COMMAND_SET_CDDASET: // 81h @@ -654,12 +651,10 @@ void TOWNS_CDROM::execute_command(uint8_t command) break; case CDROM_COMMAND_PAUSE_CDDA: // 85h cdrom_debug_log(_T("CMD PAUSE CDDA2(%02X)"), command); - read_mode = TOWNS_CD_PAUSE_CDDA; pause_cdda_from_cmd(); // ToDo : Re-Implement. break; case CDROM_COMMAND_RESUME_CDDA: // 87h cdrom_debug_log(_T("CMD RESUME CDDA(%02X)"), command); - read_mode = TOWNS_CD_UNPAUSE_CDDA; unpause_cdda_from_cmd(); break; default: @@ -702,9 +697,9 @@ uint8_t TOWNS_CDROM::read_status() if(status_queue->empty()) { has_status = false; } -// if((latest_command & 0x9f) == 0x80) { -// cdrom_debug_log(_T("STAT: %02X"), val); -// } + if((latest_command & 0x9f) == 0x80) { + cdrom_debug_log(_T("STAT: %02X"), val); + } if((status_queue->empty()) && (extra_status > 0)) { set_extra_status(); } @@ -774,10 +769,10 @@ void TOWNS_CDROM::read_cdrom() // status_not_accept(0, 0x00, 0x00, 0x00); return; } -// cdrom_debug_log(_T("READ_CDROM TRACK=%d LBA1=%d LBA2=%d M1/S1/F1=%02X/%02X/%02X M2/S2/F2=%02X/%02X/%02X PAD=%02X DCMD=%02X"), track, lba1, lba2, -// param_queue[0], param_queue[1], param_queue[2], -// param_queue[3], param_queue[4], param_queue[5], -// pad1, dcmd); + cdrom_debug_log(_T("READ_CDROM TRACK=%d LBA1=%d LBA2=%d M1/S1/F1=%02X/%02X/%02X M2/S2/F2=%02X/%02X/%02X PAD=%02X DCMD=%02X"), track, lba1, lba2, + param_queue[0], param_queue[1], param_queue[2], + param_queue[3], param_queue[4], param_queue[5], + pad1, dcmd); position = lba1 * physical_block_size(); __remain = (lba2 - lba1 + 1); read_length = __remain * logical_block_size(); @@ -795,6 +790,7 @@ void TOWNS_CDROM::read_cdrom() if(req_status) { // May not need extra status, integrated after reading. 20200906 K.O set_status(req_status, 0, 0x00, 0x00, 0x00, 0x00); +// set_status(req_status, 2, 0x00, 0x00, 0x00, 0x00); } else { if(pio_transfer) { set_status(true, 0, TOWNS_CD_STATUS_CMD_ABEND, 0x00, 0x00, 0x00); // OK? @@ -806,19 +802,16 @@ void TOWNS_CDROM::read_cdrom() void TOWNS_CDROM::read_cdrom_mode1() { - read_mode = TOWNS_CD_READ_MODE1; read_cdrom(); } void TOWNS_CDROM::read_cdrom_mode2() { - read_mode = TOWNS_CD_READ_MODE2; read_cdrom(); } void TOWNS_CDROM::read_cdrom_raw() { - read_mode = TOWNS_CD_READ_RAW; read_cdrom(); } @@ -993,13 +986,8 @@ void TOWNS_CDROM::set_extra_status() break; case CDROM_COMMAND_STOP_CDDA: - if(extra_status == 1) { - set_status_extra(TOWNS_CD_STATUS_STOP_DONE, 0x00, 0x00, 0x00); - extra_status++; - } else if(extra_status == 2) { // From Tsugaru - set_status_extra(0x00, TOWNS_CD_ACCEPT_WAIT, 0x00, 0x00); - extra_status = 0; - } + set_status_extra(TOWNS_CD_STATUS_STOP_DONE, 0x00, 0x00, 0x00); + extra_status = 0; break; case CDROM_COMMAND_PAUSE_CDDA: if(extra_status == 1) { @@ -1365,12 +1353,20 @@ void TOWNS_CDROM::event_callback(int event_id, int err) mcu_ready = false; bool stat = false; // cdrom_debug_log(_T("READ DATA SIZE=%d BUFFER COUNT=%d"), logical_block_size(), databuffer->count()); +#if 0 + if(read_length >= logical_block_size()) { + stat = read_buffer(logical_block_size()); + } else if(read_length > 0) { + stat = read_buffer(read_length); + } +#else // Note: Still error with reading D000h at TownsOS v1.1L30. // Maybe data has changed to 1Fh from 8Eh. /// 20200926 K.O if(read_length > 0) { stat = read_buffer(1); } +#endif if((stat)) { register_event(this, EVENT_CDROM_NEXT_SECTOR, (1.0e6 / ((double)transfer_speed * 150.0e3)) * @@ -1430,6 +1426,41 @@ bool TOWNS_CDROM::read_buffer(int sectors) status_media_changed(false); return false; } +#if 0 + uint32_t offset = (uint32_t)(position % physical_block_size()); + if(length > read_length) length = read_length; + int n_length = length; + if(!(seek_relative_frame_in_image(position / physical_block_size()))) { + status_illegal_lba(0, 0x00, 0x00, 0x00); + return false; + } + while(length > 0) { + uint8_t tmp_buffer[2448]; + int tmp_length = physical_block_size() - offset; + if(fio_img->Fread(tmp_buffer, tmp_length, 1) != 1) { + status_illegal_lba(0, 0x00, 0x00, 0x00); + return false; + } + int noffset = 16; + if(logical_block_size() >= physical_block_size()) { // Maybe raw + noffset = 0; + } + + for(int i = 0; i < tmp_length; i++) { + if((offset >= noffset) && (offset < (noffset + logical_block_size()))) { + uint8_t value = tmp_buffer[i]; + write_a_byte(value); +// is_data_in = false; + length--; + read_length--; + } + position++; + offset = (offset + 1) % physical_block_size(); + } + + access = true; + } +#else uint32_t offset = 0; if(!(seek_relative_frame_in_image(position / physical_block_size()))) { status_illegal_lba(0, 0x00, 0x00, 0x00); @@ -1438,8 +1469,7 @@ bool TOWNS_CDROM::read_buffer(int sectors) while(sectors > 0) { uint8_t tmp_buffer[2448]; int tmp_length = physical_block_size() - offset; - if(tmp_length > 2448) tmp_length = 2448; - if(tmp_length <= 0) return false; + if(fio_img->Fread(tmp_buffer, tmp_length, 1) != 1) { status_illegal_lba(0, 0x00, 0x00, 0x00); return false; @@ -1462,6 +1492,8 @@ bool TOWNS_CDROM::read_buffer(int sectors) sectors--; access = true; } +#endif + return true; } @@ -1503,7 +1535,6 @@ void TOWNS_CDROM::read_a_cdda_sample() force_seek = true; } else if(cdda_repeat_count == 0) { set_cdda_status(CDDA_ENDED); -// set_cdda_status(CDDA_OFF); set_subq(); access = false; return; @@ -1514,7 +1545,6 @@ void TOWNS_CDROM::read_a_cdda_sample() cdda_repeat_count--; if(cdda_repeat_count == 0) { set_cdda_status(CDDA_ENDED); -// set_cdda_status(CDDA_OFF); set_subq(); access = false; return; @@ -1670,7 +1700,6 @@ void TOWNS_CDROM::set_cdda_status(uint8_t status) cdda_repeat_count = -1; // OK? get_track_by_track_num(0); cdda_stopped = true; - read_mode = TOWNS_CD_READ_NONE; } touch_sound(); set_realtime_render(this, false); @@ -1781,10 +1810,7 @@ void TOWNS_CDROM::reset_device() pio_transfer_phase = false; stat_reply_intr = false; cdda_stopped = false; - read_mode = TOWNS_CD_READ_NONE; write_mcuint_signals(0x0); - - // write_signals(&outputs_mcuint, 0); // SCSI_DEV::reset_device(); // Will Implement @@ -1934,16 +1960,13 @@ void TOWNS_CDROM::stop_cdda_from_cmd() if(/*(status != CDDA_OFF) && */ (current_track >= 0) && (current_track < track_num) && (toc_table[current_track].is_audio)) { // OK? -// set_cdda_status(CDDA_ENDED); - set_cdda_status(CDDA_OFF); + set_cdda_status(CDDA_ENDED); set_subq(); status_accept(1, 0x00, 0x00); - read_mode = TOWNS_CD_STOP_CDDA; return; } set_subq(); status_accept(0, 0x00, 0x00); - read_mode = TOWNS_CD_STOP_CDDA; } void TOWNS_CDROM::pause_cdda_from_cmd() @@ -2007,8 +2030,6 @@ void TOWNS_CDROM::play_cdda_from_cmd() uint8_t is_repeat = param_queue[6]; // From Towns Linux v1.1/towns_cd.c uint8_t repeat_count = param_queue[7]; cdda_repeat_count = -1; - read_mode = TOWNS_CD_READ_CDDA; - if(!(mounted())) { status_not_ready(false); return; @@ -2964,7 +2985,7 @@ bool TOWNS_CDROM::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) /* * Note: 20200428 K.O: DO NOT USE STATE SAVE, STILL don't implement completely yet. */ -#define STATE_VERSION 6 +#define STATE_VERSION 5 bool TOWNS_CDROM::process_state(FILEIO* state_fio, bool loading) { @@ -3008,9 +3029,8 @@ bool TOWNS_CDROM::process_state(FILEIO* state_fio, bool loading) state_fio->StateValue(read_length); state_fio->StateValue(read_length_bak); state_fio->StateValue(next_seek_lba); - state_fio->StateValue(read_mode); - state_fio->StateValue(drq_tick); + state_fio->StateValue(mcuint_val); state_fio->StateValue(param_ptr); -- 2.11.0