From d274a3b3fa0d3b55bf85425aa8a94c2b3b23bac1 Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Sat, 22 Sep 2012 15:25:56 +0000 Subject: [PATCH] (MESS) nes.c: moved cart class where it actually belongs. no whatsnew. eventually, nes_mmc and its pieces (nes_pcb, nes_ines & nes_unif) will contain a cart slot device and allow for things like on-cart sound chips and eeprom devices to be properly emulated --- .gitattributes | 2 +- src/mess/drivers/nes.c | 2 +- src/mess/includes/nes.h | 443 +--------------------------- src/mess/includes/nes_mmc.h | 564 ++++++++++++++++++++++++++++++++++++ src/mess/machine/nes.c | 2 +- src/mess/machine/nes_mmc.c | 2 +- src/mess/machine/nes_mmc.h | 132 --------- src/mess/video/nes.c | 2 +- 8 files changed, 572 insertions(+), 577 deletions(-) create mode 100644 src/mess/includes/nes_mmc.h delete mode 100644 src/mess/machine/nes_mmc.h diff --git a/.gitattributes b/.gitattributes index 7ec24f9c76c..99b4333612b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6144,6 +6144,7 @@ src/mess/includes/mz80.h svneol=native#text/plain src/mess/includes/nascom1.h svneol=native#text/plain src/mess/includes/nc.h svneol=native#text/plain src/mess/includes/nes.h svneol=native#text/plain +src/mess/includes/nes_mmc.h svneol=native#text/plain src/mess/includes/newbrain.h svneol=native#text/plain src/mess/includes/next.h svneol=native#text/plain src/mess/includes/ob68k1a.h svneol=native#text/plain @@ -6901,7 +6902,6 @@ src/mess/machine/ne2000.h svneol=native#text/plain src/mess/machine/nes.c svneol=native#text/plain src/mess/machine/nes_ines.c svneol=native#text/plain src/mess/machine/nes_mmc.c svneol=native#text/plain -src/mess/machine/nes_mmc.h svneol=native#text/plain src/mess/machine/nes_pcb.c svneol=native#text/plain src/mess/machine/nes_unif.c svneol=native#text/plain src/mess/machine/nextkbd.c svneol=native#text/plain diff --git a/src/mess/drivers/nes.c b/src/mess/drivers/nes.c index 1dcc1174468..faf67ca1a21 100644 --- a/src/mess/drivers/nes.c +++ b/src/mess/drivers/nes.c @@ -12,8 +12,8 @@ #include "emu.h" #include "video/ppu2c0x.h" -#include "machine/nes_mmc.h" #include "includes/nes.h" +//#include "includes/nes_mmc.h" #include "cpu/m6502/m6502.h" #include "imagedev/cartslot.h" #include "sound/nes_apu.h" diff --git a/src/mess/includes/nes.h b/src/mess/includes/nes.h index b2b598b1cec..c26ff3b3e59 100644 --- a/src/mess/includes/nes.h +++ b/src/mess/includes/nes.h @@ -9,6 +9,8 @@ #ifndef NES_H_ #define NES_H_ +#include "includes/nes_mmc.h" + /*************************************************************************** CONSTANTS @@ -35,12 +37,6 @@ struct nes_input #define CHRROM 0 #define CHRRAM 1 -struct chr_bank -{ - int source; //defines source of base pointer - int origin; //defines offset of 0x400 byte segment at base pointer - UINT8* access; //source translated + origin -> valid pointer! -}; /*PPU nametable fast banking constants and structures */ @@ -53,419 +49,6 @@ struct chr_bank #define NES_BATTERY 0 #define NES_WRAM 1 -struct name_table -{ - int source; /* defines source of base pointer */ - int origin; /* defines offset of 0x400 byte segment at base pointer */ - int writable; /* ExRAM, at least, can be write-protected AND used as nametable */ - UINT8* access; /* direct access when possible */ -}; - -typedef void (*nes_prg_callback)(running_machine &machine, int start, int bank); -typedef void (*nes_chr_callback)(running_machine &machine, int start, int bank, int source); - -class nes_carts_state : public driver_device -{ -public: - nes_carts_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } - - int m_prg_bank[5]; - chr_bank m_chr_map[8]; //quick banking structure, because some of this changes multiple times per scanline! - name_table m_nt_page[4]; //quick banking structure for a maximum of 4K of RAM/ROM/ExRAM - - nes_prg_callback m_mmc3_prg_cb; // these are used to simplify a lot emulation of some MMC3 pirate clones - nes_chr_callback m_mmc3_chr_cb; - - int m_chr_open_bus; - int m_prgram_bank5_start, m_battery_bank5_start, m_empty_bank5_start; - - UINT8 m_ce_mask, m_ce_state; - UINT8 m_vrc_ls_prg_a, m_vrc_ls_prg_b, m_vrc_ls_chr; - - int m_MMC5_floodtile; - int m_MMC5_floodattr; - int m_mmc5_vram_control; - UINT8 m_mmc5_high_chr; - UINT8 m_mmc5_split_scr; - UINT8 *m_extended_ntram; - - UINT8 m_mmc5_last_chr_a; - UINT16 m_mmc5_vrom_regA[8]; - UINT16 m_mmc5_vrom_regB[4]; - UINT8 m_mmc5_prg_regs[4]; - UINT8 m_mmc5_bank_security; - UINT8 m_mmc5_prg_mode; - UINT8 m_mmc5_chr_mode; - UINT8 m_mmc5_chr_high; - UINT8 m_mmc5_split_ctrl; - UINT8 m_mmc5_split_yst; - UINT8 m_mmc5_split_bank; - - /***** Mapper-related variables *****/ - - // common ones - int m_IRQ_enable, m_IRQ_enable_latch; - UINT16 m_IRQ_count, m_IRQ_count_latch; - UINT8 m_IRQ_toggle; - UINT8 m_IRQ_reset; - UINT8 m_IRQ_status; - UINT8 m_IRQ_mode; - UINT8 m_IRQ_clear; - int m_mult1, m_mult2; - - UINT8 m_mmc_chr_source; // This is set at init to CHRROM or CHRRAM. a few mappers can swap between - // the two (this is done in the specific handlers). - - UINT8 m_mmc_cmd1, m_mmc_cmd2; // These represent registers where the mapper writes important values - UINT8 m_mmc_count; // This is used as counter in mappers like 1 and 45 - - int m_mmc_prg_base, m_mmc_prg_mask; // MMC3 based multigame carts select a block of banks by using these (and then act like normal MMC3), - int m_mmc_chr_base, m_mmc_chr_mask; // while MMC3 and clones (mapper 118 & 119) simply set them as 0 and 0xff resp. - - UINT8 m_mmc_prg_bank[6]; // Many mappers writes only some bits of the selected bank (for both PRG and CHR), - UINT8 m_mmc_vrom_bank[16]; // hence these are handy to latch bank values. - - UINT16 m_MMC5_vrom_bank[12]; // MMC5 has 10bit wide VROM regs! - UINT8 m_mmc_extra_bank[16]; // some MMC3 clone have 2 series of PRG/CHR banks... - // we collect them all here: first 4 elements PRG banks, then 6/8 CHR banks - - UINT8 m_mmc_latch1, m_mmc_latch2; - UINT8 m_mmc_reg[16]; - - UINT8 m_mmc_dipsetting; - - // misc mapper related variables which should be merged with the above one, where possible - int m_mmc1_reg_write_enable; - int m_mmc1_latch; - int m_mmc1_count; - - int m_mmc3_latch; - int m_mmc3_wram_protect; - int m_mmc3_alt_irq; - - int m_MMC5_rom_bank_mode; - int m_MMC5_vrom_bank_mode; - int m_MMC5_vram_protect; - int m_MMC5_scanline; - int m_vrom_page_a; - int m_vrom_page_b; - // int vrom_next[4]; - - UINT8 m_mmc6_reg; - - // these might be unified in single mmc_reg[] array, together with state->m_mmc_cmd1 & state->m_mmc_cmd2 - // but be careful that MMC3 clones often use state->m_mmc_cmd1/state->m_mmc_cmd2 (from base MMC3) AND additional regs below! - UINT8 m_mapper83_reg[10]; - UINT8 m_mapper83_low_reg[4]; - UINT8 m_txc_reg[4]; // used by mappers 132, 172 & 173 - UINT8 m_subor_reg[4]; // used by mappers 166 & 167 - UINT8 m_sachen_reg[8]; // used by mappers 137, 138, 139 & 141 - UINT8 m_map52_reg_written; - UINT8 m_map114_reg, m_map114_reg_enabled; - - // i/o handlers - DECLARE_WRITE8_MEMBER(mapper6_l_w); - DECLARE_WRITE8_MEMBER(mapper6_w); - DECLARE_WRITE8_MEMBER(mapper8_w); - DECLARE_WRITE8_MEMBER(mapper17_l_w); - DECLARE_WRITE8_MEMBER(uxrom_w); - DECLARE_WRITE8_MEMBER(uxrom_cc_w); - DECLARE_WRITE8_MEMBER(un1rom_w); - DECLARE_WRITE8_MEMBER(cnrom_w); - DECLARE_WRITE8_MEMBER(bandai_pt554_m_w); - DECLARE_WRITE8_MEMBER(cprom_w); - DECLARE_WRITE8_MEMBER(axrom_w); - DECLARE_WRITE8_MEMBER(bxrom_w); - DECLARE_WRITE8_MEMBER(gxrom_w); - DECLARE_WRITE8_MEMBER(sxrom_w); - DECLARE_WRITE8_MEMBER(pxrom_w); - DECLARE_WRITE8_MEMBER(fxrom_w); - DECLARE_WRITE8_MEMBER(txrom_w); - DECLARE_WRITE8_MEMBER(hkrom_m_w); - DECLARE_READ8_MEMBER(hkrom_m_r); - DECLARE_WRITE8_MEMBER(hkrom_w); - DECLARE_WRITE8_MEMBER(txsrom_w); - DECLARE_WRITE8_MEMBER(tqrom_w); - DECLARE_WRITE8_MEMBER(zz_m_w); - DECLARE_WRITE8_MEMBER(qj_m_w); - DECLARE_READ8_MEMBER(exrom_l_r); - DECLARE_WRITE8_MEMBER(exrom_l_w); - DECLARE_WRITE8_MEMBER(ntbrom_w); - DECLARE_WRITE8_MEMBER(jxrom_w); - DECLARE_WRITE8_MEMBER(dxrom_w); - DECLARE_WRITE8_MEMBER(namcot3453_w); - DECLARE_WRITE8_MEMBER(namcot3446_w); - DECLARE_WRITE8_MEMBER(namcot3425_w); - DECLARE_WRITE8_MEMBER(dis_74x377_w); - DECLARE_WRITE8_MEMBER(dis_74x139x74_m_w); - DECLARE_WRITE8_MEMBER(dis_74x161x138_m_w); - DECLARE_WRITE8_MEMBER(dis_74x161x161x32_w); - DECLARE_WRITE8_MEMBER(lz93d50_w); - DECLARE_WRITE8_MEMBER(lz93d50_m_w); - DECLARE_WRITE8_MEMBER(fjump2_w); - DECLARE_WRITE8_MEMBER(bandai_ks_w); - DECLARE_WRITE8_MEMBER(bandai_ok_w); - DECLARE_WRITE8_MEMBER(lrog017_w); - DECLARE_WRITE8_MEMBER(irem_hd_w); - DECLARE_WRITE8_MEMBER(tam_s1_w); - DECLARE_WRITE8_MEMBER(g101_w); - DECLARE_WRITE8_MEMBER(h3001_w); - DECLARE_WRITE8_MEMBER(ss88006_w); - DECLARE_WRITE8_MEMBER(jf11_m_w); - DECLARE_WRITE8_MEMBER(jf13_m_w); - DECLARE_WRITE8_MEMBER(jf16_w); - DECLARE_WRITE8_MEMBER(jf17_w); - DECLARE_WRITE8_MEMBER(jf19_w); - DECLARE_WRITE8_MEMBER(konami_vrc1_w); - DECLARE_WRITE8_MEMBER(konami_vrc2_w); - DECLARE_WRITE8_MEMBER(konami_vrc3_w); - DECLARE_WRITE8_MEMBER(konami_vrc4_w); - DECLARE_WRITE8_MEMBER(konami_vrc6_w); - DECLARE_WRITE8_MEMBER(konami_vrc7_w); - DECLARE_WRITE8_MEMBER(namcot163_l_w); - DECLARE_READ8_MEMBER(namcot163_l_r); - DECLARE_WRITE8_MEMBER(namcot163_w); - DECLARE_WRITE8_MEMBER(sunsoft1_m_w); - DECLARE_WRITE8_MEMBER(sunsoft2_w); - DECLARE_WRITE8_MEMBER(sunsoft3_w); - DECLARE_WRITE8_MEMBER(tc0190fmc_w); - DECLARE_WRITE8_MEMBER(tc0190fmc_p16_w); - DECLARE_WRITE8_MEMBER(x1005_m_w); - DECLARE_READ8_MEMBER(x1005_m_r); - DECLARE_WRITE8_MEMBER(x1005a_m_w); - DECLARE_WRITE8_MEMBER(x1017_m_w); - DECLARE_READ8_MEMBER(x1017_m_r); - DECLARE_WRITE8_MEMBER(agci_50282_w); - DECLARE_WRITE8_MEMBER(nina01_m_w); - DECLARE_WRITE8_MEMBER(nina06_l_w); - DECLARE_WRITE8_MEMBER(ae_act52_w); - DECLARE_WRITE8_MEMBER(cne_decathl_w); - DECLARE_WRITE8_MEMBER(cne_fsb_m_w); - DECLARE_WRITE8_MEMBER(cne_shlz_l_w); - DECLARE_WRITE8_MEMBER(caltron6in1_m_w); - DECLARE_WRITE8_MEMBER(caltron6in1_w); - DECLARE_WRITE8_MEMBER(bf9093_w); - DECLARE_WRITE8_MEMBER(bf9096_w); - DECLARE_WRITE8_MEMBER(golden5_w); - DECLARE_WRITE8_MEMBER(cony_l_w); - DECLARE_READ8_MEMBER(cony_l_r); - DECLARE_WRITE8_MEMBER(cony_w); - DECLARE_WRITE8_MEMBER(yoko_l_w); - DECLARE_READ8_MEMBER(yoko_l_r); - DECLARE_WRITE8_MEMBER(yoko_w); - DECLARE_WRITE8_MEMBER(dreamtech_l_w); - DECLARE_WRITE8_MEMBER(fukutake_l_w); - DECLARE_READ8_MEMBER(fukutake_l_r); - DECLARE_WRITE8_MEMBER(futuremedia_w); - DECLARE_WRITE8_MEMBER(gouder_sf4_l_w); - DECLARE_READ8_MEMBER(gouder_sf4_l_r); - DECLARE_WRITE8_MEMBER(henggedianzi_w); - DECLARE_WRITE8_MEMBER(heng_xjzb_l_w); - DECLARE_WRITE8_MEMBER(heng_xjzb_w); - DECLARE_WRITE8_MEMBER(hes6in1_l_w); - DECLARE_WRITE8_MEMBER(hes_l_w); - DECLARE_WRITE8_MEMBER(hosenkan_w); - DECLARE_WRITE8_MEMBER(ks7058_w); - DECLARE_WRITE8_MEMBER(ks7022_w); - DECLARE_READ8_MEMBER(ks7022_r); - DECLARE_WRITE8_MEMBER(ks7032_w); - DECLARE_WRITE8_MEMBER(ks202_w); - DECLARE_WRITE8_MEMBER(ks7017_l_w); - DECLARE_WRITE8_MEMBER(ks7017_extra_w); - DECLARE_READ8_MEMBER(ks7017_extra_r); - DECLARE_WRITE8_MEMBER(kay_pp_l_w); - DECLARE_READ8_MEMBER(kay_pp_l_r); - DECLARE_WRITE8_MEMBER(kay_pp_w); - DECLARE_WRITE8_MEMBER(kasing_m_w); - DECLARE_WRITE8_MEMBER(magics_md_w); - DECLARE_WRITE8_MEMBER(nanjing_l_w); - DECLARE_READ8_MEMBER(nanjing_l_r); - DECLARE_WRITE8_MEMBER(nitra_w); - DECLARE_WRITE8_MEMBER(ntdec_asder_w); - DECLARE_WRITE8_MEMBER(ntdec_fh_m_w); - DECLARE_WRITE8_MEMBER(daou306_w); - DECLARE_WRITE8_MEMBER(gs2015_w); - DECLARE_WRITE8_MEMBER(rcm_tf_w); - DECLARE_WRITE8_MEMBER(rex_dbz_l_w); - DECLARE_READ8_MEMBER(rex_dbz_l_r); - DECLARE_WRITE8_MEMBER(rex_sl1632_w); - DECLARE_WRITE8_MEMBER(rumblestation_m_w); - DECLARE_WRITE8_MEMBER(rumblestation_w); - DECLARE_WRITE8_MEMBER(sachen_74x374_l_w); - DECLARE_READ8_MEMBER(sachen_74x374_l_r); - DECLARE_WRITE8_MEMBER(sachen_74x374a_l_w); - DECLARE_WRITE8_MEMBER(s8259_l_w); - DECLARE_WRITE8_MEMBER(s8259_m_w); - DECLARE_WRITE8_MEMBER(sa009_l_w); - DECLARE_WRITE8_MEMBER(sa0036_w); - DECLARE_WRITE8_MEMBER(sa0037_w); - DECLARE_WRITE8_MEMBER(sa72007_l_w); - DECLARE_WRITE8_MEMBER(sa72008_l_w); - DECLARE_READ8_MEMBER(tca01_l_r); - DECLARE_WRITE8_MEMBER(tcu01_l_w); - DECLARE_WRITE8_MEMBER(tcu01_m_w); - DECLARE_WRITE8_MEMBER(tcu01_w); - DECLARE_WRITE8_MEMBER(tcu02_l_w); - DECLARE_READ8_MEMBER(tcu02_l_r); - DECLARE_WRITE8_MEMBER(subor0_w); - DECLARE_WRITE8_MEMBER(subor1_w); - DECLARE_WRITE8_MEMBER(sgame_boog_l_w); - DECLARE_WRITE8_MEMBER(sgame_boog_m_w); - DECLARE_WRITE8_MEMBER(sgame_boog_w); - DECLARE_WRITE8_MEMBER(sgame_lion_m_w); - DECLARE_WRITE8_MEMBER(sgame_lion_w); - DECLARE_WRITE8_MEMBER(tengen_800008_w); - DECLARE_WRITE8_MEMBER(tengen_800032_w); - DECLARE_WRITE8_MEMBER(tengen_800037_w); - DECLARE_WRITE8_MEMBER(txc_22211_l_w); - DECLARE_READ8_MEMBER(txc_22211_l_r); - DECLARE_WRITE8_MEMBER(txc_22211_w); - DECLARE_WRITE8_MEMBER(txc_22211b_w); - DECLARE_READ8_MEMBER(txc_22211c_l_r); - DECLARE_WRITE8_MEMBER(txc_tw_l_w); - DECLARE_WRITE8_MEMBER(txc_tw_m_w); - DECLARE_WRITE8_MEMBER(txc_strikewolf_w); - DECLARE_READ8_MEMBER(txc_mxmdhtwo_l_r); - DECLARE_WRITE8_MEMBER(txc_mxmdhtwo_w); - DECLARE_WRITE8_MEMBER(waixing_a_w); - DECLARE_WRITE8_MEMBER(waixing_f_w); - DECLARE_WRITE8_MEMBER(waixing_g_w); - DECLARE_WRITE8_MEMBER(waixing_h_w); - DECLARE_WRITE8_MEMBER(waixing_sgz_w); - DECLARE_WRITE8_MEMBER(waixing_sgzlz_l_w); - DECLARE_WRITE8_MEMBER(waixing_ffv_l_w); - DECLARE_WRITE8_MEMBER(waixing_zs_w); - DECLARE_WRITE8_MEMBER(waixing_dq8_w); - DECLARE_WRITE8_MEMBER(waixing_ps2_w); - DECLARE_WRITE8_MEMBER(waixing_sec_l_w); - DECLARE_READ8_MEMBER(waixing_sh2_chr_r); - DECLARE_WRITE8_MEMBER(unl_8237_l_w); - DECLARE_WRITE8_MEMBER(unl_8237_w); - DECLARE_WRITE8_MEMBER(unl_ax5705_w); - DECLARE_WRITE8_MEMBER(unl_cc21_w); - DECLARE_WRITE8_MEMBER(unl_kof97_w); - DECLARE_WRITE8_MEMBER(ks7057_w); - DECLARE_WRITE8_MEMBER(unl_t230_w); - DECLARE_WRITE8_MEMBER(kof96_l_w); - DECLARE_READ8_MEMBER(kof96_l_r); - DECLARE_WRITE8_MEMBER(kof96_w); - DECLARE_WRITE8_MEMBER(mk2_m_w); - DECLARE_WRITE8_MEMBER(n625092_w); - DECLARE_WRITE8_MEMBER(sc127_w); - DECLARE_WRITE8_MEMBER(smb2j_w); - DECLARE_WRITE8_MEMBER(smb2jb_l_w); - DECLARE_WRITE8_MEMBER(smb2jb_extra_w); - DECLARE_WRITE8_MEMBER(unl_sf3_w); - DECLARE_WRITE8_MEMBER(unl_xzy_l_w); - DECLARE_WRITE8_MEMBER(unl_racmate_w); - DECLARE_WRITE8_MEMBER(unl_fs304_l_w); - DECLARE_WRITE8_MEMBER(btl_smb11_w); - DECLARE_WRITE8_MEMBER(btl_mariobaby_w); - DECLARE_WRITE8_MEMBER(btl_smb2a_w); - DECLARE_WRITE8_MEMBER(whirl2706_w); - DECLARE_WRITE8_MEMBER(btl_tobi_l_w); - DECLARE_WRITE8_MEMBER(btl_smb3_w); - DECLARE_WRITE8_MEMBER(btl_dn_w); - DECLARE_WRITE8_MEMBER(btl_pika_y2k_w); - DECLARE_WRITE8_MEMBER(btl_pika_y2k_m_w); - DECLARE_READ8_MEMBER(btl_pika_y2k_m_r); - DECLARE_WRITE8_MEMBER(fk23c_l_w); - DECLARE_WRITE8_MEMBER(fk23c_w); - DECLARE_WRITE8_MEMBER(bmc_64in1nr_l_w); - DECLARE_WRITE8_MEMBER(bmc_64in1nr_w); - DECLARE_WRITE8_MEMBER(bmc_190in1_w); - DECLARE_WRITE8_MEMBER(bmc_a65as_w); - DECLARE_WRITE8_MEMBER(bmc_gs2004_w); - DECLARE_WRITE8_MEMBER(bmc_gs2013_w); - DECLARE_WRITE8_MEMBER(bmc_s24in1sc03_l_w); - DECLARE_WRITE8_MEMBER(bmc_t262_w); - DECLARE_WRITE8_MEMBER(bmc_ws_m_w); - DECLARE_WRITE8_MEMBER(novel1_w); - DECLARE_WRITE8_MEMBER(novel2_w); - DECLARE_WRITE8_MEMBER(bmc_gka_w); - DECLARE_WRITE8_MEMBER(sng32_w); - DECLARE_WRITE8_MEMBER(bmc_gkb_w); - DECLARE_WRITE8_MEMBER(bmc_super700in1_w); - DECLARE_WRITE8_MEMBER(bmc_36in1_w); - DECLARE_WRITE8_MEMBER(bmc_21in1_w); - DECLARE_WRITE8_MEMBER(bmc_150in1_w); - DECLARE_WRITE8_MEMBER(bmc_35in1_w); - DECLARE_WRITE8_MEMBER(bmc_64in1_w); - DECLARE_WRITE8_MEMBER(bmc_15in1_m_w); - DECLARE_WRITE8_MEMBER(bmc_hik300_w); - DECLARE_WRITE8_MEMBER(supergun20in1_w); - DECLARE_WRITE8_MEMBER(bmc_72in1_w); - DECLARE_WRITE8_MEMBER(bmc_76in1_w); - DECLARE_WRITE8_MEMBER(bmc_1200in1_w); - DECLARE_WRITE8_MEMBER(bmc_31in1_w); - DECLARE_WRITE8_MEMBER(bmc_22g_w); - DECLARE_WRITE8_MEMBER(bmc_20in1_w); - DECLARE_WRITE8_MEMBER(bmc_110in1_w); - DECLARE_WRITE8_MEMBER(bmc_sbig7_w); - DECLARE_WRITE8_MEMBER(bmc_hik8_m_w); - DECLARE_WRITE8_MEMBER(bmc_hik4in1_m_w); - DECLARE_WRITE8_MEMBER(bmc_ball11_m_w); - DECLARE_WRITE8_MEMBER(bmc_ball11_w); - DECLARE_WRITE8_MEMBER(bmc_mario7in1_m_w); - DECLARE_WRITE8_MEMBER(bmc_gold7in1_m_w); - DECLARE_WRITE8_MEMBER(bmc_gc6in1_l_w); - DECLARE_WRITE8_MEMBER(bmc_gc6in1_w); - DECLARE_WRITE8_MEMBER(bmc_family4646_m_w); - DECLARE_WRITE8_MEMBER(bmc_vt5201_w); - DECLARE_READ8_MEMBER(bmc_vt5201_r); - DECLARE_WRITE8_MEMBER(bmc_bs5_w); - DECLARE_WRITE8_MEMBER(bmc_810544_w); - DECLARE_WRITE8_MEMBER(bmc_ntd03_w); - DECLARE_WRITE8_MEMBER(bmc_gb63_w); - DECLARE_READ8_MEMBER(bmc_gb63_r); - DECLARE_WRITE8_MEMBER(edu2k_w); - DECLARE_WRITE8_MEMBER(h2288_l_w); - DECLARE_READ8_MEMBER(h2288_l_r); - DECLARE_WRITE8_MEMBER(h2288_w); - DECLARE_WRITE8_MEMBER(shjy3_w); - DECLARE_WRITE8_MEMBER(unl_6035052_extra_w); - DECLARE_READ8_MEMBER(unl_6035052_extra_r); - DECLARE_WRITE8_MEMBER(pjoy84_m_w); - DECLARE_WRITE8_MEMBER(someri_mmc1_w); - DECLARE_WRITE8_MEMBER(someri_mmc3_w); - DECLARE_WRITE8_MEMBER(someri_vrc2_w); - DECLARE_WRITE8_MEMBER(someri_w); - DECLARE_WRITE8_MEMBER(someri_l_w); - DECLARE_WRITE8_MEMBER(fujiya_m_w); - DECLARE_READ8_MEMBER(fujiya_m_r); - DECLARE_WRITE8_MEMBER(dummy_l_w); - DECLARE_WRITE8_MEMBER(dummy_m_w); - DECLARE_WRITE8_MEMBER(dummy_w); - DECLARE_READ8_MEMBER(dummy_l_r); - DECLARE_READ8_MEMBER(dummy_m_r); - DECLARE_READ8_MEMBER(dummy_r); - - UINT8 *m_wram; - UINT8 *m_battery_ram; - UINT8 *m_mapper_ram; - UINT8 *m_mapper_bram; - UINT32 m_mapper_ram_size; - UINT32 m_mapper_bram_size; - - // things below are included here for the moment, even if probably would better fit nes_state - // to allow compilation while progressing with the work - - /* devices */ - cpu_device *m_maincpu; - ppu2c0x_device *m_ppu; - device_t *m_sound; - emu_timer *m_irq_timer; - - /* load-time cart variables which remain constant */ - UINT16 m_prg_chunks; // iNES 2.0 allows for more chunks (a recently dumped multigame cart has 256 chunks of both PRG & CHR!) - UINT16 m_chr_chunks; - UINT8 m_battery; // if there is PRG RAM with battery backup - - /* system variables which don't change at run-time */ - UINT16 m_pcb_id; // for UNIF & xml - UINT8 m_hard_mirroring; -}; class nes_state : public nes_carts_state { @@ -513,27 +96,7 @@ public: UINT8 *m_prg; UINT8 *m_vrom; UINT8 *m_vram; - UINT8 *m_ciram; //PPU nametable RAM - external to PPU! - - - /* load-time cart variables which remain constant */ -// UINT16 m_prg_chunks; // iNES 2.0 allows for more chunks (a recently dumped multigame cart has 256 chunks of both PRG & CHR!) -// UINT16 m_chr_chunks; - UINT16 m_vram_chunks; - UINT8 m_trainer; -// UINT8 m_battery; // if there is PRG RAM with battery backup - UINT32 m_battery_size; - UINT8 m_prg_ram; // if there is PRG RAM with no backup - UINT32 m_wram_size; - - /* system variables which don't change at run-time */ - UINT16 m_mapper; // for iNES -// UINT16 m_pcb_id; // for UNIF & xml - UINT8 m_four_screen_vram; -// UINT8 m_hard_mirroring; - UINT8 m_crc_hack; // this is needed to detect different boards sharing the same Mappers (shame on .nes format) - UINT8 m_ines20; - + UINT8 *m_ciram; //PPU nametable RAM - external to PPU! /***** FDS-floppy related *****/ diff --git a/src/mess/includes/nes_mmc.h b/src/mess/includes/nes_mmc.h new file mode 100644 index 00000000000..0bbabfcf299 --- /dev/null +++ b/src/mess/includes/nes_mmc.h @@ -0,0 +1,564 @@ +#ifndef __MMC_H +#define __MMC_H + +/* Boards */ +enum +{ + STD_NROM = 0, + STD_AXROM, STD_BXROM, STD_CNROM, STD_CPROM, + STD_DXROM, STD_EXROM, STD_FXROM, STD_GXROM, + STD_HKROM, STD_JXROM, STD_MXROM, STD_NXROM, + STD_PXROM, STD_SXROM, STD_TXROM, STD_TXSROM, + STD_TKROM, STD_TQROM, STD_TVROM, + STD_UN1ROM, STD_UXROM, + HVC_FAMBASIC, NES_QJ, PAL_ZZ, UXROM_CC, + STD_DRROM, STD_SXROM_A, STD_SOROM, STD_SOROM_A, + /* Discrete components boards (by various manufacturer) */ + DIS_74X161X138, DIS_74X139X74, + DIS_74X377, DIS_74X161X161X32, + /* Active Enterprises */ + ACTENT_ACT52, + /* AGCI */ + AGCI_50282, + /* AVE */ + AVE_NINA01, AVE_NINA06, + /* Bandai */ + BANDAI_JUMP2, BANDAI_PT554, + BANDAI_DATACH, BANDAI_KARAOKE, BANDAI_OEKAKIDS, + BANDAI_FCG, BANDAI_LZ93, BANDAI_LZ93EX, + /* Caltron */ + CALTRON_6IN1, + /* Camerica */ + CAMERICA_BF9093, CAMERICA_BF9097, CAMERICA_BF9096, + CAMERICA_GOLDENFIVE, GG_NROM, + /* Dreamtech */ + DREAMTECH_BOARD, + /* Irem */ + IREM_G101, IREM_H3001, IREM_LROG017, + IREM_TAM_S1, IREM_HOLYDIV, + /* Jaleco */ + JALECO_SS88006, JALECO_JF11, JALECO_JF13, + JALECO_JF16, JALECO_JF17, JALECO_JF19, + /* Konami */ + KONAMI_VRC1, KONAMI_VRC2, KONAMI_VRC3, + KONAMI_VRC4, KONAMI_VRC6, KONAMI_VRC7, + /* Namcot */ + NAMCOT_163, NAMCOT_3453, + NAMCOT_3425, NAMCOT_34X3, NAMCOT_3446, + /* NTDEC */ + NTDEC_ASDER, NTDEC_FIGHTINGHERO, + /* Rex Soft */ + REXSOFT_SL1632, REXSOFT_DBZ5, + /* Sachen */ + SACHEN_8259A, SACHEN_8259B, SACHEN_8259C, SACHEN_8259D, + SACHEN_SA009, SACHEN_SA0036, SACHEN_SA0037, + SACHEN_SA72007, SACHEN_SA72008, SACHEN_TCA01, + SACHEN_TCU01, SACHEN_TCU02, + SACHEN_74LS374, SACHEN_74LS374_A, + /* Sunsoft */ + SUNSOFT_1, SUNSOFT_2, SUNSOFT_3, SUNSOFT_4, + SUNSOFT_DCS, SUNSOFT_5B, SUNSOFT_FME7, + /* Taito */ + TAITO_TC0190FMC, TAITO_TC0190FMCP, + TAITO_X1_005, TAITO_X1_005_A, TAITO_X1_017, + /* Tengen */ + TENGEN_800008, TENGEN_800032, TENGEN_800037, + /* TXC */ + TXC_22211A, TXC_22211B, TXC_22211C, + TXC_MXMDHTWO, TXC_TW, TXC_STRIKEWOLF, + /* Multigame Carts */ + BMC_64IN1NR, BMC_190IN1, BMC_A65AS, BMC_GS2004, BMC_GS2013, + BMC_HIK8IN1, BMC_NOVELDIAMOND, BMC_S24IN1SC03, BMC_T262, + BMC_WS, BMC_SUPERBIG_7IN1, BMC_SUPERHIK_4IN1, BMC_BALLGAMES_11IN1, + BMC_MARIOPARTY_7IN1, BMC_GOLD_7IN1, BMC_SUPER_700IN1, BMC_FAMILY_4646B, + BMC_36IN1, BMC_21IN1, BMC_150IN1, BMC_35IN1, BMC_64IN1, + BMC_15IN1, BMC_SUPERHIK_300IN1, BMC_9999999IN1, BMC_SUPERGUN_20IN1, + BMC_GOLDENCARD_6IN1, BMC_72IN1, BMC_SUPER_42IN1, BMC_76IN1, + BMC_1200IN1, BMC_31IN1, BMC_22GAMES, BMC_20IN1, BMC_110IN1, + BMC_GKA, BMC_GKB, BMC_VT5201, BMC_BENSHENG_BS5, BMC_810544, + BMC_NTD_03, BMC_G63IN1, BMC_FK23C, BMC_FK23CA, BMC_PJOY84, + BMC_POWERFUL_255, + /* Unlicensed */ + UNL_8237, UNL_CC21, UNL_AX5705, UNL_KOF97, UNL_KS7057, + UNL_N625092, UNL_SC127, UNL_SMB2J, UNL_T230, UNL_FS304, + UNL_UXROM, UNL_MK2, UNL_XZY, UNL_KOF96, + UNL_SUPERFIGHTER3, UNL_RACERMATE, UNL_EDU2K, + UNL_SHJY3, UNL_STUDYNGAME, UNL_603_5052, UNL_H2288, + /* Bootleg boards */ + BTL_SMB2A, BTL_MARIOBABY, BTL_AISENSHINICOL, BTL_TOBIDASE, + BTL_SMB2B, BTL_SMB3, BTL_SUPERBROS11, BTL_DRAGONNINJA, + BTL_PIKACHUY2K, + /* Misc: these are needed to convert mappers to boards, I will sort them later */ + OPENCORP_DAOU306, HES_BOARD, HES6IN1_BOARD, RUMBLESTATION_BOARD, + MAGICSERIES_MD, KASING_BOARD, FUTUREMEDIA_BOARD, FUKUTAKE_BOARD, SOMERI_SL12, + HENGEDIANZI_BOARD, HENGEDIANZI_XJZB, SUBOR_TYPE0, SUBOR_TYPE1, + KAISER_KS7058, KAISER_KS7032, KAISER_KS7022, KAISER_KS7017, KAISER_KS7012, KAISER_KS202, + CNE_DECATHLON, CNE_FSB, CNE_SHLZ, CONY_BOARD, YOKO_BOARD, RCM_GS2015, RCM_TETRISFAMILY, + WAIXING_TYPE_A, WAIXING_TYPE_A_1, WAIXING_TYPE_B, WAIXING_TYPE_C, WAIXING_TYPE_D, + WAIXING_TYPE_E, WAIXING_TYPE_F, WAIXING_TYPE_G, WAIXING_TYPE_H, + WAIXING_TYPE_I, WAIXING_TYPE_J, + WAIXING_SGZLZ, WAIXING_SGZ, WAIXING_ZS, WAIXING_SECURITY, WAIXING_SH2, + WAIXING_DQ8, WAIXING_FFV, WAIXING_PS2, SUPERGAME_LIONKING, SUPERGAME_BOOGERMAN, + KAY_PANDAPRINCE, HOSENKAN_BOARD, NITRA_TDA, GOUDER_37017, NANJING_BOARD, + WHIRLWIND_2706, + /* FFE boards, for mappers 6, 8, 17 */ + FFE_MAPPER6, FFE_MAPPER8, FFE_MAPPER17, + /* Unsupported (for place-holder boards, with no working emulation) & no-board (at init) */ + UNSUPPORTED_BOARD, UNKNOWN_BOARD, NO_BOARD +}; + +// these are used to setup the proper PCB ID, for each supported type of files +int nes_get_pcb_id(running_machine &machine, const char *feature); // for softlist +void unif_mapr_setup(running_machine &machine, const char *board); // for UNIF files +int nes_get_mmc_id(running_machine &machine, int mapper); // for iNES files + +// these are used to setup handlers and callbacks necessary to the emulation (resp. at start and reset) +void pcb_handlers_setup(running_machine &machine); +int nes_pcb_reset(running_machine &machine); + +//TEMPORARY PPU STUFF + +/* mirroring types */ +#define PPU_MIRROR_NONE 0 +#define PPU_MIRROR_VERT 1 +#define PPU_MIRROR_HORZ 2 +#define PPU_MIRROR_HIGH 3 +#define PPU_MIRROR_LOW 4 +#define PPU_MIRROR_4SCREEN 5 // Same effect as NONE, but signals that we should never mirror + +void set_nt_mirroring(running_machine &machine, int mirroring); + +struct chr_bank +{ + int source; //defines source of base pointer + int origin; //defines offset of 0x400 byte segment at base pointer + UINT8* access; //source translated + origin -> valid pointer! +}; + + +struct name_table +{ + int source; /* defines source of base pointer */ + int origin; /* defines offset of 0x400 byte segment at base pointer */ + int writable; /* ExRAM, at least, can be write-protected AND used as nametable */ + UINT8* access; /* direct access when possible */ +}; + +typedef void (*nes_prg_callback)(running_machine &machine, int start, int bank); +typedef void (*nes_chr_callback)(running_machine &machine, int start, int bank, int source); + +class nes_carts_state : public driver_device +{ +public: + nes_carts_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } + + int m_prg_bank[5]; + chr_bank m_chr_map[8]; //quick banking structure, because some of this changes multiple times per scanline! + name_table m_nt_page[4]; //quick banking structure for a maximum of 4K of RAM/ROM/ExRAM + + nes_prg_callback m_mmc3_prg_cb; // these are used to simplify a lot emulation of some MMC3 pirate clones + nes_chr_callback m_mmc3_chr_cb; + + int m_chr_open_bus; + int m_prgram_bank5_start, m_battery_bank5_start, m_empty_bank5_start; + + UINT8 m_ce_mask, m_ce_state; + UINT8 m_vrc_ls_prg_a, m_vrc_ls_prg_b, m_vrc_ls_chr; + + int m_MMC5_floodtile; + int m_MMC5_floodattr; + int m_mmc5_vram_control; + UINT8 m_mmc5_high_chr; + UINT8 m_mmc5_split_scr; + UINT8 *m_extended_ntram; + + UINT8 m_mmc5_last_chr_a; + UINT16 m_mmc5_vrom_regA[8]; + UINT16 m_mmc5_vrom_regB[4]; + UINT8 m_mmc5_prg_regs[4]; + UINT8 m_mmc5_bank_security; + UINT8 m_mmc5_prg_mode; + UINT8 m_mmc5_chr_mode; + UINT8 m_mmc5_chr_high; + UINT8 m_mmc5_split_ctrl; + UINT8 m_mmc5_split_yst; + UINT8 m_mmc5_split_bank; + + /***** Mapper-related variables *****/ + + // common ones + int m_IRQ_enable, m_IRQ_enable_latch; + UINT16 m_IRQ_count, m_IRQ_count_latch; + UINT8 m_IRQ_toggle; + UINT8 m_IRQ_reset; + UINT8 m_IRQ_status; + UINT8 m_IRQ_mode; + UINT8 m_IRQ_clear; + int m_mult1, m_mult2; + + UINT8 m_mmc_chr_source; // This is set at init to CHRROM or CHRRAM. a few mappers can swap between + // the two (this is done in the specific handlers). + + UINT8 m_mmc_cmd1, m_mmc_cmd2; // These represent registers where the mapper writes important values + UINT8 m_mmc_count; // This is used as counter in mappers like 1 and 45 + + int m_mmc_prg_base, m_mmc_prg_mask; // MMC3 based multigame carts select a block of banks by using these (and then act like normal MMC3), + int m_mmc_chr_base, m_mmc_chr_mask; // while MMC3 and clones (mapper 118 & 119) simply set them as 0 and 0xff resp. + + UINT8 m_mmc_prg_bank[6]; // Many mappers writes only some bits of the selected bank (for both PRG and CHR), + UINT8 m_mmc_vrom_bank[16]; // hence these are handy to latch bank values. + + UINT16 m_MMC5_vrom_bank[12]; // MMC5 has 10bit wide VROM regs! + UINT8 m_mmc_extra_bank[16]; // some MMC3 clone have 2 series of PRG/CHR banks... + // we collect them all here: first 4 elements PRG banks, then 6/8 CHR banks + + UINT8 m_mmc_latch1, m_mmc_latch2; + UINT8 m_mmc_reg[16]; + + UINT8 m_mmc_dipsetting; + + // misc mapper related variables which should be merged with the above one, where possible + int m_mmc1_reg_write_enable; + int m_mmc1_latch; + int m_mmc1_count; + + int m_mmc3_latch; + int m_mmc3_wram_protect; + int m_mmc3_alt_irq; + + int m_MMC5_rom_bank_mode; + int m_MMC5_vrom_bank_mode; + int m_MMC5_vram_protect; + int m_MMC5_scanline; + int m_vrom_page_a; + int m_vrom_page_b; + // int vrom_next[4]; + + UINT8 m_mmc6_reg; + + // these might be unified in single mmc_reg[] array, together with state->m_mmc_cmd1 & state->m_mmc_cmd2 + // but be careful that MMC3 clones often use state->m_mmc_cmd1/state->m_mmc_cmd2 (from base MMC3) AND additional regs below! + UINT8 m_mapper83_reg[10]; + UINT8 m_mapper83_low_reg[4]; + UINT8 m_txc_reg[4]; // used by mappers 132, 172 & 173 + UINT8 m_subor_reg[4]; // used by mappers 166 & 167 + UINT8 m_sachen_reg[8]; // used by mappers 137, 138, 139 & 141 + UINT8 m_map52_reg_written; + UINT8 m_map114_reg, m_map114_reg_enabled; + + // i/o handlers + DECLARE_WRITE8_MEMBER(mapper6_l_w); + DECLARE_WRITE8_MEMBER(mapper6_w); + DECLARE_WRITE8_MEMBER(mapper8_w); + DECLARE_WRITE8_MEMBER(mapper17_l_w); + DECLARE_WRITE8_MEMBER(uxrom_w); + DECLARE_WRITE8_MEMBER(uxrom_cc_w); + DECLARE_WRITE8_MEMBER(un1rom_w); + DECLARE_WRITE8_MEMBER(cnrom_w); + DECLARE_WRITE8_MEMBER(bandai_pt554_m_w); + DECLARE_WRITE8_MEMBER(cprom_w); + DECLARE_WRITE8_MEMBER(axrom_w); + DECLARE_WRITE8_MEMBER(bxrom_w); + DECLARE_WRITE8_MEMBER(gxrom_w); + DECLARE_WRITE8_MEMBER(sxrom_w); + DECLARE_WRITE8_MEMBER(pxrom_w); + DECLARE_WRITE8_MEMBER(fxrom_w); + DECLARE_WRITE8_MEMBER(txrom_w); + DECLARE_WRITE8_MEMBER(hkrom_m_w); + DECLARE_READ8_MEMBER(hkrom_m_r); + DECLARE_WRITE8_MEMBER(hkrom_w); + DECLARE_WRITE8_MEMBER(txsrom_w); + DECLARE_WRITE8_MEMBER(tqrom_w); + DECLARE_WRITE8_MEMBER(zz_m_w); + DECLARE_WRITE8_MEMBER(qj_m_w); + DECLARE_READ8_MEMBER(exrom_l_r); + DECLARE_WRITE8_MEMBER(exrom_l_w); + DECLARE_WRITE8_MEMBER(ntbrom_w); + DECLARE_WRITE8_MEMBER(jxrom_w); + DECLARE_WRITE8_MEMBER(dxrom_w); + DECLARE_WRITE8_MEMBER(namcot3453_w); + DECLARE_WRITE8_MEMBER(namcot3446_w); + DECLARE_WRITE8_MEMBER(namcot3425_w); + DECLARE_WRITE8_MEMBER(dis_74x377_w); + DECLARE_WRITE8_MEMBER(dis_74x139x74_m_w); + DECLARE_WRITE8_MEMBER(dis_74x161x138_m_w); + DECLARE_WRITE8_MEMBER(dis_74x161x161x32_w); + DECLARE_WRITE8_MEMBER(lz93d50_w); + DECLARE_WRITE8_MEMBER(lz93d50_m_w); + DECLARE_WRITE8_MEMBER(fjump2_w); + DECLARE_WRITE8_MEMBER(bandai_ks_w); + DECLARE_WRITE8_MEMBER(bandai_ok_w); + DECLARE_WRITE8_MEMBER(lrog017_w); + DECLARE_WRITE8_MEMBER(irem_hd_w); + DECLARE_WRITE8_MEMBER(tam_s1_w); + DECLARE_WRITE8_MEMBER(g101_w); + DECLARE_WRITE8_MEMBER(h3001_w); + DECLARE_WRITE8_MEMBER(ss88006_w); + DECLARE_WRITE8_MEMBER(jf11_m_w); + DECLARE_WRITE8_MEMBER(jf13_m_w); + DECLARE_WRITE8_MEMBER(jf16_w); + DECLARE_WRITE8_MEMBER(jf17_w); + DECLARE_WRITE8_MEMBER(jf19_w); + DECLARE_WRITE8_MEMBER(konami_vrc1_w); + DECLARE_WRITE8_MEMBER(konami_vrc2_w); + DECLARE_WRITE8_MEMBER(konami_vrc3_w); + DECLARE_WRITE8_MEMBER(konami_vrc4_w); + DECLARE_WRITE8_MEMBER(konami_vrc6_w); + DECLARE_WRITE8_MEMBER(konami_vrc7_w); + DECLARE_WRITE8_MEMBER(namcot163_l_w); + DECLARE_READ8_MEMBER(namcot163_l_r); + DECLARE_WRITE8_MEMBER(namcot163_w); + DECLARE_WRITE8_MEMBER(sunsoft1_m_w); + DECLARE_WRITE8_MEMBER(sunsoft2_w); + DECLARE_WRITE8_MEMBER(sunsoft3_w); + DECLARE_WRITE8_MEMBER(tc0190fmc_w); + DECLARE_WRITE8_MEMBER(tc0190fmc_p16_w); + DECLARE_WRITE8_MEMBER(x1005_m_w); + DECLARE_READ8_MEMBER(x1005_m_r); + DECLARE_WRITE8_MEMBER(x1005a_m_w); + DECLARE_WRITE8_MEMBER(x1017_m_w); + DECLARE_READ8_MEMBER(x1017_m_r); + DECLARE_WRITE8_MEMBER(agci_50282_w); + DECLARE_WRITE8_MEMBER(nina01_m_w); + DECLARE_WRITE8_MEMBER(nina06_l_w); + DECLARE_WRITE8_MEMBER(ae_act52_w); + DECLARE_WRITE8_MEMBER(cne_decathl_w); + DECLARE_WRITE8_MEMBER(cne_fsb_m_w); + DECLARE_WRITE8_MEMBER(cne_shlz_l_w); + DECLARE_WRITE8_MEMBER(caltron6in1_m_w); + DECLARE_WRITE8_MEMBER(caltron6in1_w); + DECLARE_WRITE8_MEMBER(bf9093_w); + DECLARE_WRITE8_MEMBER(bf9096_w); + DECLARE_WRITE8_MEMBER(golden5_w); + DECLARE_WRITE8_MEMBER(cony_l_w); + DECLARE_READ8_MEMBER(cony_l_r); + DECLARE_WRITE8_MEMBER(cony_w); + DECLARE_WRITE8_MEMBER(yoko_l_w); + DECLARE_READ8_MEMBER(yoko_l_r); + DECLARE_WRITE8_MEMBER(yoko_w); + DECLARE_WRITE8_MEMBER(dreamtech_l_w); + DECLARE_WRITE8_MEMBER(fukutake_l_w); + DECLARE_READ8_MEMBER(fukutake_l_r); + DECLARE_WRITE8_MEMBER(futuremedia_w); + DECLARE_WRITE8_MEMBER(gouder_sf4_l_w); + DECLARE_READ8_MEMBER(gouder_sf4_l_r); + DECLARE_WRITE8_MEMBER(henggedianzi_w); + DECLARE_WRITE8_MEMBER(heng_xjzb_l_w); + DECLARE_WRITE8_MEMBER(heng_xjzb_w); + DECLARE_WRITE8_MEMBER(hes6in1_l_w); + DECLARE_WRITE8_MEMBER(hes_l_w); + DECLARE_WRITE8_MEMBER(hosenkan_w); + DECLARE_WRITE8_MEMBER(ks7058_w); + DECLARE_WRITE8_MEMBER(ks7022_w); + DECLARE_READ8_MEMBER(ks7022_r); + DECLARE_WRITE8_MEMBER(ks7032_w); + DECLARE_WRITE8_MEMBER(ks202_w); + DECLARE_WRITE8_MEMBER(ks7017_l_w); + DECLARE_WRITE8_MEMBER(ks7017_extra_w); + DECLARE_READ8_MEMBER(ks7017_extra_r); + DECLARE_WRITE8_MEMBER(kay_pp_l_w); + DECLARE_READ8_MEMBER(kay_pp_l_r); + DECLARE_WRITE8_MEMBER(kay_pp_w); + DECLARE_WRITE8_MEMBER(kasing_m_w); + DECLARE_WRITE8_MEMBER(magics_md_w); + DECLARE_WRITE8_MEMBER(nanjing_l_w); + DECLARE_READ8_MEMBER(nanjing_l_r); + DECLARE_WRITE8_MEMBER(nitra_w); + DECLARE_WRITE8_MEMBER(ntdec_asder_w); + DECLARE_WRITE8_MEMBER(ntdec_fh_m_w); + DECLARE_WRITE8_MEMBER(daou306_w); + DECLARE_WRITE8_MEMBER(gs2015_w); + DECLARE_WRITE8_MEMBER(rcm_tf_w); + DECLARE_WRITE8_MEMBER(rex_dbz_l_w); + DECLARE_READ8_MEMBER(rex_dbz_l_r); + DECLARE_WRITE8_MEMBER(rex_sl1632_w); + DECLARE_WRITE8_MEMBER(rumblestation_m_w); + DECLARE_WRITE8_MEMBER(rumblestation_w); + DECLARE_WRITE8_MEMBER(sachen_74x374_l_w); + DECLARE_READ8_MEMBER(sachen_74x374_l_r); + DECLARE_WRITE8_MEMBER(sachen_74x374a_l_w); + DECLARE_WRITE8_MEMBER(s8259_l_w); + DECLARE_WRITE8_MEMBER(s8259_m_w); + DECLARE_WRITE8_MEMBER(sa009_l_w); + DECLARE_WRITE8_MEMBER(sa0036_w); + DECLARE_WRITE8_MEMBER(sa0037_w); + DECLARE_WRITE8_MEMBER(sa72007_l_w); + DECLARE_WRITE8_MEMBER(sa72008_l_w); + DECLARE_READ8_MEMBER(tca01_l_r); + DECLARE_WRITE8_MEMBER(tcu01_l_w); + DECLARE_WRITE8_MEMBER(tcu01_m_w); + DECLARE_WRITE8_MEMBER(tcu01_w); + DECLARE_WRITE8_MEMBER(tcu02_l_w); + DECLARE_READ8_MEMBER(tcu02_l_r); + DECLARE_WRITE8_MEMBER(subor0_w); + DECLARE_WRITE8_MEMBER(subor1_w); + DECLARE_WRITE8_MEMBER(sgame_boog_l_w); + DECLARE_WRITE8_MEMBER(sgame_boog_m_w); + DECLARE_WRITE8_MEMBER(sgame_boog_w); + DECLARE_WRITE8_MEMBER(sgame_lion_m_w); + DECLARE_WRITE8_MEMBER(sgame_lion_w); + DECLARE_WRITE8_MEMBER(tengen_800008_w); + DECLARE_WRITE8_MEMBER(tengen_800032_w); + DECLARE_WRITE8_MEMBER(tengen_800037_w); + DECLARE_WRITE8_MEMBER(txc_22211_l_w); + DECLARE_READ8_MEMBER(txc_22211_l_r); + DECLARE_WRITE8_MEMBER(txc_22211_w); + DECLARE_WRITE8_MEMBER(txc_22211b_w); + DECLARE_READ8_MEMBER(txc_22211c_l_r); + DECLARE_WRITE8_MEMBER(txc_tw_l_w); + DECLARE_WRITE8_MEMBER(txc_tw_m_w); + DECLARE_WRITE8_MEMBER(txc_strikewolf_w); + DECLARE_READ8_MEMBER(txc_mxmdhtwo_l_r); + DECLARE_WRITE8_MEMBER(txc_mxmdhtwo_w); + DECLARE_WRITE8_MEMBER(waixing_a_w); + DECLARE_WRITE8_MEMBER(waixing_f_w); + DECLARE_WRITE8_MEMBER(waixing_g_w); + DECLARE_WRITE8_MEMBER(waixing_h_w); + DECLARE_WRITE8_MEMBER(waixing_sgz_w); + DECLARE_WRITE8_MEMBER(waixing_sgzlz_l_w); + DECLARE_WRITE8_MEMBER(waixing_ffv_l_w); + DECLARE_WRITE8_MEMBER(waixing_zs_w); + DECLARE_WRITE8_MEMBER(waixing_dq8_w); + DECLARE_WRITE8_MEMBER(waixing_ps2_w); + DECLARE_WRITE8_MEMBER(waixing_sec_l_w); + DECLARE_READ8_MEMBER(waixing_sh2_chr_r); + DECLARE_WRITE8_MEMBER(unl_8237_l_w); + DECLARE_WRITE8_MEMBER(unl_8237_w); + DECLARE_WRITE8_MEMBER(unl_ax5705_w); + DECLARE_WRITE8_MEMBER(unl_cc21_w); + DECLARE_WRITE8_MEMBER(unl_kof97_w); + DECLARE_WRITE8_MEMBER(ks7057_w); + DECLARE_WRITE8_MEMBER(unl_t230_w); + DECLARE_WRITE8_MEMBER(kof96_l_w); + DECLARE_READ8_MEMBER(kof96_l_r); + DECLARE_WRITE8_MEMBER(kof96_w); + DECLARE_WRITE8_MEMBER(mk2_m_w); + DECLARE_WRITE8_MEMBER(n625092_w); + DECLARE_WRITE8_MEMBER(sc127_w); + DECLARE_WRITE8_MEMBER(smb2j_w); + DECLARE_WRITE8_MEMBER(smb2jb_l_w); + DECLARE_WRITE8_MEMBER(smb2jb_extra_w); + DECLARE_WRITE8_MEMBER(unl_sf3_w); + DECLARE_WRITE8_MEMBER(unl_xzy_l_w); + DECLARE_WRITE8_MEMBER(unl_racmate_w); + DECLARE_WRITE8_MEMBER(unl_fs304_l_w); + DECLARE_WRITE8_MEMBER(btl_smb11_w); + DECLARE_WRITE8_MEMBER(btl_mariobaby_w); + DECLARE_WRITE8_MEMBER(btl_smb2a_w); + DECLARE_WRITE8_MEMBER(whirl2706_w); + DECLARE_WRITE8_MEMBER(btl_tobi_l_w); + DECLARE_WRITE8_MEMBER(btl_smb3_w); + DECLARE_WRITE8_MEMBER(btl_dn_w); + DECLARE_WRITE8_MEMBER(btl_pika_y2k_w); + DECLARE_WRITE8_MEMBER(btl_pika_y2k_m_w); + DECLARE_READ8_MEMBER(btl_pika_y2k_m_r); + DECLARE_WRITE8_MEMBER(fk23c_l_w); + DECLARE_WRITE8_MEMBER(fk23c_w); + DECLARE_WRITE8_MEMBER(bmc_64in1nr_l_w); + DECLARE_WRITE8_MEMBER(bmc_64in1nr_w); + DECLARE_WRITE8_MEMBER(bmc_190in1_w); + DECLARE_WRITE8_MEMBER(bmc_a65as_w); + DECLARE_WRITE8_MEMBER(bmc_gs2004_w); + DECLARE_WRITE8_MEMBER(bmc_gs2013_w); + DECLARE_WRITE8_MEMBER(bmc_s24in1sc03_l_w); + DECLARE_WRITE8_MEMBER(bmc_t262_w); + DECLARE_WRITE8_MEMBER(bmc_ws_m_w); + DECLARE_WRITE8_MEMBER(novel1_w); + DECLARE_WRITE8_MEMBER(novel2_w); + DECLARE_WRITE8_MEMBER(bmc_gka_w); + DECLARE_WRITE8_MEMBER(sng32_w); + DECLARE_WRITE8_MEMBER(bmc_gkb_w); + DECLARE_WRITE8_MEMBER(bmc_super700in1_w); + DECLARE_WRITE8_MEMBER(bmc_36in1_w); + DECLARE_WRITE8_MEMBER(bmc_21in1_w); + DECLARE_WRITE8_MEMBER(bmc_150in1_w); + DECLARE_WRITE8_MEMBER(bmc_35in1_w); + DECLARE_WRITE8_MEMBER(bmc_64in1_w); + DECLARE_WRITE8_MEMBER(bmc_15in1_m_w); + DECLARE_WRITE8_MEMBER(bmc_hik300_w); + DECLARE_WRITE8_MEMBER(supergun20in1_w); + DECLARE_WRITE8_MEMBER(bmc_72in1_w); + DECLARE_WRITE8_MEMBER(bmc_76in1_w); + DECLARE_WRITE8_MEMBER(bmc_1200in1_w); + DECLARE_WRITE8_MEMBER(bmc_31in1_w); + DECLARE_WRITE8_MEMBER(bmc_22g_w); + DECLARE_WRITE8_MEMBER(bmc_20in1_w); + DECLARE_WRITE8_MEMBER(bmc_110in1_w); + DECLARE_WRITE8_MEMBER(bmc_sbig7_w); + DECLARE_WRITE8_MEMBER(bmc_hik8_m_w); + DECLARE_WRITE8_MEMBER(bmc_hik4in1_m_w); + DECLARE_WRITE8_MEMBER(bmc_ball11_m_w); + DECLARE_WRITE8_MEMBER(bmc_ball11_w); + DECLARE_WRITE8_MEMBER(bmc_mario7in1_m_w); + DECLARE_WRITE8_MEMBER(bmc_gold7in1_m_w); + DECLARE_WRITE8_MEMBER(bmc_gc6in1_l_w); + DECLARE_WRITE8_MEMBER(bmc_gc6in1_w); + DECLARE_WRITE8_MEMBER(bmc_family4646_m_w); + DECLARE_WRITE8_MEMBER(bmc_vt5201_w); + DECLARE_READ8_MEMBER(bmc_vt5201_r); + DECLARE_WRITE8_MEMBER(bmc_bs5_w); + DECLARE_WRITE8_MEMBER(bmc_810544_w); + DECLARE_WRITE8_MEMBER(bmc_ntd03_w); + DECLARE_WRITE8_MEMBER(bmc_gb63_w); + DECLARE_READ8_MEMBER(bmc_gb63_r); + DECLARE_WRITE8_MEMBER(edu2k_w); + DECLARE_WRITE8_MEMBER(h2288_l_w); + DECLARE_READ8_MEMBER(h2288_l_r); + DECLARE_WRITE8_MEMBER(h2288_w); + DECLARE_WRITE8_MEMBER(shjy3_w); + DECLARE_WRITE8_MEMBER(unl_6035052_extra_w); + DECLARE_READ8_MEMBER(unl_6035052_extra_r); + DECLARE_WRITE8_MEMBER(pjoy84_m_w); + DECLARE_WRITE8_MEMBER(someri_mmc1_w); + DECLARE_WRITE8_MEMBER(someri_mmc3_w); + DECLARE_WRITE8_MEMBER(someri_vrc2_w); + DECLARE_WRITE8_MEMBER(someri_w); + DECLARE_WRITE8_MEMBER(someri_l_w); + DECLARE_WRITE8_MEMBER(fujiya_m_w); + DECLARE_READ8_MEMBER(fujiya_m_r); + DECLARE_WRITE8_MEMBER(dummy_l_w); + DECLARE_WRITE8_MEMBER(dummy_m_w); + DECLARE_WRITE8_MEMBER(dummy_w); + DECLARE_READ8_MEMBER(dummy_l_r); + DECLARE_READ8_MEMBER(dummy_m_r); + DECLARE_READ8_MEMBER(dummy_r); + + UINT8 *m_wram; + UINT8 *m_battery_ram; + UINT8 *m_mapper_ram; + UINT8 *m_mapper_bram; + UINT32 m_mapper_ram_size; + UINT32 m_mapper_bram_size; + + /* load-time cart variables which remain constant */ + UINT16 m_prg_chunks; // iNES 2.0 allows for more chunks (a recently dumped multigame cart has 256 chunks of both PRG & CHR!) + UINT16 m_chr_chunks; + UINT16 m_vram_chunks; + UINT8 m_trainer; + UINT8 m_battery; // if there is PRG RAM with battery backup + UINT32 m_battery_size; + UINT8 m_prg_ram; // if there is PRG RAM with no backup + UINT32 m_wram_size; + + /* system variables which don't change at run-time */ + UINT16 m_mapper; // for iNES + UINT16 m_pcb_id; // for UNIF & xml + UINT8 m_four_screen_vram; + UINT8 m_hard_mirroring; + UINT8 m_crc_hack; // this is needed to detect different boards sharing the same Mappers (shame on .nes format) + UINT8 m_ines20; + + // things below are included here for the moment, even if probably would better fit nes_state + // to allow compilation while progressing with the work + + /* devices */ + cpu_device *m_maincpu; + ppu2c0x_device *m_ppu; + device_t *m_sound; + emu_timer *m_irq_timer; +}; + + + +#endif diff --git a/src/mess/machine/nes.c b/src/mess/machine/nes.c index ea6a9a7925c..1847c60550d 100644 --- a/src/mess/machine/nes.c +++ b/src/mess/machine/nes.c @@ -3,7 +3,7 @@ #include "cpu/m6502/m6502.h" #include "video/ppu2c0x.h" #include "includes/nes.h" -#include "machine/nes_mmc.h" +//#include "includes/nes_mmc.h" #include "imagedev/cartslot.h" #include "imagedev/flopdrv.h" #include "hashfile.h" diff --git a/src/mess/machine/nes_mmc.c b/src/mess/machine/nes_mmc.c index f74420b3b71..1b8b4aa92a6 100644 --- a/src/mess/machine/nes_mmc.c +++ b/src/mess/machine/nes_mmc.c @@ -124,7 +124,7 @@ #include "cpu/m6502/m6502.h" #include "video/ppu2c0x.h" #include "includes/nes.h" -#include "nes_mmc.h" +#include "includes/nes_mmc.h" #include "sound/nes_apu.h" #ifdef MAME_DEBUG diff --git a/src/mess/machine/nes_mmc.h b/src/mess/machine/nes_mmc.h deleted file mode 100644 index ad0c0c43634..00000000000 --- a/src/mess/machine/nes_mmc.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef __MMC_H -#define __MMC_H - -/* Boards */ -enum -{ - STD_NROM = 0, - STD_AXROM, STD_BXROM, STD_CNROM, STD_CPROM, - STD_DXROM, STD_EXROM, STD_FXROM, STD_GXROM, - STD_HKROM, STD_JXROM, STD_MXROM, STD_NXROM, - STD_PXROM, STD_SXROM, STD_TXROM, STD_TXSROM, - STD_TKROM, STD_TQROM, STD_TVROM, - STD_UN1ROM, STD_UXROM, - HVC_FAMBASIC, NES_QJ, PAL_ZZ, UXROM_CC, - STD_DRROM, STD_SXROM_A, STD_SOROM, STD_SOROM_A, - /* Discrete components boards (by various manufacturer) */ - DIS_74X161X138, DIS_74X139X74, - DIS_74X377, DIS_74X161X161X32, - /* Active Enterprises */ - ACTENT_ACT52, - /* AGCI */ - AGCI_50282, - /* AVE */ - AVE_NINA01, AVE_NINA06, - /* Bandai */ - BANDAI_JUMP2, BANDAI_PT554, - BANDAI_DATACH, BANDAI_KARAOKE, BANDAI_OEKAKIDS, - BANDAI_FCG, BANDAI_LZ93, BANDAI_LZ93EX, - /* Caltron */ - CALTRON_6IN1, - /* Camerica */ - CAMERICA_BF9093, CAMERICA_BF9097, CAMERICA_BF9096, - CAMERICA_GOLDENFIVE, GG_NROM, - /* Dreamtech */ - DREAMTECH_BOARD, - /* Irem */ - IREM_G101, IREM_H3001, IREM_LROG017, - IREM_TAM_S1, IREM_HOLYDIV, - /* Jaleco */ - JALECO_SS88006, JALECO_JF11, JALECO_JF13, - JALECO_JF16, JALECO_JF17, JALECO_JF19, - /* Konami */ - KONAMI_VRC1, KONAMI_VRC2, KONAMI_VRC3, - KONAMI_VRC4, KONAMI_VRC6, KONAMI_VRC7, - /* Namcot */ - NAMCOT_163, NAMCOT_3453, - NAMCOT_3425, NAMCOT_34X3, NAMCOT_3446, - /* NTDEC */ - NTDEC_ASDER, NTDEC_FIGHTINGHERO, - /* Rex Soft */ - REXSOFT_SL1632, REXSOFT_DBZ5, - /* Sachen */ - SACHEN_8259A, SACHEN_8259B, SACHEN_8259C, SACHEN_8259D, - SACHEN_SA009, SACHEN_SA0036, SACHEN_SA0037, - SACHEN_SA72007, SACHEN_SA72008, SACHEN_TCA01, - SACHEN_TCU01, SACHEN_TCU02, - SACHEN_74LS374, SACHEN_74LS374_A, - /* Sunsoft */ - SUNSOFT_1, SUNSOFT_2, SUNSOFT_3, SUNSOFT_4, - SUNSOFT_DCS, SUNSOFT_5B, SUNSOFT_FME7, - /* Taito */ - TAITO_TC0190FMC, TAITO_TC0190FMCP, - TAITO_X1_005, TAITO_X1_005_A, TAITO_X1_017, - /* Tengen */ - TENGEN_800008, TENGEN_800032, TENGEN_800037, - /* TXC */ - TXC_22211A, TXC_22211B, TXC_22211C, - TXC_MXMDHTWO, TXC_TW, TXC_STRIKEWOLF, - /* Multigame Carts */ - BMC_64IN1NR, BMC_190IN1, BMC_A65AS, BMC_GS2004, BMC_GS2013, - BMC_HIK8IN1, BMC_NOVELDIAMOND, BMC_S24IN1SC03, BMC_T262, - BMC_WS, BMC_SUPERBIG_7IN1, BMC_SUPERHIK_4IN1, BMC_BALLGAMES_11IN1, - BMC_MARIOPARTY_7IN1, BMC_GOLD_7IN1, BMC_SUPER_700IN1, BMC_FAMILY_4646B, - BMC_36IN1, BMC_21IN1, BMC_150IN1, BMC_35IN1, BMC_64IN1, - BMC_15IN1, BMC_SUPERHIK_300IN1, BMC_9999999IN1, BMC_SUPERGUN_20IN1, - BMC_GOLDENCARD_6IN1, BMC_72IN1, BMC_SUPER_42IN1, BMC_76IN1, - BMC_1200IN1, BMC_31IN1, BMC_22GAMES, BMC_20IN1, BMC_110IN1, - BMC_GKA, BMC_GKB, BMC_VT5201, BMC_BENSHENG_BS5, BMC_810544, - BMC_NTD_03, BMC_G63IN1, BMC_FK23C, BMC_FK23CA, BMC_PJOY84, - BMC_POWERFUL_255, - /* Unlicensed */ - UNL_8237, UNL_CC21, UNL_AX5705, UNL_KOF97, UNL_KS7057, - UNL_N625092, UNL_SC127, UNL_SMB2J, UNL_T230, UNL_FS304, - UNL_UXROM, UNL_MK2, UNL_XZY, UNL_KOF96, - UNL_SUPERFIGHTER3, UNL_RACERMATE, UNL_EDU2K, - UNL_SHJY3, UNL_STUDYNGAME, UNL_603_5052, UNL_H2288, - /* Bootleg boards */ - BTL_SMB2A, BTL_MARIOBABY, BTL_AISENSHINICOL, BTL_TOBIDASE, - BTL_SMB2B, BTL_SMB3, BTL_SUPERBROS11, BTL_DRAGONNINJA, - BTL_PIKACHUY2K, - /* Misc: these are needed to convert mappers to boards, I will sort them later */ - OPENCORP_DAOU306, HES_BOARD, HES6IN1_BOARD, RUMBLESTATION_BOARD, - MAGICSERIES_MD, KASING_BOARD, FUTUREMEDIA_BOARD, FUKUTAKE_BOARD, SOMERI_SL12, - HENGEDIANZI_BOARD, HENGEDIANZI_XJZB, SUBOR_TYPE0, SUBOR_TYPE1, - KAISER_KS7058, KAISER_KS7032, KAISER_KS7022, KAISER_KS7017, KAISER_KS7012, KAISER_KS202, - CNE_DECATHLON, CNE_FSB, CNE_SHLZ, CONY_BOARD, YOKO_BOARD, RCM_GS2015, RCM_TETRISFAMILY, - WAIXING_TYPE_A, WAIXING_TYPE_A_1, WAIXING_TYPE_B, WAIXING_TYPE_C, WAIXING_TYPE_D, - WAIXING_TYPE_E, WAIXING_TYPE_F, WAIXING_TYPE_G, WAIXING_TYPE_H, - WAIXING_TYPE_I, WAIXING_TYPE_J, - WAIXING_SGZLZ, WAIXING_SGZ, WAIXING_ZS, WAIXING_SECURITY, WAIXING_SH2, - WAIXING_DQ8, WAIXING_FFV, WAIXING_PS2, SUPERGAME_LIONKING, SUPERGAME_BOOGERMAN, - KAY_PANDAPRINCE, HOSENKAN_BOARD, NITRA_TDA, GOUDER_37017, NANJING_BOARD, - WHIRLWIND_2706, - /* FFE boards, for mappers 6, 8, 17 */ - FFE_MAPPER6, FFE_MAPPER8, FFE_MAPPER17, - /* Unsupported (for place-holder boards, with no working emulation) & no-board (at init) */ - UNSUPPORTED_BOARD, UNKNOWN_BOARD, NO_BOARD -}; - -// these are used to setup the proper PCB ID, for each supported type of files -int nes_get_pcb_id(running_machine &machine, const char *feature); // for softlist -void unif_mapr_setup(running_machine &machine, const char *board); // for UNIF files -int nes_get_mmc_id(running_machine &machine, int mapper); // for iNES files - -// these are used to setup handlers and callbacks necessary to the emulation (resp. at start and reset) -void pcb_handlers_setup(running_machine &machine); -int nes_pcb_reset(running_machine &machine); - -//TEMPORARY PPU STUFF - -/* mirroring types */ -#define PPU_MIRROR_NONE 0 -#define PPU_MIRROR_VERT 1 -#define PPU_MIRROR_HORZ 2 -#define PPU_MIRROR_HIGH 3 -#define PPU_MIRROR_LOW 4 -#define PPU_MIRROR_4SCREEN 5 // Same effect as NONE, but signals that we should never mirror - -void set_nt_mirroring(running_machine &machine, int mirroring); - - -#endif diff --git a/src/mess/video/nes.c b/src/mess/video/nes.c index 0ff78cb5b77..3fe5e943318 100644 --- a/src/mess/video/nes.c +++ b/src/mess/video/nes.c @@ -9,7 +9,7 @@ #include "emu.h" #include "video/ppu2c0x.h" #include "includes/nes.h" -#include "machine/nes_mmc.h" +//#include "includes/nes_mmc.h" static void nes_vh_reset( running_machine &machine ) {