Previous 199869 Revisions Next

r29190 Wednesday 2nd April, 2014 at 16:37:21 UTC by Osso
lh5810_device: converted to devcb2 (nw)
[src/emu/machine]lh5810.c lh5810.h
[src/mess/drivers]pc1500.c

trunk/src/mess/drivers/pc1500.c
r29189r29190
264264   palette.set_pen_color(1, rgb_t(92, 83, 88));
265265}
266266
267static const lh5810_interface lh5810_pc1500_config =
268{
269   DEVCB_DRIVER_MEMBER(pc1500_state, port_a_r),        //port A read
270   DEVCB_DRIVER_MEMBER(pc1500_state, kb_matrix_w),     //port A write
271   DEVCB_DRIVER_MEMBER(pc1500_state, port_b_r),        //port B read
272   DEVCB_NULL,                                         //port B write
273   DEVCB_DRIVER_MEMBER(pc1500_state, port_c_w),        //port C write
274   DEVCB_CPU_INPUT_LINE("maincpu", LH5801_LINE_MI)     //IRQ callback
275};
276
277267static MACHINE_CONFIG_START( pc1500, pc1500_state )
278268   MCFG_CPU_ADD("maincpu", LH5801, 1300000)            //1.3 MHz
279269   MCFG_CPU_PROGRAM_MAP( pc1500_mem )
r29189r29190
292282   MCFG_PALETTE_ADD("palette", 2)
293283   MCFG_PALETTE_INIT_OWNER(pc1500_state, pc1500)
294284
295   MCFG_LH5810_ADD("lh5810", lh5810_pc1500_config)
285   MCFG_DEVICE_ADD("lh5810", LH5810, 0)
286   MCFG_LH5810_PORTA_R_CB(READ8(pc1500_state, port_a_r))
287   MCFG_LH5810_PORTA_W_CB(WRITE8(pc1500_state, kb_matrix_w))
288   MCFG_LH5810_PORTB_R_CB(READ8(pc1500_state, port_b_r))
289   MCFG_LH5810_PORTC_W_CB(WRITE8(pc1500_state, port_c_w))
290   MCFG_LH5810_OUT_INT_CB(INPUTLINE("maincpu", LH5801_LINE_MI))
296291
297292   MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL)
298293MACHINE_CONFIG_END
trunk/src/emu/machine/lh5810.c
r29189r29190
1919
2020const device_type LH5810 = &device_creator<lh5810_device>;
2121
22
23//-------------------------------------------------
24//  device_config_complete - perform any
25//  operations now that the configuration is
26//  complete
27//-------------------------------------------------
28
29void lh5810_device::device_config_complete()
30{
31   // inherit a copy of the static data
32   const lh5810_interface *intf = reinterpret_cast<const lh5810_interface *>(static_config());
33   if (intf != NULL)
34      *static_cast<lh5810_interface *>(this) = *intf;
35
36   // or initialize to defaults if none provided
37   else
38   {
39      memset(&m_porta_r_cb, 0, sizeof(m_porta_r_cb));
40      memset(&m_porta_w_cb, 0, sizeof(m_porta_w_cb));
41      memset(&m_portb_r_cb, 0, sizeof(m_portb_r_cb));
42      memset(&m_portb_w_cb, 0, sizeof(m_portb_w_cb));
43      memset(&m_portc_w_cb, 0, sizeof(m_portc_w_cb));
44      memset(&m_out_int_cb, 0, sizeof(m_out_int_cb));
45   }
46}
47
48
4922//**************************************************************************
5023//  LIVE DEVICE
5124//**************************************************************************
r29189r29190
5528//-------------------------------------------------
5629
5730lh5810_device::lh5810_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
58   : device_t(mconfig, LH5810, "LH5810", tag, owner, clock, "lh5810", __FILE__)
31   : device_t(mconfig, LH5810, "LH5810", tag, owner, clock, "lh5810", __FILE__),
32   m_porta_r_cb(*this),
33   m_porta_w_cb(*this),
34   m_portb_r_cb(*this),
35   m_portb_w_cb(*this),
36   m_portc_w_cb(*this),
37   m_out_int_cb(*this)
5938{
6039}
6140
r29189r29190
6746void lh5810_device::device_start()
6847{
6948   // resolve callbacks
70   m_porta_r_func.resolve(m_porta_r_cb, *this);
71   m_porta_w_func.resolve(m_porta_w_cb, *this);
72   m_portb_r_func.resolve(m_portb_r_cb, *this);
73   m_portb_w_func.resolve(m_portb_w_cb, *this);
74   m_portc_w_func.resolve(m_portc_w_cb, *this);
75   m_out_int_func.resolve(m_out_int_cb, *this);
49   m_porta_r_cb.resolve_safe(0);
50   m_porta_w_cb.resolve_safe();
51   m_portb_r_cb.resolve_safe(0);
52   m_portb_w_cb.resolve_safe();
53   m_portc_w_cb.resolve_safe();
54   m_out_int_cb.resolve_safe();
7655
7756   // register for state saving
7857   save_item(NAME(m_irq));
r29189r29190
10988         return m_reg[offset];
11089
11190      case LH5810_IF:
112         if (BIT(m_portb_r_func(0) & ~m_reg[LH5810_DDB], 7))
91         if (BIT(m_portb_r_cb(0) & ~m_reg[LH5810_DDB], 7))
11392            m_reg[offset] |= 2;
11493         else
11594            m_reg[offset] &= 0xfd;
r29189r29190
12099         return (m_reg[offset]&0x0f) | (m_irq<<4) | (BIT(m_reg[LH5810_OPB],7)<<5);
121100
122101      case LH5810_OPA:
123         m_reg[offset] = (m_reg[offset] & m_reg[LH5810_DDA]) | (m_porta_r_func(0) & ~m_reg[LH5810_DDA]);
102         m_reg[offset] = (m_reg[offset] & m_reg[LH5810_DDA]) | (m_porta_r_cb(0) & ~m_reg[LH5810_DDA]);
124103         return m_reg[offset];
125104
126105      case LH5810_OPB:
127         m_reg[offset] = (m_reg[offset] & m_reg[LH5810_DDB]) | (m_portb_r_func(0) & ~m_reg[LH5810_DDB]);
128         m_out_int_func((m_reg[offset] & 0x80 && m_reg[LH5810_MSK] & 0x02) ? ASSERT_LINE : CLEAR_LINE);
106         m_reg[offset] = (m_reg[offset] & m_reg[LH5810_DDB]) | (m_portb_r_cb(0) & ~m_reg[LH5810_DDB]);
107         m_out_int_cb((m_reg[offset] & 0x80 && m_reg[LH5810_MSK] & 0x02) ? ASSERT_LINE : CLEAR_LINE);
129108         return m_reg[offset];
130109
131110      default:
r29189r29190
175154
176155      case LH5810_OPA:
177156         m_reg[offset] = (data & m_reg[LH5810_DDA]) | (m_reg[offset] & ~m_reg[LH5810_DDA]);
178         m_porta_w_func(0, m_reg[offset]);
157         m_porta_w_cb((offs_t)0, m_reg[offset]);
179158         break;
180159
181160      case LH5810_OPB:
182161         m_reg[offset] = (data & m_reg[LH5810_DDB]) | (m_reg[offset] & ~m_reg[LH5810_DDB]);
183         m_portb_w_func(0, m_reg[offset]);
184         m_out_int_func((m_reg[offset] & 0x80 && m_reg[LH5810_MSK] & 0x02) ? ASSERT_LINE : CLEAR_LINE);
162         m_portb_w_cb((offs_t)0, m_reg[offset]);
163         m_out_int_cb((m_reg[offset] & 0x80 && m_reg[LH5810_MSK] & 0x02) ? ASSERT_LINE : CLEAR_LINE);
185164         break;
186165
187166      case LH5810_OPC:
188167         m_reg[offset] = data;
189         m_portc_w_func(0, m_reg[offset]);
168         m_portc_w_cb((offs_t)0, m_reg[offset]);
190169         break;
191170   }
192171}
trunk/src/emu/machine/lh5810.h
r29189r29190
3838//  INTERFACE CONFIGURATION MACROS
3939//*************************************************************************
4040
41#define MCFG_LH5810_ADD(_tag, _config) \
42   MCFG_DEVICE_ADD((_tag), LH5810, 0)  \
43   MCFG_DEVICE_CONFIG(_config)
41#define MCFG_LH5810_PORTA_R_CB(_devcb) \
42   devcb = &lh5810_device::set_porta_r_callback(*device, DEVCB2_##_devcb);
4443
44#define MCFG_LH5810_PORTA_W_CB(_devcb) \
45   devcb = &lh5810_device::set_porta_w_callback(*device, DEVCB2_##_devcb);
46   
47#define MCFG_LH5810_PORTB_R_CB(_devcb) \
48   devcb = &lh5810_device::set_portb_r_callback(*device, DEVCB2_##_devcb);
49   
50#define MCFG_LH5810_PORTB_W_CB(_devcb) \
51   devcb = &lh5810_device::set_portb_w_callback(*device, DEVCB2_##_devcb);
52   
53#define MCFG_LH5810_PORTC_W_CB(_devcb) \
54   devcb = &lh5810_device::set_portc_w_callback(*device, DEVCB2_##_devcb);
55 
56#define MCFG_LH5810_OUT_INT_CB(_devcb) \
57   devcb = &lh5810_device::set_out_int_callback(*device, DEVCB2_##_devcb); //currently unused
4558
4659
60
4761//*************************************************************************
4862//  TYPE DEFINITIONS
4963//*************************************************************************
5064
51// ======================> lh5810_interface
52
53struct lh5810_interface
54{
55   devcb_read8         m_porta_r_cb;       //port A read
56   devcb_write8        m_porta_w_cb;       //port A write
57   devcb_read8         m_portb_r_cb;       //port B read
58   devcb_write8        m_portb_w_cb;       //port B write
59   devcb_write8        m_portc_w_cb;       //port C write
60
61   devcb_write_line    m_out_int_cb;       //IRQ callback
62};
63
6465// ======================> lh5810_device
6566
66class lh5810_device :   public device_t,
67                  public lh5810_interface
67class lh5810_device :   public device_t
6868{
6969public:
7070   // construction/destruction
7171   lh5810_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
7272
73   template<class _Object> static devcb2_base &set_porta_r_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_porta_r_cb.set_callback(object); }
74   template<class _Object> static devcb2_base &set_porta_w_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_porta_w_cb.set_callback(object); }
75   template<class _Object> static devcb2_base &set_portb_r_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_portb_r_cb.set_callback(object); }
76   template<class _Object> static devcb2_base &set_portb_w_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_portb_w_cb.set_callback(object); }
77   template<class _Object> static devcb2_base &set_portc_w_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_portc_w_cb.set_callback(object); }
78   template<class _Object> static devcb2_base &set_out_int_callback(device_t &device, _Object object) { return downcast<lh5810_device &>(device).m_out_int_cb.set_callback(object); }
79   
7380   DECLARE_READ8_MEMBER( data_r );
7481   DECLARE_WRITE8_MEMBER( data_w );
7582
r29189r29190
7784   // device-level overrides
7885   virtual void device_start();
7986   virtual void device_reset();
80   virtual void device_config_complete();
8187
8288private:
8389
84   devcb_resolved_read8        m_porta_r_func;
85   devcb_resolved_write8       m_porta_w_func;
86   devcb_resolved_read8        m_portb_r_func;
87   devcb_resolved_write8       m_portb_w_func;
88   devcb_resolved_write8       m_portc_w_func;
89   devcb_resolved_write_line   m_out_int_func;
90   devcb2_read8         m_porta_r_cb;       //port A read
91   devcb2_write8        m_porta_w_cb;       //port A write
92   devcb2_read8         m_portb_r_cb;       //port B read
93   devcb2_write8        m_portb_w_cb;       //port B write
94   devcb2_write8        m_portc_w_cb;       //port C write
9095
96   devcb2_write_line    m_out_int_cb;       //IRQ callback
97
9198   UINT8 m_reg[0x10];
9299   UINT8 m_irq;
93100};

Previous 199869 Revisions Next


© 1997-2024 The MAME Team