• R/O
  • HTTP
  • SSH
  • HTTPS

common_source_project-fm7: Commit

Common Source Code Project for Qt (a.k.a for FM-7).


Commit MetaInfo

Revision0ab5a189ee3adf3db1e27fd3ba21d0230e6d02a1 (tree)
Time2020-02-19 00:15:06
AuthorK.Ohta <whatisthis.sowhat@gmai...>
CommiterK.Ohta

Log Message

[VM][FMTOWNS][CDROM][WIP] Has read a first sector, but overwritten by another sector (;_;)

Change Summary

Incremental Difference

--- a/source/src/vm/fmtowns/cdc.cpp
+++ b/source/src/vm/fmtowns/cdc.cpp
@@ -28,6 +28,7 @@ namespace FMTOWNS {
2828 #define EVENT_POLL_BUS_FREE 7
2929 #define EVENT_CDC_RESET 8
3030 #define EVENT_WAIT_CMD_REQ_OFF 9
31+#define EVENT_CDC_STATUS 10
3132
3233 void CDC::set_context_scsi_host(SCSI_HOST* dev)
3334 {
@@ -68,8 +69,8 @@ void CDC::reset()
6869 dma_intr = false;
6970 submpu_intr = false;
7071
71- dma_transfer = false;
72- pio_transfer = true;
72+ dma_transfer = true;
73+ pio_transfer = false;
7374 command_type_play = false; // false = status command
7475 stat_reply_intr = false;
7576 req_status = false;
@@ -103,6 +104,11 @@ void CDC::reset()
103104 cancel_event(this, event_wait_req);
104105 event_wait_req = -1;
105106 }
107+ if(event_cdc_status > -1) {
108+ cancel_event(this, event_cdc_status);
109+ event_cdc_status = -1;
110+ }
111+ buffer_count = -1;
106112 // d_scsi_host->reset();
107113 d_scsi_host->write_signal(SIG_SCSI_RST, 1, 1);
108114 d_scsi_host->write_signal(SIG_SCSI_ATN, 0, 1);
@@ -136,6 +142,7 @@ void CDC::initialize()
136142 event_enqueue_cmd = -1;
137143 event_wait_req = -1;
138144 event_wait_cmd_req_off = -1;
145+ event_cdc_status = -1;
139146 }
140147
141148 void CDC::release()
@@ -212,6 +219,11 @@ bool CDC::check_data_in()
212219 return (!(cd_status) && !(msg_status) && (io_status));
213220 }
214221
222+bool CDC::check_status()
223+{
224+ return ((cd_status) && !(msg_status) && !(io_status));
225+}
226+
215227 void CDC::select_unit_on()
216228 {
217229 out_debug_log("BUS FREE->SEL ON");
@@ -245,13 +257,15 @@ void CDC::prologue_command_phase()
245257 if(check_command_phase()) {
246258 out_debug_log("COMMAND PHASE");
247259 accept_command = true;
248- cancel_event(this, event_poll_cmd);
260+ if(event_poll_cmd > -1) {
261+ cancel_event(this, event_poll_cmd);
262+ }
249263 event_poll_cmd = -1;
250264 if(event_enqueue_cmd > -1) {
251265 cancel_event(this, event_enqueue_cmd);
252266 }
253267 if(left_cmdqueue < CDC_COMMAND_QUEUE_LENGTH) {
254-// d_scsi_host->write_signal(SIG_SCSI_SEL, 1, 1);
268+ d_scsi_host->write_signal(SIG_SCSI_SEL, 1, 1);
255269 start_enqueue_command();
256270 }
257271
@@ -261,6 +275,10 @@ void CDC::prologue_command_phase()
261275 void CDC::event_callback(int id, int error)
262276 {
263277 switch(id) {
278+ case EVENT_CDC_STATUS:
279+ write_signal(SIG_TOWNS_CDC_CDROM_DONE, 1, 1);
280+ event_cdc_status = -1;
281+ break;
264282 case EVENT_CDC_RESET:
265283 d_scsi_host->write_signal(SIG_SCSI_RST, 0, 1);
266284 break;
@@ -281,7 +299,7 @@ void CDC::event_callback(int id, int error)
281299 }
282300 break;
283301 case EVENT_ENQUEUE_CMD:
284- if((scsi_req_status) && (cd_status) && !(msg_status) && !(io_status)) {
302+ if((scsi_req_status) && (check_command_phase())) {
285303 if((accept_command) && (left_cmdqueue < CDC_COMMAND_QUEUE_LENGTH)) {
286304 data_in_status = false;
287305 uint8_t val = cmdqueue[current_cmdqueue].command[cmdqueue[current_cmdqueue].cmd_write_ptr];
@@ -325,7 +343,7 @@ void CDC::event_callback(int id, int error)
325343 current_cmdqueue++;
326344 current_cmdqueue = current_cmdqueue & (CDC_COMMAND_QUEUE_LENGTH - 1);
327345 d_scsi_host->write_signal(SIG_SCSI_ACK, 0, 1);
328- register_event(this, EVENT_WAIT_REQ, 1.0, true, &event_wait_req);
346+ register_event(this, EVENT_WAIT_REQ, 1.0e6 / 300.0e3, true, &event_wait_req);
329347 } else {
330348 // Continue
331349 if(event_enqueue_cmd > -1) {
@@ -336,45 +354,56 @@ void CDC::event_callback(int id, int error)
336354 }
337355 }
338356 case EVENT_WAIT_REQ:
339- if((scsi_req_status)) {
340357 #if 0
341- if(!(cd_status) && !(msg_status) && (io_status)) { // DATA IN
342- out_debug_log("DATA IN");
343- data_in_status = true;
344- if(!(pio_transfer) && (dma_transfer)) {
345- // WAIT FOR DRQ, NOT EVENT.
346- cancel_event(this, event_wait_req);
347- event_wait_req = -1;
348- } else if((pio_transfer) && !(dma_transfer)) {
349- data_reg = d_scsi_host->read_dma_io8(0);
350-// data_in_status = false;
351- // WAIT FOR DRQ, NOT EVENT.
352-// cancel_event(this, event_wait_req);
353-// event_wait_req = -1;
354- }
355- } else
356-#endif
357- if(((cd_status) && !(msg_status) && (io_status)) ||// STATUS
358- ((cd_status) && (msg_status) && (io_status))) { // MSG IN
359- data_in_status = true;
360- if(!(pio_transfer) && (dma_transfer)) {
361- //uint8_t val = d_scsi_host->read_dma_io8(0);
362- //out_debug_log(_T("STATUS DATA=%02X"), val);
363- d_dmac->write_signal(SIG_UPD71071_CH3, 0xff, 0xff);
364- //data_reg = val;
365- // WAIT FOR DRQ, NOT EVENT.
366- cancel_event(this, event_wait_req);
367- event_wait_req = -1;
368- } else if((pio_transfer) && !(dma_transfer)) {
369- data_reg = d_scsi_host->read_dma_io8(0);
370- out_debug_log(_T("STATUS DATA=%02X"), data_reg);
371- d_scsi_host->write_signal(SIG_SCSI_ACK, 1, 1);
372- // WAIT FOR DRQ, NOT EVENT.
373-// cancel_event(this, event_wait_req);
374-// event_wait_req = -1;
375- }
376- } else { // ToDo: implement DATA OUT, MSG OUT and COMMAND
377- }
358+ if((scsi_req_status)) {
359+ if((check_data_in()) && (busy_status)) {
360+ if(dma_transfer) { // DATA IN and DMA TRANSFER
361+ if(buffer_count < 0) {
362+ // Timeout or read ended
363+ //dma_transfer = false;
364+ //pio_transter = false;
365+ //if(event_wait_req > -1) {
366+ // cancel_event(this, event_wait_req);
367+ // event_wait_req = true;
368+ //}
369+ } else {
370+ d_dmac->write_signal(SIG_UPD71071_CH3, 0xff, 0xff);
371+ buffer_count++;
372+ if(buffer_count >= 2048) {
373+ //data_reg = d_scsi_host->read_dma_io8(0);
374+ if(check_status()) {
375+ // END OF READING
376+ extra_status = 0;
377+ write_status(0x06, 0x00, 0x00, 0x00);
378+ pio_transfer = false;
379+ dma_transfer = false;
380+ write_signal(SIG_TOWNS_CDC_IRQ, 1, 1);
381+ buffer_count = -1;
382+ submpu_ready = true;
383+ if(event_wait_req > -1) {
384+ cancel_event(this, event_wait_req);
385+ event_wait_req = true;
386+ }
387+ } else {
388+ // Try to next
389+ extra_status = 0;
390+ write_status(0x22, 0x00, 0x00, 0x00);
391+ write_signal(SIG_TOWNS_CDC_IRQ, 1, 1);
392+ //submpu_ready = true;
393+ pio_transfer = false;
394+ dma_transfer = true;
395+ buffer_count = 0;
396+ }
397+ }
398+ }
399+ } else {
400+ // PIO TRANSFER
401+ if(event_wait_req > -1) {
402+ cancel_event(this, event_wait_req);
403+ event_wait_req = true;
404+ }
405+ }
406+ }
378407 } else {
379408 // BUS FREE
380409 // d_scsi_host->write_signal(SIG_SCSI_SEL, 0, 1);
@@ -382,6 +411,12 @@ void CDC::event_callback(int id, int error)
382411 // event_wait_req = -1;
383412 // EOL
384413 }
414+#else
415+ if(event_wait_req > -1) {
416+ cancel_event(this, event_wait_req);
417+ event_wait_req = true;
418+ }
419+#endif
385420 break;
386421 }
387422 }
@@ -438,10 +473,15 @@ void CDC::write_io8(uint32_t address, uint32_t data)
438473 if((data & 0x08) != 0) {
439474 dma_transfer = false;
440475 pio_transfer = true;
476+ buffer_count = 0;
441477 }
442478 if((data & 0x10) != 0) {
443479 dma_transfer = true;
444480 pio_transfer = false;
481+ if(buffer_count < 0) {
482+ buffer_count = 0;
483+ // Read speed
484+ }
445485 }
446486 w_regs[address & 0x0f] = data;
447487 break;
@@ -458,7 +498,8 @@ uint32_t CDC::read_io8(uint32_t address)
458498 /*
459499 * 04C0h : Master status register
460500 */
461- uint32_t val = 0xff;
501+ uint32_t val = 0;
502+// val = (uint32_t)(stat_fifo->read_not_remove(0) & 0xff);
462503 switch(address & 0x0f) {
463504 case 0x0: //Master status
464505 {
@@ -472,7 +513,9 @@ uint32_t CDC::read_io8(uint32_t address)
472513 }
473514 break;
474515 case 0x2: // Status register
516+// val = (uint32_t)(stat_fifo->read_not_remove(0) & 0xff);
475517 val = (uint32_t)(stat_fifo->read() & 0xff);
518+ out_debug_log(_T("STATUS=%02X"), val);
476519 if(stat_fifo->empty()) {
477520 has_status = false;
478521 if(extra_status != 0) {
@@ -524,9 +567,9 @@ uint32_t CDC::read_io8(uint32_t address)
524567 }
525568 break;
526569 default:
527- if(extra_status == 7) {
528- d_cdrom->write_signal(SIG_TOWNS_CDROM_SET_STAT_TRACK, 0x01, 0x01);
529- }
570+// if(extra_status == 7) {
571+// d_cdrom->write_signal(SIG_TOWNS_CDROM_SET_STAT_TRACK, 0x01, 0x01);
572+// }
530573 if((extra_status & 0x01) != 0) {
531574 uint32_t adr_control = d_cdrom->read_signal(SIG_TOWNS_CDROM_GET_ADR);
532575 write_status(0x16, ((adr_control & 0x0f) << 4) | ((adr_control >> 4) & 0x0f), TO_BCD((extra_status / 2) - 2), 0x00);
@@ -543,7 +586,7 @@ uint32_t CDC::read_io8(uint32_t address)
543586 break;
544587 }
545588 }
546- case 0x06: // CDDA status
589+ case 0x06: // READ CDDA status
547590 {
548591 switch(extra_status) {
549592 case 1: // Get current track
@@ -579,14 +622,48 @@ uint32_t CDC::read_io8(uint32_t address)
579622 write_status(0x11, 0x00, 0x00, 0x00);
580623 extra_status = 0;
581624 break;
625+ case 0x85:
626+ write_status(0x12, 0x00, 0x00, 0x00);
627+ extra_status = 0;
628+ break;
582629 }
630+ } else {
631+ has_status = false;
583632 }
584633 }
634+// stat_fifo->read(); // Increment read pointer
635+ if(stat_fifo->empty()) {
636+ //stat_fifo->clear(); //
637+ }
585638 break;
586639 case 0x4: //
587- val = data_reg;
588640 if((pio_transfer)) {
589- data_reg = d_scsi_host->read_dma_io8(0);
641+ if((scsi_req_status) && (check_data_in()) && (busy_status)) {
642+ data_reg = d_scsi_host->read_dma_io8(0);
643+ buffer_count++;
644+ if(buffer_count >= 2048) {
645+ if(check_status()) {
646+ // END OF READING
647+ extra_status = 0;
648+ write_status(0x06, 0x00, 0x00, 0x00);
649+ pio_transfer = false;
650+ dma_transfer = false;
651+ write_signal(SIG_TOWNS_CDC_IRQ, 1, 1);
652+ buffer_count = -1;
653+ submpu_ready = true;
654+ } else {
655+ // Try to next
656+ extra_status = 0;
657+ write_status(0x21, 0x00, 0x00, 0x00);
658+ write_signal(SIG_TOWNS_CDC_IRQ, 1, 1);
659+ //submpu_ready = true;
660+ pio_transfer = true;
661+ dma_transfer = false;
662+ buffer_count = 0;
663+ }
664+ }
665+ }
666+ val = data_reg;
590667 // out_debug_log(_T("PIO READ DATA=%02X"), val);
591668 }
592669 break;
@@ -641,23 +718,35 @@ void CDC::read_cdrom(bool req_reply)
641718 write_status(0x01, 0x00, 0x00, 0x00);
642719 return;
643720 }
721+// __remain = ((lba2 - lba1) >> 2) + 1;
644722 __remain = lba2 - lba1;
645723 //seek_time = get_seek_time(lba1);
646724 uint8_t command[16] = {0};
725+ extra_status = 0;
726+#if 0
727+ command[0] = SCSI_CMD_READ6;
728+ command[1] = (uint8_t)((lba1 / 0x10000) & 0x1f);
729+ command[2] = (uint8_t)((lba1 / 0x100) & 0xff);
730+ command[3] = (uint8_t)(lba1 & 0xff);
731+ command[4] = (uint8_t) (__remain % 0x100);
732+ enqueue_cmdqueue(6, command);
733+#else
734+ out_debug_log(_T("LOGICAL BLOCK SIZE=%d"), d_cdrom->logical_block_size());
647735 command[0] = SCSI_CMD_READ12;
648736 command[1] = 0;
649737 command[2] = 0;
650- command[3] = m1;
651- command[4] = s1;
652- command[5] = f1;
653-
738+ command[2] = (uint8_t)((lba1 / 0x1000000) & 0xff);
739+ command[3] = (uint8_t)((lba1 / 0x10000) & 0xff);
740+ command[4] = (uint8_t)((lba1 / 0x100) & 0xff);
741+ command[5] = (uint8_t)(lba1 & 0xff);
654742 command[6] = 0;
655743 command[7] = (uint8_t)((__remain / 0x10000) & 0xff);
656744 command[8] = (uint8_t)((__remain / 0x100) & 0xff);
657745 command[9] = (uint8_t) (__remain % 0x100);
658746
659747 enqueue_cmdqueue(12, command);
660-
748+#endif
749+#if 0
661750 if(req_reply) {
662751 extra_status = 2;
663752 write_status(0x00, 0x00, 0x00, 0x00);
@@ -669,7 +758,8 @@ void CDC::read_cdrom(bool req_reply)
669758 write_status(0x22, 0x00, 0x00, 0x00);
670759 }
671760 }
672-// submpu_ready = false;
761+#endif
762+ submpu_ready = false;
673763 }
674764
675765 void CDC::stop_cdda(bool req_reply)
@@ -830,7 +920,7 @@ void CDC::play_cdda(bool req_reply)
830920 // submpu_ready = false;
831921 }
832922
833-void CDC::write_status(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
923+void CDC::write_status(uint8_t a, uint8_t b, uint8_t c, uint8_t d, bool immediately)
834924 {
835925 has_status = true;
836926 stat_fifo->clear();
@@ -838,13 +928,16 @@ void CDC::write_status(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
838928 stat_fifo->write(b);
839929 stat_fifo->write(c);
840930 stat_fifo->write(d);
841- if(stat_reply_intr) {
842- submpu_intr = true;
843- if(!(submpu_intr_mask)) {
844- write_signals(&output_submpu_intr, 0xffffffff);
845- }
846- submpu_ready = true;
931+ if(event_cdc_status > -1) {
932+ cancel_event(this, event_cdc_status);
933+ event_cdc_status = -1;
934+ }
935+ if(immediately) {
936+ event_callback(EVENT_CDC_STATUS, 0);
937+ } else {
938+ register_event(this, EVENT_CDC_STATUS, 1000.0, false, &event_cdc_status);
847939 }
940+ out_debug_log(_T("STATUS=%02X %02X %02X %02X"), a, b, c, d);
848941 }
849942
850943 void CDC::enqueue_command_play(uint8_t cmd)
@@ -858,7 +951,6 @@ void CDC::enqueue_command_play(uint8_t cmd)
858951 }
859952 } else {
860953 has_status = false;
861-// d_scsi_host->write_dma_io8(0, 0x81); // SELECT SCSI 0
862954 switch(cmd & 0x1f) {
863955 case 0x00: // SEEK
864956 out_debug_log(_T("CMD SEEK (%02X)"), cmd);
@@ -877,6 +969,7 @@ void CDC::enqueue_command_play(uint8_t cmd)
877969 break;
878970 case 0x02: // READ (Mode1)
879971 out_debug_log(_T("CMD READ MODE1 (%02X)"), cmd);
972+ d_cdrom->set_read_mode(false); // MAKE CDROM to MODE1(2048 bytes / sector)
880973 read_cdrom(req_status);
881974 break;
882975 case 0x04: // PLAY CDDA
@@ -969,20 +1062,48 @@ void CDC::write_signal(int ch, uint32_t data, uint32_t mask)
9691062 {
9701063 switch(ch) {
9711064 case SIG_TOWNS_CDC_DRQ:
972-// out_debug_log(_T("SIG_TOWNS_CDC_DRQ"));
1065+// out_debug_log(_T("SIG_TOWNS_CDC_DRQ %02X %02X"), data, mask);
9731066 if((data & mask) != 0) {
9741067 if((dma_transfer) ) {
9751068 software_transfer_phase = false;
976- out_debug_log(_T("DRQ/DMA"));
977- if((scsi_req_status) && (check_data_in())) {
978- out_debug_log(_T("SEND DMAREQ to DMA3"));
1069+// out_debug_log(_T("DRQ/DMA"));
1070+// d_scsi_host->write_signal(SIG_SCSI_ACK, 0, 1);
1071+ //if((scsi_req_status) && (check_data_in())) {
9791072 d_dmac->write_signal(SIG_UPD71071_CH3, 0xff, 0xff);
980- }
1073+ buffer_count++;
1074+// out_debug_log(_T("SEND DMAREQ to DMA3 COUNT=%d"), buffer_count);
1075+ if(buffer_count >= 2048) {
1076+ if(check_status()) {
1077+ // END OF READING
1078+ extra_status = 0;
1079+ write_status(0x06, 0x00, 0x00, 0x00, true);
1080+ write_signal(SIG_TOWNS_CDC_IRQ, 1, 1);
1081+ buffer_count = -1;
1082+ submpu_ready = true;
1083+ if(event_wait_req > -1) {
1084+ cancel_event(this, event_wait_req);
1085+ event_wait_req = true;
1086+ }
1087+ out_debug_log(_T("TRANSFER COMPLETED"));
1088+ } else {
1089+ // Try to next
1090+ extra_status = 0;
1091+ write_status(0x22, 0x00, 0x00, 0x00, true);
1092+ write_signal(SIG_TOWNS_CDC_IRQ, 1, 1);
1093+ buffer_count = -1;
1094+ out_debug_log(_T("SEEK TO NEXT SECTOR"));
1095+ }
1096+ }
1097+ //}
9811098 } else if((pio_transfer) ) {
9821099 software_transfer_phase = true;
9831100 } else {
9841101 software_transfer_phase = false;
9851102 }
1103+ } else {
1104+ if((dma_transfer) ) {
1105+ d_dmac->write_signal(SIG_UPD71071_CH3, 0x00, 0xff);
1106+ }
9861107 }
9871108 break;
9881109 case SIG_TOWNS_CDC_CDROM_DONE:
@@ -996,13 +1117,18 @@ void CDC::write_signal(int ch, uint32_t data, uint32_t mask)
9961117 }
9971118 break;
9981119 case SIG_TOWNS_CDC_IRQ:
999- dma_intr = ((data & mask) != 0);
1000- if((dma_intr & dma_intr_mask)) {
1001- if(stat_reply_intr) {
1002- write_signals(&output_dma_intr, 0xffffffff);
1120+ {
1121+ bool backup = dma_intr;
1122+ dma_intr = ((data & mask) != 0);
1123+ if(dma_intr == backup) break;
1124+ if((dma_intr & dma_intr_mask)) {
1125+ if(stat_reply_intr) {
1126+ write_signals(&output_dma_intr, 0xffffffff);
1127+ }
1128+ out_debug_log(_T("IRQ"));
1129+ } else if(!(dma_intr) && (dma_intr_mask)) {
1130+ write_signals(&output_dma_intr, 0x00000000);
10031131 }
1004- } else if(!(dma_intr) && (dma_intr_mask)) {
1005- write_signals(&output_dma_intr, 0x00000000);
10061132 }
10071133 break;
10081134 case SIG_TOWNS_CDC_BSY:
@@ -1115,6 +1241,7 @@ bool CDC::process_state(FILEIO* state_fio, bool loading)
11151241 state_fio->StateValue(cmdqueue[i].cmd_table_size);
11161242 state_fio->StateValue(cmdqueue[i].cmd_write_ptr);
11171243 }
1244+ state_fio->StateValue(buffer_count);
11181245
11191246 state_fio->StateValue(event_cdrom_sel);
11201247 state_fio->StateValue(event_poll_cmd);
@@ -1122,6 +1249,8 @@ bool CDC::process_state(FILEIO* state_fio, bool loading)
11221249 state_fio->StateValue(event_wait_req);
11231250 state_fio->StateValue(event_wait_cmd_req_off);
11241251
1252+ state_fio->StateValue(event_cdc_status);
1253+
11251254 return true;
11261255
11271256 }
--- a/source/src/vm/fmtowns/cdc.h
+++ b/source/src/vm/fmtowns/cdc.h
@@ -81,25 +81,28 @@ protected:
8181
8282 bool accept_command;
8383 bool req_status;
84+ int buffer_count;
8485
8586 int event_cdrom_sel;
8687 int event_poll_cmd;
8788 int event_enqueue_cmd;
8889 int event_wait_req;
8990 int event_wait_cmd_req_off;
91+ int event_cdc_status;
9092
9193 virtual void read_cdrom(bool req_reply);
9294 virtual void stop_cdda(bool req_reply);
9395 virtual void stop_cdda2(bool req_reply);
9496 virtual void unpause_cdda(bool rea_reply);
9597 virtual void play_cdda(bool req_reply);
96- virtual void write_status(uint8_t a, uint8_t b, uint8_t c, uint8_t d);
98+ virtual void __FASTCALL write_status(uint8_t a, uint8_t b, uint8_t c, uint8_t d, bool immediately = false);
9799 virtual void enqueue_command_play(uint8_t cmd);
98100 virtual void enqueue_command_status(uint8_t cmd);
99101
100102 bool check_bus_free();
101103 bool check_command_phase();
102104 bool check_data_in();
105+ bool check_status();
103106 void select_unit_on();
104107 void select_unit_off();
105108 void select_unit_off2();
--- a/source/src/vm/fmtowns/fmtowns.cpp
+++ b/source/src/vm/fmtowns/fmtowns.cpp
@@ -349,7 +349,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
349349 cdrom->set_context_interface(cdc_scsi);
350350 cdc->set_context_scsi_host(cdc_scsi);
351351 cdc_scsi->set_context_target(cdrom);
352- cdrom->set_context_done(cdc, SIG_TOWNS_CDC_CDROM_DONE, 1);
352+// cdrom->set_context_done(cdc, SIG_TOWNS_CDC_CDROM_DONE, 1);
353353
354354 cdc->set_context_cdrom(cdrom);
355355 cdc->set_context_dmac(dma);
--- a/source/src/vm/fmtowns/towns_cdrom.cpp
+++ b/source/src/vm/fmtowns/towns_cdrom.cpp
@@ -253,7 +253,6 @@ void TOWNS_CDROM::start_command()
253253 case SCSI_CMD_READ10:
254254 case SCSI_CMD_READ12:
255255 SCSI_CDROM::start_command();
256- set_subq(); // First
257256 break;
258257 case 0xff:
259258 // End of List
@@ -371,7 +370,7 @@ void TOWNS_CDROM::set_subq(void)
371370 subq_buffer->write(TO_BCD((msf_abs >> 8) & 0xff)); // S (absolute)
372371 subq_buffer->write(TO_BCD((msf_abs >> 0) & 0xff)); // F (absolute)
373372 // transfer length
374- remain = subq_buffer->count();
373+ //remain = subq_buffer->count();
375374 // set first data
376375 // change to data in phase
377376 //set_phase_delay(SCSI_PHASE_DATA_IN, 10.0);
@@ -379,9 +378,9 @@ void TOWNS_CDROM::set_subq(void)
379378 //write_signals(&output_subq_overrun, (subq_buffer->empty()) ? 0x00000000 : 0xffffffff); // OK?
380379 subq_buffer->clear();
381380 // transfer length
382- remain = subq_buffer->count();
381+ //remain = subq_buffer->count();
383382 set_dat(is_device_ready() ? SCSI_STATUS_GOOD : SCSI_STATUS_CHKCOND);
384- //set_phase_delay(SCSI_PHASE_STATUS, 10.0);
383+ set_phase_delay(SCSI_PHASE_STATUS, 10.0);
385384 }
386385 return;
387386 }
--- a/source/src/vm/fmtowns/towns_cdrom.h
+++ b/source/src/vm/fmtowns/towns_cdrom.h
@@ -103,6 +103,10 @@ public:
103103 {
104104 return cdda_status;
105105 }
106+ void set_read_mode(bool is_mode2)
107+ {
108+ read_mode = is_mode2;
109+ }
106110 };
107111
108112 }
--- a/source/src/vm/fmtowns/towns_dmac.cpp
+++ b/source/src/vm/fmtowns/towns_dmac.cpp
@@ -27,6 +27,10 @@ void TOWNS_DMAC::write_io8(uint32_t addr, uint32_t data)
2727 dma_high_address = (data & 0xff) << 24;
2828 return;
2929 break;
30+// case 0x08:
31+// cmd = (cmd & 0xff00) | (data & 0xfb);
32+// return;
33+// break;
3034 default:
3135 break;
3236 }
@@ -42,7 +46,7 @@ uint32_t TOWNS_DMAC::read_io8(uint32_t addr)
4246 }
4347 return UPD71071::read_io8(addr);
4448 }
45-
49+#if 0
4650 // Note: DATABUS will be 16bit wide. 20200131 K.O
4751 void TOWNS_DMAC::do_dma_verify_16bit(int c)
4852 {
@@ -143,7 +147,7 @@ void TOWNS_DMAC::do_dma_mem_to_dev_16bit(int c)
143147 // update temporary register
144148 tmp = val;
145149 }
146-
150+#endif
147151
148152 void TOWNS_DMAC::do_dma_inc_dec_ptr_8bit(int c)
149153 {
@@ -217,6 +221,7 @@ void TOWNS_DMAC::write_signal(int id, uint32_t data, uint32_t mask)
217221
218222 void TOWNS_DMAC::write_via_debugger_data8(uint32_t addr, uint32_t data)
219223 {
224+ out_debug_log(_T("WRITE 8BIT ADDR %08X to DATA:%02X"), addr, data);
220225 d_mem->write_dma_data8(addr & dma_addr_mask, data);
221226 }
222227
@@ -227,6 +232,7 @@ uint32_t TOWNS_DMAC::read_via_debugger_data8(uint32_t addr)
227232
228233 void TOWNS_DMAC::write_via_debugger_data16(uint32_t addr, uint32_t data)
229234 {
235+// out_debug_log(_T("WRITE 16BIT DATA:%04X"), data);
230236 d_mem->write_dma_data16(addr & dma_addr_mask, data);
231237 }
232238
--- a/source/src/vm/fmtowns/towns_dmac.h
+++ b/source/src/vm/fmtowns/towns_dmac.h
@@ -18,9 +18,9 @@ protected:
1818 uint32_t dma_addr_mask;
1919 uint32_t dma_high_address;
2020
21- virtual void __FASTCALL do_dma_verify_16bit(int c);
22- virtual void __FASTCALL do_dma_dev_to_mem_16bit(int c);
23- virtual void __FASTCALL do_dma_mem_to_dev_16bit(int c);
21+// virtual void __FASTCALL do_dma_verify_16bit(int c);
22+// virtual void __FASTCALL do_dma_dev_to_mem_16bit(int c);
23+// virtual void __FASTCALL do_dma_mem_to_dev_16bit(int c);
2424 virtual void __FASTCALL do_dma_inc_dec_ptr_8bit(int c);
2525 virtual void __FASTCALL do_dma_inc_dec_ptr_16bit(int c);
2626 public:
--- a/source/src/vm/scsi_dev.cpp
+++ b/source/src/vm/scsi_dev.cpp
@@ -248,6 +248,7 @@ void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask)
248248 // update buffer
249249 if(buffer->count() == 0) {
250250 int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain;
251+ out_debug_log(_T("LOAD BUFFER to %d bytes"), length);
251252 if(!read_buffer(length)) {
252253 // change to status phase
253254 set_dat(SCSI_STATUS_CHKCOND);
@@ -713,15 +714,16 @@ void SCSI_DEV::start_command()
713714 case SCSI_CMD_READ12:
714715 // start position
715716 position = command[2] * 0x1000000 + command[3] * 0x10000 + command[4] * 0x100 + command[5];
716- out_debug_log(_T("Command: Read 12-byte LBA=%d BLOCKS=%d\n"), position, command[6] * 0x1000000 + command[7] * 0x10000 + command[8] * 0x100 + command[9]);
717- position *= physical_block_size();
718717 // transfer length
719718 remain = command[6] * 0x1000000 + command[7] * 0x10000 + command[8] * 0x100 + command[9];
719+ out_debug_log(_T("Command: Read 12-byte LBA=%d BLOCKS=%d PBS=%d LBS=%d\n"), position, remain, physical_block_size(), logical_block_size());
720+ position *= physical_block_size();
720721 remain *= logical_block_size();
721722 if(remain != 0) {
722723 // read data buffer
723724 buffer->clear();
724725 int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain;
726+ out_debug_log(_T("LOAD BUFFER to %d bytes"), length);
725727 if(!read_buffer(length)) {
726728 // change to status phase
727729 set_dat(SCSI_STATUS_CHKCOND);
Show on old repository browser