From 60b43c1d69f0f0f4f86796eb1d7c8a20d40e51ca Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Sun, 14 Dec 2008 23:47:30 +0000 Subject: [PATCH] Removed hack for setting mcs51 serial callbacks. Updated micro3d to use new functions. Fixes regression. --- src/emu/cpu/mcs51/mcs51.c | 32 ++++++++++---------------------- src/emu/cpu/mcs51/mcs51.h | 7 +++++-- src/mame/drivers/micro3d.c | 12 ++++++------ 3 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src/emu/cpu/mcs51/mcs51.c b/src/emu/cpu/mcs51/mcs51.c index 7f9bce22bd2..f1d37c214ce 100644 --- a/src/emu/cpu/mcs51/mcs51.c +++ b/src/emu/cpu/mcs51/mcs51.c @@ -290,8 +290,8 @@ struct _mcs51_state_t /* Serial Port TX/RX Callbacks */ // TODO: Move to special port r/w - void (*serial_tx_callback)(int data); //Call back funciton when sending data out of serial port - int (*serial_rx_callback)(void); //Call back function to retrieve data when receiving serial port data + mcs51_serial_tx_func 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 /* DS5002FP */ struct { @@ -631,13 +631,6 @@ struct _mcs51_state_t /* Clear Current IRQ */ #define CLEAR_CURRENT_IRQ() clear_current_irq(mcs51_state) -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ - -static void (*hold_serial_tx_callback)(int data); -static int (*hold_serial_rx_callback)(void); - /*************************************************************************** FUNCTION PROTOTYPES ***************************************************************************/ @@ -910,7 +903,7 @@ INLINE void transmit_receive(mcs51_state_t *mcs51_state, int source) if(mcs51_state->uart.bits_to_send == 0) { //Call the callback function if(mcs51_state->serial_tx_callback) - mcs51_state->serial_tx_callback(mcs51_state->uart.data_out); + mcs51_state->serial_tx_callback(mcs51_state->device, mcs51_state->uart.data_out); //Set Interrupt Flag SET_TI(1); } @@ -929,7 +922,7 @@ INLINE void transmit_receive(mcs51_state_t *mcs51_state, int source) int data = 0; //Call our callball function to retrieve the data if(mcs51_state->serial_rx_callback) - data = mcs51_state->serial_rx_callback(); + data = mcs51_state->serial_rx_callback(mcs51_state->device); LOG(("RX Deliver %d\n", data)); SET_SBUF(data); //Flag the IRQ @@ -1264,16 +1257,16 @@ INLINE void update_irq_prio(mcs51_state_t *mcs51_state, UINT8 ipl, UINT8 iph) ***************************************************************************/ -void i8051_set_serial_tx_callback(void (*callback)(int data)) +void i8051_set_serial_tx_callback(const device_config *device, mcs51_serial_tx_func tx_func) { - //Hold in static variable since this function can get called before reset has run, which wipes i8051 memory clean - hold_serial_tx_callback = callback; + mcs51_state_t *mcs51_state = device->token; + mcs51_state->serial_tx_callback = tx_func; } -void i8051_set_serial_rx_callback(int (*callback)(void)) +void i8051_set_serial_rx_callback(const device_config *device, mcs51_serial_rx_func rx_func) { - //Hold in static variable since this function can get called before reset has run, which wipes i8051 memory clean - hold_serial_rx_callback = callback; + mcs51_state_t *mcs51_state = device->token; + mcs51_state->serial_rx_callback = rx_func; } /*************************************************************************** @@ -2099,11 +2092,6 @@ static CPU_RESET( mcs51 ) mcs51_state_t *mcs51_state = device->token; update_ptrs(mcs51_state); - //Set up serial call back handlers - mcs51_state->serial_tx_callback = hold_serial_tx_callback; - hold_serial_tx_callback = NULL; - mcs51_state->serial_rx_callback = hold_serial_rx_callback; - hold_serial_rx_callback = NULL; mcs51_state->last_line_state = 0; mcs51_state->t0_cnt = 0; diff --git a/src/emu/cpu/mcs51/mcs51.h b/src/emu/cpu/mcs51/mcs51.h index 9c33d76984b..951bb93fe6e 100644 --- a/src/emu/cpu/mcs51/mcs51.h +++ b/src/emu/cpu/mcs51/mcs51.h @@ -90,8 +90,11 @@ struct _ds5002fp_config FUNCTION PROTOTYPES ***************************************************************************/ -extern void i8051_set_serial_tx_callback(void (*callback)(int data)); -extern void i8051_set_serial_rx_callback(int (*callback)(void)); +typedef void (*mcs51_serial_tx_func)(const device_config *device, int data); +typedef int (*mcs51_serial_rx_func)(const device_config *device); + +extern void i8051_set_serial_tx_callback(const device_config *device, mcs51_serial_tx_func tx_func); +extern void i8051_set_serial_rx_callback(const device_config *device, mcs51_serial_rx_func rx_func); /* variants with no internal rom and 128 byte internal memory */ CPU_GET_INFO( i8031 ); diff --git a/src/mame/drivers/micro3d.c b/src/mame/drivers/micro3d.c index 4a976b61a9f..0fd37ace079 100644 --- a/src/mame/drivers/micro3d.c +++ b/src/mame/drivers/micro3d.c @@ -105,25 +105,25 @@ enum{ RX=0,TX,STATUS,SYN1,SYN2,DLE,MODE1,MODE2,COMMAND /* Probably wrong and a bit crap */ -static int data_to_i8031(void) +static int data_to_i8031(const device_config *device) { mame_printf_debug("68k sent data: %x\n",M68681.TBB); M68681.SRB |=0x0400; // Data has been sent - TX ready for more. // Write to sound board if(M68681.IMR & 0x1000) { - cpu_set_input_line_and_vector(Machine->cpu[0],3, HOLD_LINE, M68681.IVR); // Generate an interrupt, if allowed. + cpu_set_input_line_and_vector(device->machine->cpu[0],3, HOLD_LINE, M68681.IVR); // Generate an interrupt, if allowed. } return M68681.TBB; } -static void data_from_i8031(int data) +static void data_from_i8031(const device_config *device, int data) { M68681.RBB = data<<8; // Put into receive buffer. M68681.SRB |= 0x0100; // Set Receiver B ready. if(M68681.IMR & 0x1000) { - cpu_set_input_line_and_vector(Machine->cpu[0],3, HOLD_LINE, M68681.IVR); // Generate a receiver interrupt. + cpu_set_input_line_and_vector(device->machine->cpu[0],3, HOLD_LINE, M68681.IVR); // Generate a receiver interrupt. mame_printf_debug("INTERRUPT!!!\n"); } mame_printf_debug("8031 sent data: %x\n",data); @@ -169,8 +169,8 @@ static void micro3d_scanline_update(const device_config *screen, bitmap_t *bitma static MACHINE_RESET( micro3d ) { - i8051_set_serial_tx_callback(data_from_i8031); - i8051_set_serial_rx_callback(data_to_i8031); + i8051_set_serial_tx_callback(machine->cpu[2], data_from_i8031); + i8051_set_serial_rx_callback(machine->cpu[2], data_to_i8031); ti_uart[STATUS]=1; M68681.SRA=0x0500; M68681.SRB=0x0500;