1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_TRS80M2_H
4 #define MAME_INCLUDES_TRS80M2_H
5 
6 #pragma once
7 
8 
9 #include "cpu/z80/z80.h"
10 #include "machine/z80daisy.h"
11 #include "cpu/mcs48/mcs48.h"
12 #include "cpu/m68000/m68000.h"
13 #include "bus/centronics/ctronics.h"
14 #include "imagedev/floppy.h"
15 #include "machine/am9519.h"
16 #include "machine/keyboard.h"
17 #include "machine/ram.h"
18 #include "machine/trs80m2kb.h"
19 #include "machine/wd_fdc.h"
20 #include "machine/z80ctc.h"
21 #include "machine/z80dma.h"
22 #include "machine/z80pio.h"
23 #include "machine/z80sio.h"
24 #include "video/mc6845.h"
25 #include "emupal.h"
26 
27 #define SCREEN_TAG      "screen"
28 #define Z80_TAG         "u12"
29 #define Z80CTC_TAG      "u19"
30 #define Z80DMA_TAG      "u20"
31 #define Z80PIO_TAG      "u22"
32 #define Z80SIO_TAG      "u18"
33 #define FD1791_TAG      "u6"
34 #define MC6845_TAG      "u11"
35 #define CENTRONICS_TAG  "j2"
36 #define M68000_TAG      "m16_u22"
37 #define AM9519A_TAG     "m16_u11"
38 
39 class trs80m2_state : public driver_device
40 {
41 public:
trs80m2_state(const machine_config & mconfig,device_type type,const char * tag)42 	trs80m2_state(const machine_config &mconfig, device_type type, const char *tag) :
43 		driver_device(mconfig, type, tag),
44 		m_maincpu(*this, Z80_TAG),
45 		m_ctc(*this, Z80CTC_TAG),
46 		m_dmac(*this, Z80DMA_TAG),
47 		m_pio(*this, Z80PIO_TAG),
48 		m_crtc(*this, MC6845_TAG),
49 		m_palette(*this, "palette"),
50 		m_fdc(*this, FD1791_TAG),
51 		m_centronics(*this, CENTRONICS_TAG),
52 		m_floppy0(*this, FD1791_TAG":0"),
53 		m_floppy1(*this, FD1791_TAG":1"),
54 		m_floppy2(*this, FD1791_TAG":2"),
55 		m_floppy3(*this, FD1791_TAG":3"),
56 		m_floppy(nullptr),
57 		m_ram(*this, RAM_TAG),
58 		m_kb(*this, TRS80M2_KEYBOARD_TAG),
59 		m_rom(*this, Z80_TAG),
60 		m_char_rom(*this, MC6845_TAG),
61 		m_video_ram(*this, "video_ram")
62 	{
63 	}
64 
imperfect_features()65 	static constexpr feature_type imperfect_features() { return feature::KEYBOARD; }
66 
67 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
68 
69 	uint8_t read(offs_t offset);
70 	void write(offs_t offset, uint8_t data);
71 	void drvslt_w(uint8_t data);
72 	void rom_enable_w(uint8_t data);
73 	uint8_t keyboard_r();
74 	uint8_t rtc_r();
75 	uint8_t nmi_r();
76 	void nmi_w(uint8_t data);
77 	uint8_t fdc_r(offs_t offset);
78 	void fdc_w(offs_t offset, uint8_t data);
79 	DECLARE_WRITE_LINE_MEMBER( de_w );
80 	DECLARE_WRITE_LINE_MEMBER( vsync_w );
81 	uint8_t pio_pa_r();
82 	void pio_pa_w(uint8_t data);
83 	DECLARE_WRITE_LINE_MEMBER( strobe_w );
84 	DECLARE_WRITE_LINE_MEMBER( kb_clock_w );
85 	void kbd_w(u8 data);
86 
87 	MC6845_UPDATE_ROW( crtc_update_row );
88 
89 	uint8_t io_read_byte(offs_t offset);
90 	void io_write_byte(offs_t offset, uint8_t data);
91 
92 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
93 	DECLARE_WRITE_LINE_MEMBER(write_centronics_fault);
94 	DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
95 
96 	void trs80m2(machine_config &config);
97 	void m68000_mem(address_map &map);
98 	void z80_io(address_map &map);
99 	void z80_mem(address_map &map);
100 protected:
101 	virtual void machine_start() override;
102 	virtual void machine_reset() override;
103 
104 	virtual void video_start() override;
105 
106 	required_device<z80_device> m_maincpu;
107 	required_device<z80ctc_device> m_ctc;
108 	required_device<z80dma_device> m_dmac;
109 	required_device<z80pio_device> m_pio;
110 	required_device<mc6845_device> m_crtc;
111 	required_device<palette_device> m_palette;
112 	required_device<fd1791_device> m_fdc;
113 	required_device<centronics_device> m_centronics;
114 	required_device<floppy_connector> m_floppy0;
115 	required_device<floppy_connector> m_floppy1;
116 	required_device<floppy_connector> m_floppy2;
117 	required_device<floppy_connector> m_floppy3;
118 	floppy_image_device *m_floppy;
119 	required_device<ram_device> m_ram;
120 	required_device<trs80m2_keyboard_device> m_kb;
121 	required_memory_region m_rom;
122 	required_memory_region m_char_rom;
123 	optional_shared_ptr<uint8_t> m_video_ram;
124 
125 	// memory state
126 	int m_boot_rom;
127 	int m_bank;
128 	int m_msel;
129 
130 	// keyboard state
131 	uint8_t m_key_latch;
132 	uint8_t m_key_data;
133 	int m_key_bit;
134 	int m_kbclk;
135 	int m_kbdata;
136 	int m_kbirq;
137 
138 	// video state
139 	int m_blnkvid;
140 	int m_80_40_char_en;
141 	int m_de;
142 	int m_rtc_int;
143 	int m_enable_rtc_int;
144 
145 	int m_centronics_busy;
146 	int m_centronics_fault;
147 	int m_centronics_perror;
148 };
149 
150 class trs80m16_state : public trs80m2_state
151 {
152 public:
trs80m16_state(const machine_config & mconfig,device_type type,const char * tag)153 	trs80m16_state(const machine_config &mconfig, device_type type, const char *tag)
154 		: trs80m2_state(mconfig, type, tag)
155 		, m_subcpu(*this, M68000_TAG)
156 		, m_uic(*this, AM9519A_TAG)
157 	{
158 	}
159 
160 	void ual_w(uint8_t data);
161 	void tcl_w(uint8_t data);
162 
163 	void trs80m16(machine_config &config);
164 	void m16_z80_io(address_map &map);
165 protected:
166 	virtual void machine_start() override;
167 
168 	required_device<cpu_device> m_subcpu;
169 	required_device<am9519_device> m_uic;
170 
171 	uint16_t m_ual;
172 	uint8_t m_limit[2];
173 	uint8_t m_offset[2];
174 };
175 
176 #endif // MAME_INCLUDES_TRS80M2_H
177