diff options
Diffstat (limited to 'trunk/src/emu/machine/scsi.c')
-rw-r--r-- | trunk/src/emu/machine/scsi.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/trunk/src/emu/machine/scsi.c b/trunk/src/emu/machine/scsi.c new file mode 100644 index 00000000000..9506bb1fe0a --- /dev/null +++ b/trunk/src/emu/machine/scsi.c @@ -0,0 +1,159 @@ +#include "emu.h" +#include "scsi.h" + +void SCSIAllocInstance( running_machine &machine, const SCSIClass *scsiClass, SCSIInstance **instance, const char *diskregion ) +{ + SCSIAllocInstanceParams params; + params.instance = NULL; + params.diskregion = diskregion; + params.m_machine = &machine; + scsiClass->dispatch( SCSIOP_ALLOC_INSTANCE, (void *)scsiClass, 0, ¶ms ); + *instance = params.instance; +} + +void SCSIDeleteInstance( SCSIInstance *instance ) +{ + if (instance) + { + instance->scsiClass->dispatch( SCSIOP_DELETE_INSTANCE, instance, 0, NULL ); + } +} + +void SCSISetDevice( SCSIInstance *instance, void *device ) +{ + if (instance) + { + instance->scsiClass->dispatch( SCSIOP_SET_DEVICE, instance, 0, device ); + } +} + +void SCSIGetDevice( SCSIInstance *instance, void **device ) +{ + if (instance) + { + instance->scsiClass->dispatch( SCSIOP_GET_DEVICE, instance, 0, device ); + } +} + +void SCSIReset( SCSIInstance *instance ) +{ + if (instance) + { + instance->scsiClass->dispatch( SCSIOP_RESET_DEVICE, instance, 0, NULL ); + } +} + +void SCSIExecCommand( SCSIInstance *instance, int *resultLength ) +{ + if (instance) + { + *resultLength = instance->scsiClass->dispatch( SCSIOP_EXEC_COMMAND, instance, 0, NULL ); + } +} + +void SCSISetCommand( SCSIInstance *instance, UINT8 *command, int commandLength ) +{ + if (instance) + { + instance->scsiClass->dispatch( SCSIOP_SET_COMMAND, instance, commandLength, command ); + } +} + +void SCSIGetCommand( SCSIInstance *instance, UINT8 **command, int *commandLength ) +{ + if (instance) + { + *commandLength = instance->scsiClass->dispatch( SCSIOP_GET_COMMAND, instance, 0, command ); + } +} + +void SCSIWriteData( SCSIInstance *instance, void *data, int dataLength ) +{ + if (instance) + { + instance->scsiClass->dispatch( SCSIOP_WRITE_DATA, instance, dataLength, data ); + } +} + +void SCSIReadData( SCSIInstance *instance, void *data, int dataLength ) +{ + if (instance) + { + instance->scsiClass->dispatch( SCSIOP_READ_DATA, instance, dataLength, data ); + } +} + +void SCSISetPhase( SCSIInstance *instance, int phase ) +{ + if (instance) + { + instance->scsiClass->dispatch( SCSIOP_SET_PHASE, instance, phase, NULL ); + } +} + +void SCSIGetPhase( SCSIInstance *instance, int *phase ) +{ + if (instance) + { + *phase = instance->scsiClass->dispatch( SCSIOP_GET_PHASE, instance, 0, NULL ); + } +} + +int SCSIBase( const SCSIClass *scsiClass, int operation, void *file, INT64 intparm, UINT8 *ptrparm ) +{ + return scsiClass->baseClass->dispatch( operation, file, intparm, ptrparm ); +} + +SCSIInstance *SCSIMalloc( running_machine &machine, const SCSIClass *scsiClass ) +{ + SCSIInstance *scsiInstance = (SCSIInstance *)auto_alloc_array(machine, UINT8, SCSISizeof( scsiClass )); + scsiInstance->scsiClass = scsiClass; + scsiInstance->m_machine = &machine; + return scsiInstance; +} + +void *SCSIThis( const 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( const 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 ); +} |