Skip to content

Commit

Permalink
Modernize adc1038 and adc12138 devices. [Osso]
Browse files Browse the repository at this point in the history
  • Loading branch information
andrew-gardner committed Jun 8, 2013
1 parent 9eafc98 commit f5ed861
Show file tree
Hide file tree
Showing 9 changed files with 302 additions and 410 deletions.
210 changes: 77 additions & 133 deletions src/emu/machine/adc1038.c
Expand Up @@ -10,185 +10,129 @@
#include "emu.h"
#include "adc1038.h"

/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/

struct adc1038_state
const device_type ADC1038 = &device_creator<adc1038_device>;

adc1038_device::adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, ADC1038, "A/D Converters 1038", tag, owner, clock)
{
int cycle;
int clk;
int adr;
int data_in;
int data_out;
int adc_data;
int sars;
adc1038_input_read_func input_callback_r;

int gticlub_hack;
};
}

/*****************************************************************************
INLINE FUNCTIONS
*****************************************************************************/
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------

INLINE adc1038_state *adc1038_get_safe_token( device_t *device )
void adc1038_device::device_config_complete()
{
assert(device != NULL);
assert(device->type() == ADC1038);
// inherit a copy of the static data
const adc1038_interface *intf = reinterpret_cast<const adc1038_interface *>(static_config());
if (intf != NULL)
*static_cast<adc1038_interface *>(this) = *intf;

return (adc1038_state *)downcast<adc1038_device *>(device)->token();
// or initialize to defaults if none provided
else
{
input_callback_r = NULL;
}
}

INLINE const adc1038_interface *adc1038_get_interface( device_t *device )
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------

void adc1038_device::device_start()
{
m_input_callback_r_func = input_callback_r;

save_item(NAME(m_cycle));
save_item(NAME(m_clk));
save_item(NAME(m_adr));
save_item(NAME(m_data_in));
save_item(NAME(m_data_out));
save_item(NAME(m_adc_data));
save_item(NAME(m_sars));
}

//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------

void adc1038_device::device_reset()
{
assert(device != NULL);
assert((device->type() == ADC1038));
return (const adc1038_interface *) device->static_config();
m_cycle = 0;
m_clk = 0;
m_adr = 0;
m_data_in = 0;
m_data_out = 0;
m_adc_data = 0;
m_sars = 1;
}

/*****************************************************************************
DEVICE HANDLERS
*****************************************************************************/

READ_LINE_DEVICE_HANDLER( adc1038_do_read )
READ_LINE_MEMBER( adc1038_device::do_read )
{
adc1038_state *adc1038 = adc1038_get_safe_token(device);

adc1038->data_out = (adc1038->adc_data & 0x200) ? 1 : 0;
adc1038->adc_data <<= 1;
m_data_out = (m_adc_data & 0x200) ? 1 : 0;
m_adc_data <<= 1;

//printf("ADC DO\n");
return adc1038->data_out;
return m_data_out;
}

WRITE_LINE_DEVICE_HANDLER( adc1038_di_write )
WRITE_LINE_MEMBER( adc1038_device::di_write )
{
adc1038_state *adc1038 = adc1038_get_safe_token(device);

adc1038->data_in = state;
m_data_in = state;
}

WRITE_LINE_DEVICE_HANDLER( adc1038_clk_write )
WRITE_LINE_MEMBER( adc1038_device::clk_write )
{
adc1038_state *adc1038 = adc1038_get_safe_token(device);

// GTI Club doesn't sync on SARS
if (adc1038->gticlub_hack)
if (m_gticlub_hack)
{
if (adc1038->clk == 0 && state == 0)
if (m_clk == 0 && state == 0)
{
adc1038->cycle = 0;
m_cycle = 0;

/* notice that adc1038->adr is always < 7! */
adc1038->adc_data = adc1038->input_callback_r(device, adc1038->adr);
/* notice that m_adr is always < 7! */
m_adc_data = m_input_callback_r_func(this, m_adr);
}
}

if (state == 1)
{
//printf("ADC CLK, DI = %d, cycle = %d\n", adc1038->data_in, adc1038->cycle);
//printf("ADC CLK, DI = %d, cycle = %d\n", m_data_in, m_cycle);

if (adc1038->cycle == 0) // A2
if (m_cycle == 0) // A2
{
adc1038->adr = 0;
adc1038->adr |= (adc1038->data_in << 2);
m_adr = 0;
m_adr |= (m_data_in << 2);
}
else if (adc1038->cycle == 1) // A1
else if (m_cycle == 1) // A1
{
adc1038->adr |= (adc1038->data_in << 1);
m_adr |= (m_data_in << 1);
}
else if (adc1038->cycle == 2) // A0
else if (m_cycle == 2) // A0
{
adc1038->adr |= (adc1038->data_in << 0);
m_adr |= (m_data_in << 0);
}

adc1038->cycle++;
m_cycle++;
}

adc1038->clk = state;
m_clk = state;
}

