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

Method IORead

source/Harddisk.cpp:598–672  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

596#define SET_STATUS_ERROR(err) (((err)<<1)|STATUS_ERROR)
597
598BYTE __stdcall HarddiskInterfaceCard::IORead(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nExecutedCycles)
599{
600 const UINT slot = ((addr & 0xff) >> 4) - 8;
601 HarddiskInterfaceCard* pCard = (HarddiskInterfaceCard*)MemGetSlotParameters(slot);
602
603 HardDiskDrive* pHDD = NULL;
604 const BYTE addrIdx = addr & 0xF;
605 if (addrIdx != 0x2 && addrIdx != 0x3) // GetUnit() depends on m_command & m_unitNum
606 {
607 pHDD = pCard->GetUnit();
608 if (pHDD == NULL)
609 return SET_STATUS_ERROR(DEVICE_NOT_CONNECTED);
610 }
611
612 CpuCalcCycles(nExecutedCycles);
613
614 BYTE r = STATUS_OK;
615
616 switch (addrIdx)
617 {
618 case 0x0: // EXECUTE & RETURN STATUS
619 r = pCard->CmdExecute(pHDD, nExecutedCycles);
620 pCard->m_command = (pCard->m_command & SP_Cmd_base) ? SP_Cmd_busyStatus : BLK_Cmd_Status; // Subsequent reads from IO addr 0x0 just executes 'Status' cmd
621 _ASSERT(pCard->m_fifoIdx == 0);
622 pCard->m_fifoIdx = 0;
623 break;
624 case 0x1: // STATUS
625 r = pCard->CmdStatus(pHDD);
626 break;
627 case 0x2:
628 r = pCard->m_command;
629 break;
630 case 0x3:
631 r = pCard->m_unitNum;
632 break;
633 case 0x4:
634 r = (BYTE)(pHDD->m_memblock & 0x00FF);
635 break;
636 case 0x5:
637 r = (BYTE)((pHDD->m_memblock & 0xFF00) >> 8);
638 break;
639 case 0x6:
640 r = (BYTE)(pHDD->m_diskblock & 0x00FF);
641 break;
642 case 0x7:
643 r = (BYTE)((pHDD->m_diskblock & 0xFF00) >> 8);
644 break;
645 case 0x8: // Legacy: continue to support this I/O port for old HDC firmware
646 r = pHDD->m_buf[pHDD->m_buf_ptr];
647 if (pHDD->m_buf_ptr < sizeof(pHDD->m_buf)-1)
648 pHDD->m_buf_ptr++;
649 break;
650 case 0x9:
651 if (pHDD->m_imageloaded)
652 r = (BYTE)(pCard->GetImageSizeInBlocks(pHDD->m_imagehandle, true) & 0x00ff);
653 else
654 r = 0;
655 break;

Callers

nothing calls this directly

Calls 8

MemGetSlotParametersFunction · 0.85
CpuCalcCyclesFunction · 0.85
IO_NullFunction · 0.85
GetUnitMethod · 0.80
CmdExecuteMethod · 0.80
CmdStatusMethod · 0.80
GetImageSizeInBlocksMethod · 0.80
UpdateLightStatusMethod · 0.80

Tested by

no test coverage detected