1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #pragma once
4 
5 #ifndef MAME_INCLUDES_PC8001_H
6 #define MAME_INCLUDES_PC8001_H
7 
8 
9 #include "cpu/z80/z80.h"
10 #include "imagedev/cassette.h"
11 #include "machine/buffer.h"
12 #include "bus/centronics/ctronics.h"
13 #include "machine/i8257.h"
14 #include "machine/i8255.h"
15 #include "machine/i8251.h"
16 #include "machine/ram.h"
17 #include "machine/upd1990a.h"
18 #include "sound/beep.h"
19 #include "video/upd3301.h"
20 
21 #define Z80_TAG         "z80"
22 #define I8251_TAG       "i8251"
23 #define I8255A_TAG      "i8255"
24 #define I8257_TAG       "i8257"
25 #define UPD1990A_TAG    "upd1990a"
26 #define UPD3301_TAG     "upd3301"
27 #define CENTRONICS_TAG  "centronics"
28 #define SCREEN_TAG      "screen"
29 
30 class pc8001_state : public driver_device
31 {
32 public:
pc8001_state(const machine_config & mconfig,device_type type,const char * tag)33 	pc8001_state(const machine_config &mconfig, device_type type, const char *tag)
34 		: driver_device(mconfig, type, tag),
35 			m_maincpu(*this, Z80_TAG),
36 			m_rtc(*this, UPD1990A_TAG),
37 			m_dma(*this, I8257_TAG),
38 			m_crtc(*this, UPD3301_TAG),
39 			m_cassette(*this, "cassette"),
40 			m_centronics(*this, CENTRONICS_TAG),
41 			m_cent_data_out(*this, "cent_data_out"),
42 			m_beep(*this, "beeper"),
43 			m_ram(*this, RAM_TAG),
44 			m_rom(*this, Z80_TAG),
45 			m_char_rom(*this, UPD3301_TAG)
46 	{ }
47 
48 	required_device<cpu_device> m_maincpu;
49 	required_device<upd1990a_device> m_rtc;
50 	required_device<i8257_device> m_dma;
51 	required_device<upd3301_device> m_crtc;
52 	required_device<cassette_image_device> m_cassette;
53 	required_device<centronics_device> m_centronics;
54 	required_device<output_latch_device> m_cent_data_out;
55 	required_device<beep_device> m_beep;
56 	required_device<ram_device> m_ram;
57 	required_memory_region m_rom;
58 	required_memory_region m_char_rom;
59 
60 	virtual void machine_start() override;
61 
62 	void port10_w(uint8_t data);
63 	void port30_w(uint8_t data);
64 	uint8_t port40_r();
65 	void port40_w(uint8_t data);
66 	DECLARE_WRITE_LINE_MEMBER( hrq_w );
67 	uint8_t dma_mem_r(offs_t offset);
68 
69 	/* video state */
70 	int m_width80;
71 	int m_color;
72 
73 	int m_centronics_busy;
74 	int m_centronics_ack;
75 
76 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
77 	DECLARE_WRITE_LINE_MEMBER(write_centronics_ack);
78 	UPD3301_DRAW_CHARACTER_MEMBER( pc8001_display_pixels );
79 	void pc8001(machine_config &config);
80 	void pc8001_io(address_map &map);
81 	void pc8001_mem(address_map &map);
82 };
83 
84 class pc8001mk2_state : public pc8001_state
85 {
86 public:
pc8001mk2_state(const machine_config & mconfig,device_type type,const char * tag)87 	pc8001mk2_state(const machine_config &mconfig, device_type type, const char *tag)
88 		: pc8001_state(mconfig, type, tag),
89 			m_kanji_rom(*this, "kanji")
90 	{ }
91 
92 	required_memory_region m_kanji_rom;
93 
94 	void port31_w(uint8_t data);
95 	void pc8001mk2(machine_config &config);
96 	void pc8001mk2_io(address_map &map);
97 	void pc8001mk2_mem(address_map &map);
98 };
99 
100 #endif
101