trunk/src/mame/includes/raiden2.h
| r32252 | r32253 | |
| 45 | 45 | cop_spr_off(0), |
| 46 | 46 | cop_hit_status(0), |
| 47 | 47 | 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), |
| 52 | 48 | cop_sort_ram_addr(0), |
| 53 | 49 | cop_sort_lookup(0), |
| 54 | 50 | cop_sort_param(0), |
| r32252 | r32253 | |
| 94 | 90 | DECLARE_WRITE16_MEMBER( cop_cmd_w ); |
| 95 | 91 | DECLARE_READ16_MEMBER ( cop_itoa_digits_r ); |
| 96 | 92 | 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); |
| 101 | 95 | |
| 102 | 96 | DECLARE_READ16_MEMBER ( cop_status_r ); |
| 103 | 97 | DECLARE_READ16_MEMBER ( cop_dist_r ); |
| r32252 | r32253 | |
| 170 | 164 | DECLARE_WRITE16_MEMBER( sprite_prot_src_seg_w ); |
| 171 | 165 | DECLARE_WRITE16_MEMBER( sprite_prot_src_w ); |
| 172 | 166 | DECLARE_READ16_MEMBER( sprite_prot_src_seg_r ); |
| 173 | | DECLARE_READ16_MEMBER ( sprite_prot_dst1_r ); |
| 167 | DECLARE_READ16_MEMBER( sprite_prot_dst1_r ); |
| 174 | 168 | DECLARE_READ16_MEMBER( sprite_prot_maxx_r ); |
| 175 | 169 | DECLARE_READ16_MEMBER( sprite_prot_off_r ); |
| 176 | 170 | DECLARE_WRITE16_MEMBER( sprite_prot_dst1_w ); |
| r32252 | r32253 | |
| 181 | 175 | UINT16 sprite_prot_src_addr[2]; |
| 182 | 176 | |
| 183 | 177 | 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; |
| 186 | 184 | }; |
| 187 | 185 | |
| 188 | 186 | colinfo cop_collision_info[2]; |
| 189 | 187 | |
| 190 | 188 | 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; |
| 192 | 191 | |
| 193 | 192 | void draw_sprites(const rectangle &cliprect); |
| 194 | 193 | |
| 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); |
| 196 | 195 | void cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr); |
| 197 | 196 | |
| 198 | 197 | DECLARE_WRITE16_MEMBER(cop_hitbox_baseadr_w); |
trunk/src/mame/drivers/raiden2.c
| r32252 | r32253 | |
| 192 | 192 | save_item(NAME(cop_spr_off)); |
| 193 | 193 | save_item(NAME(cop_hit_status)); |
| 194 | 194 | 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)); |
| 199 | 197 | save_item(NAME(cop_sort_ram_addr)); |
| 200 | 198 | save_item(NAME(cop_sort_lookup)); |
| 201 | 199 | save_item(NAME(cop_sort_param)); |
| r32252 | r32253 | |
| 209 | 207 | save_item(NAME(cop_program)); |
| 210 | 208 | save_item(NAME(sprite_prot_src_addr)); |
| 211 | 209 | |
| 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)); |
| 216 | 216 | |
| 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)); |
| 239 | 223 | } |
| 240 | 224 | |
| 241 | 225 | UINT16 raiden2_state::rps() |
| r32252 | r32253 | |
| 353 | 337 | cop_latch_trigger = data; |
| 354 | 338 | } |
| 355 | 339 | |
| 356 | | |
| 357 | | |
| 358 | | |
| 359 | 340 | WRITE16_MEMBER(raiden2_state::m_videoram_private_w) |
| 360 | 341 | { |
| 361 | 342 | //AM_RANGE(0x0d000, 0x0d7ff) AM_RAM_WRITE(raiden2_background_w) AM_SHARE("back_data") |
| r32252 | r32253 | |
| 474 | 455 | COMBINE_DATA(&cop_hit_baseadr); |
| 475 | 456 | } |
| 476 | 457 | |
| 477 | | void raiden2_state::cop_collision_read_xy(address_space &space, int slot, UINT32 spradr) |
| 458 | void raiden2_state::cop_collision_read_pos(address_space &space, int slot, UINT32 spradr, bool allow_swap) |
| 478 | 459 | { |
| 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); |
| 482 | 465 | } |
| 483 | 466 | |
| 484 | 467 | void raiden2_state::cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr) |
| 485 | 468 | { |
| 486 | 469 | UINT32 hitadr2 = space.read_word(hitadr) | (cop_hit_baseadr << 16); |
| 487 | 470 | |
| 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 | } |
| 494 | 475 | |
| 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 | | |
| 502 | 476 | cop_hit_status = 7; |
| 503 | 477 | |
| 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 | } |
| 507 | 492 | |
| 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; |
| 520 | 494 | } |
| 521 | 495 | |
| 522 | 496 | WRITE16_MEMBER(raiden2_state::cop_cmd_w) |
| r32252 | r32253 | |
| 708 | 682 | |
| 709 | 683 | case 0xa100: |
| 710 | 684 | case 0xa180: |
| 711 | | cop_collision_read_xy(space, 0, cop_regs[0]); |
| 685 | cop_collision_read_pos(space, 0, cop_regs[0], data & 0x0080); |
| 712 | 686 | break; |
| 713 | 687 | |
| 714 | 688 | case 0xa900: |
| 715 | 689 | case 0xa980: |
| 716 | | cop_collision_read_xy(space, 1, cop_regs[1]); |
| 690 | cop_collision_read_pos(space, 1, cop_regs[1], data & 0x0080); |
| 717 | 691 | break; |
| 718 | 692 | |
| 719 | | case 0xb100: |
| 693 | case 0xb100: { |
| 720 | 694 | cop_collision_update_hitbox(space, 0, cop_regs[2]); |
| 721 | 695 | break; |
| 696 | } |
| 722 | 697 | |
| 723 | | case 0xb900: |
| 698 | case 0xb900: { |
| 724 | 699 | cop_collision_update_hitbox(space, 1, cop_regs[3]); |
| 725 | 700 | break; |
| 701 | } |
| 726 | 702 | |
| 727 | 703 | default: |
| 728 | 704 | 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]); |
| r32252 | r32253 | |
| 1377 | 1353 | cop_spr_off = data; |
| 1378 | 1354 | } |
| 1379 | 1355 | |
| 1380 | | READ16_MEMBER(raiden2_state::cop_collision_status_y_r) |
| 1356 | READ16_MEMBER(raiden2_state::cop_collision_status_val_r) |
| 1381 | 1357 | { |
| 1382 | | return cop_hit_val_y; |
| 1358 | return cop_hit_val[offset]; |
| 1383 | 1359 | } |
| 1384 | 1360 | |
| 1385 | | READ16_MEMBER(raiden2_state::cop_collision_status_x_r) |
| 1361 | READ16_MEMBER(raiden2_state::cop_collision_status_stat_r) |
| 1386 | 1362 | { |
| 1387 | | return cop_hit_val_x; |
| 1363 | return cop_hit_val_stat; |
| 1388 | 1364 | } |
| 1389 | 1365 | |
| 1390 | | READ16_MEMBER(raiden2_state::cop_collision_status_z_r) |
| 1391 | | { |
| 1392 | | return cop_hit_val_z; |
| 1393 | | } |
| 1394 | | |
| 1395 | | READ16_MEMBER(raiden2_state::cop_collision_status_unk_r) |
| 1396 | | { |
| 1397 | | return cop_hit_val_unk; |
| 1398 | | } |
| 1399 | | |
| 1400 | 1366 | WRITE16_MEMBER(raiden2_state::cop_sort_lookup_hi_w) |
| 1401 | 1367 | { |
| 1402 | 1368 | cop_sort_lookup = (cop_sort_lookup&0x0000ffff)|(data<<16); |
| r32252 | r32253 | |
| 1503 | 1469 | AM_RANGE(0x004c0, 0x004c9) AM_READWRITE(cop_reg_low_r, cop_reg_low_w) |
| 1504 | 1470 | AM_RANGE(0x00500, 0x00505) AM_WRITE(cop_cmd_w) |
| 1505 | 1471 | 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) |
| 1510 | 1474 | AM_RANGE(0x00590, 0x00599) AM_READ(cop_itoa_digits_r) |
| 1511 | 1475 | AM_RANGE(0x005b0, 0x005b1) AM_READ(cop_status_r) |
| 1512 | 1476 | AM_RANGE(0x005b2, 0x005b3) AM_READ(cop_dist_r) |