827 lines
20 KiB
C++
827 lines
20 KiB
C++
#pragma once
|
|
|
|
#include "build.h"
|
|
|
|
#if BUILD_COMPILER==COMPILER_VC
|
|
#define ALIGN(x) __declspec(align(x))
|
|
#else
|
|
#define __forceinline inline
|
|
#define ALIGN(x) __attribute__((aligned(x)))
|
|
#define __debugbreak
|
|
#endif
|
|
|
|
|
|
#if BUILD_COMPILER==COMPILER_VC
|
|
#define DYNACALL __fastcall
|
|
#else
|
|
#define DYNACALL
|
|
#endif
|
|
|
|
#if BUILD_COMPILER==COMPILER_VC
|
|
#ifdef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
|
|
#undef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
|
|
#endif
|
|
|
|
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
|
|
|
|
#ifdef _CRT_SECURE_NO_DEPRECATE
|
|
#undef _CRT_SECURE_NO_DEPRECATE
|
|
#endif
|
|
|
|
#define _CRT_SECURE_NO_DEPRECATE
|
|
//unnamed struncts/unions
|
|
#pragma warning( disable : 4201)
|
|
|
|
//unused parameters
|
|
#pragma warning( disable : 4100)
|
|
#endif
|
|
|
|
|
|
|
|
#if BUILD_COMPILER==COMPILER_VC
|
|
//SHUT UP M$ COMPILER !@#!@$#
|
|
#ifdef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
|
|
#undef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
|
|
#endif
|
|
|
|
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
|
|
|
|
#ifdef _CRT_SECURE_NO_DEPRECATE
|
|
#undef _CRT_SECURE_NO_DEPRECATE
|
|
#endif
|
|
#define _CRT_SECURE_NO_DEPRECATE
|
|
|
|
//Do not complain when i use enum::member
|
|
#pragma warning( disable : 4482)
|
|
|
|
//unnamed struncts/unions
|
|
#pragma warning( disable : 4201)
|
|
|
|
//unused parameters
|
|
#pragma warning( disable : 4100)
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
//basic types
|
|
typedef int8_t s8;
|
|
typedef int16_t s16;
|
|
typedef int32_t s32;
|
|
typedef int64_t s64;
|
|
|
|
typedef uint8_t u8;
|
|
typedef uint16_t u16;
|
|
typedef uint32_t u32;
|
|
typedef uint64_t u64;
|
|
|
|
typedef float f32;
|
|
typedef double f64;
|
|
|
|
#ifdef _M_X64
|
|
#undef X86
|
|
#define X64
|
|
#endif
|
|
|
|
typedef ptrdiff_t snat;
|
|
typedef size_t unat;
|
|
|
|
#ifdef X64
|
|
typedef u64 unat;
|
|
#endif
|
|
|
|
typedef char wchar;
|
|
|
|
#define EXPORT extern "C" __declspec(dllexport)
|
|
|
|
|
|
|
|
#ifndef CDECL
|
|
#define CDECL __cdecl
|
|
#endif
|
|
|
|
|
|
|
|
|
|
//intc function pointer and enums
|
|
enum HollyInterruptType
|
|
{
|
|
holly_nrm = 0x0000,
|
|
holly_ext = 0x0100,
|
|
holly_err = 0x0200,
|
|
};
|
|
|
|
enum HollyInterruptID
|
|
{
|
|
// asic9a /sh4 external holly normal [internal]
|
|
holly_RENDER_DONE_vd = holly_nrm | 0, //bit 0 = End of Render interrupt : Video
|
|
holly_RENDER_DONE_isp = holly_nrm | 1, //bit 1 = End of Render interrupt : ISP
|
|
holly_RENDER_DONE = holly_nrm | 2, //bit 2 = End of Render interrupt : TSP
|
|
|
|
holly_SCANINT1 = holly_nrm | 3, //bit 3 = V Blank-in interrupt
|
|
holly_SCANINT2 = holly_nrm | 4, //bit 4 = V Blank-out interrupt
|
|
holly_HBLank = holly_nrm | 5, //bit 5 = H Blank-in interrupt
|
|
|
|
holly_YUV_DMA = holly_nrm | 6, //bit 6 = End of Transferring interrupt : YUV
|
|
holly_OPAQUE = holly_nrm | 7, //bit 7 = End of Transferring interrupt : Opaque List
|
|
holly_OPAQUEMOD = holly_nrm | 8, //bit 8 = End of Transferring interrupt : Opaque Modifier Volume List
|
|
|
|
holly_TRANS = holly_nrm | 9, //bit 9 = End of Transferring interrupt : Translucent List
|
|
holly_TRANSMOD = holly_nrm | 10, //bit 10 = End of Transferring interrupt : Translucent Modifier Volume List
|
|
holly_PVR_DMA = holly_nrm | 11, //bit 11 = End of DMA interrupt : PVR-DMA
|
|
holly_MAPLE_DMA = holly_nrm | 12, //bit 12 = End of DMA interrupt : Maple-DMA
|
|
|
|
holly_MAPLE_VBOI = holly_nrm | 13, //bit 13 = Maple V blank over interrupt
|
|
holly_GDROM_DMA = holly_nrm | 14, //bit 14 = End of DMA interrupt : GD-DMA
|
|
holly_SPU_DMA = holly_nrm | 15, //bit 15 = End of DMA interrupt : AICA-DMA
|
|
|
|
holly_EXT_DMA1 = holly_nrm | 16, //bit 16 = End of DMA interrupt : Ext-DMA1(External 1)
|
|
holly_EXT_DMA2 = holly_nrm | 17, //bit 17 = End of DMA interrupt : Ext-DMA2(External 2)
|
|
holly_DEV_DMA = holly_nrm | 18, //bit 18 = End of DMA interrupt : Dev-DMA(Development tool DMA)
|
|
|
|
holly_CH2_DMA = holly_nrm | 19, //bit 19 = End of DMA interrupt : ch2-DMA
|
|
holly_PVR_SortDMA = holly_nrm | 20, //bit 20 = End of DMA interrupt : Sort-DMA (Transferring for alpha sorting)
|
|
holly_PUNCHTHRU = holly_nrm | 21, //bit 21 = End of Transferring interrupt : Punch Through List
|
|
|
|
// asic9c/sh4 external holly external [EXTERNAL]
|
|
holly_GDROM_CMD = holly_ext | 0x00, //bit 0 = GD-ROM interrupt
|
|
holly_SPU_IRQ = holly_ext | 0x01, //bit 1 = AICA interrupt
|
|
holly_EXP_8BIT = holly_ext | 0x02, //bit 2 = Modem interrupt
|
|
holly_EXP_PCI = holly_ext | 0x03, //bit 3 = External Device interrupt
|
|
|
|
// asic9b/sh4 external holly err only error [error]
|
|
//missing quite a few ehh ?
|
|
//bit 0 = RENDER : ISP out of Cache(Buffer over flow)
|
|
//bit 1 = RENDER : Hazard Processing of Strip Buffer
|
|
holly_PRIM_NOMEM = holly_err | 0x02, //bit 2 = TA : ISP/TSP Parameter Overflow
|
|
holly_MATR_NOMEM = holly_err | 0x03 //bit 3 = TA : Object List Pointer Overflow
|
|
//bit 4 = TA : Illegal Parameter
|
|
//bit 5 = TA : FIFO Overflow
|
|
//bit 6 = PVRIF : Illegal Address set
|
|
//bit 7 = PVRIF : DMA over run
|
|
//bit 8 = MAPLE : Illegal Address set
|
|
//bit 9 = MAPLE : DMA over run
|
|
//bit 10 = MAPLE : Write FIFO over flow
|
|
//bit 11 = MAPLE : Illegal command
|
|
//bit 12 = G1 : Illegal Address set
|
|
//bit 13 = G1 : GD-DMA over run
|
|
//bit 14 = G1 : ROM/FLASH access at GD-DMA
|
|
//bit 15 = G2 : AICA-DMA Illegal Address set
|
|
//bit 16 = G2 : Ext-DMA1 Illegal Address set
|
|
//bit 17 = G2 : Ext-DMA2 Illegal Address set
|
|
//bit 18 = G2 : Dev-DMA Illegal Address set
|
|
//bit 19 = G2 : AICA-DMA over run
|
|
//bit 20 = G2 : Ext-DMA1 over run
|
|
//bit 21 = G2 : Ext-DMA2 over run
|
|
//bit 22 = G2 : Dev-DMA over run
|
|
//bit 23 = G2 : AICA-DMA Time out
|
|
//bit 24 = G2 : Ext-DMA1 Time out
|
|
//bit 25 = G2 : Ext-DMA2 Time out
|
|
//bit 26 = G2 : Dev-DMA Time out
|
|
//bit 27 = G2 : Time out in CPU accessing
|
|
};
|
|
|
|
|
|
|
|
struct vram_block
|
|
{
|
|
u32 start;
|
|
u32 end;
|
|
u32 len;
|
|
u32 type;
|
|
|
|
void* userdata;
|
|
};
|
|
|
|
|
|
#if (DC_PLATFORM==DC_PLATFORM_NORMAL)
|
|
|
|
#define BUILD_DREAMCAST 1
|
|
|
|
//DC : 16 mb ram, 8 mb vram, 2 mb aram, 2 mb bios, 128k flash
|
|
#define RAM_SIZE (16*1024*1024)
|
|
#define VRAM_SIZE (8*1024*1024)
|
|
#define ARAM_SIZE (2*1024*1024)
|
|
#define BIOS_SIZE (2*1024*1024)
|
|
#define FLASH_SIZE (128*1024)
|
|
|
|
#define ROM_PREFIX "dc_"
|
|
#define ROM_NAMES
|
|
#define NVR_OPTIONAL 0
|
|
|
|
#elif (DC_PLATFORM==DC_PLATFORM_DEV_UNIT)
|
|
|
|
#define BUILD_DEV_UNIT 1
|
|
|
|
//Devkit : 32 mb ram, 8? mb vram, 2? mb aram, 2? mb bios, ? flash
|
|
#define RAM_SIZE (32*1024*1024)
|
|
#define VRAM_SIZE (8*1024*1024)
|
|
#define ARAM_SIZE (2*1024*1024)
|
|
#define BIOS_SIZE (2*1024*1024)
|
|
#define FLASH_SIZE (128*1024)
|
|
|
|
#define ROM_PREFIX "hkt_"
|
|
#define ROM_NAMES
|
|
#define NVR_OPTIONAL 0
|
|
|
|
#elif (DC_PLATFORM==DC_PLATFORM_NAOMI)
|
|
|
|
#define BUILD_NAOMI 1
|
|
#define BUILD_NAOMI1 1
|
|
|
|
//Naomi : 32 mb ram, 16 mb vram, 8 mb aram, 2 mb bios, ? flash
|
|
#define RAM_SIZE (32*1024*1024)
|
|
#define VRAM_SIZE (16*1024*1024)
|
|
#define ARAM_SIZE (8*1024*1024)
|
|
#define BIOS_SIZE (2*1024*1024)
|
|
#define BBSRAM_SIZE (8*1024)
|
|
|
|
#define ROM_PREFIX "naomi_"
|
|
#define ROM_NAMES ";epr-21576d.bin"
|
|
#define NVR_OPTIONAL 1
|
|
|
|
#elif (DC_PLATFORM==DC_PLATFORM_NAOMI2)
|
|
|
|
#define BUILD_NAOMI 1
|
|
#define BUILD_NAOMI2 1
|
|
|
|
//Naomi2 : 32 mb ram, 16 mb vram, 8 mb aram, 2 mb bios, ? flash
|
|
#define RAM_SIZE (32*1024*1024)
|
|
#define VRAM_SIZE (16*1024*1024)
|
|
#define ARAM_SIZE (8*1024*1024)
|
|
#define BIOS_SIZE (2*1024*1024)
|
|
#define BBSRAM_SIZE (8*1024)
|
|
|
|
#define ROM_PREFIX "n2_"
|
|
#define ROM_NAMES
|
|
#define NVR_OPTIONAL 1
|
|
|
|
#elif (DC_PLATFORM==DC_PLATFORM_ATOMISWAVE)
|
|
|
|
#define BUILD_ATOMISWAVE 1
|
|
|
|
//Atomiswave : 16(?) mb ram, 16 mb vram, 8 mb aram, 64kb bios, 64k flash
|
|
#define RAM_SIZE (16*1024*1024)
|
|
#define VRAM_SIZE (16*1024*1024)
|
|
#define ARAM_SIZE (8*1024*1024)
|
|
#define BIOS_SIZE (64*1024)
|
|
#define FLASH_SIZE (64*1024)
|
|
|
|
#define ROM_PREFIX "aw_"
|
|
#define ROM_NAMES ";bios.ic23_l"
|
|
#define NVR_OPTIONAL 1
|
|
|
|
#else
|
|
#error invalid build config
|
|
#endif
|
|
|
|
#define RAM_MASK (RAM_SIZE-1)
|
|
#define VRAM_MASK (VRAM_SIZE-1)
|
|
#define ARAM_MASK (ARAM_SIZE-1)
|
|
#define BIOS_MASK (BIOS_SIZE-1)
|
|
|
|
#ifdef FLASH_SIZE
|
|
#define FLASH_MASK (FLASH_SIZE-1)
|
|
#endif
|
|
|
|
#ifdef BBSRAM_SIZE
|
|
#define BBSRAM_MASK (BBSRAM_SIZE-1)
|
|
#endif
|
|
|
|
#define GD_CLOCK 33868800 //GDROM XTAL -- 768fs
|
|
|
|
#define AICA_CORE_CLOCK (GD_CLOCK*4/3) //[45158400] GD->PLL 3:4 -> AICA CORE -- 1024fs
|
|
#define ADAC_CLOCK (AICA_CORE_CLOCK/2) //[11289600] 44100*256, AICA CORE -> PLL 4:1 -> ADAC -- 256fs
|
|
#define AICA_ARM_CLOCK (AICA_CORE_CLOCK/2) //[22579200] AICA CORE -> PLL 2:1 -> ARM
|
|
#define AICA_SDRAM_CLOCK (GD_CLOCK*2) //[67737600] GD-> PLL 2 -> SDRAM
|
|
#define SH4_MAIN_CLOCK (200*1000*1000) //[200000000] XTal(13.5) -> PLL (33.3) -> PLL 1:6 (200)
|
|
#define SH4_RAM_CLOCK (100*1000*1000) //[100000000] XTal(13.5) -> PLL (33.3) -> PLL 1:3 (100) , also suplied to HOLLY chip
|
|
#define G2_BUS_CLOCK (25*1000*1000) //[25000000] from Holly, from SH4_RAM_CLOCK w/ 2 2:1 plls
|
|
|
|
|
|
enum ndc_error_codes
|
|
{
|
|
rv_ok = 0, //no error
|
|
|
|
rv_error=-2, //error
|
|
rv_serror=-1, //silent error , it has been reported to the user
|
|
};
|
|
|
|
//Simple struct to store window rect ;)
|
|
//Top is 0,0 & numbers are in pixels.
|
|
//Only client size
|
|
struct NDC_WINDOW_RECT
|
|
{
|
|
u32 width;
|
|
u32 height;
|
|
};
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//******************************************************
|
|
//*********************** PowerVR **********************
|
|
//******************************************************
|
|
|
|
void libCore_vramlock_Unlock_block (vram_block* block);
|
|
void libCore_vramlock_Unlock_block_wb (vram_block* block);
|
|
vram_block* libCore_vramlock_Lock(u32 start_offset,u32 end_offset,void* userdata);
|
|
|
|
|
|
|
|
//******************************************************
|
|
//************************ GDRom ***********************
|
|
//******************************************************
|
|
enum DiscType
|
|
{
|
|
CdDA=0x00,
|
|
CdRom=0x10,
|
|
CdRom_XA=0x20,
|
|
CdRom_Extra=0x30,
|
|
CdRom_CDI=0x40,
|
|
GdRom=0x80,
|
|
|
|
NoDisk=0x1, //These are a bit hacky .. but work for now ...
|
|
Open=0x2, //tray is open :)
|
|
Busy=0x3 //busy -> needs to be automatically done by gdhost
|
|
};
|
|
|
|
enum DiskArea
|
|
{
|
|
SingleDensity,
|
|
DoubleDensity
|
|
};
|
|
|
|
enum DriveEvent
|
|
{
|
|
DiskChange=1 //disk ejected/changed
|
|
};
|
|
|
|
//******************************************************
|
|
//************************ AICA ************************
|
|
//******************************************************
|
|
void libARM_InterruptChange(u32 bits,u32 L);
|
|
void libCore_CDDA_Sector(s16* sector);
|
|
|
|
|
|
//passed on AICA init call
|
|
|
|
|
|
//Ram/Regs are managed by plugin , exept RTC regs (managed by main emu)
|
|
|
|
//******************************************************
|
|
//******************** ARM Sound CPU *******************
|
|
//******************************************************
|
|
|
|
//******************************************************
|
|
//****************** Maple devices ******************
|
|
//******************************************************
|
|
|
|
|
|
enum MapleDeviceCreationFlags
|
|
{
|
|
MDCF_None=0,
|
|
MDCF_Hotplug=1
|
|
};
|
|
|
|
struct maple_subdevice_instance;
|
|
struct maple_device_instance;
|
|
|
|
//buffer_out_len and responce need to be filled w/ proper info by the plugin
|
|
//buffer_in must not be edited (its direct pointer on ram)
|
|
//output buffer must contain the frame data , the frame header is generated by the maple routing code
|
|
//typedef u32 FASTCALL MapleSubDeviceDMAFP(void* device_instance,u32 Command,u32* buffer_in,u32 buffer_in_len,u32* buffer_out,u32& buffer_out_len);
|
|
typedef u32 MapleDeviceDMAFP(void* device_instance,u32 Command,u32* buffer_in,u32 buffer_in_len,u32* buffer_out,u32& buffer_out_len);
|
|
|
|
struct maple_subdevice_instance
|
|
{
|
|
//port
|
|
u8 port;
|
|
//user data
|
|
void* data;
|
|
//MapleDeviceDMA
|
|
MapleDeviceDMAFP* dma;
|
|
bool connected;
|
|
u32 reserved; //reserved for the emu , DO NOT EDIT
|
|
};
|
|
struct maple_device_instance
|
|
{
|
|
//port
|
|
u8 port;
|
|
//user data
|
|
void* data;
|
|
//MapleDeviceDMA
|
|
MapleDeviceDMAFP* dma;
|
|
bool connected;
|
|
|
|
maple_subdevice_instance subdevices[5];
|
|
};
|
|
|
|
|
|
//includes from CRT
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
//includes from c++rt
|
|
#include <vector>
|
|
#include <string>
|
|
using namespace std;
|
|
|
|
//used for asm-olny functions
|
|
#if defined(X86) && COMPILER_VC==BUILD_COMPILER
|
|
#define naked __declspec( naked )
|
|
#else
|
|
#define naked
|
|
#endif
|
|
|
|
|
|
#if DEBUG
|
|
//force
|
|
#define INLINE
|
|
//sugest
|
|
#define SINLINE
|
|
#else
|
|
//force
|
|
#define INLINE __forceinline
|
|
//sugest
|
|
#define SINLINE __inline
|
|
#endif
|
|
|
|
//no inline -- fixme
|
|
#if HOST_OS==OS_WINDOWS
|
|
#define NOINLINE __declspec(noinline)
|
|
#else
|
|
#define NOINLINE __attribute__ ((noinline))
|
|
#endif
|
|
|
|
#if HOST_OS==OS_WINDOWS
|
|
#define likely(x) x
|
|
#define unlikely(x) x
|
|
#else
|
|
#define likely(x) __builtin_expect((x),1)
|
|
#define unlikely(x) __builtin_expect((x),0)
|
|
#endif
|
|
|
|
//basic includes
|
|
#include "stdclass.h"
|
|
|
|
#define EMUERROR(x)( printf("Error in %s:" "%s" ":%d -> " x "\n", __FILE__,__FUNCTION__ ,__LINE__ ))
|
|
#define EMUERROR2(x,a)(printf("Error in %s:" "%s" ":%d -> " x "\n)",__FILE__,__FUNCTION__,__LINE__,a))
|
|
#define EMUERROR3(x,a,b)(printf("Error in %s:" "%s" ":%d -> " x "\n)",__FILE__,__FUNCTION__,__LINE__,a,b))
|
|
#define EMUERROR4(x,a,b,c)(printf("Error in %s:" "%s" ":%d -> " x "\n",__FILE__,__FUNCTION__,__LINE__,a,b,c))
|
|
|
|
#define EMUWARN(x)(printf( "Warning in %s:" "%s" ":%d -> " x "\n"),__FILE__,__FUNCTION__,__LINE__))
|
|
#define EMUWARN2(x,a)(printf( "Warning in %s:" "%s" ":%d -> " x "\n"),__FILE__,__FUNCTION__,__LINE__,a))
|
|
#define EMUWARN3(x,a,b)(printf( "Warning in %s:" "%s" ":%d -> " x "\n"),__FILE__,__FUNCTION__,__LINE__,a,b))
|
|
#define EMUWARN4(x,a,b,c)(printf("Warning in %s:" "%s" ":%d -> " x "\n"),__FILE__,__FUNCTION__,__LINE__,a,b,c))
|
|
|
|
|
|
#ifndef NO_MMU
|
|
#define _X_x_X_MMU_VER_STR "/mmu"
|
|
#else
|
|
#define _X_x_X_MMU_VER_STR ""
|
|
#endif
|
|
|
|
|
|
#if DC_PLATFORM==DC_PLATFORM_NORMAL
|
|
#define VER_EMUNAME "newdc"
|
|
#elif DC_PLATFORM==DC_PLATFORM_DEV_UNIT
|
|
#define VER_EMUNAME "newdc-DevKit-SET5.21"
|
|
#elif DC_PLATFORM==DC_PLATFORM_NAOMI
|
|
#define VER_EMUNAME "newdc-Naomi"
|
|
#elif DC_PLATFORM==DC_PLATFORM_ATOMISWAVE
|
|
#define VER_EMUNAME "newdc-AtomisWave"
|
|
#else
|
|
#error unknown target platform
|
|
#endif
|
|
|
|
|
|
#define VER_FULLNAME VER_EMUNAME " rel0" _X_x_X_MMU_VER_STR " (built " __DATE__ "@" __TIME__ ")"
|
|
#define VER_SHORTNAME VER_EMUNAME " rel0" _X_x_X_MMU_VER_STR
|
|
|
|
#if COMPILER_VC==BUILD_COMPILER
|
|
#define dbgbreak __debugbreak();
|
|
#pragma warning( disable : 4127 4996 /*4244*/)
|
|
#else
|
|
#define dbgbreak { (*(int*)0)=0x33; }
|
|
#define stricmp strcasecmp
|
|
#endif
|
|
|
|
//#define __fastcall <nothing useful is here "" must not happen ever>
|
|
#ifndef STRIP_TEXT
|
|
#define verify(x) if((x)==false){ msgboxf("Verify Failed : " #x "\n in %s -> %s : %d \n",MBX_ICONERROR,(__FUNCTION__),(__FILE__),__LINE__); dbgbreak;}
|
|
#define die(reason) { msgboxf("Fatal error : %s\n in %s -> %s : %d \n",MBX_ICONERROR,(reason),(__FUNCTION__),(__FILE__),__LINE__); dbgbreak;}
|
|
#else
|
|
#define verify(x) if((x)==false) { dbgbreak; }
|
|
#define die(reason) { dbgbreak; }
|
|
#endif
|
|
|
|
#define fverify verify
|
|
|
|
|
|
//will be removed sometime soon
|
|
//This shit needs to be moved to proper headers
|
|
typedef u32 RegReadFP();
|
|
typedef u32 RegReadAddrFP(u32 addr);
|
|
|
|
typedef void RegWriteFP(u32 data);
|
|
typedef void RegWriteAddrFP(u32 addr, u32 data);
|
|
|
|
/*
|
|
Read Write Const
|
|
D D N -> 0 -> RIO_DATA
|
|
D F N -> WF -> RIO_WF
|
|
F F N -> RF|WF -> RIO_FUNC
|
|
D X N -> RO|WF -> RIO_RO
|
|
F X N -> RF|WF|RO -> RIO_RO_FUNC
|
|
D X Y -> CONST|RO|WF-> RIO_CONST
|
|
X F N -> RF|WF|WO -> RIO_WO_FUNC
|
|
*/
|
|
enum RegStructFlags
|
|
{
|
|
//Basic :
|
|
REG_ACCESS_8=1,
|
|
REG_ACCESS_16=2,
|
|
REG_ACCESS_32=4,
|
|
|
|
REG_RF=8,
|
|
REG_WF=16,
|
|
REG_RO=32,
|
|
REG_WO=64,
|
|
REG_CONST=128,
|
|
REG_NO_ACCESS=REG_RO|REG_WO,
|
|
};
|
|
|
|
enum RegIO
|
|
{
|
|
RIO_DATA = 0,
|
|
RIO_WF = REG_WF,
|
|
RIO_FUNC = REG_WF | REG_RF,
|
|
RIO_RO = REG_RO | REG_WF,
|
|
RIO_RO_FUNC = REG_RO | REG_RF | REG_WF,
|
|
RIO_CONST = REG_RO | REG_WF,
|
|
RIO_WO_FUNC = REG_WF | REG_RF | REG_WO,
|
|
RIO_NO_ACCESS = REG_WF | REG_RF | REG_NO_ACCESS
|
|
};
|
|
|
|
struct RegisterStruct
|
|
{
|
|
union
|
|
{
|
|
u32 data32; //stores data of reg variable [if used] 32b
|
|
u16 data16; //stores data of reg variable [if used] 16b
|
|
u8 data8; //stores data of reg variable [if used] 8b
|
|
|
|
RegReadFP* readFunction; //stored pointer to reg read function
|
|
RegReadAddrFP* readFunctionAddr;
|
|
};
|
|
|
|
union
|
|
{
|
|
RegWriteFP* writeFunction; //stored pointer to reg write function
|
|
RegWriteAddrFP* writeFunctionAddr;
|
|
};
|
|
|
|
u32 flags; //Access flags !
|
|
};
|
|
|
|
|
|
struct settings_t
|
|
{
|
|
struct
|
|
{
|
|
bool UseMipmaps;
|
|
bool WideScreen;
|
|
} rend;
|
|
|
|
struct
|
|
{
|
|
bool Enable;
|
|
bool idleskip;
|
|
bool unstable_opt;
|
|
} dynarec;
|
|
|
|
struct
|
|
{
|
|
u32 run_counts;
|
|
} profile;
|
|
|
|
struct
|
|
{
|
|
u32 cable;
|
|
u32 RTC;
|
|
u32 region;
|
|
u32 broadcast;
|
|
} dreamcast;
|
|
|
|
struct
|
|
{
|
|
u32 HW_mixing; //(0) -> SW , 1 -> HW , 2 -> Auto
|
|
u32 BufferSize; //In samples ,*4 for bytes (1024)
|
|
u32 LimitFPS; //0 -> no , (1) -> limit
|
|
u32 GlobalFocus; //0 -> only hwnd , (1) -> Global
|
|
u32 BufferCount; //BufferCount+2 buffers used , max 60 , default 0
|
|
u32 CDDAMute;
|
|
u32 GlobalMute;
|
|
u32 DSPEnabled; //0 -> no, 1 -> yes
|
|
u32 NoBatch;
|
|
} aica;
|
|
|
|
struct
|
|
{
|
|
bool PatchRegion;
|
|
bool LoadDefaultImage;
|
|
char DefaultImage[512];
|
|
char LastImage[512];
|
|
} imgread;
|
|
|
|
struct
|
|
{
|
|
struct
|
|
{
|
|
u32 ResolutionMode;
|
|
u32 VSync;
|
|
} Video;
|
|
|
|
struct
|
|
{
|
|
u32 MultiSampleCount;
|
|
u32 MultiSampleQuality;
|
|
u32 AspectRatioMode;
|
|
} Enhancements;
|
|
|
|
struct
|
|
{
|
|
u32 PaletteMode;
|
|
u32 AlphaSortMode;
|
|
u32 ModVolMode;
|
|
u32 ZBufferMode;
|
|
u32 TexCacheMode;
|
|
} Emulation;
|
|
|
|
struct
|
|
{
|
|
u32 ShowFPS;
|
|
u32 ShowStats;
|
|
} OSD;
|
|
|
|
u32 ta_skip;
|
|
u32 subdivide_transp;
|
|
u32 rend;
|
|
} pvr;
|
|
};
|
|
|
|
extern settings_t settings;
|
|
|
|
void LoadSettings();
|
|
void SaveSettings();
|
|
u32 GetRTC_now();
|
|
extern u32 patchRB;
|
|
|
|
inline bool is_s8(u32 v) { return (s8)v==(s32)v; }
|
|
inline bool is_u8(u32 v) { return (u8)v==(s32)v; }
|
|
inline bool is_s16(u32 v) { return (s16)v==(s32)v; }
|
|
inline bool is_u16(u32 v) { return (u16)v==(u32)v; }
|
|
|
|
#define verifyc(x) verify(!FAILED(x))
|
|
|
|
static inline void do_nada(...) { }
|
|
|
|
#ifdef _ANDROID
|
|
#include <android/log.h>
|
|
|
|
#ifdef printf
|
|
#undef printf
|
|
#endif
|
|
|
|
#ifdef puts
|
|
#undef puts
|
|
#endif
|
|
|
|
#define LOG_TAG "newdc"
|
|
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
|
|
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
|
|
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
|
|
#ifdef STRIP_TEXT
|
|
#define puts do_nada
|
|
#define printf do_nada
|
|
#else
|
|
#define puts LOGI
|
|
#define printf LOGI
|
|
#endif
|
|
#define putinf LOGI
|
|
#endif
|
|
|
|
|
|
|
|
#include "hw/sh4/sh4_if.h"
|
|
|
|
//more to come
|
|
|
|
extern sh4_if sh4_cpu;
|
|
|
|
//sh4 thread
|
|
s32 plugins_Init();
|
|
void plugins_Term();
|
|
void plugins_Reset(bool Manual);
|
|
|
|
//PVR
|
|
s32 libPvr_Init();
|
|
void libPvr_Reset(bool Manual);
|
|
void libPvr_Term();
|
|
|
|
|
|
//void DYNACALL libPvr_TaSQ(u32* data); //size is 32 byte transfer counts
|
|
u32 libPvr_ReadReg(u32 addr,u32 size);
|
|
void libPvr_WriteReg(u32 addr,u32 data,u32 size);
|
|
|
|
void libPvr_LockedBlockWrite(vram_block* block,u32 addr); //set to 0 if not used
|
|
|
|
void* libPvr_GetRenderTarget();
|
|
void* libPvr_GetRenderSurface();
|
|
|
|
//AICA
|
|
s32 libAICA_Init();
|
|
void libAICA_Reset(bool Manual);
|
|
void libAICA_Term();
|
|
|
|
|
|
u32 libAICA_ReadReg(u32 addr,u32 size);
|
|
void libAICA_WriteReg(u32 addr,u32 data,u32 size);
|
|
|
|
u32 libAICA_ReadMem_aica_ram(u32 addr,u32 size);
|
|
void libAICA_WriteMem_aica_ram(u32 addr,u32 data,u32 size);
|
|
void libAICA_Update(u32 cycles); //called every ~1800 cycles, set to 0 if not used
|
|
|
|
|
|
//GDR
|
|
s32 libGDR_Init();
|
|
void libGDR_Reset(bool M);
|
|
void libGDR_Term();
|
|
|
|
void libCore_gdrom_disc_change();
|
|
|
|
//IO
|
|
void libGDR_ReadSector(u8 * buff,u32 StartSector,u32 SectorCount,u32 secsz);
|
|
void libGDR_ReadSubChannel(u8 * buff, u32 format, u32 len);
|
|
void libGDR_GetToc(u32* toc,u32 area);
|
|
u32 libGDR_GetDiscType();
|
|
void libGDR_GetSessionInfo(u8* pout,u8 session);
|
|
|
|
|
|
//ExtDev
|
|
s32 libExtDevice_Init();
|
|
void libExtDevice_Reset(bool M);
|
|
void libExtDevice_Term();
|
|
|
|
static u32 libExtDevice_ReadMem_A0_006(u32 addr,u32 size) { return 0; }
|
|
static void libExtDevice_WriteMem_A0_006(u32 addr,u32 data,u32 size) { }
|
|
|
|
//Area 0 , 0x01000000- 0x01FFFFFF [Ext. Device]
|
|
static u32 libExtDevice_ReadMem_A0_010(u32 addr,u32 size) { return 0; }
|
|
static void libExtDevice_WriteMem_A0_010(u32 addr,u32 data,u32 size) { }
|
|
|
|
//Area 5
|
|
static u32 libExtDevice_ReadMem_A5(u32 addr,u32 size){ return 0; }
|
|
static void libExtDevice_WriteMem_A5(u32 addr,u32 data,u32 size) { }
|
|
|
|
//ARM
|
|
s32 libARM_Init();
|
|
void libARM_Reset(bool M);
|
|
void libARM_Term();
|
|
|
|
void libARM_SetResetState(u32 State);
|
|
void libARM_Update(u32 cycles);
|
|
|
|
|
|
#define ReadMemArrRet(arr,addr,sz) \
|
|
{if (sz==1) \
|
|
return arr[addr]; \
|
|
else if (sz==2) \
|
|
return *(u16*)&arr[addr]; \
|
|
else if (sz==4) \
|
|
return *(u32*)&arr[addr];}
|
|
|
|
#define WriteMemArr(arr,addr,data,sz) \
|
|
{if(sz==1) \
|
|
{arr[addr]=(u8)data;} \
|
|
else if (sz==2) \
|
|
{*(u16*)&arr[addr]=(u16)data;} \
|
|
else if (sz==4) \
|
|
{*(u32*)&arr[addr]=data;}}
|
|
|
|
#define WriteMemArrRet(arr,addr,data,sz) \
|
|
{if(sz==1) \
|
|
{arr[addr]=(u8)data;return;} \
|
|
else if (sz==2) \
|
|
{*(u16*)&arr[addr]=(u16)data;return;} \
|
|
else if (sz==4) \
|
|
{*(u32*)&arr[addr]=data;return;}}
|
|
|
|
struct OnLoad
|
|
{
|
|
typedef void OnLoadFP();
|
|
OnLoad(OnLoadFP* fp) { fp(); }
|
|
};
|