summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/video/gf7600gs.cpp
blob: bbe409525e21bf80c6265fabf4f00158ba7112f2 (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
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
#include "emu.h"
#include "gf7600gs.h"

DEFINE_DEVICE_TYPE(GEFORCE_7600GS, geforce_7600gs_device, "geforce_7600gs", "NVIDIA GeForce 7600GS")

void geforce_7600gs_device::map1(address_map &map)
{
}

void geforce_7600gs_device::map2(address_map &map)
{
}

void geforce_7600gs_device::map3(address_map &map)
{
}

geforce_7600gs_device::geforce_7600gs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
	: pci_device(mconfig, GEFORCE_7600GS, tag, owner, clock)
	, m_vga(*this, "vga")
{
}

void geforce_7600gs_device::device_add_mconfig(machine_config &config)
{
	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
	screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
	screen.set_screen_update(m_vga, FUNC(nvidia_nv3_vga_device::screen_update));

	// TODO: very late superset (G73)
	NVIDIA_NV3_VGA(config, m_vga, 0);
	m_vga->set_screen("screen");
	// FIXME: shared RAM
	m_vga->set_vram_size(256*1024*1024);
}

void geforce_7600gs_device::device_start()
{
	pci_device::device_start();
	add_map( 16*1024*1024, M_MEM, FUNC(geforce_7600gs_device::map1));
	add_map(256*1024*1024, M_MEM, FUNC(geforce_7600gs_device::map2));
	add_map( 16*1024*1024, M_MEM, FUNC(geforce_7600gs_device::map3));
	add_rom_from_region();
}

void geforce_7600gs_device::device_reset()
{
	pci_device::device_reset();
}

void geforce_7600gs_device::legacy_memory_map(address_map &map)
{
	map(0xa0000, 0xbffff).rw(FUNC(geforce_7600gs_device::vram_r), FUNC(geforce_7600gs_device::vram_w));
}

void geforce_7600gs_device::legacy_io_map(address_map &map)
{
	map(0, 0x02f).m(m_vga, FUNC(nvidia_nv3_vga_device::io_map));
}

uint8_t geforce_7600gs_device::vram_r(offs_t offset)
{
	return downcast<nvidia_nv3_vga_device *>(m_vga.target())->mem_r(offset);
}

void geforce_7600gs_device::vram_w(offs_t offset, uint8_t data)
{
	downcast<nvidia_nv3_vga_device *>(m_vga.target())->mem_w(offset, data);
}

void geforce_7600gs_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
							uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space)
{
	if (BIT(command, 1))
	{
		memory_space->install_readwrite_handler(0xa0000, 0xbffff, read8sm_delegate(*this, FUNC(geforce_7600gs_device::vram_r)), write8sm_delegate(*this, FUNC(geforce_7600gs_device::vram_w)));
	}

	if (BIT(command, 0))
	{
		io_space->install_device(0x03b0, 0x03df, *this, &geforce_7600gs_device::legacy_io_map);
		//memory_space->install_rom(0xc0000, 0xcffff, (void *)expansion_rom);
	}
}