src/mess/drivers/ace.c
| r0 | r9930 | |
| 1 | /*************************************************************************** |
| 2 | Jupiter Ace memory map |
| 3 | |
| 4 | CPU: Z80 |
| 5 | 0000-1fff ROM |
| 6 | 2000-23ff Mirror of 2400-27FF |
| 7 | 2400-27ff RAM (1K RAM used for screen and edit/cassette buffer) |
| 8 | 2800-2bff Mirror of 2C00-2FFF |
| 9 | 2c00-2fff RAM (1K RAM for char set, write only) |
| 10 | 3000-3bff Mirror of 3C00-3FFF |
| 11 | 3c00-3fff RAM (1K RAM standard) |
| 12 | 4000-7fff RAM (16K Expansion) |
| 13 | 8000-ffff RAM (48K Expansion) |
| 14 | |
| 15 | Interrupts: |
| 16 | |
| 17 | IRQ: |
| 18 | 50Hz vertical sync |
| 19 | |
| 20 | Ports: |
| 21 | |
| 22 | Out 0xfe: |
| 23 | Tape and buzzer |
| 24 | |
| 25 | In 0xfe: |
| 26 | Keyboard input, tape, and buzzer |
| 27 | |
| 28 | http://www.jupiter-ace.co.uk/ |
| 29 | |
| 30 | ***************************************************************************/ |
| 31 | |
| 32 | /* |
| 33 | |
| 34 | TODO: |
| 35 | |
| 36 | - printer |
| 37 | - Big Mouth speech unit (SP0256-AL1) |
| 38 | - Deep Thought disc interface (6850, 6821) |
| 39 | |
| 40 | */ |
| 41 | |
| 42 | #define ADDRESS_MAP_MODERN |
| 43 | |
| 44 | #include "emu.h" |
| 45 | #include "cpu/z80/z80.h" |
| 46 | #include "imagedev/cassette.h" |
| 47 | #include "imagedev/snapquik.h" |
| 48 | #include "machine/ram.h" |
| 49 | #include "sound/ay8910.h" |
| 50 | #include "sound/speaker.h" |
| 51 | #include "sound/wave.h" |
| 52 | #include "formats/ace_tap.h" |
| 53 | #include "includes/ace.h" |
| 54 | |
| 55 | |
| 56 | |
| 57 | //************************************************************************** |
| 58 | // READ/WRITE HANDLERS |
| 59 | //************************************************************************** |
| 60 | |
| 61 | //------------------------------------------------- |
| 62 | // io_r - |
| 63 | //------------------------------------------------- |
| 64 | |
| 65 | READ8_MEMBER( ace_state::io_r ) |
| 66 | { |
| 67 | UINT8 data = 0xff; |
| 68 | |
| 69 | if (!BIT(offset, 8)) data &= input_port_read(machine, "A8"); |
| 70 | if (!BIT(offset, 9)) data &= input_port_read(machine, "A9"); |
| 71 | if (!BIT(offset, 10)) data &= input_port_read(machine, "A10"); |
| 72 | if (!BIT(offset, 11)) data &= input_port_read(machine, "A11"); |
| 73 | if (!BIT(offset, 12)) data &= input_port_read(machine, "A12"); |
| 74 | if (!BIT(offset, 13)) data &= input_port_read(machine, "A13"); |
| 75 | if (!BIT(offset, 14)) data &= input_port_read(machine, "A14"); |
| 76 | |
| 77 | if (!BIT(offset, 15)) |
| 78 | { |
| 79 | data &= input_port_read(machine, "A15"); |
| 80 | |
| 81 | cassette_output(m_cassette, -1); |
| 82 | speaker_level_w(m_speaker, 0); |
| 83 | } |
| 84 | |
| 85 | if (cassette_input(m_cassette) > 0) |
| 86 | { |
| 87 | data &= ~0x20; |
| 88 | } |
| 89 | |
| 90 | return data; |
| 91 | } |
| 92 | |
| 93 | |
| 94 | //------------------------------------------------- |
| 95 | // io_w - |
| 96 | //------------------------------------------------- |
| 97 | |
| 98 | WRITE8_MEMBER( ace_state::io_w ) |
| 99 | { |
| 100 | cassette_output(m_cassette, 1); |
| 101 | speaker_level_w(m_speaker, 1); |
| 102 | } |
| 103 | |
| 104 | |
| 105 | |
| 106 | //************************************************************************** |
| 107 | // ADDRESS MAPS |
| 108 | //************************************************************************** |
| 109 | |
| 110 | //------------------------------------------------- |
| 111 | // ADDRESS_MAP( ace_mem ) |
| 112 | //------------------------------------------------- |
| 113 | |
| 114 | static ADDRESS_MAP_START( ace_mem, ADDRESS_SPACE_PROGRAM, 8, ace_state ) |
| 115 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 116 | AM_RANGE(0x2400, 0x27ff) AM_MIRROR(0x0400) AM_RAM AM_BASE(m_video_ram) |
| 117 | AM_RANGE(0x2c00, 0x2fff) AM_MIRROR(0x0400) AM_RAM AM_BASE(m_char_ram) AM_REGION(Z80_TAG, 0xfc00) |
| 118 | AM_RANGE(0x3c00, 0x3fff) AM_MIRROR(0x0c00) AM_RAM |
| 119 | AM_RANGE(0x4000, 0xffff) AM_RAM |
| 120 | ADDRESS_MAP_END |
| 121 | |
| 122 | |
| 123 | //------------------------------------------------- |
| 124 | // ADDRESS_MAP( ace_io ) |
| 125 | //------------------------------------------------- |
| 126 | |
| 127 | static ADDRESS_MAP_START( ace_io, ADDRESS_SPACE_IO, 8, ace_state ) |
| 128 | AM_RANGE(0x00, 0x00) AM_MIRROR(0xfffe) AM_MASK(0xff00) AM_READWRITE(io_r, io_w) |
| 129 | AM_RANGE(0x01, 0x01) AM_MIRROR(0xff00) AM_READ_PORT("JOY") |
| 130 | AM_RANGE(0xfd, 0xfd) AM_MIRROR(0xff00) AM_DEVWRITE_LEGACY(AY8910_TAG, ay8910_address_w) |
| 131 | AM_RANGE(0xff, 0xff) AM_MIRROR(0xff00) AM_DEVREADWRITE_LEGACY(AY8910_TAG, ay8910_r, ay8910_data_w) |
| 132 | ADDRESS_MAP_END |
| 133 | |
| 134 | |
| 135 | |
| 136 | //************************************************************************** |
| 137 | // INPUT PORTS |
| 138 | //************************************************************************** |
| 139 | |
| 140 | //------------------------------------------------- |
| 141 | // INPUT_PORTS( bullet ) |
| 142 | //------------------------------------------------- |
| 143 | |
| 144 | static INPUT_PORTS_START (ace) |
| 145 | PORT_START("A8") |
| 146 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 147 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Symbol Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_2) |
| 148 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(':') |
| 149 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR('\xA3') |
| 150 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR('?') |
| 151 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 152 | |
| 153 | PORT_START("A9") |
| 154 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR('~') |
| 155 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR('|') |
| 156 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR('\\') |
| 157 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR('{') |
| 158 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR('}') |
| 159 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 160 | |
| 161 | PORT_START("A10") |
| 162 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') |
| 163 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') |
| 164 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') |
| 165 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR('<') |
| 166 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR('>') |
| 167 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 168 | |
| 169 | PORT_START("A11") |
| 170 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') |
| 171 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') |
| 172 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 173 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 174 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_LEFT) PORT_CHAR('5') PORT_CHAR('%') |
| 175 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 176 | |
| 177 | PORT_START("A12") |
| 178 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('_') |
| 179 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') |
| 180 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR('8') PORT_CHAR('(') |
| 181 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('7') PORT_CHAR('\'') |
| 182 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_UP) PORT_CHAR('6') PORT_CHAR('&') |
| 183 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 184 | |
| 185 | PORT_START("A13") |
| 186 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR('"') |
| 187 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(';') |
| 188 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x00A9) |
| 189 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(']') |
| 190 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR('[') |
| 191 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 192 | |
| 193 | PORT_START("A14") |
| 194 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
| 195 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR('=') |
| 196 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR('+') |
| 197 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR('-') |
| 198 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("h H \xE2\x86\x91") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') |
| 199 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 200 | |
| 201 | PORT_START("A15") |
| 202 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 203 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR('.') |
| 204 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(',') |
| 205 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR('*') |
| 206 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR('/') |
| 207 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 208 | |
| 209 | PORT_START("JOY") |
| 210 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) |
| 211 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) |
| 212 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) |
| 213 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) |
| 214 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 215 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) |
| 216 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 217 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 218 | INPUT_PORTS_END |
| 219 | |
| 220 | |
| 221 | |
| 222 | //************************************************************************** |
| 223 | // VIDEO |
| 224 | //************************************************************************** |
| 225 | |
| 226 | //------------------------------------------------- |
| 227 | // gfx_layout ace_charlayout |
| 228 | //------------------------------------------------- |
| 229 | |
| 230 | static const gfx_layout ace_charlayout = |
| 231 | { |
| 232 | 8, 8, /* 8x8 characters */ |
| 233 | 128, /* 128 characters */ |
| 234 | 1, /* 1 bits per pixel */ |
| 235 | {0}, /* no bitplanes; 1 bit per pixel */ |
| 236 | {0, 1, 2, 3, 4, 5, 6, 7}, |
| 237 | {0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8}, |
| 238 | 8*8 /* each character takes 8 consecutive bytes */ |
| 239 | }; |
| 240 | |
| 241 | |
| 242 | //------------------------------------------------- |
| 243 | // GFXDECODE( ace ) |
| 244 | //------------------------------------------------- |
| 245 | |
| 246 | static GFXDECODE_START( ace ) |
| 247 | GFXDECODE_ENTRY( Z80_TAG, 0xfc00, ace_charlayout, 0, 1 ) |
| 248 | GFXDECODE_END |
| 249 | |
| 250 | |
| 251 | //------------------------------------------------- |
| 252 | // TIMER_DEVICE_CALLBACK( set_irq ) |
| 253 | //------------------------------------------------- |
| 254 | |
| 255 | static TIMER_DEVICE_CALLBACK( set_irq ) |
| 256 | { |
| 257 | cputag_set_input_line(timer.machine, Z80_TAG, INPUT_LINE_IRQ0, ASSERT_LINE); |
| 258 | } |
| 259 | |
| 260 | |
| 261 | //------------------------------------------------- |
| 262 | // TIMER_DEVICE_CALLBACK( clear_irq ) |
| 263 | //------------------------------------------------- |
| 264 | |
| 265 | static TIMER_DEVICE_CALLBACK( clear_irq ) |
| 266 | { |
| 267 | cputag_set_input_line(timer.machine, Z80_TAG, INPUT_LINE_IRQ0, CLEAR_LINE); |
| 268 | } |
| 269 | |
| 270 | |
| 271 | //------------------------------------------------- |
| 272 | // VIDEO_UPDATE( ace ) |
| 273 | //------------------------------------------------- |
| 274 | |
| 275 | bool ace_state::video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) |
| 276 | { |
| 277 | UINT8 y,ra,chr,gfx; |
| 278 | UINT16 sy=0,ma=0,x; |
| 279 | |
| 280 | for (y = 0; y < 24; y++) |
| 281 | { |
| 282 | for (ra = 0; ra < 8; ra++) |
| 283 | { |
| 284 | UINT16 *p = BITMAP_ADDR16(&bitmap, sy++, 0); |
| 285 | |
| 286 | for (x = ma; x < ma+32; x++) |
| 287 | { |
| 288 | chr = m_video_ram[x]; |
| 289 | |
| 290 | /* get pattern of pixels for that character scanline */ |
| 291 | gfx = m_char_ram[((chr&0x7f)<<3) | ra] ^ ((chr&0x80) ? 0xff : 0); |
| 292 | |
| 293 | /* Display a scanline of a character (8 pixels) */ |
| 294 | *p++ = ( gfx & 0x80 ) ? 1 : 0; |
| 295 | *p++ = ( gfx & 0x40 ) ? 1 : 0; |
| 296 | *p++ = ( gfx & 0x20 ) ? 1 : 0; |
| 297 | *p++ = ( gfx & 0x10 ) ? 1 : 0; |
| 298 | *p++ = ( gfx & 0x08 ) ? 1 : 0; |
| 299 | *p++ = ( gfx & 0x04 ) ? 1 : 0; |
| 300 | *p++ = ( gfx & 0x02 ) ? 1 : 0; |
| 301 | *p++ = ( gfx & 0x01 ) ? 1 : 0; |
| 302 | } |
| 303 | } |
| 304 | ma+=32; |
| 305 | } |
| 306 | return 0; |
| 307 | } |
| 308 | |
| 309 | |
| 310 | |
| 311 | //************************************************************************** |
| 312 | // DEVICE CONFIGURATION |
| 313 | //************************************************************************** |
| 314 | |
| 315 | //------------------------------------------------- |
| 316 | // cassette_config ace_cassette_config |
| 317 | //------------------------------------------------- |
| 318 | |
| 319 | static const cassette_config ace_cassette_config = |
| 320 | { |
| 321 | ace_cassette_formats, |
| 322 | NULL, |
| 323 | (cassette_state)(CASSETTE_STOPPED), |
| 324 | NULL |
| 325 | }; |
| 326 | |
| 327 | |
| 328 | //------------------------------------------------- |
| 329 | // ay8910_interface psg_intf |
| 330 | //------------------------------------------------- |
| 331 | |
| 332 | static const ay8910_interface psg_intf = |
| 333 | { |
| 334 | AY8910_LEGACY_OUTPUT, |
| 335 | AY8910_DEFAULT_LOADS, |
| 336 | DEVCB_NULL, |
| 337 | DEVCB_NULL, |
| 338 | DEVCB_NULL, |
| 339 | DEVCB_NULL, |
| 340 | }; |
| 341 | |
| 342 | |
| 343 | |
| 344 | //************************************************************************** |
| 345 | // MACHINE INITIALIZATION |
| 346 | //************************************************************************** |
| 347 | |
| 348 | //------------------------------------------------- |
| 349 | // MACHINE_START( ace ) |
| 350 | //------------------------------------------------- |
| 351 | |
| 352 | void ace_state::machine_start() |
| 353 | { |
| 354 | address_space *program = cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM); |
| 355 | |
| 356 | /* configure RAM */ |
| 357 | switch (ram_get_size(m_ram)) |
| 358 | { |
| 359 | case 1*1024: |
| 360 | memory_unmap_readwrite(program, 0x4000, 0xffff, 0, 0); |
| 361 | break; |
| 362 | |
| 363 | case 16*1024: |
| 364 | memory_unmap_readwrite(program, 0x8000, 0xffff, 0, 0); |
| 365 | break; |
| 366 | } |
| 367 | } |
| 368 | |
| 369 | |
| 370 | |
| 371 | //************************************************************************** |
| 372 | // MACHINE CONFIGURATION |
| 373 | //************************************************************************** |
| 374 | |
| 375 | //------------------------------------------------- |
| 376 | // MACHINE_CONFIG( ace ) |
| 377 | //------------------------------------------------- |
| 378 | |
| 379 | static MACHINE_CONFIG_START( ace, ace_state ) |
| 380 | /* basic machine hardware */ |
| 381 | MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_6_5MHz/2) |
| 382 | MCFG_CPU_PROGRAM_MAP(ace_mem) |
| 383 | MCFG_CPU_IO_MAP(ace_io) |
| 384 | MCFG_QUANTUM_TIME(HZ(60)) |
| 385 | |
| 386 | /* video hardware */ |
| 387 | MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) |
| 388 | MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 389 | MCFG_SCREEN_RAW_PARAMS(XTAL_6_5MHz, 416, 0, 256, 264, 0, 192) |
| 390 | MCFG_TIMER_ADD_SCANLINE("set_irq", set_irq, SCREEN_TAG, 31*8, 264) |
| 391 | MCFG_TIMER_ADD_SCANLINE("clear_irq", clear_irq, SCREEN_TAG, 32*8, 264) |
| 392 | |
| 393 | MCFG_GFXDECODE( ace ) |
| 394 | MCFG_PALETTE_LENGTH(2) |
| 395 | MCFG_PALETTE_INIT(black_and_white) |
| 396 | |
| 397 | /* sound hardware */ |
| 398 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 399 | MCFG_SOUND_WAVE_ADD("wave", CASSETTE_TAG) |
| 400 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 401 | MCFG_SOUND_ADD(SPEAKER_TAG, SPEAKER_SOUND, 0) |
| 402 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 403 | |
| 404 | MCFG_SOUND_ADD(AY8910_TAG, AY8910, XTAL_6_5MHz/2) |
| 405 | MCFG_SOUND_CONFIG(psg_intf) |
| 406 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 407 | |
| 408 | /* Devices */ |
| 409 | MCFG_CASSETTE_ADD(CASSETTE_TAG, ace_cassette_config) |
| 410 | MCFG_SNAPSHOT_ADD("snapshot", ace, "ace", 1) |
| 411 | |
| 412 | /* internal ram */ |
| 413 | MCFG_RAM_ADD("messram") |
| 414 | MCFG_RAM_DEFAULT_SIZE("1K") |
| 415 | MCFG_RAM_EXTRA_OPTIONS("16K,48K") |
| 416 | MACHINE_CONFIG_END |
| 417 | |
| 418 | |
| 419 | |
| 420 | //************************************************************************** |
| 421 | // ROMS |
| 422 | //************************************************************************** |
| 423 | |
| 424 | //------------------------------------------------- |
| 425 | // ROM( ace ) |
| 426 | //------------------------------------------------- |
| 427 | |
| 428 | ROM_START( ace ) |
| 429 | ROM_REGION( 0x10000, Z80_TAG,0 ) |
| 430 | ROM_LOAD( "rom-a.z1", 0x0000, 0x1000, CRC(dc8438a5) SHA1(8fa97eb71e5dd17c7d190c6587ee3840f839347c) ) |
| 431 | ROM_LOAD( "rom-b.z2", 0x1000, 0x1000, CRC(4009f636) SHA1(98c5d4bcd74bcf014268cf4c00b2007ea5cc21f3) ) |
| 432 | |
| 433 | ROM_REGION( 0x1000, "fdc", 0 ) // Deep Thought disc interface |
| 434 | ROM_LOAD( "dos 4.bin", 0x0000, 0x1000, CRC(04c70448) SHA1(53ddcced6ae2feafd687a3b55864726656b71412) ) |
| 435 | ROM_END |
| 436 | |
| 437 | |
| 438 | |
| 439 | //************************************************************************** |
| 440 | // SYSTEM DRIVERS |
| 441 | //************************************************************************** |
| 442 | |
| 443 | // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS |
| 444 | COMP( 1981, ace, 0, 0, ace, ace, 0, "Jupiter Cantab", "Jupiter Ace" , 0 ) |
src/mess/drivers/jupiter.c
| r9929 | r9930 | |
| 1 | | /*************************************************************************** |
| 2 | | Jupiter Ace memory map |
| 1 | /* |
| 3 | 2 | |
| 4 | | CPU: Z80 |
| 5 | | 0000-1fff ROM |
| 6 | | 2000-23ff Mirror of 2400-27FF |
| 7 | | 2400-27ff RAM (1K RAM used for screen and edit/cassette buffer) |
| 8 | | 2800-2bff Mirror of 2C00-2FFF |
| 9 | | 2c00-2fff RAM (1K RAM for char set, write only) |
| 10 | | 3000-3bff Mirror of 3C00-3FFF |
| 11 | | 3c00-3fff RAM (1K RAM standard) |
| 12 | | 4000-7fff RAM (16K Expansion) |
| 13 | | 8000-ffff RAM (48K Expansion) |
| 3 | Wave Mate Jupiter |
| 14 | 4 | |
| 15 | | Interrupts: |
| 5 | */ |
| 16 | 6 | |
| 17 | | IRQ: |
| 18 | | 50Hz vertical sync |
| 7 | #define ADDRESS_MAP_MODERN |
| 19 | 8 | |
| 20 | | Ports: |
| 21 | | |
| 22 | | Out 0xfe: |
| 23 | | Tape and buzzer |
| 24 | | |
| 25 | | In 0xfe: |
| 26 | | Keyboard input, tape, and buzzer |
| 27 | | ***************************************************************************/ |
| 28 | | |
| 29 | 9 | #include "emu.h" |
| 10 | #include "cpu/m6800/m6800.h" |
| 30 | 11 | #include "cpu/z80/z80.h" |
| 31 | | #include "imagedev/cassette.h" |
| 32 | | #include "imagedev/snapquik.h" |
| 33 | | #include "sound/speaker.h" |
| 34 | | #include "sound/wave.h" |
| 35 | | #include "formats/jupi_tap.h" |
| 12 | #include "imagedev/flopdrv.h" |
| 13 | #include "machine/ram.h" |
| 14 | #include "machine/terminal.h" |
| 15 | #include "machine/wd17xx.h" |
| 36 | 16 | #include "includes/jupiter.h" |
| 37 | 17 | |
| 38 | 18 | |
| 39 | | /* This needs to be moved to drivers/xtal */ |
| 40 | | #define XTAL_6_5MHz 6500000 |
| 41 | 19 | |
| 20 | //************************************************************************** |
| 21 | // ADDRESS MAPS |
| 22 | //************************************************************************** |
| 42 | 23 | |
| 24 | //------------------------------------------------- |
| 25 | // ADDRESS_MAP( jupiter_m6800_mem ) |
| 26 | //------------------------------------------------- |
| 43 | 27 | |
| 44 | | static READ8_HANDLER( jupiter_io_r ); |
| 45 | | static WRITE8_HANDLER( jupiter_io_w ); |
| 46 | | static WRITE8_HANDLER( jupiter_expram_w ); |
| 28 | static ADDRESS_MAP_START( jupiter_m6800_mem, ADDRESS_SPACE_PROGRAM, 8, jupiter2_state ) |
| 29 | AM_RANGE(0x0000, 0x7fff) AM_RAM |
| 30 | // AM_RANGE(0xc000, 0xcfff) Video RAM |
| 31 | AM_RANGE(0xf000, 0xffff) AM_ROM AM_REGION(MCM6571AP_TAG, 0) |
| 32 | // AM_RANGE(0xff58, 0xff5c) Cartridge Disk Controller PIA |
| 33 | // AM_RANGE(0xff60, 0xff76) DMA Controller |
| 34 | // AM_RANGE(0xff80, 0xff83) Floppy PIA |
| 35 | // AM_RANGE(0xff84, 0xff87) AM_DEVREADWRITE_LEGACY(INS1771N1_TAG, wd17xx_r, wd17xx_w) |
| 36 | // AM_RANGE(0xff90, 0xff93) Hytype Parallel Printer PIA |
| 37 | // AM_RANGE(0xffa0, 0xffa7) Persci Floppy Disk Controller |
| 38 | // AM_RANGE(0xffb0, 0xffb3) Video PIA |
| 39 | // AM_RANGE(0xffc0, 0xffc1) Serial Port 0 ACIA |
| 40 | // AM_RANGE(0xffc4, 0xffc5) Serial Port 1 ACIA |
| 41 | // AM_RANGE(0xffc8, 0xffc9) Serial Port 2 ACIA |
| 42 | // AM_RANGE(0xffcc, 0xffcd) Serial Port 3 ACIA |
| 43 | // AM_RANGE(0xffd0, 0xffd1) Serial Port 4 ACIA / Cassette |
| 44 | // AM_RANGE(0xffd4, 0xffd5) Serial Port 5 ACIA / EPROM Programmer (2704/2708) |
| 45 | // AM_RANGE(0xffd8, 0xffd9) Serial Port 6 ACIA / Hardware Breakpoint Registers |
| 46 | // AM_RANGE(0xffdc, 0xffdd) Serial Port 7 ACIA |
| 47 | ADDRESS_MAP_END |
| 47 | 48 | |
| 48 | 49 | |
| 49 | | /* memory w/r functions */ |
| 50 | | static ADDRESS_MAP_START( jupiter_mem , ADDRESS_SPACE_PROGRAM, 8) |
| 51 | | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 52 | | AM_RANGE(0x2400, 0x27ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(jupiter_state, videoram) |
| 53 | | AM_RANGE(0x2c00, 0x2fff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(jupiter_state, charram) AM_REGION("maincpu", 0xfc00) |
| 54 | | AM_RANGE(0x3c00, 0x3fff) AM_MIRROR(0x0c00) AM_RAM |
| 55 | | AM_RANGE(0x4000, 0xffff) AM_RAM_WRITE( jupiter_expram_w ) AM_BASE_MEMBER(jupiter_state, expram) /* Expansion RAM */ |
| 56 | | ADDRESS_MAP_END |
| 50 | //------------------------------------------------- |
| 51 | // ADDRESS_MAP( jupiter_m6800_io ) |
| 52 | //------------------------------------------------- |
| 57 | 53 | |
| 58 | | /* port i/o functions */ |
| 59 | | static ADDRESS_MAP_START( jupiter_io , ADDRESS_SPACE_IO, 8) |
| 60 | | AM_RANGE( 0x0000, 0xffff ) AM_READWRITE( jupiter_io_r, jupiter_io_w ) |
| 54 | static ADDRESS_MAP_START( jupiter_m6800_io, ADDRESS_SPACE_IO, 8, jupiter2_state ) |
| 61 | 55 | ADDRESS_MAP_END |
| 62 | 56 | |
| 63 | 57 | |
| 64 | | /* keyboard input */ |
| 58 | //------------------------------------------------- |
| 59 | // ADDRESS_MAP( jupiter3_mem ) |
| 60 | //------------------------------------------------- |
| 65 | 61 | |
| 66 | | static INPUT_PORTS_START (jupiter) |
| 67 | | PORT_START("KEY0") /* 0: 0xFEFE */ |
| 68 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 69 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Symbol Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_2) |
| 70 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(':') |
| 71 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR('\xA3') |
| 72 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR('?') |
| 62 | static ADDRESS_MAP_START( jupiter3_mem, ADDRESS_SPACE_PROGRAM, 8, jupiter3_state ) |
| 63 | AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION(Z80_TAG, 0) |
| 64 | ADDRESS_MAP_END |
| 73 | 65 | |
| 74 | | PORT_START("KEY1") /* 1: 0xFDFE */ |
| 75 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR('~') |
| 76 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR('|') |
| 77 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR('\\') |
| 78 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR('{') |
| 79 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR('}') |
| 80 | 66 | |
| 81 | | PORT_START("KEY2") /* 2: 0xFBFE */ |
| 82 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') |
| 83 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') |
| 84 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') |
| 85 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR('<') |
| 86 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR('>') |
| 67 | //------------------------------------------------- |
| 68 | // ADDRESS_MAP( jupiter3_io ) |
| 69 | //------------------------------------------------- |
| 87 | 70 | |
| 88 | | PORT_START("KEY3") /* 3: 0xF7FE */ |
| 89 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') |
| 90 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') |
| 91 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 92 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 93 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_LEFT) PORT_CHAR('5') PORT_CHAR('%') |
| 71 | static ADDRESS_MAP_START( jupiter3_io, ADDRESS_SPACE_IO, 8, jupiter3_state ) |
| 72 | ADDRESS_MAP_END |
| 94 | 73 | |
| 95 | | PORT_START("KEY4") /* 4: 0xEFFE */ |
| 96 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('_') |
| 97 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') |
| 98 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR('8') PORT_CHAR('(') |
| 99 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('7') PORT_CHAR('\'') |
| 100 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_UP) PORT_CHAR('6') PORT_CHAR('&') |
| 101 | 74 | |
| 102 | | PORT_START("KEY5") /* 5: 0xDFFE */ |
| 103 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR('"') |
| 104 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(';') |
| 105 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x00A9) |
| 106 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(']') |
| 107 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR('[') |
| 108 | 75 | |
| 109 | | PORT_START("KEY6") /* 6: 0xBFFE */ |
| 110 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
| 111 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR('=') |
| 112 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR('+') |
| 113 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR('-') |
| 114 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("h H \xE2\x86\x91") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') |
| 76 | //************************************************************************** |
| 77 | // INPUT PORTS |
| 78 | //************************************************************************** |
| 115 | 79 | |
| 116 | | PORT_START("KEY7") /* 7: 0x7FFE */ |
| 117 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 118 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR('.') |
| 119 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(',') |
| 120 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR('*') |
| 121 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR('/') |
| 80 | //------------------------------------------------- |
| 81 | // INPUT_PORTS( jupiter ) |
| 82 | //------------------------------------------------- |
| 122 | 83 | |
| 123 | | PORT_START("CFG") /* 8: machine config */ |
| 124 | | PORT_DIPNAME( 0x03, 2, "RAM Size") |
| 125 | | PORT_DIPSETTING( 0, "No RAM Expansion") |
| 126 | | PORT_DIPSETTING( 1, "16KB RAM Expansion") |
| 127 | | PORT_DIPSETTING( 2, "48KB RAM Expansion") |
| 84 | INPUT_PORTS_START( jupiter ) |
| 85 | PORT_INCLUDE(generic_terminal) |
| 128 | 86 | INPUT_PORTS_END |
| 129 | 87 | |
| 130 | 88 | |
| 131 | | static READ8_HANDLER( jupiter_io_r ) |
| 132 | | { |
| 133 | | device_t *speaker = space->machine->device("speaker"); |
| 134 | | UINT8 data = 0xff; |
| 135 | 89 | |
| 136 | | if ( ( offset & 0xff ) != 0xfe ) |
| 137 | | return data; |
| 90 | //************************************************************************** |
| 91 | // DEVICE CONFIGURATION |
| 92 | //************************************************************************** |
| 138 | 93 | |
| 139 | | if ( ! ( offset & 0x0100 ) ) |
| 140 | | { |
| 141 | | data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY0" ) ); |
| 142 | | } |
| 143 | | if ( ! ( offset & 0x0200 ) ) |
| 144 | | { |
| 145 | | data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY1" ) ); |
| 146 | | } |
| 147 | | if ( ! ( offset & 0x0400 ) ) |
| 148 | | { |
| 149 | | data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY2" ) ); |
| 150 | | } |
| 151 | | if ( ! ( offset & 0x0800 ) ) |
| 152 | | { |
| 153 | | data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY3" ) ); |
| 154 | | } |
| 155 | | if ( ! ( offset & 0x1000 ) ) |
| 156 | | { |
| 157 | | data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY4" ) ); |
| 158 | | } |
| 159 | | if ( ! ( offset & 0x2000 ) ) |
| 160 | | { |
| 161 | | data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY5" ) ); |
| 162 | | } |
| 163 | | if ( ! ( offset & 0x4000 ) ) |
| 164 | | { |
| 165 | | data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY6" ) ); |
| 166 | | } |
| 167 | | if ( ! ( offset & 0x8000 ) ) |
| 168 | | { |
| 169 | | // cassette_output( space->machine->device("cassette"), -1 ); |
| 170 | | speaker_level_w(speaker,0); |
| 171 | | data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY7" ) );; |
| 172 | | } |
| 173 | | if ( cassette_input(space->machine->device("cassette")) > 0 ) |
| 174 | | { |
| 175 | | data &= ~0x20; |
| 176 | | } |
| 177 | | return data; |
| 178 | | } |
| 94 | //------------------------------------------------- |
| 95 | // wd17xx_interface fdc_intf |
| 96 | //------------------------------------------------- |
| 179 | 97 | |
| 180 | | |
| 181 | | static WRITE8_HANDLER( jupiter_io_w ) |
| 98 | static const floppy_config jupiter_floppy_config = |
| 182 | 99 | { |
| 183 | | device_t *speaker = space->machine->device("speaker"); |
| 184 | | // cassette_output( space->machine->device("cassette"), 1 ); |
| 185 | | speaker_level_w(speaker,1); |
| 186 | | } |
| 100 | DEVCB_NULL, |
| 101 | DEVCB_NULL, |
| 102 | DEVCB_NULL, |
| 103 | DEVCB_NULL, |
| 104 | DEVCB_NULL, |
| 105 | FLOPPY_STANDARD_5_25_SSDD_40, |
| 106 | FLOPPY_OPTIONS_NAME(default), |
| 107 | NULL |
| 108 | }; |
| 187 | 109 | |
| 188 | | |
| 189 | | static WRITE8_HANDLER( jupiter_expram_w ) |
| 110 | static const wd17xx_interface fdc_intf = |
| 190 | 111 | { |
| 191 | | jupiter_state *state = space->machine->driver_data<jupiter_state>(); |
| 112 | DEVCB_NULL, |
| 113 | DEVCB_NULL, |
| 114 | DEVCB_NULL, |
| 115 | { FLOPPY_0, FLOPPY_1, NULL, NULL } |
| 116 | }; |
| 192 | 117 | |
| 193 | | if ( offset > 0x4000 ) |
| 194 | | { |
| 195 | | if ( input_port_read(space->machine, "CFG") >= 1 ) |
| 196 | | state->expram[offset] = data; |
| 197 | | } |
| 198 | | else |
| 199 | | { |
| 200 | | if ( input_port_read(space->machine, "CFG") == 2 ) |
| 201 | | state->expram[offset] = data; |
| 202 | | } |
| 203 | | } |
| 204 | 118 | |
| 119 | //------------------------------------------------- |
| 120 | // GENERIC_TERMINAL_INTERFACE( terminal_intf ) |
| 121 | //------------------------------------------------- |
| 205 | 122 | |
| 206 | | /* graphics output */ |
| 207 | | |
| 208 | | |
| 209 | | static const gfx_layout jupiter_charlayout = |
| 123 | static GENERIC_TERMINAL_INTERFACE( terminal_intf ) |
| 210 | 124 | { |
| 211 | | 8, 8, /* 8x8 characters */ |
| 212 | | 128, /* 128 characters */ |
| 213 | | 1, /* 1 bits per pixel */ |
| 214 | | {0}, /* no bitplanes; 1 bit per pixel */ |
| 215 | | {0, 1, 2, 3, 4, 5, 6, 7}, |
| 216 | | {0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8}, |
| 217 | | 8*8 /* each character takes 8 consecutive bytes */ |
| 125 | DEVCB_NULL |
| 218 | 126 | }; |
| 219 | 127 | |
| 220 | 128 | |
| 221 | | static GFXDECODE_START( jupiter ) |
| 222 | | GFXDECODE_ENTRY( "maincpu", 0xfc00, jupiter_charlayout, 0, 1 ) |
| 223 | | GFXDECODE_END |
| 224 | 129 | |
| 130 | //************************************************************************** |
| 131 | // MACHINE INITIALIZATION |
| 132 | //************************************************************************** |
| 225 | 133 | |
| 226 | | static TIMER_CALLBACK( jupiter_set_irq_callback ) |
| 134 | //------------------------------------------------- |
| 135 | // MACHINE_START( jupiter ) |
| 136 | //------------------------------------------------- |
| 137 | |
| 138 | void jupiter2_state::machine_start() |
| 227 | 139 | { |
| 228 | | cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); |
| 229 | 140 | } |
| 230 | 141 | |
| 231 | 142 | |
| 232 | | static TIMER_CALLBACK( jupiter_clear_irq_callback ) |
| 143 | //------------------------------------------------- |
| 144 | // MACHINE_START( jupiter3 ) |
| 145 | //------------------------------------------------- |
| 146 | |
| 147 | void jupiter3_state::machine_start() |
| 233 | 148 | { |
| 234 | | cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE); |
| 235 | 149 | } |
| 236 | 150 | |
| 237 | 151 | |
| 238 | | static VIDEO_START( jupiter ) |
| 239 | | { |
| 240 | | jupiter_state *state = machine->driver_data<jupiter_state>(); |
| 241 | | state->set_irq_timer = timer_alloc(machine, jupiter_set_irq_callback, NULL ); |
| 242 | | state->clear_irq_timer = timer_alloc(machine, jupiter_clear_irq_callback, NULL ); |
| 243 | 152 | |
| 244 | | timer_adjust_periodic( state->set_irq_timer, |
| 245 | | machine->primary_screen->time_until_pos(31*8, 0 ), |
| 246 | | 0, machine->primary_screen->frame_period() ); |
| 153 | //************************************************************************** |
| 154 | // MACHINE CONFIGURATION |
| 155 | //************************************************************************** |
| 247 | 156 | |
| 248 | | timer_adjust_periodic( state->clear_irq_timer, |
| 249 | | machine->primary_screen->time_until_pos(32*8, 0 ), |
| 250 | | 0, machine->primary_screen->frame_period() ); |
| 251 | | } |
| 157 | //------------------------------------------------- |
| 158 | // MACHINE_CONFIG( jupiter ) |
| 159 | //------------------------------------------------- |
| 252 | 160 | |
| 161 | static MACHINE_CONFIG_START( jupiter, jupiter2_state ) |
| 162 | // basic machine hardware |
| 163 | MCFG_CPU_ADD(MCM6571AP_TAG, M6800, 2000000) |
| 164 | MCFG_CPU_PROGRAM_MAP(jupiter_m6800_mem) |
| 165 | MCFG_CPU_IO_MAP(jupiter_m6800_io) |
| 253 | 166 | |
| 254 | | static VIDEO_UPDATE( jupiter ) |
| 255 | | { |
| 256 | | jupiter_state *state = screen->machine->driver_data<jupiter_state>(); |
| 257 | | UINT8 *charram = state->charram; |
| 258 | | UINT8 *videoram = state->videoram; |
| 259 | | UINT8 y,ra,chr,gfx; |
| 260 | | UINT16 sy=0,ma=0,x; |
| 167 | // video hardware |
| 168 | MCFG_FRAGMENT_ADD( generic_terminal ) |
| 261 | 169 | |
| 262 | | for (y = 0; y < 24; y++) |
| 263 | | { |
| 264 | | for (ra = 0; ra < 8; ra++) |
| 265 | | { |
| 266 | | UINT16 *p = BITMAP_ADDR16(bitmap, sy++, 0); |
| 170 | // devices |
| 171 | MCFG_WD1771_ADD(INS1771N1_TAG, fdc_intf) |
| 172 | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 173 | |
| 174 | // internal ram |
| 175 | MCFG_RAM_ADD("messram") |
| 176 | MCFG_RAM_DEFAULT_SIZE("64K") |
| 177 | MACHINE_CONFIG_END |
| 267 | 178 | |
| 268 | | for (x = ma; x < ma+32; x++) |
| 269 | | { |
| 270 | | chr = videoram[x]; |
| 271 | 179 | |
| 272 | | /* get pattern of pixels for that character scanline */ |
| 273 | | gfx = charram[((chr&0x7f)<<3) | ra] ^ ((chr&0x80) ? 0xff : 0); |
| 180 | //------------------------------------------------- |
| 181 | // MACHINE_CONFIG( jupiter3 ) |
| 182 | //------------------------------------------------- |
| 274 | 183 | |
| 275 | | /* Display a scanline of a character (8 pixels) */ |
| 276 | | *p++ = ( gfx & 0x80 ) ? 1 : 0; |
| 277 | | *p++ = ( gfx & 0x40 ) ? 1 : 0; |
| 278 | | *p++ = ( gfx & 0x20 ) ? 1 : 0; |
| 279 | | *p++ = ( gfx & 0x10 ) ? 1 : 0; |
| 280 | | *p++ = ( gfx & 0x08 ) ? 1 : 0; |
| 281 | | *p++ = ( gfx & 0x04 ) ? 1 : 0; |
| 282 | | *p++ = ( gfx & 0x02 ) ? 1 : 0; |
| 283 | | *p++ = ( gfx & 0x01 ) ? 1 : 0; |
| 284 | | } |
| 285 | | } |
| 286 | | ma+=32; |
| 287 | | } |
| 288 | | return 0; |
| 289 | | } |
| 184 | static MACHINE_CONFIG_START( jupiter3, jupiter3_state ) |
| 185 | // basic machine hardware |
| 186 | MCFG_CPU_ADD(Z80_TAG, Z80, 4000000) |
| 187 | MCFG_CPU_PROGRAM_MAP(jupiter3_mem) |
| 188 | MCFG_CPU_IO_MAP(jupiter3_io) |
| 290 | 189 | |
| 190 | // video hardware |
| 191 | MCFG_FRAGMENT_ADD( generic_terminal ) |
| 291 | 192 | |
| 292 | | static const cassette_config jupiter_cassette_config = |
| 293 | | { |
| 294 | | jupiter_cassette_formats, |
| 295 | | NULL, |
| 296 | | (cassette_state)(CASSETTE_STOPPED), |
| 297 | | NULL |
| 298 | | }; |
| 193 | // devices |
| 194 | MCFG_WD1771_ADD(INS1771N1_TAG, fdc_intf) |
| 195 | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 196 | |
| 197 | // internal ram |
| 198 | MCFG_RAM_ADD("messram") |
| 199 | MCFG_RAM_DEFAULT_SIZE("64K") |
| 200 | MACHINE_CONFIG_END |
| 299 | 201 | |
| 300 | | /* machine definition */ |
| 301 | | static MACHINE_CONFIG_START( jupiter, jupiter_state ) |
| 302 | | /* basic machine hardware */ |
| 303 | | MCFG_CPU_ADD("maincpu", Z80, XTAL_6_5MHz/2) /* 3.25 MHz */ |
| 304 | | MCFG_CPU_PROGRAM_MAP(jupiter_mem) |
| 305 | | MCFG_CPU_IO_MAP(jupiter_io) |
| 306 | | MCFG_QUANTUM_TIME(HZ(60)) |
| 307 | 202 | |
| 308 | | /* video hardware */ |
| 309 | | MCFG_SCREEN_ADD("screen", RASTER) |
| 310 | | MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 311 | | MCFG_SCREEN_RAW_PARAMS( XTAL_6_5MHz, 416, 0, 256, 264, 0, 192 ) |
| 312 | 203 | |
| 313 | | MCFG_GFXDECODE( jupiter ) |
| 314 | | MCFG_PALETTE_LENGTH(2) |
| 315 | | MCFG_PALETTE_INIT(black_and_white) |
| 204 | //************************************************************************** |
| 205 | // ROMS |
| 206 | //************************************************************************** |
| 316 | 207 | |
| 317 | | MCFG_VIDEO_START( jupiter ) |
| 318 | | MCFG_VIDEO_UPDATE( jupiter ) |
| 208 | //------------------------------------------------- |
| 209 | // ROM( jupiter2 ) |
| 210 | //------------------------------------------------- |
| 319 | 211 | |
| 320 | | /* sound hardware */ |
| 321 | | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 322 | | MCFG_SOUND_WAVE_ADD("wave", "cassette") |
| 323 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 324 | | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 325 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 212 | ROM_START( jupiter2 ) |
| 213 | ROM_REGION( 0x1000, MCM6571AP_TAG, ROMREGION_INVERT ) // address and data lines are inverted |
| 214 | ROM_LOAD( "idb v1.1 for 60k jii f000.1c", 0x0000, 0x0400, CRC(50893aae) SHA1(da0222c4cb6188f6cfc657fc33558d0a6a41cd1a) ) |
| 215 | ROM_LOAD( "idb v1.1 for 60k jii f400.6c", 0x0400, 0x0400, CRC(a435344a) SHA1(bc4f4143301b10ec762ecc0cb69e5a9d4c4bef7b) ) |
| 216 | ROM_LOAD( "idb v1.1 for 60k jii f800.1d", 0x0800, 0x0400, CRC(ab82df45) SHA1(be7ea5347ff0582401e26c2fa10e13463cbe57c6) ) |
| 217 | ROM_LOAD( "boot_v2.6_sn5d00000000000003_fc00.6d", 0x0c00, 0x0400, CRC(8f33e4ed) SHA1(fb206e5019c166583ff516de3608ae86d2636d2a) ) |
| 218 | ROM_LOAD( "jupiter ii boot rom v2.6 12_18_82 s_n 5d000...0015.6d", 0x0c00, 0x0400, CRC(f87cefdf) SHA1(229ea961e6036ec39e0ae33abc7f554bf9d8361b) ) |
| 219 | ROM_END |
| 326 | 220 | |
| 327 | | /* Devices */ |
| 328 | | MCFG_CASSETTE_ADD( "cassette", jupiter_cassette_config ) |
| 329 | | MCFG_SNAPSHOT_ADD("snapshot", jupiter, "ace", 1) |
| 330 | | MACHINE_CONFIG_END |
| 331 | 221 | |
| 222 | //------------------------------------------------- |
| 223 | // ROM( jupiter3 ) |
| 224 | //------------------------------------------------- |
| 332 | 225 | |
| 333 | | ROM_START (jupiter) |
| 334 | | ROM_REGION (0x10000, "maincpu",0) |
| 335 | | ROM_LOAD ("jupiter.lo", 0x0000, 0x1000, CRC(dc8438a5) SHA1(8fa97eb71e5dd17c7d190c6587ee3840f839347c)) |
| 336 | | ROM_LOAD ("jupiter.hi", 0x1000, 0x1000, CRC(4009f636) SHA1(98c5d4bcd74bcf014268cf4c00b2007ea5cc21f3)) |
| 226 | ROM_START( jupiter3 ) |
| 227 | ROM_REGION( 0x1000, Z80_TAG, ROMREGION_INVERT ) // address and data lines are inverted |
| 228 | ROM_LOAD( "jove 2.0 78_034 4v2d000 1.1c", 0x0000, 0x0400, CRC(be92a76c) SHA1(9c7d9b37c2bbf0c2e9465421e3e1bcf3dd9e66a6) ) |
| 229 | ROM_LOAD( "jove 2.0 78_034 4v2d000 2.6c", 0x0400, 0x0400, CRC(ee98dd32) SHA1(0513261c7c0d911225ea957ee67394871a36ada4) ) |
| 230 | ROM_LOAD( "jove 2.0 78_034 4v2d000 3.1d", 0x0800, 0x0400, CRC(51476b1d) SHA1(ab6f4eb244bcf9718aafdae67da086ec81f33fa6) ) |
| 231 | ROM_LOAD( "jove 2.0 78_034 4v2d000 4.6d", 0x0c00, 0x0400, CRC(16a9595d) SHA1(06150278650590497732e1f3f42356de56737921) ) |
| 337 | 232 | ROM_END |
| 338 | 233 | |
| 339 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ |
| 340 | | COMP( 1981, jupiter, 0, 0, jupiter, jupiter, 0, "Jupiter Cantab", "Jupiter Ace" , 0 ) |
| 234 | |
| 235 | |
| 236 | //************************************************************************** |
| 237 | // DRIVER INITIALIZATION |
| 238 | //************************************************************************** |
| 239 | |
| 240 | //------------------------------------------------- |
| 241 | // DRIVER_INIT( jupiter ) |
| 242 | //------------------------------------------------- |
| 243 | |
| 244 | static DRIVER_INIT( jupiter ) |
| 245 | { |
| 246 | UINT8 *rom = machine->region(MCM6571AP_TAG)->base(); |
| 247 | UINT8 inverted[0x1000]; |
| 248 | |
| 249 | memcpy(inverted, rom, 0x1000); |
| 250 | |
| 251 | for (offs_t addr = 0; addr < 0x400; addr++) |
| 252 | { |
| 253 | // invert address lines |
| 254 | rom[0x3ff - addr] = inverted[addr]; |
| 255 | rom[0x7ff - addr] = inverted[addr + 0x400]; |
| 256 | rom[0xbff - addr] = inverted[addr + 0x800]; |
| 257 | rom[0xfff - addr] = inverted[addr + 0xc00]; |
| 258 | } |
| 259 | } |
| 260 | |
| 261 | |
| 262 | //------------------------------------------------- |
| 263 | // DRIVER_INIT( jupiter3 ) |
| 264 | //------------------------------------------------- |
| 265 | |
| 266 | static DRIVER_INIT( jupiter3 ) |
| 267 | { |
| 268 | UINT8 *rom = machine->region(Z80_TAG)->base(); |
| 269 | UINT8 inverted[0x1000]; |
| 270 | |
| 271 | memcpy(inverted, rom, 0x1000); |
| 272 | |
| 273 | for (offs_t addr = 0; addr < 0x400; addr++) |
| 274 | { |
| 275 | // invert address lines |
| 276 | rom[0x3ff - addr] = inverted[addr]; |
| 277 | rom[0x7ff - addr] = inverted[addr + 0x400]; |
| 278 | rom[0xbff - addr] = inverted[addr + 0x800]; |
| 279 | rom[0xfff - addr] = inverted[addr + 0xc00]; |
| 280 | } |
| 281 | } |
| 282 | |
| 283 | //************************************************************************** |
| 284 | // SYSTEM DRIVERS |
| 285 | //************************************************************************** |
| 286 | |
| 287 | // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS |
| 288 | COMP( 1976, jupiter2, 0, 0, jupiter, jupiter, jupiter, "Wave Mate", "Jupiter II", GAME_NOT_WORKING | GAME_NO_SOUND_HW ) |
| 289 | COMP( 1976, jupiter3, 0, 0, jupiter3, jupiter, jupiter3, "Wave Mate", "Jupiter III", GAME_NOT_WORKING | GAME_NO_SOUND_HW ) |