1 // license:BSD-3-Clause
2 // copyright-holders:Dan Boris
3 /*************************************************************************
4 
5     Atari I, Robot hardware
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_IROBOT_H
9 #define MAME_INCLUDES_IROBOT_H
10 
11 #pragma once
12 
13 #include "machine/timer.h"
14 #include "machine/x2212.h"
15 #include "sound/pokey.h"
16 #include "emupal.h"
17 #include "screen.h"
18 
19 #define IR_TIMING               1       /* try to emulate MB and VG running time */
20 
21 class irobot_state : public driver_device
22 {
23 public:
irobot_state(const machine_config & mconfig,device_type type,const char * tag)24 	irobot_state(const machine_config &mconfig, device_type type, const char *tag) :
25 		driver_device(mconfig, type, tag),
26 		m_videoram(*this, "videoram"),
27 		m_maincpu(*this, "maincpu"),
28 		m_gfxdecode(*this, "gfxdecode"),
29 		m_screen(*this, "screen"),
30 		m_palette(*this, "palette"),
31 #if IR_TIMING
32 		m_irvg_timer(*this, "irvg_timer"),
33 		m_irmb_timer(*this, "irmb_timer"),
34 #endif
35 		m_novram(*this, "nvram"),
36 		m_pokey(*this, "pokey%u", 1U),
37 		m_leds(*this, "led%u", 0U)
38 	{ }
39 
40 	void init_irobot();
41 
42 	void irobot(machine_config &config);
43 
44 private:
45 	struct irmb_ops
46 	{
47 		const struct irmb_ops *nxtop;
48 		uint32_t func;
49 		uint32_t diradd;
50 		uint32_t latchmask;
51 		uint32_t *areg;
52 		uint32_t *breg;
53 		uint8_t cycles;
54 		uint8_t diren;
55 		uint8_t flags;
56 		uint8_t ramsel;
57 	};
58 
59 	virtual void machine_start() override;
60 	virtual void machine_reset() override;
61 	virtual void video_start() override;
62 	void irobot_map(address_map &map);
63 
64 	void irobot_clearirq_w(uint8_t data);
65 	void irobot_clearfirq_w(uint8_t data);
66 	uint8_t irobot_sharedmem_r(offs_t offset);
67 	void irobot_sharedmem_w(offs_t offset, uint8_t data);
68 	void irobot_statwr_w(uint8_t data);
69 	void irobot_out0_w(uint8_t data);
70 	void irobot_rom_banksel_w(uint8_t data);
71 	uint8_t irobot_status_r();
72 	void irobot_paletteram_w(offs_t offset, uint8_t data);
73 	uint8_t quad_pokeyn_r(offs_t offset);
74 	void quad_pokeyn_w(offs_t offset, uint8_t data);
75 	void irobot_palette(palette_device &palette) const;
76 	uint32_t screen_update_irobot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
77 	TIMER_CALLBACK_MEMBER(scanline_callback);
78 	TIMER_DEVICE_CALLBACK_MEMBER(irobot_irvg_done_callback);
79 	TIMER_DEVICE_CALLBACK_MEMBER(irobot_irmb_done_callback);
80 	void irobot_poly_clear(uint8_t *bitmap_base);
81 	void irobot_poly_clear();
82 	void draw_line(uint8_t *polybitmap, int x1, int y1, int x2, int y2, int col);
83 	void irobot_run_video();
84 	uint32_t irmb_din(const irmb_ops *curop);
85 	void irmb_dout(const irmb_ops *curop, uint32_t d);
86 	void load_oproms();
87 	void irmb_run();
88 
89 	required_shared_ptr<uint8_t> m_videoram;
90 	uint8_t m_vg_clear;
91 	uint8_t m_bufsel;
92 	uint8_t m_alphamap;
93 	uint8_t *m_combase;
94 	uint8_t m_irvg_vblank;
95 	uint8_t m_irvg_running;
96 	uint8_t m_irmb_running;
97 	uint8_t *m_comRAM[2];
98 	uint8_t *m_mbRAM;
99 	uint8_t *m_mbROM;
100 	uint8_t m_statwr;
101 	uint8_t m_out0;
102 	uint8_t m_outx;
103 	uint8_t m_mpage;
104 	uint8_t *m_combase_mb;
105 	std::unique_ptr<irmb_ops[]> m_mbops;
106 	const irmb_ops *m_irmb_stack[16];
107 	uint32_t m_irmb_regs[16];
108 	uint32_t m_irmb_latch;
109 	std::unique_ptr<uint8_t[]> m_polybitmap1;
110 	std::unique_ptr<uint8_t[]> m_polybitmap2;
111 	int m_ir_xmin;
112 	int m_ir_ymin;
113 	int m_ir_xmax;
114 	int m_ir_ymax;
115 	emu_timer *m_scanline_timer;
116 
117 	required_device<cpu_device> m_maincpu;
118 	required_device<gfxdecode_device> m_gfxdecode;
119 	required_device<screen_device> m_screen;
120 	required_device<palette_device> m_palette;
121 #if IR_TIMING
122 	required_device<timer_device> m_irvg_timer;
123 	required_device<timer_device> m_irmb_timer;
124 #endif
125 	required_device<x2212_device> m_novram;
126 	required_device_array<pokey_device, 4> m_pokey;
127 	output_finder<2> m_leds;
128 };
129 
130 #endif // MAME_INCLUDES_IROBOT_H
131