src/mess/drivers/eti660.c
| r7018 | r7019 | |
| 1 | /* |
| 2 | |
| 3 | TODO: |
| 4 | |
| 5 | - allocate color ram |
| 6 | - quickload |
| 7 | - keyboard |
| 8 | - color on |
| 9 | |
| 10 | */ |
| 11 | |
| 1 | 12 | #include "driver.h" |
| 2 | 13 | #include "includes/eti660.h" |
| 3 | 14 | #include "cpu/cdp1802/cdp1802.h" |
| r7018 | r7019 | |
| 9 | 20 | |
| 10 | 21 | /* Read/Write Handlers */ |
| 11 | 22 | |
| 23 | static WRITE8_DEVICE_HANDLER( pia_w ) |
| 24 | { |
| 25 | int pia_offset = cpu_get_reg(device->machine->firstcpu, CDP1802_R0 + cpu_get_reg(device->machine->firstcpu, CDP1802_X)) & 0x03; |
| 26 | |
| 27 | pia6821_w(device, pia_offset, data); |
| 28 | } |
| 29 | |
| 12 | 30 | static WRITE8_HANDLER( eti660_colorram_w ) |
| 13 | 31 | { |
| 32 | eti660_state *state = space->machine->driver_data; |
| 33 | int colorram_offset = cpu_get_reg(space->machine->firstcpu, CDP1802_R0 + cpu_get_reg(space->machine->firstcpu, CDP1802_X)) & 0xff; |
| 34 | |
| 35 | colorram_offset = ((colorram_offset & 0xf8) >> 1) || (colorram_offset & 0x03); |
| 36 | |
| 37 | state->color_ram[colorram_offset] = data; |
| 14 | 38 | } |
| 15 | 39 | |
| 16 | 40 | /* Memory Maps */ |
| r7018 | r7019 | |
| 22 | 46 | |
| 23 | 47 | static ADDRESS_MAP_START( eti660_io_map, ADDRESS_SPACE_IO, 8 ) |
| 24 | 48 | AM_RANGE(0x01, 0x01) AM_DEVREADWRITE(CDP1864_TAG, cdp1864_dispon_r, cdp1864_step_bgcolor_w) |
| 49 | AM_RANGE(0x02, 0x02) AM_DEVWRITE(MC6821_TAG, pia_w) |
| 25 | 50 | AM_RANGE(0x03, 0x03) AM_WRITE(eti660_colorram_w) |
| 26 | 51 | AM_RANGE(0x04, 0x04) AM_DEVREADWRITE(CDP1864_TAG, cdp1864_dispoff_r, cdp1864_tone_latch_w) |
| 27 | 52 | ADDRESS_MAP_END |
| r7018 | r7019 | |
| 29 | 54 | /* Input Ports */ |
| 30 | 55 | |
| 31 | 56 | static INPUT_PORTS_START( eti660 ) |
| 57 | PORT_START("PA0") |
| 58 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') |
| 59 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') |
| 60 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
| 61 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') |
| 62 | |
| 63 | PORT_START("PA1") |
| 64 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') |
| 65 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') |
| 66 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') |
| 67 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') |
| 68 | |
| 69 | PORT_START("PA2") |
| 70 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') |
| 71 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') |
| 72 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') |
| 73 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') |
| 74 | |
| 75 | PORT_START("PA3") |
| 76 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 77 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') |
| 78 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') |
| 79 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') |
| 32 | 80 | INPUT_PORTS_END |
| 33 | 81 | |
| 34 | 82 | /* Video */ |
| r7018 | r7019 | |
| 40 | 88 | driver_state->cdp1864_efx = state; |
| 41 | 89 | } |
| 42 | 90 | |
| 43 | | static VIDEO_UPDATE( eti660 ) |
| 91 | static READ_LINE_DEVICE_HANDLER( rdata_r ) |
| 44 | 92 | { |
| 45 | | eti660_state *state = screen->machine->driver_data; |
| 93 | eti660_state *state = device->machine->driver_data; |
| 46 | 94 | |
| 47 | | cdp1864_update(state->cdp1864, bitmap, cliprect); |
| 95 | return BIT(state->color, 0); |
| 96 | } |
| 48 | 97 | |
| 49 | | return 0; |
| 98 | static READ_LINE_DEVICE_HANDLER( bdata_r ) |
| 99 | { |
| 100 | eti660_state *state = device->machine->driver_data; |
| 101 | |
| 102 | return BIT(state->color, 1); |
| 50 | 103 | } |
| 51 | 104 | |
| 105 | static READ_LINE_DEVICE_HANDLER( gdata_r ) |
| 106 | { |
| 107 | eti660_state *state = device->machine->driver_data; |
| 108 | |
| 109 | return BIT(state->color, 2); |
| 110 | } |
| 111 | |
| 52 | 112 | static CDP1864_INTERFACE( eti660_cdp1864_intf ) |
| 53 | 113 | { |
| 54 | 114 | CDP1802_TAG, |
| 55 | 115 | SCREEN_TAG, |
| 56 | 116 | CDP1864_INTERLACED, |
| 57 | | DEVCB_LINE_VCC, |
| 58 | | DEVCB_LINE_VCC, |
| 59 | | DEVCB_LINE_VCC, |
| 117 | DEVCB_LINE(rdata_r), |
| 118 | DEVCB_LINE(bdata_r), |
| 119 | DEVCB_LINE(gdata_r), |
| 60 | 120 | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT), |
| 61 | 121 | DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT), |
| 62 | 122 | DEVCB_LINE(eti660_efx_w), |
| r7018 | r7019 | |
| 66 | 126 | RES_K(4.7) /* R4 */ |
| 67 | 127 | }; |
| 68 | 128 | |
| 129 | static VIDEO_UPDATE( eti660 ) |
| 130 | { |
| 131 | eti660_state *state = screen->machine->driver_data; |
| 132 | |
| 133 | cdp1864_update(state->cdp1864, bitmap, cliprect); |
| 134 | |
| 135 | return 0; |
| 136 | } |
| 137 | |
| 69 | 138 | /* CDP1802 Interface */ |
| 70 | 139 | |
| 71 | 140 | static CDP1802_MODE_READ( eti660_mode_r ) |
| r7018 | r7019 | |
| 107 | 176 | static WRITE8_DEVICE_HANDLER( eti660_dma_w ) |
| 108 | 177 | { |
| 109 | 178 | eti660_state *state = device->machine->driver_data; |
| 179 | UINT8 colorram_offset = ((offset & 0xf8) >> 1) || (offset & 0x03); |
| 110 | 180 | |
| 111 | | state->color = state->color_ram[offset / 4]; |
| 181 | state->color = state->color_ram[colorram_offset]; |
| 112 | 182 | |
| 113 | 183 | cdp1864_con_w(state->cdp1864, 0); // HACK |
| 114 | 184 | cdp1864_dma_w(state->cdp1864, offset, data); |
| r7018 | r7019 | |
| 143 | 213 | |
| 144 | 214 | */ |
| 145 | 215 | |
| 146 | | // eti660_state *state = device->machine->driver_data; |
| 216 | eti660_state *state = device->machine->driver_data; |
| 217 | UINT8 data = 0xf0; |
| 147 | 218 | |
| 148 | | return 0xf0; |
| 219 | if (!BIT(state->keylatch, 0)) data &= input_port_read(device->machine, "PA0"); |
| 220 | if (!BIT(state->keylatch, 1)) data &= input_port_read(device->machine, "PA1"); |
| 221 | if (!BIT(state->keylatch, 2)) data &= input_port_read(device->machine, "PA2"); |
| 222 | if (!BIT(state->keylatch, 3)) data &= input_port_read(device->machine, "PA3"); |
| 223 | |
| 224 | return data; |
| 149 | 225 | } |
| 150 | 226 | |
| 151 | 227 | static WRITE8_DEVICE_HANDLER( eti660_pia_a_w ) |
| r7018 | r7019 | |
| 170 | 246 | state->keylatch = data & 0x0f; |
| 171 | 247 | } |
| 172 | 248 | |
| 173 | | static const pia6821_interface bw12_pia_config = |
| 249 | static const pia6821_interface eti660_mc6821_intf = |
| 174 | 250 | { |
| 175 | 251 | DEVCB_HANDLER(eti660_pia_a_r), /* port A input */ |
| 176 | 252 | DEVCB_NULL, /* port B input */ |
| r7018 | r7019 | |
| 182 | 258 | DEVCB_NULL, /* port B output */ |
| 183 | 259 | DEVCB_NULL, /* CA2 output */ |
| 184 | 260 | DEVCB_NULL, /* CB2 output */ |
| 185 | | DEVCB_NULL,DEVCB_NULL |
| 186 | | // DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0), /* IRQA output */ |
| 187 | | // DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0) /* IRQB output */ |
| 261 | DEVCB_NULL, /* IRQA output */ |
| 262 | DEVCB_NULL /* IRQB output */ |
| 188 | 263 | }; |
| 189 | 264 | |
| 190 | 265 | /* Machine Initialization */ |
| 191 | 266 | |
| 267 | static TIMER_CALLBACK( set_cpu_mode ) |
| 268 | { |
| 269 | eti660_state *state = machine->driver_data; |
| 270 | |
| 271 | state->cdp1802_mode = CDP1802_MODE_RUN; |
| 272 | } |
| 273 | |
| 192 | 274 | static MACHINE_START( eti660 ) |
| 193 | 275 | { |
| 194 | 276 | eti660_state *state = machine->driver_data; |
| r7018 | r7019 | |
| 202 | 284 | state_save_register_global(machine, state->cdp1864_efx); |
| 203 | 285 | } |
| 204 | 286 | |
| 287 | static MACHINE_RESET( eti660 ) |
| 288 | { |
| 289 | eti660_state *state = machine->driver_data; |
| 290 | |
| 291 | /* reset CPU */ |
| 292 | state->cdp1802_mode = CDP1802_MODE_RESET; |
| 293 | timer_set(machine, ATTOTIME_IN_MSEC(200), NULL, 0, set_cpu_mode); |
| 294 | |
| 295 | /* reset CDP1864 */ |
| 296 | device_reset(state->cdp1864); |
| 297 | } |
| 298 | |
| 205 | 299 | /* Machine Drivers */ |
| 206 | 300 | |
| 207 | 301 | static const cassette_config eti660_cassette_config = |
| r7018 | r7019 | |
| 221 | 315 | MDRV_CPU_CONFIG(eti660_config) |
| 222 | 316 | |
| 223 | 317 | MDRV_MACHINE_START(eti660) |
| 318 | MDRV_MACHINE_RESET(eti660) |
| 224 | 319 | |
| 225 | 320 | /* video hardware */ |
| 226 | 321 | MDRV_CDP1864_SCREEN_ADD(SCREEN_TAG, XTAL_8_867238MHz/5) |
| r7018 | r7019 | |
| 234 | 329 | MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 235 | 330 | |
| 236 | 331 | /* devices */ |
| 237 | | // MDRV_PIA6821_ADD(MC6821_TAG, eti660_mc6821_intf) |
| 332 | MDRV_PIA6821_ADD(MC6821_TAG, eti660_mc6821_intf) |
| 238 | 333 | MDRV_CASSETTE_ADD("cassette", eti660_cassette_config) |
| 239 | 334 | |
| 240 | 335 | /* internal ram */ |
| r7018 | r7019 | |
| 251 | 346 | ROM_END |
| 252 | 347 | |
| 253 | 348 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 254 | | COMP( 1978, eti660, 0, 0, eti660, eti660, 0, "Electronics Today International", "ETI-660 (Australia)", GAME_NOT_WORKING ) |
| 349 | COMP( 1981, eti660, 0, 0, eti660, eti660, 0, "Electronics Today International", "ETI-660 (Australia)", GAME_NOT_WORKING ) |