| 672 | } |
| 673 | |
| 674 | BYTE HarddiskInterfaceCard::CmdExecute(HardDiskDrive* pHDD, const ULONG nExecutedCycles) |
| 675 | { |
| 676 | LOG_DISK("slot-%d, HDD-%d(%02X): Cmd=%02X ", m_slot, (m_command & SP_Cmd_base) ? m_unitNum : GetProDOSBlockDeviceUnit(), m_unitNum, m_command); |
| 677 | |
| 678 | if (!pHDD->m_imageloaded && m_command != BLK_Cmd_Status && m_command != SP_Cmd_status) |
| 679 | { |
| 680 | pHDD->m_status_next = DISK_STATUS_OFF; |
| 681 | pHDD->m_error = DEVICE_NOT_CONNECTED; // GH#452 |
| 682 | return CmdStatus(pHDD); |
| 683 | } |
| 684 | |
| 685 | if ((m_command == SP_Cmd_readblock || m_command == SP_Cmd_writeblock) && pHDD->m_diskblock > kHarddiskMaxNumBlocks) |
| 686 | { |
| 687 | pHDD->m_status_next = DISK_STATUS_OFF; |
| 688 | pHDD->m_error = DEVICE_IO_ERROR; |
| 689 | return CmdStatus(pHDD); |
| 690 | } |
| 691 | |
| 692 | const UINT CYCLES_FOR_DMA_RW_BLOCK = HD_BLOCK_SIZE; |
| 693 | const UINT CYCLES_FOR_FORMATTING_1_BLOCK = 100; // Arbitrary |
| 694 | |
| 695 | pHDD->m_error = DEVICE_OK; |
| 696 | |
| 697 | switch (m_command) |
| 698 | { |
| 699 | case BLK_Cmd_Status: |
| 700 | if (ImageGetImageSize(pHDD->m_imagehandle) == 0) |
| 701 | pHDD->m_error = DEVICE_IO_ERROR; |
| 702 | LOG_DISK("ST-BLK: %02X\n", pHDD->m_error); |
| 703 | break; |
| 704 | case SP_Cmd_busyStatus: |
| 705 | LOG_DISK("ST-BSY: %02X\n", pHDD->m_error); |
| 706 | break; |
| 707 | case SP_Cmd_status: |
| 708 | pHDD->m_error = SmartPortCmdStatus(pHDD, nExecutedCycles); |
| 709 | LOG_DISK("ST: %02X (statusCode: %02X)\n", pHDD->m_error, m_statusCode); |
| 710 | break; |
| 711 | case BLK_Cmd_Read: |
| 712 | case SP_Cmd_readblock: |
| 713 | LOG_DISK("RD: %08X (to addr: %04X)\n", pHDD->m_diskblock, pHDD->m_memblock); |
| 714 | pHDD->m_status_next = DISK_STATUS_READ; |
| 715 | if ((pHDD->m_diskblock * HD_BLOCK_SIZE) < ImageGetImageSize(pHDD->m_imagehandle)) |
| 716 | { |
| 717 | bool breakpointHit = false; |
| 718 | |
| 719 | bool bRes = ImageReadBlock(pHDD->m_imagehandle, pHDD->m_diskblock, pHDD->m_buf); |
| 720 | if (bRes) |
| 721 | { |
| 722 | pHDD->m_buf_ptr = 0; |
| 723 | |
| 724 | // Apple II's MMU could be setup so that read & write memory is different, so use 'memwrite' not 'mem'. |
| 725 | WORD dstAddr = pHDD->m_memblock; |
| 726 | UINT remaining = HD_BLOCK_SIZE; |
| 727 | BYTE* pSrc = pHDD->m_buf; |
| 728 | |
| 729 | while (remaining) |
| 730 | { |
| 731 | memdirty[dstAddr >> 8] = 0xFF; |
no test coverage detected