summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/cuda.h
blob: 97c321ede66887fb0d48ea2a1824008b47a5442f (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
#pragma once

#ifndef __CUDA_H__
#define __CUDA_H__

#include "emu.h"

//**************************************************************************
//  MACROS / CONSTANTS
//**************************************************************************

#define CUDA_TAG    "cuda"

#define CUDA_341S0060   0x1100  // v2.40 (Most common: Performa/Quadra 6xx, PowerMac x200, x400, x500, Pippin, Gossamer G3)
#define CUDA_341S0788   0x2200  // v2.37 (LC 475/575/Quadra 605, Quadra 660AV/840AV, PowerMac x200)
#define CUDA_341S0417   0x3300  // v2.35 (Color Classic)

//**************************************************************************
//  INTERFACE CONFIGURATION MACROS
//**************************************************************************

#define MCFG_CUDA_ADD(_type, _config) \
	MCFG_DEVICE_ADD(CUDA_TAG, CUDA, 0) \
	MCFG_DEVICE_CONFIG(_config) \
	MCFG_CUDA_TYPE(_type)

#define MCFG_CUDA_REPLACE(_type, _config) \
	MCFG_DEVICE_REPLACE(CUDA_TAG, CUDA, 0) \
	MCFG_DEVICE_CONFIG(_config) \
	MCFG_CUDA_TYPE(_type)

#define MCFG_CUDA_REMOVE() \
	MCFG_DEVICE_REMOVE(CUDA_TAG)

#define MCFG_CUDA_TYPE(_type) \
	cuda_device::static_set_type(*device, _type);

#define MCFG_CUDA_REMOVE() \
	MCFG_DEVICE_REMOVE(CUDA_TAG)

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

struct cuda_interface
{
	devcb_write_line    m_out_reset_cb;
	devcb_write_line    m_out_adb_cb;
};

// ======================> cuda_device

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

	// inline configuration helpers
	static void static_set_type(device_t &device, int type);

	// device_config_nvram_interface overrides
	virtual void nvram_default();
	virtual void nvram_read(emu_file &file);
	virtual void nvram_write(emu_file &file);

	DECLARE_READ8_MEMBER( ddr_r );
	DECLARE_WRITE8_MEMBER( ddr_w );
	DECLARE_READ8_MEMBER( ports_r );
	DECLARE_WRITE8_MEMBER( ports_w );
	DECLARE_READ8_MEMBER( pll_r );
	DECLARE_WRITE8_MEMBER( pll_w );
	DECLARE_READ8_MEMBER( timer_ctrl_r );
	DECLARE_WRITE8_MEMBER( timer_ctrl_w );
	DECLARE_READ8_MEMBER( timer_counter_r );
	DECLARE_WRITE8_MEMBER( timer_counter_w );
	DECLARE_READ8_MEMBER( onesec_r );
	DECLARE_WRITE8_MEMBER( onesec_w );
	DECLARE_READ8_MEMBER( pram_r );
	DECLARE_WRITE8_MEMBER( pram_w );

	// VIA interface routines
	UINT8 get_treq() { return treq; }
	void set_tip(UINT8 val) { tip = val; }
	void set_byteack(UINT8 val) { byteack = val; }
	UINT8 get_via_data() { return via_data; }
	void set_via_data(UINT8 dat) { via_data = dat; }
	UINT8 get_via_clock() { return via_clock; }
	void set_adb_line(int linestate) { adb_in = (linestate == ASSERT_LINE) ? true : false; }
	int get_adb_dtime() { return m_adb_dtime; }

	int rom_offset;

protected:
	// device-level overrides
	virtual void device_start();
	virtual void device_reset();
	virtual void device_config_complete();
	virtual machine_config_constructor device_mconfig_additions() const;
	virtual const rom_entry *device_rom_region() const;

	required_device<cpu_device> m_maincpu;

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

private:
	UINT8 ddrs[3];
	UINT8 ports[3];
	UINT8 pll_ctrl;
	UINT8 timer_ctrl;
	UINT8 timer_counter, ripple_counter;
	UINT8 onesec;
	UINT8 treq, byteack, tip, via_data, via_clock, last_adb;
	UINT64 last_adb_time;
	bool cuda_controls_power;
	bool adb_in;
	int reset_line;
	int m_adb_dtime;
	emu_timer *m_timer, *m_prog_timer;
	UINT8 pram[0x100], disk_pram[0x100];
	bool pram_loaded;

	void send_port(address_space &space, UINT8 offset, UINT8 data);

	devcb_resolved_write_line   m_out_reset_func;
	devcb_resolved_write_line   m_out_adb_func;
};

// device type definition
extern const device_type CUDA;

#endif