trunk/src/mame/includes/raiden2.h
| r17800 | r17801 | |
| 33 | 33 | DECLARE_WRITE16_MEMBER( cop_cmd_w ); |
| 34 | 34 | DECLARE_READ16_MEMBER ( cop_itoa_digits_r ); |
| 35 | 35 | DECLARE_READ16_MEMBER ( cop_collision_status_r ); |
| 36 | DECLARE_READ16_MEMBER (cop_collision_status_y_r); |
| 37 | DECLARE_READ16_MEMBER (cop_collision_status_x_r); |
| 38 | DECLARE_READ16_MEMBER (cop_collision_status_z_r); |
| 39 | DECLARE_READ16_MEMBER (cop_collision_status_unk_r); |
| 40 | |
| 36 | 41 | DECLARE_READ16_MEMBER ( cop_status_r ); |
| 37 | 42 | DECLARE_READ16_MEMBER ( cop_dist_r ); |
| 38 | 43 | DECLARE_READ16_MEMBER ( cop_angle_r ); |
| r17800 | r17801 | |
| 110 | 115 | int x,y; |
| 111 | 116 | int min_x,min_y,max_x,max_y; |
| 112 | 117 | UINT16 hitbox; |
| 118 | UINT16 hitbox_x,hitbox_y; |
| 113 | 119 | }cop_collision_info[2]; |
| 114 | 120 | |
| 115 | 121 | UINT16 cop_hit_status; |
| 122 | INT16 cop_hit_val_x,cop_hit_val_y,cop_hit_val_z,cop_hit_val_unk; |
| 116 | 123 | |
| 117 | 124 | void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ,int pri_mask ); |
| 118 | 125 | UINT8 cop_calculate_collsion_detection(running_machine &machine); |
| 126 | void cop_take_hit_box_params(UINT8 offs); |
| 119 | 127 | |
| 120 | 128 | DECLARE_DRIVER_INIT(raidendx); |
| 121 | 129 | DECLARE_DRIVER_INIT(xsedae); |
trunk/src/mame/drivers/raiden2.c
| r17800 | r17801 | |
| 450 | 450 | cop_regs[offset] = (cop_regs[offset] & ~UINT32(mem_mask)) | (data & mem_mask); |
| 451 | 451 | } |
| 452 | 452 | |
| 453 | void raiden2_state::cop_take_hit_box_params(UINT8 offs) |
| 454 | { |
| 455 | INT16 start_x,start_y,end_x,end_y; |
| 456 | |
| 457 | start_x = INT8(cop_collision_info[offs].hitbox_x); |
| 458 | start_y = INT8(cop_collision_info[offs].hitbox_y); |
| 459 | |
| 460 | end_x = INT8(cop_collision_info[offs].hitbox_x >> 8); |
| 461 | end_y = INT8(cop_collision_info[offs].hitbox_y >> 8); |
| 462 | |
| 463 | cop_collision_info[offs].min_x = start_x + (cop_collision_info[offs].x >> 16); |
| 464 | cop_collision_info[offs].min_y = start_y + (cop_collision_info[offs].y >> 16); |
| 465 | cop_collision_info[offs].max_x = end_x + (cop_collision_info[offs].x >> 16); |
| 466 | cop_collision_info[offs].max_y = end_y + (cop_collision_info[offs].y >> 16); |
| 467 | } |
| 468 | |
| 469 | |
| 453 | 470 | UINT8 raiden2_state::cop_calculate_collsion_detection(running_machine &machine) |
| 454 | 471 | { |
| 455 | 472 | static UINT8 res; |
| r17800 | r17801 | |
| 458 | 475 | |
| 459 | 476 | /* outbound X check */ |
| 460 | 477 | 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) |
| 461 | | res &= ~1; |
| 478 | res &= ~2; |
| 462 | 479 | |
| 463 | 480 | /* outbound Y check */ |
| 464 | 481 | 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) |
| 465 | | res &= ~2; |
| 482 | res &= ~1; |
| 466 | 483 | |
| 467 | | /* TODO: special collision detection for Zero Team */ |
| 484 | cop_hit_val_x = (cop_collision_info[0].x - cop_collision_info[1].x) >> 16; |
| 485 | cop_hit_val_y = (cop_collision_info[0].y - cop_collision_info[1].y) >> 16; |
| 486 | cop_hit_val_z = 1; |
| 487 | cop_hit_val_unk = res; // TODO: there's also bit 2 and 3 triggered in the tests, no known meaning |
| 468 | 488 | |
| 489 | |
| 469 | 490 | return res; |
| 470 | 491 | } |
| 471 | 492 | |
| r17800 | r17801 | |
| 570 | 591 | break; |
| 571 | 592 | |
| 572 | 593 | case 0xa100: |
| 594 | case 0xa180: |
| 573 | 595 | cop_collision_info[0].y = (space.read_dword(cop_regs[0]+4)); |
| 574 | 596 | cop_collision_info[0].x = (space.read_dword(cop_regs[0]+8)); |
| 575 | 597 | break; |
| 576 | 598 | |
| 577 | 599 | case 0xa900: |
| 600 | case 0xa980: |
| 578 | 601 | cop_collision_info[1].y = (space.read_dword(cop_regs[1]+4)); |
| 579 | 602 | cop_collision_info[1].x = (space.read_dword(cop_regs[1]+8)); |
| 580 | 603 | break; |
| 581 | 604 | |
| 582 | 605 | case 0xb100: |
| 583 | | /* Take hitbox param, TODO */ |
| 584 | 606 | cop_collision_info[0].hitbox = space.read_word(cop_regs[2]); |
| 607 | cop_collision_info[0].hitbox_y = space.read_word((cop_regs[2]&0xffff0000)|(cop_collision_info[0].hitbox)); |
| 608 | cop_collision_info[0].hitbox_x = space.read_word(((cop_regs[2]&0xffff0000)|(cop_collision_info[0].hitbox))+2); |
| 585 | 609 | |
| 586 | | cop_collision_info[0].min_x = cop_collision_info[0].x + (0 << 16); |
| 587 | | cop_collision_info[0].min_y = cop_collision_info[0].y + (0 << 16); |
| 588 | | cop_collision_info[0].max_x = cop_collision_info[0].x + (0x10 << 16); |
| 589 | | cop_collision_info[0].max_y = cop_collision_info[0].y + (0x10 << 16); |
| 590 | | |
| 591 | 610 | /* do the math */ |
| 611 | cop_take_hit_box_params(0); |
| 592 | 612 | cop_hit_status = cop_calculate_collsion_detection(space.machine()); |
| 593 | 613 | break; |
| 594 | 614 | |
| 595 | 615 | case 0xb900: |
| 596 | | /* Take hitbox param, TODO */ |
| 597 | 616 | cop_collision_info[1].hitbox = space.read_word(cop_regs[3]); |
| 617 | cop_collision_info[1].hitbox_y = space.read_word((cop_regs[3]&0xffff0000)|(cop_collision_info[1].hitbox)); |
| 618 | cop_collision_info[1].hitbox_x = space.read_word(((cop_regs[3]&0xffff0000)|(cop_collision_info[1].hitbox))+2); |
| 598 | 619 | |
| 599 | | cop_collision_info[1].min_x = cop_collision_info[1].x + (0 << 16); |
| 600 | | cop_collision_info[1].min_y = cop_collision_info[1].y + (0 << 16); |
| 601 | | cop_collision_info[1].max_x = cop_collision_info[1].x + (0x10 << 16); |
| 602 | | cop_collision_info[1].max_y = cop_collision_info[1].y + (0x10 << 16); |
| 603 | | |
| 604 | 620 | /* do the math */ |
| 621 | cop_take_hit_box_params(1); |
| 605 | 622 | cop_hit_status = cop_calculate_collsion_detection(space.machine()); |
| 606 | 623 | break; |
| 607 | 624 | |
| r17800 | r17801 | |
| 1181 | 1198 | dst2 = data; |
| 1182 | 1199 | } |
| 1183 | 1200 | |
| 1201 | READ16_MEMBER(raiden2_state::cop_collision_status_y_r) |
| 1202 | { |
| 1203 | return cop_hit_val_y; |
| 1204 | } |
| 1205 | |
| 1206 | READ16_MEMBER(raiden2_state::cop_collision_status_x_r) |
| 1207 | { |
| 1208 | return cop_hit_val_x; |
| 1209 | } |
| 1210 | |
| 1211 | READ16_MEMBER(raiden2_state::cop_collision_status_z_r) |
| 1212 | { |
| 1213 | return cop_hit_val_z; |
| 1214 | } |
| 1215 | |
| 1216 | READ16_MEMBER(raiden2_state::cop_collision_status_unk_r) |
| 1217 | { |
| 1218 | return cop_hit_val_unk; |
| 1219 | } |
| 1220 | |
| 1184 | 1221 | /* MEMORY MAPS */ |
| 1185 | 1222 | static ADDRESS_MAP_START( raiden2_cop_mem, AS_PROGRAM, 16, raiden2_state ) |
| 1186 | 1223 | // AM_RANGE(0x0041c, 0x0041d) AM_WRITENOP // angle compare (for 0x6200 COP macro) |
| r17800 | r17801 | |
| 1210 | 1247 | AM_RANGE(0x004c0, 0x004c9) AM_READWRITE(cop_reg_low_r, cop_reg_low_w) |
| 1211 | 1248 | AM_RANGE(0x00500, 0x00505) AM_WRITE(cop_cmd_w) |
| 1212 | 1249 | AM_RANGE(0x00580, 0x00581) AM_READ(cop_collision_status_r) |
| 1213 | | // AM_RANGE(0x00588, 0x00589) AM_READ(cop_collision_status2_r) // used by Zero Team (only this, why?) |
| 1250 | AM_RANGE(0x00582, 0x00583) AM_READ(cop_collision_status_y_r) |
| 1251 | AM_RANGE(0x00584, 0x00585) AM_READ(cop_collision_status_x_r) |
| 1252 | AM_RANGE(0x00586, 0x00587) AM_READ(cop_collision_status_z_r) |
| 1253 | AM_RANGE(0x00588, 0x00589) AM_READ(cop_collision_status_unk_r) |
| 1214 | 1254 | AM_RANGE(0x00590, 0x00599) AM_READ(cop_itoa_digits_r) |
| 1215 | 1255 | AM_RANGE(0x005b0, 0x005b1) AM_READ(cop_status_r) |
| 1216 | 1256 | AM_RANGE(0x005b2, 0x005b3) AM_READ(cop_dist_r) |