franta-hg@29: /** franta-hg@29: * RGB assembler franta-hg@29: * Copyright © 2017 František Kučera (frantovo.cz) franta-hg@29: * franta-hg@29: * This program is free software: you can redistribute it and/or modify franta-hg@29: * it under the terms of the GNU General Public License as published by franta-hg@29: * the Free Software Foundation, either version 3 of the License, or franta-hg@29: * (at your option) any later version. franta-hg@29: * franta-hg@29: * This program is distributed in the hope that it will be useful, franta-hg@29: * but WITHOUT ANY WARRANTY; without even the implied warranty of franta-hg@29: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the franta-hg@29: * GNU General Public License for more details. franta-hg@29: * franta-hg@29: * You should have received a copy of the GNU General Public License franta-hg@29: * along with this program. If not, see . franta-hg@29: */ franta-hg@29: 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@31: class Memory { franta-hg@31: private: franta-hg@20: franta-hg@31: template T logMemoryError(const address_t &index) { franta-hg@31: wprintf(L"memory error: index = %d, sizeof(T) = %d, MEMORY_SIZE = %d\n", index, sizeof (T), MEMORY_SIZE); franta-hg@31: // TODO: return error value or throw exception franta-hg@31: return T(); franta-hg@20: } franta-hg@31: octet_t * memory; franta-hg@31: address_t index; franta-hg@20: franta-hg@31: public: franta-hg@31: franta-hg@31: Memory() { franta-hg@31: memory = (octet_t*) malloc(MEMORY_SIZE); franta-hg@31: index = 0; franta-hg@20: } franta-hg@31: franta-hg@31: virtual ~Memory() { franta-hg@31: free(memory); franta-hg@31: memory = nullptr; franta-hg@31: } franta-hg@31: franta-hg@31: /** franta-hg@31: * Reads data on given position in memory and increments the index (position). franta-hg@31: * @return value found at current position franta-hg@31: */ franta-hg@31: template T read() { franta-hg@31: // TODO: map higher memory to static hardcoded areas or peripherals franta-hg@31: if (index + sizeof (T) <= MEMORY_SIZE) { franta-hg@31: T * value = reinterpret_cast (memory + index); franta-hg@31: index += sizeof (T); franta-hg@31: return *value; franta-hg@31: } else { franta-hg@31: return logMemoryError(index); franta-hg@31: } franta-hg@31: } franta-hg@31: franta-hg@31: /** franta-hg@31: * Writes data to current position in memory and increments the index (position). franta-hg@31: * @param value value to be written at given position franta-hg@31: */ franta-hg@31: template T write(const T value) { franta-hg@31: if (index + sizeof (T) <= MEMORY_SIZE) { franta-hg@31: T * m = reinterpret_cast (memory + index); franta-hg@31: *m = value; franta-hg@31: index += sizeof (value); franta-hg@31: } else { franta-hg@31: return logMemoryError(index); franta-hg@31: } franta-hg@31: } franta-hg@31: franta-hg@31: void setIndex(address_t &index) { franta-hg@31: this->index = index; franta-hg@31: } franta-hg@31: franta-hg@31: address_t getIndex() { franta-hg@31: return index; franta-hg@31: } franta-hg@31: franta-hg@31: /** franta-hg@31: * FIXME: rename franta-hg@31: * @return franta-hg@31: */ franta-hg@31: bool isInside() { franta-hg@31: return index < MEMORY_SIZE; franta-hg@31: } franta-hg@31: franta-hg@31: /** franta-hg@31: * FIXME: rename, refactor franta-hg@31: */ franta-hg@31: void start() { franta-hg@31: index = 0; franta-hg@31: } franta-hg@31: franta-hg@31: /** franta-hg@31: * FIXME: rename, refactor franta-hg@31: */ franta-hg@31: void finish() { franta-hg@31: index = MEMORY_SIZE; franta-hg@31: } franta-hg@31: };