1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_NEWBRAIN_H
4 #define MAME_INCLUDES_NEWBRAIN_H
5 
6 #pragma once
7 
8 
9 #include "bus/newbrain/exp.h"
10 #include "bus/rs232/rs232.h"
11 #include "cpu/z80/z80.h"
12 #include "machine/z80daisy.h"
13 #include "cpu/cop400/cop400.h"
14 #include "imagedev/cassette.h"
15 #include "machine/rescap.h"
16 #include "machine/ram.h"
17 #include "emupal.h"
18 
19 #define SCREEN_TAG      "screen"
20 #define Z80_TAG         "409"
21 #define COP420_TAG      "419"
22 #define RS232_V24_TAG   "to"
23 #define RS232_PRN_TAG   "po"
24 
25 class newbrain_state : public driver_device
26 {
27 public:
newbrain_state(const machine_config & mconfig,device_type type,const char * tag)28 	newbrain_state(const machine_config &mconfig, device_type type, const char *tag) :
29 		driver_device(mconfig, type, tag),
30 		m_maincpu(*this, Z80_TAG),
31 		m_cop(*this, COP420_TAG),
32 		m_palette(*this, "palette"),
33 		m_exp(*this, NEWBRAIN_EXPANSION_SLOT_TAG),
34 		m_cassette1(*this, "cassette1"),
35 		m_cassette2(*this, "cassette2"),
36 		m_rs232_v24(*this, RS232_V24_TAG),
37 		m_rs232_prn(*this, RS232_PRN_TAG),
38 		m_ram(*this, RAM_TAG),
39 		m_rom(*this, Z80_TAG),
40 		m_char_rom(*this, "chargen"),
41 		m_y(*this, "Y%u", 0),
42 		m_digits(*this, "digit%u", 0U),
43 		m_pwrup(0),
44 		m_userint(1),
45 		m_clkint(1),
46 		m_copint(1),
47 		m_405_q(0),
48 		m_403_q(0xf)
49 	{
50 	}
51 
52 	void newbrain(machine_config &config);
53 	void newbrain_a(machine_config &config);
54 	void newbrain_ad(machine_config &config);
55 	void newbrain_md(machine_config &config);
56 	void newbrain_video(machine_config &config);
57 
58 private:
59 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
60 
61 	uint8_t mreq_r(offs_t offset);
62 	void mreq_w(offs_t offset, uint8_t data);
63 	uint8_t iorq_r(offs_t offset);
64 	void iorq_w(offs_t offset, uint8_t data);
65 
66 	void enrg_w(uint8_t data);
67 	void tvtl_w(uint8_t data);
68 	uint8_t ust_a_r();
69 	uint8_t ust_b_r();
70 
71 	void cop_g_w(uint8_t data);
72 	uint8_t cop_g_r();
73 	void cop_d_w(uint8_t data);
74 	uint8_t cop_in_r();
75 	DECLARE_WRITE_LINE_MEMBER( k2_w );
76 	DECLARE_READ_LINE_MEMBER( tdi_r );
77 	DECLARE_WRITE_LINE_MEMBER( k1_w );
78 
79 	void newbrain_iorq(address_map &map);
80 	void newbrain_mreq(address_map &map);
81 
82 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
83 	virtual void machine_start() override;
84 	virtual void machine_reset() override;
85 
86 	virtual void video_start() override;
87 
88 	enum
89 	{
90 		TIMER_ID_RESET,
91 		TIMER_ID_PWRUP,
92 		TIMER_ID_CLKINT
93 	};
94 
95 	void check_interrupt();
96 	void clclk();
97 	int tpin();
98 	void tm();
99 
100 	int get_reset_t();
101 	int get_pwrup_t();
102 
103 	void do_screen_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
104 	void tvl(uint8_t data, int a6);
105 
106 	required_device<z80_device> m_maincpu;
107 	required_device<cop400_cpu_device> m_cop;
108 	required_device<palette_device> m_palette;
109 	required_device<newbrain_expansion_slot_device> m_exp;
110 	required_device<cassette_image_device> m_cassette1;
111 	required_device<cassette_image_device> m_cassette2;
112 	required_device<rs232_port_device> m_rs232_v24;
113 	required_device<rs232_port_device> m_rs232_prn;
114 	required_device<ram_device> m_ram;
115 	required_memory_region m_rom;
116 	required_memory_region m_char_rom;
117 	required_ioport_array<16> m_y;
118 	output_finder<16> m_digits;
119 
120 	int m_clk;
121 	int m_tvp;
122 	int m_pwrup;
123 	int m_userint;
124 	int m_clkint;
125 	int m_copint;
126 
127 	int m_cop_so;
128 	int m_cop_tdo;
129 	int m_cop_g1;
130 	int m_cop_g3;
131 	int m_cop_k6;
132 
133 	int m_405_q;
134 	uint8_t m_403_q;
135 	uint8_t m_403_d;
136 	uint16_t m_402_q;
137 
138 	int m_rv;
139 	int m_fs;
140 	int m_32_40;
141 	int m_ucr;
142 	int m_80l;
143 	uint16_t m_tvl;
144 
145 	emu_timer *m_clkint_timer;
146 };
147 
148 #endif
149