Previous 199869 Revisions Next

r31894 Wednesday 3rd September, 2014 at 18:30:19 UTC by hap
added global alpha bit
[src/mame/drivers]seibuspi.c
[src/mame/includes]seibuspi.h
[src/mame/video]seibuspi.c

trunk/src/mame/includes/seibuspi.h
r31893r31894
5757   UINT32 m_video_dma_address;
5858   UINT32 m_layer_enable;
5959   UINT32 m_layer_bank;
60   int m_rf2_layer_bank;
60   UINT8 m_rf2_layer_bank;
61   int m_alpha_enable;
6162   int m_rowscroll_enable;
6263   int m_midl_layer_offset;
6364   int m_fore_layer_offset;
6465   int m_text_layer_offset;
66   int m_fore_layer_d13;
67   int m_back_layer_d14;
68   int m_midl_layer_d14;
69   int m_fore_layer_d14;
6570   UINT32 *m_tilemap_ram;
6671   UINT32 *m_palette_ram;
6772   UINT32 *m_sprite_ram;
r31893r31894
6974   UINT32 m_palette_ram_size;
7075   UINT32 m_sprite_ram_size;
7176   UINT32 m_bg_fore_layer_position;
72   UINT8 m_alpha_table[8192];
77   UINT8 m_alpha_table[0x2000];
7378   int m_sprite_bpp;
7479
7580   DECLARE_READ32_MEMBER(spi_layer_bank_r);
7681   DECLARE_WRITE32_MEMBER(spi_layer_bank_w);
7782   DECLARE_READ32_MEMBER(spi_layer_enable_r);
7883   DECLARE_WRITE32_MEMBER(spi_layer_enable_w);
79   DECLARE_WRITE8_MEMBER(spi_set_layer_banks_w);
84   DECLARE_WRITE8_MEMBER(rf2_layer_bank_w);
8085   DECLARE_WRITE32_MEMBER(tilemap_dma_start_w);
8186   DECLARE_WRITE32_MEMBER(palette_dma_start_w);
8287   DECLARE_WRITE16_MEMBER(sprite_dma_start_w);
trunk/src/mame/video/seibuspi.c
r31893r31894
2626      m_midl_layer_offset = 0x2000 / 4 / 2;
2727      m_text_layer_offset = 0x3000 / 4 / 2;
2828   }
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;
2934}
3035
3136READ32_MEMBER(seibuspi_state::spi_layer_bank_r)
r31893r31894
3540
3641WRITE32_MEMBER(seibuspi_state::spi_layer_bank_w)
3742{
38   // r000f000 0010100x 00000000 00000000
43   // r000f000 0010100a 00000000 00000000
3944   // r: rowscroll enable
4045   // 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)
4247   UINT32 prev = m_layer_bank;
4348   COMBINE_DATA(&m_layer_bank);
4449
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();
5053
5154   if ((prev ^ m_layer_bank) & 0x08000000)
5255      m_fore_layer->mark_all_dirty();
5356}
5457
5558
56WRITE8_MEMBER(seibuspi_state::spi_set_layer_banks_w)
59WRITE8_MEMBER(seibuspi_state::rf2_layer_bank_w)
5760{
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)
5970      m_back_layer->mark_all_dirty();
6071
61   if ((m_rf2_layer_bank ^ data) & 2)
72   if ((prev ^ m_rf2_layer_bank) & 2)
6273      m_midl_layer->mark_all_dirty();
6374
64   if ((m_rf2_layer_bank ^ data) & 4)
75   if ((prev ^ m_rf2_layer_bank) & 4)
6576      m_fore_layer->mark_all_dirty();
66
67   m_rf2_layer_bank = data;
6877}
6978
7079WRITE32_MEMBER(seibuspi_state::spi_layer_enable_w)
r31893r31894
313322         if (pen != trans_pen)
314323         {
315324            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])
318326            {
319327               p[i] = alpha_blend_r32(p[i], pens[global_pen], 0x7f);
320328            }
r31893r31894
454462         if (opaque || (t[i & xscroll_mask] & (TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1)))
455463         {
456464            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])
459466            {
460467               *d = alpha_blend_r32(*d, m_palette->pen(pen), 0x7f);
461468            }
r31893r31894
555562   int color = (tile >> 13) & 0x7;
556563
557564   tile &= 0x1fff;
558   tile |= m_rf2_layer_bank << 14 & 0x4000; // (d0)
565   tile |= m_back_layer_d14;
559566
560567   SET_TILE_INFO_MEMBER(1, tile, color, 0);
561568}
r31893r31894
568575
569576   tile &= 0x1fff;
570577   tile |= 0x2000;
571   tile |= m_rf2_layer_bank << 13 & 0x4000; // (d1)
578   tile |= m_midl_layer_d14;
572579
573580   SET_TILE_INFO_MEMBER(1, tile, color + 16, 0);
574581}
r31893r31894
581588
582589   tile &= 0x1fff;
583590   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;
586593
587594   SET_TILE_INFO_MEMBER(1, tile, color + 8, 0);
588595}
r31893r31894
590597
591598void seibuspi_state::video_start()
592599{
593   int i;
594
595600   m_video_dma_length = 0;
596601   m_video_dma_address = 0;
597602   m_layer_enable = 0;
598603   m_layer_bank = 0;
599604   m_rf2_layer_bank = 0;
605   m_alpha_enable = 0;
606   m_rowscroll_enable = 0;
600607   set_layer_offsets();
601608
602609   UINT32 region_length = memregion("gfx2")->bytes();
r31893r31894
627634   m_midl_layer->set_transparent_pen(63);
628635   m_fore_layer->set_transparent_pen(63);
629636
630   memset(m_alpha_table, 0, 8192);
637   // alpha blending (preliminary)
638   memset(m_alpha_table, 0, 0x2000);
631639
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);
639647
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);
650659
651660   register_video_state();
652661}
r31893r31894
658667   m_layer_enable = 0;
659668   m_layer_bank = 0;
660669   m_rf2_layer_bank = 0;
661
670   m_alpha_enable = 0;
671   m_rowscroll_enable = 0;
672   set_layer_offsets();
673   
662674   m_tilemap_ram_size = 0;
663675   m_palette_ram_size = 0x4000;
664676   m_sprite_ram_size = 0x2000;
r31893r31894
668680   m_palette_ram = auto_alloc_array_clear(machine(), UINT32, m_palette_ram_size/4);
669681   m_sprite_ram = auto_alloc_array_clear(machine(), UINT32, m_sprite_ram_size/4);
670682
671   memset(m_alpha_table, 0, 8192);
683   memset(m_alpha_table, 0, 0x2000);
672684
673685   register_video_state();
674686}
r31893r31894
680692   save_item(NAME(m_layer_enable));
681693   save_item(NAME(m_layer_bank));
682694   save_item(NAME(m_rf2_layer_bank));
695   save_item(NAME(m_alpha_enable));
683696   save_item(NAME(m_rowscroll_enable));
697
684698   save_item(NAME(m_midl_layer_offset));
685699   save_item(NAME(m_fore_layer_offset));
686700   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));
687705
688706   if (m_tilemap_ram != NULL) save_pointer(NAME(m_tilemap_ram), m_tilemap_ram_size/4);
689707   save_pointer(NAME(m_palette_ram), m_palette_ram_size/4);
trunk/src/mame/drivers/seibuspi.c
r31893r31894
904904WRITE8_MEMBER(seibuspi_state::spi_layerbanks_eeprom_w)
905905{
906906   // low bits: tile banks
907   spi_set_layer_banks_w(space, 0, data);
907   rf2_layer_bank_w(space, 0, data);
908908
909909   // high bits: eeprom
910910   eeprom_w(space, 0, data);
r31893r31894
942942
943943READ32_MEMBER(seibuspi_state::ejsakura_keyboard_r)
944944{
945   switch(m_ejsakura_input_port)
945   switch (m_ejsakura_input_port)
946946   {
947947      case 0x01:
948948         return ioport("INPUT01")->read();
r31893r31894
10001000   AM_RANGE(0x00000684, 0x00000687) AM_READ8(sound_fifo_status_r, 0x000000ff)
10011001   AM_RANGE(0x00000688, 0x0000068b) AM_WRITE8(z80_prg_transfer_w, 0x000000ff)
10021002   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)
10041004   AM_RANGE(0x000006d0, 0x000006d3) AM_DEVWRITE8("ds2404", ds2404_device, ds2404_1w_reset_w, 0x000000ff)
10051005   AM_RANGE(0x000006d4, 0x000006d7) AM_DEVWRITE8("ds2404", ds2404_device, ds2404_data_w, 0x000000ff)
10061006   AM_RANGE(0x000006d8, 0x000006db) AM_DEVWRITE8("ds2404", ds2404_device, ds2404_clk_w, 0x000000ff)
r31893r31894
19681968   UINT16 tmp[0x40 / 2], offset;
19691969
19701970   // sprite_reorder() only
1971   for(i = 0; i < memregion("gfx3")->bytes() / 0x40; i++)
1971   for (i = 0; i < memregion("gfx3")->bytes() / 0x40; i++)
19721972   {
19731973      memcpy(tmp, src, 0x40);
19741974
1975      for(j = 0; j < 0x40 / 2; j++)
1975      for (j = 0; j < 0x40 / 2; j++)
19761976      {
19771977         offset = (j >> 1) | (j << 4 & 0x10);
19781978         *src++ = tmp[offset];
r31893r31894
37583758GAME( 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 )
37593759GAME( 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 */
37603760
3761GAME( 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 )
3761GAME( 1996, ejanhs,     0,        spi,     spi_ejanhs,  seibuspi_state, ejanhs,   ROT0,   "Seibu Kaihatsu",                         "E-Jan High School (Japan)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND )
37623762
37633763GAME( 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 )
37643764GAME( 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 )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team