summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/machine/legscsi.cpp
blob: c379c797f730fd2ed3b8707ec7c0fcd635a89b45 (plain) (tree)
1
2
3
4
5
6
7
8
9

                        
                

                    

                                                                                                                                                     

                                                    











                                                        
                                       










                                                         
                               






                            
                                                                     

                                                         
                               





                                                 
                                                                          





                                                         
                               






                                            
                                                                        






                                                         
                               






                                          
                                                                       



                         
                                                                  

                                                         
                               




                                               
                                                                       


         
                                                                   

                                                         
                               




                                                
                                                                        


         
                                              

                                                         
                               



                                           
                                     





                                    
                                                                        





                                                            
                                      
                                                          
         
                                                                                             
                                    

                                                                                              
                                               








                                                                 
                       
 
// license:BSD-3-Clause
// copyright-holders:smf
#include "emu.h"
#include "legscsi.h"

legacy_scsi_host_adapter::legacy_scsi_host_adapter(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
	: device_t(mconfig, type, tag, owner, clock)
	, m_selected(0)
	, m_scsi_port(*this, finder_base::DUMMY_TAG)
{
}

void legacy_scsi_host_adapter::device_start()
{
}

void legacy_scsi_host_adapter::reset_bus()
{
	for (int i = 0; i <= 7; i++)
	{
		scsihle_device *scsidev = get_device(i);
		if (scsidev != nullptr)
		{
			scsidev->reset();
		}
	}
}

bool legacy_scsi_host_adapter::select(int id)
{
	m_selected = id;

	scsihle_device *scsidev = get_device(m_selected);
	if (scsidev != nullptr)
	{
		return true;
	}

	return false;
}

void legacy_scsi_host_adapter::send_command(uint8_t *data, int bytes)
{
	scsihle_device *scsidev = get_device(m_selected);
	if (scsidev != nullptr)
	{
		scsidev->SetCommand(data, bytes);
		scsidev->ExecCommand();
	}
	else
	{
		logerror("send_command unknown SCSI id %d\n", m_selected);
	}
}

int legacy_scsi_host_adapter::get_length(void)
{
	scsihle_device *scsidev = get_device(m_selected);
	if (scsidev != nullptr)
	{
		int length;
		scsidev->GetLength(&length);
		return length;
	}
	else
	{
		logerror("get_length unknown SCSI id %d\n", m_selected);
		return 0;
	}
}

int legacy_scsi_host_adapter::get_phase(void)
{
	scsihle_device *scsidev = get_device(m_selected);
	if (scsidev != nullptr)
	{
		int phase;
		scsidev->GetPhase(&phase);
		return phase;
	}
	else
	{
		logerror("get_phase unknown SCSI id %d\n", m_selected);
		return 0;
	}
}

void legacy_scsi_host_adapter::read_data(uint8_t *data, int bytes)
{
	scsihle_device *scsidev = get_device(m_selected);
	if (scsidev != nullptr)
	{
		scsidev->ReadData(data, bytes);
	}
	else
	{
		logerror("read_data unknown SCSI id %d\n", m_selected);
	}
}

void legacy_scsi_host_adapter::write_data(uint8_t *data, int bytes)
{
	scsihle_device *scsidev = get_device(m_selected);
	if (scsidev != nullptr)
	{
		scsidev->WriteData(data, bytes);
	}
	else
	{
		logerror("write_data unknown SCSI id %d\n", m_selected);
	}
}

uint8_t legacy_scsi_host_adapter::get_status()
{
	scsihle_device *scsidev = get_device(m_selected);
	if (scsidev != nullptr)
	{
		void *image;

		scsidev->GetDevice(&image);
		if (image != nullptr)
			return 0x00;

		return 0x02;
	}
	else
	{
		logerror("get_status unknown SCSI id %d\n", m_selected);
		return 0;
	}
}

scsihle_device *legacy_scsi_host_adapter::get_device(int id)
{
	// steal SCSI devices from bus
	for (device_t &device : m_scsi_port->subdevices())
	{
		scsi_port_slot_device *slot = dynamic_cast<scsi_port_slot_device *>(&device);
		if (slot != nullptr)
		{
			scsihle_device *scsidev = dynamic_cast<scsihle_device *>(slot->dev());
			if (scsidev != nullptr)
			{
				if (scsidev->GetDeviceID() == id)
				{
					return scsidev;
				}
			}
		}
	}

	return nullptr;
}