Previous 199869 Revisions Next

r32253 Sunday 21st September, 2014 at 12:18:49 UTC by O. Galibert
zt collisions (nw)
[src/mame/drivers]raiden2.c
[src/mame/includes]raiden2.h

trunk/src/mame/includes/raiden2.h
r32252r32253
4545        cop_spr_off(0),
4646        cop_hit_status(0),
4747        cop_hit_baseadr(0),
48        cop_hit_val_x(0),
49        cop_hit_val_y(0),
50        cop_hit_val_z(0),
51        cop_hit_val_unk(0),
5248        cop_sort_ram_addr(0),
5349        cop_sort_lookup(0),
5450        cop_sort_param(0),
r32252r32253
9490   DECLARE_WRITE16_MEMBER( cop_cmd_w );
9591   DECLARE_READ16_MEMBER ( cop_itoa_digits_r );
9692   DECLARE_READ16_MEMBER ( cop_collision_status_r );
97   DECLARE_READ16_MEMBER (cop_collision_status_y_r);
98   DECLARE_READ16_MEMBER (cop_collision_status_x_r);
99   DECLARE_READ16_MEMBER (cop_collision_status_z_r);
100   DECLARE_READ16_MEMBER (cop_collision_status_unk_r);
93   DECLARE_READ16_MEMBER (cop_collision_status_val_r);
94   DECLARE_READ16_MEMBER (cop_collision_status_stat_r);
10195
10296   DECLARE_READ16_MEMBER ( cop_status_r );
10397   DECLARE_READ16_MEMBER ( cop_dist_r );
r32252r32253
170164   DECLARE_WRITE16_MEMBER( sprite_prot_src_seg_w );
171165   DECLARE_WRITE16_MEMBER( sprite_prot_src_w );
172166   DECLARE_READ16_MEMBER( sprite_prot_src_seg_r );
173   DECLARE_READ16_MEMBER ( sprite_prot_dst1_r );
167   DECLARE_READ16_MEMBER( sprite_prot_dst1_r );
174168   DECLARE_READ16_MEMBER( sprite_prot_maxx_r );
175169   DECLARE_READ16_MEMBER( sprite_prot_off_r );
176170   DECLARE_WRITE16_MEMBER( sprite_prot_dst1_w );
r32252r32253
181175   UINT16 sprite_prot_src_addr[2];
182176
183177   struct colinfo {
184      int x, y, z;
185      int min_x, min_y, min_z, max_x, max_y, max_z;
178      INT16 pos[3];
179      INT8 dx[3];
180      UINT8 size[3];
181      bool allow_swap;
182      UINT16 flags_swap;
183      UINT32 spradr;
186184   };
187185
188186   colinfo cop_collision_info[2];
189187
190188   UINT16 cop_hit_status, cop_hit_baseadr;
191   INT16 cop_hit_val_x, cop_hit_val_y, cop_hit_val_z, cop_hit_val_unk;
189   INT16 cop_hit_val[3];
190   UINT16 cop_hit_val_stat;
192191
193192   void draw_sprites(const rectangle &cliprect);
194193
195   void cop_collision_read_xy(address_space &space, int slot, UINT32 spradr);
194   void cop_collision_read_pos(address_space &space, int slot, UINT32 spradr, bool allow_swap);
196195   void cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr);
197196
198197   DECLARE_WRITE16_MEMBER(cop_hitbox_baseadr_w);
trunk/src/mame/drivers/raiden2.c
r32252r32253
192192   save_item(NAME(cop_spr_off));
193193   save_item(NAME(cop_hit_status));
194194   save_item(NAME(cop_hit_baseadr));
195   save_item(NAME(cop_hit_val_x));
196   save_item(NAME(   cop_hit_val_y));
197   save_item(NAME(cop_hit_val_z));
198   save_item(NAME(cop_hit_val_unk));
195   save_item(NAME(cop_hit_val));
196   save_item(NAME(cop_hit_val_stat));
199197   save_item(NAME(cop_sort_ram_addr));
200198   save_item(NAME(cop_sort_lookup));
201199   save_item(NAME(cop_sort_param));
r32252r32253
209207   save_item(NAME(cop_program));
210208   save_item(NAME(sprite_prot_src_addr));
211209
212//   save_pointer(NAME(cop_collision_info), sizeof(colinfo)*2); // this is illegal
213   save_item(NAME(cop_collision_info[0].x));
214   save_item(NAME(cop_collision_info[0].y));
215   save_item(NAME(cop_collision_info[0].z));
210   save_item(NAME(cop_collision_info[0].pos));
211   save_item(NAME(cop_collision_info[0].dx));
212   save_item(NAME(cop_collision_info[0].size));
213   save_item(NAME(cop_collision_info[0].spradr));
214   save_item(NAME(cop_collision_info[0].allow_swap));
215   save_item(NAME(cop_collision_info[0].flags_swap));
216216
217   save_item(NAME(cop_collision_info[0].min_x));
218   save_item(NAME(cop_collision_info[0].min_y));
219   save_item(NAME(cop_collision_info[0].min_z));
220
221   save_item(NAME(cop_collision_info[0].max_x));
222   save_item(NAME(cop_collision_info[0].max_y));
223   save_item(NAME(cop_collision_info[0].max_z));
224
225   save_item(NAME(cop_collision_info[1].x));
226   save_item(NAME(cop_collision_info[1].y));
227   save_item(NAME(cop_collision_info[1].z));
228
229   save_item(NAME(cop_collision_info[1].min_x));
230   save_item(NAME(cop_collision_info[1].min_y));
231   save_item(NAME(cop_collision_info[1].min_z));
232
233   save_item(NAME(cop_collision_info[1].max_x));
234   save_item(NAME(cop_collision_info[1].max_y));
235   save_item(NAME(cop_collision_info[1].max_z));
236
237//   save_item(NAME(tile_buffer));
238//   save_item(NAME(sprite_buffer));
217   save_item(NAME(cop_collision_info[1].pos));
218   save_item(NAME(cop_collision_info[1].dx));
219   save_item(NAME(cop_collision_info[1].size));
220   save_item(NAME(cop_collision_info[1].spradr));
221   save_item(NAME(cop_collision_info[1].allow_swap));
222   save_item(NAME(cop_collision_info[1].flags_swap));
239223}
240224
241225UINT16 raiden2_state::rps()
r32252r32253
353337   cop_latch_trigger = data;
354338}
355339
356
357
358
359340WRITE16_MEMBER(raiden2_state::m_videoram_private_w)
360341{
361342   //AM_RANGE(0x0d000, 0x0d7ff) AM_RAM_WRITE(raiden2_background_w) AM_SHARE("back_data")
r32252r32253
474455   COMBINE_DATA(&cop_hit_baseadr);
475456}
476457
477void raiden2_state::cop_collision_read_xy(address_space &space, int slot, UINT32 spradr)
458void raiden2_state::cop_collision_read_pos(address_space &space, int slot, UINT32 spradr, bool allow_swap)
478459{
479   cop_collision_info[slot].x = space.read_dword(spradr+4);
480   cop_collision_info[slot].y = space.read_dword(spradr+8);
481   cop_collision_info[slot].z = space.read_dword(spradr+12);
460   cop_collision_info[slot].allow_swap = allow_swap;
461   cop_collision_info[slot].flags_swap = space.read_word(spradr+2);
462   cop_collision_info[slot].spradr = spradr;
463   for(int i=0; i<3; i++)
464      cop_collision_info[slot].pos[i] = space.read_word(spradr+6+4*i);
482465}
483466
484467void raiden2_state::cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr)
485468{
486469   UINT32 hitadr2 = space.read_word(hitadr) | (cop_hit_baseadr << 16);
487470
488   INT8 hx = space.read_byte(hitadr2++);
489   UINT8 hw = space.read_byte(hitadr2++);
490   INT8 hy = space.read_byte(hitadr2++);
491   UINT8 hh = space.read_byte(hitadr2++);
492   INT8 hz = space.read_byte(hitadr2++);
493   UINT8 hd = space.read_byte(hitadr2++);
471   for(int i=0; i<3; i++) {
472      cop_collision_info[slot].dx[i] = space.read_byte(hitadr2++);
473      cop_collision_info[slot].size[i] = space.read_byte(hitadr2++);
474   }
494475
495   cop_collision_info[slot].min_x = (cop_collision_info[slot].x >> 16) + hx;
496   cop_collision_info[slot].min_y = (cop_collision_info[slot].y >> 16) + hy;
497   cop_collision_info[slot].min_z = (cop_collision_info[slot].z >> 16) + hz;
498   cop_collision_info[slot].max_x = cop_collision_info[slot].min_x + hw;
499   cop_collision_info[slot].max_y = cop_collision_info[slot].min_y + hh;
500   cop_collision_info[slot].max_z = cop_collision_info[slot].min_z + hd;
501
502476   cop_hit_status = 7;
503477
504   /* outbound X check */
505   if(cop_collision_info[0].max_x >= cop_collision_info[1].min_x && cop_collision_info[0].min_x <= cop_collision_info[1].max_x)
506      cop_hit_status &= ~1;
478   for(int i=0; i<3; i++) {
479      int min[2], max[2];
480      for(int j=0; j<2; j++) {
481         min[j] = cop_collision_info[j].pos[i];
482         if(cop_collision_info[j].allow_swap && (cop_collision_info[j].flags_swap & (1 << i)))
483            min[j] -= cop_collision_info[j].dx[i];
484         else
485            min[j] += cop_collision_info[j].dx[i];
486         max[j] = min[j] + cop_collision_info[j].size[i];
487      }
488      if(max[0] >= min[1] && min[0] <= max[1])
489         cop_hit_status &= ~(1 << i);
490      cop_hit_val[i] = cop_collision_info[0].pos[i] - cop_collision_info[1].pos[i];
491   }
507492
508   /* outbound Y check */
509   if(cop_collision_info[0].max_y >= cop_collision_info[1].min_y && cop_collision_info[0].min_y <= cop_collision_info[1].max_y)
510      cop_hit_status &= ~2;
511
512   /* outbound Z check */
513   if(cop_collision_info[0].max_z >= cop_collision_info[1].min_z && cop_collision_info[0].min_z <= cop_collision_info[1].max_z)
514      cop_hit_status &= ~4;
515
516   cop_hit_val_x = (cop_collision_info[0].x - cop_collision_info[1].x) >> 16;
517   cop_hit_val_y = (cop_collision_info[0].y - cop_collision_info[1].y) >> 16;
518   cop_hit_val_z = (cop_collision_info[0].z - cop_collision_info[1].z) >> 16;
519   cop_hit_val_unk = cop_hit_status; // TODO: there's also bit 2 and 3 triggered in the tests, no known meaning
493   cop_hit_val_stat = cop_hit_status ? 0xffff : 0x0000;
520494}
521495
522496WRITE16_MEMBER(raiden2_state::cop_cmd_w)
r32252r32253
708682
709683   case 0xa100:
710684   case 0xa180:
711      cop_collision_read_xy(space, 0, cop_regs[0]);
685      cop_collision_read_pos(space, 0, cop_regs[0], data & 0x0080);
712686      break;
713687
714688   case 0xa900:
715689   case 0xa980:
716      cop_collision_read_xy(space, 1, cop_regs[1]);
690      cop_collision_read_pos(space, 1, cop_regs[1], data & 0x0080);
717691      break;
718692
719   case 0xb100:
693   case 0xb100: {
720694      cop_collision_update_hitbox(space, 0, cop_regs[2]);
721695      break;
696   }
722697
723   case 0xb900:
698   case 0xb900: {
724699      cop_collision_update_hitbox(space, 1, cop_regs[3]);
725700      break;
701   }
726702
727703   default:
728704      logerror("pcall %04x (%04x:%04x) [%x %x %x %x]\n", data, rps(), rpc(), cop_regs[0], cop_regs[1], cop_regs[2], cop_regs[3]);
r32252r32253
13771353   cop_spr_off = data;
13781354}
13791355
1380READ16_MEMBER(raiden2_state::cop_collision_status_y_r)
1356READ16_MEMBER(raiden2_state::cop_collision_status_val_r)
13811357{
1382   return cop_hit_val_y;
1358   return cop_hit_val[offset];
13831359}
13841360
1385READ16_MEMBER(raiden2_state::cop_collision_status_x_r)
1361READ16_MEMBER(raiden2_state::cop_collision_status_stat_r)
13861362{
1387   return cop_hit_val_x;
1363   return cop_hit_val_stat;
13881364}
13891365
1390READ16_MEMBER(raiden2_state::cop_collision_status_z_r)
1391{
1392   return cop_hit_val_z;
1393}
1394
1395READ16_MEMBER(raiden2_state::cop_collision_status_unk_r)
1396{
1397   return cop_hit_val_unk;
1398}
1399
14001366WRITE16_MEMBER(raiden2_state::cop_sort_lookup_hi_w)
14011367{
14021368   cop_sort_lookup = (cop_sort_lookup&0x0000ffff)|(data<<16);
r32252r32253
15031469   AM_RANGE(0x004c0, 0x004c9) AM_READWRITE(cop_reg_low_r, cop_reg_low_w)
15041470   AM_RANGE(0x00500, 0x00505) AM_WRITE(cop_cmd_w)
15051471   AM_RANGE(0x00580, 0x00581) AM_READ(cop_collision_status_r)
1506   AM_RANGE(0x00582, 0x00583) AM_READ(cop_collision_status_y_r)
1507   AM_RANGE(0x00584, 0x00585) AM_READ(cop_collision_status_x_r)
1508   AM_RANGE(0x00586, 0x00587) AM_READ(cop_collision_status_z_r)
1509   AM_RANGE(0x00588, 0x00589) AM_READ(cop_collision_status_unk_r)
1472   AM_RANGE(0x00582, 0x00587) AM_READ(cop_collision_status_val_r)
1473   AM_RANGE(0x00588, 0x00589) AM_READ(cop_collision_status_stat_r)
15101474   AM_RANGE(0x00590, 0x00599) AM_READ(cop_itoa_digits_r)
15111475   AM_RANGE(0x005b0, 0x005b1) AM_READ(cop_status_r)
15121476   AM_RANGE(0x005b2, 0x005b3) AM_READ(cop_dist_r)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team