1 // license:BSD-3-Clause
2 // copyright-holders:Wilbert Pol, Curt Coder
3 
4 #ifndef MAME_INCLUDES_CRVISION_H
5 #define MAME_INCLUDES_CRVISION_H
6 
7 #include "cpu/m6502/m6502.h"
8 #include "imagedev/cassette.h"
9 #include "machine/6821pia.h"
10 #include "machine/buffer.h"
11 #include "bus/centronics/ctronics.h"
12 #include "bus/crvision/slot.h"
13 #include "bus/crvision/rom.h"
14 #include "machine/ram.h"
15 #include "sound/sn76496.h"
16 #include "video/tms9928a.h"
17 
18 #define SCREEN_TAG      "screen"
19 #define M6502_TAG       "u2"
20 #define TMS9929_TAG     "u3"
21 #define PIA6821_TAG     "u21"
22 #define SN76489_TAG     "u22"
23 #define CENTRONICS_TAG  "centronics"
24 
25 #define BANK_ROM1       "bank1"
26 #define BANK_ROM2       "bank2"
27 
28 class crvision_state : public driver_device
29 {
30 public:
crvision_state(const machine_config & mconfig,device_type type,const char * tag)31 	crvision_state(const machine_config &mconfig, device_type type, const char *tag)
32 		: driver_device(mconfig, type, tag)
33 		, m_maincpu(*this, M6502_TAG)
34 		, m_pia(*this, PIA6821_TAG)
35 		, m_psg(*this, SN76489_TAG)
36 		, m_cassette(*this, "cassette")
37 		, m_cart(*this, "cartslot")
38 		, m_centronics(*this, CENTRONICS_TAG)
39 		, m_cent_data_out(*this, "cent_data_out")
40 		, m_ram(*this, RAM_TAG)
41 		, m_io_keypad{{*this, "PA0.%u", 0U},{*this, "PA1.%u", 0U},{*this, "PA2.%u", 0U},{*this, "PA3.%u", 0U}}
42 	{ }
43 
44 	void creativision(machine_config &config);
45 	void ntsc(machine_config &config);
46 	DECLARE_INPUT_CHANGED_MEMBER( trigger_nmi );
47 
48 protected:
49 	required_device<cpu_device> m_maincpu;
50 	required_device<pia6821_device> m_pia;
51 	required_device<sn76496_base_device> m_psg;
52 	required_device<cassette_image_device> m_cassette;
53 	required_device<crvision_cart_slot_device> m_cart;
54 	required_device<centronics_device> m_centronics;
55 	required_device<output_latch_device> m_cent_data_out;
56 	required_device<ram_device> m_ram;
57 	optional_ioport_array<8> m_io_keypad[4];
58 
59 	virtual void machine_start() override;
60 	uint8_t m_keylatch;
61 
62 private:
63 	void crvision_map(address_map &map);
64 	uint8_t read_keyboard(u8 pa);
65 
66 	void pia_pa_w(uint8_t data);
67 	uint8_t pia_pa_r();
68 	uint8_t pia_pb_r();
69 };
70 
71 class crvision_pal_state : public crvision_state
72 {
73 public:
crvision_pal_state(const machine_config & mconfig,device_type type,const char * tag)74 	crvision_pal_state(const machine_config &mconfig, device_type type, const char *tag)
75 		: crvision_state(mconfig, type, tag)
76 	{ }
77 	void pal(machine_config &config);
78 };
79 
80 class laser2001_state : public crvision_state
81 {
82 public:
laser2001_state(const machine_config & mconfig,device_type type,const char * tag)83 	laser2001_state(const machine_config &mconfig, device_type type, const char *tag)
84 		: crvision_state(mconfig, type, tag)
85 		, m_centronics(*this, CENTRONICS_TAG)
86 		, m_inp_y(*this, "Y.%u", 0U)
87 		, m_inp_joy(*this, "JOY.%u", 0U)
88 	{ }
89 
90 	void lasr2001(machine_config &config);
91 
92 private:
93 	required_device<centronics_device> m_centronics;
94 	required_ioport_array<8> m_inp_y;
95 	required_ioport_array<4> m_inp_joy;
96 
97 	uint8_t m_joylatch;
98 	int m_centronics_busy;
99 	int m_psg_ready;
100 
101 	DECLARE_WRITE_LINE_MEMBER( write_centronics_busy );
102 	DECLARE_WRITE_LINE_MEMBER( write_psg_ready );
103 	uint8_t pia_pa_r();
104 	void pia_pa_w(uint8_t data);
105 	uint8_t pia_pb_r();
106 	void pia_pb_w(uint8_t data);
107 	DECLARE_READ_LINE_MEMBER( pia_ca1_r );
108 	DECLARE_WRITE_LINE_MEMBER( pia_ca2_w );
109 	DECLARE_READ_LINE_MEMBER( pia_cb1_r );
110 	DECLARE_WRITE_LINE_MEMBER( pia_cb2_w );
111 
112 	void lasr2001_map(address_map &map);
113 	virtual void machine_start() override;
114 };
115 
116 #endif // MAME_INCLUDES_CRVISION_H
117