trunk/src/emu/video/cdp1862.c
| r23575 | r23576 | |
| 7 | 7 | |
| 8 | 8 | **********************************************************************/ |
| 9 | 9 | |
| 10 | | /* |
| 10 | #include "cdp1862.h" |
| 11 | 11 | |
| 12 | | TODO: |
| 13 | 12 | |
| 14 | | - calculate colors from luminance/chrominance resistors |
| 15 | 13 | |
| 16 | | */ |
| 14 | //************************************************************************** |
| 15 | // MACROS / CONSTANTS |
| 16 | //************************************************************************** |
| 17 | 17 | |
| 18 | | #include "emu.h" |
| 19 | | #include "cdp1862.h" |
| 18 | static const int CDP1862_BACKGROUND_COLOR_SEQUENCE[] = { 2, 0, 1, 4 }; |
| 20 | 19 | |
| 21 | 20 | |
| 22 | | // device type definition |
| 23 | | const device_type CDP1862 = &device_creator<cdp1862_device>; |
| 24 | 21 | |
| 25 | | |
| 26 | 22 | //************************************************************************** |
| 27 | | // MACROS / CONSTANTS |
| 23 | // DEVICE DEFINITIONS |
| 28 | 24 | //************************************************************************** |
| 29 | 25 | |
| 30 | | static const int CDP1862_BACKGROUND_COLOR_SEQUENCE[] = { 2, 0, 1, 4 }; |
| 26 | // device type definition |
| 27 | const device_type CDP1862 = &device_creator<cdp1862_device>; |
| 31 | 28 | |
| 32 | 29 | |
| 33 | 30 | |
| r23575 | r23576 | |
| 80 | 77 | //------------------------------------------------- |
| 81 | 78 | |
| 82 | 79 | cdp1862_device::cdp1862_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 83 | | : device_t(mconfig, CDP1862, "CDP1862", tag, owner, clock) |
| 80 | : device_t(mconfig, CDP1862, "CDP1862", tag, owner, clock), |
| 81 | m_read_rd(*this), |
| 82 | m_read_bd(*this), |
| 83 | m_read_gd(*this) |
| 84 | 84 | { |
| 85 | 85 | } |
| 86 | 86 | |
| 87 | 87 | |
| 88 | 88 | //------------------------------------------------- |
| 89 | | // device_config_complete - perform any |
| 90 | | // operations now that the configuration is |
| 91 | | // complete |
| 92 | | //------------------------------------------------- |
| 93 | | |
| 94 | | void cdp1862_device::device_config_complete() |
| 95 | | { |
| 96 | | // inherit a copy of the static data |
| 97 | | const cdp1862_interface *intf = reinterpret_cast<const cdp1862_interface *>(static_config()); |
| 98 | | if (intf != NULL) |
| 99 | | *static_cast<cdp1862_interface *>(this) = *intf; |
| 100 | | |
| 101 | | // or initialize to defaults if none provided |
| 102 | | else |
| 103 | | { |
| 104 | | memset(&m_in_rd_cb, 0, sizeof(m_in_rd_cb)); |
| 105 | | memset(&m_in_bd_cb, 0, sizeof(m_in_bd_cb)); |
| 106 | | memset(&m_in_gd_cb, 0, sizeof(m_in_gd_cb)); |
| 107 | | } |
| 108 | | } |
| 109 | | |
| 110 | | |
| 111 | | //------------------------------------------------- |
| 112 | 89 | // device_start - device-specific startup |
| 113 | 90 | //------------------------------------------------- |
| 114 | 91 | |
| 115 | 92 | void cdp1862_device::device_start() |
| 116 | 93 | { |
| 117 | 94 | // resolve callbacks |
| 118 | | m_in_rd_func.resolve(m_in_rd_cb, *this); |
| 119 | | m_in_bd_func.resolve(m_in_bd_cb, *this); |
| 120 | | m_in_gd_func.resolve(m_in_gd_cb, *this); |
| 95 | m_read_rd.resolve_safe(0); |
| 96 | m_read_bd.resolve_safe(0); |
| 97 | m_read_gd.resolve_safe(0); |
| 121 | 98 | |
| 122 | 99 | // find devices |
| 123 | | m_screen = machine().device<screen_device>(m_screen_tag); |
| 100 | m_screen = machine().device<screen_device>(m_screen_tag); |
| 124 | 101 | m_screen->register_screen_bitmap(m_bitmap); |
| 125 | 102 | |
| 126 | 103 | // init palette |
| r23575 | r23576 | |
| 156 | 133 | |
| 157 | 134 | if (!m_con) |
| 158 | 135 | { |
| 159 | | rd = m_in_rd_func(); |
| 160 | | bd = m_in_bd_func(); |
| 161 | | gd = m_in_gd_func(); |
| 136 | rd = m_read_rd(); |
| 137 | bd = m_read_bd(); |
| 138 | gd = m_read_gd(); |
| 162 | 139 | } |
| 163 | 140 | |
| 164 | 141 | for (x = 0; x < 8; x++) |
trunk/src/emu/video/cdp1862.h
| r23575 | r23576 | |
| 43 | 43 | // INTERFACE CONFIGURATION MACROS |
| 44 | 44 | //************************************************************************** |
| 45 | 45 | |
| 46 | | #define MCFG_CDP1862_ADD(_tag, _clock, _config) \ |
| 46 | #define MCFG_CDP1862_ADD(_tag, _screen_tag, _clock, _rd, _bd, _gd) \ |
| 47 | 47 | MCFG_DEVICE_ADD(_tag, CDP1862, _clock) \ |
| 48 | | MCFG_DEVICE_CONFIG(_config) |
| 48 | downcast<cdp1862_device *>(device)->set_screen_tag(_screen_tag); \ |
| 49 | downcast<cdp1862_device *>(device)->set_rd_callback(DEVCB2_##_rd); \ |
| 50 | downcast<cdp1862_device *>(device)->set_bd_callback(DEVCB2_##_bd); \ |
| 51 | downcast<cdp1862_device *>(device)->set_gd_callback(DEVCB2_##_gd); |
| 49 | 52 | |
| 53 | #define MCFG_CDP1862_LUMINANCE(_r, _b, _g, _bkg) \ |
| 54 | downcast<cdp1862_device *>(device)->set_luminance_resistors(_r, _b, _g, _bkg); |
| 50 | 55 | |
| 51 | | #define CDP1862_INTERFACE(name) \ |
| 52 | | const cdp1862_interface (name) = |
| 56 | #define MCFG_CDP1862_CHROMINANCE(_r, _b, _g, _bkg) \ |
| 57 | downcast<cdp1862_device *>(device)->set_chrominance_resistors(_r, _b, _g, _bkg); |
| 53 | 58 | |
| 54 | 59 | |
| 55 | 60 | |
| r23575 | r23576 | |
| 57 | 62 | // TYPE DEFINITIONS |
| 58 | 63 | //************************************************************************** |
| 59 | 64 | |
| 60 | | // ======================> cdp1862_interface |
| 61 | | |
| 62 | | struct cdp1862_interface |
| 63 | | { |
| 64 | | const char *m_screen_tag; |
| 65 | | |
| 66 | | devcb_read_line m_in_rd_cb; |
| 67 | | devcb_read_line m_in_bd_cb; |
| 68 | | devcb_read_line m_in_gd_cb; |
| 69 | | |
| 70 | | double m_lum_r; // red luminance resistor value |
| 71 | | double m_lum_b; // blue luminance resistor value |
| 72 | | double m_lum_g; // green luminance resistor value |
| 73 | | double m_lum_bkg; // background luminance resistor value |
| 74 | | |
| 75 | | double m_chr_r; // red chrominance resistor value |
| 76 | | double m_chr_b; // blue chrominance resistor value |
| 77 | | double m_chr_g; // green chrominance resistor value |
| 78 | | double m_chr_bkg; // background chrominance resistor value |
| 79 | | }; |
| 80 | | |
| 81 | | |
| 82 | | |
| 83 | 65 | // ======================> cdp1862_device |
| 84 | 66 | |
| 85 | | class cdp1862_device : public device_t, |
| 86 | | public cdp1862_interface |
| 67 | class cdp1862_device : public device_t |
| 87 | 68 | { |
| 88 | 69 | public: |
| 89 | 70 | // construction/destruction |
| 90 | 71 | cdp1862_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 91 | 72 | |
| 73 | void set_screen_tag(const char *screen_tag) { m_screen_tag = screen_tag; } |
| 74 | template<class _rd> void set_rd_callback(_rd rd) { m_read_rd.set_callback(rd); } |
| 75 | template<class _bd> void set_bd_callback(_bd bd) { m_read_bd.set_callback(bd); } |
| 76 | template<class _gd> void set_gd_callback(_gd gd) { m_read_gd.set_callback(gd); } |
| 77 | void set_luminance_resistors(double r, double b, double g, double bkg) { m_lum_r = r; m_lum_b = b; m_lum_g = g; m_lum_bkg = bkg; } |
| 78 | void set_chrominance_resistors(double r, double b, double g, double bkg) { m_chr_r = r; m_chr_b = b; m_chr_g = g; m_chr_bkg = bkg; } |
| 79 | |
| 92 | 80 | DECLARE_WRITE8_MEMBER( dma_w ); |
| 93 | 81 | DECLARE_WRITE_LINE_MEMBER( bkg_w ); |
| 94 | 82 | DECLARE_WRITE_LINE_MEMBER( con_w ); |
| r23575 | r23576 | |
| 97 | 85 | |
| 98 | 86 | protected: |
| 99 | 87 | // device-level overrides |
| 100 | | virtual void device_config_complete(); |
| 101 | 88 | virtual void device_start(); |
| 102 | 89 | virtual void device_reset(); |
| 103 | 90 | |
| 104 | 91 | private: |
| 105 | 92 | inline void initialize_palette(); |
| 106 | 93 | |
| 107 | | devcb_resolved_read_line m_in_rd_func; |
| 108 | | devcb_resolved_read_line m_in_bd_func; |
| 109 | | devcb_resolved_read_line m_in_gd_func; |
| 94 | devcb2_read_line m_read_rd; |
| 95 | devcb2_read_line m_read_bd; |
| 96 | devcb2_read_line m_read_gd; |
| 110 | 97 | |
| 98 | const char *m_screen_tag; |
| 111 | 99 | screen_device *m_screen; // screen |
| 112 | 100 | bitmap_rgb32 m_bitmap; // bitmap |
| 113 | 101 | |
| 102 | double m_lum_r; // red luminance resistor value |
| 103 | double m_lum_b; // blue luminance resistor value |
| 104 | double m_lum_g; // green luminance resistor value |
| 105 | double m_lum_bkg; // background luminance resistor value |
| 106 | |
| 107 | double m_chr_r; // red chrominance resistor value |
| 108 | double m_chr_b; // blue chrominance resistor value |
| 109 | double m_chr_g; // green chrominance resistor value |
| 110 | double m_chr_bkg; // background chrominance resistor value |
| 111 | |
| 114 | 112 | rgb_t m_palette[16]; |
| 115 | 113 | int m_bgcolor; // background color |
| 116 | 114 | int m_con; // color on |
trunk/src/emu/video/cdp1861.c
| r23575 | r23576 | |
| 23 | 23 | |
| 24 | 24 | |
| 25 | 25 | //************************************************************************** |
| 26 | | // LIVE DEVICE |
| 26 | // DEVICE DEFINITIONS |
| 27 | 27 | //************************************************************************** |
| 28 | 28 | |
| 29 | 29 | // device type definition |
| 30 | 30 | const device_type CDP1861 = &device_creator<cdp1861_device>; |
| 31 | 31 | |
| 32 | | //------------------------------------------------- |
| 33 | | // cdp1861_device - constructor |
| 34 | | //------------------------------------------------- |
| 35 | 32 | |
| 36 | | cdp1861_device::cdp1861_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 37 | | : device_t(mconfig, CDP1861, "CDP1861", tag, owner, clock) |
| 38 | | { |
| 39 | | } |
| 40 | 33 | |
| 34 | //************************************************************************** |
| 35 | // LIVE DEVICE |
| 36 | //************************************************************************** |
| 41 | 37 | |
| 42 | 38 | //------------------------------------------------- |
| 43 | | // device_config_complete - perform any |
| 44 | | // operations now that the configuration is |
| 45 | | // complete |
| 39 | // cdp1861_device - constructor |
| 46 | 40 | //------------------------------------------------- |
| 47 | 41 | |
| 48 | | void cdp1861_device::device_config_complete() |
| 42 | cdp1861_device::cdp1861_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 43 | : device_t(mconfig, CDP1861, "CDP1861", tag, owner, clock), |
| 44 | m_write_irq(*this), |
| 45 | m_write_dma_out(*this), |
| 46 | m_write_efx(*this) |
| 49 | 47 | { |
| 50 | | // inherit a copy of the static data |
| 51 | | const cdp1861_interface *intf = reinterpret_cast<const cdp1861_interface *>(static_config()); |
| 52 | | if (intf != NULL) |
| 53 | | *static_cast<cdp1861_interface *>(this) = *intf; |
| 54 | | |
| 55 | | // or initialize to defaults if none provided |
| 56 | | else |
| 57 | | { |
| 58 | | memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); |
| 59 | | memset(&m_out_dmao_cb, 0, sizeof(m_out_dmao_cb)); |
| 60 | | memset(&m_out_efx_cb, 0, sizeof(m_out_efx_cb)); |
| 61 | | } |
| 62 | 48 | } |
| 63 | 49 | |
| 64 | 50 | |
| r23575 | r23576 | |
| 69 | 55 | void cdp1861_device::device_start() |
| 70 | 56 | { |
| 71 | 57 | // resolve callbacks |
| 72 | | m_out_int_func.resolve(m_out_int_cb, *this); |
| 73 | | m_out_dmao_func.resolve(m_out_dmao_cb, *this); |
| 74 | | m_out_efx_func.resolve(m_out_efx_cb, *this); |
| 58 | m_write_irq.resolve_safe(); |
| 59 | m_write_dma_out.resolve_safe(); |
| 60 | m_write_efx.resolve_safe(); |
| 75 | 61 | |
| 76 | 62 | // allocate timers |
| 77 | 63 | m_int_timer = timer_alloc(TIMER_INT); |
| r23575 | r23576 | |
| 79 | 65 | m_dma_timer = timer_alloc(TIMER_DMA); |
| 80 | 66 | |
| 81 | 67 | // find devices |
| 82 | | m_cpu = machine().device<cpu_device>(m_cpu_tag); |
| 83 | 68 | m_screen = machine().device<screen_device>(m_screen_tag); |
| 84 | 69 | m_screen->register_screen_bitmap(m_bitmap); |
| 85 | 70 | |
| r23575 | r23576 | |
| 99 | 84 | { |
| 100 | 85 | m_int_timer->adjust(m_screen->time_until_pos(CDP1861_SCANLINE_INT_START, 0)); |
| 101 | 86 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1861_SCANLINE_EFX_TOP_START, 0)); |
| 102 | | m_dma_timer->adjust(m_cpu->cycles_to_attotime(CDP1861_CYCLES_DMA_START)); |
| 87 | m_dma_timer->adjust(clocks_to_attotime(CDP1861_CYCLES_DMA_START)); |
| 103 | 88 | |
| 104 | 89 | m_disp = 0; |
| 105 | 90 | m_dmaout = 0; |
| 106 | 91 | m_dispon = 0; |
| 107 | 92 | |
| 108 | | m_out_int_func(CLEAR_LINE); |
| 109 | | m_out_dmao_func(CLEAR_LINE); |
| 110 | | m_out_efx_func(CLEAR_LINE); |
| 93 | m_write_irq(CLEAR_LINE); |
| 94 | m_write_dma_out(CLEAR_LINE); |
| 95 | m_write_efx(CLEAR_LINE); |
| 111 | 96 | } |
| 112 | 97 | |
| 113 | 98 | |
| r23575 | r23576 | |
| 126 | 111 | { |
| 127 | 112 | if (m_disp) |
| 128 | 113 | { |
| 129 | | m_out_int_func(ASSERT_LINE); |
| 114 | m_write_irq(ASSERT_LINE); |
| 130 | 115 | } |
| 131 | 116 | |
| 132 | 117 | m_int_timer->adjust(m_screen->time_until_pos( CDP1861_SCANLINE_INT_END, 0)); |
| r23575 | r23576 | |
| 135 | 120 | { |
| 136 | 121 | if (m_disp) |
| 137 | 122 | { |
| 138 | | m_out_int_func(CLEAR_LINE); |
| 123 | m_write_irq(CLEAR_LINE); |
| 139 | 124 | } |
| 140 | 125 | |
| 141 | 126 | m_int_timer->adjust(m_screen->time_until_pos(CDP1861_SCANLINE_INT_START, 0)); |
| r23575 | r23576 | |
| 146 | 131 | switch (scanline) |
| 147 | 132 | { |
| 148 | 133 | case CDP1861_SCANLINE_EFX_TOP_START: |
| 149 | | m_out_efx_func(ASSERT_LINE); |
| 134 | m_write_efx(ASSERT_LINE); |
| 150 | 135 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1861_SCANLINE_EFX_TOP_END, 0)); |
| 151 | 136 | break; |
| 152 | 137 | |
| 153 | 138 | case CDP1861_SCANLINE_EFX_TOP_END: |
| 154 | | m_out_efx_func(CLEAR_LINE); |
| 139 | m_write_efx(CLEAR_LINE); |
| 155 | 140 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1861_SCANLINE_EFX_BOTTOM_START, 0)); |
| 156 | 141 | break; |
| 157 | 142 | |
| 158 | 143 | case CDP1861_SCANLINE_EFX_BOTTOM_START: |
| 159 | | m_out_efx_func(ASSERT_LINE); |
| 144 | m_write_efx(ASSERT_LINE); |
| 160 | 145 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1861_SCANLINE_EFX_BOTTOM_END, 0)); |
| 161 | 146 | break; |
| 162 | 147 | |
| 163 | 148 | case CDP1861_SCANLINE_EFX_BOTTOM_END: |
| 164 | | m_out_efx_func(CLEAR_LINE); |
| 149 | m_write_efx(CLEAR_LINE); |
| 165 | 150 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1861_SCANLINE_EFX_TOP_START, 0)); |
| 166 | 151 | break; |
| 167 | 152 | } |
| r23575 | r23576 | |
| 174 | 159 | { |
| 175 | 160 | if (scanline >= CDP1861_SCANLINE_DISPLAY_START && scanline < CDP1861_SCANLINE_DISPLAY_END) |
| 176 | 161 | { |
| 177 | | m_out_dmao_func(CLEAR_LINE); |
| 162 | m_write_dma_out(CLEAR_LINE); |
| 178 | 163 | } |
| 179 | 164 | } |
| 180 | 165 | |
| 181 | | m_dma_timer->adjust(m_cpu->cycles_to_attotime(CDP1861_CYCLES_DMA_WAIT)); |
| 166 | m_dma_timer->adjust(clocks_to_attotime(CDP1861_CYCLES_DMA_WAIT)); |
| 182 | 167 | |
| 183 | 168 | m_dmaout = 0; |
| 184 | 169 | } |
| r23575 | r23576 | |
| 188 | 173 | { |
| 189 | 174 | if (scanline >= CDP1861_SCANLINE_DISPLAY_START && scanline < CDP1861_SCANLINE_DISPLAY_END) |
| 190 | 175 | { |
| 191 | | m_out_dmao_func(ASSERT_LINE); |
| 176 | m_write_dma_out(ASSERT_LINE); |
| 192 | 177 | } |
| 193 | 178 | } |
| 194 | 179 | |
| 195 | | m_dma_timer->adjust(m_cpu->cycles_to_attotime(CDP1861_CYCLES_DMA_ACTIVE)); |
| 180 | m_dma_timer->adjust(clocks_to_attotime(CDP1861_CYCLES_DMA_ACTIVE)); |
| 196 | 181 | |
| 197 | 182 | m_dmaout = 1; |
| 198 | 183 | } |
| r23575 | r23576 | |
| 242 | 227 | |
| 243 | 228 | m_dispoff = state; |
| 244 | 229 | |
| 245 | | m_out_int_func(CLEAR_LINE); |
| 246 | | m_out_dmao_func(CLEAR_LINE); |
| 230 | m_write_irq(CLEAR_LINE); |
| 231 | m_write_dma_out(CLEAR_LINE); |
| 247 | 232 | } |
| 248 | 233 | |
| 249 | 234 | |
trunk/src/emu/video/cdp1861.h
| r23575 | r23576 | |
| 65 | 65 | // INTERFACE CONFIGURATION MACROS |
| 66 | 66 | //************************************************************************** |
| 67 | 67 | |
| 68 | | #define MCFG_CDP1861_ADD(_tag, _clock, _config) \ |
| 68 | #define MCFG_CDP1861_ADD(_tag, _screen_tag, _clock, _irq, _dma_out, _efx) \ |
| 69 | 69 | MCFG_DEVICE_ADD(_tag, CDP1861, _clock) \ |
| 70 | | MCFG_DEVICE_CONFIG(_config) |
| 70 | downcast<cdp1861_device *>(device)->set_screen_tag(_screen_tag); \ |
| 71 | downcast<cdp1861_device *>(device)->set_irq_callback(DEVCB2_##_irq); \ |
| 72 | downcast<cdp1861_device *>(device)->set_dma_out_callback(DEVCB2_##_dma_out); \ |
| 73 | downcast<cdp1861_device *>(device)->set_efx_callback(DEVCB2_##_efx); |
| 71 | 74 | |
| 72 | | |
| 73 | 75 | #define MCFG_CDP1861_SCREEN_ADD(_cdptag, _tag, _clock) \ |
| 74 | 76 | MCFG_SCREEN_ADD(_tag, RASTER) \ |
| 75 | 77 | MCFG_SCREEN_UPDATE_DEVICE(_cdptag, cdp1861_device, screen_update) \ |
| 76 | 78 | MCFG_SCREEN_RAW_PARAMS(_clock, CDP1861_SCREEN_WIDTH, CDP1861_HBLANK_END, CDP1861_HBLANK_START, CDP1861_TOTAL_SCANLINES, CDP1861_SCANLINE_VBLANK_END, CDP1861_SCANLINE_VBLANK_START) |
| 77 | 79 | |
| 78 | 80 | |
| 79 | | #define CDP1861_INTERFACE(name) \ |
| 80 | | const cdp1861_interface (name) = |
| 81 | 81 | |
| 82 | | |
| 83 | | |
| 84 | 82 | //************************************************************************** |
| 85 | 83 | // TYPE DEFINITIONS |
| 86 | 84 | //************************************************************************** |
| 87 | 85 | |
| 88 | | |
| 89 | | // ======================> cdp1861_interface |
| 90 | | |
| 91 | | struct cdp1861_interface |
| 92 | | { |
| 93 | | const char *m_cpu_tag; |
| 94 | | const char *m_screen_tag; |
| 95 | | |
| 96 | | devcb_write_line m_out_int_cb; |
| 97 | | devcb_write_line m_out_dmao_cb; |
| 98 | | devcb_write_line m_out_efx_cb; |
| 99 | | }; |
| 100 | | |
| 101 | | |
| 102 | | |
| 103 | 86 | // ======================> cdp1861_device |
| 104 | 87 | |
| 105 | | class cdp1861_device : public device_t, |
| 106 | | public cdp1861_interface |
| 88 | class cdp1861_device : public device_t |
| 107 | 89 | { |
| 108 | 90 | public: |
| 109 | 91 | // construction/destruction |
| 110 | 92 | cdp1861_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 111 | 93 | |
| 94 | void set_screen_tag(const char *screen_tag) { m_screen_tag = screen_tag; } |
| 95 | template<class _irq> void set_irq_callback(_irq irq) { m_write_irq.set_callback(irq); } |
| 96 | template<class _dma_out> void set_dma_out_callback(_dma_out dma_out) { m_write_dma_out.set_callback(dma_out); } |
| 97 | template<class _efx> void set_efx_callback(_efx efx) { m_write_efx.set_callback(efx); } |
| 98 | |
| 112 | 99 | DECLARE_WRITE8_MEMBER( dma_w ); |
| 113 | 100 | DECLARE_WRITE_LINE_MEMBER( disp_on_w ); |
| 114 | 101 | DECLARE_WRITE_LINE_MEMBER( disp_off_w ); |
| r23575 | r23576 | |
| 117 | 104 | |
| 118 | 105 | protected: |
| 119 | 106 | // device-level overrides |
| 120 | | virtual void device_config_complete(); |
| 121 | 107 | virtual void device_start(); |
| 122 | 108 | virtual void device_reset(); |
| 123 | 109 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 124 | 110 | |
| 125 | 111 | private: |
| 126 | | static const device_timer_id TIMER_INT = 0; |
| 127 | | static const device_timer_id TIMER_EFX = 1; |
| 128 | | static const device_timer_id TIMER_DMA = 2; |
| 112 | enum |
| 113 | { |
| 114 | TIMER_INT, |
| 115 | TIMER_EFX, |
| 116 | TIMER_DMA |
| 117 | }; |
| 129 | 118 | |
| 130 | | devcb_resolved_write_line m_out_int_func; |
| 131 | | devcb_resolved_write_line m_out_dmao_func; |
| 132 | | devcb_resolved_write_line m_out_efx_func; |
| 119 | devcb2_write_line m_write_irq; |
| 120 | devcb2_write_line m_write_dma_out; |
| 121 | devcb2_write_line m_write_efx; |
| 133 | 122 | |
| 123 | const char *m_screen_tag; |
| 134 | 124 | screen_device *m_screen; // screen |
| 135 | 125 | bitmap_rgb32 m_bitmap; // bitmap |
| 136 | 126 | |
| r23575 | r23576 | |
| 143 | 133 | emu_timer *m_int_timer; // interrupt timer |
| 144 | 134 | emu_timer *m_efx_timer; // EFx timer |
| 145 | 135 | emu_timer *m_dma_timer; // DMA timer |
| 146 | | |
| 147 | | cpu_device *m_cpu; |
| 148 | 136 | }; |
| 149 | 137 | |
| 150 | 138 | |
trunk/src/emu/sound/cdp1864.h
| r23575 | r23576 | |
| 80 | 80 | // INTERFACE CONFIGURATION MACROS |
| 81 | 81 | //************************************************************************** |
| 82 | 82 | |
| 83 | | #define MCFG_CDP1864_ADD(_tag, _clock, _config) \ |
| 83 | #define MCFG_CDP1864_ADD(_tag, _screen_tag, _clock, _inlace, _irq, _dma_out, _efx, _hsync, _rdata, _bdata, _gdata) \ |
| 84 | 84 | MCFG_SOUND_ADD(_tag, CDP1864, _clock) \ |
| 85 | | MCFG_DEVICE_CONFIG(_config) |
| 85 | downcast<cdp1864_device *>(device)->set_screen_tag(_screen_tag); \ |
| 86 | downcast<cdp1864_device *>(device)->set_inlace_callback(DEVCB2_##_inlace); \ |
| 87 | downcast<cdp1864_device *>(device)->set_irq_callback(DEVCB2_##_irq); \ |
| 88 | downcast<cdp1864_device *>(device)->set_dma_out_callback(DEVCB2_##_dma_out); \ |
| 89 | downcast<cdp1864_device *>(device)->set_efx_callback(DEVCB2_##_efx); \ |
| 90 | downcast<cdp1864_device *>(device)->set_hsync_callback(DEVCB2_##_hsync); \ |
| 91 | downcast<cdp1864_device *>(device)->set_rdata_callback(DEVCB2_##_rdata); \ |
| 92 | downcast<cdp1864_device *>(device)->set_bdata_callback(DEVCB2_##_bdata); \ |
| 93 | downcast<cdp1864_device *>(device)->set_gdata_callback(DEVCB2_##_gdata); |
| 86 | 94 | |
| 95 | #define MCFG_CDP1864_CHROMINANCE(_r, _b, _g, _bkg) \ |
| 96 | downcast<cdp1864_device *>(device)->set_chrominance_resistors(_r, _b, _g, _bkg); |
| 87 | 97 | |
| 88 | 98 | #define MCFG_CDP1864_SCREEN_ADD(_tag, _clock) \ |
| 89 | 99 | MCFG_SCREEN_ADD(_tag, RASTER) \ |
| 90 | 100 | MCFG_SCREEN_RAW_PARAMS(_clock, CDP1864_SCREEN_WIDTH, CDP1864_HBLANK_END, CDP1864_HBLANK_START, CDP1864_TOTAL_SCANLINES, CDP1864_SCANLINE_VBLANK_END, CDP1864_SCANLINE_VBLANK_START) |
| 91 | 101 | |
| 92 | 102 | |
| 93 | | #define CDP1864_INTERFACE(name) \ |
| 94 | | const cdp1864_interface (name) = |
| 95 | 103 | |
| 96 | | |
| 97 | | #define CDP1864_NON_INTERLACED \ |
| 98 | | DEVCB_LINE_VCC |
| 99 | | |
| 100 | | |
| 101 | | #define CDP1864_INTERLACED \ |
| 102 | | DEVCB_LINE_GND |
| 103 | | |
| 104 | | |
| 105 | | |
| 106 | 104 | //************************************************************************** |
| 107 | 105 | // TYPE DEFINITIONS |
| 108 | 106 | //************************************************************************** |
| 109 | 107 | |
| 110 | | // ======================> cdp1864_interface |
| 111 | | |
| 112 | | struct cdp1864_interface |
| 113 | | { |
| 114 | | const char *m_cpu_tag; |
| 115 | | const char *m_screen_tag; |
| 116 | | |
| 117 | | devcb_read_line m_in_inlace_cb; |
| 118 | | |
| 119 | | devcb_read_line m_in_rdata_cb; |
| 120 | | devcb_read_line m_in_bdata_cb; |
| 121 | | devcb_read_line m_in_gdata_cb; |
| 122 | | |
| 123 | | devcb_write_line m_out_int_cb; |
| 124 | | devcb_write_line m_out_dmao_cb; |
| 125 | | devcb_write_line m_out_efx_cb; |
| 126 | | devcb_write_line m_out_hsync_cb; |
| 127 | | |
| 128 | | double m_res_r; // red output resistor value |
| 129 | | double m_res_g; // green output resistor value |
| 130 | | double m_res_b; // blue output resistor value |
| 131 | | double m_res_bkg; // background output resistor value |
| 132 | | }; |
| 133 | | |
| 134 | | |
| 135 | | |
| 136 | 108 | // ======================> cdp1864_device |
| 137 | 109 | |
| 138 | 110 | class cdp1864_device : public device_t, |
| 139 | | public device_sound_interface, |
| 140 | | public cdp1864_interface |
| 111 | public device_sound_interface |
| 141 | 112 | { |
| 142 | 113 | public: |
| 143 | 114 | // construction/destruction |
| 144 | 115 | cdp1864_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 145 | 116 | |
| 117 | void set_screen_tag(const char *screen_tag) { m_screen_tag = screen_tag; } |
| 118 | template<class _inlace> void set_inlace_callback(_inlace inlace) { m_read_inlace.set_callback(inlace); } |
| 119 | template<class _irq> void set_irq_callback(_irq irq) { m_write_irq.set_callback(irq); } |
| 120 | template<class _dma_out> void set_dma_out_callback(_dma_out dma_out) { m_write_dma_out.set_callback(dma_out); } |
| 121 | template<class _efx> void set_efx_callback(_efx efx) { m_write_efx.set_callback(efx); } |
| 122 | template<class _hsync> void set_hsync_callback(_hsync hsync) { m_write_hsync.set_callback(hsync); } |
| 123 | template<class _rdata> void set_rdata_callback(_rdata rdata) { m_read_rdata.set_callback(rdata); } |
| 124 | template<class _bdata> void set_bdata_callback(_bdata bdata) { m_read_bdata.set_callback(bdata); } |
| 125 | template<class _gdata> void set_gdata_callback(_gdata gdata) { m_read_gdata.set_callback(gdata); } |
| 126 | void set_chrominance_resistors(double r, double b, double g, double bkg) { m_chr_r = r; m_chr_b = b; m_chr_g = g; m_chr_bkg = bkg; } |
| 127 | |
| 146 | 128 | DECLARE_READ8_MEMBER( dispon_r ); |
| 147 | 129 | DECLARE_READ8_MEMBER( dispoff_r ); |
| 148 | 130 | |
| r23575 | r23576 | |
| 159 | 141 | |
| 160 | 142 | protected: |
| 161 | 143 | // device-level overrides |
| 162 | | virtual void device_config_complete(); |
| 163 | 144 | virtual void device_start(); |
| 164 | 145 | virtual void device_reset(); |
| 165 | 146 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| r23575 | r23576 | |
| 170 | 151 | private: |
| 171 | 152 | inline void initialize_palette(); |
| 172 | 153 | |
| 173 | | static const device_timer_id TIMER_INT = 0; |
| 174 | | static const device_timer_id TIMER_EFX = 1; |
| 175 | | static const device_timer_id TIMER_DMA = 2; |
| 176 | | static const device_timer_id TIMER_HSYNC = 3; |
| 154 | enum |
| 155 | { |
| 156 | TIMER_INT, |
| 157 | TIMER_EFX, |
| 158 | TIMER_DMA, |
| 159 | TIMER_HSYNC |
| 160 | }; |
| 177 | 161 | |
| 178 | | devcb_resolved_read_line m_in_inlace_func; |
| 179 | | devcb_resolved_read_line m_in_rdata_func; |
| 180 | | devcb_resolved_read_line m_in_bdata_func; |
| 181 | | devcb_resolved_read_line m_in_gdata_func; |
| 182 | | devcb_resolved_write_line m_out_int_func; |
| 183 | | devcb_resolved_write_line m_out_dmao_func; |
| 184 | | devcb_resolved_write_line m_out_efx_func; |
| 185 | | devcb_resolved_write_line m_out_hsync_func; |
| 162 | devcb2_read_line m_read_inlace; |
| 163 | devcb2_read_line m_read_rdata; |
| 164 | devcb2_read_line m_read_bdata; |
| 165 | devcb2_read_line m_read_gdata; |
| 166 | devcb2_write_line m_write_irq; |
| 167 | devcb2_write_line m_write_dma_out; |
| 168 | devcb2_write_line m_write_efx; |
| 169 | devcb2_write_line m_write_hsync; |
| 186 | 170 | |
| 187 | | cpu_device *m_cpu; |
| 171 | const char *m_screen_tag; |
| 188 | 172 | screen_device *m_screen; // screen |
| 189 | 173 | bitmap_rgb32 m_bitmap; // bitmap |
| 190 | 174 | sound_stream *m_stream; // sound output |
| 191 | 175 | |
| 192 | 176 | // video state |
| 177 | double m_chr_r; // red chrominance resistor value |
| 178 | double m_chr_b; // blue chrominance resistor value |
| 179 | double m_chr_g; // green chrominance resistor value |
| 180 | double m_chr_bkg; // background chrominance resistor value |
| 181 | |
| 193 | 182 | rgb_t m_palette[16]; |
| 194 | 183 | int m_disp; // display on |
| 195 | 184 | int m_dmaout; // DMA request active |
trunk/src/emu/sound/cdp1864.c
| r23575 | r23576 | |
| 61 | 61 | |
| 62 | 62 | inline void cdp1864_device::initialize_palette() |
| 63 | 63 | { |
| 64 | | double res_total = m_res_r + m_res_g + m_res_b + m_res_bkg; |
| 64 | double res_total = m_chr_r + m_chr_g + m_chr_b + m_chr_bkg; |
| 65 | 65 | |
| 66 | | int weight_r = (m_res_r / res_total) * 100; |
| 67 | | int weight_g = (m_res_g / res_total) * 100; |
| 68 | | int weight_b = (m_res_b / res_total) * 100; |
| 69 | | int weight_bkg = (m_res_bkg / res_total) * 100; |
| 66 | int weight_r = (m_chr_r / res_total) * 100; |
| 67 | int weight_g = (m_chr_g / res_total) * 100; |
| 68 | int weight_b = (m_chr_b / res_total) * 100; |
| 69 | int weight_bkg = (m_chr_bkg / res_total) * 100; |
| 70 | 70 | |
| 71 | 71 | for (int i = 0; i < 16; i++) |
| 72 | 72 | { |
| r23575 | r23576 | |
| 100 | 100 | cdp1864_device::cdp1864_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 101 | 101 | : device_t(mconfig, CDP1864, "CDP1864", tag, owner, clock), |
| 102 | 102 | device_sound_interface(mconfig, *this), |
| 103 | m_read_inlace(*this), |
| 104 | m_read_rdata(*this), |
| 105 | m_read_bdata(*this), |
| 106 | m_read_gdata(*this), |
| 107 | m_write_irq(*this), |
| 108 | m_write_dma_out(*this), |
| 109 | m_write_efx(*this), |
| 110 | m_write_hsync(*this), |
| 103 | 111 | m_disp(0), |
| 104 | 112 | m_dmaout(0), |
| 105 | 113 | m_bgcolor(0), |
| r23575 | r23576 | |
| 111 | 119 | |
| 112 | 120 | |
| 113 | 121 | //------------------------------------------------- |
| 114 | | // device_config_complete - perform any |
| 115 | | // operations now that the configuration is |
| 116 | | // complete |
| 117 | | //------------------------------------------------- |
| 118 | | |
| 119 | | void cdp1864_device::device_config_complete() |
| 120 | | { |
| 121 | | // inherit a copy of the static data |
| 122 | | const cdp1864_interface *intf = reinterpret_cast<const cdp1864_interface *>(static_config()); |
| 123 | | if (intf != NULL) |
| 124 | | *static_cast<cdp1864_interface *>(this) = *intf; |
| 125 | | |
| 126 | | // or initialize to defaults if none provided |
| 127 | | else |
| 128 | | { |
| 129 | | memset(&m_in_inlace_cb, 0, sizeof(m_in_inlace_cb)); |
| 130 | | memset(&m_in_rdata_cb, 0, sizeof(m_in_rdata_cb)); |
| 131 | | memset(&m_in_bdata_cb, 0, sizeof(m_in_bdata_cb)); |
| 132 | | memset(&m_in_gdata_cb, 0, sizeof(m_in_gdata_cb)); |
| 133 | | memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); |
| 134 | | memset(&m_out_dmao_cb, 0, sizeof(m_out_dmao_cb)); |
| 135 | | memset(&m_out_efx_cb, 0, sizeof(m_out_efx_cb)); |
| 136 | | memset(&m_out_hsync_cb, 0, sizeof(m_out_hsync_cb)); |
| 137 | | } |
| 138 | | } |
| 139 | | |
| 140 | | |
| 141 | | //------------------------------------------------- |
| 142 | 122 | // device_start - device-specific startup |
| 143 | 123 | //------------------------------------------------- |
| 144 | 124 | |
| 145 | 125 | void cdp1864_device::device_start() |
| 146 | 126 | { |
| 147 | 127 | // resolve callbacks |
| 148 | | m_in_inlace_func.resolve(m_in_inlace_cb, *this); |
| 149 | | m_in_rdata_func.resolve(m_in_rdata_cb, *this); |
| 150 | | m_in_bdata_func.resolve(m_in_bdata_cb, *this); |
| 151 | | m_in_gdata_func.resolve(m_in_gdata_cb, *this); |
| 152 | | m_out_int_func.resolve(m_out_int_cb, *this); |
| 153 | | m_out_dmao_func.resolve(m_out_dmao_cb, *this); |
| 154 | | m_out_efx_func.resolve(m_out_efx_cb, *this); |
| 155 | | m_out_hsync_func.resolve(m_out_hsync_cb, *this); |
| 128 | m_read_inlace.resolve_safe(1); |
| 129 | m_read_rdata.resolve_safe(0); |
| 130 | m_read_bdata.resolve_safe(0); |
| 131 | m_read_gdata.resolve_safe(0); |
| 132 | m_write_irq.resolve_safe(); |
| 133 | m_write_dma_out.resolve_safe(); |
| 134 | m_write_efx.resolve_safe(); |
| 135 | m_write_hsync.resolve_safe(); |
| 156 | 136 | |
| 157 | 137 | // initialize palette |
| 158 | 138 | initialize_palette(); |
| r23575 | r23576 | |
| 167 | 147 | m_hsync_timer = timer_alloc(TIMER_HSYNC); |
| 168 | 148 | |
| 169 | 149 | // find devices |
| 170 | | m_cpu = machine().device<cpu_device>(m_cpu_tag); |
| 171 | 150 | m_screen = machine().device<screen_device>(m_screen_tag); |
| 172 | 151 | m_screen->register_screen_bitmap(m_bitmap); |
| 173 | 152 | |
| r23575 | r23576 | |
| 191 | 170 | { |
| 192 | 171 | m_int_timer->adjust(m_screen->time_until_pos(CDP1864_SCANLINE_INT_START, 0)); |
| 193 | 172 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1864_SCANLINE_EFX_TOP_START, 0)); |
| 194 | | m_dma_timer->adjust(m_cpu->cycles_to_attotime(CDP1864_CYCLES_DMA_START)); |
| 173 | m_dma_timer->adjust(clocks_to_attotime(CDP1864_CYCLES_DMA_START)); |
| 195 | 174 | |
| 196 | 175 | m_disp = 0; |
| 197 | 176 | m_dmaout = 0; |
| 198 | 177 | |
| 199 | | m_out_int_func(CLEAR_LINE); |
| 200 | | m_out_dmao_func(CLEAR_LINE); |
| 201 | | m_out_efx_func(CLEAR_LINE); |
| 178 | m_write_irq(CLEAR_LINE); |
| 179 | m_write_dma_out(CLEAR_LINE); |
| 180 | m_write_efx(CLEAR_LINE); |
| 181 | m_write_hsync(CLEAR_LINE); |
| 202 | 182 | } |
| 203 | 183 | |
| 204 | 184 | |
| r23575 | r23576 | |
| 217 | 197 | { |
| 218 | 198 | if (m_disp) |
| 219 | 199 | { |
| 220 | | m_out_int_func(ASSERT_LINE); |
| 200 | m_write_irq(ASSERT_LINE); |
| 221 | 201 | } |
| 222 | 202 | |
| 223 | 203 | m_int_timer->adjust(m_screen->time_until_pos( CDP1864_SCANLINE_INT_END, 0)); |
| r23575 | r23576 | |
| 226 | 206 | { |
| 227 | 207 | if (m_disp) |
| 228 | 208 | { |
| 229 | | m_out_int_func(CLEAR_LINE); |
| 209 | m_write_irq(CLEAR_LINE); |
| 230 | 210 | } |
| 231 | 211 | |
| 232 | 212 | m_int_timer->adjust(m_screen->time_until_pos(CDP1864_SCANLINE_INT_START, 0)); |
| r23575 | r23576 | |
| 237 | 217 | switch (scanline) |
| 238 | 218 | { |
| 239 | 219 | case CDP1864_SCANLINE_EFX_TOP_START: |
| 240 | | m_out_efx_func(ASSERT_LINE); |
| 220 | m_write_efx(ASSERT_LINE); |
| 241 | 221 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1864_SCANLINE_EFX_TOP_END, 0)); |
| 242 | 222 | break; |
| 243 | 223 | |
| 244 | 224 | case CDP1864_SCANLINE_EFX_TOP_END: |
| 245 | | m_out_efx_func(CLEAR_LINE); |
| 225 | m_write_efx(CLEAR_LINE); |
| 246 | 226 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1864_SCANLINE_EFX_BOTTOM_START, 0)); |
| 247 | 227 | break; |
| 248 | 228 | |
| 249 | 229 | case CDP1864_SCANLINE_EFX_BOTTOM_START: |
| 250 | | m_out_efx_func(ASSERT_LINE); |
| 230 | m_write_efx(ASSERT_LINE); |
| 251 | 231 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1864_SCANLINE_EFX_BOTTOM_END, 0)); |
| 252 | 232 | break; |
| 253 | 233 | |
| 254 | 234 | case CDP1864_SCANLINE_EFX_BOTTOM_END: |
| 255 | | m_out_efx_func(CLEAR_LINE); |
| 235 | m_write_efx(CLEAR_LINE); |
| 256 | 236 | m_efx_timer->adjust(m_screen->time_until_pos(CDP1864_SCANLINE_EFX_TOP_START, 0)); |
| 257 | 237 | break; |
| 258 | 238 | } |
| r23575 | r23576 | |
| 265 | 245 | { |
| 266 | 246 | if (scanline >= CDP1864_SCANLINE_DISPLAY_START && scanline < CDP1864_SCANLINE_DISPLAY_END) |
| 267 | 247 | { |
| 268 | | m_out_dmao_func(CLEAR_LINE); |
| 248 | m_write_dma_out(CLEAR_LINE); |
| 269 | 249 | } |
| 270 | 250 | } |
| 271 | 251 | |
| 272 | | m_dma_timer->adjust(m_cpu->cycles_to_attotime(CDP1864_CYCLES_DMA_WAIT)); |
| 252 | m_dma_timer->adjust(clocks_to_attotime(CDP1864_CYCLES_DMA_WAIT)); |
| 273 | 253 | |
| 274 | 254 | m_dmaout = 0; |
| 275 | 255 | } |
| r23575 | r23576 | |
| 279 | 259 | { |
| 280 | 260 | if (scanline >= CDP1864_SCANLINE_DISPLAY_START && scanline < CDP1864_SCANLINE_DISPLAY_END) |
| 281 | 261 | { |
| 282 | | m_out_dmao_func(ASSERT_LINE); |
| 262 | m_write_dma_out(ASSERT_LINE); |
| 283 | 263 | } |
| 284 | 264 | } |
| 285 | 265 | |
| 286 | | m_dma_timer->adjust(m_cpu->cycles_to_attotime(CDP1864_CYCLES_DMA_ACTIVE)); |
| 266 | m_dma_timer->adjust(clocks_to_attotime(CDP1864_CYCLES_DMA_ACTIVE)); |
| 287 | 267 | |
| 288 | 268 | m_dmaout = 1; |
| 289 | 269 | } |
| r23575 | r23576 | |
| 309 | 289 | |
| 310 | 290 | if (m_aoe) |
| 311 | 291 | { |
| 312 | | double frequency = m_cpu->unscaled_clock() / 8 / 4 / (m_latch + 1) / 2; |
| 292 | double frequency = unscaled_clock() / 8 / 4 / (m_latch + 1) / 2; |
| 313 | 293 | int rate = machine().sample_rate() / 2; |
| 314 | 294 | |
| 315 | 295 | /* get progress through wave */ |
| r23575 | r23576 | |
| 362 | 342 | { |
| 363 | 343 | m_disp = 0; |
| 364 | 344 | |
| 365 | | m_out_int_func(CLEAR_LINE); |
| 366 | | m_out_dmao_func(CLEAR_LINE); |
| 345 | m_write_irq(CLEAR_LINE); |
| 346 | m_write_dma_out(CLEAR_LINE); |
| 367 | 347 | |
| 368 | 348 | return 0xff; |
| 369 | 349 | } |
| r23575 | r23576 | |
| 408 | 388 | |
| 409 | 389 | if (!m_con) |
| 410 | 390 | { |
| 411 | | rdata = m_in_rdata_func(); |
| 412 | | bdata = m_in_bdata_func(); |
| 413 | | gdata = m_in_gdata_func(); |
| 391 | rdata = m_read_rdata(); |
| 392 | bdata = m_read_bdata(); |
| 393 | gdata = m_read_gdata(); |
| 414 | 394 | } |
| 415 | 395 | |
| 416 | 396 | for (int x = 0; x < 8; x++) |
trunk/src/mess/drivers/elf.c
| r23575 | r23576 | |
| 221 | 221 | DEVCB_NULL |
| 222 | 222 | }; |
| 223 | 223 | |
| 224 | | /* CDP1861 Interface */ |
| 225 | | |
| 226 | | static CDP1861_INTERFACE( elf2_cdp1861_intf ) |
| 227 | | { |
| 228 | | CDP1802_TAG, |
| 229 | | SCREEN_TAG, |
| 230 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 231 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), |
| 232 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1) |
| 233 | | }; |
| 234 | | |
| 235 | 224 | /* Machine Initialization */ |
| 236 | 225 | |
| 237 | 226 | void elf2_state::machine_start() |
| r23575 | r23576 | |
| 300 | 289 | |
| 301 | 290 | /* video hardware */ |
| 302 | 291 | MCFG_DEFAULT_LAYOUT( layout_elf2 ) |
| 303 | | |
| 304 | 292 | MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) |
| 305 | 293 | MCFG_SCREEN_UPDATE_DEVICE(CDP1861_TAG, cdp1861_device, screen_update) |
| 306 | 294 | MCFG_SCREEN_RAW_PARAMS(XTAL_3_579545MHz/2, CDP1861_SCREEN_WIDTH, CDP1861_HBLANK_END, CDP1861_HBLANK_START, CDP1861_TOTAL_SCANLINES, CDP1861_SCANLINE_VBLANK_END, CDP1861_SCANLINE_VBLANK_START) |
| 307 | 295 | |
| 296 | /* devices */ |
| 308 | 297 | MCFG_MM74C923_ADD(MM74C923_TAG, keyboard_intf) |
| 309 | 298 | MCFG_DM9368_ADD(DM9368_H_TAG, led_h_intf) |
| 310 | 299 | MCFG_DM9368_ADD(DM9368_L_TAG, led_l_intf) |
| 311 | | MCFG_CDP1861_ADD(CDP1861_TAG, XTAL_3_579545MHz/2, elf2_cdp1861_intf) |
| 312 | | |
| 313 | | /* devices */ |
| 300 | MCFG_CDP1861_ADD(CDP1861_TAG, SCREEN_TAG, XTAL_3_579545MHz/2, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1)) |
| 314 | 301 | MCFG_CASSETTE_ADD("cassette", elf_cassette_interface) |
| 315 | 302 | MCFG_QUICKLOAD_ADD("quickload", elf2_state, elf, "bin", 0) |
| 316 | 303 | |
trunk/src/mess/drivers/studio2.c
| r23575 | r23576 | |
| 377 | 377 | |
| 378 | 378 | /* Video */ |
| 379 | 379 | |
| 380 | | static CDP1861_INTERFACE( studio2_cdp1861_intf ) |
| 381 | | { |
| 382 | | CDP1802_TAG, |
| 383 | | SCREEN_TAG, |
| 384 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 385 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), |
| 386 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1) |
| 387 | | }; |
| 388 | | |
| 389 | 380 | static const rgb_t VISICOM_PALETTE[] = |
| 390 | 381 | { |
| 391 | 382 | MAKE_RGB(0x00, 0x80, 0x00), |
| r23575 | r23576 | |
| 409 | 400 | return BIT(m_color, 2); |
| 410 | 401 | } |
| 411 | 402 | |
| 412 | | static CDP1864_INTERFACE( mpt02_cdp1864_intf ) |
| 413 | | { |
| 414 | | CDP1802_TAG, |
| 415 | | SCREEN_TAG, |
| 416 | | CDP1864_INTERLACED, |
| 417 | | DEVCB_DRIVER_LINE_MEMBER(mpt02_state, rdata_r), |
| 418 | | DEVCB_DRIVER_LINE_MEMBER(mpt02_state, bdata_r), |
| 419 | | DEVCB_DRIVER_LINE_MEMBER(mpt02_state, gdata_r), |
| 420 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 421 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), |
| 422 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), |
| 423 | | DEVCB_NULL, |
| 424 | | RES_K(2.2), // unverified |
| 425 | | RES_K(1), // unverified |
| 426 | | RES_K(5.1), // unverified |
| 427 | | RES_K(4.7) // unverified |
| 428 | | }; |
| 429 | | |
| 430 | 403 | /* CDP1802 Configuration */ |
| 431 | 404 | |
| 432 | 405 | READ_LINE_MEMBER( studio2_state::clear_r ) |
| r23575 | r23576 | |
| 546 | 519 | |
| 547 | 520 | /* video hardware */ |
| 548 | 521 | MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, 1760000) |
| 549 | | MCFG_CDP1861_ADD(CDP1861_TAG, 1760000, studio2_cdp1861_intf) |
| 522 | MCFG_CDP1861_ADD(CDP1861_TAG, SCREEN_TAG, 1760000, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1)) |
| 550 | 523 | |
| 551 | 524 | /* sound hardware */ |
| 552 | 525 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| r23575 | r23576 | |
| 565 | 538 | |
| 566 | 539 | /* video hardware */ |
| 567 | 540 | MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, XTAL_3_579545MHz/2) |
| 568 | | MCFG_CDP1861_ADD(CDP1861_TAG, XTAL_3_579545MHz/2/8, studio2_cdp1861_intf) |
| 541 | MCFG_CDP1861_ADD(CDP1861_TAG, SCREEN_TAG, XTAL_3_579545MHz/2/8, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1)) |
| 569 | 542 | |
| 570 | 543 | /* sound hardware */ |
| 571 | 544 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| r23575 | r23576 | |
| 591 | 564 | MCFG_SOUND_ADD("beeper", BEEP, 0) |
| 592 | 565 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 593 | 566 | |
| 594 | | MCFG_CDP1864_ADD(CDP1864_TAG, CDP1864_CLOCK, mpt02_cdp1864_intf) |
| 567 | MCFG_CDP1864_ADD(CDP1864_TAG, SCREEN_TAG, CDP1864_CLOCK, GND, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), NULL, READLINE(mpt02_state, rdata_r), READLINE(mpt02_state, bdata_r), READLINE(mpt02_state, gdata_r)) |
| 568 | MCFG_CDP1864_CHROMINANCE(RES_K(2.2), RES_K(1), RES_K(5.1), RES_K(4.7)) // unverified |
| 569 | |
| 595 | 570 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 596 | 571 | |
| 597 | 572 | MCFG_FRAGMENT_ADD( studio2_cartslot ) |
trunk/src/mess/drivers/trs80m2.c
| r23575 | r23576 | |
| 500 | 500 | m_kbclk = state; |
| 501 | 501 | } |
| 502 | 502 | |
| 503 | | static TRS80M2_KEYBOARD_INTERFACE( kb_intf ) |
| 504 | | { |
| 505 | | DEVCB_DRIVER_LINE_MEMBER(trs80m2_state, kb_clock_w) |
| 506 | | }; |
| 507 | | |
| 508 | 503 | WRITE8_MEMBER( trs80m2_state::kbd_w ) |
| 509 | 504 | { |
| 510 | 505 | // latch key data |
| r23575 | r23576 | |
| 844 | 839 | MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":1", trs80m2_floppies, NULL, floppy_image_device::default_floppy_formats) |
| 845 | 840 | MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":2", trs80m2_floppies, NULL, floppy_image_device::default_floppy_formats) |
| 846 | 841 | MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":3", trs80m2_floppies, NULL, floppy_image_device::default_floppy_formats) |
| 847 | | MCFG_TRS80M2_KEYBOARD_ADD(kb_intf) |
| 842 | MCFG_TRS80M2_KEYBOARD_ADD(WRITELINE(trs80m2_state, kb_clock_w)) |
| 848 | 843 | MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf) |
| 849 | 844 | |
| 850 | 845 | // internal RAM |
| r23575 | r23576 | |
| 895 | 890 | MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":2", trs80m2_floppies, NULL, floppy_image_device::default_floppy_formats) |
| 896 | 891 | MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":3", trs80m2_floppies, NULL, floppy_image_device::default_floppy_formats) |
| 897 | 892 | MCFG_PIC8259_ADD(AM9519A_TAG, INPUTLINE(M68000_TAG, M68K_IRQ_5), VCC, NULL ) |
| 898 | | MCFG_TRS80M2_KEYBOARD_ADD(kb_intf) |
| 893 | MCFG_TRS80M2_KEYBOARD_ADD(WRITELINE(trs80m2_state, kb_clock_w)) |
| 899 | 894 | |
| 900 | 895 | // internal RAM |
| 901 | 896 | MCFG_RAM_ADD(RAM_TAG) |
trunk/src/mess/drivers/cosmicos.c
| r23575 | r23576 | |
| 362 | 362 | m_efx = state; |
| 363 | 363 | } |
| 364 | 364 | |
| 365 | | static CDP1864_INTERFACE( cosmicos_cdp1864_intf ) |
| 366 | | { |
| 367 | | CDP1802_TAG, |
| 368 | | SCREEN_TAG, |
| 369 | | CDP1864_INTERLACED, |
| 370 | | DEVCB_LINE_VCC, |
| 371 | | DEVCB_LINE_VCC, |
| 372 | | DEVCB_LINE_VCC, |
| 373 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 374 | | DEVCB_DRIVER_LINE_MEMBER(cosmicos_state, dmaout_w), |
| 375 | | DEVCB_DRIVER_LINE_MEMBER(cosmicos_state, efx_w), |
| 376 | | DEVCB_NULL, |
| 377 | | RES_K(2), // R2 |
| 378 | | 0, // not connected |
| 379 | | 0, // not connected |
| 380 | | 0 // not connected |
| 381 | | }; |
| 382 | | |
| 383 | 365 | /* CDP1802 Configuration */ |
| 384 | 366 | |
| 385 | 367 | READ_LINE_MEMBER( cosmicos_state::wait_r ) |
| r23575 | r23576 | |
| 582 | 564 | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 583 | 565 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 584 | 566 | |
| 585 | | MCFG_CDP1864_ADD(CDP1864_TAG, XTAL_1_75MHz, cosmicos_cdp1864_intf) |
| 567 | MCFG_CDP1864_ADD(CDP1864_TAG, SCREEN_TAG, XTAL_1_75MHz, GND, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), WRITELINE(cosmicos_state, dmaout_w), WRITELINE(cosmicos_state, efx_w), NULL, VCC, VCC, VCC) |
| 568 | MCFG_CDP1864_CHROMINANCE(RES_K(2), 0, 0, 0) // R2 |
| 586 | 569 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 587 | 570 | |
| 588 | 571 | /* devices */ |
trunk/src/mess/drivers/vip.c
| r23575 | r23576 | |
| 546 | 546 | m_vdc_ef1 = state; |
| 547 | 547 | } |
| 548 | 548 | |
| 549 | | static CDP1861_INTERFACE( vdc_intf ) |
| 550 | | { |
| 551 | | CDP1802_TAG, |
| 552 | | SCREEN_TAG, |
| 553 | | DEVCB_DRIVER_LINE_MEMBER(vip_state, vdc_int_w), |
| 554 | | DEVCB_DRIVER_LINE_MEMBER(vip_state, vdc_dma_out_w), |
| 555 | | DEVCB_DRIVER_LINE_MEMBER(vip_state, vdc_ef1_w) |
| 556 | | }; |
| 557 | | |
| 558 | 549 | UINT32 vip_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 559 | 550 | { |
| 560 | 551 | m_vdc->screen_update(screen, bitmap, cliprect); |
| r23575 | r23576 | |
| 609 | 600 | } |
| 610 | 601 | } |
| 611 | 602 | |
| 612 | | static VIP_BYTEIO_PORT_INTERFACE( byteio_intf ) |
| 613 | | { |
| 614 | | DEVCB_DRIVER_LINE_MEMBER(vip_state, byteio_inst_w) |
| 615 | | }; |
| 616 | 603 | |
| 617 | | |
| 618 | 604 | //------------------------------------------------- |
| 619 | 605 | // VIP_EXPANSION_INTERFACE( expansion_intf ) |
| 620 | 606 | //------------------------------------------------- |
| r23575 | r23576 | |
| 640 | 626 | update_interrupts(); |
| 641 | 627 | } |
| 642 | 628 | |
| 643 | | static VIP_EXPANSION_INTERFACE( expansion_intf ) |
| 644 | | { |
| 645 | | DEVCB_DRIVER_LINE_MEMBER(vip_state, exp_int_w), |
| 646 | | DEVCB_DRIVER_LINE_MEMBER(vip_state, exp_dma_out_w), |
| 647 | | DEVCB_DRIVER_LINE_MEMBER(vip_state, exp_dma_in_w) |
| 648 | | }; |
| 649 | 629 | |
| 650 | 630 | |
| 651 | | |
| 652 | 631 | //************************************************************************** |
| 653 | 632 | // MACHINE INITIALIZATION |
| 654 | 633 | //************************************************************************** |
| r23575 | r23576 | |
| 772 | 751 | // video hardware |
| 773 | 752 | MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, XTAL_3_52128MHz/2) |
| 774 | 753 | MCFG_SCREEN_UPDATE_DRIVER(vip_state, screen_update) |
| 754 | MCFG_CDP1861_ADD(CDP1861_TAG, SCREEN_TAG, XTAL_3_52128MHz/2, WRITELINE(vip_state, vdc_int_w), WRITELINE(vip_state, vdc_dma_out_w), WRITELINE(vip_state, vdc_ef1_w)) |
| 775 | 755 | |
| 776 | | MCFG_CDP1861_ADD(CDP1861_TAG, XTAL_3_52128MHz/2, vdc_intf) |
| 777 | | |
| 778 | 756 | // sound hardware |
| 779 | 757 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 780 | 758 | |
| r23575 | r23576 | |
| 782 | 760 | MCFG_SOUND_CONFIG_DISCRETE(vip) |
| 783 | 761 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 784 | 762 | |
| 785 | | MCFG_VIP_BYTEIO_PORT_ADD(VIP_BYTEIO_PORT_TAG, byteio_intf, vip_byteio_cards, NULL) |
| 786 | | MCFG_VIP_EXPANSION_SLOT_ADD(VIP_EXPANSION_SLOT_TAG, XTAL_3_52128MHz/2, expansion_intf, vip_expansion_cards, NULL) |
| 763 | MCFG_VIP_BYTEIO_PORT_ADD(VIP_BYTEIO_PORT_TAG, vip_byteio_cards, NULL, WRITELINE(vip_state, byteio_inst_w)) |
| 764 | MCFG_VIP_EXPANSION_SLOT_ADD(VIP_EXPANSION_SLOT_TAG, XTAL_3_52128MHz/2, vip_expansion_cards, NULL) |
| 765 | MCFG_VIP_EXPANSION_SLOT_CALLBACKS(WRITELINE(vip_state, exp_int_w), WRITELINE(vip_state, exp_dma_out_w), WRITELINE(vip_state, exp_dma_in_w)) |
| 787 | 766 | |
| 788 | 767 | // devices |
| 789 | 768 | MCFG_QUICKLOAD_ADD("quickload", vip_state, vip, "bin,c8,c8x", 0) |
trunk/src/mess/drivers/pc1512.c
| r23575 | r23576 | |
| 777 | 777 | m_kbclk = state; |
| 778 | 778 | } |
| 779 | 779 | |
| 780 | | static PC1512_KEYBOARD_INTERFACE( kb_intf ) |
| 781 | | { |
| 782 | | DEVCB_DRIVER_LINE_MEMBER(pc1512_state, kbdata_w), |
| 783 | | DEVCB_DRIVER_LINE_MEMBER(pc1512_state, kbclk_w) |
| 784 | | }; |
| 785 | 780 | |
| 786 | | |
| 787 | 781 | //------------------------------------------------- |
| 788 | 782 | // I8237_INTERFACE( dmac_intf ) |
| 789 | 783 | //------------------------------------------------- |
| r23575 | r23576 | |
| 1260 | 1254 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 1261 | 1255 | |
| 1262 | 1256 | // devices |
| 1263 | | MCFG_PC1512_KEYBOARD_ADD(kb_intf) |
| 1257 | MCFG_PC1512_KEYBOARD_ADD(WRITELINE(pc1512_state, kbclk_w), WRITELINE(pc1512_state, kbdata_w)) |
| 1264 | 1258 | MCFG_I8237_ADD(I8237A5_TAG, XTAL_24MHz/6, dmac_intf) |
| 1265 | 1259 | MCFG_PIC8259_ADD(I8259A2_TAG, INPUTLINE(I8086_TAG, INPUT_LINE_IRQ0), VCC, NULL) |
| 1266 | 1260 | MCFG_PIT8253_ADD(I8253_TAG, pit_intf) |
| r23575 | r23576 | |
| 1306 | 1300 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 1307 | 1301 | |
| 1308 | 1302 | // devices |
| 1309 | | MCFG_PC1512_KEYBOARD_ADD(kb_intf) |
| 1303 | MCFG_PC1512_KEYBOARD_ADD(WRITELINE(pc1512_state, kbclk_w), WRITELINE(pc1512_state, kbdata_w)) |
| 1310 | 1304 | MCFG_I8237_ADD(I8237A5_TAG, XTAL_24MHz/6, dmac_intf) |
| 1311 | 1305 | MCFG_PIC8259_ADD(I8259A2_TAG, INPUTLINE(I8086_TAG, INPUT_LINE_IRQ0), VCC, NULL) |
| 1312 | 1306 | MCFG_PIT8253_ADD(I8253_TAG, pit_intf) |
trunk/src/mess/drivers/eti660.c
| r23575 | r23576 | |
| 100 | 100 | return BIT(m_color, 2); |
| 101 | 101 | } |
| 102 | 102 | |
| 103 | | static CDP1864_INTERFACE( eti660_cdp1864_intf ) |
| 104 | | { |
| 105 | | CDP1802_TAG, |
| 106 | | SCREEN_TAG, |
| 107 | | CDP1864_INTERLACED, |
| 108 | | DEVCB_DRIVER_LINE_MEMBER(eti660_state, rdata_r), |
| 109 | | DEVCB_DRIVER_LINE_MEMBER(eti660_state, bdata_r), |
| 110 | | DEVCB_DRIVER_LINE_MEMBER(eti660_state, gdata_r), |
| 111 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 112 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), |
| 113 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), |
| 114 | | DEVCB_NULL, |
| 115 | | RES_K(2.2), /* R7 */ |
| 116 | | RES_K(1), /* R5 */ |
| 117 | | RES_K(4.7), /* R6 */ |
| 118 | | RES_K(4.7) /* R4 */ |
| 119 | | }; |
| 120 | | |
| 121 | 103 | /* CDP1802 Interface */ |
| 122 | 104 | |
| 123 | 105 | READ_LINE_MEMBER( eti660_state::clear_r ) |
| r23575 | r23576 | |
| 262 | 244 | |
| 263 | 245 | /* sound hardware */ |
| 264 | 246 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 265 | | MCFG_CDP1864_ADD(CDP1864_TAG, XTAL_8_867238MHz/5, eti660_cdp1864_intf) |
| 247 | MCFG_CDP1864_ADD(CDP1864_TAG, SCREEN_TAG, XTAL_8_867238MHz/5, GND, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), NULL, READLINE(eti660_state, rdata_r), READLINE(eti660_state, bdata_r), READLINE(eti660_state, gdata_r)) |
| 248 | MCFG_CDP1864_CHROMINANCE(RES_K(2.2), RES_K(1), RES_K(4.7), RES_K(4.7)) // R7, R5, R6, R4 |
| 266 | 249 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 267 | 250 | |
| 268 | 251 | /* devices */ |
trunk/src/mess/drivers/tmc2000e.c
| r23575 | r23576 | |
| 210 | 210 | return BIT(m_color, 0); |
| 211 | 211 | } |
| 212 | 212 | |
| 213 | | static CDP1864_INTERFACE( tmc2000e_cdp1864_intf ) |
| 214 | | { |
| 215 | | CDP1802_TAG, |
| 216 | | SCREEN_TAG, |
| 217 | | CDP1864_INTERLACED, |
| 218 | | DEVCB_DRIVER_LINE_MEMBER(tmc2000e_state, rdata_r), |
| 219 | | DEVCB_DRIVER_LINE_MEMBER(tmc2000e_state, bdata_r), |
| 220 | | DEVCB_DRIVER_LINE_MEMBER(tmc2000e_state, gdata_r), |
| 221 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 222 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), |
| 223 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), |
| 224 | | DEVCB_NULL, |
| 225 | | RES_K(2.2), // unverified |
| 226 | | RES_K(1), // unverified |
| 227 | | RES_K(5.1), // unverified |
| 228 | | RES_K(4.7) // unverified |
| 229 | | }; |
| 230 | | |
| 231 | 213 | /* CDP1802 Interface */ |
| 232 | 214 | |
| 233 | 215 | READ_LINE_MEMBER( tmc2000e_state::clear_r ) |
| r23575 | r23576 | |
| 335 | 317 | |
| 336 | 318 | // sound hardware |
| 337 | 319 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 338 | | MCFG_CDP1864_ADD(CDP1864_TAG, XTAL_1_75MHz, tmc2000e_cdp1864_intf) |
| 320 | MCFG_CDP1864_ADD(CDP1864_TAG, SCREEN_TAG, XTAL_1_75MHz, GND, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), NULL, READLINE(tmc2000e_state, rdata_r), READLINE(tmc2000e_state, bdata_r), READLINE(tmc2000e_state, gdata_r)) |
| 321 | MCFG_CDP1864_CHROMINANCE(RES_K(2.2), RES_K(1), RES_K(5.1), RES_K(4.7)) // unverified |
| 339 | 322 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 340 | 323 | |
| 341 | 324 | /* devices */ |
trunk/src/mess/machine/vip_exp.c
| r23575 | r23576 | |
| 42 | 42 | } |
| 43 | 43 | |
| 44 | 44 | |
| 45 | | //------------------------------------------------- |
| 46 | | // ~device_vip_expansion_card_interface - destructor |
| 47 | | //------------------------------------------------- |
| 48 | 45 | |
| 49 | | device_vip_expansion_card_interface::~device_vip_expansion_card_interface() |
| 50 | | { |
| 51 | | } |
| 52 | | |
| 53 | | |
| 54 | | |
| 55 | 46 | //************************************************************************** |
| 56 | 47 | // LIVE DEVICE |
| 57 | 48 | //************************************************************************** |
| r23575 | r23576 | |
| 61 | 52 | //------------------------------------------------- |
| 62 | 53 | |
| 63 | 54 | vip_expansion_slot_device::vip_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 64 | | device_t(mconfig, VIP_EXPANSION_SLOT, "VIP expansion port", tag, owner, clock), |
| 65 | | device_slot_interface(mconfig, *this) |
| 55 | device_t(mconfig, VIP_EXPANSION_SLOT, "VIP expansion port", tag, owner, clock), |
| 56 | device_slot_interface(mconfig, *this), |
| 57 | m_write_irq(*this), |
| 58 | m_write_dma_out(*this), |
| 59 | m_write_dma_in(*this) |
| 66 | 60 | { |
| 67 | 61 | } |
| 68 | 62 | |
| 69 | 63 | |
| 70 | 64 | //------------------------------------------------- |
| 71 | | // vip_expansion_slot_device - destructor |
| 72 | | //------------------------------------------------- |
| 73 | | |
| 74 | | vip_expansion_slot_device::~vip_expansion_slot_device() |
| 75 | | { |
| 76 | | } |
| 77 | | |
| 78 | | |
| 79 | | //------------------------------------------------- |
| 80 | | // device_config_complete - perform any |
| 81 | | // operations now that the configuration is |
| 82 | | // complete |
| 83 | | //------------------------------------------------- |
| 84 | | |
| 85 | | void vip_expansion_slot_device::device_config_complete() |
| 86 | | { |
| 87 | | // inherit a copy of the static data |
| 88 | | const vip_expansion_slot_interface *intf = reinterpret_cast<const vip_expansion_slot_interface *>(static_config()); |
| 89 | | if (intf != NULL) |
| 90 | | { |
| 91 | | *static_cast<vip_expansion_slot_interface *>(this) = *intf; |
| 92 | | } |
| 93 | | |
| 94 | | // or initialize to defaults if none provided |
| 95 | | else |
| 96 | | { |
| 97 | | memset(&m_out_interrupt_cb, 0, sizeof(m_out_interrupt_cb)); |
| 98 | | memset(&m_out_dma_out_cb, 0, sizeof(m_out_dma_out_cb)); |
| 99 | | memset(&m_out_dma_in_cb, 0, sizeof(m_out_dma_in_cb)); |
| 100 | | } |
| 101 | | } |
| 102 | | |
| 103 | | |
| 104 | | //------------------------------------------------- |
| 105 | 65 | // device_start - device-specific startup |
| 106 | 66 | //------------------------------------------------- |
| 107 | 67 | |
| 108 | 68 | void vip_expansion_slot_device::device_start() |
| 109 | 69 | { |
| 110 | | m_cart = dynamic_cast<device_vip_expansion_card_interface *>(get_card_device()); |
| 70 | m_card = dynamic_cast<device_vip_expansion_card_interface *>(get_card_device()); |
| 111 | 71 | |
| 112 | 72 | // resolve callbacks |
| 113 | | m_out_interrupt_func.resolve(m_out_interrupt_cb, *this); |
| 114 | | m_out_dma_out_func.resolve(m_out_dma_out_cb, *this); |
| 115 | | m_out_dma_in_func.resolve(m_out_dma_in_cb, *this); |
| 73 | m_write_irq.resolve_safe(); |
| 74 | m_write_dma_out.resolve_safe(); |
| 75 | m_write_dma_in.resolve_safe(); |
| 116 | 76 | } |
| 117 | 77 | |
| 118 | 78 | |
| r23575 | r23576 | |
| 124 | 84 | { |
| 125 | 85 | UINT8 data = 0; |
| 126 | 86 | |
| 127 | | if (m_cart != NULL) |
| 87 | if (m_card != NULL) |
| 128 | 88 | { |
| 129 | | data = m_cart->vip_program_r(space, offset, cs, cdef, minh); |
| 89 | data = m_card->vip_program_r(space, offset, cs, cdef, minh); |
| 130 | 90 | } |
| 131 | 91 | |
| 132 | 92 | return data; |
| r23575 | r23576 | |
| 139 | 99 | |
| 140 | 100 | void vip_expansion_slot_device::program_w(address_space &space, offs_t offset, UINT8 data, int cdef, int *minh) |
| 141 | 101 | { |
| 142 | | if (m_cart != NULL) |
| 102 | if (m_card != NULL) |
| 143 | 103 | { |
| 144 | | m_cart->vip_program_w(space, offset, data, cdef, minh); |
| 104 | m_card->vip_program_w(space, offset, data, cdef, minh); |
| 145 | 105 | } |
| 146 | 106 | } |
| 147 | 107 | |
| r23575 | r23576 | |
| 154 | 114 | { |
| 155 | 115 | UINT8 data = 0; |
| 156 | 116 | |
| 157 | | if (m_cart != NULL) |
| 117 | if (m_card != NULL) |
| 158 | 118 | { |
| 159 | | data = m_cart->vip_io_r(space, offset); |
| 119 | data = m_card->vip_io_r(space, offset); |
| 160 | 120 | } |
| 161 | 121 | |
| 162 | 122 | return data; |
| r23575 | r23576 | |
| 169 | 129 | |
| 170 | 130 | void vip_expansion_slot_device::io_w(address_space &space, offs_t offset, UINT8 data) |
| 171 | 131 | { |
| 172 | | if (m_cart != NULL) |
| 132 | if (m_card != NULL) |
| 173 | 133 | { |
| 174 | | m_cart->vip_io_w(space, offset, data); |
| 134 | m_card->vip_io_w(space, offset, data); |
| 175 | 135 | } |
| 176 | 136 | } |
| 177 | 137 | |
| r23575 | r23576 | |
| 184 | 144 | { |
| 185 | 145 | UINT8 data = 0; |
| 186 | 146 | |
| 187 | | if (m_cart != NULL) |
| 147 | if (m_card != NULL) |
| 188 | 148 | { |
| 189 | | data = m_cart->vip_dma_r(space, offset); |
| 149 | data = m_card->vip_dma_r(space, offset); |
| 190 | 150 | } |
| 191 | 151 | |
| 192 | 152 | return data; |
| r23575 | r23576 | |
| 199 | 159 | |
| 200 | 160 | void vip_expansion_slot_device::dma_w(address_space &space, offs_t offset, UINT8 data) |
| 201 | 161 | { |
| 202 | | if (m_cart != NULL) |
| 162 | if (m_card != NULL) |
| 203 | 163 | { |
| 204 | | m_cart->vip_dma_w(space, offset, data); |
| 164 | m_card->vip_dma_w(space, offset, data); |
| 205 | 165 | } |
| 206 | 166 | } |
| 207 | 167 | |
| r23575 | r23576 | |
| 214 | 174 | { |
| 215 | 175 | bool value = false; |
| 216 | 176 | |
| 217 | | if (m_cart != NULL) |
| 177 | if (m_card != NULL) |
| 218 | 178 | { |
| 219 | | value = m_cart->vip_screen_update(screen, bitmap, cliprect); |
| 179 | value = m_card->vip_screen_update(screen, bitmap, cliprect); |
| 220 | 180 | } |
| 221 | 181 | |
| 222 | 182 | return value; |
| 223 | 183 | } |
| 224 | 184 | |
| 225 | | READ_LINE_MEMBER( vip_expansion_slot_device::ef1_r ) { int state = CLEAR_LINE; if (m_cart != NULL) state = m_cart->vip_ef1_r(); return state; } |
| 226 | | READ_LINE_MEMBER( vip_expansion_slot_device::ef3_r ) { int state = CLEAR_LINE; if (m_cart != NULL) state = m_cart->vip_ef3_r(); return state; } |
| 227 | | READ_LINE_MEMBER( vip_expansion_slot_device::ef4_r ) { int state = CLEAR_LINE; if (m_cart != NULL) state = m_cart->vip_ef4_r(); return state; } |
| 228 | | void vip_expansion_slot_device::sc_w(int data) { if (m_cart != NULL) m_cart->vip_sc_w(data); } |
| 229 | | WRITE_LINE_MEMBER( vip_expansion_slot_device::q_w ) { if (m_cart != NULL) m_cart->vip_q_w(state); } |
| 230 | | WRITE_LINE_MEMBER( vip_expansion_slot_device::run_w ) { if (m_cart != NULL) m_cart->vip_run_w(state); } |
| 185 | READ_LINE_MEMBER( vip_expansion_slot_device::ef1_r ) { int state = CLEAR_LINE; if (m_card != NULL) state = m_card->vip_ef1_r(); return state; } |
| 186 | READ_LINE_MEMBER( vip_expansion_slot_device::ef3_r ) { int state = CLEAR_LINE; if (m_card != NULL) state = m_card->vip_ef3_r(); return state; } |
| 187 | READ_LINE_MEMBER( vip_expansion_slot_device::ef4_r ) { int state = CLEAR_LINE; if (m_card != NULL) state = m_card->vip_ef4_r(); return state; } |
| 188 | void vip_expansion_slot_device::sc_w(int data) { if (m_card != NULL) m_card->vip_sc_w(data); } |
| 189 | WRITE_LINE_MEMBER( vip_expansion_slot_device::q_w ) { if (m_card != NULL) m_card->vip_q_w(state); } |
| 190 | WRITE_LINE_MEMBER( vip_expansion_slot_device::run_w ) { if (m_card != NULL) m_card->vip_run_w(state); } |
| 231 | 191 | |
| 232 | | WRITE_LINE_MEMBER( vip_expansion_slot_device::interrupt_w ) { m_out_interrupt_func(state); } |
| 233 | | WRITE_LINE_MEMBER( vip_expansion_slot_device::dma_out_w ) { m_out_dma_out_func(state); } |
| 234 | | WRITE_LINE_MEMBER( vip_expansion_slot_device::dma_in_w ) { m_out_dma_in_func(state); } |
| 235 | 192 | |
| 236 | 193 | |
| 237 | | |
| 238 | 194 | //------------------------------------------------- |
| 239 | 195 | // SLOT_INTERFACE vip_expansion_cards ) |
| 240 | 196 | //------------------------------------------------- |
trunk/src/mess/machine/vip_exp.h
| r23575 | r23576 | |
| 53 | 53 | // INTERFACE CONFIGURATION MACROS |
| 54 | 54 | //************************************************************************** |
| 55 | 55 | |
| 56 | | #define VIP_EXPANSION_INTERFACE(_name) \ |
| 57 | | const vip_expansion_slot_interface (_name) = |
| 58 | | |
| 59 | | |
| 60 | | #define MCFG_VIP_EXPANSION_SLOT_ADD(_tag, _clock, _config, _slot_intf, _def_slot) \ |
| 56 | #define MCFG_VIP_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \ |
| 61 | 57 | MCFG_DEVICE_ADD(_tag, VIP_EXPANSION_SLOT, _clock) \ |
| 62 | | MCFG_DEVICE_CONFIG(_config) \ |
| 63 | 58 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
| 64 | 59 | |
| 60 | #define MCFG_VIP_EXPANSION_SLOT_CALLBACKS(_irq, _dma_out, _dma_in) \ |
| 61 | downcast<vip_expansion_slot_device *>(device)->set_irq_callback(DEVCB2_##_irq); \ |
| 62 | downcast<vip_expansion_slot_device *>(device)->set_dma_out_callback(DEVCB2_##_dma_out); \ |
| 63 | downcast<vip_expansion_slot_device *>(device)->set_dma_in_callback(DEVCB2_##_dma_in); |
| 65 | 64 | |
| 66 | 65 | |
| 66 | |
| 67 | 67 | //************************************************************************** |
| 68 | 68 | // TYPE DEFINITIONS |
| 69 | 69 | //************************************************************************** |
| 70 | 70 | |
| 71 | | // ======================> vip_expansion_slot_interface |
| 72 | | |
| 73 | | struct vip_expansion_slot_interface |
| 74 | | { |
| 75 | | devcb_write_line m_out_interrupt_cb; |
| 76 | | devcb_write_line m_out_dma_out_cb; |
| 77 | | devcb_write_line m_out_dma_in_cb; |
| 78 | | }; |
| 79 | | |
| 80 | | |
| 81 | 71 | // ======================> vip_expansion_slot_device |
| 82 | 72 | |
| 83 | 73 | class device_vip_expansion_card_interface; |
| 84 | 74 | |
| 85 | 75 | class vip_expansion_slot_device : public device_t, |
| 86 | | public vip_expansion_slot_interface, |
| 87 | 76 | public device_slot_interface |
| 88 | 77 | { |
| 89 | 78 | public: |
| 90 | 79 | // construction/destruction |
| 91 | 80 | vip_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 92 | | virtual ~vip_expansion_slot_device(); |
| 93 | 81 | |
| 82 | template<class _irq> void set_irq_callback(_irq irq) { m_write_irq.set_callback(irq); } |
| 83 | template<class _dma_out> void set_dma_out_callback(_dma_out dma_out) { m_write_dma_out.set_callback(dma_out); } |
| 84 | template<class _dma_in> void set_dma_in_callback(_dma_in dma_in) { m_write_dma_in.set_callback(dma_in); } |
| 85 | |
| 94 | 86 | // computer interface |
| 95 | 87 | UINT8 program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh); |
| 96 | 88 | void program_w(address_space &space, offs_t offset, UINT8 data, int cdef, int *minh); |
| r23575 | r23576 | |
| 107 | 99 | DECLARE_WRITE_LINE_MEMBER( run_w ); |
| 108 | 100 | |
| 109 | 101 | // cartridge interface |
| 110 | | DECLARE_WRITE_LINE_MEMBER( interrupt_w ); |
| 111 | | DECLARE_WRITE_LINE_MEMBER( dma_out_w ); |
| 112 | | DECLARE_WRITE_LINE_MEMBER( dma_in_w ); |
| 102 | DECLARE_WRITE_LINE_MEMBER( interrupt_w ) { m_write_irq(state); } |
| 103 | DECLARE_WRITE_LINE_MEMBER( dma_out_w ) { m_write_dma_out(state); } |
| 104 | DECLARE_WRITE_LINE_MEMBER( dma_in_w ) { m_write_dma_in(state); } |
| 113 | 105 | |
| 114 | 106 | protected: |
| 115 | 107 | // device-level overrides |
| 116 | | virtual void device_config_complete(); |
| 117 | 108 | virtual void device_start(); |
| 118 | 109 | |
| 119 | | devcb_resolved_write_line m_out_interrupt_func; |
| 120 | | devcb_resolved_write_line m_out_dma_out_func; |
| 121 | | devcb_resolved_write_line m_out_dma_in_func; |
| 110 | devcb2_write_line m_write_irq; |
| 111 | devcb2_write_line m_write_dma_out; |
| 112 | devcb2_write_line m_write_dma_in; |
| 122 | 113 | |
| 123 | | device_vip_expansion_card_interface *m_cart; |
| 114 | device_vip_expansion_card_interface *m_card; |
| 124 | 115 | }; |
| 125 | 116 | |
| 126 | 117 | |
| r23575 | r23576 | |
| 133 | 124 | public: |
| 134 | 125 | // construction/destruction |
| 135 | 126 | device_vip_expansion_card_interface(const machine_config &mconfig, device_t &device); |
| 136 | | virtual ~device_vip_expansion_card_interface(); |
| 137 | 127 | |
| 138 | 128 | protected: |
| 139 | 129 | // runtime |
trunk/src/mess/machine/pc1512kb.c
| r23575 | r23576 | |
| 18 | 18 | #define I8048_TAG "ic801" |
| 19 | 19 | |
| 20 | 20 | |
| 21 | | enum |
| 22 | | { |
| 23 | | LED_CAPS = 0, |
| 24 | | LED_NUM |
| 25 | | }; |
| 26 | 21 | |
| 27 | | |
| 28 | | |
| 29 | 22 | //************************************************************************** |
| 30 | 23 | // DEVICE DEFINITIONS |
| 31 | 24 | //************************************************************************** |
| r23575 | r23576 | |
| 34 | 27 | |
| 35 | 28 | |
| 36 | 29 | //------------------------------------------------- |
| 37 | | // device_config_complete - perform any |
| 38 | | // operations now that the configuration is |
| 39 | | // complete |
| 40 | | //------------------------------------------------- |
| 41 | | |
| 42 | | void pc1512_keyboard_device::device_config_complete() |
| 43 | | { |
| 44 | | // inherit a copy of the static data |
| 45 | | const pc1512_keyboard_interface *intf = reinterpret_cast<const pc1512_keyboard_interface *>(static_config()); |
| 46 | | if (intf != NULL) |
| 47 | | *static_cast<pc1512_keyboard_interface *>(this) = *intf; |
| 48 | | |
| 49 | | // or initialize to defaults if none provided |
| 50 | | else |
| 51 | | { |
| 52 | | memset(&m_out_data_cb, 0, sizeof(m_out_data_cb)); |
| 53 | | memset(&m_out_clock_cb, 0, sizeof(m_out_clock_cb)); |
| 54 | | } |
| 55 | | } |
| 56 | | |
| 57 | | |
| 58 | | //------------------------------------------------- |
| 59 | 30 | // ROM( pc1512_keyboard ) |
| 60 | 31 | //------------------------------------------------- |
| 61 | 32 | |
| r23575 | r23576 | |
| 270 | 241 | m_y10(*this, "Y10"), |
| 271 | 242 | m_y11(*this, "Y11"), |
| 272 | 243 | m_com(*this, "COM"), |
| 244 | m_write_clock(*this), |
| 245 | m_write_data(*this), |
| 273 | 246 | m_data_in(1), |
| 274 | 247 | m_clock_in(1), |
| 275 | 248 | m_kb_y(0xffff), |
| r23575 | r23576 | |
| 290 | 263 | m_reset_timer = timer_alloc(); |
| 291 | 264 | |
| 292 | 265 | // resolve callbacks |
| 293 | | m_out_data_func.resolve(m_out_data_cb, *this); |
| 294 | | m_out_clock_func.resolve(m_out_clock_cb, *this); |
| 266 | m_write_clock.resolve_safe(); |
| 267 | m_write_data.resolve_safe(); |
| 295 | 268 | |
| 296 | 269 | // state saving |
| 297 | 270 | save_item(NAME(m_data_in)); |
| r23575 | r23576 | |
| 495 | 468 | */ |
| 496 | 469 | |
| 497 | 470 | // keyboard data |
| 498 | | m_out_data_func(BIT(data, 0)); |
| 471 | m_write_data(BIT(data, 0)); |
| 499 | 472 | |
| 500 | 473 | // keyboard clock |
| 501 | | m_out_clock_func(BIT(data, 1)); |
| 474 | m_write_clock(BIT(data, 1)); |
| 502 | 475 | |
| 503 | 476 | // CAPS LOCK |
| 504 | 477 | output_set_led_value(LED_CAPS, BIT(data, 2)); |
trunk/src/mess/machine/pc1512kb.h
| r23575 | r23576 | |
| 30 | 30 | // INTERFACE CONFIGURATION MACROS |
| 31 | 31 | //************************************************************************** |
| 32 | 32 | |
| 33 | | #define MCFG_PC1512_KEYBOARD_ADD(_config) \ |
| 33 | #define MCFG_PC1512_KEYBOARD_ADD(_clock, _data) \ |
| 34 | 34 | MCFG_DEVICE_ADD(PC1512_KEYBOARD_TAG, PC1512_KEYBOARD, 0) \ |
| 35 | | MCFG_DEVICE_CONFIG(_config) |
| 35 | downcast<pc1512_keyboard_device *>(device)->set_clock_callback(DEVCB2_##_clock); \ |
| 36 | downcast<pc1512_keyboard_device *>(device)->set_data_callback(DEVCB2_##_data); |
| 36 | 37 | |
| 37 | 38 | |
| 38 | | #define PC1512_KEYBOARD_INTERFACE(_name) \ |
| 39 | | const pc1512_keyboard_interface (_name) = |
| 40 | 39 | |
| 41 | | |
| 42 | | |
| 43 | 40 | //************************************************************************** |
| 44 | 41 | // TYPE DEFINITIONS |
| 45 | 42 | //************************************************************************** |
| 46 | 43 | |
| 47 | | // ======================> pc1512_keyboard_interface |
| 48 | | |
| 49 | | struct pc1512_keyboard_interface |
| 50 | | { |
| 51 | | devcb_write_line m_out_data_cb; |
| 52 | | devcb_write_line m_out_clock_cb; |
| 53 | | }; |
| 54 | | |
| 55 | | |
| 56 | 44 | // ======================> pc1512_keyboard_device |
| 57 | 45 | |
| 58 | | class pc1512_keyboard_device : public device_t, |
| 59 | | public pc1512_keyboard_interface |
| 46 | class pc1512_keyboard_device : public device_t |
| 60 | 47 | { |
| 61 | 48 | public: |
| 62 | 49 | // construction/destruction |
| 63 | 50 | pc1512_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 64 | 51 | |
| 52 | template<class _clock> void set_clock_callback(_clock clock) { m_write_clock.set_callback(clock); } |
| 53 | template<class _data> void set_data_callback(_data data) { m_write_data.set_callback(data); } |
| 54 | |
| 65 | 55 | // optional information overrides |
| 66 | 56 | virtual const rom_entry *device_rom_region() const; |
| 67 | 57 | virtual machine_config_constructor device_mconfig_additions() const; |
| r23575 | r23576 | |
| 84 | 74 | virtual void device_start(); |
| 85 | 75 | virtual void device_reset(); |
| 86 | 76 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 87 | | virtual void device_config_complete(); |
| 88 | 77 | |
| 89 | 78 | private: |
| 90 | | devcb_resolved_write_line m_out_data_func; |
| 91 | | devcb_resolved_write_line m_out_clock_func; |
| 79 | enum |
| 80 | { |
| 81 | LED_CAPS = 0, |
| 82 | LED_NUM |
| 83 | }; |
| 92 | 84 | |
| 93 | 85 | required_device<cpu_device> m_maincpu; |
| 94 | 86 | required_ioport m_y1; |
| r23575 | r23576 | |
| 104 | 96 | required_ioport m_y11; |
| 105 | 97 | required_ioport m_com; |
| 106 | 98 | |
| 99 | devcb2_write_line m_write_clock; |
| 100 | devcb2_write_line m_write_data; |
| 101 | |
| 107 | 102 | int m_data_in; |
| 108 | 103 | int m_clock_in; |
| 109 | 104 | int m_kb_y; |
trunk/src/mess/machine/vp590.c
| r23575 | r23576 | |
| 48 | 48 | return BIT(m_color, 3); |
| 49 | 49 | } |
| 50 | 50 | |
| 51 | | static CDP1862_INTERFACE( cgc_intf ) |
| 52 | | { |
| 53 | | SCREEN_TAG, |
| 54 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp590_device, rd_r), |
| 55 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp590_device, bd_r), |
| 56 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp590_device, gd_r), |
| 57 | | RES_R(510), // R3 |
| 58 | | RES_R(360), // R4 |
| 59 | | RES_K(1), // R5 |
| 60 | | RES_K(1.5), // R6 |
| 61 | | RES_K(3.9), // R7 |
| 62 | | RES_K(10), // R8 |
| 63 | | RES_K(2), // R9 |
| 64 | | RES_K(3.3) // R10 |
| 65 | | }; |
| 66 | 51 | |
| 67 | | |
| 68 | 52 | //------------------------------------------------- |
| 69 | 53 | // MACHINE_CONFIG_FRAGMENT( vp590 ) |
| 70 | 54 | //------------------------------------------------- |
| 71 | 55 | |
| 72 | 56 | static MACHINE_CONFIG_FRAGMENT( vp590 ) |
| 73 | | MCFG_CDP1862_ADD(CDP1862_TAG, CPD1862_CLOCK, cgc_intf) |
| 57 | MCFG_CDP1862_ADD(CDP1862_TAG, SCREEN_TAG, CPD1862_CLOCK, DEVREADLINE(DEVICE_SELF, vp590_device, rd_r), DEVREADLINE(DEVICE_SELF, vp590_device, bd_r), DEVREADLINE(DEVICE_SELF, vp590_device, gd_r)) |
| 58 | MCFG_CDP1862_LUMINANCE(RES_R(510), RES_R(360), RES_K(1), RES_K(1.5)) // R3, R4, R5, R6 |
| 59 | MCFG_CDP1862_CHROMINANCE(RES_K(3.9), RES_K(10), RES_K(2), RES_K(3.3)) // R7, R8, R9, R10 |
| 74 | 60 | MACHINE_CONFIG_END |
| 75 | 61 | |
| 76 | 62 | |
trunk/src/mess/machine/tandy2kb.c
| r23575 | r23576 | |
| 17 | 17 | |
| 18 | 18 | #define I8048_TAG "m1" |
| 19 | 19 | |
| 20 | | enum |
| 21 | | { |
| 22 | | LED_1 = 0, |
| 23 | | LED_2 |
| 24 | | }; |
| 25 | 20 | |
| 26 | 21 | |
| 27 | 22 | //************************************************************************** |
| r23575 | r23576 | |
| 246 | 241 | m_y9(*this, "Y9"), |
| 247 | 242 | m_y10(*this, "Y10"), |
| 248 | 243 | m_y11(*this, "Y11"), |
| 244 | m_write_clock(*this), |
| 245 | m_write_data(*this), |
| 249 | 246 | m_keylatch(0xffff), |
| 250 | 247 | m_clock(0), |
| 251 | 248 | m_data(0) |
| 252 | 249 | { |
| 253 | 250 | } |
| 254 | 251 | |
| 255 | | //------------------------------------------------- |
| 256 | | // device_config_complete - perform any |
| 257 | | // operations now that the configuration is |
| 258 | | // complete |
| 259 | | //------------------------------------------------- |
| 260 | 252 | |
| 261 | | void tandy2k_keyboard_device::device_config_complete() |
| 262 | | { |
| 263 | | // inherit a copy of the static data |
| 264 | | const tandy2k_keyboard_interface *intf = reinterpret_cast<const tandy2k_keyboard_interface *>(static_config()); |
| 265 | | if (intf != NULL) |
| 266 | | *static_cast<tandy2k_keyboard_interface *>(this) = *intf; |
| 267 | | |
| 268 | | // or initialize to defaults if none provided |
| 269 | | else |
| 270 | | { |
| 271 | | memset(&m_out_clock_cb, 0, sizeof(m_out_clock_cb)); |
| 272 | | memset(&m_out_data_cb, 0, sizeof(m_out_data_cb)); |
| 273 | | } |
| 274 | | } |
| 275 | | |
| 276 | 253 | //------------------------------------------------- |
| 277 | 254 | // device_start - device-specific startup |
| 278 | 255 | //------------------------------------------------- |
| r23575 | r23576 | |
| 280 | 257 | void tandy2k_keyboard_device::device_start() |
| 281 | 258 | { |
| 282 | 259 | // resolve callbacks |
| 283 | | m_out_clock_func.resolve(m_out_clock_cb, *this); |
| 284 | | m_out_data_func.resolve(m_out_data_cb, *this); |
| 260 | m_write_clock.resolve_safe(); |
| 261 | m_write_data.resolve_safe(); |
| 285 | 262 | |
| 286 | 263 | // state saving |
| 287 | 264 | save_item(NAME(m_keylatch)); |
| r23575 | r23576 | |
| 441 | 418 | { |
| 442 | 419 | m_clock = clock; |
| 443 | 420 | |
| 444 | | m_out_clock_func(m_clock); |
| 421 | m_write_clock(m_clock); |
| 445 | 422 | } |
| 446 | 423 | |
| 447 | 424 | // keyboard data |
| r23575 | r23576 | |
| 451 | 428 | { |
| 452 | 429 | m_data = kbddat; |
| 453 | 430 | |
| 454 | | m_out_data_func(m_data); |
| 431 | m_write_data(m_data); |
| 455 | 432 | } |
| 456 | 433 | } |
trunk/src/mess/machine/tandy2kb.h
| r23575 | r23576 | |
| 12 | 12 | #ifndef __TANDY2K_KEYBOARD__ |
| 13 | 13 | #define __TANDY2K_KEYBOARD__ |
| 14 | 14 | |
| 15 | | |
| 16 | 15 | #include "emu.h" |
| 17 | 16 | #include "cpu/mcs48/mcs48.h" |
| 18 | 17 | |
| r23575 | r23576 | |
| 30 | 29 | // INTERFACE CONFIGURATION MACROS |
| 31 | 30 | //************************************************************************** |
| 32 | 31 | |
| 33 | | #define MCFG_TANDY2K_KEYBOARD_ADD(_config) \ |
| 32 | #define MCFG_TANDY2K_KEYBOARD_ADD(_clock, _data) \ |
| 34 | 33 | MCFG_DEVICE_ADD(TANDY2K_KEYBOARD_TAG, TANDY2K_KEYBOARD, 0) \ |
| 35 | | MCFG_DEVICE_CONFIG(_config) |
| 34 | downcast<tandy2k_keyboard_device *>(device)->set_clock_callback(DEVCB2_##_clock); \ |
| 35 | downcast<tandy2k_keyboard_device *>(device)->set_data_callback(DEVCB2_##_data); |
| 36 | 36 | |
| 37 | 37 | |
| 38 | | #define TANDY2K_KEYBOARD_INTERFACE(_name) \ |
| 39 | | const tandy2k_keyboard_interface (_name) = |
| 40 | 38 | |
| 41 | | |
| 42 | | |
| 43 | 39 | //************************************************************************** |
| 44 | 40 | // TYPE DEFINITIONS |
| 45 | 41 | //************************************************************************** |
| 46 | 42 | |
| 47 | | // ======================> tandy2k_keyboard_interface |
| 48 | | |
| 49 | | struct tandy2k_keyboard_interface |
| 50 | | { |
| 51 | | devcb_write_line m_out_clock_cb; |
| 52 | | devcb_write_line m_out_data_cb; |
| 53 | | }; |
| 54 | | |
| 55 | | |
| 56 | 43 | // ======================> tandy2k_keyboard_device |
| 57 | 44 | |
| 58 | | class tandy2k_keyboard_device : public device_t, |
| 59 | | public tandy2k_keyboard_interface |
| 45 | class tandy2k_keyboard_device : public device_t |
| 60 | 46 | { |
| 61 | 47 | public: |
| 62 | 48 | // construction/destruction |
| 63 | 49 | tandy2k_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 64 | 50 | |
| 51 | template<class _clock> void set_clock_callback(_clock clock) { m_write_clock.set_callback(clock); } |
| 52 | template<class _data> void set_data_callback(_data data) { m_write_data.set_callback(data); } |
| 53 | |
| 65 | 54 | // optional information overrides |
| 66 | 55 | virtual const rom_entry *device_rom_region() const; |
| 67 | 56 | virtual machine_config_constructor device_mconfig_additions() const; |
| r23575 | r23576 | |
| 81 | 70 | // device-level overrides |
| 82 | 71 | virtual void device_start(); |
| 83 | 72 | virtual void device_reset(); |
| 84 | | virtual void device_config_complete(); |
| 85 | 73 | |
| 86 | 74 | private: |
| 87 | | devcb_resolved_write_line m_out_clock_func; |
| 88 | | devcb_resolved_write_line m_out_data_func; |
| 75 | enum |
| 76 | { |
| 77 | LED_1 = 0, |
| 78 | LED_2 |
| 79 | }; |
| 89 | 80 | |
| 90 | 81 | required_device<cpu_device> m_maincpu; |
| 91 | 82 | required_ioport m_y0; |
| r23575 | r23576 | |
| 101 | 92 | required_ioport m_y10; |
| 102 | 93 | required_ioport m_y11; |
| 103 | 94 | |
| 95 | devcb2_write_line m_write_clock; |
| 96 | devcb2_write_line m_write_data; |
| 97 | |
| 104 | 98 | UINT16 m_keylatch; |
| 105 | 99 | |
| 106 | 100 | int m_clock; |
trunk/src/mess/machine/trs80m2kb.h
| r23575 | r23576 | |
| 12 | 12 | #ifndef __TRS80M2_KEYBOARD__ |
| 13 | 13 | #define __TRS80M2_KEYBOARD__ |
| 14 | 14 | |
| 15 | | |
| 16 | 15 | #include "emu.h" |
| 17 | 16 | #include "cpu/mcs48/mcs48.h" |
| 18 | 17 | #include "sound/discrete.h" |
| r23575 | r23576 | |
| 31 | 30 | // INTERFACE CONFIGURATION MACROS |
| 32 | 31 | //************************************************************************** |
| 33 | 32 | |
| 34 | | #define MCFG_TRS80M2_KEYBOARD_ADD(_config) \ |
| 33 | #define MCFG_TRS80M2_KEYBOARD_ADD(_clock) \ |
| 35 | 34 | MCFG_DEVICE_ADD(TRS80M2_KEYBOARD_TAG, TRS80M2_KEYBOARD, 0) \ |
| 36 | | MCFG_DEVICE_CONFIG(_config) |
| 35 | downcast<trs80m2_keyboard_device *>(device)->set_clock_callback(DEVCB2_##_clock); |
| 37 | 36 | |
| 38 | 37 | |
| 39 | | #define TRS80M2_KEYBOARD_INTERFACE(_name) \ |
| 40 | | const trs80m2_keyboard_interface (_name) = |
| 41 | 38 | |
| 42 | | |
| 43 | | |
| 44 | 39 | //************************************************************************** |
| 45 | 40 | // TYPE DEFINITIONS |
| 46 | 41 | //************************************************************************** |
| 47 | 42 | |
| 48 | | // ======================> trs80m2_keyboard_interface |
| 49 | | |
| 50 | | struct trs80m2_keyboard_interface |
| 51 | | { |
| 52 | | devcb_write_line m_out_clock_cb; |
| 53 | | }; |
| 54 | | |
| 55 | | |
| 56 | 43 | // ======================> trs80m2_keyboard_device |
| 57 | 44 | |
| 58 | | class trs80m2_keyboard_device : public device_t, |
| 59 | | public trs80m2_keyboard_interface |
| 45 | class trs80m2_keyboard_device : public device_t |
| 60 | 46 | { |
| 61 | 47 | public: |
| 62 | 48 | // construction/destruction |
| 63 | 49 | trs80m2_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 64 | 50 | |
| 51 | template<class _clock> void set_clock_callback(_clock clock) { m_write_clock.set_callback(clock); } |
| 52 | |
| 65 | 53 | // optional information overrides |
| 66 | 54 | virtual const rom_entry *device_rom_region() const; |
| 67 | 55 | virtual machine_config_constructor device_mconfig_additions() const; |
| r23575 | r23576 | |
| 80 | 68 | // device-level overrides |
| 81 | 69 | virtual void device_start(); |
| 82 | 70 | virtual void device_reset(); |
| 83 | | virtual void device_config_complete(); |
| 84 | 71 | |
| 85 | 72 | private: |
| 86 | | devcb_resolved_write_line m_out_clock_func; |
| 73 | enum |
| 74 | { |
| 75 | LED_0 = 0, |
| 76 | LED_1 |
| 77 | }; |
| 87 | 78 | |
| 88 | 79 | required_device<cpu_device> m_maincpu; |
| 89 | 80 | required_ioport m_y0; |
| r23575 | r23576 | |
| 99 | 90 | required_ioport m_ya; |
| 100 | 91 | required_ioport m_yb; |
| 101 | 92 | |
| 93 | devcb2_write_line m_write_clock; |
| 94 | |
| 102 | 95 | int m_busy; |
| 103 | 96 | int m_data; |
| 104 | 97 | int m_clk; |
trunk/src/mess/machine/vp575.c
| r23575 | r23576 | |
| 58 | 58 | WRITE_LINE_MEMBER( vp575_device::exp4_dma_in_w ) { m_dma_in[3] = state; update_interrupts(); } |
| 59 | 59 | WRITE_LINE_MEMBER( vp575_device::exp5_dma_in_w ) { m_dma_in[4] = state; update_interrupts(); } |
| 60 | 60 | |
| 61 | | static VIP_EXPANSION_INTERFACE( expansion1_intf ) |
| 62 | | { |
| 63 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp1_int_w), |
| 64 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp1_dma_out_w), |
| 65 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp1_dma_in_w) |
| 66 | | }; |
| 67 | 61 | |
| 68 | | static VIP_EXPANSION_INTERFACE( expansion2_intf ) |
| 69 | | { |
| 70 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp2_int_w), |
| 71 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp2_dma_out_w), |
| 72 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp2_dma_in_w) |
| 73 | | }; |
| 74 | | |
| 75 | | static VIP_EXPANSION_INTERFACE( expansion3_intf ) |
| 76 | | { |
| 77 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp3_int_w), |
| 78 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp3_dma_out_w), |
| 79 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp3_dma_in_w) |
| 80 | | }; |
| 81 | | |
| 82 | | static VIP_EXPANSION_INTERFACE( expansion4_intf ) |
| 83 | | { |
| 84 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp4_int_w), |
| 85 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp4_dma_out_w), |
| 86 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp4_dma_in_w) |
| 87 | | }; |
| 88 | | |
| 89 | | static VIP_EXPANSION_INTERFACE( expansion5_intf ) |
| 90 | | { |
| 91 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp5_int_w), |
| 92 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp5_dma_out_w), |
| 93 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vp575_device, exp5_dma_in_w) |
| 94 | | }; |
| 95 | | |
| 96 | | |
| 97 | 62 | //------------------------------------------------- |
| 98 | 63 | // MACHINE_CONFIG_FRAGMENT( vp575 ) |
| 99 | 64 | //------------------------------------------------- |
| 100 | 65 | |
| 101 | 66 | static MACHINE_CONFIG_FRAGMENT( vp575 ) |
| 102 | | MCFG_VIP_EXPANSION_SLOT_ADD("exp1", XTAL_3_52128MHz/2, expansion1_intf, vip_expansion_cards, NULL) |
| 103 | | MCFG_VIP_EXPANSION_SLOT_ADD("exp2", XTAL_3_52128MHz/2, expansion2_intf, vip_expansion_cards, NULL) |
| 104 | | MCFG_VIP_EXPANSION_SLOT_ADD("exp3", XTAL_3_52128MHz/2, expansion3_intf, vip_expansion_cards, NULL) |
| 105 | | MCFG_VIP_EXPANSION_SLOT_ADD("exp4", XTAL_3_52128MHz/2, expansion4_intf, vip_expansion_cards, NULL) |
| 106 | | MCFG_VIP_EXPANSION_SLOT_ADD("exp5", XTAL_3_52128MHz/2, expansion5_intf, vip_expansion_cards, NULL) |
| 67 | MCFG_VIP_EXPANSION_SLOT_ADD("exp1", XTAL_3_52128MHz/2, vip_expansion_cards, NULL) |
| 68 | MCFG_VIP_EXPANSION_SLOT_CALLBACKS(DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp1_int_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp1_dma_out_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp1_dma_in_w)) |
| 69 | MCFG_VIP_EXPANSION_SLOT_ADD("exp2", XTAL_3_52128MHz/2, vip_expansion_cards, NULL) |
| 70 | MCFG_VIP_EXPANSION_SLOT_CALLBACKS(DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp2_int_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp2_dma_out_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp2_dma_in_w)) |
| 71 | MCFG_VIP_EXPANSION_SLOT_ADD("exp3", XTAL_3_52128MHz/2, vip_expansion_cards, NULL) |
| 72 | MCFG_VIP_EXPANSION_SLOT_CALLBACKS(DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp3_int_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp3_dma_out_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp3_dma_in_w)) |
| 73 | MCFG_VIP_EXPANSION_SLOT_ADD("exp4", XTAL_3_52128MHz/2, vip_expansion_cards, NULL) |
| 74 | MCFG_VIP_EXPANSION_SLOT_CALLBACKS(DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp4_int_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp4_dma_out_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp4_dma_in_w)) |
| 75 | MCFG_VIP_EXPANSION_SLOT_ADD("exp5", XTAL_3_52128MHz/2, vip_expansion_cards, NULL) |
| 76 | MCFG_VIP_EXPANSION_SLOT_CALLBACKS(DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp5_int_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp5_dma_out_w), DEVWRITELINE(DEVICE_SELF_OWNER, vp575_device, exp5_dma_in_w)) |
| 107 | 77 | MACHINE_CONFIG_END |
| 108 | 78 | |
| 109 | 79 | |
trunk/src/mess/machine/vip_byteio.c
| r23575 | r23576 | |
| 34 | 34 | } |
| 35 | 35 | |
| 36 | 36 | |
| 37 | | //------------------------------------------------- |
| 38 | | // ~device_vip_byteio_port_interface - destructor |
| 39 | | //------------------------------------------------- |
| 40 | 37 | |
| 41 | | device_vip_byteio_port_interface::~device_vip_byteio_port_interface() |
| 42 | | { |
| 43 | | } |
| 44 | | |
| 45 | | |
| 46 | | |
| 47 | 38 | //************************************************************************** |
| 48 | 39 | // LIVE DEVICE |
| 49 | 40 | //************************************************************************** |
| r23575 | r23576 | |
| 54 | 45 | |
| 55 | 46 | vip_byteio_port_device::vip_byteio_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 56 | 47 | device_t(mconfig, VIP_BYTEIO_PORT, "VIP byte I/O port", tag, owner, clock), |
| 57 | | device_slot_interface(mconfig, *this) |
| 48 | device_slot_interface(mconfig, *this), |
| 49 | m_write_inst(*this) |
| 58 | 50 | { |
| 59 | 51 | } |
| 60 | 52 | |
| 61 | | |
| 62 | 53 | //------------------------------------------------- |
| 63 | | // vip_byteio_port_device - destructor |
| 64 | | //------------------------------------------------- |
| 65 | | |
| 66 | | vip_byteio_port_device::~vip_byteio_port_device() |
| 67 | | { |
| 68 | | } |
| 69 | | |
| 70 | | |
| 71 | | //------------------------------------------------- |
| 72 | | // device_config_complete - perform any |
| 73 | | // operations now that the configuration is |
| 74 | | // complete |
| 75 | | //------------------------------------------------- |
| 76 | | |
| 77 | | void vip_byteio_port_device::device_config_complete() |
| 78 | | { |
| 79 | | // inherit a copy of the static data |
| 80 | | const vip_byteio_port_interface *intf = reinterpret_cast<const vip_byteio_port_interface *>(static_config()); |
| 81 | | if (intf != NULL) |
| 82 | | { |
| 83 | | *static_cast<vip_byteio_port_interface *>(this) = *intf; |
| 84 | | } |
| 85 | | |
| 86 | | // or initialize to defaults if none provided |
| 87 | | else |
| 88 | | { |
| 89 | | memset(&m_out_inst_cb, 0, sizeof(m_out_inst_cb)); |
| 90 | | } |
| 91 | | } |
| 92 | | |
| 93 | | |
| 94 | | //------------------------------------------------- |
| 95 | 54 | // device_start - device-specific startup |
| 96 | 55 | //------------------------------------------------- |
| 97 | 56 | |
| r23575 | r23576 | |
| 100 | 59 | m_cart = dynamic_cast<device_vip_byteio_port_interface *>(get_card_device()); |
| 101 | 60 | |
| 102 | 61 | // resolve callbacks |
| 103 | | m_out_inst_func.resolve(m_out_inst_cb, *this); |
| 62 | m_write_inst.resolve_safe(); |
| 104 | 63 | } |
| 105 | 64 | |
| 106 | 65 | |
| r23575 | r23576 | |
| 119 | 78 | READ_LINE_MEMBER( vip_byteio_port_device::ef4_r ) { int state = CLEAR_LINE; if (m_cart != NULL) state = m_cart->vip_ef4_r(); return state; } |
| 120 | 79 | WRITE_LINE_MEMBER( vip_byteio_port_device::q_w ) { if (m_cart != NULL) m_cart->vip_q_w(state); } |
| 121 | 80 | |
| 122 | | WRITE_LINE_MEMBER( vip_byteio_port_device::inst_w ) { m_out_inst_func(state); } |
| 123 | 81 | |
| 124 | | |
| 125 | 82 | //------------------------------------------------- |
| 126 | 83 | // SLOT_INTERFACE( vip_byteio_cards ) |
| 127 | 84 | //------------------------------------------------- |
trunk/src/mess/machine/vip_byteio.h
| r23575 | r23576 | |
| 53 | 53 | // INTERFACE CONFIGURATION MACROS |
| 54 | 54 | //************************************************************************** |
| 55 | 55 | |
| 56 | | #define VIP_BYTEIO_PORT_INTERFACE(_name) \ |
| 57 | | const vip_byteio_port_interface (_name) = |
| 58 | | |
| 59 | | |
| 60 | | #define MCFG_VIP_BYTEIO_PORT_ADD(_tag, _config, _slot_intf, _def_slot) \ |
| 56 | #define MCFG_VIP_BYTEIO_PORT_ADD(_tag, _slot_intf, _def_slot, _inst) \ |
| 61 | 57 | MCFG_DEVICE_ADD(_tag, VIP_BYTEIO_PORT, 0) \ |
| 62 | | MCFG_DEVICE_CONFIG(_config) \ |
| 63 | | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
| 58 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ |
| 59 | downcast<vip_byteio_port_device *>(device)->set_inst_callback(DEVCB2_##_inst); |
| 64 | 60 | |
| 65 | 61 | |
| 66 | 62 | |
| r23575 | r23576 | |
| 68 | 64 | // TYPE DEFINITIONS |
| 69 | 65 | //************************************************************************** |
| 70 | 66 | |
| 71 | | // ======================> vip_byteio_port_interface |
| 72 | | |
| 73 | | struct vip_byteio_port_interface |
| 74 | | { |
| 75 | | devcb_write_line m_out_inst_cb; |
| 76 | | }; |
| 77 | | |
| 78 | | |
| 79 | 67 | // ======================> vip_byteio_port_device |
| 80 | 68 | |
| 81 | 69 | class device_vip_byteio_port_interface; |
| 82 | 70 | |
| 83 | 71 | class vip_byteio_port_device : public device_t, |
| 84 | | public vip_byteio_port_interface, |
| 85 | 72 | public device_slot_interface |
| 86 | 73 | { |
| 87 | 74 | public: |
| 88 | 75 | // construction/destruction |
| 89 | 76 | vip_byteio_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 90 | | virtual ~vip_byteio_port_device(); |
| 91 | 77 | |
| 78 | template<class _inst> void set_inst_callback(_inst inst) { m_write_inst.set_callback(inst); } |
| 79 | |
| 92 | 80 | // computer interface |
| 93 | 81 | UINT8 in_r(); |
| 94 | 82 | void out_w(UINT8 data); |
| r23575 | r23576 | |
| 97 | 85 | DECLARE_WRITE_LINE_MEMBER( q_w ); |
| 98 | 86 | |
| 99 | 87 | // cartridge interface |
| 100 | | DECLARE_WRITE_LINE_MEMBER( inst_w ); |
| 88 | DECLARE_WRITE_LINE_MEMBER( inst_w ) { m_write_inst(state); } |
| 101 | 89 | |
| 102 | 90 | protected: |
| 103 | 91 | // device-level overrides |
| 104 | 92 | virtual void device_start(); |
| 105 | 93 | virtual void device_reset(); |
| 106 | | virtual void device_config_complete(); |
| 107 | 94 | |
| 108 | | devcb_resolved_write_line m_out_inst_func; |
| 95 | devcb2_write_line m_write_inst; |
| 109 | 96 | |
| 110 | 97 | device_vip_byteio_port_interface *m_cart; |
| 111 | 98 | }; |
| r23575 | r23576 | |
| 119 | 106 | public: |
| 120 | 107 | // construction/destruction |
| 121 | 108 | device_vip_byteio_port_interface(const machine_config &mconfig, device_t &device); |
| 122 | | virtual ~device_vip_byteio_port_interface(); |
| 123 | 109 | |
| 124 | 110 | virtual UINT8 vip_in_r() { return 0xff; }; |
| 125 | 111 | virtual void vip_out_w(UINT8 data) { }; |
trunk/src/mess/video/tmc1800.c
| r23575 | r23576 | |
| 5 | 5 | #include "sound/cdp1864.h" |
| 6 | 6 | #include "machine/rescap.h" |
| 7 | 7 | |
| 8 | | /* Telmac 1800 */ |
| 9 | | |
| 10 | | static CDP1861_INTERFACE( tmc1800_cdp1861_intf ) |
| 11 | | { |
| 12 | | CDP1802_TAG, |
| 13 | | SCREEN_TAG, |
| 14 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 15 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), |
| 16 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1) |
| 17 | | }; |
| 18 | | |
| 19 | 8 | /* Telmac 2000 */ |
| 20 | 9 | |
| 21 | 10 | READ_LINE_MEMBER( tmc2000_state::rdata_r ) |
| r23575 | r23576 | |
| 33 | 22 | return BIT(m_color, 0); |
| 34 | 23 | } |
| 35 | 24 | |
| 36 | | static CDP1864_INTERFACE( tmc2000_cdp1864_intf ) |
| 37 | | { |
| 38 | | CDP1802_TAG, |
| 39 | | SCREEN_TAG, |
| 40 | | CDP1864_INTERLACED, |
| 41 | | DEVCB_DRIVER_LINE_MEMBER(tmc2000_state, rdata_r), |
| 42 | | DEVCB_DRIVER_LINE_MEMBER(tmc2000_state, bdata_r), |
| 43 | | DEVCB_DRIVER_LINE_MEMBER(tmc2000_state, gdata_r), |
| 44 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 45 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), |
| 46 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), |
| 47 | | DEVCB_NULL, |
| 48 | | RES_K(1.21), // RL64 |
| 49 | | RES_K(2.05), // RL63 |
| 50 | | RES_K(2.26), // RL61 |
| 51 | | RES_K(3.92) // RL65 (also RH62 (2K pot) in series, but ignored here) |
| 52 | | }; |
| 53 | | |
| 54 | | /* OSCOM Nano */ |
| 55 | | |
| 56 | | static CDP1864_INTERFACE( nano_cdp1864_intf ) |
| 57 | | { |
| 58 | | CDP1802_TAG, |
| 59 | | SCREEN_TAG, |
| 60 | | CDP1864_INTERLACED, |
| 61 | | DEVCB_LINE_VCC, |
| 62 | | DEVCB_LINE_VCC, |
| 63 | | DEVCB_LINE_VCC, |
| 64 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), |
| 65 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), |
| 66 | | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), |
| 67 | | DEVCB_NULL, |
| 68 | | RES_K(1.21), // R18 unconfirmed |
| 69 | | 0, // not connected |
| 70 | | 0, // not connected |
| 71 | | 0 // not connected |
| 72 | | }; |
| 73 | | |
| 74 | 25 | /* OSM-200 */ |
| 75 | 26 | |
| 76 | 27 | UINT32 osc1000b_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| r23575 | r23576 | |
| 82 | 33 | |
| 83 | 34 | MACHINE_CONFIG_FRAGMENT( tmc1800_video ) |
| 84 | 35 | MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, XTAL_1_75MHz) |
| 85 | | MCFG_CDP1861_ADD(CDP1861_TAG, XTAL_1_75MHz, tmc1800_cdp1861_intf) |
| 36 | MCFG_CDP1861_ADD(CDP1861_TAG, SCREEN_TAG, XTAL_1_75MHz, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1)) |
| 86 | 37 | MACHINE_CONFIG_END |
| 87 | 38 | |
| 88 | 39 | MACHINE_CONFIG_FRAGMENT( osc1000b_video ) |
| r23575 | r23576 | |
| 98 | 49 | MCFG_SCREEN_UPDATE_DEVICE(CDP1864_TAG, cdp1864_device, screen_update) |
| 99 | 50 | |
| 100 | 51 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 101 | | MCFG_CDP1864_ADD(CDP1864_TAG, XTAL_1_75MHz, tmc2000_cdp1864_intf) |
| 52 | MCFG_CDP1864_ADD(CDP1864_TAG, SCREEN_TAG, XTAL_1_75MHz, GND, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), NULL, READLINE(tmc2000_state, rdata_r), READLINE(tmc2000_state, bdata_r), READLINE(tmc2000_state, gdata_r)) |
| 53 | MCFG_CDP1864_CHROMINANCE(RES_K(1.21), RES_K(2.05), RES_K(2.26), RES_K(3.92)) // RL64, RL63, RL61, RL65 (also RH62 (2K pot) in series, but ignored here) |
| 102 | 54 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 103 | 55 | MACHINE_CONFIG_END |
| 104 | 56 | |
| r23575 | r23576 | |
| 107 | 59 | MCFG_SCREEN_UPDATE_DEVICE(CDP1864_TAG, cdp1864_device, screen_update) |
| 108 | 60 | |
| 109 | 61 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 110 | | MCFG_CDP1864_ADD(CDP1864_TAG, XTAL_1_75MHz, nano_cdp1864_intf) |
| 62 | MCFG_CDP1864_ADD(CDP1864_TAG, SCREEN_TAG, XTAL_1_75MHz, GND, INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT), INPUTLINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1), NULL, VCC, VCC, VCC) |
| 63 | MCFG_CDP1864_CHROMINANCE(RES_K(1.21), 0, 0, 0) // R18 (unconfirmed) |
| 111 | 64 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 112 | 65 | MACHINE_CONFIG_END |