From ca118555214a176728b9aab87849391344306d6d Mon Sep 17 00:00:00 2001 From: Paul Oliver Date: Thu, 29 Feb 2024 02:29:13 +0100 Subject: Initial commit. --- include/memory.h | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 include/memory.h (limited to 'include/memory.h') diff --git a/include/memory.h b/include/memory.h new file mode 100644 index 0000000..e7b97ee --- /dev/null +++ b/include/memory.h @@ -0,0 +1,134 @@ +/** +* @file memory.h +* @author Paul Oliver +* +* This module gives access to Salis memory. You can check the state of each +* byte (instruction and flags) at any time and also perform manual memory +* manipulations. +*/ + +#ifndef SALIS_MEMORY_H +#define SALIS_MEMORY_H + +#define IP_FLAG 0x80 +#define BLOCK_START_FLAG 0x40 +#define ALLOCATED_FLAG 0x20 +#define INSTRUCTION_MASK 0x1f + +void _sal_mem_init(uint32 order); +void _sal_mem_quit(void); +void _sal_mem_load_from(FILE *file); +void _sal_mem_save_into(FILE *file); + +/** Get memory order. +* @return Order of memory (memory_size == 1 << order) +*/ +SALIS_API uint32 sal_mem_get_order(void); + +/** Get memory size. +* @return Size of memory (memory_size == 1 << order) +*/ +SALIS_API uint32 sal_mem_get_size(void); + +/** Get amount of addresses with the IP flag set on them. +* @return Amount of addresses with the IP flag set +*/ +SALIS_API uint32 sal_mem_get_ip_count(void); + +/** Get amount of addresses with the memory-block-start flag set on them. +* @return Amount of addresses with the memory-block-start flag set +*/ +SALIS_API uint32 sal_mem_get_block_start_count(void); + +/** Get amount of addresses with the allocated flag set on them. +* @return Amount of addresses with the allocated flag set +*/ +SALIS_API uint32 sal_mem_get_allocated_count(void); + +/** Get memory capacity. +* @return Memory capacity (capacity == size / 2) +*/ +SALIS_API uint32 sal_mem_get_capacity(void); + +/** Get amount of addresses with a given instruction written on them. +* @param inst Instruction whose amount we want to count +* @return Amount of addresses with given instruction +*/ +SALIS_API uint32 sal_mem_get_inst_count(uint8 inst); + +/** Determine if memory is above its capacity. +* @return Memory is above capacity +*/ +SALIS_API boolean sal_mem_is_over_capacity(void); + +/** Check validity of address. +* @param address Address being queried +* @return Validity of address (validity == address < size) +*/ +SALIS_API boolean sal_mem_is_address_valid(uint32 address); + +/** Check if given address has the IP flag set. +* @param address Address being queried +* @return IP flag is set on this address +*/ +SALIS_API boolean sal_mem_is_ip(uint32 address); + +/** Check if given address has the memory-block-start flag set. +* @param address Address being queried +* @return Memory-block-start flag is set on this address +*/ +SALIS_API boolean sal_mem_is_block_start(uint32 address); + +/** Check if given address has the allocated flag set. +* @param address Address being queried +* @return Allocated flag is set on this address +*/ +SALIS_API boolean sal_mem_is_allocated(uint32 address); + +void _sal_mem_set_ip(uint32 address); +void _sal_mem_set_block_start(uint32 address); +void _sal_mem_set_allocated(uint32 address); +void _sal_mem_unset_ip(uint32 address); +void _sal_mem_unset_block_start(uint32 address); +void _sal_mem_unset_allocated(uint32 address); + +/** Get currently set flags at given address. +* @param address Address being queried +* @return Byte containing set flag bits +*/ +SALIS_API uint8 sal_mem_get_flags(uint32 address); + +/** Get current instruction at address. +* @param address Address being queried +* @return Instruction currently written at address +*/ +SALIS_API uint8 sal_mem_get_inst(uint32 address); + +/** Write instruction into address. +* @param address Address being set +* @param inst Instruction to write at given address +*/ +SALIS_API void sal_mem_set_inst(uint32 address, uint8 inst); + +/** Get current byte at address. +* @param address Address being queried +* @return Byte currently written at address (includes bit flags & instruction) +*/ +SALIS_API uint8 sal_mem_get_byte(uint32 address); + +/** Render a 1D image of a given block of memory. This is useful, as rendering +* directly in python would be too slow. We use openmp for multi-threaded image +* generation. +* +* @param origin Low bound of rendered image +* @param cell_size Amount of bytes per rendered pixel (cell) +* @param buff_size Amount of pixels (cells) to be generated +* @param buffer Pre-allocated buffer to store the rendered pixels into +*/ +SALIS_API void sal_mem_render_image( + uint32 origin, uint32 cell_size, uint32 buff_size, uint8_p buffer +); + +void _sal_mem_cycle(void); + +#endif -- cgit v1.2.1