Previous 199869 Revisions Next

r31924 Friday 5th September, 2014 at 18:02:07 UTC by O. Galibert
raiden2: Does it blend? (nw)
[src/mame/drivers]raiden2.c
[src/mame/includes]raiden2.h

trunk/src/mame/drivers/raiden2.c
r31923r31924
168168   return m_maincpu->state_int(NEC_IP);
169169}
170170
171int cnt=0, ccol = 0x6f;
172
171173WRITE16_MEMBER(raiden2_state::cop_pgm_data_w)
172174{
173175   assert(ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15);
r31923r31924
799801
800802/* SPRITE DRAWING (move to video file) */
801803
802void raiden2_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &priority, const rectangle &cliprect)
804void raiden2_state::draw_sprites(const rectangle &cliprect)
803805{
804   UINT16 *source = sprites;
806   UINT16 *source = sprites + sprites_cur_start/2;
807   sprite_buffer.fill(0xf, cliprect);
805808
806809   gfx_element *gfx = m_gfxdecode->gfx(2);
807810
r31923r31924
812815     06 yyyy yyyy yyyy yyyy   y = ypos
813816    */
814817
815   while( source<sprites + sprites_cur_start/2 ){
818   while( source > sprites ){
816819      int tile_number = source[1];
817820      int sx = source[2];
818821      int sy = source[3];
r31923r31924
821824      int ytlim, xtlim;
822825      int xflip, yflip;
823826      int xstep, ystep;
824      int pri, pri_mask;
827      int pri;
825828
826829      ytlim = (source[0] >> 12) & 0x7;
827830      xtlim = (source[0] >> 8 ) & 0x7;
r31923r31924
831834
832835      colr = source[0] & 0x3f;
833836
834      static const UINT32 pri_masks[5] = { 0xfffe, 0xfffc, 0xfff0, 0xff00 };
835837      pri = (source[0] >> 6) & 3;
836      pri_mask = pri_masks[pri];
837838
839      colr |= pri << (14-4);
840
838841      ytlim += 1;
839842      xtlim += 1;
840843
r31923r31924
864867
865868
866869
867                  gfx->prio_transpen(
868                  bitmap,
870                  gfx->transpen(
871                  sprite_buffer,
869872                  cliprect,
870873                  tile_number,
871874                  colr,
872875                  yflip,xflip,
873                  (sx+xstep*xtiles)&ZEROTEAM_MASK_X,(sy+ystep*ytiles)&ZEROTEAM_MASK_Y, priority, pri_mask, 15);
876                  (sx+xstep*xtiles)&ZEROTEAM_MASK_X,(sy+ystep*ytiles)&ZEROTEAM_MASK_Y, 15);
874877
875878
876                  gfx->prio_transpen(
877                  bitmap,
879                  gfx->transpen(
880                  sprite_buffer,
878881                  cliprect,
879882                  tile_number,
880883                  colr,
881884                  yflip,xflip,
882                  ((sx+xstep*xtiles)&ZEROTEAM_MASK_X)-0x200,(sy+ystep*ytiles)&ZEROTEAM_MASK_Y, priority, pri_mask, 15);
885                  ((sx+xstep*xtiles)&ZEROTEAM_MASK_X)-0x200,(sy+ystep*ytiles)&ZEROTEAM_MASK_Y, 15);
883886
884887
885                  gfx->prio_transpen(
886                  bitmap,
888                  gfx->transpen(
889                  sprite_buffer,
887890                  cliprect,
888891                  tile_number,
889892                  colr,
890893                  yflip,xflip,
891                  (sx+xstep*xtiles)&ZEROTEAM_MASK_X,((sy+ystep*ytiles)&ZEROTEAM_MASK_Y)-0x200, priority, pri_mask, 15);
894                  (sx+xstep*xtiles)&ZEROTEAM_MASK_X,((sy+ystep*ytiles)&ZEROTEAM_MASK_Y)-0x200, 15);
892895
893896
894                  gfx->prio_transpen(
895                  bitmap,
897                  gfx->transpen(
898                  sprite_buffer,
896899                  cliprect,
897900                  tile_number,
898901                  colr,
899902                  yflip,xflip,
900                  ((sx+xstep*xtiles)&ZEROTEAM_MASK_X)-0x200,((sy+ystep*ytiles)&ZEROTEAM_MASK_Y)-0x200, priority, pri_mask, 15);
903                  ((sx+xstep*xtiles)&ZEROTEAM_MASK_X)-0x200,((sy+ystep*ytiles)&ZEROTEAM_MASK_Y)-0x200, 15);
901904
902905
903906            tile_number++;
904907         }
905908      }
906909
907      source += 4;
910      source -= 4;
908911   }
909912
910913}
r31923r31924
10621065   background_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_back_tile_info),this), TILEMAP_SCAN_ROWS, 16,16, 32,32 );
10631066   midground_layer  = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_mid_tile_info),this),  TILEMAP_SCAN_ROWS, 16,16, 32,32 );
10641067   foreground_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_fore_tile_info),this), TILEMAP_SCAN_ROWS, 16,16, 32,32 );
1065
1066   midground_layer->set_transparent_pen(15);
1067   foreground_layer->set_transparent_pen(15);
1068   text_layer->set_transparent_pen(15);
10691068}
10701069
10711070/* screen_update_raiden2 (move to video file) */
10721071
1073UINT32 raiden2_state::screen_update_raiden2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
1072void raiden2_state::blend_layer(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind16 &source, UINT16 layer)
10741073{
1074   const UINT8 alpha_active[0x10] = { // MSB first
1075      //00    08    10    18    20    28    30    38    40    48    50    58    60    68    70    78
1076      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x00
1077   };
1078
1079   const pen_t *pens = &m_palette->pen(0);
1080   layer <<= 14;
1081   for(int y = cliprect.min_y; y <= cliprect.max_y; y++) {
1082      const UINT16 *src = &source.pix16(y, cliprect.min_x);
1083      UINT32 *dst = &bitmap.pix32(y, cliprect.min_x);
1084      for(int x = cliprect.min_x; x <= cliprect.max_x; x++) {
1085         UINT16 val = *src++;
1086         if((val & 0xc000) == layer && (val & 0x000f) != 0x000f) {
1087            val &= 0x07ff;
1088            // - 04 40 38 50 25 6b
1089            // + 3f 5c 68 6f
1090            int page = val >> 4;
1091            if(((alpha_active[page >> 3] & (0x80 >> (page & 7))) || page == ccol) && (val & 0xf) == 0xe)
1092               *dst = alpha_blend_r32(*dst, pens[val], 0x7f);
1093            else
1094               *dst = pens[val];
1095         }
1096         dst++;
1097      }
1098   }
1099}
1100
1101void raiden2_state::tilemap_draw_and_blend(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tilemap)
1102{
1103   tilemap->draw(screen, tile_buffer, cliprect, 0, 0);
1104   blend_layer(bitmap, cliprect, tile_buffer, 0);
1105}
1106
1107UINT32 raiden2_state::screen_update_raiden2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
1108{
1109   cnt++;
1110   int ocol = ccol;
1111
1112   if((cnt & 3) == 0) {
1113      if (machine().input().code_pressed(KEYCODE_Q))
1114         ccol--;
1115      if (machine().input().code_pressed(KEYCODE_W))
1116         ccol++;
1117   }
1118   ccol &= 0x7f;
1119   if(ccol != ocol)
1120      popmessage("%02x", ccol);
1121
10751122   bitmap.fill(m_palette->black_pen(), cliprect);
1076   screen.priority().fill(0, cliprect);
1123   draw_sprites(cliprect);
10771124
1125   blend_layer(bitmap, cliprect, sprite_buffer, 0);
1126
10781127   if (!(raiden2_tilemap_enable & 1))
1079      background_layer->draw(screen, bitmap, cliprect, 0, 1);
1128      tilemap_draw_and_blend(screen, bitmap, cliprect, background_layer);
10801129
1130   blend_layer(bitmap, cliprect, sprite_buffer, 1);
1131
10811132   if (!(raiden2_tilemap_enable & 2))
1082      midground_layer->draw(screen, bitmap, cliprect, 0, 2);
1133      tilemap_draw_and_blend(screen, bitmap, cliprect, midground_layer);
10831134
1135   blend_layer(bitmap, cliprect, sprite_buffer, 2);
1136
10841137   if (!(raiden2_tilemap_enable & 4))
1085      foreground_layer->draw(screen, bitmap, cliprect, 0, 4);
1138      tilemap_draw_and_blend(screen, bitmap, cliprect, foreground_layer);
10861139
1140   blend_layer(bitmap, cliprect, sprite_buffer, 3);
1141
10871142   if (!(raiden2_tilemap_enable & 8))
1088      text_layer->draw(screen, bitmap, cliprect, 0, 8);
1143      tilemap_draw_and_blend(screen, bitmap, cliprect, text_layer);
10891144
1090   if (!(raiden2_tilemap_enable & 0x10))
1091      draw_sprites(bitmap, screen.priority(), cliprect);
1092
10931145   return 0;
10941146}
10951147
r31923r31924
19401992static GFXDECODE_START( raiden2 )
19411993   GFXDECODE_ENTRY( "gfx1", 0x00000, raiden2_charlayout,   0x700, 128 )
19421994   GFXDECODE_ENTRY( "gfx2", 0x00000, raiden2_tilelayout,   0x400, 128 )
1943   GFXDECODE_ENTRY( "gfx3", 0x00000, raiden2_spritelayout, 0x000, 128 )
1995   GFXDECODE_ENTRY( "gfx3", 0x00000, raiden2_spritelayout, 0x000, 4096 ) // really 128, but using the top bits for priority
19441996GFXDECODE_END
19451997
19461998
r31923r31924
19652017   MCFG_SCREEN_SIZE(44*8, 34*8)
19662018   MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0, 30*8-1)
19672019   MCFG_SCREEN_UPDATE_DRIVER(raiden2_state, screen_update_raiden2)
1968   MCFG_SCREEN_PALETTE("palette")
19692020
19702021   MCFG_GFXDECODE_ADD("gfxdecode", "palette", raiden2)
19712022   MCFG_PALETTE_ADD("palette", 2048)
r31923r31924
20232074//  MCFG_SCREEN_REFRESH_RATE(55.47)    /* verified on pcb */
20242075   MCFG_SCREEN_RAW_PARAMS(XTAL_32MHz/4,546,0,40*8,264,0,32*8) /* hand-tuned to match ~55.47 */
20252076   MCFG_SCREEN_UPDATE_DRIVER(raiden2_state, screen_update_raiden2)
2026   MCFG_SCREEN_PALETTE("palette")
20272077
20282078   MCFG_GFXDECODE_ADD("gfxdecode", "palette", raiden2)
20292079   MCFG_PALETTE_ADD("palette", 2048)
trunk/src/mame/includes/raiden2.h
r31923r31924
55public:
66   raiden2_state(const machine_config &mconfig, device_type type, const char *tag)
77      : driver_device(mconfig, type, tag),
8         back_data(*this, "back_data"),
9         fore_data(*this, "fore_data"),
10         mid_data(*this, "mid_data"),
11         text_data(*this, "text_data"),
12         sprites(*this, "sprites") ,
13      m_maincpu(*this, "maincpu"),
14      m_seibu_sound(*this, "seibu_sound"),
15      m_gfxdecode(*this, "gfxdecode"),
16      m_palette(*this, "palette") { }
8        back_data(*this, "back_data"),
9        fore_data(*this, "fore_data"),
10        mid_data(*this, "mid_data"),
11        text_data(*this, "text_data"),
12        sprites(*this, "sprites") ,
13        m_maincpu(*this, "maincpu"),
14        m_seibu_sound(*this, "seibu_sound"),
15        m_gfxdecode(*this, "gfxdecode"),
16        m_palette(*this, "palette"),
17        tile_buffer(320, 256),
18        sprite_buffer(320, 256)
19   { }
1720
1821   required_shared_ptr<UINT16> back_data,fore_data,mid_data, text_data, sprites;
1922   required_device<cpu_device> m_maincpu;
r31923r31924
113116   UINT16 cop_angle_target;
114117   UINT16 cop_angle_step;
115118
119   bitmap_ind16 tile_buffer, sprite_buffer;
120
116121   DECLARE_WRITE16_MEMBER( sprite_prot_x_w );
117122   DECLARE_WRITE16_MEMBER( sprite_prot_y_w );
118123   DECLARE_WRITE16_MEMBER( sprite_prot_src_seg_w );
r31923r31924
139144   UINT16 cop_hit_status;
140145   INT16 cop_hit_val_x,cop_hit_val_y,cop_hit_val_z,cop_hit_val_unk;
141146
142   void draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &priority, const rectangle &cliprect);
147   void draw_sprites(const rectangle &cliprect);
143148   UINT8 cop_calculate_collsion_detection();
144149   void cop_take_hit_box_params(UINT8 offs);
145150
r31923r31924
166171   DECLARE_MACHINE_RESET(zeroteam);
167172   DECLARE_MACHINE_RESET(xsedae);
168173   DECLARE_MACHINE_RESET(raidendx);
169   UINT32 screen_update_raiden2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
174   UINT32 screen_update_raiden2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
170175   INTERRUPT_GEN_MEMBER(raiden2_interrupt);
171176   UINT16 rps();
172177   UINT16 rpc();
173178   const UINT8 fade_table(int v);
174179   void combine32(UINT32 *val, int offset, UINT16 data, UINT16 mem_mask);
175180   void sprcpt_init(void);
181
182   void blend_layer(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind16 &source, UINT16 layer);
183   void tilemap_draw_and_blend(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tilemap);
184
176185};
177186
178187/*----------- defined in machine/r2crypt.c -----------*/

Previous 199869 Revisions Next


© 1997-2024 The MAME Team