summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/odyssey2/test.cpp
blob: 4130c010d04be35070608ac912d92f555a42637b (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
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************

Videopac Service Test cartridge emulation

It's a standard 2KB ROM, the difference is that the PCB has a 7seg LED on it.
The program will still work fine if the 7seg is not hooked up (eg. O2_ROM_STD).

Test 1: press all joystick inputs
Test 4: type "NAGEL137"
(the other initial tests are automatic)

Hold UP to advance to next test.

******************************************************************************/

#include "emu.h"
#include "test.h"

namespace {

//-------------------------------------------------
//  initialization
//-------------------------------------------------

class o2_test_device : public device_t, public device_o2_cart_interface
{
public:
	o2_test_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);

protected:
	virtual void device_start() override ATTR_COLD;

	virtual void cart_init() override;

	virtual u8 read_rom04(offs_t offset) override { return m_rom[offset]; }
	virtual u8 read_rom0c(offs_t offset) override { return m_rom[offset + 0x400]; }
	virtual void bus_write(u8 data) override { m_bus_data = data; }

	virtual void write_p1(u8 data) override;

private:
	output_finder<> m_digit_out;

	u8 m_control = 0;
	u8 m_bus_data = 0;
};

o2_test_device::o2_test_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
	device_t(mconfig, O2_ROM_TEST, tag, owner, clock),
	device_o2_cart_interface(mconfig, *this),
	m_digit_out(*this, "tc_digit")
{ }

void o2_test_device::device_start()
{
	m_digit_out.resolve();

	save_item(NAME(m_control));
	save_item(NAME(m_bus_data));
}

void o2_test_device::cart_init()
{
	if (m_rom_size != 0x800)
		fatalerror("o2_test_device: ROM size must be 2KB\n");
}


//-------------------------------------------------
//  mapper specific handlers
//-------------------------------------------------

void o2_test_device::write_p1(u8 data)
{
	u8 output = m_digit_out;

	// P10: latch digit segments
	if (m_control & ~data & 1)
		output = ~m_bus_data;

	// P11: digit DP
	m_digit_out = (output & 0x7f) | (~data << 6 & 0x80);

	m_control = data;
}

} // anonymous namespace


DEFINE_DEVICE_TYPE_PRIVATE(O2_ROM_TEST, device_o2_cart_interface, o2_test_device, "o2_test", "Videopac Service Test Cartridge")