franta-hg@20: #pragma once franta-hg@20: franta-hg@20: #include "types.h" franta-hg@20: franta-hg@20: const address_t MEMORY_SIZE = 1024; franta-hg@20: franta-hg@20: template T logMemoryError(const address_t &index) { franta-hg@20: wprintf(L"memory error: index = %d, sizeof(T) = %d, MEMORY_SIZE = %d\n", index, sizeof (T), MEMORY_SIZE); franta-hg@20: // TODO: return error value or throw exception franta-hg@20: return T(); franta-hg@20: } franta-hg@20: franta-hg@20: /** franta-hg@20: * Reads data on given position in memory and increments the index (position). franta-hg@20: * franta-hg@20: * @param memory array of bytes / octets franta-hg@20: * @param index offset in same units as memory type franta-hg@20: * @return value found at given position franta-hg@20: */ franta-hg@20: template T read(octet_t * memory, address_t &index) { franta-hg@20: // TODO: map higher memory to static hardcoded areas or peripherals franta-hg@20: if (index + sizeof (T) <= MEMORY_SIZE) { franta-hg@20: T * value = reinterpret_cast (memory + index); franta-hg@20: index += sizeof (T); franta-hg@20: return *value; franta-hg@20: } else { franta-hg@20: return logMemoryError(index); franta-hg@20: } franta-hg@20: } franta-hg@20: franta-hg@20: /** franta-hg@20: * Writes data to given position in memory and increments the index (position). franta-hg@20: * @param memory array of bytes / octets franta-hg@20: * @param index offset in same units as memory type franta-hg@20: * @param value value to be written at given position franta-hg@20: */ franta-hg@20: template T write(octet_t * memory, address_t &index, const T value) { franta-hg@20: if (index + sizeof (T) <= MEMORY_SIZE) { franta-hg@20: T * m = reinterpret_cast (memory + index); franta-hg@20: *m = value; franta-hg@20: index += sizeof (value); franta-hg@20: } else { franta-hg@20: return logMemoryError(index); franta-hg@20: } franta-hg@20: }