diff --git a/simulator/sim_lib/exchange_packet.h b/simulator/sim_lib/exchange_packet.h index b7d712b..d3416a8 100644 --- a/simulator/sim_lib/exchange_packet.h +++ b/simulator/sim_lib/exchange_packet.h @@ -416,6 +416,7 @@ public: CREATE_FIELD(CAddr_t, YmpReadAddress, 2, 0, 7, 0) CREATE_FIELD(uint8_t, YmpExchangeAddress, 5, 8, 15, 0) CREATE_FIELD(uint8_t, YmpVectorLength, 5, 16, 22, 0) +// Here the number of bits is actually series dependent. YEL for example has 4 bits, J90 has 6. Leaving as 8 for now as it doesn't seem to cause trouble. CREATE_FIELD(uint8_t, YmpClusterNumber, 5, 24, 31, 0) CREATE_FIELD(uint8_t, YmpVectorNotUsed, 6, 0, 0, 0) CREATE_FIELD(uint8_t, YmpProcessorType, 7, 0, 1, 0) diff --git a/simulator/sim_lib/sim_iop_periph.cpp b/simulator/sim_lib/sim_iop_periph.cpp index 8d8e996..50cc684 100644 --- a/simulator/sim_lib/sim_iop_periph.cpp +++ b/simulator/sim_lib/sim_iop_periph.cpp @@ -256,6 +256,7 @@ void SimIopPeripheral_c::HandlePacket(std::vector &aPacket, bool aIosESt case FunctionCodes_e::RD: case FunctionCodes_e::RDHLD: case FunctionCodes_e::RDRD: { + int BufferCnt = (Function == FunctionCodes_e::RDRD) ? 2 : 1; uint32_t Addr[2]; uint32_t DataLen[2]; uint32_t TransferLen[2]; @@ -272,10 +273,10 @@ void SimIopPeripheral_c::HandlePacket(std::vector &aPacket, bool aIosESt case ChannelNumbers_e::Disk: break; case ChannelNumbers_e::Tape: - Read(Addr, DataLen, TransferLen, 2, mTapeFile); + Read(Addr, DataLen, TransferLen, BufferCnt, mTapeFile); break; case ChannelNumbers_e::File: - Read(Addr, DataLen, TransferLen, 2, mFile); + Read(Addr, DataLen, TransferLen, BufferCnt, mFile); break; default: CRAY_ASSERT(false); @@ -290,6 +291,7 @@ void SimIopPeripheral_c::HandlePacket(std::vector &aPacket, bool aIosESt case FunctionCodes_e::WR: case FunctionCodes_e::WRHLD: case FunctionCodes_e::WRWR: { + int BufferCnt = (Function == FunctionCodes_e::RDRD) ? 2 : 1; uint32_t Addr[2]; uint32_t DataLen[2]; uint32_t TransferLen[2]; @@ -301,15 +303,15 @@ void SimIopPeripheral_c::HandlePacket(std::vector &aPacket, bool aIosESt TransferLen[1] = uint32_t(GetBits(aPacket[4], TransferLenReq2Range)); switch (ChannelNumber) { case ChannelNumbers_e::Printer: - Write(Addr, DataLen, TransferLen, 2, mPrinterFile); + Write(Addr, DataLen, TransferLen, BufferCnt, mPrinterFile); break; case ChannelNumbers_e::Disk: break; case ChannelNumbers_e::Tape: - Write(Addr, DataLen, TransferLen, 2, mTapeFile); + Write(Addr, DataLen, TransferLen, BufferCnt, mTapeFile); break; case ChannelNumbers_e::File: - Write(Addr, DataLen, TransferLen, 2, mFile); + Write(Addr, DataLen, TransferLen, BufferCnt, mFile); break; default: CRAY_ASSERT(false);