1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_PC8401A_H
4 #define MAME_INCLUDES_PC8401A_H
5 
6 #pragma once
7 
8 
9 #include "cpu/z80/z80.h"
10 #include "machine/i8255.h"
11 #include "machine/i8251.h"
12 #include "machine/ram.h"
13 #include "machine/timer.h"
14 #include "machine/upd1990a.h"
15 #include "video/mc6845.h"
16 #include "video/sed1330.h"
17 
18 #include "bus/generic/slot.h"
19 #include "bus/generic/carts.h"
20 
21 #include "emupal.h"
22 #include "screen.h"
23 
24 #define SCREEN_TAG      "screen"
25 #define CRT_SCREEN_TAG  "screen2"
26 
27 #define Z80_TAG         "z80"
28 #define I8255A_TAG      "i8255a"
29 #define UPD1990A_TAG    "upd1990a"
30 #define AY8910_TAG      "ay8910"
31 #define SED1330_TAG     "sed1330"
32 #define MC6845_TAG      "mc6845"
33 #define I8251_TAG       "i8251"
34 #define RS232_TAG       "rs232"
35 
36 #define PC8401A_CRT_VIDEORAM_SIZE   0x2000
37 
38 class pc8401a_state : public driver_device
39 {
40 public:
pc8401a_state(const machine_config & mconfig,device_type type,const char * tag)41 	pc8401a_state(const machine_config &mconfig, device_type type, const char *tag)
42 		: driver_device(mconfig, type, tag)
43 		, m_maincpu(*this, Z80_TAG)
44 		, m_rtc(*this, UPD1990A_TAG)
45 		, m_lcdc(*this, SED1330_TAG)
46 		, m_crtc(*this, MC6845_TAG)
47 		, m_screen_lcd(*this, SCREEN_TAG)
48 		, m_cart(*this, "cartslot")
49 		, m_io_cart(*this, "io_cart")
50 		, m_ram(*this, RAM_TAG)
51 		, m_rom(*this, Z80_TAG)
52 		, m_crt_ram(*this, "crt_ram")
53 		, m_io_y(*this, "Y.%u", 0)
54 	{ }
55 
56 	required_device<cpu_device> m_maincpu;
57 	required_device<upd1990a_device> m_rtc;
58 	required_device<sed1330_device> m_lcdc;
59 	optional_device<mc6845_device> m_crtc;
60 	required_device<screen_device> m_screen_lcd;
61 	required_device<generic_slot_device> m_cart;
62 	required_device<generic_slot_device> m_io_cart;
63 	required_device<ram_device> m_ram;
64 	required_memory_region m_rom;
65 	optional_shared_ptr<uint8_t> m_crt_ram;
66 	required_ioport_array<10> m_io_y;
67 
68 	memory_region *m_cart_rom;
69 
70 	virtual void machine_start() override;
71 	virtual void video_start() override;
72 
73 	void mmr_w(uint8_t data);
74 	uint8_t mmr_r();
75 	uint8_t rtc_r();
76 	void rtc_cmd_w(uint8_t data);
77 	void rtc_ctrl_w(uint8_t data);
78 	uint8_t io_rom_data_r();
79 	void io_rom_addr_w(offs_t offset, uint8_t data);
80 	uint8_t port70_r();
81 	uint8_t port71_r();
82 	void port70_w(uint8_t data);
83 	void port71_w(uint8_t data);
84 	uint8_t ppi_pc_r();
85 	void ppi_pc_w(uint8_t data);
86 	void pc8401a_palette(palette_device &palette) const;
87 
88 	void scan_keyboard();
89 	void bankswitch(uint8_t data);
90 
91 	// keyboard state
92 	int m_key_strobe;           // key pressed
93 
94 	// memory state
95 	uint8_t m_mmr;                // memory mapping register
96 	uint32_t m_io_addr;           // I/O ROM address counter
97 
98 	uint8_t m_key_latch;
99 	TIMER_DEVICE_CALLBACK_MEMBER(pc8401a_keyboard_tick);
100 	void pc8401a(machine_config &config);
101 	void pc8401a_video(machine_config &config);
102 	void pc8401a_io(address_map &map);
103 	void pc8401a_lcdc(address_map &map);
104 	void pc8401a_mem(address_map &map);
105 	void pc8500_io(address_map &map);
106 	void pc8500_lcdc(address_map &map);
107 };
108 
109 class pc8500_state : public pc8401a_state
110 {
111 public:
pc8500_state(const machine_config & mconfig,device_type type,const char * tag)112 	pc8500_state(const machine_config &mconfig, device_type type, const char *tag)
113 		: pc8401a_state(mconfig, type, tag)
114 	{ }
115 
116 	void pc8500(machine_config &config);
117 
118 protected:
119 	virtual void video_start() override;
120 
121 	void pc8500_video(machine_config &config);
122 
123 private:
124 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
125 };
126 
127 #endif // MAME_INCLUDES_PC8401A_H
128