make mcs51 callbacks used delegates (nw)

This commit is contained in:
Miodrag Milanovic 2013-04-01 07:44:46 +00:00
parent c7997dab4b
commit 72c391a1e9
14 changed files with 63 additions and 77 deletions

View File

@ -290,8 +290,8 @@ struct mcs51_state_t
/* Serial Port TX/RX Callbacks */ /* Serial Port TX/RX Callbacks */
// TODO: Move to special port r/w // TODO: Move to special port r/w
mcs51_serial_tx_func serial_tx_callback; //Call back funciton when sending data out of serial port write8_delegate serial_tx_callback; //Call back funciton when sending data out of serial port
mcs51_serial_rx_func serial_rx_callback; //Call back function to retrieve data when receiving serial port data read8_delegate serial_rx_callback; //Call back function to retrieve data when receiving serial port data
/* DS5002FP */ /* DS5002FP */
struct { struct {
@ -925,8 +925,8 @@ INLINE void transmit_receive(mcs51_state_t *mcs51_state, int source)
mcs51_state->uart.bits_to_send--; mcs51_state->uart.bits_to_send--;
if(mcs51_state->uart.bits_to_send == 0) { if(mcs51_state->uart.bits_to_send == 0) {
//Call the callback function //Call the callback function
if(mcs51_state->serial_tx_callback) if(!mcs51_state->serial_tx_callback.isnull())
mcs51_state->serial_tx_callback(mcs51_state->device, mcs51_state->uart.data_out); mcs51_state->serial_tx_callback(*mcs51_state->io, 0, mcs51_state->uart.data_out, 0xff);
//Set Interrupt Flag //Set Interrupt Flag
SET_TI(1); SET_TI(1);
} }
@ -944,8 +944,8 @@ INLINE void transmit_receive(mcs51_state_t *mcs51_state, int source)
{ {
int data = 0; int data = 0;
//Call our callball function to retrieve the data //Call our callball function to retrieve the data
if(mcs51_state->serial_rx_callback) if(!mcs51_state->serial_rx_callback.isnull())
data = mcs51_state->serial_rx_callback(mcs51_state->device); data = mcs51_state->serial_rx_callback(*mcs51_state->io, 0, 0xff);
LOG(("RX Deliver %d\n", data)); LOG(("RX Deliver %d\n", data));
SET_SBUF(data); SET_SBUF(data);
//Flag the IRQ //Flag the IRQ
@ -1283,13 +1283,13 @@ INLINE void update_irq_prio(mcs51_state_t *mcs51_state, UINT8 ipl, UINT8 iph)
***************************************************************************/ ***************************************************************************/
void i8051_set_serial_tx_callback(device_t *device, mcs51_serial_tx_func tx_func) void i8051_set_serial_tx_callback(device_t *device, write8_delegate tx_func)
{ {
mcs51_state_t *mcs51_state = get_safe_token(device); mcs51_state_t *mcs51_state = get_safe_token(device);
mcs51_state->serial_tx_callback = tx_func; mcs51_state->serial_tx_callback = tx_func;
} }
void i8051_set_serial_rx_callback(device_t *device, mcs51_serial_rx_func rx_func) void i8051_set_serial_rx_callback(device_t *device, read8_delegate rx_func)
{ {
mcs51_state_t *mcs51_state = get_safe_token(device); mcs51_state_t *mcs51_state = get_safe_token(device);
mcs51_state->serial_rx_callback = rx_func; mcs51_state->serial_rx_callback = rx_func;

View File

@ -87,12 +87,8 @@ struct ds5002fp_config
/*************************************************************************** /***************************************************************************
FUNCTION PROTOTYPES FUNCTION PROTOTYPES
***************************************************************************/ ***************************************************************************/
extern void i8051_set_serial_tx_callback(device_t *device, write8_delegate tx_func);
typedef void (*mcs51_serial_tx_func)(device_t *device, int data); extern void i8051_set_serial_rx_callback(device_t *device, read8_delegate rx_func);
typedef int (*mcs51_serial_rx_func)(device_t *device);
extern void i8051_set_serial_tx_callback(device_t *device, mcs51_serial_tx_func tx_func);
extern void i8051_set_serial_rx_callback(device_t *device, mcs51_serial_rx_func rx_func);
/* variants with no internal rom and 128 byte internal memory */ /* variants with no internal rom and 128 byte internal memory */
DECLARE_LEGACY_CPU_DEVICE(I8031, i8031); DECLARE_LEGACY_CPU_DEVICE(I8031, i8031);

View File

@ -133,9 +133,6 @@
// device type definition // device type definition
const device_type QS1000 = &device_creator<qs1000_device>; const device_type QS1000 = &device_creator<qs1000_device>;
static int data_to_i8052(device_t *device);
//************************************************************************** //**************************************************************************
// GLOBAL VARIABLES // GLOBAL VARIABLES
//************************************************************************** //**************************************************************************
@ -237,7 +234,7 @@ void qs1000_device::device_start()
m_p2_w_func.resolve(m_out_p2_cb, *this); m_p2_w_func.resolve(m_out_p2_cb, *this);
m_p3_w_func.resolve(m_out_p3_cb, *this); m_p3_w_func.resolve(m_out_p3_cb, *this);
i8051_set_serial_rx_callback(m_cpu, data_to_i8052); i8051_set_serial_rx_callback(m_cpu, read8_delegate(FUNC(qs1000_device::data_to_i8052),this));
// TODO: register state for saving // TODO: register state for saving
} }
@ -270,12 +267,9 @@ void qs1000_device::set_irq(int state)
// data_to_i8052 - called by the 8052 core to // data_to_i8052 - called by the 8052 core to
// receive serial data // receive serial data
//------------------------------------------------- //-------------------------------------------------
static int data_to_i8052(device_t *device) READ8_MEMBER(qs1000_device::data_to_i8052)
{ {
// Ugh return m_serial_data_in;
qs1000_device *qs1000 = device->machine().device<qs1000_device>("qs1000");
return qs1000->m_serial_data_in;
} }

View File

@ -82,6 +82,7 @@ protected:
// device_sound_interface overrides // device_sound_interface overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
DECLARE_READ8_MEMBER( data_to_i8052 );
public: public:
DECLARE_WRITE8_MEMBER( wave_w ); DECLARE_WRITE8_MEMBER( wave_w );

View File

@ -225,11 +225,10 @@ WRITE8_MEMBER( eolith_state::qs1000_p1_w )
* *
*************************************/ *************************************/
static void soundcpu_to_qs1000(device_t *device, int data) WRITE8_MEMBER(eolith_state::soundcpu_to_qs1000)
{ {
eolith_state *state = device->machine().driver_data<eolith_state>(); m_qs1000->serial_in(data);
state->m_qs1000->serial_in(data); machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(250));
device->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(250));
} }
@ -1478,7 +1477,7 @@ DRIVER_INIT_MEMBER(eolith_state,eolith)
init_eolith_speedup(machine()); init_eolith_speedup(machine());
// Sound CPU -> QS1000 CPU serial link // Sound CPU -> QS1000 CPU serial link
i8051_set_serial_tx_callback(machine().device("soundcpu"), soundcpu_to_qs1000); i8051_set_serial_tx_callback(machine().device("soundcpu"), write8_delegate(FUNC(eolith_state::soundcpu_to_qs1000),this));
// Configure the sound ROM banking // Configure the sound ROM banking
membank("sound_bank")->configure_entries(0, 16, memregion("sounddata")->base(), 0x8000); membank("sound_bank")->configure_entries(0, 16, memregion("sounddata")->base(), 0x8000);

View File

@ -244,6 +244,8 @@ public:
UINT32 screen_update_maygayv1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_maygayv1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void screen_eof_maygayv1(screen_device &screen, bool state); void screen_eof_maygayv1(screen_device &screen, bool state);
INTERRUPT_GEN_MEMBER(vsync_interrupt); INTERRUPT_GEN_MEMBER(vsync_interrupt);
DECLARE_WRITE8_MEMBER(data_from_i8031);
DECLARE_READ8_MEMBER(data_to_i8031);
}; };
@ -959,16 +961,14 @@ static const duart68681_config maygayv1_duart68681_config =
}; };
static int data_to_i8031(device_t *device) READ8_MEMBER(maygayv1_state::data_to_i8031)
{ {
maygayv1_state *state = device->machine().driver_data<maygayv1_state>(); return m_d68681_val;
return state->m_d68681_val;
} }
static void data_from_i8031(device_t *device, int data) WRITE8_MEMBER(maygayv1_state::data_from_i8031)
{ {
maygayv1_state *state = device->machine().driver_data<maygayv1_state>(); duart68681_rx_data(m_duart68681, 0, data);
duart68681_rx_data(state->m_duart68681, 0, data);
} }
READ8_MEMBER(maygayv1_state::b_read) READ8_MEMBER(maygayv1_state::b_read)
@ -1011,8 +1011,8 @@ void maygayv1_state::machine_start()
// duart_68681_init(DUART_CLOCK, duart_irq_handler, duart_tx); // duart_68681_init(DUART_CLOCK, duart_irq_handler, duart_tx);
i8051_set_serial_tx_callback(machine().device("soundcpu"), data_from_i8031); i8051_set_serial_tx_callback(machine().device("soundcpu"), write8_delegate(FUNC(maygayv1_state::data_from_i8031),this));
i8051_set_serial_rx_callback(machine().device("soundcpu"), data_to_i8031); i8051_set_serial_rx_callback(machine().device("soundcpu"), read8_delegate(FUNC(maygayv1_state::data_to_i8031),this));
} }
void maygayv1_state::machine_reset() void maygayv1_state::machine_reset()

