1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_TEK405X_H
4 #define MAME_INCLUDES_TEK405X_H
5 
6 #pragma once
7 
8 #include "bus/generic/carts.h"
9 #include "bus/generic/slot.h"
10 #include "bus/ieee488/ieee488.h"
11 
12 #include "cpu/m6800/m6800.h"
13 
14 #include "machine/6821pia.h"
15 #include "machine/6850acia.h"
16 #include "machine/clock.h"
17 #include "machine/ram.h"
18 #include "machine/timer.h"
19 
20 #include "sound/spkrdev.h"
21 
22 #include "video/vector.h"
23 
24 #include "emupal.h"
25 
26 
27 #define MC6800_TAG          "u61"
28 #define MC6820_Y_TAG        "u561"
29 #define MC6820_X_TAG        "u565"
30 #define MC6820_TAPE_TAG     "u361"
31 #define MC6820_KB_TAG       "u461"
32 #define MC6820_GPIB_TAG     "u265"
33 #define MC6820_COM_TAG      "u5"
34 #define MC6850_TAG          "u25"
35 #define RS232_TAG           "rs232"
36 #define SCREEN_TAG          "screen"
37 
38 #define AM2901A_TAG         "am2901a"
39 
40 class tek4051_state : public driver_device
41 {
42 public:
tek4051_state(const machine_config & mconfig,device_type type,const char * tag)43 	tek4051_state(const machine_config &mconfig, device_type type, const char *tag) :
44 		driver_device(mconfig, type, tag),
45 		m_maincpu(*this, MC6800_TAG),
46 		m_gpib_pia(*this, MC6820_GPIB_TAG),
47 		m_com_pia(*this, MC6820_COM_TAG),
48 		m_acia(*this, MC6850_TAG),
49 		m_acia_clock(*this, "acia_clock"),
50 		m_gpib(*this, IEEE488_TAG),
51 		m_speaker(*this, "speaker"),
52 		m_ram(*this, RAM_TAG),
53 		m_rom(*this, MC6800_TAG),
54 		m_bsofl_rom(*this, "020_0147_00"),
55 		m_bscom_rom(*this, "021_0188_00"),
56 		m_special(*this, "SPECIAL"),
57 		m_lamps(*this, "lamp%u", 1U)
58 	{ }
59 
60 	void tek4051(machine_config &config);
61 
62 private:
63 	void bankswitch(uint8_t data);
64 	void update_irq();
65 	void update_nmi();
66 	void scan_keyboard();
67 
68 	void lbs_w(uint8_t data);
69 
70 	uint8_t x_pia_pa_r();
71 	void x_pia_pa_w(uint8_t data);
72 	void x_pia_pb_w(uint8_t data);
73 	DECLARE_WRITE_LINE_MEMBER( adot_w );
74 	DECLARE_WRITE_LINE_MEMBER( bufclk_w );
75 	DECLARE_WRITE_LINE_MEMBER( x_pia_irqa_w );
76 	DECLARE_WRITE_LINE_MEMBER( x_pia_irqb_w );
77 
78 	uint8_t sa_r();
79 	void y_pia_pa_w(uint8_t data);
80 	void sb_w(uint8_t data);
81 	DECLARE_WRITE_LINE_MEMBER( sot_w );
82 	DECLARE_WRITE_LINE_MEMBER( y_pia_irqa_w );
83 	DECLARE_WRITE_LINE_MEMBER( y_pia_irqb_w );
84 
85 	uint8_t kb_pia_pa_r();
86 	uint8_t kb_pia_pb_r();
87 	void kb_pia_pb_w(uint8_t data);
88 	DECLARE_WRITE_LINE_MEMBER( kb_halt_w );
89 	DECLARE_WRITE_LINE_MEMBER( kb_pia_irqa_w );
90 	DECLARE_WRITE_LINE_MEMBER( kb_pia_irqb_w );
91 
92 	uint8_t tape_pia_pa_r();
93 	void tape_pia_pa_w(uint8_t data);
94 	void tape_pia_pb_w(uint8_t data);
95 	DECLARE_WRITE_LINE_MEMBER( tape_pia_irqa_w );
96 	DECLARE_WRITE_LINE_MEMBER( tape_pia_irqb_w );
97 
98 	void dio_w(uint8_t data);
99 	uint8_t gpib_pia_pb_r();
100 	void gpib_pia_pb_w(uint8_t data);
101 	DECLARE_WRITE_LINE_MEMBER( talk_w );
102 	DECLARE_WRITE_LINE_MEMBER( gpib_pia_irqa_w );
103 	DECLARE_WRITE_LINE_MEMBER( gpib_pia_irqb_w );
104 
105 	void com_pia_pa_w(uint8_t data);
106 	uint8_t com_pia_pb_r();
107 	void com_pia_pb_w(uint8_t data);
108 	DECLARE_WRITE_LINE_MEMBER( com_pia_irqa_w );
109 	DECLARE_WRITE_LINE_MEMBER( com_pia_irqb_w );
110 	DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
111 	DECLARE_WRITE_LINE_MEMBER( write_acia_clock );
112 
113 	TIMER_DEVICE_CALLBACK_MEMBER(keyboard_tick);
114 	void tek4051_mem(address_map &map);
115 
116 	virtual void machine_start() override;
117 	virtual void video_start() override;
118 
119 	required_device<cpu_device> m_maincpu;
120 	required_device<pia6821_device> m_gpib_pia;
121 	required_device<pia6821_device> m_com_pia;
122 	required_device<acia6850_device> m_acia;
123 	required_device<clock_device> m_acia_clock;
124 	required_device<ieee488_device> m_gpib;
125 	required_device<speaker_sound_device> m_speaker;
126 	required_device<ram_device> m_ram;
127 	required_memory_region m_rom;
128 	required_memory_region m_bsofl_rom;
129 	required_memory_region m_bscom_rom;
130 	required_ioport m_special;
131 	output_finder<3> m_lamps;
132 
133 	// interrupts
134 	int m_x_pia_irqa;
135 	int m_x_pia_irqb;
136 	int m_y_pia_irqa;
137 	int m_y_pia_irqb;
138 	int m_tape_pia_irqa;
139 	int m_tape_pia_irqb;
140 	int m_kb_pia_irqa;
141 	int m_kb_pia_irqb;
142 	int m_gpib_pia_irqa;
143 	int m_gpib_pia_irqb;
144 	int m_com_pia_irqa;
145 	int m_com_pia_irqb;
146 	int m_acia_irq;
147 
148 	// keyboard
149 	int m_kc;
150 
151 	// GPIB
152 	int m_talk;
153 };
154 
155 class tek4052_state : public driver_device
156 {
157 public:
tek4052_state(const machine_config & mconfig,device_type type,const char * tag)158 	tek4052_state(const machine_config &mconfig, device_type type, const char *tag) :
159 		driver_device(mconfig, type, tag),
160 		m_maincpu(*this, AM2901A_TAG),
161 		m_ram(*this, RAM_TAG)
162 	{ }
163 
164 	void tek4052(machine_config &config);
165 
166 private:
167 	void tek4052_mem(address_map &map);
168 
169 	virtual void machine_start() override;
170 	virtual void video_start() override;
171 
172 	required_device<cpu_device> m_maincpu;
173 	required_device<ram_device> m_ram;
174 };
175 
176 #endif // MAME_INCLUDES_TEK405X_H
177