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

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