summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes/samcoupe.h
blob: 319a8d1b41a3ce371ae3acc73de419f4b207c9ba (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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
// license:GPL-2.0+
// copyright-holders:Lee Hammerton, Dirk Best
/*****************************************************************************
 *
 * includes/coupe.h
 *
 * SAM Coupe
 *
 * Driver by Lee Hammerton
 *
 ****************************************************************************/

#ifndef MAME_INCLUDES_SAMCOUPE_H
#define MAME_INCLUDES_SAMCOUPE_H

#pragma once

#include "bus/centronics/ctronics.h"
#include "imagedev/cassette.h"
#include "imagedev/floppy.h"
#include "machine/msm6242.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
#include "sound/spkrdev.h"
#include "emupal.h"
#include "screen.h"

/* screen dimensions */
#define SAM_BLOCK           8

#define SAM_TOTAL_WIDTH     SAM_BLOCK*96
#define SAM_TOTAL_HEIGHT    312
#define SAM_SCREEN_WIDTH    SAM_BLOCK*64
#define SAM_SCREEN_HEIGHT   192
#define SAM_BORDER_LEFT     SAM_BLOCK*4
#define SAM_BORDER_RIGHT    SAM_BLOCK*4
#define SAM_BORDER_TOP      37
#define SAM_BORDER_BOTTOM   46

/* interrupt sources */
#define SAM_LINE_INT     0x01
#define SAM_MOUSE_INT    0x02
#define SAM_MIDIIN_INT   0x04
#define SAM_FRAME_INT    0x08
#define SAM_MIDIOUT_INT  0x10


class samcoupe_state :  public driver_device
{
public:
	samcoupe_state(const machine_config &mconfig, device_type type, const char *tag) :
		driver_device(mconfig, type, tag),
		m_maincpu(*this, "maincpu"),
		m_screen(*this, "screen"),
		m_speaker(*this, "speaker"),
		m_cassette(*this, "cassette"),
		m_lpt1(*this, "lpt1"),
		m_lpt2(*this, "lpt2"),
		m_ram(*this, RAM_TAG),
		m_rtc(*this, "sambus_clock"),
		m_fdc(*this, "wd1772"),
		m_wd1772_0(*this, "wd1772:0"),
		m_wd1772_1(*this, "wd1772:1"),
		m_region_maincpu(*this, "maincpu"),
		m_keyboard_row_fe(*this, "keyboard_row_fe"),
		m_keyboard_row_fd(*this, "keyboard_row_fd"),
		m_keyboard_row_fb(*this, "keyboard_row_fb"),
		m_keyboard_row_f7(*this, "keyboard_row_f7"),
		m_keyboard_row_ef(*this, "keyboard_row_ef"),
		m_keyboard_row_df(*this, "keyboard_row_df"),
		m_keyboard_row_bf(*this, "keyboard_row_bf"),
		m_keyboard_row_7f(*this, "keyboard_row_7f"),
		m_keyboard_row_ff(*this, "keyboard_row_ff"),
		m_mouse_buttons(*this, "mouse_buttons"),
		m_io_mouse_x(*this, "mouse_x"),
		m_io_mouse_y(*this, "mouse_y"),
		m_config(*this, "config"),
		m_joy1(*this, "joy_1"),
		m_joy2(*this, "joy_2")
	{
		sam_bank_read_ptr[0] = nullptr;
		sam_bank_write_ptr[0] = nullptr;
		sam_bank_read_ptr[1] = nullptr;
		sam_bank_write_ptr[1] = nullptr;
		sam_bank_read_ptr[2] = nullptr;
		sam_bank_write_ptr[2] = nullptr;
		sam_bank_read_ptr[3] = nullptr;
		sam_bank_write_ptr[3] = nullptr;
	}

	void samcoupe(machine_config &config);

protected:
	enum
	{
		TIMER_IRQ_OFF,
		TIMER_MOUSE_RESET,
		TIMER_VIDEO_UPDATE
	};

	virtual void machine_start() override;
	virtual void machine_reset() override;
	virtual void video_start() override;

	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;

private:
	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);

	bitmap_ind16 m_bitmap;

	emu_timer *m_video_update_timer;

	uint8_t m_lmpr, m_hmpr, m_vmpr; /* memory pages */
	uint8_t m_lext, m_hext;       /* extended memory page */
	uint8_t m_border;           /* border */
	uint8_t m_clut[16];         /* color lookup table, 16 entries */
	uint8_t m_line_int;         /* line interrupt */
	uint8_t m_status;           /* status register */

	/* attribute */
	uint8_t m_attribute;

	/* mouse */
	int m_mouse_index;
	emu_timer *m_mouse_reset;
	uint8_t m_mouse_data[9];
	int m_mouse_x, m_mouse_y;
	uint8_t *m_videoram;
	void samcoupe_ext_mem_w(offs_t offset, uint8_t data);
	uint8_t samcoupe_disk_r(offs_t offset);
	void samcoupe_disk_w(offs_t offset, uint8_t data);
	uint8_t samcoupe_pen_r(offs_t offset);
	void samcoupe_clut_w(offs_t offset, uint8_t data);
	uint8_t samcoupe_status_r(offs_t offset);
	void samcoupe_line_int_w(uint8_t data);
	uint8_t samcoupe_lmpr_r();
	void samcoupe_lmpr_w(uint8_t data);
	uint8_t samcoupe_hmpr_r();
	void samcoupe_hmpr_w(uint8_t data);
	uint8_t samcoupe_vmpr_r();
	void samcoupe_vmpr_w(uint8_t data);
	uint8_t samcoupe_midi_r();
	void samcoupe_midi_w(uint8_t data);
	uint8_t samcoupe_keyboard_r(offs_t offset);
	void samcoupe_border_w(uint8_t data);
	uint8_t samcoupe_attributes_r();
	void samcoupe_palette(palette_device &palette) const;
	INTERRUPT_GEN_MEMBER(samcoupe_frame_interrupt);
	TIMER_CALLBACK_MEMBER(irq_off);
	TIMER_CALLBACK_MEMBER(samcoupe_mouse_reset);
	TIMER_CALLBACK_MEMBER(sam_video_update_callback);
	uint8_t samcoupe_lpt1_busy_r();
	void samcoupe_lpt1_strobe_w(uint8_t data);
	uint8_t samcoupe_lpt2_busy_r();
	void samcoupe_lpt2_strobe_w(uint8_t data);
	uint8_t samcoupe_rtc_r(offs_t offset);
	void samcoupe_rtc_w(offs_t offset, uint8_t data);

	uint8_t sam_bank1_r(offs_t offset);
	void sam_bank1_w(offs_t offset, uint8_t data);
	uint8_t sam_bank2_r(offs_t offset);
	void sam_bank2_w(offs_t offset, uint8_t data);
	uint8_t sam_bank3_r(offs_t offset);
	void sam_bank3_w(offs_t offset, uint8_t data);
	uint8_t sam_bank4_r(offs_t offset);
	void sam_bank4_w(offs_t offset, uint8_t data);

	uint8_t* sam_bank_read_ptr[4];
	uint8_t* sam_bank_write_ptr[4];
	DECLARE_FLOPPY_FORMATS( floppy_formats );
	required_device<cpu_device> m_maincpu;
	required_device<screen_device> m_screen;
	required_device<speaker_sound_device> m_speaker;
	required_device<cassette_image_device> m_cassette;
	required_device<centronics_device> m_lpt1;
	required_device<centronics_device> m_lpt2;
	required_device<ram_device> m_ram;
	required_device<msm6242_device> m_rtc;
	required_device<wd1772_device> m_fdc;
	required_device<floppy_connector> m_wd1772_0;
	required_device<floppy_connector> m_wd1772_1;
	required_memory_region m_region_maincpu;
	required_ioport m_keyboard_row_fe;
	required_ioport m_keyboard_row_fd;
	required_ioport m_keyboard_row_fb;
	required_ioport m_keyboard_row_f7;
	required_ioport m_keyboard_row_ef;
	required_ioport m_keyboard_row_df;
	required_ioport m_keyboard_row_bf;
	required_ioport m_keyboard_row_7f;
	required_ioport m_keyboard_row_ff;
	required_ioport m_mouse_buttons;
	required_ioport m_io_mouse_x;
	required_ioport m_io_mouse_y;
	required_ioport m_config;
	required_ioport m_joy1;
	required_ioport m_joy2;

	void draw_mode4_line(int y, int hpos);
	void draw_mode3_line(int y, int hpos);
	void draw_mode12_block(bitmap_ind16 &bitmap, int vpos, int hpos, uint8_t mask);
	void draw_mode2_line(int y, int hpos);
	void draw_mode1_line(int y, int hpos);
	void samcoupe_update_bank(address_space &space, int bank_num, uint8_t *memory, int is_readonly);
	void samcoupe_install_ext_mem(address_space &space);
	void samcoupe_update_memory(address_space &space);
	uint8_t samcoupe_mouse_r();
	void samcoupe_irq(uint8_t src);

	DECLARE_WRITE_LINE_MEMBER(write_lpt1_busy);
	DECLARE_WRITE_LINE_MEMBER(write_lpt2_busy);

	int m_lpt1_busy;
	int m_lpt2_busy;

	void samcoupe_io(address_map &map);
	void samcoupe_mem(address_map &map);
};

#endif // MAME_INCLUDES_SAMCOUPE_H