summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/a2gameio/computereyes.cpp
blob: 799564de0a63108167ff8ae30333be2e17df7583 (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
// license:BSD-3-Clause
// copyright-holders:R. Belmont
/*********************************************************************

    Digital Vision ComputerEyes (original gameport version)

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

#include "emu.h"
#include "bus/a2gameio/computereyes.h"

//**************************************************************************
//  GLOBAL VARIABLES
//**************************************************************************

// device type definition
DEFINE_DEVICE_TYPE(APPLE2_COMPUTEREYES, apple2_compeyes_device, "a2ceyes", "Digital Vision ComputerEyes")

//**************************************************************************
//  DEVICE IMPLEMENTATION
//**************************************************************************

apple2_compeyes_device::apple2_compeyes_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
	: device_t(mconfig, APPLE2_COMPUTEREYES, tag, owner, clock)
	, device_a2gameio_interface(mconfig, *this)
	, m_picture(*this, "srcimg")
{
}

void apple2_compeyes_device::device_add_mconfig(machine_config &config)
{
	IMAGE_PICTURE(config, m_picture);
}

void apple2_compeyes_device::device_start()
{
	save_item(NAME(m_x));
	save_item(NAME(m_y));
	save_item(NAME(m_an1));
	save_item(NAME(m_an2));
	save_item(NAME(m_an3));
	save_item(NAME(m_level));
}

void apple2_compeyes_device::device_reset()
{
	m_x = m_y = m_an1 = m_an2 = m_an3 = m_level = 0;
}

READ_LINE_MEMBER(apple2_compeyes_device::sw0_r)
{
	return 0;
}

READ_LINE_MEMBER(apple2_compeyes_device::sw1_r)
{
	// to avoid triggering the self-test on //e, return only 0
	// for the first 2 seconds of emulation.
	if (machine().time().seconds() < 2)
	{
		return 0;
	}

	int res = m_a2_bitmap[(m_y*280)+m_x] > m_level ? 1 : 0;
//  if (m_a2_bitmap[(m_y*280)+m_x] != 0)
//      printf("Read pixel at (%d, %d) = %d (pix %d, level %d)\n", m_x, m_y, res, m_a2_bitmap[(m_y*280)+m_x], m_level);
	m_y++;
	if (m_y >= 192)
	{
		if (m_x < 279)
		{
			m_x++;
		}
		m_y = 0;
	}
	return res;
}

WRITE_LINE_MEMBER(apple2_compeyes_device::an0_w)
{
	m_x =  m_y = 0;

	std::fill_n(m_a2_bitmap, 280*192, 0);

	m_bitmap = m_picture->get_bitmap();
	if (m_bitmap)
	{
		// convert arbitrary sized ARGB32 image to a 280x192 image with 256 levels of grayscale
		double stepx = (double)m_bitmap->width() / 280.0;
		double stepy = (double)m_bitmap->height() / 192.0;


		for (int y = 0; y < 192; y++)
		{
			for (int x = 0; x < 280; x++)
			{
				u32 pixel = m_bitmap->pix((int)((double)y * stepy), (int)((double)x * stepx));
				double mono = ((0.2126 * (double)(((pixel>>16) & 0xff) / 255.0)) +
					   (0.7152 * (double)(((pixel>>8) & 0xff) / 255.0)) +
					   (0.0722 * (double)((pixel& 0xff) / 255.0)));
				m_a2_bitmap[(y*280)+x] = (u8)(mono * 255.0);
			}
		}
	}
}

WRITE_LINE_MEMBER(apple2_compeyes_device::an1_w)
{
	m_an1 = state;
	m_level = (128 * m_an2) + (64 * m_an1) + (32 * m_an3);
}

WRITE_LINE_MEMBER(apple2_compeyes_device::an2_w)
{
	m_an2 = state;
	m_level = (128 * m_an2) + (64 * m_an1) + (32 * m_an3);
}

WRITE_LINE_MEMBER(apple2_compeyes_device::an3_w)
{
	m_an3 = state;
	m_level = (128 * m_an2) + (64 * m_an1) + (32 * m_an3);
}