src/mess/machine/74145.c
| r12948 | r12949 | |
| 46 | 46 | #include "74145.h" |
| 47 | 47 | #include "coreutil.h" |
| 48 | 48 | |
| 49 | | /*************************************************************************** |
| 50 | | TYPE DEFINITIONS |
| 51 | | ***************************************************************************/ |
| 52 | | |
| 53 | | typedef struct _ttl74145_t ttl74145_t; |
| 54 | | struct _ttl74145_t |
| 55 | | { |
| 56 | | devcb_resolved_write_line output_line_0; |
| 57 | | devcb_resolved_write_line output_line_1; |
| 58 | | devcb_resolved_write_line output_line_2; |
| 59 | | devcb_resolved_write_line output_line_3; |
| 60 | | devcb_resolved_write_line output_line_4; |
| 61 | | devcb_resolved_write_line output_line_5; |
| 62 | | devcb_resolved_write_line output_line_6; |
| 63 | | devcb_resolved_write_line output_line_7; |
| 64 | | devcb_resolved_write_line output_line_8; |
| 65 | | devcb_resolved_write_line output_line_9; |
| 66 | | |
| 67 | | /* decoded number */ |
| 68 | | int number; |
| 69 | | }; |
| 70 | | |
| 71 | | |
| 72 | 49 | /***************************************************************************** |
| 73 | 50 | GLOBAL VARIABLES |
| 74 | 51 | *****************************************************************************/ |
| r12948 | r12949 | |
| 88 | 65 | }; |
| 89 | 66 | |
| 90 | 67 | |
| 68 | const device_type TTL74145 = &device_creator<ttl74145_device>; |
| 69 | |
| 91 | 70 | /*************************************************************************** |
| 92 | | IMPLEMENTATION |
| 71 | DEVICE INTERFACE |
| 93 | 72 | ***************************************************************************/ |
| 73 | //------------------------------------------------- |
| 74 | // ttl74145_device - constructor |
| 75 | //------------------------------------------------- |
| 94 | 76 | |
| 95 | | INLINE ttl74145_t *get_safe_token(device_t *device) |
| 77 | ttl74145_device::ttl74145_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 78 | : device_t(mconfig, TTL74145, "TTL74145", tag, owner, clock) |
| 96 | 79 | { |
| 97 | | assert(device != NULL); |
| 98 | | assert(device->type() == TTL74145); |
| 99 | | |
| 100 | | return (ttl74145_t *)downcast<legacy_device_base *>(device)->token(); |
| 101 | 80 | } |
| 102 | 81 | |
| 103 | 82 | |
| 104 | | WRITE8_DEVICE_HANDLER( ttl74145_w ) |
| 83 | //------------------------------------------------- |
| 84 | // device_start - device-specific startup |
| 85 | //------------------------------------------------- |
| 86 | |
| 87 | void ttl74145_device::device_start() |
| 105 | 88 | { |
| 106 | | ttl74145_t *ttl74145 = get_safe_token(device); |
| 89 | /* resolve callbacks */ |
| 90 | m_output_line_0_func.resolve(m_output_line_0_cb, *this); |
| 91 | m_output_line_1_func.resolve(m_output_line_1_cb, *this); |
| 92 | m_output_line_2_func.resolve(m_output_line_2_cb, *this); |
| 93 | m_output_line_3_func.resolve(m_output_line_3_cb, *this); |
| 94 | m_output_line_4_func.resolve(m_output_line_4_cb, *this); |
| 95 | m_output_line_5_func.resolve(m_output_line_5_cb, *this); |
| 96 | m_output_line_6_func.resolve(m_output_line_6_cb, *this); |
| 97 | m_output_line_7_func.resolve(m_output_line_7_cb, *this); |
| 98 | m_output_line_8_func.resolve(m_output_line_8_cb, *this); |
| 99 | m_output_line_9_func.resolve(m_output_line_9_cb, *this); |
| 107 | 100 | |
| 108 | | /* decode number */ |
| 109 | | int new_number = bcd_2_dec(data & 0x0f); |
| 101 | // register for state saving |
| 102 | save_item(NAME(m_number)); |
| 103 | } |
| 110 | 104 | |
| 111 | | /* call output callbacks if the number changed */ |
| 112 | | if (new_number != ttl74145->number) |
| 105 | //------------------------------------------------- |
| 106 | // device_config_complete - perform any |
| 107 | // operations now that the configuration is |
| 108 | // complete |
| 109 | //------------------------------------------------- |
| 110 | |
| 111 | void ttl74145_device::device_config_complete() |
| 112 | { |
| 113 | // inherit a copy of the static data |
| 114 | const ttl74145_interface *intf = reinterpret_cast<const ttl74145_interface *>(static_config()); |
| 115 | if (intf != NULL) |
| 116 | *static_cast<ttl74145_interface *>(this) = *intf; |
| 117 | |
| 118 | // or initialize to defaults if none provided |
| 119 | else |
| 113 | 120 | { |
| 114 | | ttl74145->output_line_0(new_number == 0); |
| 115 | | ttl74145->output_line_1(new_number == 1); |
| 116 | | ttl74145->output_line_2(new_number == 2); |
| 117 | | ttl74145->output_line_3(new_number == 3); |
| 118 | | ttl74145->output_line_4(new_number == 4); |
| 119 | | ttl74145->output_line_5(new_number == 5); |
| 120 | | ttl74145->output_line_6(new_number == 6); |
| 121 | | ttl74145->output_line_7(new_number == 7); |
| 122 | | ttl74145->output_line_8(new_number == 8); |
| 123 | | ttl74145->output_line_9(new_number == 9); |
| 121 | memset(&m_output_line_0_cb, 0, sizeof(m_output_line_0_cb)); |
| 122 | memset(&m_output_line_1_cb, 0, sizeof(m_output_line_1_cb)); |
| 123 | memset(&m_output_line_2_cb, 0, sizeof(m_output_line_2_cb)); |
| 124 | memset(&m_output_line_3_cb, 0, sizeof(m_output_line_3_cb)); |
| 125 | memset(&m_output_line_4_cb, 0, sizeof(m_output_line_4_cb)); |
| 126 | memset(&m_output_line_5_cb, 0, sizeof(m_output_line_5_cb)); |
| 127 | memset(&m_output_line_6_cb, 0, sizeof(m_output_line_6_cb)); |
| 128 | memset(&m_output_line_7_cb, 0, sizeof(m_output_line_7_cb)); |
| 129 | memset(&m_output_line_8_cb, 0, sizeof(m_output_line_8_cb)); |
| 130 | memset(&m_output_line_9_cb, 0, sizeof(m_output_line_9_cb)); |
| 124 | 131 | } |
| 125 | | |
| 126 | | /* update state */ |
| 127 | | ttl74145->number = new_number; |
| 128 | 132 | } |
| 129 | 133 | |
| 134 | //------------------------------------------------- |
| 135 | // device_start - device-specific reset |
| 136 | //------------------------------------------------- |
| 130 | 137 | |
| 131 | | READ16_DEVICE_HANDLER( ttl74145_r ) |
| 138 | void ttl74145_device::device_reset() |
| 132 | 139 | { |
| 133 | | ttl74145_t *ttl74145 = get_safe_token(device); |
| 134 | | |
| 135 | | return (1 << ttl74145->number) & 0x3ff; |
| 140 | m_number = 0; |
| 136 | 141 | } |
| 137 | 142 | |
| 138 | | |
| 139 | 143 | /*************************************************************************** |
| 140 | | DEVICE INTERFACE |
| 144 | IMPLEMENTATION |
| 141 | 145 | ***************************************************************************/ |
| 142 | 146 | |
| 143 | | static DEVICE_START( ttl74145 ) |
| 147 | void ttl74145_device::write(UINT8 data) |
| 144 | 148 | { |
| 145 | | const ttl74145_interface *intf = (const ttl74145_interface *)device->static_config(); |
| 146 | | ttl74145_t *ttl74145 = get_safe_token(device); |
| 149 | /* decode number */ |
| 150 | UINT16 new_number = bcd_2_dec(data & 0x0f); |
| 147 | 151 | |
| 148 | | /* validate arguments */ |
| 149 | | assert(device->static_config() != NULL); |
| 152 | /* call output callbacks if the number changed */ |
| 153 | if (new_number != m_number) |
| 154 | { |
| 155 | m_output_line_0_func(new_number == 0); |
| 156 | m_output_line_1_func(new_number == 1); |
| 157 | m_output_line_2_func(new_number == 2); |
| 158 | m_output_line_3_func(new_number == 3); |
| 159 | m_output_line_4_func(new_number == 4); |
| 160 | m_output_line_5_func(new_number == 5); |
| 161 | m_output_line_6_func(new_number == 6); |
| 162 | m_output_line_7_func(new_number == 7); |
| 163 | m_output_line_8_func(new_number == 8); |
| 164 | m_output_line_9_func(new_number == 9); |
| 165 | } |
| 150 | 166 | |
| 151 | | /* initialize with 0 */ |
| 152 | | ttl74145->number = 0; |
| 153 | | |
| 154 | | /* resolve callbacks */ |
| 155 | | ttl74145->output_line_0.resolve(intf->output_line_0, *device); |
| 156 | | ttl74145->output_line_1.resolve(intf->output_line_1, *device); |
| 157 | | ttl74145->output_line_2.resolve(intf->output_line_2, *device); |
| 158 | | ttl74145->output_line_3.resolve(intf->output_line_3, *device); |
| 159 | | ttl74145->output_line_4.resolve(intf->output_line_4, *device); |
| 160 | | ttl74145->output_line_5.resolve(intf->output_line_5, *device); |
| 161 | | ttl74145->output_line_6.resolve(intf->output_line_6, *device); |
| 162 | | ttl74145->output_line_7.resolve(intf->output_line_7, *device); |
| 163 | | ttl74145->output_line_8.resolve(intf->output_line_8, *device); |
| 164 | | ttl74145->output_line_9.resolve(intf->output_line_9, *device); |
| 165 | | |
| 166 | | /* register for state saving */ |
| 167 | | state_save_register_item(device->machine(), "ttl74145", device->tag(), 0, ttl74145->number); |
| 167 | /* update state */ |
| 168 | m_number = new_number; |
| 168 | 169 | } |
| 169 | 170 | |
| 170 | 171 | |
| 171 | | static DEVICE_RESET( ttl74145 ) |
| 172 | UINT16 ttl74145_device::read() |
| 172 | 173 | { |
| 173 | | ttl74145_t *ttl74145 = get_safe_token(device); |
| 174 | | ttl74145->number = 0; |
| 174 | return (1 << m_number) & 0x3ff; |
| 175 | 175 | } |
| 176 | 176 | |
| 177 | 177 | |
| 178 | | DEVICE_GET_INFO( ttl74145 ) |
| 179 | | { |
| 180 | | switch (state) |
| 181 | | { |
| 182 | | /* --- the following bits of info are returned as 64-bit signed integers --- */ |
| 183 | | case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(ttl74145_t); break; |
| 184 | | case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = 0; break; |
| 185 | 178 | |
| 186 | | /* --- the following bits of info are returned as pointers to data or functions --- */ |
| 187 | | case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(ttl74145); break; |
| 188 | | case DEVINFO_FCT_STOP: /* Nothing */ break; |
| 189 | | case DEVINFO_FCT_RESET: info->reset = DEVICE_RESET_NAME(ttl74145); break; |
| 190 | | |
| 191 | | /* --- the following bits of info are returned as NULL-terminated strings --- */ |
| 192 | | case DEVINFO_STR_NAME: strcpy(info->s, "TTL74145"); break; |
| 193 | | case DEVINFO_STR_FAMILY: strcpy(info->s, "TTL74145"); break; |
| 194 | | case DEVINFO_STR_VERSION: strcpy(info->s, "1.2"); break; |
| 195 | | case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; |
| 196 | | case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright MESS Team"); break; |
| 197 | | } |
| 198 | | } |
| 199 | | |
| 200 | | DEFINE_LEGACY_DEVICE(TTL74145, ttl74145); |
src/mess/machine/74145.h
| r12948 | r12949 | |
| 9 | 9 | #ifndef __TTL74145_H__ |
| 10 | 10 | #define __TTL74145_H__ |
| 11 | 11 | |
| 12 | | #include "devcb.h" |
| 12 | //************************************************************************** |
| 13 | // INTERFACE CONFIGURATION MACROS |
| 14 | //************************************************************************** |
| 15 | #define MCFG_TTL74145_ADD(_tag, _intf) \ |
| 16 | MCFG_DEVICE_ADD(_tag, TTL74145, 0) \ |
| 17 | MCFG_DEVICE_CONFIG(_intf) |
| 18 | |
| 13 | 19 | |
| 20 | //************************************************************************** |
| 21 | // TYPE DEFINITIONS |
| 22 | //************************************************************************** |
| 14 | 23 | |
| 15 | | /*************************************************************************** |
| 16 | | TYPE DEFINITIONS |
| 17 | | ***************************************************************************/ |
| 24 | // ======================> ttl74145_interface |
| 18 | 25 | |
| 19 | | typedef struct _ttl74145_interface ttl74145_interface; |
| 20 | | struct _ttl74145_interface |
| 26 | struct ttl74145_interface |
| 21 | 27 | { |
| 22 | | devcb_write_line output_line_0; |
| 23 | | devcb_write_line output_line_1; |
| 24 | | devcb_write_line output_line_2; |
| 25 | | devcb_write_line output_line_3; |
| 26 | | devcb_write_line output_line_4; |
| 27 | | devcb_write_line output_line_5; |
| 28 | | devcb_write_line output_line_6; |
| 29 | | devcb_write_line output_line_7; |
| 30 | | devcb_write_line output_line_8; |
| 31 | | devcb_write_line output_line_9; |
| 28 | devcb_write_line m_output_line_0_cb; |
| 29 | devcb_write_line m_output_line_1_cb; |
| 30 | devcb_write_line m_output_line_2_cb; |
| 31 | devcb_write_line m_output_line_3_cb; |
| 32 | devcb_write_line m_output_line_4_cb; |
| 33 | devcb_write_line m_output_line_5_cb; |
| 34 | devcb_write_line m_output_line_6_cb; |
| 35 | devcb_write_line m_output_line_7_cb; |
| 36 | devcb_write_line m_output_line_8_cb; |
| 37 | devcb_write_line m_output_line_9_cb; |
| 32 | 38 | }; |
| 33 | 39 | |
| 40 | // ======================> ttl74145_device |
| 34 | 41 | |
| 35 | | /*************************************************************************** |
| 36 | | FUNCTION PROTOTYPES |
| 37 | | ***************************************************************************/ |
| 42 | class ttl74145_device : public device_t, |
| 43 | public ttl74145_interface |
| 44 | { |
| 45 | public: |
| 46 | // construction/destruction |
| 47 | ttl74145_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 38 | 48 | |
| 39 | | /* standard handlers */ |
| 40 | | WRITE8_DEVICE_HANDLER( ttl74145_w ); |
| 41 | | READ16_DEVICE_HANDLER( ttl74145_r ); |
| 49 | UINT16 read(); |
| 50 | void write(UINT8 data); |
| 51 | protected: |
| 52 | // device-level overrides |
| 53 | virtual void device_start(); |
| 54 | virtual void device_reset(); |
| 55 | virtual void device_config_complete(); |
| 42 | 56 | |
| 57 | private: |
| 58 | devcb_resolved_write_line m_output_line_0_func; |
| 59 | devcb_resolved_write_line m_output_line_1_func; |
| 60 | devcb_resolved_write_line m_output_line_2_func; |
| 61 | devcb_resolved_write_line m_output_line_3_func; |
| 62 | devcb_resolved_write_line m_output_line_4_func; |
| 63 | devcb_resolved_write_line m_output_line_5_func; |
| 64 | devcb_resolved_write_line m_output_line_6_func; |
| 65 | devcb_resolved_write_line m_output_line_7_func; |
| 66 | devcb_resolved_write_line m_output_line_8_func; |
| 67 | devcb_resolved_write_line m_output_line_9_func; |
| 43 | 68 | |
| 44 | | /*************************************************************************** |
| 45 | | DEVICE CONFIGURATION MACROS |
| 46 | | ***************************************************************************/ |
| 69 | /* decoded number */ |
| 70 | UINT16 m_number; |
| 71 | }; |
| 47 | 72 | |
| 48 | | DECLARE_LEGACY_DEVICE(TTL74145, ttl74145); |
| 73 | // device type definition |
| 74 | extern const device_type TTL74145; |
| 49 | 75 | |
| 50 | | #define MCFG_TTL74145_ADD(_tag, _intf) \ |
| 51 | | MCFG_DEVICE_ADD(_tag, TTL74145, 0) \ |
| 52 | | MCFG_DEVICE_CONFIG(_intf) |
| 76 | //************************************************************************** |
| 77 | // DEFAULT INTERFACES |
| 78 | //************************************************************************** |
| 53 | 79 | |
| 54 | | |
| 55 | | /*************************************************************************** |
| 56 | | DEFAULT INTERFACES |
| 57 | | ***************************************************************************/ |
| 58 | | |
| 59 | 80 | extern const ttl74145_interface default_ttl74145; |
| 60 | 81 | |
| 61 | 82 | |
| 62 | | #endif /* __TTL74145_H__ */ |
| 83 | #endif /* TTL74145 */ |