trunk/src/mame/video/seibuspi.c
| r31893 | r31894 | |
| 26 | 26 | m_midl_layer_offset = 0x2000 / 4 / 2; |
| 27 | 27 | m_text_layer_offset = 0x3000 / 4 / 2; |
| 28 | 28 | } |
| 29 | |
| 30 | m_fore_layer_d13 = m_layer_bank >> 14 & 0x2000; |
| 31 | m_back_layer_d14 = m_rf2_layer_bank << 14 & 0x4000; |
| 32 | m_midl_layer_d14 = m_rf2_layer_bank << 13 & 0x4000; |
| 33 | m_fore_layer_d14 = m_rf2_layer_bank << 12 & 0x4000; |
| 29 | 34 | } |
| 30 | 35 | |
| 31 | 36 | READ32_MEMBER(seibuspi_state::spi_layer_bank_r) |
| r31893 | r31894 | |
| 35 | 40 | |
| 36 | 41 | WRITE32_MEMBER(seibuspi_state::spi_layer_bank_w) |
| 37 | 42 | { |
| 38 | | // r000f000 0010100x 00000000 00000000 |
| 43 | // r000f000 0010100a 00000000 00000000 |
| 39 | 44 | // r: rowscroll enable |
| 40 | 45 | // f: fore layer d13 |
| 41 | | // x: ? (0 in ejanhs, 1 in all other games) |
| 46 | // a: global alpha blending enable (0 in ejanhs, 1 in all other games) |
| 42 | 47 | UINT32 prev = m_layer_bank; |
| 43 | 48 | COMBINE_DATA(&m_layer_bank); |
| 44 | 49 | |
| 45 | | if ((prev ^ m_layer_bank) & 0x80000000) |
| 46 | | { |
| 47 | | m_rowscroll_enable = m_layer_bank >> 31 & 1; |
| 48 | | set_layer_offsets(); |
| 49 | | } |
| 50 | m_rowscroll_enable = m_layer_bank >> 31 & 1; |
| 51 | m_alpha_enable = m_layer_bank >> 16 & 1; |
| 52 | set_layer_offsets(); |
| 50 | 53 | |
| 51 | 54 | if ((prev ^ m_layer_bank) & 0x08000000) |
| 52 | 55 | m_fore_layer->mark_all_dirty(); |
| 53 | 56 | } |
| 54 | 57 | |
| 55 | 58 | |
| 56 | | WRITE8_MEMBER(seibuspi_state::spi_set_layer_banks_w) |
| 59 | WRITE8_MEMBER(seibuspi_state::rf2_layer_bank_w) |
| 57 | 60 | { |
| 58 | | if ((m_rf2_layer_bank ^ data) & 1) |
| 61 | // 00000fmb |
| 62 | // f: fore layer d14 |
| 63 | // m: middle layer d14 |
| 64 | // b: back layer d14 |
| 65 | UINT8 prev = m_rf2_layer_bank; |
| 66 | m_rf2_layer_bank = data; |
| 67 | set_layer_offsets(); |
| 68 | |
| 69 | if ((prev ^ m_rf2_layer_bank) & 1) |
| 59 | 70 | m_back_layer->mark_all_dirty(); |
| 60 | 71 | |
| 61 | | if ((m_rf2_layer_bank ^ data) & 2) |
| 72 | if ((prev ^ m_rf2_layer_bank) & 2) |
| 62 | 73 | m_midl_layer->mark_all_dirty(); |
| 63 | 74 | |
| 64 | | if ((m_rf2_layer_bank ^ data) & 4) |
| 75 | if ((prev ^ m_rf2_layer_bank) & 4) |
| 65 | 76 | m_fore_layer->mark_all_dirty(); |
| 66 | | |
| 67 | | m_rf2_layer_bank = data; |
| 68 | 77 | } |
| 69 | 78 | |
| 70 | 79 | WRITE32_MEMBER(seibuspi_state::spi_layer_enable_w) |
| r31893 | r31894 | |
| 313 | 322 | if (pen != trans_pen) |
| 314 | 323 | { |
| 315 | 324 | int global_pen = pen + (color << m_sprite_bpp); |
| 316 | | UINT8 alpha = m_alpha_table[global_pen]; |
| 317 | | if (alpha) |
| 325 | if (m_alpha_enable && m_alpha_table[global_pen]) |
| 318 | 326 | { |
| 319 | 327 | p[i] = alpha_blend_r32(p[i], pens[global_pen], 0x7f); |
| 320 | 328 | } |
| r31893 | r31894 | |
| 454 | 462 | if (opaque || (t[i & xscroll_mask] & (TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1))) |
| 455 | 463 | { |
| 456 | 464 | UINT16 pen = s[i & xscroll_mask]; |
| 457 | | UINT8 alpha = m_alpha_table[pen]; |
| 458 | | if (alpha) |
| 465 | if (m_alpha_enable && m_alpha_table[pen]) |
| 459 | 466 | { |
| 460 | 467 | *d = alpha_blend_r32(*d, m_palette->pen(pen), 0x7f); |
| 461 | 468 | } |
| r31893 | r31894 | |
| 555 | 562 | int color = (tile >> 13) & 0x7; |
| 556 | 563 | |
| 557 | 564 | tile &= 0x1fff; |
| 558 | | tile |= m_rf2_layer_bank << 14 & 0x4000; // (d0) |
| 565 | tile |= m_back_layer_d14; |
| 559 | 566 | |
| 560 | 567 | SET_TILE_INFO_MEMBER(1, tile, color, 0); |
| 561 | 568 | } |
| r31893 | r31894 | |
| 568 | 575 | |
| 569 | 576 | tile &= 0x1fff; |
| 570 | 577 | tile |= 0x2000; |
| 571 | | tile |= m_rf2_layer_bank << 13 & 0x4000; // (d1) |
| 578 | tile |= m_midl_layer_d14; |
| 572 | 579 | |
| 573 | 580 | SET_TILE_INFO_MEMBER(1, tile, color + 16, 0); |
| 574 | 581 | } |
| r31893 | r31894 | |
| 581 | 588 | |
| 582 | 589 | tile &= 0x1fff; |
| 583 | 590 | tile |= m_bg_fore_layer_position; |
| 584 | | tile |= m_layer_bank >> 14 & 0x2000; // (d27) |
| 585 | | tile |= m_rf2_layer_bank << 12 & 0x4000; // (d2) |
| 591 | tile |= m_fore_layer_d13; |
| 592 | tile |= m_fore_layer_d14; |
| 586 | 593 | |
| 587 | 594 | SET_TILE_INFO_MEMBER(1, tile, color + 8, 0); |
| 588 | 595 | } |
| r31893 | r31894 | |
| 590 | 597 | |
| 591 | 598 | void seibuspi_state::video_start() |
| 592 | 599 | { |
| 593 | | int i; |
| 594 | | |
| 595 | 600 | m_video_dma_length = 0; |
| 596 | 601 | m_video_dma_address = 0; |
| 597 | 602 | m_layer_enable = 0; |
| 598 | 603 | m_layer_bank = 0; |
| 599 | 604 | m_rf2_layer_bank = 0; |
| 605 | m_alpha_enable = 0; |
| 606 | m_rowscroll_enable = 0; |
| 600 | 607 | set_layer_offsets(); |
| 601 | 608 | |
| 602 | 609 | UINT32 region_length = memregion("gfx2")->bytes(); |
| r31893 | r31894 | |
| 627 | 634 | m_midl_layer->set_transparent_pen(63); |
| 628 | 635 | m_fore_layer->set_transparent_pen(63); |
| 629 | 636 | |
| 630 | | memset(m_alpha_table, 0, 8192); |
| 637 | // alpha blending (preliminary) |
| 638 | memset(m_alpha_table, 0, 0x2000); |
| 631 | 639 | |
| 632 | | // sprites |
| 633 | | //for (i = 1792; i < 1808; i++) { m_alpha_table[i] = 1; } // breaks rdft |
| 634 | | for (i = 1840; i < 1856; i++) { m_alpha_table[i] = 1; } |
| 635 | | for (i = 1920; i < 1952; i++) { m_alpha_table[i] = 1; } |
| 636 | | //for (i = 1984; i < 2048; i++) { m_alpha_table[i] = 1; } // breaks batlball |
| 637 | | //for (i = 3840; i < 3904; i++) { m_alpha_table[i] = 1; } // breaks rdft |
| 638 | | for (i = 4032; i < 4096; i++) { m_alpha_table[i] = 1; } |
| 640 | // sprites(0000-0fff): |
| 641 | //memset(m_alpha_table + 0x700, 1, 0x10); // breaks rdft |
| 642 | memset(m_alpha_table + 0x730, 1, 0x10); |
| 643 | memset(m_alpha_table + 0x780, 1, 0x20); |
| 644 | //memset(m_alpha_table + 0x7c0, 1, 0x40); // breaks batlball |
| 645 | //memset(m_alpha_table + 0xf00, 1, 0x40); // breaks rdft |
| 646 | memset(m_alpha_table + 0xfc0, 1, 0x40); |
| 639 | 647 | |
| 640 | | // middle layer |
| 641 | | for (i = 4960; i < 4992; i++) { m_alpha_table[i] = 1; } // breaks ejanhs |
| 642 | | for (i = 5040; i < 5056; i++) { m_alpha_table[i] = 1; } // breaks ejanhs |
| 643 | | for (i = 5104; i < 5120; i++) { m_alpha_table[i] = 1; } |
| 644 | | // fore layer |
| 645 | | for (i = 5552; i < 5568; i++) { m_alpha_table[i] = 1; } // breaks ejanhs |
| 646 | | for (i = 5616; i < 5632; i++) { m_alpha_table[i] = 1; } // breaks ejanhs |
| 647 | | // text layer |
| 648 | | for (i = 6000; i < 6016; i++) { m_alpha_table[i] = 1; } |
| 649 | | for (i = 6128; i < 6144; i++) { m_alpha_table[i] = 1; } |
| 648 | // back layer(1000-11ff): nope |
| 649 | // fore layer(1200-13ff): |
| 650 | memset(m_alpha_table + 0x1200 + 0x160, 1, 0x20); |
| 651 | memset(m_alpha_table + 0x1200 + 0x1b0, 1, 0x10); |
| 652 | memset(m_alpha_table + 0x1200 + 0x1f0, 1, 0x10); |
| 653 | // midl layer(1400-15ff) |
| 654 | memset(m_alpha_table + 0x1400 + 0x1b0, 1, 0x10); |
| 655 | memset(m_alpha_table + 0x1400 + 0x1f0, 1, 0x10); |
| 656 | // text layer(1600-17ff) |
| 657 | memset(m_alpha_table + 0x1600 + 0x170, 1, 0x10); |
| 658 | memset(m_alpha_table + 0x1600 + 0x1f0, 1, 0x10); |
| 650 | 659 | |
| 651 | 660 | register_video_state(); |
| 652 | 661 | } |
| r31893 | r31894 | |
| 658 | 667 | m_layer_enable = 0; |
| 659 | 668 | m_layer_bank = 0; |
| 660 | 669 | m_rf2_layer_bank = 0; |
| 661 | | |
| 670 | m_alpha_enable = 0; |
| 671 | m_rowscroll_enable = 0; |
| 672 | set_layer_offsets(); |
| 673 | |
| 662 | 674 | m_tilemap_ram_size = 0; |
| 663 | 675 | m_palette_ram_size = 0x4000; |
| 664 | 676 | m_sprite_ram_size = 0x2000; |
| r31893 | r31894 | |
| 668 | 680 | m_palette_ram = auto_alloc_array_clear(machine(), UINT32, m_palette_ram_size/4); |
| 669 | 681 | m_sprite_ram = auto_alloc_array_clear(machine(), UINT32, m_sprite_ram_size/4); |
| 670 | 682 | |
| 671 | | memset(m_alpha_table, 0, 8192); |
| 683 | memset(m_alpha_table, 0, 0x2000); |
| 672 | 684 | |
| 673 | 685 | register_video_state(); |
| 674 | 686 | } |
| r31893 | r31894 | |
| 680 | 692 | save_item(NAME(m_layer_enable)); |
| 681 | 693 | save_item(NAME(m_layer_bank)); |
| 682 | 694 | save_item(NAME(m_rf2_layer_bank)); |
| 695 | save_item(NAME(m_alpha_enable)); |
| 683 | 696 | save_item(NAME(m_rowscroll_enable)); |
| 697 | |
| 684 | 698 | save_item(NAME(m_midl_layer_offset)); |
| 685 | 699 | save_item(NAME(m_fore_layer_offset)); |
| 686 | 700 | save_item(NAME(m_text_layer_offset)); |
| 701 | save_item(NAME(m_fore_layer_d13)); |
| 702 | save_item(NAME(m_back_layer_d14)); |
| 703 | save_item(NAME(m_midl_layer_d14)); |
| 704 | save_item(NAME(m_fore_layer_d14)); |
| 687 | 705 | |
| 688 | 706 | if (m_tilemap_ram != NULL) save_pointer(NAME(m_tilemap_ram), m_tilemap_ram_size/4); |
| 689 | 707 | save_pointer(NAME(m_palette_ram), m_palette_ram_size/4); |
trunk/src/mame/drivers/seibuspi.c
| r31893 | r31894 | |
| 904 | 904 | WRITE8_MEMBER(seibuspi_state::spi_layerbanks_eeprom_w) |
| 905 | 905 | { |
| 906 | 906 | // low bits: tile banks |
| 907 | | spi_set_layer_banks_w(space, 0, data); |
| 907 | rf2_layer_bank_w(space, 0, data); |
| 908 | 908 | |
| 909 | 909 | // high bits: eeprom |
| 910 | 910 | eeprom_w(space, 0, data); |
| r31893 | r31894 | |
| 942 | 942 | |
| 943 | 943 | READ32_MEMBER(seibuspi_state::ejsakura_keyboard_r) |
| 944 | 944 | { |
| 945 | | switch(m_ejsakura_input_port) |
| 945 | switch (m_ejsakura_input_port) |
| 946 | 946 | { |
| 947 | 947 | case 0x01: |
| 948 | 948 | return ioport("INPUT01")->read(); |
| r31893 | r31894 | |
| 1000 | 1000 | AM_RANGE(0x00000684, 0x00000687) AM_READ8(sound_fifo_status_r, 0x000000ff) |
| 1001 | 1001 | AM_RANGE(0x00000688, 0x0000068b) AM_WRITE8(z80_prg_transfer_w, 0x000000ff) |
| 1002 | 1002 | AM_RANGE(0x0000068c, 0x0000068f) AM_WRITE8(z80_enable_w, 0x000000ff) |
| 1003 | | AM_RANGE(0x0000068c, 0x0000068f) AM_WRITE8(spi_set_layer_banks_w, 0x00ff0000) |
| 1003 | AM_RANGE(0x0000068c, 0x0000068f) AM_WRITE8(rf2_layer_bank_w, 0x00ff0000) |
| 1004 | 1004 | AM_RANGE(0x000006d0, 0x000006d3) AM_DEVWRITE8("ds2404", ds2404_device, ds2404_1w_reset_w, 0x000000ff) |
| 1005 | 1005 | AM_RANGE(0x000006d4, 0x000006d7) AM_DEVWRITE8("ds2404", ds2404_device, ds2404_data_w, 0x000000ff) |
| 1006 | 1006 | AM_RANGE(0x000006d8, 0x000006db) AM_DEVWRITE8("ds2404", ds2404_device, ds2404_clk_w, 0x000000ff) |
| r31893 | r31894 | |
| 1968 | 1968 | UINT16 tmp[0x40 / 2], offset; |
| 1969 | 1969 | |
| 1970 | 1970 | // sprite_reorder() only |
| 1971 | | for(i = 0; i < memregion("gfx3")->bytes() / 0x40; i++) |
| 1971 | for (i = 0; i < memregion("gfx3")->bytes() / 0x40; i++) |
| 1972 | 1972 | { |
| 1973 | 1973 | memcpy(tmp, src, 0x40); |
| 1974 | 1974 | |
| 1975 | | for(j = 0; j < 0x40 / 2; j++) |
| 1975 | for (j = 0; j < 0x40 / 2; j++) |
| 1976 | 1976 | { |
| 1977 | 1977 | offset = (j >> 1) | (j << 4 & 0x10); |
| 1978 | 1978 | *src++ = tmp[offset]; |
| r31893 | r31894 | |
| 3758 | 3758 | GAME( 1995, viprp1oj, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (Japan)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 3759 | 3759 | GAME( 1995, viprp1hk, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Viper Phase 1 (Hong Kong)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* "=HONG KONG=" seems part of title */ |
| 3760 | 3760 | |
| 3761 | | GAME( 1996, ejanhs, 0, spi, spi_ejanhs, seibuspi_state, ejanhs, ROT0, "Seibu Kaihatsu", "E-Jan High School (Japan)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 3761 | GAME( 1996, ejanhs, 0, spi, spi_ejanhs, seibuspi_state, ejanhs, ROT0, "Seibu Kaihatsu", "E-Jan High School (Japan)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND ) |
| 3762 | 3762 | |
| 3763 | 3763 | GAME( 1996, rdft, 0, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 1)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 3764 | 3764 | GAME( 1996, rdftj, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 2)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |