185 lines
5.2 KiB
C++
185 lines
5.2 KiB
C++
#ifndef CPU_H
|
|
#define CPU_H
|
|
|
|
#include <stdint.h>
|
|
#include <inttypes.h>
|
|
#include <map>
|
|
#include <string>
|
|
#include <algorithm>
|
|
|
|
|
|
#define MAJOR_VERSION "1.0"
|
|
#define MINOR_VERSION "10R"
|
|
#define VERSION_STR "gtemuAT67 v" MAJOR_VERSION "." MINOR_VERSION
|
|
#define RUNTIME_VERSION 104 // this must match RUNTIME_VERSION in runtime/util.i
|
|
|
|
#define ROM_INST 0
|
|
#define ROM_DATA 1
|
|
|
|
#define NUM_INT_ROMS 5
|
|
|
|
#define ROM_TITLE_ADDRESS 0xFEB1
|
|
#define MAX_TITLE_CHARS 25
|
|
|
|
#define BOOT_COUNT 0x0004
|
|
#define BOOT_CHECK 0x0005
|
|
|
|
#define STACK_POINTER 0x001C
|
|
|
|
#define VIDEO_MODE_D 0x000D
|
|
#define VIDEO_MODE_B 0x001F
|
|
#define VIDEO_MODE_C 0x0020
|
|
|
|
#define VBLANK_PROC 0x01F6
|
|
#define VIDEO_TOP 0x01F9
|
|
|
|
#define VCPU_SOFT_RESET 0x01F0
|
|
|
|
#define ROM_TYPE 0x0021
|
|
#define ROM_TYPE_MASK 0x00FC
|
|
#define ROM_VCPU_DISPATCH 0x0309
|
|
|
|
#if defined(_WIN32)
|
|
#define _EXIT_(f) \
|
|
do \
|
|
{ \
|
|
(void)!system("pause");\
|
|
exit(f); \
|
|
} \
|
|
while(0)
|
|
#else
|
|
#define _EXIT_(f) \
|
|
do \
|
|
{ \
|
|
(void)!system("echo \"Press ENTER to continue . . .\"; read input");\
|
|
exit(f); \
|
|
} \
|
|
while(0)
|
|
#endif
|
|
|
|
#if defined(_WIN32)
|
|
#define _PAUSE_ (void)!system("pause")
|
|
#else
|
|
#define _PAUSE_ (void)!system("echo \"Press ENTER to continue . . .\"; read input")
|
|
#endif
|
|
|
|
// At least on Windows, _X is a constant defined somewhere before here
|
|
#if defined(_X)
|
|
#undef _X
|
|
#endif
|
|
|
|
#define UNREFERENCED_PARAM(P) ((void)P)
|
|
|
|
|
|
namespace Cpu
|
|
{
|
|
enum RomType {ROMERR=0x00, ROMv1=0x1c, ROMv2=0x20, ROMv3=0x28, ROMv4=0x38, ROMv5a=0x40, SDCARD=0xf0, DEVROM=0xf8};
|
|
enum ScanlineMode {Normal=0, VideoB, VideoC, VideoBC, NumScanlineModes};
|
|
enum InternalGt1Id {SnakeGt1=0, RacerGt1=1, MandelbrotGt1=2, PicturesGt1=3, CreditsGt1=4, LoaderGt1=5, NumInternalGt1s};
|
|
enum Endianness {LittleEndian = 0x03020100ul, BigEndian = 0x00010203ul};
|
|
|
|
struct State
|
|
{
|
|
uint16_t _PC;
|
|
uint8_t _IR, _D, _AC, _X, _Y, _OUT, _undef;
|
|
};
|
|
|
|
struct InternalGt1
|
|
{
|
|
uint16_t _start;
|
|
uint16_t _patch;
|
|
uint16_t _string;
|
|
uint8_t _length; // string length
|
|
};
|
|
|
|
|
|
int getNumRoms(void);
|
|
int getRomIndex(void);
|
|
|
|
uint8_t* getPtrToROM(int& romSize);
|
|
RomType getRomType(void);
|
|
std::map<std::string, RomType>& getRomTypeMap(void);
|
|
bool getRomTypeStr(RomType romType, std::string& romTypeStr);
|
|
|
|
#ifdef _WIN32
|
|
void enableWin32ConsoleSaveFile(bool consoleSaveFile);
|
|
#endif
|
|
|
|
Endianness getHostEndianness(void);
|
|
void swapEndianness(uint16_t& value);
|
|
void swapEndianness(uint32_t& value);
|
|
void swapEndianness(uint64_t& value);
|
|
|
|
void initialiseInternalGt1s(void);
|
|
|
|
void patchSYS_Exec_88(void);
|
|
void patchScanlineModeVideoB(void);
|
|
void patchScanlineModeVideoC(void);
|
|
void patchTitleIntoRom(const std::string& title);
|
|
bool patchSplitGt1IntoRom(const std::string& splitGt1path, const std::string& splitGt1name, uint16_t startAddress, InternalGt1Id gt1Id);
|
|
|
|
#ifndef STAND_ALONE
|
|
using vCpuPc = std::pair<uint16_t, uint16_t>;
|
|
|
|
bool getColdBoot(void);
|
|
bool getIsInReset(void);
|
|
State& getStateS(void);
|
|
State& getStateT(void);
|
|
int64_t getClock(void);
|
|
uint8_t getIN(void);
|
|
uint8_t getXOUT(void);
|
|
uint16_t getCTRL(void); // extension ctrl register
|
|
uint8_t getXIN(void); // extension input
|
|
uint16_t getVPC(void);
|
|
uint16_t getOldVPC(void);
|
|
uint8_t getRAM(uint16_t address);
|
|
uint8_t getXRAM(uint32_t address);
|
|
uint8_t getROM(uint16_t address, int page);
|
|
uint16_t getRAM16(uint16_t address);
|
|
uint16_t getXRAM16(uint32_t address);
|
|
uint16_t getROM16(uint16_t address, int page);
|
|
float getvCpuUtilisation(void);
|
|
|
|
void setOldVPC(uint16_t oldVPC);
|
|
void setColdBoot(bool coldBoot);
|
|
void setIsInReset(bool isInReset);
|
|
void setClock(int64_t clock);
|
|
void setIN(uint8_t in);
|
|
void setCTRL(uint16_t ctrl);
|
|
void setXIN(uint8_t xin);
|
|
void setRAM(uint16_t address, uint8_t data);
|
|
void setXRAM(uint32_t address, uint8_t data);
|
|
void setROM(uint16_t base, uint16_t address, uint8_t data);
|
|
void setRAM16(uint16_t address, uint16_t data);
|
|
void setXRAM16(uint32_t address, uint16_t data);
|
|
void setROM16(uint16_t base, uint16_t address, uint16_t data);
|
|
void setRomType(void);
|
|
void setSizeRAM(int size);
|
|
|
|
void saveScanlineModes(void);
|
|
void restoreScanlineModes(void);
|
|
void swapScanlineMode(void);
|
|
|
|
void loadRom(int index);
|
|
void swapRom(void);
|
|
|
|
void initialise(void);
|
|
void shutdown(void);
|
|
void cycle(const State& S, State& T);
|
|
void reset(bool coldBoot=false);
|
|
void softReset(void);
|
|
void swapMemoryModel(void);
|
|
bool process(bool disableOutput=false);
|
|
|
|
#ifdef _WIN32
|
|
void restoreWin32Console(void);
|
|
void saveWin32Console(void);
|
|
#endif
|
|
|
|
// Experimental, (emulation only, for now)
|
|
void enable6BitSound(RomType romType, bool enable);
|
|
#endif
|
|
}
|
|
|
|
#endif
|