2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
16 //#define _SCSI_DEBUG_LOG
18 void SCSI_DEV::initialize()
21 buffer = new FIFO(SCSI_BUFFER_SIZE);
22 phase = SCSI_PHASE_BUS_FREE;
23 _SCSI_DEV_IMMEDIATE_SELECT = osd->check_feature(_T("SCSI_DEV_IMMEDIATE_SELECT"));
24 __SCSI_DEBUG_LOG = osd->check_feature(_T("_SCSI_DEBUG_LOG"));
25 _SCSI_HOST_WIDE = osd->check_feature(_T("SCSI_HOST_WIDE"));
26 _OUT_DEBUG_LOG = false; // Temporally.
28 update_signal_mask(&outputs_dat, NULL, 0xffff); // Update to 16bit wide.
32 void SCSI_DEV::out_debug_log(const _TCHAR *format, ...)
34 if(!(__SCSI_DEBUG_LOG) && !(_OUT_DEBUG_LOG)) return;
36 _TCHAR _tmps[4096] = {0};
37 _TCHAR _domain[256] = {0};
38 my_sprintf_s(_domain, sizeof(_domain) / sizeof(_TCHAR), _T("[SCSI_DEV:ID=%d]"), scsi_id);
39 va_start(args, format);
40 vsnprintf(_tmps, sizeof(_tmps) / sizeof(_TCHAR), format, args);
42 DEVICE::out_debug_log(_T("%s %s"), _domain, _tmps);
45 void SCSI_DEV::release()
51 void SCSI_DEV::reset()
54 sel_status = atn_status = ack_status = rst_status = false;
55 selected = atn_pending = false;
57 event_sel = event_phase = event_req = -1;
58 set_phase(SCSI_PHASE_BUS_FREE);
59 set_sense_code(SCSI_SENSE_NOSENSE);
62 void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask)
66 data_bus = data & mask;
67 // out_debug_log(_T("DATA=%04X"), data_bus);
72 bool prev_status = sel_status;
73 sel_status = ((data & mask) != 0);
75 if(phase != SCSI_PHASE_BUS_FREE) {
76 // this device is already selected
77 } else if(!prev_status && sel_status) {
79 if(_SCSI_DEV_IMMEDIATE_SELECT) {
80 event_callback(EVENT_SEL, 0);
83 cancel_event(this, event_sel);
85 register_event(this, EVENT_SEL, 20.0, false, &event_sel);
87 } else if(prev_status && !sel_status) {
90 cancel_event(this, event_sel);
95 // change to message out phase
97 set_phase_delay(SCSI_PHASE_MESSAGE_OUT, 10.0);
98 // set_phase(SCSI_PHASE_MESSAGE_OUT);
100 // change to command phase
101 memset(command, 0, sizeof(command));
103 set_phase_delay(SCSI_PHASE_COMMAND, 10.0);
104 // set_phase(SCSI_PHASE_COMMAND);
113 bool prev_status = atn_status;
114 atn_status = ((data & mask) != 0);
116 if(phase == SCSI_PHASE_BUS_FREE) {
117 // this device is not selected
118 } else if(!prev_status && atn_status) {
120 out_debug_log(_T("ATN signal raised\n"));
122 // wait until ack=off
125 // change to message out phase
128 set_phase_delay(SCSI_PHASE_MESSAGE_OUT, 10.0);
137 initiator ---> device
150 initiator <--- device
163 bool prev_status = ack_status;
164 ack_status = ((data & mask) != 0);
165 // out_debug_log(_T("ACK=%s"), (ack_status) ? _T("ON") : _T("OFF"));
166 if(phase == SCSI_PHASE_BUS_FREE) {
167 // this device is not selected
168 } else if(!prev_status & ack_status) {
171 case SCSI_PHASE_DATA_OUT:
172 buffer->write(data_bus);
174 // check defect list length in format unit data
175 if(command[0] == SCSI_CMD_FORMAT) {
176 if(buffer->count() == 4) {
177 remain += buffer->read_not_remove(2) * 256 + buffer->read_not_remove(3);
182 case SCSI_PHASE_COMMAND:
183 command[command_index++] = data_bus;
186 case SCSI_PHASE_MESSAGE_OUT:
187 buffer->write(data_bus);
190 if(phase == SCSI_PHASE_DATA_OUT || phase == SCSI_PHASE_DATA_IN) {
191 set_req_delay(0, data_req_delay); // thanks Mr.Sato
193 set_req_delay(0, 0.1);
195 } else if(prev_status && !ack_status) {
198 // change to message out phase
201 set_phase_delay(SCSI_PHASE_MESSAGE_OUT, 10.0);
204 case SCSI_PHASE_DATA_OUT:
208 if(!write_buffer(buffer->count())) {
209 // change to status phase
210 set_dat(SCSI_STATUS_CHKCOND);
211 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
214 buffer->clear(); // just in case
217 case SCSI_CMD_WRITE6:
218 case SCSI_CMD_WRITE10:
219 case SCSI_CMD_WRITE12:
220 // request to write next data
222 next_req_usec += 1000000.0 / bytes_per_sec;
223 double usec = next_req_usec - get_passed_usec(first_req_clock);
224 set_req_delay(1, (usec > 0.2) ? usec : 0.2);
225 if(logical_block_size() > 0) {
226 local_data_pos = (local_data_pos + 1) % logical_block_size();
227 if(local_data_pos == 0) {
228 write_signals(&outputs_next_sector, 0xffffffff);
234 // request to write next data
235 set_req_delay(1, 1.0);
240 if(!buffer->empty()) {
241 if(!write_buffer(buffer->count())) {
242 // change to status phase
243 set_dat(SCSI_STATUS_CHKCOND);
244 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
247 buffer->clear(); // just in case
249 // change to status phase
251 case SCSI_CMD_WRITE6:
252 case SCSI_CMD_WRITE10:
253 case SCSI_CMD_WRITE12:
254 write_signals(&outputs_completed, 0xffffffff);
257 set_dat(SCSI_STATUS_GOOD);
258 set_sense_code(SCSI_SENSE_NOSENSE);
259 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
263 case SCSI_PHASE_DATA_IN:
266 if(buffer->count() == 0) {
267 int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain;
268 out_debug_log(_T("LOAD BUFFER to %d bytes"), length);
269 if(!read_buffer(length)) {
270 // change to status phase
271 set_dat(SCSI_STATUS_CHKCOND);
272 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
276 // request to read next data
277 set_dat(buffer->read());
280 case SCSI_CMD_READ10:
281 case SCSI_CMD_READ12:
283 next_req_usec += 1000000.0 / bytes_per_sec;
284 double usec = next_req_usec - get_passed_usec(first_req_clock);
285 set_req_delay(1, (usec > 0.2) ? usec : 0.2);
286 //set_req_delay(1, usec);
287 if(logical_block_size() > 0) {
288 local_data_pos = (local_data_pos + 1) % logical_block_size();
289 if(local_data_pos == 0) {
290 write_signals(&outputs_next_sector, 0xffffffff);
296 set_req_delay(1, 10.0);
300 // change to status phase
303 case SCSI_CMD_READ10:
304 case SCSI_CMD_READ12:
305 case SCSI_CMD_INQUIRY:
306 write_signals(&outputs_completed, 0xffffffff);
309 set_dat(SCSI_STATUS_GOOD);
310 set_sense_code(SCSI_SENSE_NOSENSE);
311 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
315 case SCSI_PHASE_COMMAND:
316 if(command_index < get_command_length(command[0])) {
317 // request next command
318 // set_req_delay(1, 1.0);
319 // Q:Command wait may be longet than 1.0us? 20200316 K.O
320 set_req_delay(1, 10.0);
327 case SCSI_PHASE_STATUS:
328 // create message data table
331 buffer->write(0x00); // command complete message
332 // change to message in phase
333 set_dat(buffer->read());
334 set_phase_delay(SCSI_PHASE_MESSAGE_IN, 1.0);
337 case SCSI_PHASE_MESSAGE_OUT:
338 if((buffer->read() & 0xb8) == 0x80) {
339 // identify, change to command phase
340 memset(command, 0, sizeof(command));
342 set_phase_delay(SCSI_PHASE_COMMAND, 10.0);
344 // abort, change to bus free phase
345 set_phase_delay(SCSI_PHASE_BUS_FREE, 10.0);
349 case SCSI_PHASE_MESSAGE_IN:
351 // request to read next data
352 set_dat(buffer->read());
353 set_req_delay(1, 1.0);
355 // change to bus free phase
356 set_phase_delay(SCSI_PHASE_BUS_FREE, 1.0);
367 bool prev_status = rst_status;
368 rst_status = ((data & mask) != 0);
370 if(!prev_status & rst_status) {
372 out_debug_log(_T("RST signal raised\n"));
375 set_phase(SCSI_PHASE_BUS_FREE);
382 void SCSI_DEV::event_callback(int event_id, int err)
387 if((data_bus & 0x7f) == (1 << scsi_id)) {
388 if(is_device_existing()) {
389 // this device is selected!
390 out_debug_log(_T("This device is selected\n"));
398 set_phase(next_phase);
408 void SCSI_DEV::set_phase(int value)
410 out_debug_log(_T("Phase %s -> %s\n"), scsi_phase_name[phase], scsi_phase_name[value]);
411 if(event_phase != -1) {
412 cancel_event(this, event_phase);
419 if(value == SCSI_PHASE_BUS_FREE) {
421 write_signals(&outputs_clrq, 0xffffffff);
428 write_signals(&outputs_clrq, 0xffffffff);
432 set_req_delay(1, 10.0);
438 void SCSI_DEV::set_phase_delay(int value, double usec)
443 if(event_phase != -1) {
444 cancel_event(this, event_phase);
447 register_event(this, EVENT_PHASE, usec, false, &event_phase);
452 void SCSI_DEV::set_dat(int value)
454 if(__SCSI_DEBUG_LOG) {
455 // emu->force_out_debug_log(_T("[SCSI_DEV:ID=%d] DATA = %02x\n"), scsi_id, value);
457 write_signals(&outputs_dat, value);
460 void SCSI_DEV::set_bsy(int value)
462 // out_debug_log(_T("BUSY = %d\n"), value ? 1 : 0);
463 write_signals(&outputs_bsy, value ? 0xffffffff : 0);
466 void SCSI_DEV::set_cd(int value)
468 // out_debug_log(_T("C/D = %d\n"), value ? 1 : 0);
469 write_signals(&outputs_cd, value ? 0xffffffff : 0);
472 void SCSI_DEV::set_io(int value)
474 // out_debug_log(_T("I/O = %d\n"), value ? 1 : 0);
475 write_signals(&outputs_io, value ? 0xffffffff : 0);
478 void SCSI_DEV::set_msg(int value)
480 // out_debug_log(_T("MSG = %d\n"), value ? 1 : 0);
481 write_signals(&outputs_msg, value ? 0xffffffff : 0);
484 void SCSI_DEV::set_req(int value)
486 // out_debug_log(_T("REQ = %d\n"), value ? 1 : 0);
487 if(event_req != -1) {
488 cancel_event(this, event_req);
491 if(value && first_req_clock == 0) {
492 first_req_clock = get_current_clock();
495 write_signals(&outputs_req, value ? 0xffffffff : 0);
498 void SCSI_DEV::set_req_delay(int value, double usec)
503 if(event_req != -1) {
504 cancel_event(this, event_req);
507 register_event(this, EVENT_REQ, usec, false, &event_req);
512 int SCSI_DEV::get_command_length(int value)
514 switch((value >> 5) & 7) {
529 void SCSI_DEV::start_command()
534 case SCSI_CMD_TST_U_RDY:
535 out_debug_log(_T("Command: Test Unit Ready\n"));
536 // change to status phase
537 if(!is_device_ready()) {
538 set_dat(SCSI_STATUS_CHKCOND);
539 set_sense_code(SCSI_SENSE_NOTREADY);
541 set_dat(SCSI_STATUS_GOOD);
542 set_sense_code(SCSI_SENSE_NOSENSE);
544 set_phase_delay(SCSI_PHASE_STATUS, 1000.0);
547 case SCSI_CMD_REQ_SENSE:
548 out_debug_log(_T("Command: Request Sense\n"));
550 position = (command[1] & 0x1f) * 0x10000 + command[2] * 0x100 + command[3];
551 position *= physical_block_size();
555 // create sense data table
557 for(int i = 0; i < remain; i++) {
560 case 0: value = SCSI_SERROR_CURRENT; break;
561 case 2: value = is_device_ready() ? SCSI_KEY_NOSENSE : SCSI_KEY_UNITATT; break;
562 case 7: value = 0x08; break;
564 buffer->write(value);
566 // change to data in phase
567 set_dat(buffer->read());
568 set_phase_delay(SCSI_PHASE_DATA_IN, 1000.0);
571 case SCSI_CMD_INQUIRY:
572 out_debug_log(_T("Command: Inquiry\n"));
574 position = (command[1] & 0x1f) * 0x10000 + command[2] * 0x100 + command[3];
575 position *= physical_block_size();
578 // create inquiry data table
580 buffer->write(device_type);
581 buffer->write(is_removable ? 0x80 : 0x00);
582 buffer->write(0x02); // ANSI SCSI2
583 buffer->write(0x01); // ANSI-CCS
588 for(int i = 0; i < (int)strlen(vendor_id) && i < 8; i++) {
589 buffer->write(vendor_id[i]);
591 for(int i = (int)strlen(vendor_id); i < 8; i++) {
594 for(int i = 0; i < (int)strlen(product_id) && i < 16; i++) {
595 buffer->write(vendor_id[i]);
597 for(int i = (int)strlen(product_id); i < 16; i++) {
600 for(int i = 0; i < (int)strlen(product_rev) && i < 4; i++) {
601 buffer->write(product_rev[i]);
603 for(int i = (int)strlen(product_rev); i < 4; i++) {
606 // change to data in phase
607 set_dat(buffer->read());
608 // remain = buffer->count();
609 set_phase_delay(SCSI_PHASE_DATA_IN, 1000.0);
612 case SCSI_CMD_RD_CAPAC:
613 out_debug_log(_T("Command: Read Capacity\n"));
615 position = command[2] * 0x1000000 + command[3] * 0x10000 + command[4] * 0x100 + command[5];
616 position *= physical_block_size();
619 // create capacity data table
621 buffer->write((max_logical_block_addr() >> 24) & 0xff);
622 buffer->write((max_logical_block_addr() >> 16) & 0xff);
623 buffer->write((max_logical_block_addr() >> 8) & 0xff);
624 buffer->write((max_logical_block_addr() >> 0) & 0xff);
625 buffer->write(( logical_block_size() >> 24) & 0xff);
626 buffer->write(( logical_block_size() >> 16) & 0xff);
627 buffer->write(( logical_block_size() >> 8) & 0xff);
628 buffer->write(( logical_block_size() >> 0) & 0xff);
629 // change to data in phase
630 set_dat(buffer->read());
631 // set_phase_delay(SCSI_PHASE_DATA_IN, 10.0);
632 set_phase_delay(SCSI_PHASE_DATA_IN, 1000.0);
635 case SCSI_CMD_FORMAT:
636 out_debug_log(_T("Command: Format Unit\n"));
637 if(command[1] & 0x10) {
638 // change to data out phase for extra bytes
640 set_phase_delay(SCSI_PHASE_DATA_OUT, 10.0);
642 // no extra bytes, change to status phase
643 set_dat(SCSI_STATUS_GOOD);
644 set_phase_delay(SCSI_PHASE_STATUS, 1000.0);
648 case SCSI_CMD_RD_DEFECT:
649 out_debug_log(_T("Command: Read Defect Data\n"));
652 // create detect data table
655 buffer->write(command[2]);
656 buffer->write(0x00); // msb of defect list length
657 buffer->write(0x00); // lsb of defect list length
658 // change to data in phase
659 set_dat(buffer->read());
660 set_phase_delay(SCSI_PHASE_DATA_IN, 1000.0);
665 position = (command[1] & 0x1f) * 0x10000 + command[2] * 0x100 + command[3];
666 out_debug_log(_T("Command: Read 6-byte LBA=%d BLOCKS=%d\n"), position, command[4]);
667 position *= physical_block_size();
669 remain = (command[4] > 0 ? command[4] : 0x100) * logical_block_size(); // thanks Mr.Sato
671 delay = get_seek_time(position, remain);
675 int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain;
676 if(!read_buffer(length)) {
677 // change to status phase
678 set_dat(SCSI_STATUS_CHKCOND);
679 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
682 // change to data in phase
683 set_dat(buffer->read());
684 set_phase_delay(SCSI_PHASE_DATA_IN, delay);
686 // transfer length is zero, change to status phase
687 set_dat(SCSI_STATUS_GOOD);
688 set_sense_code(SCSI_SENSE_NOSENSE);
689 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
693 case SCSI_CMD_WRITE6:
695 position = (command[1] & 0x1f) * 0x10000 + command[2] * 0x100 + command[3];
696 out_debug_log(_T("Command: Write 6-byte LBA=%d BLOCKS=%d\n"), position, command[4]);
697 position *= physical_block_size();
699 remain = (command[4] > 0 ? command[4] : 0x100) * logical_block_size(); // thanks Mr.Sato
701 delay = get_seek_time(position, remain);
705 // change to data in phase
706 set_phase_delay(SCSI_PHASE_DATA_OUT, delay);
708 // transfer length is zero, change to status phase
709 set_dat(SCSI_STATUS_GOOD);
710 set_sense_code(SCSI_SENSE_NOSENSE);
711 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
715 case SCSI_CMD_READ10:
717 position = command[2] * 0x1000000 + command[3] * 0x10000 + command[4] * 0x100 + command[5];
718 out_debug_log(_T("Command: Read 10-byte LBA=%d BLOCKS=%d\n"), position, command[7] * 0x100 + command[8]);
719 position *= physical_block_size();
721 remain = command[7] * 0x100 + command[8];
722 remain *= logical_block_size();
724 delay = get_seek_time(position, remain);
728 int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain;
729 if(!read_buffer(length)) {
730 // change to status phase
731 set_dat(SCSI_STATUS_CHKCOND);
732 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
735 // change to data in phase
736 set_dat(buffer->read());
737 set_phase_delay(SCSI_PHASE_DATA_IN, delay);
739 // transfer length is zero, change to status phase
740 set_dat(SCSI_STATUS_GOOD);
741 set_sense_code(SCSI_SENSE_NOSENSE);
742 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
746 case SCSI_CMD_WRITE10:
748 case SCSI_CMD_WRT_VERIFY:
751 position = command[2] * 0x1000000 + command[3] * 0x10000 + command[4] * 0x100 + command[5];
752 out_debug_log(_T("Command: %s LBA=%d BLOCKS=%d\n"), (command[0] == SCSI_CMD_WRT_VERIFY) ? _T("Write and Verify") : _T("Write 10-byte"), position, command[7] * 0x100 + command[8]);
753 position *= physical_block_size();
755 remain = command[7] * 0x100 + command[8];
756 remain *= logical_block_size();
758 delay = get_seek_time(position, remain);
762 // change to data in phase
763 set_phase_delay(SCSI_PHASE_DATA_OUT, delay);
765 // transfer length is zero, change to status phase
766 set_dat(SCSI_STATUS_GOOD);
767 set_sense_code(SCSI_SENSE_NOSENSE);
768 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
772 case SCSI_CMD_READ12:
774 position = command[2] * 0x1000000 + command[3] * 0x10000 + command[4] * 0x100 + command[5];
776 remain = command[6] * 0x1000000 + command[7] * 0x10000 + command[8] * 0x100 + command[9];
777 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());
778 position *= physical_block_size();
779 remain *= logical_block_size();
781 delay = get_seek_time(position, remain);
785 int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain;
786 out_debug_log(_T("LOAD BUFFER to %d bytes"), length);
787 if(!read_buffer(length)) {
788 // change to status phase
789 set_dat(SCSI_STATUS_CHKCOND);
790 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
793 // change to data in phase
794 set_dat(buffer->read());
795 set_phase_delay(SCSI_PHASE_DATA_IN, delay);
797 // transfer length is zero, change to status phase
798 set_dat(SCSI_STATUS_GOOD);
799 set_sense_code(SCSI_SENSE_NOSENSE);
800 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
804 case SCSI_CMD_WRITE12:
806 position = command[2] * 0x1000000 + command[3] * 0x10000 + command[4] * 0x100 + command[5];
807 out_debug_log(_T("Command: Write 12-byte LBA=%d BLOCKS=%d\n"), position, command[6] * 0x1000000 + command[7] * 0x10000 + command[8] * 0x100 + command[9]);
808 position *= physical_block_size();
810 remain = command[6] * 0x1000000 + command[7] * 0x10000 + command[8] * 0x100 + command[9];
811 remain *= logical_block_size();
813 delay = get_seek_time(position, remain);
817 // change to data in phase
818 set_phase_delay(SCSI_PHASE_DATA_OUT, delay);
820 // transfer length is zero, change to status phase
821 set_dat(SCSI_STATUS_GOOD);
822 set_sense_code(SCSI_SENSE_NOSENSE);
823 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
828 out_debug_log(_T("Command: Unknown %02X\n"), command[0]);
829 set_dat(SCSI_STATUS_GOOD);
830 set_phase_delay(SCSI_PHASE_STATUS, 10.0);
834 bool SCSI_DEV::read_buffer(int length)
836 for(int i = 0; i < length; i++) {
840 set_sense_code(SCSI_SENSE_NOSENSE);
844 bool SCSI_DEV::write_buffer(int length)
846 for(int i = 0; i < length; i++) {
850 set_sense_code(SCSI_SENSE_NOSENSE);
854 #define STATE_VERSION 3
856 bool SCSI_DEV::process_state(FILEIO* state_fio, bool loading)
858 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
861 if(!state_fio->StateCheckInt32(this_device_id)) {
864 state_fio->StateValue(data_bus);
865 state_fio->StateValue(sel_status);
866 state_fio->StateValue(atn_status);
867 state_fio->StateValue(ack_status);
868 state_fio->StateValue(rst_status);
869 state_fio->StateValue(selected);
870 state_fio->StateValue(atn_pending);
871 state_fio->StateValue(phase);
872 state_fio->StateValue(next_phase);
873 state_fio->StateValue(next_req);
874 state_fio->StateValue(event_sel);
875 state_fio->StateValue(event_phase);
876 state_fio->StateValue(event_req);
877 state_fio->StateValue(first_req_clock);
878 state_fio->StateValue(next_req_usec);
879 state_fio->StateArray(command, sizeof(command), 1);
880 state_fio->StateValue(command_index);
881 if(!buffer->process_state((void *)state_fio, loading)) {
884 state_fio->StateValue(position);
885 state_fio->StateValue(remain);
886 state_fio->StateValue(local_data_pos);
887 state_fio->StateValue(sense_code);