1 // license:BSD-3-Clause 2 // copyright-holders:Fabio Priuli 3 #ifndef MAME_BUS_NES_MMC5_H 4 #define MAME_BUS_NES_MMC5_H 5 6 #pragma once 7 8 #include "nxrom.h" 9 10 #include "sound/nes_apu.h" // temp hack to pass the additional sound regs to APU... 11 #include "video/ppu2c0x.h" // this has to be included so that IRQ functions can access ppu2c0x_device::BOTTOM_VISIBLE_SCANLINE 12 13 14 // ======================> nes_exrom_device 15 16 class nes_exrom_device : public nes_nrom_device 17 { 18 public: 19 // construction/destruction 20 nes_exrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 21 ~nes_exrom_device(); 22 23 virtual uint8_t read_l(offs_t offset) override; 24 virtual uint8_t read_m(offs_t offset) override; 25 virtual uint8_t read_h(offs_t offset) override; 26 virtual void write_l(offs_t offset, uint8_t data) override; 27 virtual void write_m(offs_t offset, uint8_t data) override; 28 virtual void write_h(offs_t offset, uint8_t data) override; 29 30 virtual uint8_t chr_r(offs_t offset) override; 31 virtual uint8_t nt_r(offs_t offset) override; 32 virtual void nt_w(offs_t offset, uint8_t data) override; 33 34 virtual void hblank_irq(int scanline, int vblank, int blanked) override; 35 virtual void pcb_reset() override; 36 37 protected: 38 // device-level overrides 39 virtual void device_add_mconfig(machine_config &config) override; 40 virtual void device_start() override; 41 42 void set_mirror(int page, int src); 43 void update_prg(); 44 45 inline uint8_t base_chr_r(int bank, uint32_t offset); 46 inline uint8_t split_chr_r(uint32_t offset); 47 inline uint8_t bg_ex1_chr_r(uint32_t offset); 48 inline bool in_split(); 49 50 uint16_t m_irq_count; 51 uint8_t m_irq_status; 52 int m_irq_enable; 53 54 int m_mult1, m_mult2; 55 56 int m_mmc5_scanline; 57 int m_vrom_page_a; 58 int m_vrom_page_b; 59 uint16_t m_vrom_bank[12]; // MMC5 has 10bit wide VROM regs! 60 61 int m_floodtile; 62 int m_floodattr; 63 64 int m_prg_mode; // $5100 65 int m_chr_mode; // $5101 66 int m_wram_protect_1; // $5102 67 int m_wram_protect_2; // $5103 68 int m_exram_control; // $5104 69 int m_wram_base; // $5113 70 71 uint8_t m_last_chr; 72 uint8_t m_ex1_chr; 73 uint8_t m_split_chr; 74 uint8_t m_prg_regs[4]; 75 uint8_t m_prg_ram_mapped[4]; 76 77 uint8_t m_ex1_bank; 78 uint8_t m_ex1_attrib; 79 80 uint8_t m_high_chr; // $5130 81 82 uint8_t m_split_scr; // $5200 83 uint8_t m_split_rev; // $5200 84 uint8_t m_split_ctrl; // $5200 85 uint8_t m_split_yst; // $5201 86 uint8_t m_split_bank; // $5202 87 int m_vcount; 88 89 // MMC-5 contains 1K of internal ram 90 uint8_t m_exram[0x400]; 91 92 uint8_t m_ram_hi_banks[4]; 93 94 // int m_nes_vram_sprite[8]; 95 96 required_device<ppu2c0x_device> m_ppu; 97 required_device<nesapu_device> m_sound; 98 }; 99 100 101 // device type definition 102 DECLARE_DEVICE_TYPE(NES_EXROM, nes_exrom_device) 103 104 #endif // MAME_BUS_NES_MMC5_H 105