bool RandomMemoryAccess::doWrite (uint32_t address, uint32_t* buffer, size_t count) { if (count > this->getSize()) return false; uint32_t start_val = 0; const uint32_t end_adr = address + count; size_t paddedCount = count; if(address & 1) { ++paddedCount; if( !doRead(address - 1, &start_val, 1) || !sync() ) return false; } uint32_t end_val = 0; if(end_adr & 1) { ++paddedCount; if( !doRead(end_adr, &end_val, 1) || !sync() ) return false; } HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); address += getStart(); el->appendInputData32(static_cast<uint32_t>(address & 0xfffffffe)); el->appendInputData32(static_cast<uint32_t>(paddedCount / 2)); if(address & 1) { el->appendInputData8(static_cast<uint8_t>(start_val)); } for (size_t i = 0; i < count; ++i) { el->appendInputData8(static_cast<uint8_t>(buffer[i])); } if (end_adr & 1) { el->appendInputData16(static_cast<uint8_t>(end_val)); } el->setInputMinSize(8); // at least address and size (4+4) this->elements.push_back(el); return true; }
bool RandomMemoryAccess::writeBytes (uint32_t address, uint32_t* buffer, size_t count) { HalExecElement* el = new HalExecElement(ID_WriteMemBytes); el->appendInputData32(this->getStart() + address); el->appendInputData32(static_cast<uint32_t>(count)); for (size_t i = 0; i < count; ++i) { if (buffer[i] > 0xFF) { delete el; return false; } el->appendInputData8(static_cast<uint8_t>(buffer[i])); } el->setInputMinSize(9); this->elements.push_back(el); return true; }
/** each buffer element contains one _byte_ */ bool RandomMemoryAccess::writeWords (uint32_t address, uint32_t* buffer, size_t count) { if (address & 0x1) return false; HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); el->appendInputData32(this->getStart() + address); el->appendInputData32(static_cast<uint32_t>(count/2)); for (size_t i = 0; i+1 < count; i += 2) { if (buffer[i] > 0xFF || buffer[i+1] > 0xFF) { delete el; return false; } el->appendInputData16(static_cast<uint16_t>(buffer[i] | (buffer[i+1] << 8))); } el->setInputMinSize(10); this->elements.push_back(el); return true; }