}
}
current_track = 0;
- read_mode = false;
+ read_mode = MODE_MODE1_2048;
+
set_cdda_status(CDDA_OFF);
read_sectors = 0;
write_signals(&outputs_drq, 0);
clear_event(event_next_sector);
clear_event(event_seek_completed);
// event_callback(EVENT_CDROM_DMA_EOT, -1);
-// set_dma_intr(true);
+ set_dma_intr(true);
register_event(this, EVENT_CDROM_DMA_EOT,
(1.0e6 / ((double)transfer_speed * 150.0e3)) * 16.0, // OK?
false, &event_next_sector);
void TOWNS_CDROM::set_delay_ready()
{
clear_event(event_delay_ready);
- register_event(this, EVENT_CDROM_DELAY_READY, 1.0e3, false, &event_delay_ready);
+ // From Towns Linux 2.2
+ register_event(this, EVENT_CDROM_DELAY_READY, 300.0, false, &event_delay_ready);
}
void TOWNS_CDROM::set_delay_ready2()
{
clear_event(event_delay_ready);
- register_event(this, EVENT_CDROM_DELAY_READY2, 1.0e3, false, &event_delay_ready);
+ // From Towns Linux 2.2
+ register_event(this, EVENT_CDROM_DELAY_READY2, 300.0, false, &event_delay_ready);
}
void TOWNS_CDROM::status_not_accept(int extra, uint8_t s1, uint8_t s2, uint8_t s3)
break;
case CDROM_COMMAND_READ_MODE2: // 01h
out_debug_log(_T("CMD READ MODE2(%02X)"), command);
- status_not_accept(0, 0xff, 0xff, 0xff);
+ read_cdrom_mode2();
+// status_not_accept(0, 0xff, 0xff, 0xff);
break;
case CDROM_COMMAND_READ_MODE1: // 02h
out_debug_log(_T("CMD READ MODE1(%02X)"), command);
- read_cdrom();
+ read_cdrom_mode1();
+ break;
+ case CDROM_COMMAND_READ_RAW: // 03h
+ out_debug_log(_T("CMD READ RAW(%02X)"), command);
+ read_cdrom_raw();
+// status_not_accept(0, 0xff, 0xff, 0xff);
break;
case CDROM_COMMAND_PLAY_TRACK: // 04h
out_debug_log(_T("CMD PLAY TRACK(%02X)"), command);
}
}
+void TOWNS_CDROM::read_cdrom_mode1()
+{
+ read_mode = MODE_MODE1_2048;
+ read_cdrom();
+}
+
+void TOWNS_CDROM::read_cdrom_mode2()
+{
+ read_mode = MODE_MODE2_2336;
+ read_cdrom();
+}
+
+void TOWNS_CDROM::read_cdrom_raw()
+{
+ read_mode = MODE_MODE2_2352;
+ read_cdrom();
+}
+
void TOWNS_CDROM::set_status(bool _req_status, int extra, uint8_t s0, uint8_t s1, uint8_t s2, uint8_t s3)
{
int TOWNS_CDROM::logical_block_size()
{
- if(current_track <= 0) return 2048; // PAD
- if(!mounted()) return 2048; // PAD
+ if(current_track <= 0) return 2352; // PAD
+ if(!mounted()) return 2352; // PAD
if(toc_table[current_track].is_audio) {
return 2352;
+ } else if(read_mode == MODE_MODE2_2352) {
+ return 2340;
+ } else if(read_mode == MODE_MODE2_2336) { // MODE2
+ return 2336;
}
- if(read_mode) { // MODE2
- return 2352;
- }
+ // OK?
return 2048;
}
case EVENT_CDROM_DMA_EOT:
event_next_sector = -1;
if(read_length <= 0) {
+ dma_transfer_phase = false;
out_debug_log(_T("EOT(DMA)"));
set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00);
- set_dma_intr(true);
} else {
- set_dma_intr(true);
event_callback(EVENT_CDROM_NEXT_SECTOR, -1);
}
// event_callback(EVENT_CDROM_NEXT_SECTOR, -1);
status_not_ready();
return false;
}
- uint32_t offset = (uint32_t)(position % 2352);
+ uint32_t offset = (uint32_t)(position % physical_block_size());
int n_length = length;
if(!(seek_relative_frame_in_image(position / physical_block_size()))) {
status_illegal_lba(0, 0x00, 0x00, 0x00);
status_illegal_lba(0, 0x00, 0x00, 0x00);
return false;
}
- for(int i = 0; i < tmp_length; i++) {
- if((offset >= 16) && (offset < (16 + logical_block_size()))) {
+ if(logical_block_size() > 2336) { // Maybe raw
+ for(int i = 0; i < tmp_length; i++) {
int value = tmp_buffer[i];
buffer->write(value);
// is_data_in = false;
}
position++;
offset = (offset + 1) % 2352;
+ } else { // MODE1 or MODE2
+ for(int i = 0; i < tmp_length; i++) {
+ if((offset >= 16) && (offset < (16 + logical_block_size()))) {
+ int value = tmp_buffer[i];
+ buffer->write(value);
+// is_data_in = false;
+ length--;
+ read_length--;
+ // Kick DRQ
+ if(event_drq < 0) {
+ if(dma_transfer) {
+ out_debug_log(_T("KICK DRQ"));
+ register_event(this, EVENT_CDROM_DRQ, 1.0e6 / ((double)transfer_speed * 150.0e3), true, &event_drq);
+ }
+ }
+ }
+ position++;
+ offset = (offset + 1) % 2352;
+ }
+ access = true;
}
- access = true;
}
return true;
}
CUE_INDEX,
CUE_PREGAP,
};
-enum {
- MODE_AUDIO = 0,
- MODE_MODE1_2352,
- MODE_MODE1_2048,
- MODE_CD_G,
- MODE_MODE2_2336,
- MODE_MODE2_2352,
- MODE_CDI_2336,
- MODE_CDI_2352,
- MODE_NONE
-};
bool TOWNS_CDROM::parse_cue_file_args(std::string& _arg2, const _TCHAR *parent_dir, std::string& imgpath)
{
val = val | ((dma_transfer_phase) ? 0x10 : 0x00); // USING DMAC ch.3
val = val | ((has_status) ? 0x02 : 0x00);
val = val | ((mcu_ready) ? 0x01 : 0x00);
- if((mcu_intr) || (dma_intr)) {
- mcu_intr = false;
- dma_intr = false;
- write_signals(&outputs_mcuint, 0x00000000);
- }
+// if((mcu_intr) || (dma_intr)) {
+// mcu_intr = false;
+// dma_intr = false;
+// write_signals(&outputs_mcuint, 0x00000000);
+// }
break;
case 0x02:
val = read_status();