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