src/mess/drivers/ec65.c
| r0 | r5249 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | EC-65 |
| 4 | |
| 5 | 16/07/2009 Initial driver. |
| 6 | |
| 7 | ****************************************************************************/ |
| 8 | |
| 9 | #include "driver.h" |
| 10 | #include "cpu/m6502/m6502.h" |
| 11 | #include "cpu/g65816/g65816.h" |
| 12 | #include "video/mc6845.h" |
| 13 | #include "machine/6821pia.h" |
| 14 | #include "machine/6522via.h" |
| 15 | #include "machine/6551.h" |
| 16 | #include "machine/6850acia.h" |
| 17 | |
| 18 | #define PIA6821_TAG "pia6821" |
| 19 | #define ACIA6850_TAG "acia6850" |
| 20 | #define ACIA6551_TAG "acia6551" |
| 21 | #define VIA6522_0_TAG "via6522_0" |
| 22 | #define VIA6522_1_TAG "via6522_1" |
| 23 | #define MC6845_TAG "mc6845" |
| 24 | |
| 25 | UINT8 *video_ram; |
| 26 | |
| 27 | static ADDRESS_MAP_START(ec65_mem, ADDRESS_SPACE_PROGRAM, 8) |
| 28 | ADDRESS_MAP_UNMAP_HIGH |
| 29 | AM_RANGE(0x0000, 0xdfff) AM_RAM |
| 30 | AM_RANGE(0xe000, 0xe003) AM_DEVREADWRITE(PIA6821_TAG, pia6821_r, pia6821_w) |
| 31 | AM_RANGE(0xe010, 0xe010) AM_DEVREADWRITE(ACIA6850_TAG, acia6850_stat_r, acia6850_ctrl_w) |
| 32 | AM_RANGE(0xe011, 0xe011) AM_DEVREADWRITE(ACIA6850_TAG, acia6850_data_r, acia6850_data_w) |
| 33 | AM_RANGE(0xe100, 0xe10f) AM_DEVREADWRITE(VIA6522_0_TAG, via_r, via_w) |
| 34 | AM_RANGE(0xe110, 0xe11f) AM_DEVREADWRITE(VIA6522_1_TAG, via_r, via_w) |
| 35 | AM_RANGE(0xe130, 0xe133) AM_DEVREADWRITE(ACIA6551_TAG, acia_6551_r, acia_6551_w ) |
| 36 | AM_RANGE(0xe140, 0xe140) AM_DEVWRITE(MC6845_TAG, mc6845_address_w) |
| 37 | AM_RANGE(0xe141, 0xe141) AM_DEVREADWRITE(MC6845_TAG, mc6845_register_r , mc6845_register_w) |
| 38 | AM_RANGE(0xe400, 0xe7ff) AM_RAM // 1KB on-board RAM |
| 39 | AM_RANGE(0xe800, 0xefff) AM_RAM AM_BASE(&video_ram) |
| 40 | AM_RANGE(0xf000, 0xffff) AM_ROM |
| 41 | ADDRESS_MAP_END |
| 42 | |
| 43 | static ADDRESS_MAP_START(ec65k_mem, ADDRESS_SPACE_PROGRAM, 8) |
| 44 | ADDRESS_MAP_UNMAP_HIGH |
| 45 | AM_RANGE(0x0000, 0xefff) AM_RAM |
| 46 | AM_RANGE(0xf000, 0xffff) AM_ROM |
| 47 | ADDRESS_MAP_END |
| 48 | |
| 49 | static const pia6821_interface ec65_pia_interface= |
| 50 | { |
| 51 | DEVCB_NULL, /* port A input */ |
| 52 | DEVCB_NULL, /* port B input */ |
| 53 | DEVCB_NULL, /* CA1 input */ |
| 54 | DEVCB_NULL, /* CB1 input */ |
| 55 | DEVCB_NULL, /* CA2 input */ |
| 56 | DEVCB_NULL, /* CB2 input */ |
| 57 | DEVCB_NULL, /* port A output */ |
| 58 | DEVCB_NULL, /* port B output */ |
| 59 | DEVCB_NULL, /* CA2 output */ |
| 60 | DEVCB_NULL, /* CB2 output */ |
| 61 | DEVCB_NULL, /* IRQA output */ |
| 62 | DEVCB_NULL /* IRQB output */ |
| 63 | }; |
| 64 | |
| 65 | static ACIA6850_INTERFACE( ec65_acia_intf ) |
| 66 | { |
| 67 | 0, |
| 68 | 0, |
| 69 | DEVCB_NULL, |
| 70 | DEVCB_NULL, |
| 71 | DEVCB_NULL, |
| 72 | DEVCB_NULL, |
| 73 | DEVCB_NULL, |
| 74 | DEVCB_NULL |
| 75 | }; |
| 76 | |
| 77 | static READ8_DEVICE_HANDLER(ec65_via_read_a) |
| 78 | { |
| 79 | return 0; |
| 80 | } |
| 81 | static READ8_DEVICE_HANDLER( ec65_read_ca1 ) |
| 82 | { |
| 83 | return 0; |
| 84 | } |
| 85 | static READ8_DEVICE_HANDLER(ec65_via_read_b) |
| 86 | { |
| 87 | return 0xff; |
| 88 | } |
| 89 | static WRITE8_DEVICE_HANDLER( ec65_via_write_a ) |
| 90 | { |
| 91 | } |
| 92 | static WRITE8_DEVICE_HANDLER( ec65_via_write_b ) |
| 93 | { |
| 94 | } |
| 95 | |
| 96 | const via6522_interface ec65_via_1_intf= |
| 97 | { |
| 98 | DEVCB_NULL, /* in_a_func */ |
| 99 | DEVCB_HANDLER(ec65_via_read_b), /* in_b_func */ |
| 100 | DEVCB_NULL, /* in_ca1_func */ |
| 101 | DEVCB_NULL, /* in_cb1_func */ |
| 102 | DEVCB_NULL, /* in_ca2_func */ |
| 103 | DEVCB_NULL, /* in_cb2_func */ |
| 104 | DEVCB_HANDLER(ec65_via_write_a), /* out_a_func */ |
| 105 | DEVCB_HANDLER(ec65_via_write_b), /* out_b_func */ |
| 106 | DEVCB_NULL, /* out_ca1_func */ |
| 107 | DEVCB_NULL, /* out_cb1_func */ |
| 108 | DEVCB_NULL, /* out_ca2_func */ |
| 109 | DEVCB_NULL, /* out_cb2_func */ |
| 110 | DEVCB_NULL, /* irq_func */ |
| 111 | }; |
| 112 | |
| 113 | const via6522_interface ec65_via_0_intf= |
| 114 | { |
| 115 | DEVCB_HANDLER(ec65_via_read_a), /* in_a_func */ |
| 116 | DEVCB_NULL, /* in_b_func */ |
| 117 | DEVCB_HANDLER(ec65_read_ca1), /* in_ca1_func */ |
| 118 | DEVCB_NULL, /* in_cb1_func */ |
| 119 | DEVCB_NULL, /* in_ca2_func */ |
| 120 | DEVCB_NULL, /* in_cb2_func */ |
| 121 | DEVCB_NULL, /* out_a_func */ |
| 122 | DEVCB_NULL, /* out_b_func */ |
| 123 | DEVCB_NULL, /* out_ca1_func */ |
| 124 | DEVCB_NULL, /* out_cb1_func */ |
| 125 | DEVCB_NULL, /* out_ca2_func */ |
| 126 | DEVCB_NULL, /* out_cb2_func */ |
| 127 | DEVCB_NULL, /* irq_func */ |
| 128 | }; |
| 129 | |
| 130 | /* Input ports */ |
| 131 | INPUT_PORTS_START( ec65 ) |
| 132 | |
| 133 | INPUT_PORTS_END |
| 134 | |
| 135 | |
| 136 | static MACHINE_RESET(ec65) |
| 137 | { |
| 138 | } |
| 139 | |
| 140 | static VIDEO_START( ec65 ) |
| 141 | { |
| 142 | } |
| 143 | |
| 144 | static VIDEO_UPDATE( ec65 ) |
| 145 | { |
| 146 | const device_config *mc6845 = devtag_get_device(screen->machine, MC6845_TAG); |
| 147 | mc6845_update(mc6845, bitmap, cliprect); |
| 148 | return 0; |
| 149 | } |
| 150 | |
| 151 | static MC6845_UPDATE_ROW( ec65_update_row ) |
| 152 | { |
| 153 | UINT8 *charrom = memory_region(device->machine, "chargen"); |
| 154 | int column, bit; |
| 155 | |
| 156 | for (column = 0; column < x_count; column++) |
| 157 | { |
| 158 | UINT8 code = video_ram[ma + column]; |
| 159 | UINT16 addr = code << 4 | (ra & 0x0f); |
| 160 | UINT8 data = charrom[(addr & 0xfff)]; |
| 161 | if (column == cursor_x) |
| 162 | { |
| 163 | data = 0xff; |
| 164 | } |
| 165 | |
| 166 | for (bit = 0; bit < 8; bit++) |
| 167 | { |
| 168 | int x = (column * 8) + bit; |
| 169 | int color = BIT(data, 7) ? 1 : 0; |
| 170 | |
| 171 | *BITMAP_ADDR16(bitmap, y, x) = color; |
| 172 | |
| 173 | data <<= 1; |
| 174 | } |
| 175 | } |
| 176 | } |
| 177 | static const mc6845_interface ec65_crtc6845_interface = |
| 178 | { |
| 179 | "screen", |
| 180 | 8 /*?*/, |
| 181 | NULL, |
| 182 | ec65_update_row, |
| 183 | NULL, |
| 184 | DEVCB_NULL, |
| 185 | DEVCB_NULL, |
| 186 | DEVCB_NULL, |
| 187 | DEVCB_NULL, |
| 188 | NULL |
| 189 | }; |
| 190 | |
| 191 | |
| 192 | static MACHINE_DRIVER_START( ec65 ) |
| 193 | /* basic machine hardware */ |
| 194 | MDRV_CPU_ADD("maincpu",M6502, XTAL_4MHz / 4) |
| 195 | MDRV_CPU_PROGRAM_MAP(ec65_mem) |
| 196 | |
| 197 | MDRV_MACHINE_RESET(ec65) |
| 198 | |
| 199 | /* video hardware */ |
| 200 | MDRV_SCREEN_ADD("screen", RASTER) |
| 201 | MDRV_SCREEN_REFRESH_RATE(60) |
| 202 | MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 203 | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 204 | MDRV_SCREEN_SIZE(640, 200) |
| 205 | MDRV_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 200 - 1) |
| 206 | MDRV_PALETTE_LENGTH(2) |
| 207 | MDRV_PALETTE_INIT(black_and_white) |
| 208 | |
| 209 | MDRV_MC6845_ADD(MC6845_TAG, MC6845, XTAL_16MHz / 8, ec65_crtc6845_interface) |
| 210 | |
| 211 | MDRV_VIDEO_START(ec65) |
| 212 | MDRV_VIDEO_UPDATE(ec65) |
| 213 | |
| 214 | /* devices */ |
| 215 | MDRV_PIA6821_ADD( PIA6821_TAG, ec65_pia_interface ) |
| 216 | MDRV_ACIA6850_ADD(ACIA6850_TAG, ec65_acia_intf) |
| 217 | MDRV_VIA6522_ADD(VIA6522_0_TAG, XTAL_4MHz / 4, ec65_via_0_intf) |
| 218 | MDRV_VIA6522_ADD(VIA6522_1_TAG, XTAL_4MHz / 4, ec65_via_1_intf) |
| 219 | MDRV_ACIA6551_ADD(ACIA6551_TAG) // have XTAL of 1.8432MHz connected |
| 220 | MACHINE_DRIVER_END |
| 221 | |
| 222 | static MACHINE_DRIVER_START( ec65k ) |
| 223 | /* basic machine hardware */ |
| 224 | MDRV_CPU_ADD("maincpu",G65816, XTAL_4MHz) // can use 4,2 or 1 MHz |
| 225 | MDRV_CPU_PROGRAM_MAP(ec65k_mem) |
| 226 | |
| 227 | MDRV_MACHINE_RESET(ec65) |
| 228 | |
| 229 | /* video hardware */ |
| 230 | MDRV_SCREEN_ADD("screen", RASTER) |
| 231 | MDRV_SCREEN_REFRESH_RATE(60) |
| 232 | MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 233 | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 234 | MDRV_SCREEN_SIZE(640, 200) |
| 235 | MDRV_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 200 - 1) |
| 236 | MDRV_PALETTE_LENGTH(2) |
| 237 | MDRV_PALETTE_INIT(black_and_white) |
| 238 | |
| 239 | MDRV_MC6845_ADD(MC6845_TAG, MC6845, XTAL_16MHz / 8, ec65_crtc6845_interface) |
| 240 | |
| 241 | MDRV_VIDEO_START(ec65) |
| 242 | MDRV_VIDEO_UPDATE(ec65) |
| 243 | MACHINE_DRIVER_END |
| 244 | |
| 245 | static SYSTEM_CONFIG_START(ec65) |
| 246 | SYSTEM_CONFIG_END |
| 247 | |
| 248 | /* ROM definition */ |
| 249 | ROM_START( ec65 ) |
| 250 | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 251 | ROM_LOAD( "ec65.ic6", 0xf000, 0x1000, CRC(acd928ed) SHA1(e02a688a057ff77294717cf7b887425fed0b1153)) |
| 252 | ROM_REGION( 0x1000, "chargen", 0 ) |
| 253 | ROM_LOAD( "chargen.ic19", 0x0000, 0x1000, CRC(9b56a28d) SHA1(41c04fd9fb542c50287bc0e366358a61fc4b0cd4)) // Located on VDU card |
| 254 | ROM_END |
| 255 | |
| 256 | ROM_START( ec65k ) |
| 257 | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 258 | ROM_LOAD( "ec65k.ic19", 0xf000, 0x1000, CRC(5e5a890a) SHA1(daa006f2179fd156833e11c73b37881cafe5dede)) |
| 259 | ROM_REGION( 0x1000, "chargen", 0 ) |
| 260 | ROM_LOAD( "chargen.ic19", 0x0000, 0x1000, CRC(9b56a28d) SHA1(41c04fd9fb542c50287bc0e366358a61fc4b0cd4)) // Located on VDU card |
| 261 | ROM_END |
| 262 | /* Driver */ |
| 263 | |
| 264 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME FLAGS */ |
| 265 | COMP( 1985, ec65, 0, 0, ec65, ec65, 0, ec65, "Elektor Electronics", "EC-65", GAME_NOT_WORKING) |
| 266 | COMP( 1985, ec65k, ec65, 0, ec65k, ec65, 0, ec65, "Elektor Electronics", "EC-65K", GAME_NOT_WORKING) |
| 267 | |