READ_LINE_DEVICE_HANDLER( adc1038_sars_read )
READ_LINE_MEMBER( adc1038_device::sars_read )
{
adc1038_state *adc1038 = adc1038_get_safe_token(device);
m_cycle = 0;

adc1038->cycle = 0;
/* notice that m_adr is always < 7! */
m_adc_data = m_input_callback_r_func(this, m_adr);

/* notice that adc1038->adr is always < 7! */
adc1038->adc_data = adc1038->input_callback_r(device, adc1038->adr);

adc1038->sars ^= 1;
return adc1038->sars;
}


/*****************************************************************************
DEVICE INTERFACE
*****************************************************************************/

static DEVICE_START( adc1038 )
{
adc1038_state *adc1038 = adc1038_get_safe_token(device);
const adc1038_interface *intf = adc1038_get_interface(device);

adc1038->gticlub_hack = intf->gticlub_hack;
adc1038->input_callback_r = intf->input_callback_r;

device->save_item(NAME(adc1038->cycle));
device->save_item(NAME(adc1038->clk));
device->save_item(NAME(adc1038->adr));
device->save_item(NAME(adc1038->data_in));
device->save_item(NAME(adc1038->data_out));
device->save_item(NAME(adc1038->adc_data));
device->save_item(NAME(adc1038->sars));
}

static DEVICE_RESET( adc1038 )
{
adc1038_state *adc1038 = adc1038_get_safe_token(device);

adc1038->cycle = 0;
adc1038->clk = 0;
adc1038->adr = 0;
adc1038->data_in = 0;
adc1038->data_out = 0;
adc1038->adc_data = 0;
adc1038->sars = 1;
}

const device_type ADC1038 = &device_creator<adc1038_device>;

adc1038_device::adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, ADC1038, "A/D Converters 1038", tag, owner, clock)
{
m_token = global_alloc_clear(adc1038_state);
}

//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------

void adc1038_device::device_config_complete()
{
}

//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------

void adc1038_device::device_start()
{
DEVICE_START_NAME( adc1038 )(this);
}

//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------

void adc1038_device::device_reset()
{
DEVICE_RESET_NAME( adc1038 )(this);
m_sars ^= 1;
return m_sars;
}
36 changes: 20 additions & 16 deletions src/emu/machine/adc1038.h
Expand Up @@ -21,7 +21,7 @@ typedef int (*adc1038_input_read_func)(device_t *device, int input);

struct adc1038_interface
{
int gticlub_hack;
int m_gticlub_hack;
adc1038_input_read_func input_callback_r;
};

Expand All @@ -30,22 +30,35 @@ struct adc1038_interface
MACROS / CONSTANTS
***************************************************************************/

class adc1038_device : public device_t
class adc1038_device : public device_t,
public adc1038_interface
{
public:
adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~adc1038_device() { global_free(m_token); }
~adc1038_device() {}

DECLARE_READ_LINE_MEMBER( do_read );
DECLARE_READ_LINE_MEMBER( sars_read );
DECLARE_WRITE_LINE_MEMBER( di_write );
DECLARE_WRITE_LINE_MEMBER( clk_write );

// access to legacy token
void *token() const { assert(m_token != NULL); return m_token; }
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
virtual void device_reset();
private:

adc1038_input_read_func m_input_callback_r_func;

private:
// internal state
void *m_token;
int m_cycle;
int m_clk;
int m_adr;
int m_data_in;
int m_data_out;
int m_adc_data;
int m_sars;
};

extern const device_type ADC1038;
Expand All @@ -56,13 +69,4 @@ extern const device_type ADC1038;
MCFG_DEVICE_CONFIG(_config)


/***************************************************************************
DEVICE I/O FUNCTIONS
***************************************************************************/

extern READ_LINE_DEVICE_HANDLER( adc1038_do_read );
extern READ_LINE_DEVICE_HANDLER( adc1038_sars_read );
extern WRITE_LINE_DEVICE_HANDLER( adc1038_di_write );
extern WRITE_LINE_DEVICE_HANDLER( adc1038_clk_write );

#endif /* __ADC1038_H__ */

0 comments on commit f5ed861

Please sign in to comment.