summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/machine/scsibus.c
blob: 0e5873f5cf501d427c4c31df3b282729e67c855f (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
// license:MAME
// copyright-holders:smf
/*

scsibus.c

*/

#include "emu.h"
#include "machine/scsibus.h"

void scsibus_device::scsi_update()
{
	UINT32 newdata = 0;

	for( int i = 0; i < deviceCount; i++ )
	{
		newdata |= devices[ i ]->data_out;
	}

	newdata &= SCSI_MASK_ALL;

	UINT32 mask = data ^ newdata;

	if( mask != 0 )
	{
		data = newdata;

		for( int i = 0; i < deviceCount; i++ )
		{
			devices[ i ]->scsi_in( data, mask );
		}
	}
}

scsibus_device::scsibus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
	: device_t(mconfig, SCSIBUS, "SCSI bus", tag, owner, clock, "scsibus", __FILE__)
{
}

void scsibus_device::device_start()
{
	deviceCount = 0;

	for( device_t *device = first_subdevice(); device != NULL; device = device->next() )
	{
		scsidev_device *scsidev = dynamic_cast<scsidev_device *>(device);
		if( scsidev != NULL )
		{
			devices[ deviceCount++ ] = scsidev;
			scsidev->m_scsibus = this;
		}
	}

	data = 0;
}

const device_type SCSIBUS = &device_creator<scsibus_device>;