Merge pull request #481 from roeming/master

Lots of progress on NES Core
This commit is contained in:
Cuyler36
2025-05-30 09:23:57 -04:00
committed by GitHub
6 changed files with 7605 additions and 41 deletions
+109 -39
View File
@@ -2,6 +2,7 @@
#define KS_NES_COMMON_H
#include "types.h"
#include "dolphin/os/OSTime.h"
#ifdef __cplusplus
extern "C" {
@@ -16,7 +17,7 @@ extern "C" {
#define KS_NES_CHRROM_SIZE 0x40000 // 256kb for MMC3
#define KS_NES_CHRRAM_SIZE 0x2000 // 8kb
#define KS_NES_BBRAM_SIZE 0x8000 // 32kb, battery backed-up ram
#define KS_NES_BBRAM_SIZE 0x8000 // 32kb, battery backed-up ram
#define KS_NES_NOISE_DATA_SIZE 0x7F000
#define KS_NES_DRAW_RESULT_BUF_SIZE 0x1C800
@@ -28,50 +29,119 @@ extern "C" {
#define KS_NES_TO_KB(b) ((f32)b * (1.0f / (f32)KS_NES_BYTES_PER_KB))
typedef struct ksNesCommonWorkPriv {
/* 0x0000 */ u8 wram[KS_NES_WRAM_SIZE];
/* 0x0800 */ u8 _0800[0x0B40 - 0x0800];
/* 0x0B40 */ u8 _0B40[1]; // TODO: figure out what this is and its size
/* 0x0B41 */ u8 _0B41[0x2A40 - 0x0B41];
/* 0x2A40 */ u8 _2A40[0x800];
/* 0x3240 */ u8 _3240[0x8F18 - 0x3240];
/* 0x0000 */ u8 wram[KS_NES_WRAM_SIZE];
/* 0x0800 */ u8 _0800[0x340];
/* 0x0B40 */ u8* _0B40[0x7c0];
/* 0x2A40 */ u8 _2A40[0x800];
/* 0x3240 */ u8 _3240[0x5c00];
/* 0x8E40 */ u8 _8E40[0x80];
/* 0x8EC0 */ u8 _8EC0[0x58];
} ksNesCommonWorkPriv;
typedef struct ksNesCommonWorkObj {
/* 0x0000 */ u8* nesromp;
/* 0x0004 */ u8* noise_bufp;
/* 0x0008 */ size_t chr_to_i8_buf_size;
/* 0x000C */ u8* chr_to_u8_bufp;
/* 0x0010 */ u8* result_bufp;
/* 0x0014 */ int _0014;
/* 0x0018 */ int _0018;
/* 0x001C */ u8 frames;
/* 0x001D */ u8 _001D;
/* 0x001E */ u8 _001E;
/* 0x001F */ u8 _001F;
/* 0x0020 */ u32 pads[4];
/* 0x0030 */ u32 _0030;
/* 0x0034 */ u32 _0034;
/* 0x0038 */ u32 _0038;
/* 0x003C */ u8 _003C[0x0048 - 0x003C];
/* 0x0048 */ size_t prg_size;
/* 0x004C */ u8 _004C[0x0060 - 0x004C];
/* 0x0060 */ ksNesCommonWorkPriv work_priv;
/* 0x0000 */ u8* nesromp;
/* 0x0004 */ u8* noise_bufp;
/* 0x0008 */ size_t chr_to_i8_buf_size;
/* 0x000C */ u8* chr_to_u8_bufp;
/* 0x0010 */ u8* result_bufp;
/* 0x0014 */ int _0014;
/* 0x0018 */ int _0018;
/* 0x001C */ u8 frames;
/* 0x001D */ u8 _001D;
/* 0x001E */ u8 _001E;
/* 0x001F */ u8 _001F;
/* 0x0020 */ u32 pads[4];
/* 0x0030 */ u32 _0030;
/* 0x0034 */ u32 _0034;
/* 0x0038 */ u32 _0038;
/* 0x003C */ u8 _003C[0x0048 - 0x003C];
/* 0x0048 */ size_t prg_size;
/* 0x004C */ u8 _004C[0x0060 - 0x004C];
/* 0x0060 */ ksNesCommonWorkPriv work_priv;
} ksNesCommonWorkObj;
typedef struct ksNesStateObj {
/* 0x0000 */ u8 wram[KS_NES_WRAM_SIZE];
/* 0x0800 */ u8 _0800[0x16B4 - 0x0800];
/* 0x16B4 */ u32 _16B4;
/* 0x16BC */ u8 _16B8[0x176D - 0x16B8];
/* 0x176D */ u8 disk_motor;
/* 0x176E */ u8 _176E[0x17FC - 0x176E];
/* 0x17FC */ u8 _17FC[8];
/* 0x1804 */ u8 _1804[0x1844 - 0x1804];
/* 0x1844 */ u16 PC;
/* 0x1846 */ u8 _1846[0x1860 - 0x1846];
/* 0x1860 */ size_t prg_size;
/* 0x1864 */ size_t chr_size;
/* 0x1868 */ u8 _1868[0x1A78 - 0x1868];
/* 0x0000 */ u8 wram[KS_NES_WRAM_SIZE];
/* 0x0800 */ u8 _0800[0x800];
/* 0x0800 */ u8 _1000[0x520];
// these are all function pointers.
// leaving these as void pointers until we figure out the function signature.
/* 0x1520 */ void* store_ppu_func[8]; // ksNesStorePPUFuncTblDefault
/* 0x1540 */ void* store_io_func[0x28]; // ksNesStoreIOFuncTblDefault
/* 0x15E0 */ void* store_func[8]; // ksNesStoreFuncTblDefault
/* 0x1600 */ void* load_func[8]; // ksNesLoadFuncTblDefault
/* 0x1620 */ void* load_io_func[0x18]; // ksNesLoadIOFuncTblDefault
/* 0x1680 */ u8* cpu_0000_1fff; // work RAM and its mirrors
/* 0x1684 */ u8* cpu_2000_3fff; // PPU registers and their mirrors
/* 0x1688 */ u8* cpu_4000_5fff; // APU registers, I/O registers, and usually unmapped cartridge addresses
/* 0x168C */ u8* cpu_6000_7fff; // usually battery backed cartridge RAM
/* 0x1690 */ u8* cpu_8000_9fff; // usually cartridge ROM and mapper registers
/* 0x1694 */ u8* cpu_a000_bfff; // usually cartridge ROM and mapper registers
/* 0x1698 */ u8* cpu_c000_dfff; // usually cartridge ROM and mapper registers
/* 0x169C */ u8* cpu_e000_ffff; // usually cartridge ROM and mapper registers
/* 0x16A0 */ u8 _16A0[8];
/* 0x16A8 */ u8 _16A8[8];
/* 0x16B0 */ u8 _16B0;
/* 0x16B1 */ u8 _16B1;
/* 0x16B2 */ u8 _16B2;
/* 0x16B3 */ u8 _16B3;
/* 0x16B4 */ u32 _16B4;
/* 0x16B8 */ u8 _16B8[8];
/* 0x16C0 */ u32 _16C0;
/* 0x16C4 */ u8 _16C4[8];
/* 0x16CC */ u8 _16CC[0x80];
/* 0x174C */ u8 _174C[0x18];
/* 0x1764 */ u8 mapper;
/* 0x1765 */ u8 prg_banks; // init to number of 8k PRG banks - 1. might indicate currently selected bank
/* 0x1766 */ u16 chr_banks; // init to number of 1k CHR banks - 1. might indicate currently selected bank
/* 0x1768 */ u8 _1768[5];
/* 0x176D */ u8 disk_motor;
/* 0x176E */ u8 _176E[0x40]; // MMC5 registers?
/* 0x17AE */ u16 _17AE; // APU frame counter LFSR?
/* 0x17B0 */ u8 _17B0[0x40]; // TODO not an array
/* 0x17F0 */ u8* prgromp; // pointer to the start of PRG ROM?
/* 0x17F4 */ u8* chrramp; // pointer to the end of PRG ROM?
/* 0x17F8 */ u8* bbramp; // pointer to battery backed RAM?
/* 0x17FC */ u8 _17FC[8];
/* 0x1804 */ u8 _1804[0xC];
/* 0x1810 */ u8* _1810[4];
/* 0x1820 */ s16 _1820; // this appears to be a u16
/* 0x1822 */ s16 _1822;
/* 0x1824 */ s16 _1824;
/* 0x1826 */ s16 _1826;
/* 0x1828 */ u16 _1828; // APU frame counter LFSR?
/* 0x182A */ u16 _182A;
/* 0x182C */ u8 _182C;
/* 0x182C */ u8 _182D;
/* 0x182E */ u8 _182E;
/* 0x182F */ u8 _182F;
/* 0x1830 */ u8 _1830;
/* 0x1831 */ u8 _1831;
/* 0x1832 */ u16 _1832;
/* 0x1834 */ u8 _1834;
/* 0x1835 */ u8 _1835;
/* 0x1836 */ u16 _1836;
/* 0x1838 */ u16 _1838;
/* 0x183A */ u16 _183A;
/* 0x183C */ u16 _183C;
/* 0x183E */ u16 _183E;
/* 0x1840 */ void* _1840; // some sort of function pointer with the same signature as ksNesStoreFuncXxxTblDefault
/* 0x1844 */ u16 PC;
// /* 0x1846 */ u8 A; //
// /* 0x1847 */ u8 X; // ?
// /* 0x1848 */ u8 Y; // ?
/* 0x1846 */ u8 _1846[0x12];
/* 0x1858 */ u32 reset_flags; // this should probably be defined as an enum.
/* 0x185C */ u32 frame_flags; // this should probably be defined as an enum.
/* 0x1860 */ size_t prg_size; // PRG size in bytes
/* 0x1864 */ size_t chr_size; // CHR size in bytes
/* 0x1868 */ u8* nesromp;
/* 0x186C */ u8* _186C[0x18]; // this holds pointers to ksNesStateObj._0800
/* 0x18CC */ u8 _18CC[0x1C];
/* 0x18E8 */ u8 palette_normal[0x80]; // ksNesPaletteNormal
/* 0x1968 */ u8 _1968[0x108];
/* 0x1A70 */ u32 _1A70;
/* 0x1A74 */ OSTick os_tick;
} ksNesStateObj;
#ifdef __cplusplus
+266 -1
View File
@@ -4,8 +4,273 @@
#include "types.h"
#include "Famicom/ks_nes_common.h"
extern void ksNesDrawMakeOBJIndTex(ksNesCommonWorkObj* wp);
extern void ksNesDrawMakeOBJIndTexMMC5(ksNesCommonWorkObj* wp);
extern void ksNesConvertChrToI8(ksNesCommonWorkObj* wp, const unsigned char* foo, unsigned long bar);
extern void ksNesConvertChrToI8MMC5(ksNesCommonWorkObj* wp, const unsigned char* foo, unsigned long bar);
extern void ksNesQDSoundSync();
extern void ksNesQDFastLoad(ksNesCommonWorkObj* wp, ksNesStateObj* sp);
extern void ksNesQDFastSave(ksNesCommonWorkObj* wp, ksNesStateObj* sp);
extern void ksNesPushResetButton(ksNesStateObj* sp);
extern int ksNesReset(ksNesCommonWorkObj* wp, ksNesStateObj* sp, u32 flags, u8* chrramp, u8* bbramp);
extern void ksNesEmuFrame(ksNesCommonWorkObj* wp, ksNesStateObj* sp, u32 flags);
extern void ksNesPushResetButton(ksNesStateObj* sp);
extern u32 ksNesResetAsm(ksNesCommonWorkObj* wp, ksNesStateObj* sp);
extern void ksNesInit01();
extern void ksNesInit03();
extern void ksNesInit04();
extern void ksNesInit05();
extern void ksNesInit07();
extern void ksNesInit09();
extern void ksNesInit12();
extern void ksNesInit13();
extern void ksNesInit15();
extern void ksNesInit18();
extern void ksNesInit1a();
extern void ksNesInit42();
extern void ksNesInit43();
extern void ksNesInit45();
extern void ksNesInit49();
extern void ksNesInit56();
extern void ksNesEmuFrameAsm(ksNesCommonWorkObj* wp, ksNesStateObj* sp);
extern void ksNesLinecntIrqDefault();
extern void ksNesMainLoop2();
extern void ksNesInst_load16_imm();
extern void ksNesInst_load8_abs();
extern void ksNesInst_load8_absx();
extern void ksNesInst_load8_absy();
extern void ksNesInst_load8_zerop();
extern void ksNesInst_load8_dx();
extern void ksNesInst_load8_dxi();
extern void ksNesInst_load8_dyi();
extern void ksNesInst_lda_a1();
extern void ksNesInst_ldx_b6();
extern void ksNesInst_ldx_a2();
extern void ksNesInst_ldy_a0();
extern void ksNesInst_sta_85();
extern void ksNesInst_stx_86();
extern void ksNesInst_sty_84();
extern void ksNesInst_sta_95();
extern void ksNesInst_stx_96();
extern void ksNesInst_sty_94();
extern void ksNesInst_sta_8d();
extern void ksNesInst_stx_8e();
extern void ksNesInst_sty_8c();
extern void ksNesInst_sta_9d();
extern void ksNesInst_sta_99();
extern void ksNesInst_sta_81();
extern void ksNesInst_sta_91();
extern void ksNesInst_clc_18();
extern void ksNesInst_sec_38();
extern void ksNesInst_dex_ca();
extern void ksNesInst_inx_e8();
extern void ksNesInst_dey_88();
extern void ksNesInst_iny_c8();
extern void ksNesInst_txa_8a();
extern void ksNesInst_tya_98();
extern void ksNesInst_tax_aa();
extern void ksNesInst_tay_a8();
extern void ksNesInst_cmp_c1();
extern void ksNesInst_cpx_e0();
extern void ksNesInst_cpy_c0();
extern void ksNesInst_adc_61();
extern void ksNesInst_sbc_e1();
extern void ksNesInst_ora_01();
extern void ksNesInst_and_21();
extern void ksNesInst_bit_24();
extern void ksNesInst_eor_41();
extern void ksNesInst_inc_e6();
extern void ksNesInst_dec_c6();
extern void ksNesInst_asl_0a();
extern void ksNesInst_asl_06();
extern void ksNesInst_lsr_4a();
extern void ksNesInst_lsr_46();
extern void ksNesInst_rol_2a();
extern void ksNesInst_rol_26();
extern void ksNesInst_ror_6a();
extern void ksNesInst_ror_66();
extern void ksNesInst_bpl_10();
extern void ksNesInst_bmi_30();
extern void ksNesInst_bvc_50();
extern void ksNesInst_bvs_70();
extern void ksNesInst_bcc_90();
extern void ksNesInst_bcs_b0();
extern void ksNesInst_bne_d0();
extern void ksNesInst_beq_f0();
extern void ksNesInst_jsr_20();
extern void ksNesPush16_a1();
extern void ksNesInst_pha_48();
extern void ksNesInst_pla_68();
extern void ksNesInst_rts_60();
extern void ksNesPopPC();
extern void ksNesInst_jmp_4c();
extern void ksNesInst_jmp_6c();
extern void ksNesInst_brk_00();
extern void ksNesActivateIntrIRQ();
extern void ksNesActivateIntr();
extern void ksNesInst_php_08();
extern void ksNesInst_plp_28();
extern void ksNesInst_rti_40();
extern void ksNesInst_rti_40_2();
extern void ksNesInst_cli_58();
extern void ksNesInst_sei_78();
extern void ksNesInst_txs_9a();
extern void ksNesInst_tsx_ba();
extern void ksNesInst_cld_d8();
extern void ksNesInst_sed_f8();
extern void ksNesInst_clv_b8();
extern void ksNesLoadInvalid();
extern void ksNesLoadIgnore();
extern void ksNesLoadWRAM();
extern void ksNesLoadBBRAM();
extern void ksNesLoadPPU();
extern void ksNesLoadIO();
extern void ksNesLoad4015();
extern void ksNesLoad4017();
extern void ksNesLoad4016();
extern void ksNesStoreWRAM();
extern void ksNesStoreBBRAM();
extern void ksNesStoreInvalid();
extern void ksNesStorePPU();
extern void ksNesStore2000();
extern void ksNesStorePPURam();
extern void ksNesStore2004();
extern void ksNesStore2005();
extern void ksNesStore2006();
extern void ksNesStore2007ChrRom();
extern void ksNesStoreIO();
extern void ksNesStoreQDSound();
extern void ksNesStore4017();
extern void ksNesStore4011();
extern void ksNesStore4015();
extern void ksNesStore4003();
extern void ksNesStore4000();
extern void ksNesStore4014();
extern void ksNesStore4016();
extern void ksNesInst_wdm_42();
extern void ksNesLinecntIrqQD();
extern void ksNesStoreQD_4020();
extern void ksNesStoreQD_4022();
extern void ksNesStoreQD_4023();
extern void ksNesStoreQD_4024();
extern void ksNesStoreQD_4025();
extern void ksNesStoreQD_4026();
extern void ksNesStore01_8000();
extern void ksNesStore02_8000();
extern void ksNesStore03_6000();
extern void ksNesLinecntIrq04();
extern void ksNesStore04_8000();
extern void ksNesStore04_a000();
extern void ksNesStore04_c000();
extern void ksNesStore04_e000();
extern void ksNesLinecntIrq05Timer();
extern void ksNesLinecntIrq05Vcount();
extern void ksNesStore05_4000();
extern void ksNesStore05_5130();
extern void ksNesStore05_5100();
extern void ksNesStore05_5113();
extern void ksNesStore05_5101();
extern void ksNesStore05_5120();
extern void ksNesStore05_5128();
extern void ksNesStore05_5102();
extern void ksNesStore05_5104();
extern void ksNesStore05_5105();
extern void ksNesStore05_5106();
extern void ksNesLoad05_4000();
extern void ksNesStore07_8000();
extern void ksNesStore09_8000();
extern void ksNesStore09_a000();
extern void ksNesStore09_c000();
extern void ksNesStore09_e000();
extern void ksNesStore0a_8000();
extern void ksNesStore0a_a000();
extern void ksNesLinecntIrq49();
extern void ksNesStore12_8000();
extern void ksNesStore12_a000();
extern void ksNesStore12_e000();
extern void ksNesStore13_4000();
extern void ksNesLoad13_4000();
extern void ksNesStore13_8000();
extern void ksNesStore13_c000();
extern void ksNesStore13_e000();
extern void ksNesStore16_8000();
extern void ksNesStore16_9000();
extern void ksNesStore16_a000();
extern void ksNesStore16_b000();
extern void ksNesStore17_a000();
extern void ksNesStore17_b000();
extern void ksNesStore17_e000();
extern void ksNesLinecntIrq18();
extern void ksNesStore18_8000();
extern void ksNesStore18_a000();
extern void ksNesStore18_c000();
extern void ksNesStore18_e000();
extern void ksNesLinecntIrq19();
extern void ksNesStore19_8000();
extern void ksNesStore19_a000();
extern void ksNesStore19_b000();
extern void ksNesStore19_e000();
extern void ksNesStore42_8000();
extern void ksNesLinecntIrq43();
extern void ksNesStore43_c000();
extern void ksNesStore44_8000();
extern void ksNesStore44_c000();
extern void ksNesStore44_e000();
extern void ksNesStore45_8000();
extern void ksNesStore45_a000();
extern void ksNesStore46_8000();
extern void ksNesStore49_a000();
extern void ksNesStore49_c000();
extern void ksNesStore4b_8000();
extern void ksNesStore4b_a000();
extern void ksNesStore4b_e000();
extern void ksNesStore56_6000();
extern void ksNesStore57_6000();
extern void ksNesStore59_c000();
extern void ksNesStore5d_6000();
extern void ksNesStoreb8_6000();
// set:
// keep ksNesStateObj->wram state
// unset:
// init ksNesStateObj->wram with a pattern
#define KS_NES_FLAG_KEEP_WRAM_STATE = (1 << 0) // 0x00000001
// set:
// chr ram unchanged?
// unset:
// clear chr ram
#define KS_NES_FLAG_NO_INIT_CHR_RAM = (1 << 1) // 0x00000002
// set:
// sp->chr_size = 0x20000
// unset:
// chr size unchanged?
// #define KS_NES_FLAG_??? = (1 << 3) // 0x00000008
// something about CHR RAM and BB RAM initialization.
// #define KS_NES_FLAG_??? = (1 << 4) // 0x00000010
// set:
// don't initialize ksNesStateObj->palette_normal
// unset:
// init ksNesStateObj->palette_normal with ksNesPaletteNormal
#define KS_NES_FLAG_NO_INIT_PALETTE = (1 << 5) // 0x00000020
// set:
// skip some sound initializing stuff
// unset:
// init sound stuff
#define KS_NES_FLAG_NO_INIT_SOUND = (1 << 6) // 0x00000040
// unknown
// #define KS_NES_FLAG_??? = (1 << 10) // 0x00000400
// something to do with sound every frame
// #define KS_NES_FLAG_??? = (1 << 12) // 0x00001000
// unknown
// #define KS_NES_FLAG_??? = (1 << 14) // 0x00004000
#endif
+2
View File
@@ -8,4 +8,6 @@ extern void ksNesDrawInit(ksNesCommonWorkObj* wp);
extern void ksNesDraw(ksNesCommonWorkObj* wp, ksNesStateObj* sp);
extern void ksNesDrawEnd();
extern u8 ksNesPaletteNormal[];
#endif
+1 -1
View File
@@ -12,7 +12,7 @@ extern void EmuSound_Exit();
extern void Sound_Write(u16 event, u8 value, u16 maybe_frames);
extern void Sound_Reset();
extern u8 Sound_Read(u16 param_1, u32 param_2, u32 param_3, u32 param_4, u32 param_5);
extern u8 Sound_Read(u16 reg_addr);
extern void Sound_SetC000(u8* romTop);
extern void Sound_SetE000(u8* romTop);
extern void Sound_SetMMC(u8 mmcMode);
File diff suppressed because it is too large Load Diff
+12
View File
@@ -0,0 +1,12 @@
#include "Famicom/ks_nes_draw.h"
u8 ksNesPaletteNormal[] = {
0xc2, 0x10, 0x80, 0x17, 0x98, 0x17, 0xc0, 0x14, 0xdc, 0x0d, 0xd8, 0x03, 0xd8, 0x00, 0xc8, 0x80, 0xbc, 0xa0, 0x80,
0xe0, 0x81, 0x21, 0x80, 0xe4, 0x80, 0xac, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xe7, 0x39, 0x81, 0x7f, 0xa0, 0xff,
0xd8, 0xd9, 0xfc, 0xd5, 0xfc, 0xcb, 0xfc, 0xc3, 0xe9, 0x20, 0xe1, 0x80, 0x9d, 0xe0, 0x8e, 0x02, 0x82, 0x4c, 0x82,
0x18, 0x88, 0x42, 0x80, 0x00, 0x80, 0x00, 0xff, 0xff, 0x82, 0x5f, 0xb6, 0x1f, 0xe9, 0xbf, 0xfd, 0xd9, 0xfd, 0xb3,
0xfd, 0xeb, 0xfe, 0x4b, 0xfe, 0x86, 0xd2, 0xe0, 0xab, 0x6d, 0xa7, 0x55, 0x83, 0x7f, 0xb1, 0x8c, 0x80, 0x00, 0x80,
0x00, 0xff, 0xff, 0xc2, 0xff, 0xde, 0xff, 0xea, 0xff, 0xfe, 0xfd, 0xfe, 0xf9, 0xff, 0x16, 0xff, 0x35, 0xff, 0x74,
0xe7, 0x93, 0xd7, 0xb6, 0xd7, 0xdd, 0xdb, 0xbf, 0xef, 0x7b, 0x80, 0x00, 0x80, 0x00,
};