summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes/pcw16.h
blob: ef901a00b0fb72ef4d88394fec635fd678b52a53 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// license:GPL-2.0+
// copyright-holders:Kevin Thacker
/*****************************************************************************
 *
 * includes/pcw16.h
 *
 ****************************************************************************/

#ifndef PCW16_H_
#define PCW16_H_

#include "cpu/z80/z80.h"
#include "machine/upd765.h"     /* FDC superio */
#include "machine/pc_lpt.h"     /* PC-Parallel Port */
#include "machine/pckeybrd.h"   /* PC-AT keyboard */
#include "machine/upd765.h"     /* FDC superio */
#include "machine/ins8250.h"    /* pc com port */
#include "sound/beep.h"         /* pcw/pcw16 beeper */
#include "machine/intelfsh.h"
#include "formats/pc_dsk.h"
#include "machine/ram.h"
#include "machine/timer.h"

#define PCW16_BORDER_HEIGHT 8
#define PCW16_BORDER_WIDTH 8
#define PCW16_NUM_COLOURS 32
#define PCW16_DISPLAY_WIDTH 640
#define PCW16_DISPLAY_HEIGHT 480

#define PCW16_SCREEN_WIDTH  (PCW16_DISPLAY_WIDTH + (PCW16_BORDER_WIDTH<<1))
#define PCW16_SCREEN_HEIGHT (PCW16_DISPLAY_HEIGHT  + (PCW16_BORDER_HEIGHT<<1))


class pcw16_state : public driver_device
{
public:
	pcw16_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag),
			m_maincpu(*this, "maincpu"),
			m_flash0(*this, "flash0"),
			m_flash1(*this, "flash1"),
			m_fdc(*this, "fdc"),
			m_uart2(*this, "ns16550_2"),
			m_beeper(*this, "beeper"),
			m_ram(*this, RAM_TAG),
			m_keyboard(*this, "at_keyboard"),
			m_region_rom(*this, "maincpu"),
			m_io_extra(*this, "EXTRA")
	{ }

	required_device<cpu_device> m_maincpu;
	required_device<intel_e28f008sa_device> m_flash0;
	required_device<intel_e28f008sa_device> m_flash1;
	required_device<pc_fdc_superio_device> m_fdc;
	required_device<ns16550_device> m_uart2;
	required_device<beep_device> m_beeper;
	required_device<ram_device> m_ram;
	required_device<at_keyboard_device> m_keyboard;
	required_memory_region m_region_rom;
	required_ioport m_io_extra;

	unsigned long m_interrupt_counter;
	int m_banks[4];
	int m_4_bit_port;
	int m_fdc_int_code;
	int m_system_status;
	char *m_mem_ptr[4];
	unsigned char m_keyboard_data_shift;
	int m_keyboard_parity_table[256];
	int m_keyboard_bits;
	int m_keyboard_bits_output;
	int m_keyboard_state;
	int m_keyboard_previous_state;
	unsigned char m_rtc_seconds;
	unsigned char m_rtc_minutes;
	unsigned char m_rtc_hours;
	unsigned char m_rtc_days_max;
	unsigned char m_rtc_days;
	unsigned char m_rtc_months;
	unsigned char m_rtc_years;
	unsigned char m_rtc_control;
	unsigned char m_rtc_256ths_seconds;
	int m_previous_fdc_int_state;
	int m_colour_palette[16];
	int m_video_control;
	DECLARE_WRITE8_MEMBER(pcw16_palette_w);
	DECLARE_READ8_MEMBER(pcw16_bankhw_r);
	DECLARE_WRITE8_MEMBER(pcw16_bankhw_w);
	DECLARE_WRITE8_MEMBER(pcw16_video_control_w);
	DECLARE_READ8_MEMBER(pcw16_keyboard_data_shift_r);
	DECLARE_WRITE8_MEMBER(pcw16_keyboard_data_shift_w);
	DECLARE_READ8_MEMBER(pcw16_keyboard_status_r);
	DECLARE_WRITE8_MEMBER(pcw16_keyboard_control_w);
	DECLARE_READ8_MEMBER(rtc_year_invalid_r);
	DECLARE_READ8_MEMBER(rtc_month_r);
	DECLARE_READ8_MEMBER(rtc_days_r);
	DECLARE_READ8_MEMBER(rtc_hours_r);
	DECLARE_READ8_MEMBER(rtc_minutes_r);
	DECLARE_READ8_MEMBER(rtc_seconds_r);
	DECLARE_READ8_MEMBER(rtc_256ths_seconds_r);
	DECLARE_WRITE8_MEMBER(rtc_control_w);
	DECLARE_WRITE8_MEMBER(rtc_seconds_w);
	DECLARE_WRITE8_MEMBER(rtc_minutes_w);
	DECLARE_WRITE8_MEMBER(rtc_hours_w);
	DECLARE_WRITE8_MEMBER(rtc_days_w);
	DECLARE_WRITE8_MEMBER(rtc_month_w);
	DECLARE_WRITE8_MEMBER(rtc_year_w);
	DECLARE_READ8_MEMBER(pcw16_system_status_r);
	DECLARE_READ8_MEMBER(pcw16_timer_interrupt_counter_r);
	DECLARE_WRITE8_MEMBER(pcw16_system_control_w);
	DECLARE_READ8_MEMBER(pcw16_mem_r);
	DECLARE_WRITE8_MEMBER(pcw16_mem_w);
	void pcw16_keyboard_init();
	void pcw16_keyboard_refresh_outputs();
	void pcw16_keyboard_set_clock_state(int state);
	void pcw16_keyboard_int(int state);
	void pcw16_keyboard_reset();
	int pcw16_keyboard_can_transmit();
	void pcw16_keyboard_signal_byte_received(int data);
	void pcw16_refresh_ints();
	void rtc_setup_max_days();
	uint8_t pcw16_read_mem(uint8_t bank, uint16_t offset);
	void pcw16_write_mem(uint8_t bank, uint16_t offset, uint8_t data);
	uint8_t read_bank_data(uint8_t type, uint16_t offset);
	void write_bank_data(uint8_t type, uint16_t offset, uint8_t data);
	virtual void machine_start() override;
	virtual void machine_reset() override;
	virtual void video_start() override;
	DECLARE_PALETTE_INIT(pcw16);
	uint32_t screen_update_pcw16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
	TIMER_DEVICE_CALLBACK_MEMBER(pcw16_timer_callback);
	TIMER_DEVICE_CALLBACK_MEMBER(rtc_timer_callback);
	DECLARE_WRITE_LINE_MEMBER(pcw16_com_interrupt_1);
	DECLARE_WRITE_LINE_MEMBER(pcw16_com_interrupt_2);
	DECLARE_WRITE_LINE_MEMBER(pcw16_keyboard_callback);

	void trigger_fdc_int();
	DECLARE_WRITE_LINE_MEMBER( fdc_interrupt );
	DECLARE_FLOPPY_FORMATS( floppy_formats );
	inline void pcw16_plot_pixel(bitmap_ind16 &bitmap, int x, int y, uint32_t color);
	void pcw16_vh_decode_mode0(bitmap_ind16 &bitmap, int x, int y, unsigned char byte);
	void pcw16_vh_decode_mode1(bitmap_ind16 &bitmap, int x, int y, unsigned char byte);
	void pcw16_vh_decode_mode2(bitmap_ind16 &bitmap, int x, int y, unsigned char byte);
};

#endif /* PCW16_H_ */