100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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 |