trunk/src/emu/machine/idehd.c
| r23770 | r23771 | |
| 436 | 436 | } |
| 437 | 437 | } |
| 438 | 438 | |
| 439 | | void ide_mass_storage_device::signal_delayed_interrupt(attotime time, int buffer_ready) |
| 440 | | { |
| 441 | | /* clear buffer ready and set the busy flag */ |
| 442 | | m_status &= ~IDE_STATUS_DRQ; |
| 443 | | m_status |= IDE_STATUS_BSY; |
| 444 | | |
| 445 | | /* set a timer */ |
| 446 | | if (buffer_ready) |
| 447 | | timer_set(time, TID_DELAYED_INTERRUPT_BUFFER_READY); |
| 448 | | else |
| 449 | | timer_set(time, TID_DELAYED_INTERRUPT); |
| 450 | | } |
| 451 | | |
| 452 | 439 | /************************************* |
| 453 | 440 | * |
| 454 | 441 | * Advance to the next sector |
| r23770 | r23771 | |
| 532 | 519 | m_status &= ~IDE_STATUS_DRQ; |
| 533 | 520 | set_dmarq(CLEAR_LINE); |
| 534 | 521 | |
| 535 | | if (m_master_password_enable || m_user_password_enable) |
| 522 | fill_buffer(); |
| 523 | } |
| 524 | |
| 525 | void ide_mass_storage_device::fill_buffer() |
| 526 | { |
| 527 | switch (m_command) |
| 536 | 528 | { |
| 537 | | security_error(); |
| 538 | | return; |
| 539 | | } |
| 529 | case IDE_COMMAND_IDENTIFY_DEVICE: |
| 530 | break; |
| 540 | 531 | |
| 541 | | /* if there is more data to read, keep going */ |
| 542 | | if (m_sector_count > 0) |
| 543 | | m_sector_count--; |
| 532 | default: |
| 533 | if (m_master_password_enable || m_user_password_enable) |
| 534 | { |
| 535 | security_error(); |
| 536 | } |
| 537 | else |
| 538 | { |
| 539 | /* if there is more data to read, keep going */ |
| 540 | if (m_sector_count > 0) |
| 541 | m_sector_count--; |
| 544 | 542 | |
| 545 | | if (m_sector_count > 0) |
| 546 | | read_next_sector(); |
| 543 | if (m_sector_count > 0) |
| 544 | read_next_sector(); |
| 545 | } |
| 546 | break; |
| 547 | } |
| 547 | 548 | } |
| 548 | 549 | |
| 549 | 550 | |
| r23770 | r23771 | |
| 879 | 880 | case IDE_COMMAND_IDENTIFY_DEVICE: |
| 880 | 881 | LOGPRINT(("IDE Identify device\n")); |
| 881 | 882 | |
| 883 | m_status |= IDE_STATUS_BSY; |
| 882 | 884 | if (m_can_identify_device) |
| 883 | 885 | { |
| 884 | 886 | memcpy(m_buffer, m_identify_device, sizeof(m_buffer)); |
| 885 | 887 | |
| 886 | | /* signal an interrupt */ |
| 887 | | signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 1); |
| 888 | timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT_BUFFER_READY); |
| 888 | 889 | } |
| 889 | 890 | else |
| 890 | 891 | { |
| 891 | 892 | m_status |= IDE_STATUS_ERR; |
| 892 | 893 | m_error = IDE_ERROR_NONE; |
| 893 | | m_status &= ~IDE_STATUS_DRDY; |
| 894 | | signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0); |
| 894 | timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT); |
| 895 | 895 | } |
| 896 | 896 | return true; |
| 897 | 897 | |
| r23770 | r23771 | |
| 901 | 901 | else |
| 902 | 902 | m_error = IDE_ERROR_DIAGNOSTIC_FAILED; |
| 903 | 903 | |
| 904 | | /* signal an interrupt */ |
| 905 | | signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0); |
| 904 | m_status |= IDE_STATUS_BSY; |
| 905 | timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT); |
| 906 | 906 | return true; |
| 907 | 907 | |
| 908 | 908 | case IDE_COMMAND_RECALIBRATE: |
| 909 | | /* signal an interrupt */ |
| 910 | | signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0); |
| 909 | m_status |= IDE_STATUS_BSY; |
| 910 | timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT); |
| 911 | 911 | return true; |
| 912 | 912 | |
| 913 | 913 | case IDE_COMMAND_IDLE: |
| r23770 | r23771 | |
| 919 | 919 | LOGPRINT(("IDE Set configuration (%d heads, %d sectors)\n", (m_device_head & IDE_DEVICE_HEAD_HS) + 1, m_sector_count)); |
| 920 | 920 | set_geometry(m_sector_count,(m_device_head & IDE_DEVICE_HEAD_HS) + 1); |
| 921 | 921 | |
| 922 | | /* signal an interrupt */ |
| 923 | | signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0); |
| 922 | m_status |= IDE_STATUS_BSY; |
| 923 | timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT); |
| 924 | 924 | return true; |
| 925 | 925 | |
| 926 | 926 | case IDE_COMMAND_UNKNOWN_F9: |
| r23770 | r23771 | |
| 934 | 934 | case IDE_COMMAND_SET_FEATURES: |
| 935 | 935 | LOGPRINT(("IDE Set features (%02X %02X %02X %02X %02X)\n", m_feature, m_sector_count & 0xff, m_sector_number, m_cylinder_low, m_cylinder_high)); |
| 936 | 936 | |
| 937 | | /* signal an interrupt */ |
| 938 | | signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0); |
| 937 | m_status |= IDE_STATUS_BSY; |
| 938 | timer_set(MINIMUM_COMMAND_TIME, TID_DELAYED_INTERRUPT); |
| 939 | 939 | return true; |
| 940 | 940 | |
| 941 | 941 | case IDE_COMMAND_SET_BLOCK_COUNT: |
| r23770 | r23771 | |
| 965 | 965 | { |
| 966 | 966 | if (!m_dmack) |
| 967 | 967 | { |
| 968 | | logerror( "%s: read_dma ignored (!DMACK)\n", machine().describe_context() ); |
| 968 | logerror( "%s: dev %d read_dma ignored (!DMACK)\n", machine().describe_context(), dev() ); |
| 969 | 969 | } |
| 970 | 970 | else if( !m_dmarq) |
| 971 | 971 | { |
| 972 | | logerror( "%s: read_dma ignored (!DMARQ)\n", machine().describe_context() ); |
| 972 | logerror( "%s: dev %d read_dma ignored (!DMARQ)\n", machine().describe_context(), dev() ); |
| 973 | 973 | } |
| 974 | 974 | else if (m_status & IDE_STATUS_BSY) |
| 975 | 975 | { |
| 976 | | logerror( "%s: read_dma ignored (BSY)\n", machine().describe_context() ); |
| 976 | logerror( "%s: dev %d read_dma ignored (BSY)\n", machine().describe_context(), dev() ); |
| 977 | 977 | } |
| 978 | 978 | else if (!(m_status & IDE_STATUS_DRQ)) |
| 979 | 979 | { |
| 980 | | logerror( "%s: read_dma ignored (!DRQ)\n", machine().describe_context() ); |
| 980 | logerror( "%s: dev %d read_dma ignored (!DRQ)\n", machine().describe_context(), dev() ); |
| 981 | 981 | } |
| 982 | 982 | else |
| 983 | 983 | { |
| r23770 | r23771 | |
| 1007 | 1007 | { |
| 1008 | 1008 | if (m_dmack) |
| 1009 | 1009 | { |
| 1010 | | logerror( "%s: read_cs0 %04x %04x ignored (DMACK)\n", machine().describe_context(), offset, mem_mask ); |
| 1010 | logerror( "%s: dev %d read_cs0 %04x %04x ignored (DMACK)\n", machine().describe_context(), dev(), offset, mem_mask ); |
| 1011 | 1011 | } |
| 1012 | 1012 | else if ((m_status & IDE_STATUS_BSY) && offset != IDE_CS0_STATUS_R) |
| 1013 | 1013 | { |
| r23770 | r23771 | |
| 1016 | 1016 | switch (offset) |
| 1017 | 1017 | { |
| 1018 | 1018 | case IDE_CS0_DATA_RW: |
| 1019 | | logerror( "%s: read_cs0 %04x %04x ignored (BSY)\n", machine().describe_context(), offset, mem_mask ); |
| 1019 | logerror( "%s: dev %d read_cs0 %04x %04x ignored (BSY)\n", machine().describe_context(), dev(), offset, mem_mask ); |
| 1020 | 1020 | break; |
| 1021 | 1021 | |
| 1022 | 1022 | default: |
| r23770 | r23771 | |
| 1143 | 1143 | { |
| 1144 | 1144 | if (m_dmack) |
| 1145 | 1145 | { |
| 1146 | | logerror( "%s: read_cs1 %04x %04x ignored (DMACK)\n", machine().describe_context(), offset, mem_mask ); |
| 1146 | logerror( "%s: dev %d read_cs1 %04x %04x ignored (DMACK)\n", machine().describe_context(), dev(), offset, mem_mask ); |
| 1147 | 1147 | } |
| 1148 | 1148 | else |
| 1149 | 1149 | { |
| r23770 | r23771 | |
| 1184 | 1184 | { |
| 1185 | 1185 | if (!m_dmack) |
| 1186 | 1186 | { |
| 1187 | | logerror( "%s: write_dma %04x ignored (!DMACK)\n", machine().describe_context(), data ); |
| 1187 | logerror( "%s: dev %d write_dma %04x ignored (!DMACK)\n", machine().describe_context(), dev(), data ); |
| 1188 | 1188 | } |
| 1189 | 1189 | else if( !m_dmarq) |
| 1190 | 1190 | { |
| 1191 | | logerror( "%s: write_dma %04x ignored (!DMARQ)\n", machine().describe_context(), data ); |
| 1191 | logerror( "%s: dev %d write_dma %04x ignored (!DMARQ)\n", machine().describe_context(), dev(), data ); |
| 1192 | 1192 | } |
| 1193 | 1193 | else if (m_status & IDE_STATUS_BSY) |
| 1194 | 1194 | { |
| 1195 | | logerror( "%s: write_dma %04x ignored (BSY)\n", machine().describe_context(), data ); |
| 1195 | logerror( "%s: dev %d write_dma %04x ignored (BSY)\n", machine().describe_context(), dev(), data ); |
| 1196 | 1196 | } |
| 1197 | 1197 | else if (!(m_status & IDE_STATUS_DRQ)) |
| 1198 | 1198 | { |
| 1199 | | logerror( "%s: write_dma %04x ignored (!DRQ)\n", machine().describe_context(), data ); |
| 1199 | logerror( "%s: dev %d write_dma %04x ignored (!DRQ)\n", machine().describe_context(), dev(), data ); |
| 1200 | 1200 | } |
| 1201 | 1201 | else |
| 1202 | 1202 | { |
| r23770 | r23771 | |
| 1222 | 1222 | |
| 1223 | 1223 | if (m_dmack) |
| 1224 | 1224 | { |
| 1225 | | logerror( "%s: write_cs0 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), offset, data, mem_mask ); |
| 1225 | logerror( "%s: dev %d write_cs0 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), dev(), offset, data, mem_mask ); |
| 1226 | 1226 | } |
| 1227 | 1227 | else if ((m_status & IDE_STATUS_BSY) && offset != IDE_CS0_COMMAND_W) |
| 1228 | 1228 | { |
| 1229 | | logerror( "%s: write_cs0 %04x %04x %04x ignored (BSY)\n", machine().describe_context(), offset, data, mem_mask ); |
| 1229 | logerror( "%s: dev %d write_cs0 %04x %04x %04x ignored (BSY)\n", machine().describe_context(), dev(), offset, data, mem_mask ); |
| 1230 | 1230 | } |
| 1231 | 1231 | else if ((m_status & IDE_STATUS_DRQ) && offset != IDE_CS0_DATA_RW && offset != IDE_CS0_COMMAND_W) |
| 1232 | 1232 | { |
| 1233 | | logerror( "%s: write_cs0 %04x %04x %04x ignored (DRQ)\n", machine().describe_context(), offset, data, mem_mask ); |
| 1233 | logerror( "%s: dev %d write_cs0 %04x %04x %04x ignored (DRQ) command %02x\n", machine().describe_context(), dev(), offset, data, mem_mask, m_command ); |
| 1234 | 1234 | } |
| 1235 | 1235 | else |
| 1236 | 1236 | { |
| r23770 | r23771 | |
| 1244 | 1244 | { |
| 1245 | 1245 | if (!(m_status & IDE_STATUS_DRQ)) |
| 1246 | 1246 | { |
| 1247 | | logerror( "%s: write_cs0 %04x %04x %04x ignored (!DRQ)\n", machine().describe_context(), offset, data, mem_mask ); |
| 1247 | logerror( "%s: dev %d write_cs0 %04x %04x %04x ignored (!DRQ)\n", machine().describe_context(), dev(), offset, data, mem_mask ); |
| 1248 | 1248 | } |
| 1249 | 1249 | else |
| 1250 | 1250 | { |
| r23770 | r23771 | |
| 1309 | 1309 | m_buffer_offset = 0; |
| 1310 | 1310 | m_sectors_until_int = 0; |
| 1311 | 1311 | |
| 1312 | m_status &= ~IDE_STATUS_BSY; |
| 1313 | m_status &= ~IDE_STATUS_DRQ; |
| 1312 | 1314 | m_status &= ~IDE_STATUS_ERR; |
| 1313 | 1315 | |
| 1314 | 1316 | if (!process_command()) |
| r23770 | r23771 | |
| 1332 | 1334 | |
| 1333 | 1335 | if (m_dmack) |
| 1334 | 1336 | { |
| 1335 | | logerror( "%s: write_cs1 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), offset, data, mem_mask ); |
| 1337 | logerror( "%s: dev %d write_cs1 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), dev(), offset, data, mem_mask ); |
| 1336 | 1338 | } |
| 1337 | 1339 | else |
| 1338 | 1340 | { |