trunk/src/mess/includes/svi318.h
| r32272 | r32273 | |
| 73 | 73 | DECLARE_READ8_MEMBER(io_ext_r); |
| 74 | 74 | DECLARE_WRITE8_MEMBER(io_ext_w); |
| 75 | 75 | DECLARE_DRIVER_INIT(svi318); |
| 76 | | DECLARE_MACHINE_START(svi318_pal); |
| 77 | | DECLARE_MACHINE_RESET(svi318); |
| 78 | | DECLARE_MACHINE_RESET(svi328_806); |
| 79 | | DECLARE_VIDEO_START(svi328_806); |
| 80 | | DECLARE_MACHINE_START(svi318_ntsc); |
| 76 | DECLARE_DRIVER_INIT(svi328_806); |
| 81 | 77 | DECLARE_WRITE_LINE_MEMBER(vdp_interrupt); |
| 82 | 78 | DECLARE_WRITE_LINE_MEMBER(ins8250_interrupt); |
| 83 | 79 | DECLARE_READ8_MEMBER(ppi_port_a_r); |
| r32272 | r32273 | |
| 89 | 85 | DECLARE_DEVICE_IMAGE_LOAD_MEMBER(svi318_cart); |
| 90 | 86 | DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); |
| 91 | 87 | |
| 88 | virtual void machine_start(); |
| 89 | virtual void machine_reset(); |
| 90 | |
| 92 | 91 | MC6845_UPDATE_ROW(crtc_update_row); |
| 93 | 92 | memory_region *m_cart_rom; |
| 94 | 93 | memory_region *m_bios_rom; |
| r32272 | r32273 | |
| 111 | 110 | required_ioport m_buttons; |
| 112 | 111 | optional_device<palette_device> m_palette; |
| 113 | 112 | |
| 114 | | protected: |
| 115 | | void svi318_set_banks(); |
| 116 | | void svi318_80col_init(); |
| 117 | | void svi318_vdp_interrupt(int i); |
| 118 | | |
| 119 | 113 | private: |
| 120 | 114 | |
| 115 | void set_banks(); |
| 116 | void postload(); |
| 117 | |
| 121 | 118 | // memory banking |
| 122 | 119 | UINT8 m_bank_switch; |
| 123 | 120 | UINT8 m_bank_low; |
| r32272 | r32273 | |
| 141 | 138 | // SVI-806 80 column card |
| 142 | 139 | UINT8 m_svi806_present; |
| 143 | 140 | UINT8 m_svi806_ram_enabled; |
| 144 | | memory_region *m_svi806_ram; |
| 141 | dynamic_buffer m_svi806_ram; |
| 145 | 142 | UINT8 *m_svi806_gfx; |
| 146 | 143 | |
| 147 | 144 | required_memory_bank m_bank1; |
trunk/src/mess/drivers/svi318.c
| r32272 | r32273 | |
| 266 | 266 | MCFG_CPU_IO_MAP(svi318_io) |
| 267 | 267 | MCFG_QUANTUM_TIME(attotime::from_hz(60)) |
| 268 | 268 | |
| 269 | | MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_pal) |
| 270 | | MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi318) |
| 271 | | |
| 272 | 269 | MCFG_DEVICE_ADD("ppi8255", I8255, 0) |
| 273 | 270 | MCFG_I8255_IN_PORTA_CB(READ8(svi318_state, ppi_port_a_r)) |
| 274 | 271 | MCFG_I8255_IN_PORTB_CB(READ8(svi318_state, ppi_port_b_r)) |
| r32272 | r32273 | |
| 336 | 333 | MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(svi318_state, vdp_interrupt)) |
| 337 | 334 | MCFG_TMS9928A_SCREEN_ADD_NTSC("screen") |
| 338 | 335 | MCFG_SCREEN_UPDATE_DEVICE("tms9928a", tms9928a_device, screen_update) |
| 339 | | |
| 340 | | MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_ntsc) |
| 341 | | MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi318) |
| 342 | 336 | MACHINE_CONFIG_END |
| 343 | 337 | |
| 344 | 338 | static MACHINE_CONFIG_DERIVED( svi328, svi318 ) |
| r32272 | r32273 | |
| 383 | 377 | MCFG_CPU_IO_MAP(svi328_806_io) |
| 384 | 378 | MCFG_QUANTUM_TIME(attotime::from_hz(60)) |
| 385 | 379 | |
| 386 | | MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_pal) |
| 387 | | MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi328_806) |
| 388 | | |
| 389 | 380 | MCFG_DEVICE_ADD("ppi8255", I8255, 0) |
| 390 | 381 | MCFG_I8255_IN_PORTA_CB(READ8(svi318_state, ppi_port_a_r)) |
| 391 | 382 | MCFG_I8255_IN_PORTB_CB(READ8(svi318_state, ppi_port_b_r)) |
| r32272 | r32273 | |
| 421 | 412 | MCFG_MC6845_CHAR_WIDTH(8) /* ? */ |
| 422 | 413 | MCFG_MC6845_UPDATE_ROW_CB(svi318_state, crtc_update_row) |
| 423 | 414 | |
| 424 | | MCFG_VIDEO_START_OVERRIDE(svi318_state, svi328_806) |
| 425 | | |
| 426 | 415 | /* Sound hardware */ |
| 427 | 416 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 428 | 417 | MCFG_SOUND_ADD("dac", DAC, 0) |
| r32272 | r32273 | |
| 452 | 441 | |
| 453 | 442 | MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(svi318_floppy_interface) |
| 454 | 443 | |
| 444 | /* Software lists */ |
| 445 | MCFG_SOFTWARE_LIST_ADD("cass_list", "svi318_flop") |
| 446 | MCFG_SOFTWARE_LIST_ADD("disk_list", "svi318_cass") |
| 447 | |
| 455 | 448 | MCFG_FRAGMENT_ADD(svi318_cartslot) |
| 456 | 449 | |
| 457 | 450 | /* internal ram */ |
| r32272 | r32273 | |
| 462 | 455 | |
| 463 | 456 | static MACHINE_CONFIG_DERIVED( svi328n_806, svi328_806 ) |
| 464 | 457 | |
| 465 | | MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_ntsc) |
| 466 | | |
| 467 | 458 | MCFG_SCREEN_MODIFY("screen") |
| 468 | 459 | MCFG_SCREEN_REFRESH_RATE(60) |
| 469 | 460 | MACHINE_CONFIG_END |
| r32272 | r32273 | |
| 537 | 528 | ROM_END |
| 538 | 529 | |
| 539 | 530 | |
| 540 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 541 | | COMP( 1983, svi318, 0, 0, svi318, svi318, svi318_state, svi318, "Spectravideo", "SVI-318 (PAL)", 0 ) |
| 542 | | COMP( 1983, svi318n, svi318, 0, svi318n, svi318, svi318_state, svi318, "Spectravideo", "SVI-318 (NTSC)", 0 ) |
| 543 | | COMP( 1983, svi328, svi318, 0, svi328, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (PAL)", 0 ) |
| 544 | | COMP( 1983, svi328n, svi318, 0, svi328n, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (NTSC)", 0 ) |
| 545 | | COMP( 1983, sv328p80, svi318, 0, svi328_806, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (PAL) + SVI-806 80 column card", 0 ) |
| 546 | | COMP( 1983, sv328n80, svi318, 0, svi328n_806, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (NTSC) + SVI-806 80 column card", 0 ) |
| 531 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 532 | COMP( 1983, svi318, 0, 0, svi318, svi318, svi318_state, svi318, "Spectravideo", "SVI-318 (PAL)", GAME_SUPPORTS_SAVE ) |
| 533 | COMP( 1983, svi318n, svi318, 0, svi318n, svi318, svi318_state, svi318, "Spectravideo", "SVI-318 (NTSC)", GAME_SUPPORTS_SAVE ) |
| 534 | COMP( 1983, svi328, svi318, 0, svi328, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (PAL)", GAME_SUPPORTS_SAVE ) |
| 535 | COMP( 1983, svi328n, svi318, 0, svi328n, svi328, svi318_state, svi318, "Spectravideo", "SVI-328 (NTSC)", GAME_SUPPORTS_SAVE ) |
| 536 | COMP( 1983, sv328p80, svi318, 0, svi328_806, svi328, svi318_state, svi328_806, "Spectravideo", "SVI-328 (PAL) + SVI-806 80 column card", GAME_SUPPORTS_SAVE ) |
| 537 | COMP( 1983, sv328n80, svi318, 0, svi328n_806, svi328, svi318_state, svi328_806, "Spectravideo", "SVI-328 (NTSC) + SVI-806 80 column card", GAME_SUPPORTS_SAVE ) |
trunk/src/mess/machine/svi318.c
| r32272 | r32273 | |
| 204 | 204 | set_led_status(machine(), 0, !(data & 0x20)); |
| 205 | 205 | |
| 206 | 206 | m_bank_switch = data; |
| 207 | | svi318_set_banks(); |
| 207 | set_banks(); |
| 208 | 208 | } |
| 209 | 209 | |
| 210 | 210 | /* Disk drives */ |
| r32272 | r32273 | |
| 256 | 256 | |
| 257 | 257 | for (int i = 0; i < x_count; i++) |
| 258 | 258 | { |
| 259 | | UINT8 data = m_svi806_gfx[m_svi806_ram->u8((ma + i) & 0x7ff) * 16 + ra]; |
| 259 | UINT8 data = m_svi806_gfx[m_svi806_ram[(ma + i) & 0x7ff] * 16 + ra]; |
| 260 | 260 | |
| 261 | 261 | if (i == cursor_x) |
| 262 | 262 | { |
| 263 | | data = 0xFF; |
| 263 | data = 0xff; |
| 264 | 264 | } |
| 265 | 265 | |
| 266 | 266 | for (int j = 0; j < 8; j++) |
| r32272 | r32273 | |
| 272 | 272 | } |
| 273 | 273 | |
| 274 | 274 | |
| 275 | | /* 80 column card init */ |
| 276 | | void svi318_state::svi318_80col_init() |
| 277 | | { |
| 278 | | /* 2K RAM, but allocating 4KB to make banking easier */ |
| 279 | | /* The upper 2KB will be set to FFs and will never be written to */ |
| 280 | | m_svi806_ram = machine().memory().region_alloc("gfx2", 0x1000, 1, ENDIANNESS_LITTLE); |
| 281 | | memset(m_svi806_ram->base(), 0x00, 0x800); |
| 282 | | memset(m_svi806_ram->base() + 0x800, 0xff, 0x800); |
| 283 | | m_svi806_gfx = memregion("gfx1")->base(); |
| 284 | | } |
| 285 | | |
| 286 | | |
| 287 | 275 | WRITE8_MEMBER(svi318_state::svi806_ram_enable_w) |
| 288 | 276 | { |
| 289 | 277 | m_svi806_ram_enabled = (data & 0x01); |
| 290 | | svi318_set_banks(); |
| 278 | set_banks(); |
| 291 | 279 | } |
| 292 | 280 | |
| 293 | | VIDEO_START_MEMBER(svi318_state, svi328_806) |
| 294 | | { |
| 295 | | } |
| 296 | 281 | |
| 297 | | MACHINE_RESET_MEMBER(svi318_state, svi328_806) |
| 298 | | { |
| 299 | | MACHINE_RESET_CALL_MEMBER(svi318); |
| 300 | | |
| 301 | | svi318_80col_init(); |
| 302 | | m_svi806_present = 1; |
| 303 | | svi318_set_banks(); |
| 304 | | |
| 305 | | /* Set SVI-806 80 column card palette */ |
| 306 | | m_palette->set_pen_color(TMS9928A_PALETTE_SIZE, 0, 0, 0); /* Monochrome black */ |
| 307 | | m_palette->set_pen_color(TMS9928A_PALETTE_SIZE+1, 0, 224, 0); /* Monochrome green */ |
| 308 | | } |
| 309 | | |
| 310 | 282 | /* Init functions */ |
| 311 | 283 | |
| 312 | | void svi318_state::svi318_vdp_interrupt(int i) |
| 313 | | { |
| 314 | | m_maincpu->set_input_line(0, (i ? HOLD_LINE : CLEAR_LINE)); |
| 315 | | } |
| 316 | | |
| 317 | | |
| 318 | 284 | static const UINT8 cc_op[0x100] = { |
| 319 | 285 | 4+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1, 4+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1, |
| 320 | 286 | 8+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,12+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1, |
| r32272 | r32273 | |
| 444 | 410 | |
| 445 | 411 | m_bank_low_ptr = m_empty_bank; |
| 446 | 412 | m_bank_high1_ptr = m_empty_bank; |
| 447 | | m_bank_high2_ptr = m_empty_bank; |
| 448 | | |
| 413 | m_bank_high2_ptr = m_empty_bank; |
| 449 | 414 | } |
| 450 | 415 | |
| 451 | | MACHINE_START_MEMBER(svi318_state, svi318_ntsc) |
| 416 | DRIVER_INIT_MEMBER(svi318_state, svi328_806) |
| 452 | 417 | { |
| 453 | | astring region_tag; |
| 454 | | m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG)); |
| 455 | | m_bios_rom = memregion("maincpu"); |
| 418 | DRIVER_INIT_CALL(svi318); |
| 419 | m_svi806_present = 1; |
| 456 | 420 | } |
| 457 | 421 | |
| 458 | | MACHINE_START_MEMBER(svi318_state, svi318_pal) |
| 422 | void svi318_state::machine_start() |
| 459 | 423 | { |
| 460 | 424 | astring region_tag; |
| 461 | 425 | m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG)); |
| 462 | 426 | m_bios_rom = memregion("maincpu"); |
| 427 | |
| 428 | // 80 column card start |
| 429 | if (m_svi806_present) |
| 430 | { |
| 431 | // 2K RAM, but allocating 4KB to make banking easier |
| 432 | // The upper 2KB will be set to FFs and will never be written to |
| 433 | m_svi806_ram.resize(0x1000); |
| 434 | save_item(NAME(m_svi806_ram)); |
| 435 | memset(m_svi806_ram, 0x00, 0x800); |
| 436 | memset(m_svi806_ram + 0x800, 0xff, 0x800); |
| 437 | |
| 438 | m_svi806_gfx = memregion("gfx1")->base(); |
| 439 | |
| 440 | // Set SVI-806 80 column card palette |
| 441 | m_palette->set_pen_color(TMS9928A_PALETTE_SIZE, 0, 0, 0); /* Monochrome black */ |
| 442 | m_palette->set_pen_color(TMS9928A_PALETTE_SIZE+1, 0, 224, 0); /* Monochrome green */ |
| 443 | } |
| 444 | |
| 445 | // register for savestates |
| 446 | save_item(NAME(m_driveselect)); |
| 447 | save_item(NAME(m_drq)); |
| 448 | save_item(NAME(m_irq)); |
| 449 | save_item(NAME(m_heads)); |
| 450 | |
| 451 | save_item(NAME(m_bank_switch)); |
| 452 | save_item(NAME(m_bank_low)); |
| 453 | save_item(NAME(m_bank_high)); |
| 454 | save_item(NAME(m_bank_low_read_only)); |
| 455 | save_item(NAME(m_bank_high1_read_only)); |
| 456 | save_item(NAME(m_bank_high2_read_only)); |
| 457 | save_item(NAME(m_keyboard_row)); |
| 458 | save_item(NAME(m_centronics_busy)); |
| 459 | |
| 460 | save_item(NAME(m_svi806_present)); |
| 461 | save_item(NAME(m_svi806_ram_enabled)); |
| 462 | |
| 463 | machine().save().register_postload(save_prepost_delegate(FUNC(svi318_state::postload), this)); |
| 463 | 464 | } |
| 464 | 465 | |
| 466 | |
| 465 | 467 | static void svi318_load_proc(device_image_interface &image) |
| 466 | 468 | { |
| 467 | 469 | svi318_state *state = image.device().machine().driver_data<svi318_state>(); |
| r32272 | r32273 | |
| 482 | 484 | } |
| 483 | 485 | } |
| 484 | 486 | |
| 485 | | MACHINE_RESET_MEMBER(svi318_state, svi318) |
| 487 | void svi318_state::machine_reset() |
| 486 | 488 | { |
| 487 | 489 | m_keyboard_row = 0; |
| 488 | 490 | m_centronics_busy = 0; |
| r32272 | r32273 | |
| 499 | 501 | m_bank_high2_read_only = 0; |
| 500 | 502 | |
| 501 | 503 | m_bank_switch = 0xff; |
| 502 | | svi318_set_banks(); |
| 504 | set_banks(); |
| 503 | 505 | |
| 504 | 506 | for (int drive = 0; drive < 2; drive++) |
| 505 | 507 | floppy_get_device(machine(), drive)->floppy_install_load_proc(svi318_load_proc); |
| r32272 | r32273 | |
| 536 | 538 | if (m_svi806_ram_enabled) |
| 537 | 539 | { |
| 538 | 540 | if (offset < 0x800) |
| 539 | | m_svi806_ram->u8(offset) = data; |
| 541 | m_svi806_ram[offset] = data; |
| 540 | 542 | } |
| 541 | 543 | else |
| 542 | 544 | { |
| r32272 | r32273 | |
| 547 | 549 | } |
| 548 | 550 | } |
| 549 | 551 | |
| 550 | | void svi318_state::svi318_set_banks() |
| 552 | void svi318_state::set_banks() |
| 551 | 553 | { |
| 552 | 554 | const UINT8 v = m_bank_switch; |
| 553 | 555 | UINT8 *ram = m_ram->pointer(); |
| r32272 | r32273 | |
| 653 | 655 | } |
| 654 | 656 | } |
| 655 | 657 | |
| 658 | void svi318_state::postload() |
| 659 | { |
| 660 | set_banks(); |
| 661 | } |
| 662 | |
| 663 | |
| 656 | 664 | /* External I/O */ |
| 657 | 665 | |
| 658 | 666 | WRITE_LINE_MEMBER(svi318_state::write_centronics_busy) |