src/mess/drivers/mc1000.c
| r5145 | r5146 | |
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | |
| 3 | | MC 1000 |
| 3 | MC 1000 |
| 4 | 4 | |
| 5 | | 12/05/2009 Skeleton driver. |
| 5 | 12/05/2009 Skeleton driver. |
| 6 | 6 | |
| 7 | | This is running - look at memory at 8000. There's even a flashing cursor. |
| 7 | This is running - look at memory at 8000. There's even a flashing cursor. |
| 8 | 8 | |
| 9 | | The display looks like 32x16 although memory from 8000-97FE is filled with |
| 10 | | spaces. The character generator rom is missing - unless it uses a 6847. |
| 11 | | This is a color computer. |
| 9 | The display looks like 32x16 although memory from 8000-97FE is filled with |
| 10 | spaces. The character generator rom is missing - unless it uses a 6847. |
| 11 | This is a color computer. |
| 12 | 12 | |
| 13 | http://ensjo.wikispaces.com/MC-1000+on+JEMU |
| 14 | |
| 13 | 15 | ****************************************************************************/ |
| 14 | 16 | |
| 17 | /* |
| 18 | |
| 19 | TODO: |
| 20 | |
| 21 | - video |
| 22 | - joystick |
| 23 | - tape |
| 24 | - 80-column card (MC6845) |
| 25 | - save state |
| 26 | - B&W mode color artifacting (mc6847 takes care of this?) |
| 27 | - Charlemagne / GEM-1000 / Junior Computer |
| 28 | |
| 29 | */ |
| 30 | |
| 15 | 31 | #include "driver.h" |
| 32 | #include "includes/mc1000.h" |
| 16 | 33 | #include "cpu/z80/z80.h" |
| 34 | #include "devices/cassette.h" |
| 35 | #include "video/m6847.h" |
| 36 | #include "sound/ay8910.h" |
| 37 | #include "machine/ctronics.h" |
| 17 | 38 | |
| 18 | | static ADDRESS_MAP_START(mc1000_mem, ADDRESS_SPACE_PROGRAM, 8) |
| 19 | | ADDRESS_MAP_UNMAP_HIGH |
| 20 | | AM_RANGE( 0x0000, 0xbfff ) AM_RAM |
| 21 | | AM_RANGE( 0xc000, 0xffff ) AM_ROM |
| 39 | static const device_config *cassette_device_image(running_machine *machine) |
| 40 | { |
| 41 | return devtag_get_device(machine, CASSETTE_TAG); |
| 42 | } |
| 43 | |
| 44 | /* Memory Banking */ |
| 45 | |
| 46 | static void mc1000_bankswitch(running_machine *machine) |
| 47 | { |
| 48 | mc1000_state *state = machine->driver_data; |
| 49 | const address_space *program = cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM); |
| 50 | |
| 51 | /* ROM/RAM */ |
| 52 | memory_install_readwrite8_handler(program, 0x0000, 0x1fff, 0, 0, SMH_BANK(1), SMH_BANK(1)); |
| 53 | |
| 54 | /* MC6845 video RAM */ |
| 55 | memory_install_readwrite8_handler(program, 0x2000, 0x27ff, 0, 0, SMH_BANK(2), SMH_BANK(2)); |
| 56 | memory_set_bank(machine, 2, state->mc6845_bank); |
| 57 | |
| 58 | /* extended RAM */ |
| 59 | if (mess_ram_size > 16*1024) |
| 60 | { |
| 61 | memory_install_readwrite8_handler(program, 0x4000, 0x7fff, 0, 0, SMH_BANK(3), SMH_BANK(3)); |
| 62 | } |
| 63 | else |
| 64 | { |
| 65 | memory_install_readwrite8_handler(program, 0x4000, 0x7fff, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 66 | } |
| 67 | |
| 68 | /* MC6847 video RAM */ |
| 69 | if (state->mc6847_bank) |
| 70 | { |
| 71 | if (mess_ram_size > 16*1024) |
| 72 | { |
| 73 | memory_install_readwrite8_handler(program, 0x8000, 0x97ff, 0, 0, SMH_BANK(4), SMH_BANK(4)); |
| 74 | } |
| 75 | else |
| 76 | { |
| 77 | memory_install_readwrite8_handler(program, 0x8000, 0x97ff, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | memory_set_bank(machine, 4, state->mc6847_bank); |
| 82 | |
| 83 | /* extended RAM */ |
| 84 | if (mess_ram_size > 16*1024) |
| 85 | { |
| 86 | memory_install_readwrite8_handler(program, 0x9800, 0xbfff, 0, 0, SMH_BANK(5), SMH_BANK(5)); |
| 87 | } |
| 88 | else |
| 89 | { |
| 90 | memory_install_readwrite8_handler(program, 0x9800, 0xbfff, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | /* Read/Write Handlers */ |
| 95 | |
| 96 | static READ8_HANDLER( printer_r ) |
| 97 | { |
| 98 | mc1000_state *state = space->machine->driver_data; |
| 99 | |
| 100 | return centronics_busy_r(state->centronics); |
| 101 | } |
| 102 | |
| 103 | static WRITE8_HANDLER( printer_w ) |
| 104 | { |
| 105 | mc1000_state *state = space->machine->driver_data; |
| 106 | |
| 107 | centronics_strobe_w(state->centronics, BIT(data, 0)); |
| 108 | } |
| 109 | |
| 110 | static WRITE8_HANDLER( mc6845_ctrl_w ) |
| 111 | { |
| 112 | mc1000_state *state = space->machine->driver_data; |
| 113 | |
| 114 | state->mc6845_bank = BIT(data, 0); |
| 115 | |
| 116 | memory_set_bank(space->machine, 1, 0); |
| 117 | |
| 118 | mc1000_bankswitch(space->machine); |
| 119 | } |
| 120 | |
| 121 | static WRITE8_HANDLER( mc6847_attr_w ) |
| 122 | { |
| 123 | /* |
| 124 | |
| 125 | bit description |
| 126 | |
| 127 | 0 enable CPU video RAM access |
| 128 | 1 CSS |
| 129 | 2 GM0 |
| 130 | 3 GM1 |
| 131 | 4 GM2 |
| 132 | 5 _INT/EXT |
| 133 | 6 _A/S |
| 134 | 7 _A/G |
| 135 | |
| 136 | */ |
| 137 | |
| 138 | mc1000_state *state = space->machine->driver_data; |
| 139 | |
| 140 | state->mc6847_bank = BIT(data, 0); |
| 141 | |
| 142 | mc1000_bankswitch(space->machine); |
| 143 | |
| 144 | state->mc6847_attr = data; |
| 145 | |
| 146 | logerror("MC6847 %02x\n", data); |
| 147 | } |
| 148 | |
| 149 | /* Memory Maps */ |
| 150 | |
| 151 | static ADDRESS_MAP_START( mc1000_mem, ADDRESS_SPACE_PROGRAM, 8 ) |
| 152 | AM_RANGE(0x0000, 0x1fff) AM_RAMBANK(1) |
| 153 | AM_RANGE(0x2000, 0x27ff) AM_RAMBANK(2) // MC6845 video RAM |
| 154 | AM_RANGE(0x2800, 0x3fff) AM_RAM |
| 155 | AM_RANGE(0x4000, 0x7fff) AM_RAMBANK(3) |
| 156 | AM_RANGE(0x8000, 0x97ff) AM_RAMBANK(4) // MC6847 video RAM |
| 157 | AM_RANGE(0x9800, 0xbfff) AM_RAMBANK(5) |
| 158 | AM_RANGE(0xc000, 0xffff) AM_ROM |
| 22 | 159 | ADDRESS_MAP_END |
| 23 | 160 | |
| 24 | | static ADDRESS_MAP_START( mc1000_io , ADDRESS_SPACE_IO, 8) |
| 25 | | ADDRESS_MAP_UNMAP_HIGH |
| 161 | static ADDRESS_MAP_START( mc1000_io, ADDRESS_SPACE_IO, 8 ) |
| 162 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 163 | AM_RANGE(0x04, 0x04) AM_READWRITE(printer_r, printer_w) |
| 164 | AM_RANGE(0x05, 0x05) AM_DEVWRITE(CENTRONICS_TAG, centronics_data_w) |
| 165 | // AM_RANGE(0x10, 0x10) AM_DEVWRITE(MC6845_TAG, mc6845_address_w) |
| 166 | // AM_RANGE(0x11, 0x11) AM_DEVREADWRITE(MC6845_TAG, mc6845_register_r, mc6845_register_w) |
| 167 | AM_RANGE(0x12, 0x12) AM_WRITE(mc6845_ctrl_w) |
| 168 | AM_RANGE(0x20, 0x20) AM_DEVWRITE(AY8910_TAG, ay8910_address_w) |
| 169 | AM_RANGE(0x40, 0x40) AM_DEVREAD(AY8910_TAG, ay8910_r) |
| 170 | AM_RANGE(0x60, 0x60) AM_DEVWRITE(AY8910_TAG, ay8910_data_w) |
| 171 | AM_RANGE(0x80, 0x80) AM_WRITE(mc6847_attr_w) |
| 26 | 172 | ADDRESS_MAP_END |
| 27 | 173 | |
| 28 | | /* Input ports */ |
| 174 | /* Input Ports */ |
| 175 | |
| 29 | 176 | static INPUT_PORTS_START( mc1000 ) |
| 177 | PORT_START("ROW0") |
| 178 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('@') |
| 179 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') |
| 180 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') |
| 181 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') |
| 182 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 183 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') |
| 184 | |
| 185 | PORT_START("ROW1") |
| 186 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') |
| 187 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') |
| 188 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') |
| 189 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') |
| 190 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('1') |
| 191 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('9') |
| 192 | |
| 193 | PORT_START("ROW2") |
| 194 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') |
| 195 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') |
| 196 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') |
| 197 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') |
| 198 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') |
| 199 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') |
| 200 | |
| 201 | PORT_START("ROW3") |
| 202 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') |
| 203 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') |
| 204 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') |
| 205 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
| 206 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 207 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') |
| 208 | |
| 209 | PORT_START("ROW4") |
| 210 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') |
| 211 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') |
| 212 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') |
| 213 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 214 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 215 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') |
| 216 | |
| 217 | PORT_START("ROW5") |
| 218 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') |
| 219 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') |
| 220 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') |
| 221 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RUBOUT") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) |
| 222 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') |
| 223 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') |
| 224 | |
| 225 | PORT_START("ROW6") |
| 226 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') |
| 227 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') |
| 228 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') |
| 229 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('^') |
| 230 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') |
| 231 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') |
| 232 | |
| 233 | PORT_START("ROW7") |
| 234 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') |
| 235 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') |
| 236 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') |
| 237 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESET") |
| 238 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') |
| 239 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') |
| 240 | |
| 241 | PORT_START("MODIFIERS") |
| 242 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 243 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) |
| 244 | |
| 245 | PORT_INCLUDE( m6847_artifacting ) |
| 30 | 246 | INPUT_PORTS_END |
| 31 | 247 | |
| 248 | /* Video */ |
| 32 | 249 | |
| 33 | | static MACHINE_RESET(mc1000) |
| 250 | static ATTR_CONST UINT8 mc1000_get_attributes(running_machine *machine, UINT8 c, int scanline, int pos) |
| 34 | 251 | { |
| 252 | mc1000_state *state = machine->driver_data; |
| 253 | |
| 254 | UINT8 data = 0; |
| 255 | |
| 256 | data |= BIT(state->mc6847_attr, 1) ? M6847_CSS : 0; |
| 257 | data |= BIT(state->mc6847_attr, 2) ? M6847_GM0 : 0; |
| 258 | data |= BIT(state->mc6847_attr, 3) ? M6847_GM1 : 0; |
| 259 | data |= BIT(state->mc6847_attr, 4) ? M6847_GM2 : 0; |
| 260 | data |= BIT(state->mc6847_attr, 5) ? M6847_INTEXT : 0; |
| 261 | data |= BIT(state->mc6847_attr, 6) ? M6847_AS : 0; |
| 262 | data |= BIT(state->mc6847_attr, 7) ? M6847_AG : 0; |
| 263 | |
| 264 | return data; |
| 35 | 265 | } |
| 36 | 266 | |
| 267 | static const UINT8 *mc1000_get_video_ram(running_machine *machine, int scanline) |
| 268 | { |
| 269 | mc1000_state *state = machine->driver_data; |
| 270 | |
| 271 | return state->mc6847_video_ram + scanline*32; |
| 272 | } |
| 273 | |
| 37 | 274 | static VIDEO_START( mc1000 ) |
| 38 | 275 | { |
| 276 | m6847_config cfg; |
| 277 | |
| 278 | memset(&cfg, 0, sizeof(cfg)); |
| 279 | |
| 280 | cfg.type = M6847_VERSION_ORIGINAL_PAL; |
| 281 | cfg.get_attributes = mc1000_get_attributes; |
| 282 | cfg.get_video_ram = mc1000_get_video_ram; |
| 283 | |
| 284 | m6847_init(machine, &cfg); |
| 39 | 285 | } |
| 40 | 286 | |
| 41 | | static VIDEO_UPDATE( mc1000 ) |
| 287 | /* AY-3-8910 Interface */ |
| 288 | |
| 289 | static WRITE8_DEVICE_HANDLER( keylatch_w ) |
| 42 | 290 | { |
| 43 | | return 0; |
| 291 | mc1000_state *state = device->machine->driver_data; |
| 292 | |
| 293 | state->keylatch = data; |
| 294 | |
| 295 | cassette_output(cassette_device_image(device->machine), BIT(data, 7) ? +1.0 : -1.0); |
| 44 | 296 | } |
| 45 | 297 | |
| 298 | static READ8_DEVICE_HANDLER( keydata_r ) |
| 299 | { |
| 300 | mc1000_state *state = device->machine->driver_data; |
| 301 | |
| 302 | UINT8 data = 0xff; |
| 303 | |
| 304 | if (!BIT(state->keylatch, 0)) data &= input_port_read(device->machine, "ROW0"); |
| 305 | if (!BIT(state->keylatch, 1)) data &= input_port_read(device->machine, "ROW1"); |
| 306 | if (!BIT(state->keylatch, 2)) data &= input_port_read(device->machine, "ROW2"); |
| 307 | if (!BIT(state->keylatch, 3)) data &= input_port_read(device->machine, "ROW3"); |
| 308 | if (!BIT(state->keylatch, 4)) data &= input_port_read(device->machine, "ROW4"); |
| 309 | if (!BIT(state->keylatch, 5)) data &= input_port_read(device->machine, "ROW5"); |
| 310 | if (!BIT(state->keylatch, 6)) data &= input_port_read(device->machine, "ROW6"); |
| 311 | if (!BIT(state->keylatch, 7)) data &= input_port_read(device->machine, "ROW7"); |
| 312 | |
| 313 | data &= ((input_port_read(device->machine, "MODIFIERS") & 0xc0) | 0x3f); |
| 314 | |
| 315 | data &= (((cassette_input(cassette_device_image(device->machine)) < +0.0) << 7) | 0x7f); |
| 316 | |
| 317 | return data; |
| 318 | } |
| 319 | |
| 320 | static const ay8910_interface ay8910_intf = |
| 321 | { |
| 322 | AY8910_LEGACY_OUTPUT, |
| 323 | AY8910_DEFAULT_LOADS, |
| 324 | DEVCB_NULL, |
| 325 | DEVCB_HANDLER(keydata_r), |
| 326 | DEVCB_HANDLER(keylatch_w), |
| 327 | DEVCB_NULL |
| 328 | }; |
| 329 | |
| 330 | /* Machine Start */ |
| 331 | |
| 332 | static MACHINE_START( mc1000 ) |
| 333 | { |
| 334 | mc1000_state *state = machine->driver_data; |
| 335 | |
| 336 | /* find devices */ |
| 337 | state->mc6845 = devtag_get_device(machine, MC6845_TAG); |
| 338 | state->centronics = devtag_get_device(machine, CENTRONICS_TAG); |
| 339 | |
| 340 | /* allocate video RAM */ |
| 341 | state->mc6845_video_ram = auto_alloc_array(machine, UINT8, MC1000_MC6845_VIDEORAM_SIZE); |
| 342 | state->mc6847_video_ram = auto_alloc_array(machine, UINT8, MC1000_MC6847_VIDEORAM_SIZE); |
| 343 | |
| 344 | /* setup memory banking */ |
| 345 | memory_configure_bank(machine, 1, 0, 1, memory_region(machine, Z80_TAG), 0); |
| 346 | memory_configure_bank(machine, 1, 1, 1, memory_region(machine, Z80_TAG) + 0xc000, 0); |
| 347 | memory_set_bank(machine, 1, 1); |
| 348 | |
| 349 | memory_configure_bank(machine, 2, 0, 1, memory_region(machine, Z80_TAG) + 0x2000, 0); |
| 350 | memory_configure_bank(machine, 2, 1, 1, state->mc6845_video_ram, 0); |
| 351 | memory_set_bank(machine, 2, 0); |
| 352 | |
| 353 | memory_configure_bank(machine, 3, 0, 1, memory_region(machine, Z80_TAG) + 0x4000, 0); |
| 354 | memory_set_bank(machine, 3, 0); |
| 355 | |
| 356 | memory_configure_bank(machine, 4, 0, 1, memory_region(machine, Z80_TAG) + 0x8000, 0); |
| 357 | memory_configure_bank(machine, 4, 1, 1, state->mc6847_video_ram, 0); |
| 358 | memory_set_bank(machine, 4, 0); |
| 359 | |
| 360 | memory_configure_bank(machine, 5, 0, 1, memory_region(machine, Z80_TAG) + 0x9800, 0); |
| 361 | memory_set_bank(machine, 5, 0); |
| 362 | |
| 363 | mc1000_bankswitch(machine); |
| 364 | } |
| 365 | |
| 366 | /* Machine Driver */ |
| 367 | |
| 368 | static const cassette_config mc1000_cassette_config = |
| 369 | { |
| 370 | cassette_default_formats, |
| 371 | NULL, |
| 372 | CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED |
| 373 | }; |
| 374 | |
| 375 | static INTERRUPT_GEN( mc1000_int ) |
| 376 | { |
| 377 | cputag_set_input_line(device->machine, Z80_TAG, INPUT_LINE_IRQ0, ASSERT_LINE); |
| 378 | } |
| 379 | |
| 46 | 380 | static MACHINE_DRIVER_START( mc1000 ) |
| 47 | | /* basic machine hardware */ |
| 48 | | MDRV_CPU_ADD("maincpu",Z80, XTAL_4MHz) |
| 381 | MDRV_DRIVER_DATA(mc1000_state) |
| 382 | |
| 383 | /* basic machine hardware */ |
| 384 | MDRV_CPU_ADD(Z80_TAG, Z80, 3579545) |
| 49 | 385 | MDRV_CPU_PROGRAM_MAP(mc1000_mem) |
| 50 | 386 | MDRV_CPU_IO_MAP(mc1000_io) |
| 387 | MDRV_CPU_VBLANK_INT(SCREEN_TAG, mc1000_int) |
| 51 | 388 | |
| 52 | | MDRV_MACHINE_RESET(mc1000) |
| 389 | MDRV_MACHINE_START(mc1000) |
| 53 | 390 | |
| 54 | 391 | /* video hardware */ |
| 55 | | MDRV_SCREEN_ADD("screen", RASTER) |
| 56 | | MDRV_SCREEN_REFRESH_RATE(50) |
| 392 | MDRV_SCREEN_ADD(SCREEN_TAG, RASTER) |
| 393 | MDRV_SCREEN_REFRESH_RATE(M6847_NTSC_FRAMES_PER_SECOND) |
| 57 | 394 | MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 58 | | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 59 | | MDRV_SCREEN_SIZE(640, 480) |
| 60 | | MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) |
| 61 | | MDRV_PALETTE_LENGTH(2) |
| 62 | | MDRV_PALETTE_INIT(black_and_white) |
| 395 | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) |
| 396 | MDRV_SCREEN_SIZE(320, 25+192+26) |
| 397 | MDRV_SCREEN_VISIBLE_AREA(0, 319, 1, 239) |
| 398 | MDRV_PALETTE_LENGTH(16) |
| 63 | 399 | |
| 64 | 400 | MDRV_VIDEO_START(mc1000) |
| 65 | | MDRV_VIDEO_UPDATE(mc1000) |
| 401 | MDRV_VIDEO_UPDATE(m6847) |
| 402 | |
| 403 | /* sound hardware */ |
| 404 | MDRV_SPEAKER_STANDARD_MONO("mono") |
| 405 | MDRV_SOUND_ADD(AY8910_TAG, AY8910, 3579545/2) |
| 406 | MDRV_SOUND_CONFIG(ay8910_intf) |
| 407 | MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 408 | |
| 409 | /* devices */ |
| 410 | MDRV_CASSETTE_ADD(CASSETTE_TAG, mc1000_cassette_config) |
| 411 | MDRV_CENTRONICS_ADD(CENTRONICS_TAG, standard_centronics) |
| 66 | 412 | MACHINE_DRIVER_END |
| 67 | 413 | |
| 68 | | static SYSTEM_CONFIG_START(mc1000) |
| 69 | | SYSTEM_CONFIG_END |
| 414 | /* ROMs */ |
| 70 | 415 | |
| 71 | | /* ROM definition */ |
| 72 | 416 | ROM_START( mc1000 ) |
| 73 | | ROM_REGION( 0x10000, "maincpu", 0 ) |
| 74 | | ROM_LOAD( "mc1000.rom", 0xc000, 0x4000, CRC(d46f67d5) SHA1(48a2539506a24ea7478cb20ae1ea1226e2f670c4)) |
| 417 | ROM_REGION( 0x10000, Z80_TAG, 0 ) |
| 418 | ROM_LOAD( "mc1000.ic17", 0xc000, 0x2000, CRC(8e78d80d) SHA1(9480270e67a5db2e7de8bc5c8b9e0bb210d4142b) ) |
| 419 | ROM_LOAD( "mc1000.ic12", 0xe000, 0x2000, CRC(750c95f0) SHA1(fd766f5ea4481ef7fd4df92cf7d8397cc2b5a6c4) ) |
| 75 | 420 | ROM_END |
| 76 | 421 | |
| 77 | | /* Driver */ |
| 422 | /* System Configuration */ |
| 78 | 423 | |
| 79 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME FLAGS */ |
| 80 | | COMP( ????, mc1000, 0, 0, mc1000, mc1000, 0, mc1000, "CCE", "MC-1000", GAME_NOT_WORKING) |
| 424 | static SYSTEM_CONFIG_START( mc1000 ) |
| 425 | CONFIG_RAM_DEFAULT( 16 * 1024 ) |
| 426 | CONFIG_RAM ( 48 * 1024 ) |
| 427 | SYSTEM_CONFIG_END |
| 81 | 428 | |
| 429 | /* System Drivers */ |
| 430 | |
| 431 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME FLAGS */ |
| 432 | COMP( 1985, mc1000, 0, 0, mc1000, mc1000, 0, mc1000, "CCE", "MC-1000", GAME_NOT_WORKING) |