View File

@ -61,4 +61,5 @@ public:
DECLARE_VIDEO_START(eolith); DECLARE_VIDEO_START(eolith);
UINT32 screen_update_eolith(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_eolith(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(eolith_speedup); TIMER_DEVICE_CALLBACK_MEMBER(eolith_speedup);
DECLARE_WRITE8_MEMBER(soundcpu_to_qs1000);
}; };

View File

@ -118,6 +118,8 @@ public:
TIMER_CALLBACK_MEMBER(mac_done_callback); TIMER_CALLBACK_MEMBER(mac_done_callback);
TIMER_CALLBACK_MEMBER(adc_done_callback); TIMER_CALLBACK_MEMBER(adc_done_callback);
DECLARE_WRITE8_MEMBER(micro3d_upd7759_w); DECLARE_WRITE8_MEMBER(micro3d_upd7759_w);
DECLARE_WRITE8_MEMBER(data_from_i8031);
DECLARE_READ8_MEMBER(data_to_i8031);
}; };
struct micro3d_vtx struct micro3d_vtx

View File

@ -53,16 +53,14 @@ void micro3d_duart_tx(device_t *device, int channel, UINT8 data)
} }
}; };
static int data_to_i8031(device_t *device) READ8_MEMBER(micro3d_state::data_to_i8031)
{ {
micro3d_state *state = device->machine().driver_data<micro3d_state>(); return m_m68681_tx0;
return state->m_m68681_tx0;
} }
static void data_from_i8031(device_t *device, int data) WRITE8_MEMBER(micro3d_state::data_from_i8031)
{ {
micro3d_state *state = device->machine().driver_data<micro3d_state>(); duart68681_rx_data(m_duart68681, 1, data);
duart68681_rx_data(state->m_duart68681, 1, data);
} }
/* /*
@ -603,8 +601,8 @@ DRIVER_INIT_MEMBER(micro3d_state,micro3d)
{ {
address_space &space = machine().device("drmath")->memory().space(AS_DATA); address_space &space = machine().device("drmath")->memory().space(AS_DATA);
i8051_set_serial_tx_callback(machine().device("audiocpu"), data_from_i8031); i8051_set_serial_tx_callback(machine().device("audiocpu"), write8_delegate(FUNC(micro3d_state::data_from_i8031),this));
i8051_set_serial_rx_callback(machine().device("audiocpu"), data_to_i8031); i8051_set_serial_rx_callback(machine().device("audiocpu"), read8_delegate(FUNC(micro3d_state::data_to_i8031),this));
m_duart68681 = machine().device("duart68681"); m_duart68681 = machine().device("duart68681");

View File

@ -50,6 +50,8 @@ public:
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<generic_terminal_device> m_terminal; required_device<generic_terminal_device> m_terminal;
virtual void machine_reset(); virtual void machine_reset();
DECLARE_WRITE8_MEMBER(to_term);
DECLARE_READ8_MEMBER(from_term);
}; };
@ -77,17 +79,14 @@ static INPUT_PORTS_START( basic52 )
INPUT_PORTS_END INPUT_PORTS_END
// won't compile unless these are static // won't compile unless these are static
static void to_term(device_t *device, int data ) WRITE8_MEMBER( basic52_state::to_term)
{ {
basic52_state *state = device->machine().driver_data<basic52_state>(); m_terminal->write(space, 0, data);
address_space &space = device->memory().space(AS_PROGRAM);
state->m_terminal->write(space, 0, data);
} }
static int from_term(device_t *device) READ8_MEMBER(basic52_state::from_term)
{ {
basic52_state *state = device->machine().driver_data<basic52_state>(); return m_term_data;
return state->m_term_data;
} }
READ8_MEMBER( basic52_state::unk_r) READ8_MEMBER( basic52_state::unk_r)
@ -97,8 +96,8 @@ READ8_MEMBER( basic52_state::unk_r)
void basic52_state::machine_reset() void basic52_state::machine_reset()
{ {
i8051_set_serial_tx_callback(m_maincpu, to_term); i8051_set_serial_tx_callback(m_maincpu, write8_delegate(FUNC(basic52_state::to_term),this));
i8051_set_serial_rx_callback(m_maincpu, from_term); i8051_set_serial_rx_callback(m_maincpu, read8_delegate(FUNC(basic52_state::from_term),this));
} }
WRITE8_MEMBER( basic52_state::kbd_put ) WRITE8_MEMBER( basic52_state::kbd_put )

View File

@ -96,24 +96,22 @@ static GENERIC_TERMINAL_INTERFACE( pes_terminal_intf )
}; };
/* Helper Functions */ /* Helper Functions */
static int data_to_i8031(device_t *device) READ8_MEMBER( pes_state::data_to_i8031)
{ {
pes_state *state = device->machine().driver_data<pes_state>();
UINT8 data; UINT8 data;
data = state->m_infifo[state->m_infifo_tail_ptr]; data = m_infifo[m_infifo_tail_ptr];
// if fifo is empty (tail ptr == head ptr), do not increment the tail ptr, otherwise do. // if fifo is empty (tail ptr == head ptr), do not increment the tail ptr, otherwise do.
if (state->m_infifo_tail_ptr != state->m_infifo_head_ptr) state->m_infifo_tail_ptr++; if (m_infifo_tail_ptr != m_infifo_head_ptr) m_infifo_tail_ptr++;
state->m_infifo_tail_ptr&=0x1F; m_infifo_tail_ptr&=0x1F;
#ifdef DEBUG_SERIAL_CB #ifdef DEBUG_SERIAL_CB
fprintf(stderr,"callback: input to i8031/pes from pc/terminal: %02X\n",data); fprintf(stderr,"callback: input to i8031/pes from pc/terminal: %02X\n",data);
#endif #endif
return data; return data;
} }
static void data_from_i8031(device_t *device, int data) WRITE8_MEMBER(pes_state::data_from_i8031)
{ {
pes_state *state = device->machine().driver_data<pes_state>(); m_terminal->write(space,0,data);
state->m_terminal->write(device->machine().driver_data()->generic_space(),0,data);
#ifdef DEBUG_SERIAL_CB #ifdef DEBUG_SERIAL_CB
fprintf(stderr,"callback: output from i8031/pes to pc/terminal: %02X\n",data); fprintf(stderr,"callback: output from i8031/pes to pc/terminal: %02X\n",data);
#endif #endif
@ -230,8 +228,8 @@ void pes_state::machine_reset()
DRIVER_INIT_MEMBER(pes_state,pes) DRIVER_INIT_MEMBER(pes_state,pes)
{ {
i8051_set_serial_tx_callback(machine().device("maincpu"), data_from_i8031); i8051_set_serial_tx_callback(machine().device("maincpu"), write8_delegate(FUNC(pes_state::data_from_i8031),this));
i8051_set_serial_rx_callback(machine().device("maincpu"), data_to_i8031); i8051_set_serial_rx_callback(machine().device("maincpu"), read8_delegate(FUNC(pes_state::data_to_i8031),this));
} }
/****************************************************************************** /******************************************************************************

View File

@ -41,6 +41,8 @@ public:
DECLARE_READ8_MEMBER(port3_r); DECLARE_READ8_MEMBER(port3_r);
DECLARE_DRIVER_INIT(pes); DECLARE_DRIVER_INIT(pes);
DECLARE_WRITE8_MEMBER(pes_kbd_input); DECLARE_WRITE8_MEMBER(pes_kbd_input);
DECLARE_READ8_MEMBER(data_to_i8031);
DECLARE_WRITE8_MEMBER(data_from_i8031);
}; };

View File

@ -413,8 +413,8 @@ wangpc_keyboard_device::wangpc_keyboard_device(const machine_config &mconfig, co
void wangpc_keyboard_device::device_start() void wangpc_keyboard_device::device_start()
{ {
// set serial callbacks // set serial callbacks
i8051_set_serial_tx_callback(m_maincpu, wangpc_keyboard_device::mcs51_tx_callback); i8051_set_serial_tx_callback(m_maincpu, write8_delegate(FUNC(wangpc_keyboard_device::mcs51_tx_callback),this));
i8051_set_serial_rx_callback(m_maincpu, wangpc_keyboard_device::mcs51_rx_callback); i8051_set_serial_rx_callback(m_maincpu, read8_delegate(FUNC(wangpc_keyboard_device::mcs51_rx_callback),this));
set_data_frame(8, 2, SERIAL_PARITY_NONE); set_data_frame(8, 2, SERIAL_PARITY_NONE);
} }
@ -457,11 +457,9 @@ void wangpc_keyboard_device::input_callback(UINT8 state)
// mcs51_rx_callback - // mcs51_rx_callback -
//------------------------------------------------- //-------------------------------------------------
int wangpc_keyboard_device::mcs51_rx_callback(device_t *device) READ8_MEMBER(wangpc_keyboard_device::mcs51_rx_callback)
{ {
wangpc_keyboard_device *kb = static_cast<wangpc_keyboard_device *>(device->owner()); return get_received_char();
return kb->get_received_char();
} }
@ -469,18 +467,16 @@ int wangpc_keyboard_device::mcs51_rx_callback(device_t *device)
// mcs51_tx_callback - // mcs51_tx_callback -
//------------------------------------------------- //-------------------------------------------------
void wangpc_keyboard_device::mcs51_tx_callback(device_t *device, int data) WRITE8_MEMBER(wangpc_keyboard_device::mcs51_tx_callback)
{ {
wangpc_keyboard_device *kb = static_cast<wangpc_keyboard_device *>(device->owner());
if (LOG) logerror("Wang PC keyboard transmit data %02x\n", data); if (LOG) logerror("Wang PC keyboard transmit data %02x\n", data);
kb->transmit_register_setup(data); transmit_register_setup(data);
// HACK bang the bits out immediately // HACK bang the bits out immediately
while (!kb->is_transmit_register_empty()) while (!is_transmit_register_empty())
{ {
kb->transmit_register_send_bit(); transmit_register_send_bit();
} }
} }

View File

@ -60,8 +60,8 @@ public:
DECLARE_WRITE8_MEMBER( kb_p2_w ); DECLARE_WRITE8_MEMBER( kb_p2_w );
DECLARE_WRITE8_MEMBER( kb_p3_w ); DECLARE_WRITE8_MEMBER( kb_p3_w );
static int mcs51_rx_callback(device_t *device); DECLARE_READ8_MEMBER(mcs51_rx_callback);
static void mcs51_tx_callback(device_t *device, int data); DECLARE_WRITE8_MEMBER(mcs51_tx_callback);
protected: protected:
// device-level overrides // device-level overrides