summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/includes/tvc.h
blob: 27fd7100a1217a8b99d5f655299b893d12f53005 (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
// license:BSD-3-Clause
// copyright-holders:Sandro Ronco
/*****************************************************************************
 *
 *   includes/tvc.h
 *
 ****************************************************************************/

#pragma once

#ifndef TVC_H_
#define TVC_H_

#include "cpu/z80/z80.h"
#include "video/mc6845.h"
#include "machine/ram.h"
#include "bus/centronics/ctronics.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "imagedev/snapquik.h"
#include "formats/tvc_cas.h"

#include "bus/tvc/tvc.h"
#include "bus/tvc/hbf.h"

#define     TVC_RAM_BANK    1
#define     TVC_ROM_BANK    2

#define CENTRONICS_TAG  "centronics"

#define MCFG_TVC_SOUND_SNDINT_CALLBACK(_write) \
	devcb = &tvc_sound_device::set_sndint_wr_callback(*device, DEVCB2_##_write);

//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

// ======================> tvc_sound_device

class tvc_sound_device : public device_t,
							public device_sound_interface
{
public:
	// construction/destruction
	tvc_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);

	template<class _Object> static devcb2_base &set_sndint_wr_callback(device_t &device, _Object object) { return downcast<tvc_sound_device &>(device).m_write_sndint.set_callback(object); }

	DECLARE_WRITE8_MEMBER(write);
	void reset_divider();

protected:
	// device-level overrides
	virtual void device_start();
	virtual void device_reset();
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
	virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);

private:
	static const device_timer_id TIMER_SNDINT = 0;

	sound_stream *  m_stream;
	int             m_freq;
	int             m_enabled;
	int             m_volume;
	int             m_incr;
	int             m_signal;
	UINT8           m_ports[3];
	emu_timer *     m_sndint_timer;
	devcb2_write_line   m_write_sndint;
};


// ======================> tvc_state

class tvc_state : public driver_device
{
public:
	tvc_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag),
			m_maincpu(*this, "maincpu"),
			m_ram(*this, RAM_TAG),
			m_sound(*this, "custom"),
			m_cassette(*this, "cassette"),
			m_centronics(*this, CENTRONICS_TAG),
			m_palette(*this, "palette")
		{ }

	required_device<cpu_device> m_maincpu;
	required_device<ram_device> m_ram;
	required_device<tvc_sound_device> m_sound;
	required_device<cassette_image_device> m_cassette;
	required_device<centronics_device> m_centronics;
	required_device<palette_device> m_palette;

	void machine_start();
	void machine_reset();

	void tvc_set_mem_page(UINT8 data);
	DECLARE_WRITE8_MEMBER(tvc_bank_w);
	DECLARE_WRITE8_MEMBER(tvc_vram_bank_w);
	DECLARE_WRITE8_MEMBER(tvc_palette_w);
	DECLARE_WRITE8_MEMBER(tvc_keyboard_w);
	DECLARE_READ8_MEMBER(tvc_keyboard_r);
	DECLARE_READ8_MEMBER(tvc_int_state_r);
	DECLARE_WRITE8_MEMBER(tvc_flipflop_w);
	DECLARE_WRITE8_MEMBER(tvc_border_color_w);
	DECLARE_WRITE8_MEMBER(tvc_sound_w);
	DECLARE_WRITE8_MEMBER(tvc_cassette_w);
	DECLARE_READ8_MEMBER(tvc_5b_r);
	DECLARE_WRITE_LINE_MEMBER(tvc_int_ff_set);
	DECLARE_WRITE_LINE_MEMBER(tvc_centronics_ack);

	// expansions
	DECLARE_WRITE8_MEMBER(tvc_expansion_w);
	DECLARE_READ8_MEMBER(tvc_expansion_r);
	DECLARE_READ8_MEMBER(tvc_exp_id_r);
	DECLARE_WRITE8_MEMBER(tvc_expint_ack_w);

	DECLARE_QUICKLOAD_LOAD_MEMBER( tvc64);

	MC6845_UPDATE_ROW(crtc_update_row);

	tvcexp_slot_device * m_expansions[4];
	UINT8       m_video_mode;
	UINT8       m_keyline;
	UINT8       m_active_slot;
	UINT8       m_int_flipflop;
	UINT8       m_col[4];
	UINT8       m_bank_type[4];
	UINT8       m_bank;
	UINT8       m_vram_bank;
	UINT8       m_cassette_ff;
	UINT8       m_centronics_ff;
	DECLARE_PALETTE_INIT(tvc);
};


// device type definition
extern const device_type TVC_SOUND;

#endif /* TVC_H_ */