summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/machine/scsi.c
blob: f01f60d5390c3d4f1d65f0a0e272d56d46fec871 (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
#include "scsi.h"

void SCSIAllocInstance( SCSIClass *scsiClass, SCSIInstance **instance, int diskId )
{
	scsiClass->dispatch( SCSIOP_ALLOC_INSTANCE, scsiClass, diskId, instance );
}

void SCSIDeleteInstance( SCSIInstance *instance )
{
	instance->scsiClass->dispatch( SCSIOP_DELETE_INSTANCE, instance, 0, NULL );
}

void SCSISetDevice( SCSIInstance *instance, void *device )
{
	instance->scsiClass->dispatch( SCSIOP_SET_DEVICE, instance, 0, device );
}

void SCSIGetDevice( SCSIInstance *instance, void **device )
{
	instance->scsiClass->dispatch( SCSIOP_GET_DEVICE, instance, 0, device );
}

void SCSIReset( SCSIInstance *instance )
{
	instance->scsiClass->dispatch( SCSIOP_RESET_DEVICE, instance, 0, NULL );
}

void SCSIExecCommand( SCSIInstance *instance, int *resultLength )
{
	*resultLength = instance->scsiClass->dispatch( SCSIOP_EXEC_COMMAND, instance, 0, NULL );
}

void SCSISetCommand( SCSIInstance *instance, UINT8 *command, int commandLength )
{
	instance->scsiClass->dispatch( SCSIOP_SET_COMMAND, instance, commandLength, command );
}

void SCSIGetCommand( SCSIInstance *instance, UINT8 **command, int *commandLength )
{
	*commandLength = instance->scsiClass->dispatch( SCSIOP_GET_COMMAND, instance, 0, command );
}

void SCSIWriteData( SCSIInstance *instance, void *data, int dataLength )
{
	instance->scsiClass->dispatch( SCSIOP_WRITE_DATA, instance, dataLength, data );
}

void SCSIReadData( SCSIInstance *instance, void *data, int dataLength )
{
	instance->scsiClass->dispatch( SCSIOP_READ_DATA, instance, dataLength, data );
}

void SCSISetPhase( SCSIInstance *instance, int phase )
{
	instance->scsiClass->dispatch( SCSIOP_SET_PHASE, instance, phase, NULL );
}

void SCSIGetPhase( SCSIInstance *instance, int *phase )
{
	*phase = instance->scsiClass->dispatch( SCSIOP_GET_PHASE, instance, 0, NULL );
}

int SCSIBase( SCSIClass *scsiClass, int operation, void *file, INT64 intparm, UINT8 *ptrparm )
{
	return scsiClass->baseClass->dispatch( operation, file, intparm, ptrparm );
}

SCSIInstance *SCSIMalloc( SCSIClass *scsiClass )
{
	SCSIInstance *scsiInstance = (SCSIInstance *) malloc_or_die( SCSISizeof( scsiClass ) );
	scsiInstance->scsiClass = scsiClass;
	return scsiInstance;
}

void *SCSIThis( SCSIClass *scsiClass, SCSIInstance *instance )
{
	if( instance != NULL )
	{
		int sizeofBase = sizeof( SCSIInstance );

		while( scsiClass->baseClass != NULL )
		{
			scsiClass = scsiClass->baseClass;
			sizeofBase += scsiClass->sizeofData;
		}

		return ( (UINT8*)instance ) + sizeofBase;
	}

	return NULL;
}

int SCSISizeof( SCSIClass *scsiClass )
{
	int sizeofData = sizeof( SCSIInstance );

	while( scsiClass != NULL )
	{
		sizeofData += scsiClass->sizeofData;
		scsiClass = scsiClass->baseClass;
	}

	return sizeofData;
}

int SCSILengthFromUINT8( UINT8 *length )
{
	if( *length == 0 )
	{
		return 256;
	}

	return *length;
}

int SCSILengthFromUINT16( UINT8 *length )
{
	return ( *(length) << 8 ) | *(length + 1 );
}