MCPcopy Create free account
hub / github.com/AppleWin/AppleWin / CmdExecute

Method CmdExecute

source/Harddisk.cpp:674–903  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

672}
673
674BYTE 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;

Callers 1

IOReadMethod · 0.80

Calls 6

ImageGetImageSizeFunction · 0.85
ImageReadBlockFunction · 0.85
ImageWriteBlockFunction · 0.85
CopyBytesFromMemoryPageFunction · 0.85

Tested by

no test coverage detected