1 // license:BSD-3-Clause
2 // copyright-holders:R. Belmont, ElSemi
3 
4 #include "machine/bankdev.h"
5 #include "machine/namcomcu.h"
6 #include "machine/timer.h"
7 #include "screen.h"
8 #include "video/namco_c123tmap.h"
9 #include "video/namco_c116.h"
10 #include "video/namco_c169roz.h"
11 #include "video/namco_c355spr.h"
12 #include "emupal.h"
13 
14 class namcofl_state : public driver_device
15 {
16 public:
namcofl_state(const machine_config & mconfig,device_type type,const char * tag)17 	namcofl_state(const machine_config &mconfig, device_type type, const char *tag) :
18 		driver_device(mconfig, type, tag),
19 		m_maincpu(*this, "maincpu"),
20 		m_mainbank(*this, "mainbank_%u", 1U),
21 		m_c116(*this, "c116"),
22 		m_screen(*this, "screen"),
23 		m_c123tmap(*this, "c123tmap"),
24 		m_c169roz(*this, "c169roz"),
25 		m_c355spr(*this, "c355spr"),
26 		m_mcu(*this, "mcu"),
27 		m_in0(*this, "IN0"),
28 		m_in1(*this, "IN1"),
29 		m_in2(*this, "IN2"),
30 		m_misc(*this, "MISC"),
31 		m_accel(*this, "ACCEL"),
32 		m_brake(*this, "BRAKE"),
33 		m_wheel(*this, "WHEEL"),
34 		m_workram(*this, "workram"),
35 		m_shareram(*this, "shareram", 32) { }
36 
37 	void namcofl(machine_config &config);
38 
39 	void driver_init() override;
40 
41 private:
42 	required_device<cpu_device> m_maincpu;
43 	required_device_array<address_map_bank_device, 2> m_mainbank;
44 	required_device<namco_c116_device> m_c116;
45 	required_device<screen_device> m_screen;
46 	required_device<namco_c123tmap_device> m_c123tmap;
47 	required_device<namco_c169roz_device> m_c169roz;
48 	required_device<namco_c355spr_device> m_c355spr;
49 	required_device<m37710_cpu_device> m_mcu;
50 	required_ioport m_in0;
51 	required_ioport m_in1;
52 	required_ioport m_in2;
53 	required_ioport m_misc;
54 	optional_ioport m_accel;
55 	optional_ioport m_brake;
56 	optional_ioport m_wheel;
57 	emu_timer *m_raster_interrupt_timer;
58 	emu_timer *m_vblank_interrupt_timer;
59 	emu_timer *m_network_interrupt_timer;
60 	required_shared_ptr<uint32_t> m_workram;
61 	required_shared_ptr<uint16_t> m_shareram;
62 	uint8_t m_mcu_port6;
63 	uint32_t m_sprbank;
64 
set_bank(unsigned bank)65 	inline void set_bank(unsigned bank)
66 	{
67 		bank &= 1;
68 		m_mainbank[0]->set_bank(bank); // ROM, RAM
69 		m_mainbank[1]->set_bank(bank ^ 1); // RAM, ROM
70 	}
71 
72 	uint32_t unk1_r();
73 	uint32_t network_r();
74 	uint32_t sysreg_r();
75 	void sysreg_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
76 	void c116_w(offs_t offset, uint8_t data);
77 	void mcu_shared_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
78 	uint8_t port6_r();
79 	void port6_w(uint8_t data);
80 	uint8_t port7_r();
81 	uint8_t dac7_r();
82 	uint8_t dac6_r();
83 	uint8_t dac5_r();
84 	uint8_t dac4_r();
85 	uint8_t dac3_r();
86 	uint8_t dac2_r();
87 	uint8_t dac1_r();
88 	uint8_t dac0_r();
89 	void spritebank_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
90 	DECLARE_MACHINE_START(namcofl);
91 	DECLARE_MACHINE_RESET(namcofl);
92 	DECLARE_VIDEO_START(namcofl);
93 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
94 	TIMER_CALLBACK_MEMBER(network_interrupt_callback);
95 	TIMER_CALLBACK_MEMBER(vblank_interrupt_callback);
96 	TIMER_CALLBACK_MEMBER(raster_interrupt_callback);
97 	TIMER_DEVICE_CALLBACK_MEMBER(mcu_irq0_cb);
98 	TIMER_DEVICE_CALLBACK_MEMBER(mcu_irq2_cb);
99 	int FLobjcode2tile(int code);
100 	void TilemapCB(uint16_t code, int *tile, int *mask);
101 	void RozCB(uint16_t code, int *tile, int *mask, int which);
102 	void namcoc75_am(address_map &map);
103 	void namcofl_mem(address_map &map);
104 	void namcofl_bank_mem(address_map &map);
105 };
106