1 // license:GPL-2.0+
2 // copyright-holders:Kevin Thacker
3 /*****************************************************************************
4  *
5  * includes/pcw16.h
6  *
7  ****************************************************************************/
8 #ifndef MAME_INCLUDES_PCW16_H
9 #define MAME_INCLUDES_PCW16_H
10 
11 #pragma once
12 
13 #include "cpu/z80/z80.h"
14 #include "machine/upd765.h"     /* FDC superio */
15 #include "machine/pc_lpt.h"     /* PC-Parallel Port */
16 #include "machine/pckeybrd.h"   /* PC-AT keyboard */
17 #include "machine/upd765.h"     /* FDC superio */
18 #include "machine/ins8250.h"    /* pc com port */
19 #include "sound/beep.h"         /* pcw/pcw16 beeper */
20 #include "machine/intelfsh.h"
21 #include "formats/pc_dsk.h"
22 #include "imagedev/floppy.h"
23 #include "machine/ram.h"
24 #include "machine/timer.h"
25 #include "emupal.h"
26 
27 #define PCW16_BORDER_HEIGHT 8
28 #define PCW16_BORDER_WIDTH 8
29 #define PCW16_NUM_COLOURS 32
30 #define PCW16_DISPLAY_WIDTH 640
31 #define PCW16_DISPLAY_HEIGHT 480
32 
33 #define PCW16_SCREEN_WIDTH  (PCW16_DISPLAY_WIDTH + (PCW16_BORDER_WIDTH<<1))
34 #define PCW16_SCREEN_HEIGHT (PCW16_DISPLAY_HEIGHT  + (PCW16_BORDER_HEIGHT<<1))
35 
36 
37 class pcw16_state : public driver_device
38 {
39 public:
pcw16_state(const machine_config & mconfig,device_type type,const char * tag)40 	pcw16_state(const machine_config &mconfig, device_type type, const char *tag) :
41 		driver_device(mconfig, type, tag),
42 		m_maincpu(*this, "maincpu"),
43 		m_flash0(*this, "flash0"),
44 		m_flash1(*this, "flash1"),
45 		m_fdc(*this, "fdc"),
46 		m_uart2(*this, "ns16550_2"),
47 		m_beeper(*this, "beeper"),
48 		m_ram(*this, RAM_TAG),
49 		m_keyboard(*this, "at_keyboard"),
50 		m_region_rom(*this, "maincpu"),
51 		m_io_extra(*this, "EXTRA")
52 	{ }
53 
54 	void pcw16(machine_config &config);
55 
56 protected:
57 	void pcw16_palette_w(offs_t offset, uint8_t data);
58 	uint8_t pcw16_bankhw_r(offs_t offset);
59 	void pcw16_bankhw_w(offs_t offset, uint8_t data);
60 	void pcw16_video_control_w(uint8_t data);
61 	uint8_t pcw16_keyboard_data_shift_r();
62 	void pcw16_keyboard_data_shift_w(uint8_t data);
63 	uint8_t pcw16_keyboard_status_r();
64 	void pcw16_keyboard_control_w(uint8_t data);
65 	uint8_t rtc_year_invalid_r();
66 	uint8_t rtc_month_r();
67 	uint8_t rtc_days_r();
68 	uint8_t rtc_hours_r();
69 	uint8_t rtc_minutes_r();
70 	uint8_t rtc_seconds_r();
71 	uint8_t rtc_256ths_seconds_r();
72 	void rtc_control_w(uint8_t data);
73 	void rtc_seconds_w(uint8_t data);
74 	void rtc_minutes_w(uint8_t data);
75 	void rtc_hours_w(uint8_t data);
76 	void rtc_days_w(uint8_t data);
77 	void rtc_month_w(uint8_t data);
78 	void rtc_year_w(uint8_t data);
79 	uint8_t pcw16_system_status_r();
80 	uint8_t pcw16_timer_interrupt_counter_r();
81 	void pcw16_system_control_w(uint8_t data);
82 	uint8_t pcw16_mem_r(offs_t offset);
83 	void pcw16_mem_w(offs_t offset, uint8_t data);
84 	void pcw16_keyboard_init();
85 	void pcw16_keyboard_refresh_outputs();
86 	void pcw16_keyboard_set_clock_state(int state);
87 	void pcw16_keyboard_int(int state);
88 	void pcw16_keyboard_reset();
89 	int pcw16_keyboard_can_transmit();
90 	void pcw16_keyboard_signal_byte_received(int data);
91 	void pcw16_refresh_ints();
92 	void rtc_setup_max_days();
93 	uint8_t pcw16_read_mem(uint8_t bank, uint16_t offset);
94 	void pcw16_write_mem(uint8_t bank, uint16_t offset, uint8_t data);
95 	uint8_t read_bank_data(uint8_t type, uint16_t offset);
96 	void write_bank_data(uint8_t type, uint16_t offset, uint8_t data);
97 	virtual void machine_start() override;
98 	virtual void machine_reset() override;
99 	virtual void video_start() override;
100 	void pcw16_colours(palette_device &palette) const;
101 	uint32_t screen_update_pcw16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
102 	TIMER_DEVICE_CALLBACK_MEMBER(pcw16_timer_callback);
103 	TIMER_DEVICE_CALLBACK_MEMBER(rtc_timer_callback);
104 	DECLARE_WRITE_LINE_MEMBER(pcw16_com_interrupt_1);
105 	DECLARE_WRITE_LINE_MEMBER(pcw16_com_interrupt_2);
106 	DECLARE_WRITE_LINE_MEMBER(pcw16_keyboard_callback);
107 
108 	void trigger_fdc_int();
109 	DECLARE_WRITE_LINE_MEMBER( fdc_interrupt );
110 	DECLARE_FLOPPY_FORMATS( floppy_formats );
111 	inline void pcw16_plot_pixel(bitmap_ind16 &bitmap, int x, int y, uint32_t color);
112 	void pcw16_vh_decode_mode0(bitmap_ind16 &bitmap, int x, int y, uint8_t byte);
113 	void pcw16_vh_decode_mode1(bitmap_ind16 &bitmap, int x, int y, uint8_t byte);
114 	void pcw16_vh_decode_mode2(bitmap_ind16 &bitmap, int x, int y, uint8_t byte);
115 
116 	void pcw16_io(address_map &map);
117 	void pcw16_map(address_map &map);
118 
119 private:
120 	required_device<cpu_device> m_maincpu;
121 	required_device<intel_e28f008sa_device> m_flash0;
122 	required_device<intel_e28f008sa_device> m_flash1;
123 	required_device<pc_fdc_superio_device> m_fdc;
124 	required_device<ns16550_device> m_uart2;
125 	required_device<beep_device> m_beeper;
126 	required_device<ram_device> m_ram;
127 	required_device<at_keyboard_device> m_keyboard;
128 	required_memory_region m_region_rom;
129 	required_ioport m_io_extra;
130 
131 	unsigned long m_interrupt_counter;
132 	int m_banks[4];
133 	int m_4_bit_port;
134 	int m_fdc_int_code;
135 	int m_system_status;
136 	char *m_mem_ptr[4];
137 	unsigned char m_keyboard_data_shift;
138 	int m_keyboard_parity_table[256];
139 	int m_keyboard_bits;
140 	int m_keyboard_bits_output;
141 	int m_keyboard_state;
142 	int m_keyboard_previous_state;
143 	unsigned char m_rtc_seconds;
144 	unsigned char m_rtc_minutes;
145 	unsigned char m_rtc_hours;
146 	unsigned char m_rtc_days_max;
147 	unsigned char m_rtc_days;
148 	unsigned char m_rtc_months;
149 	unsigned char m_rtc_years;
150 	unsigned char m_rtc_control;
151 	unsigned char m_rtc_256ths_seconds;
152 	int m_previous_fdc_int_state;
153 	int m_colour_palette[16];
154 	int m_video_control;
155 };
156 
157 #endif // MAME_INCLUDES_PCW16_H
158