trunk/src/mame/drivers/raiden2.c
| r31886 | r31887 | |
| 150 | 150 | ********************************************************************************************************/ |
| 151 | 151 | |
| 152 | 152 | #include "emu.h" |
| 153 | #include "debugger.h" |
| 153 | 154 | #include "cpu/nec/nec.h" |
| 154 | 155 | #include "cpu/z80/z80.h" |
| 155 | 156 | #include "machine/eepromser.h" |
| r31886 | r31887 | |
| 560 | 561 | cop_status &= 0x7fff; |
| 561 | 562 | |
| 562 | 563 | switch(data) { |
| 563 | | case 0x0205: // 0205 0006 ffeb 0000 - 0188 0282 0082 0b8e 098e 0000 0000 0000 |
| 564 | | space.write_dword(cop_regs[0] + 4 + offset*4, space.read_dword(cop_regs[0] + 4 + offset*4) + space.read_dword(cop_regs[0] + 0x10 + offset*4)); |
| 565 | | /* TODO: check the following, makes Zero Team to crash as soon as this command is triggered (see above). */ |
| 566 | | space.write_dword(cop_regs[0] + 0x1c + offset*4, space.read_dword(cop_regs[0] + 0x1c + offset*4) + space.read_dword(cop_regs[0] + 0x10 + offset*4)); |
| 564 | case 0x0205: { // 0205 0006 ffeb 0000 - 0188 0282 0082 0b8e 098e 0000 0000 0000 |
| 565 | int ppos = space.read_dword(cop_regs[0] + 4 + offset*4); |
| 566 | int npos = ppos + space.read_dword(cop_regs[0] + 0x10 + offset*4); |
| 567 | int delta = (npos >> 16) - (ppos >> 16); |
| 568 | space.write_dword(cop_regs[0] + 4 + offset*4, npos); |
| 569 | |
| 570 | /* TODO: check the following, makes Zero Team to crash as soon |
| 571 | as this command is triggered (see above) --- or not, since |
| 572 | it was just changed */ |
| 573 | space.write_word(cop_regs[0] + 0x1e + offset*4, space.read_word(cop_regs[0] + 0x1e + offset*4) + delta); |
| 567 | 574 | break; |
| 575 | } |
| 568 | 576 | |
| 569 | 577 | case 0x0904: { /* X Se Dae and Zero Team uses this variant */ |
| 570 | 578 | space.write_dword(cop_regs[0] + 16 + offset*4, space.read_dword(cop_regs[0] + 16 + offset*4) - space.read_dword(cop_regs[0] + 0x28 + offset*4)); |
| 571 | 579 | break; |
| 572 | 580 | } |
| 573 | | case 0x0905: // 194 288 088 |
| 581 | case 0x0905: // 0905 0006 fbfb 0008 - 0194 0288 0088 0000 0000 0000 0000 0000 |
| 574 | 582 | space.write_dword(cop_regs[0] + 16 + offset*4, space.read_dword(cop_regs[0] + 16 + offset*4) + space.read_dword(cop_regs[0] + 0x28 + offset*4)); |
| 575 | 583 | break; |
| 576 | 584 | |
| 577 | | case 0x130e: |
| 578 | | case 0x138e: { // 130e 0005 bf7f 0010 - 0984 0aa4 0d82 0aa2 039b 0b9a 0b9a 0a9a |
| 585 | case 0x130e: // 130e 0005 bf7f 0010 - 0984 0aa4 0d82 0aa2 039b 0b9a 0b9a 0a9a |
| 586 | case 0x138e: |
| 587 | case 0x338e: { // 338e 0005 bf7f 0030 - 0984 0aa4 0d82 0aa2 039c 0b9c 0b9c 0a9a |
| 579 | 588 | int dx = space.read_dword(cop_regs[1]+4) - space.read_dword(cop_regs[0]+4); |
| 580 | 589 | int dy = space.read_dword(cop_regs[1]+8) - space.read_dword(cop_regs[0]+8); |
| 581 | 590 | |
| r31886 | r31887 | |
| 594 | 603 | break; |
| 595 | 604 | } |
| 596 | 605 | |
| 606 | case 0x2208: |
| 607 | case 0x2288: { // 2208 0005 f5df 0020 - 0f8a 0b8a 0388 0b9a 0b9a 0a9a 0000 0000 |
| 608 | int dx = space.read_word(cop_regs[0]+0x12); |
| 609 | int dy = space.read_word(cop_regs[0]+0x16); |
| 610 | |
| 611 | if(!dy) { |
| 612 | cop_status |= 0x8000; |
| 613 | cop_angle = 0; |
| 614 | } else { |
| 615 | cop_angle = atan(double(dx)/double(dy)) * 128 / M_PI; |
| 616 | if(dy<0) |
| 617 | cop_angle += 0x80; |
| 618 | } |
| 619 | |
| 620 | if(data & 0x0080) { |
| 621 | space.write_byte(cop_regs[0]+0x34, cop_angle); |
| 622 | } |
| 623 | break; |
| 624 | } |
| 625 | |
| 626 | case 0x2a05: { // 2a05 0006 ebeb 0028 - 09af 0a82 0082 0a8f 018e 0000 0000 0000 |
| 627 | int delta = space.read_word(cop_regs[1] + 0x1e + offset*4); |
| 628 | space.write_dword(cop_regs[0] + 4+2 + offset*4, space.read_word(cop_regs[0] + 4+2 + offset*4) + delta); |
| 629 | space.write_dword(cop_regs[0] + 0x1e + offset*4, space.read_word(cop_regs[0] + 0x1e + offset*4) + delta); |
| 630 | break; |
| 631 | } |
| 632 | |
| 633 | case 0x39b0: |
| 597 | 634 | case 0x3b30: |
| 598 | 635 | case 0x3bb0: { // 3bb0 0004 007f 0038 - 0f9c 0b9c 0b9c 0b9c 0b9c 0b9c 0b9c 099c |
| 599 | 636 | /* TODO: these are actually internally loaded via 0x130e command */ |
| r31886 | r31887 | |
| 607 | 644 | cop_dist = sqrt((double)(dx*dx+dy*dy)); |
| 608 | 645 | |
| 609 | 646 | if(data & 0x0080) |
| 610 | | space.write_word(cop_regs[0]+0x38, cop_dist); |
| 647 | space.write_word(cop_regs[0]+(data & 0x200 ? 0x3a : 0x38), cop_dist); |
| 611 | 648 | break; |
| 612 | 649 | } |
| 613 | 650 | |
| 614 | 651 | case 0x42c2: { // 42c2 0005 fcdd 0040 - 0f9a 0b9a 0b9c 0b9c 0b9c 029c 0000 0000 |
| 615 | | /* TODO: these are actually internally loaded via 0x130e command */ |
| 616 | | int dx = space.read_dword(cop_regs[1]+4) - space.read_dword(cop_regs[0]+4); |
| 617 | | int dy = space.read_dword(cop_regs[1]+8) - space.read_dword(cop_regs[0]+8); |
| 618 | 652 | int div = space.read_word(cop_regs[0]+(0x36)); |
| 619 | | int res; |
| 620 | | int cop_dist_raw; |
| 621 | | |
| 622 | 653 | if(!div) |
| 623 | | { |
| 624 | | printf("divide by zero?\n"); |
| 625 | 654 | div = 1; |
| 626 | | } |
| 627 | 655 | |
| 628 | | /* TODO: calculation of this one should occur at 0x3b30/0x3bb0 I *think* */ |
| 629 | | /* TODO: recheck if cop_scale still masks at 3 with this command */ |
| 630 | | dx >>= 11 + cop_scale; |
| 631 | | dy >>= 11 + cop_scale; |
| 632 | | cop_dist_raw = sqrt((double)(dx*dx+dy*dy)); |
| 656 | /* TODO: bits 5-6-15 */ |
| 657 | cop_status = 7; |
| 633 | 658 | |
| 634 | | res = cop_dist_raw; |
| 635 | | res /= div; |
| 659 | space.write_word(cop_regs[0]+(0x38), (cop_dist << (5 - cop_scale)) / div); |
| 660 | break; |
| 661 | } |
| 636 | 662 | |
| 637 | | cop_dist = (1 << (5 - cop_scale)) / div; |
| 663 | case 0x4aa0: { // 4aa0 0005 fcdd 0048 - 0f9a 0b9a 0b9c 0b9c 0b9c 099b 0000 0000 |
| 664 | int div = space.read_word(cop_regs[0]+(0x38)); |
| 665 | if(!div) |
| 666 | div = 1; |
| 638 | 667 | |
| 639 | 668 | /* TODO: bits 5-6-15 */ |
| 640 | 669 | cop_status = 7; |
| 641 | 670 | |
| 642 | | space.write_word(cop_regs[0]+(0x38), res); |
| 671 | space.write_word(cop_regs[0]+(0x36), (cop_dist << (5 - cop_scale)) / div); |
| 643 | 672 | break; |
| 644 | 673 | } |
| 645 | 674 | |
| r31886 | r31887 | |
| 791 | 820 | /*00 ???? ???? (colour / priority?) |
| 792 | 821 | 01 fhhh Fwww h = height f=flipy w = width F = flipx |
| 793 | 822 | 02 nnnn nnnn n = tileno |
| 794 | | 03 nnnn nnnn n = tile no |
| 823 | 03 nnnn nnnn n = tileno |
| 795 | 824 | 04 xxxx xxxx x = xpos |
| 796 | 825 | 05 xxxx xxxx x = xpos |
| 797 | 826 | 06 yyyy yyyy y = ypos |
| r31886 | r31887 | |
| 1312 | 1341 | sprite_prot_src_addr[0] = data; |
| 1313 | 1342 | } |
| 1314 | 1343 | |
| 1344 | READ16_MEMBER(raiden2_state::sprite_prot_src_seg_r) |
| 1345 | { |
| 1346 | return sprite_prot_src_addr[0]; |
| 1347 | } |
| 1348 | |
| 1315 | 1349 | WRITE16_MEMBER(raiden2_state::sprite_prot_src_w) |
| 1316 | 1350 | { |
| 1317 | | int dx; |
| 1318 | | int dy; |
| 1319 | | UINT32 src; |
| 1320 | | UINT8 flag; |
| 1321 | 1351 | sprite_prot_src_addr[1] = data; |
| 1322 | | src = (sprite_prot_src_addr[0]<<4)+sprite_prot_src_addr[1]; |
| 1352 | UINT32 src = (sprite_prot_src_addr[0]<<4)+sprite_prot_src_addr[1]; |
| 1323 | 1353 | |
| 1324 | | dx = ((space.read_dword(src+0x08) >> 16) - (sprite_prot_x)) & 0xffff; |
| 1325 | | dy = ((space.read_dword(src+0x04) >> 16) - (sprite_prot_y)) & 0xffff; |
| 1354 | int x = ((space.read_dword(src+0x08) >> 16) - (sprite_prot_x)) & 0xffff; |
| 1355 | int y = ((space.read_dword(src+0x04) >> 16) - (sprite_prot_y)) & 0xffff; |
| 1326 | 1356 | |
| 1327 | | flag = dx < 0x140 && dy < 256 ? 1 : 0; |
| 1357 | UINT16 head1 = space.read_word(src+0x60); |
| 1358 | UINT16 head2 = space.read_word(src+0x62); |
| 1359 | UINT16 oxy = space.read_word(src+0x66); |
| 1360 | |
| 1361 | int w = (((head1 >> 8 ) & 7) + 1) << 3; |
| 1362 | int h = (((head1 >> 12) & 7) + 1) << 3; |
| 1363 | |
| 1364 | int ox = INT8(oxy); |
| 1365 | int oy = INT8(oxy >> 8); |
| 1366 | |
| 1367 | UINT16 flag = x-ox > -w && x-ox < cop_spr_maxx+w && y-oy > -h && y-oy < 240+h ? 1 : 0; |
| 1328 | 1368 | |
| 1329 | | space.write_word(src,flag); |
| 1330 | | if(flag == 1) |
| 1369 | flag = (space.read_word(src) & 0xfffe) | flag; |
| 1370 | space.write_word(src, flag); |
| 1371 | |
| 1372 | if(head2 >= 0xc824 && head2 <= 0xc858) { |
| 1373 | w *= 2; |
| 1374 | h *= 2; |
| 1375 | } |
| 1376 | |
| 1377 | if(flag & 1) |
| 1331 | 1378 | { |
| 1332 | | space.write_word(dst1, space.read_word(src+0x60)); |
| 1333 | | space.write_word(dst1+2,space.read_word(src+0x62)); |
| 1334 | | space.write_word(dst1+4,dx-8); |
| 1335 | | space.write_word(dst1+6,dy-8); |
| 1379 | space.write_word(dst1, head1); |
| 1380 | space.write_word(dst1+2, head2); |
| 1381 | space.write_word(dst1+4, x-ox); |
| 1382 | space.write_word(dst1+6, y-oy); |
| 1336 | 1383 | |
| 1337 | | dst1+=8; |
| 1384 | dst1 += 8; |
| 1338 | 1385 | } |
| 1339 | 1386 | //printf("[%08x] %08x %08x %04x %04x\n",src,dx,dy,dst1,dst2); |
| 1387 | // debugger_break(machine()); |
| 1340 | 1388 | } |
| 1341 | 1389 | |
| 1342 | 1390 | READ16_MEMBER(raiden2_state::sprite_prot_dst1_r) |
| r31886 | r31887 | |
| 1344 | 1392 | return dst1; |
| 1345 | 1393 | } |
| 1346 | 1394 | |
| 1347 | | READ16_MEMBER(raiden2_state::sprite_prot_dst2_r) |
| 1395 | READ16_MEMBER(raiden2_state::sprite_prot_maxx_r) |
| 1348 | 1396 | { |
| 1349 | | return dst2; |
| 1397 | return cop_spr_maxx; |
| 1350 | 1398 | } |
| 1351 | 1399 | |
| 1400 | READ16_MEMBER(raiden2_state::sprite_prot_unk_r) |
| 1401 | { |
| 1402 | return cop_spr_unk; |
| 1403 | } |
| 1404 | |
| 1352 | 1405 | WRITE16_MEMBER(raiden2_state::sprite_prot_dst1_w) |
| 1353 | 1406 | { |
| 1354 | 1407 | dst1 = data; |
| 1355 | 1408 | } |
| 1356 | 1409 | |
| 1357 | | WRITE16_MEMBER(raiden2_state::sprite_prot_dst2_w) |
| 1410 | WRITE16_MEMBER(raiden2_state::sprite_prot_maxx_w) |
| 1358 | 1411 | { |
| 1359 | | dst2 = data; |
| 1412 | cop_spr_maxx = data; |
| 1360 | 1413 | } |
| 1361 | 1414 | |
| 1415 | WRITE16_MEMBER(raiden2_state::sprite_prot_unk_w) |
| 1416 | { |
| 1417 | cop_spr_unk = data; |
| 1418 | } |
| 1419 | |
| 1362 | 1420 | READ16_MEMBER(raiden2_state::cop_collision_status_y_r) |
| 1363 | 1421 | { |
| 1364 | 1422 | return cop_hit_val_y; |
| r31886 | r31887 | |
| 1504 | 1562 | AM_RANGE(0x006b4, 0x006b7) AM_WRITE(sprcpt_data_2_w) |
| 1505 | 1563 | AM_RANGE(0x006b8, 0x006bb) AM_WRITE(sprcpt_val_2_w) |
| 1506 | 1564 | AM_RANGE(0x006bc, 0x006bf) AM_WRITE(sprcpt_adr_w) |
| 1507 | | AM_RANGE(0x006c2, 0x006c3) AM_WRITE(sprite_prot_src_seg_w) |
| 1565 | AM_RANGE(0x006c0, 0x006c1) AM_READWRITE(sprite_prot_unk_r, sprite_prot_unk_w) |
| 1566 | AM_RANGE(0x006c2, 0x006c3) AM_READWRITE(sprite_prot_src_seg_r, sprite_prot_src_seg_w) |
| 1508 | 1567 | AM_RANGE(0x006c6, 0x006c7) AM_WRITE(sprite_prot_dst1_w) |
| 1509 | 1568 | AM_RANGE(0x006ca, 0x006cb) AM_WRITE(raiden2_bank_w) |
| 1510 | 1569 | AM_RANGE(0x006cc, 0x006cd) AM_WRITE(tile_bank_01_w) |
| 1511 | 1570 | AM_RANGE(0x006ce, 0x006cf) AM_WRITE(sprcpt_flags_2_w) |
| 1512 | 1571 | AM_RANGE(0x006d8, 0x006d9) AM_WRITE(sprite_prot_x_w) |
| 1513 | 1572 | AM_RANGE(0x006da, 0x006db) AM_WRITE(sprite_prot_y_w) |
| 1514 | | AM_RANGE(0x006dc, 0x006dd) AM_READ(sprite_prot_dst2_r) AM_WRITE(sprite_prot_dst2_w) |
| 1573 | AM_RANGE(0x006dc, 0x006dd) AM_READWRITE(sprite_prot_maxx_r, sprite_prot_maxx_w) |
| 1515 | 1574 | AM_RANGE(0x006de, 0x006df) AM_WRITE(sprite_prot_src_w) |
| 1516 | 1575 | AM_RANGE(0x006fc, 0x006fd) AM_WRITE(cop_dma_trigger_w) |
| 1517 | 1576 | AM_RANGE(0x006fe, 0x006ff) AM_WRITE(cop_sort_dma_trig_w) // sort-DMA trigger |