trunk/src/emu/machine/idectrl.c
| r23651 | r23652 | |
| 283 | 283 | { |
| 284 | 284 | security_error(); |
| 285 | 285 | |
| 286 | | sector_count = 0; |
| 286 | dev->sector_count = 0; |
| 287 | 287 | |
| 288 | 288 | return; |
| 289 | 289 | } |
| 290 | 290 | |
| 291 | 291 | /* if there is more data to read, keep going */ |
| 292 | | if (sector_count > 0) |
| 293 | | sector_count--; |
| 294 | | if (sector_count > 0) |
| 292 | if (dev->sector_count > 0) |
| 293 | dev->sector_count--; |
| 294 | if (dev->sector_count > 0) |
| 295 | 295 | read_next_sector(); |
| 296 | 296 | } |
| 297 | 297 | |
| r23651 | r23652 | |
| 325 | 325 | { |
| 326 | 326 | /* advance the pointers, unless this is the last sector */ |
| 327 | 327 | /* Gauntlet: Dark Legacy checks to make sure we stop on the last sector */ |
| 328 | | if (sector_count != 1) |
| 328 | if (dev->sector_count != 1) |
| 329 | 329 | next_sector(); |
| 330 | 330 | |
| 331 | 331 | /* clear the error value */ |
| r23651 | r23652 | |
| 334 | 334 | /* signal an interrupt */ |
| 335 | 335 | if (!verify_only) |
| 336 | 336 | sectors_until_int--; |
| 337 | | if (sectors_until_int == 0 || sector_count == 1) |
| 337 | if (sectors_until_int == 0 || dev->sector_count == 1) |
| 338 | 338 | { |
| 339 | 339 | sectors_until_int = ((command == IDE_COMMAND_READ_MULTIPLE_BLOCK) ? block_count : 1); |
| 340 | 340 | set_irq(ASSERT_LINE); |
| r23651 | r23652 | |
| 534 | 534 | { |
| 535 | 535 | /* advance the pointers, unless this is the last sector */ |
| 536 | 536 | /* Gauntlet: Dark Legacy checks to make sure we stop on the last sector */ |
| 537 | | if (sector_count != 1) |
| 537 | if (dev->sector_count != 1) |
| 538 | 538 | next_sector(); |
| 539 | 539 | |
| 540 | 540 | /* clear the error value */ |
| 541 | 541 | error = IDE_ERROR_NONE; |
| 542 | 542 | |
| 543 | 543 | /* signal an interrupt */ |
| 544 | | if (--sectors_until_int == 0 || sector_count == 1) |
| 544 | if (--sectors_until_int == 0 || dev->sector_count == 1) |
| 545 | 545 | { |
| 546 | 546 | sectors_until_int = ((command == IDE_COMMAND_WRITE_MULTIPLE_BLOCK) ? block_count : 1); |
| 547 | 547 | set_irq(ASSERT_LINE); |
| 548 | 548 | } |
| 549 | 549 | |
| 550 | 550 | /* signal an interrupt if there's more data needed */ |
| 551 | | if (sector_count > 0) |
| 552 | | sector_count--; |
| 553 | | if (sector_count == 0) |
| 551 | if (dev->sector_count > 0) |
| 552 | dev->sector_count--; |
| 553 | if (dev->sector_count == 0) |
| 554 | 554 | status &= ~IDE_STATUS_BUFFER_READY; |
| 555 | 555 | |
| 556 | 556 | /* keep going for DMA */ |
| 557 | | if (dma_active && sector_count != 0) |
| 557 | if (dma_active && dev->sector_count != 0) |
| 558 | 558 | { |
| 559 | 559 | set_dmarq(1); |
| 560 | 560 | } |
| r23651 | r23652 | |
| 594 | 594 | case IDE_COMMAND_READ_MULTIPLE: |
| 595 | 595 | case IDE_COMMAND_READ_MULTIPLE_NORETRY: |
| 596 | 596 | LOGPRINT(("IDE Read multiple: C=%d H=%d S=%d LBA=%d count=%d\n", |
| 597 | | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), sector_count)); |
| 597 | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), dev->sector_count)); |
| 598 | 598 | |
| 599 | 599 | /* reset the buffer */ |
| 600 | 600 | dev->buffer_offset = 0; |
| r23651 | r23652 | |
| 608 | 608 | |
| 609 | 609 | case IDE_COMMAND_READ_MULTIPLE_BLOCK: |
| 610 | 610 | LOGPRINT(("IDE Read multiple block: C=%d H=%d S=%d LBA=%d count=%d\n", |
| 611 | | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), sector_count)); |
| 611 | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), dev->sector_count)); |
| 612 | 612 | |
| 613 | 613 | /* reset the buffer */ |
| 614 | 614 | dev->buffer_offset = 0; |
| r23651 | r23652 | |
| 623 | 623 | case IDE_COMMAND_VERIFY_MULTIPLE: |
| 624 | 624 | case IDE_COMMAND_VERIFY_NORETRY: |
| 625 | 625 | LOGPRINT(("IDE Read verify multiple with/without retries: C=%d H=%d S=%d LBA=%d count=%d\n", |
| 626 | | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), sector_count)); |
| 626 | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), dev->sector_count)); |
| 627 | 627 | |
| 628 | 628 | /* reset the buffer */ |
| 629 | 629 | dev->buffer_offset = 0; |
| r23651 | r23652 | |
| 637 | 637 | |
| 638 | 638 | case IDE_COMMAND_READ_DMA: |
| 639 | 639 | LOGPRINT(("IDE Read multiple DMA: C=%d H=%d S=%d LBA=%d count=%d\n", |
| 640 | | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), sector_count)); |
| 640 | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), dev->sector_count)); |
| 641 | 641 | |
| 642 | 642 | /* reset the buffer */ |
| 643 | 643 | dev->buffer_offset = 0; |
| 644 | | sectors_until_int = sector_count; |
| 644 | sectors_until_int = dev->sector_count; |
| 645 | 645 | dma_active = 1; |
| 646 | 646 | verify_only = 0; |
| 647 | 647 | |
| r23651 | r23652 | |
| 652 | 652 | case IDE_COMMAND_WRITE_MULTIPLE: |
| 653 | 653 | case IDE_COMMAND_WRITE_MULTIPLE_NORETRY: |
| 654 | 654 | LOGPRINT(("IDE Write multiple: C=%d H=%d S=%d LBA=%d count=%d\n", |
| 655 | | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), sector_count)); |
| 655 | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), dev->sector_count)); |
| 656 | 656 | |
| 657 | 657 | /* reset the buffer */ |
| 658 | 658 | dev->buffer_offset = 0; |
| r23651 | r23652 | |
| 665 | 665 | |
| 666 | 666 | case IDE_COMMAND_WRITE_MULTIPLE_BLOCK: |
| 667 | 667 | LOGPRINT(("IDE Write multiple block: C=%d H=%d S=%d LBA=%d count=%d\n", |
| 668 | | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), sector_count)); |
| 668 | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), dev->sector_count)); |
| 669 | 669 | |
| 670 | 670 | /* reset the buffer */ |
| 671 | 671 | dev->buffer_offset = 0; |
| r23651 | r23652 | |
| 678 | 678 | |
| 679 | 679 | case IDE_COMMAND_WRITE_DMA: |
| 680 | 680 | LOGPRINT(("IDE Write multiple DMA: C=%d H=%d S=%d LBA=%d count=%d\n", |
| 681 | | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), sector_count)); |
| 681 | dev->cur_cylinder, dev->cur_head, dev->cur_sector, dev->lba_address(), dev->sector_count)); |
| 682 | 682 | |
| 683 | 683 | /* reset the buffer */ |
| 684 | 684 | dev->buffer_offset = 0; |
| 685 | | sectors_until_int = sector_count; |
| 685 | sectors_until_int = dev->sector_count; |
| 686 | 686 | dma_active = 1; |
| 687 | 687 | |
| 688 | 688 | /* start the read going */ |
| r23651 | r23652 | |
| 707 | 707 | |
| 708 | 708 | /* reset the buffer */ |
| 709 | 709 | dev->buffer_offset = 0; |
| 710 | | sector_count = 1; |
| 710 | dev->sector_count = 1; |
| 711 | 711 | |
| 712 | 712 | /* build the features page */ |
| 713 | 713 | memcpy(dev->buffer, slot[cur_drive]->dev()->get_features(), sizeof(dev->buffer)); |
| r23651 | r23652 | |
| 747 | 747 | error = IDE_ERROR_NONE; |
| 748 | 748 | |
| 749 | 749 | /* for timeout disabled value is 0 */ |
| 750 | | sector_count = 0; |
| 750 | dev->sector_count = 0; |
| 751 | 751 | /* signal an interrupt */ |
| 752 | 752 | set_irq(ASSERT_LINE); |
| 753 | 753 | break; |
| 754 | 754 | |
| 755 | 755 | case IDE_COMMAND_SET_CONFIG: |
| 756 | | LOGPRINT(("IDE Set configuration (%d heads, %d sectors)\n", dev->cur_head + 1, sector_count)); |
| 756 | LOGPRINT(("IDE Set configuration (%d heads, %d sectors)\n", dev->cur_head + 1, dev->sector_count)); |
| 757 | 757 | status &= ~IDE_STATUS_ERROR; |
| 758 | 758 | error = IDE_ERROR_NONE; |
| 759 | | dev->set_geometry(sector_count,dev->cur_head + 1); |
| 759 | dev->set_geometry(dev->sector_count,dev->cur_head + 1); |
| 760 | 760 | |
| 761 | 761 | /* signal an interrupt */ |
| 762 | 762 | signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0); |
| r23651 | r23652 | |
| 771 | 771 | break; |
| 772 | 772 | |
| 773 | 773 | case IDE_COMMAND_SET_FEATURES: |
| 774 | | LOGPRINT(("IDE Set features (%02X %02X %02X %02X %02X)\n", precomp_offset, sector_count & 0xff, dev->cur_sector, dev->cur_cylinder & 0xff, dev->cur_cylinder >> 8)); |
| 774 | LOGPRINT(("IDE Set features (%02X %02X %02X %02X %02X)\n", dev->precomp_offset, dev->sector_count & 0xff, dev->cur_sector, dev->cur_cylinder & 0xff, dev->cur_cylinder >> 8)); |
| 775 | 775 | |
| 776 | 776 | /* signal an interrupt */ |
| 777 | 777 | signal_delayed_interrupt(MINIMUM_COMMAND_TIME, 0); |
| 778 | 778 | break; |
| 779 | 779 | |
| 780 | 780 | case IDE_COMMAND_SET_BLOCK_COUNT: |
| 781 | | LOGPRINT(("IDE Set block count (%02X)\n", sector_count)); |
| 781 | LOGPRINT(("IDE Set block count (%02X)\n", dev->sector_count)); |
| 782 | 782 | |
| 783 | | block_count = sector_count; |
| 783 | block_count = dev->sector_count; |
| 784 | 784 | // judge dredd wants 'drive ready' on this command |
| 785 | 785 | status |= IDE_STATUS_DRIVE_READY; |
| 786 | 786 | |
| r23651 | r23652 | |
| 791 | 791 | case IDE_COMMAND_TAITO_GNET_UNLOCK_1: |
| 792 | 792 | LOGPRINT(("IDE GNET Unlock 1\n")); |
| 793 | 793 | |
| 794 | | sector_count = 1; |
| 794 | dev->sector_count = 1; |
| 795 | 795 | status |= IDE_STATUS_DRIVE_READY; |
| 796 | 796 | status &= ~IDE_STATUS_ERROR; |
| 797 | 797 | set_irq(ASSERT_LINE); |
| r23651 | r23652 | |
| 815 | 815 | |
| 816 | 816 | /* key check */ |
| 817 | 817 | dev->read_key(key); |
| 818 | | if ((precomp_offset == key[0]) && (sector_count == key[1]) && (dev->cur_sector == key[2]) && (dev->cur_cylinder == (((UINT16)key[4]<<8)|key[3]))) |
| 818 | if ((dev->precomp_offset == key[0]) && (dev->sector_count == key[1]) && (dev->cur_sector == key[2]) && (dev->cur_cylinder == (((UINT16)key[4]<<8)|key[3]))) |
| 819 | 819 | { |
| 820 | 820 | gnetreadlock= 0; |
| 821 | 821 | } |
| r23651 | r23652 | |
| 836 | 836 | error = IDE_ERROR_NONE; |
| 837 | 837 | |
| 838 | 838 | /* for timeout disabled value is 0 */ |
| 839 | | sector_count = 0; |
| 839 | dev->sector_count = 0; |
| 840 | 840 | /* signal an interrupt */ |
| 841 | 841 | set_irq(ASSERT_LINE); |
| 842 | 842 | break; |
| r23651 | r23652 | |
| 975 | 975 | |
| 976 | 976 | /* return the current sector count */ |
| 977 | 977 | case IDE_BANK0_SECTOR_COUNT: |
| 978 | | result = sector_count; |
| 978 | result = dev->sector_count; |
| 979 | 979 | break; |
| 980 | 980 | |
| 981 | 981 | /* return the current sector */ |
| r23651 | r23652 | |
| 1184 | 1184 | |
| 1185 | 1185 | /* precompensation offset?? */ |
| 1186 | 1186 | case IDE_BANK0_ERROR: |
| 1187 | | precomp_offset = data; |
| 1187 | dev->precomp_offset = data; |
| 1188 | 1188 | break; |
| 1189 | 1189 | |
| 1190 | 1190 | /* sector count */ |
| 1191 | 1191 | case IDE_BANK0_SECTOR_COUNT: |
| 1192 | | sector_count = data ? data : 256; |
| 1192 | dev->sector_count = data ? data : 256; |
| 1193 | 1193 | break; |
| 1194 | 1194 | |
| 1195 | 1195 | /* current sector */ |
| r23651 | r23652 | |
| 1235 | 1235 | |
| 1236 | 1236 | WRITE16_MEMBER( ide_controller_device::write_cs1 ) |
| 1237 | 1237 | { |
| 1238 | ide_device_interface *dev = slot[cur_drive]->dev(); |
| 1239 | |
| 1240 | if (dev == NULL) |
| 1241 | return; |
| 1242 | |
| 1238 | 1243 | // printf( "write cs1 %04x %04x %04x\n", offset, data, mem_mask ); |
| 1239 | 1244 | |
| 1240 | 1245 | /* logit */ |
| r23651 | r23652 | |
| 1244 | 1249 | { |
| 1245 | 1250 | /* adapter control */ |
| 1246 | 1251 | case IDE_BANK1_STATUS_CONTROL: |
| 1247 | | adapter_control = data; |
| 1252 | dev->adapter_control = data; |
| 1248 | 1253 | |
| 1249 | 1254 | /* handle controller reset */ |
| 1250 | 1255 | //if (data == 0x04) |
| r23651 | r23652 | |
| 1266 | 1271 | ide_controller_device::ide_controller_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) : |
| 1267 | 1272 | device_t(mconfig, type, name, tag, owner, clock), |
| 1268 | 1273 | status(0), |
| 1269 | | adapter_control(0), |
| 1270 | 1274 | error(0), |
| 1271 | 1275 | command(0), |
| 1272 | 1276 | interrupt_pending(0), |
| 1273 | | precomp_offset(0), |
| 1274 | | sector_count(0), |
| 1275 | 1277 | block_count(0), |
| 1276 | 1278 | sectors_until_int(0), |
| 1277 | 1279 | verify_only(0), |
| r23651 | r23652 | |
| 1292 | 1294 | |
| 1293 | 1295 | ide_controller_device::ide_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 1294 | 1296 | device_t(mconfig, IDE_CONTROLLER, "IDE Controller", tag, owner, clock), |
| 1295 | | adapter_control(0), |
| 1296 | 1297 | error(0), |
| 1297 | 1298 | command(0), |
| 1298 | 1299 | interrupt_pending(0), |
| 1299 | | precomp_offset(0), |
| 1300 | | sector_count(0), |
| 1301 | 1300 | block_count(0), |
| 1302 | 1301 | sectors_until_int(0), |
| 1303 | 1302 | verify_only(0), |
| r23651 | r23652 | |
| 1330 | 1329 | reset_timer = timer_alloc(TID_RESET_CALLBACK); |
| 1331 | 1330 | |
| 1332 | 1331 | /* register ide states */ |
| 1333 | | save_item(NAME(adapter_control)); |
| 1334 | 1332 | save_item(NAME(status)); |
| 1335 | 1333 | save_item(NAME(error)); |
| 1336 | 1334 | save_item(NAME(command)); |
| 1337 | 1335 | save_item(NAME(interrupt_pending)); |
| 1338 | | save_item(NAME(precomp_offset)); |
| 1339 | 1336 | |
| 1340 | | save_item(NAME(sector_count)); |
| 1341 | | |
| 1342 | 1337 | save_item(NAME(block_count)); |
| 1343 | 1338 | save_item(NAME(sectors_until_int)); |
| 1344 | 1339 | |