| 596 | #define SET_STATUS_ERROR(err) (((err)<<1)|STATUS_ERROR) |
| 597 | |
| 598 | BYTE __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; |
nothing calls this directly
no test coverage detected