gigatron/rom/Contrib/at67/memory.h
2025-01-28 19:17:01 +03:00

100 lines
2.9 KiB
C++

#ifndef MEMORY_H
#define MEMORY_H
#include <stdint.h>
#include <vector>
#define ROM_SIZE (1<<16)
#define RAM_SIZE_LO (1<<15)
#define RAM_SIZE_HI (1<<16)
#define RAM_SIZE_EX (1<<17)
#define RAM_SIZE_LO_MASK (RAM_SIZE_LO - 1)
#define RAM_SIZE_HI_MASK (RAM_SIZE_HI - 1)
#define RAM_SIZE_EX_MASK (RAM_SIZE_EX - 1)
#define RAM_USED_DEFAULT 19986 // page0=256 + page1=256 + page2=6 + page3=6 + page4=6 + page7=256 + 160*120
#define RAM_PAGE_START_0 0x0200
#define RAM_PAGE_START_1 0x0300
#define RAM_PAGE_START_2 0x0400
#define RAM_PAGE_START_3 0x0500
#define RAM_PAGE_START_4 0x0600
#define RAM_PAGE_SIZE_0 250
#define RAM_PAGE_SIZE_1 250
#define RAM_PAGE_SIZE_2 250
#define RAM_PAGE_SIZE_3 256
#define RAM_PAGE_SIZE_4 256
#define RAM_STACK_START 0x0600
#define RAM_STACK_SIZE 256
#define RAM_AUDIO_START 0x0700
#define RAM_AUDIO_END 0x07FF
#define RAM_VIDEO_START 0x0800
#define RAM_VIDEO_END 0x7F00
#define RAM_VIDEO_OFS 0x0100
#define RAM_SCANLINE_SIZE 160
#define RAM_SEGMENTS_START 0x08A0
#define RAM_SEGMENTS_END 0x7FA0
#define RAM_SEGMENTS_OFS 0x0100
#define RAM_SEGMENTS_SIZE 96
#define RAM_UPPER_START 0x8000
#define RAM_UPPER_SIZE 0x8000
#define RAM_UPPER_SEG 256
#define RAM_EXPAND_START 0x10000
#define RAM_EXPAND_SIZE 0x10000
#define RAM_EXPAND_SEG 256
#define GTB_LINE0_ADDRESS 0x1BA0
#define MAX_GTB_LINE_SIZE 32
#define NUM_GTB_LINES_PER_ROW 3
#define LO_BYTE(a) ((a) & 0x00FF)
#define HI_BYTE(a) (((a) >>8) & 0x00FF)
#define HI_MASK(a) ((a) & 0xFF00)
#define MAKE_ADDR(a, b) ((LO_BYTE(a) <<8) | LO_BYTE(b))
namespace Memory
{
enum FitType {FitAscending, FitDescending, NumFitTypes};
enum SortType {NoSort, AddressDescending, AddressAscending, SizeAscending, SizeDescending, NumSortTypes};
enum ParityType {ParityNone=0, ParityEven=1, ParityOdd=2};
struct RamEntry
{
uint16_t _address;
int _size;
};
int getSizeRAM(void);
int getBaseFreeRAM(void);
int getSizeFreeRAM(void);
int getFreeGtbRAM(int numLines);
void setSizeRAM(int sizeRAM);
void setSizeFreeRAM(int freeRAM);
void initialise(void);
void invertFreeRAM(void);
bool isFreeRAM(uint16_t address, int size);
bool isVideoRAM(uint16_t address);
bool getNextCodeAddress(FitType fitType, uint16_t start, int size, uint16_t& address);
bool giveFreeRAM(uint16_t address, int size);
bool takeFreeRAM(uint16_t address, int size, bool printError=true);
bool getFreeRAMLargest(uint16_t& address, int& size);
bool getFreeRAM(FitType fitType, int size, uint16_t min, uint16_t max, uint16_t& address, bool withinPage=true, ParityType oddEven=ParityNone);
bool getFreeRAM(FitType fitType, uint16_t addrMin, uint16_t addrMax, uint16_t sizeMin, uint16_t& address, uint16_t inSize, uint16_t& outSize, bool withinPage=true);
void printFreeRamList(SortType sortType=AddressAscending);
}
#endif