1 // license:BSD-3-Clause
2 // copyright-holders:Philip Bennett, James Wallace, David Haywood
3 #ifndef MAME_INCLUDES_JPMSYS5_H
4 #define MAME_INCLUDES_JPMSYS5_H
5 
6 #pragma once
7 
8 #include "cpu/m68000/m68000.h"
9 #include "machine/6821pia.h"
10 #include "machine/6840ptm.h"
11 #include "machine/6850acia.h"
12 #include "sound/ym2413.h"
13 #include "sound/upd7759.h"
14 #include "video/tms34061.h"
15 #include "machine/nvram.h"
16 #include "video/awpvid.h"
17 #include "machine/steppers.h"
18 #include "machine/roc10937.h"
19 #include "machine/meters.h"
20 #include "emupal.h"
21 
22 class jpmsys5_state : public driver_device
23 {
24 public:
jpmsys5_state(const machine_config & mconfig,device_type type,const char * tag)25 	jpmsys5_state(const machine_config &mconfig, device_type type, const char *tag) :
26 		driver_device(mconfig, type, tag),
27 		m_maincpu(*this, "maincpu"),
28 		m_acia6850(*this, "acia6850_%u", 0U),
29 		m_vfd(*this, "vfd"),
30 		m_upd7759(*this, "upd7759"),
31 		m_direct_port(*this, "DIRECT"),
32 		m_meters(*this, "meters"),
33 		m_lamps(*this, "lamp%u", 0U),
34 		m_sys5leds(*this, "sys5led%u", 0U)
35 	{ }
36 
37 	void jpmsys5(machine_config &config);
38 	void jpmsys5_ym(machine_config &config);
39 
40 	DECLARE_WRITE_LINE_MEMBER(ptm_irq);
41 	DECLARE_WRITE_LINE_MEMBER(u26_o1_callback);
42 	DECLARE_WRITE_LINE_MEMBER(pia_irq);
43 	DECLARE_WRITE_LINE_MEMBER(u29_ca2_w);
44 	DECLARE_WRITE_LINE_MEMBER(u29_cb2_w);
45 	DECLARE_WRITE_LINE_MEMBER(a0_tx_w);
46 	DECLARE_WRITE_LINE_MEMBER(a1_tx_w);
47 	DECLARE_WRITE_LINE_MEMBER(a2_tx_w);
48 
49 	uint8_t u29_porta_r();
50 	void u29_portb_w(uint8_t data);
51 
52 protected:
53 	virtual void machine_start() override;
54 	virtual void machine_reset() override;
55 
56 	void jpm_upd7759_w(offs_t offset, uint16_t data);
57 	uint16_t jpm_upd7759_r();
58 
59 	required_device<cpu_device> m_maincpu;
60 	required_device_array<acia6850_device, 3> m_acia6850;
61 	optional_device<s16lf01_device> m_vfd;
62 	required_device<upd7759_device> m_upd7759;
63 
64 	void jpm_sys5_common_map(address_map &map);
65 
66 private:
67 	uint16_t coins_r(offs_t offset);
68 	void coins_w(uint16_t data);
69 	uint16_t unk_r();
70 	void mux_w(offs_t offset, uint16_t data);
71 	uint16_t mux_r(offs_t offset);
72 
73 	uint16_t mux_awp_r(offs_t offset);
74 	uint16_t coins_awp_r(offs_t offset);
75 	void sys5_draw_lamps();
76 
77 	void m68000_awp_map(address_map &map);
78 	void m68000_awp_map_saa(address_map &map);
79 
80 	required_ioport m_direct_port;
81 	optional_device<meters_device> m_meters; //jpmsys5v doesn't use this
82 	output_finder<16 * 16> m_lamps;
83 	output_finder<16 * 8> m_sys5leds;
84 
85 	int m_lamp_strobe;
86 	int m_mpxclk;
87 	int m_muxram[255];
88 	int m_chop;
89 	uint8_t m_a0_data_out;
90 	uint8_t m_a1_data_out;
91 	uint8_t m_a2_data_out;
92 };
93 
94 
95 class jpmsys5v_state : public jpmsys5_state
96 {
97 public:
jpmsys5v_state(const machine_config & mconfig,device_type type,const char * tag)98 	jpmsys5v_state(const machine_config &mconfig, device_type type, const char *tag) :
99 		jpmsys5_state(mconfig, type, tag),
100 		m_tms34061(*this, "tms34061"),
101 		m_palette(*this, "palette"),
102 		m_rombank(*this, "bank1"),
103 		m_touch_axes(*this, { "TOUCH_X", "TOUCH_Y" }),
104 		m_touch_timer(nullptr)
105 	{ }
106 
107 	DECLARE_INPUT_CHANGED_MEMBER(touchscreen_press);
108 
109 	void jpmsys5v(machine_config &config);
110 
111 private:
112 	virtual void machine_start() override;
113 	virtual void machine_reset() override;
114 
115 	DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
116 	void sys5_tms34061_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
117 	uint16_t sys5_tms34061_r(offs_t offset, uint16_t mem_mask = ~0);
118 	void ramdac_w(offs_t offset, uint16_t data);
119 	void rombank_w(uint16_t data);
120 	uint32_t screen_update_jpmsys5v(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
121 	TIMER_CALLBACK_MEMBER(touch_cb);
122 
123 	void m68000_map(address_map &map);
124 
125 	required_device<tms34061_device> m_tms34061;
126 	required_device<palette_device> m_palette;
127 	required_memory_bank m_rombank;
128 	required_ioport_array<2> m_touch_axes;
129 
130 	uint8_t m_palette_val[16][3];
131 	int m_pal_addr;
132 	int m_pal_idx;
133 	int m_touch_state;
134 	emu_timer *m_touch_timer;
135 	int m_touch_data_count;
136 	int m_touch_data[3];
137 	int m_touch_shift_cnt;
138 };
139 
140 #endif // MAME_INCLUDES_JPMSYS5_H
141