Previous 199869 Revisions Next

r31887 Wednesday 3rd September, 2014 at 10:32:43 UTC by O. Galibert
raiden: misc (nw)
[src/mame/drivers]raiden2.c
[src/mame/includes]raiden2.h

trunk/src/mame/includes/raiden2.h
r31886r31887
117117   DECLARE_WRITE16_MEMBER( sprite_prot_y_w );
118118   DECLARE_WRITE16_MEMBER( sprite_prot_src_seg_w );
119119   DECLARE_WRITE16_MEMBER( sprite_prot_src_w );
120   DECLARE_READ16_MEMBER( sprite_prot_src_seg_r );
120121   DECLARE_READ16_MEMBER ( sprite_prot_dst1_r );
121   DECLARE_READ16_MEMBER( sprite_prot_dst2_r );
122   DECLARE_READ16_MEMBER( sprite_prot_maxx_r );
123   DECLARE_READ16_MEMBER( sprite_prot_unk_r );
122124   DECLARE_WRITE16_MEMBER( sprite_prot_dst1_w );
123   DECLARE_WRITE16_MEMBER( sprite_prot_dst2_w );
125   DECLARE_WRITE16_MEMBER( sprite_prot_maxx_w );
126   DECLARE_WRITE16_MEMBER( sprite_prot_unk_w );
124127
125   UINT16 sprite_prot_x,sprite_prot_y,dst1,dst2;
128   UINT16 sprite_prot_x,sprite_prot_y,dst1,cop_spr_maxx,cop_spr_unk;
126129   UINT16 sprite_prot_src_addr[2];
127130
128131   struct
trunk/src/mame/drivers/raiden2.c
r31886r31887
150150********************************************************************************************************/
151151
152152#include "emu.h"
153#include "debugger.h"
153154#include "cpu/nec/nec.h"
154155#include "cpu/z80/z80.h"
155156#include "machine/eepromser.h"
r31886r31887
560561   cop_status &= 0x7fff;
561562
562563   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);
567574      break;
575   }
568576
569577   case 0x0904: { /* X Se Dae and Zero Team uses this variant */
570578      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));
571579      break;
572580   }
573   case 0x0905: // 194 288 088
581   case 0x0905: // 0905 0006 fbfb 0008 - 0194 0288 0088 0000 0000 0000 0000 0000
574582      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));
575583      break;
576584
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
579588      int dx = space.read_dword(cop_regs[1]+4) - space.read_dword(cop_regs[0]+4);
580589      int dy = space.read_dword(cop_regs[1]+8) - space.read_dword(cop_regs[0]+8);
581590
r31886r31887
594603      break;
595604   }
596605
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:
597634   case 0x3b30:
598635   case 0x3bb0: { // 3bb0 0004 007f 0038 - 0f9c 0b9c 0b9c 0b9c 0b9c 0b9c 0b9c 099c
599636      /* TODO: these are actually internally loaded via 0x130e command */
r31886r31887
607644      cop_dist = sqrt((double)(dx*dx+dy*dy));
608645     
609646      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);
611648      break;
612649   }
613650
614651   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);
618652      int div = space.read_word(cop_regs[0]+(0x36));
619      int res;
620      int cop_dist_raw;
621
622653      if(!div)
623      {
624         printf("divide by zero?\n");
625654         div = 1;
626      }
627655
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;
633658
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   }
636662
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;
638667
639668      /* TODO: bits 5-6-15 */
640669      cop_status = 7;
641670
642      space.write_word(cop_regs[0]+(0x38), res);
671      space.write_word(cop_regs[0]+(0x36), (cop_dist << (5 - cop_scale)) / div);
643672      break;
644673   }
645674
r31886r31887
791820   /*00 ???? ????  (colour / priority?)
792821     01 fhhh Fwww   h = height f=flipy w = width F = flipx
793822     02 nnnn nnnn   n = tileno
794     03 nnnn nnnn   n = tile no
823     03 nnnn nnnn   n = tileno
795824     04 xxxx xxxx   x = xpos
796825     05 xxxx xxxx   x = xpos
797826     06 yyyy yyyy   y = ypos
r31886r31887
13121341   sprite_prot_src_addr[0] = data;
13131342}
13141343
1344READ16_MEMBER(raiden2_state::sprite_prot_src_seg_r)
1345{
1346   return sprite_prot_src_addr[0];
1347}
1348
13151349WRITE16_MEMBER(raiden2_state::sprite_prot_src_w)
13161350{
1317   int dx;
1318   int dy;
1319   UINT32 src;
1320   UINT8 flag;
13211351   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];
13231353
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;
13261356
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;
13281368   
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)
13311378   {
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);
13361383
1337   dst1+=8;
1384      dst1 += 8;
13381385   }
13391386   //printf("[%08x] %08x %08x %04x %04x\n",src,dx,dy,dst1,dst2);
1387   //   debugger_break(machine());
13401388}
13411389
13421390READ16_MEMBER(raiden2_state::sprite_prot_dst1_r)
r31886r31887
13441392   return dst1;
13451393}
13461394
1347READ16_MEMBER(raiden2_state::sprite_prot_dst2_r)
1395READ16_MEMBER(raiden2_state::sprite_prot_maxx_r)
13481396{
1349   return dst2;
1397   return cop_spr_maxx;
13501398}
13511399
1400READ16_MEMBER(raiden2_state::sprite_prot_unk_r)
1401{
1402   return cop_spr_unk;
1403}
1404
13521405WRITE16_MEMBER(raiden2_state::sprite_prot_dst1_w)
13531406{
13541407   dst1 = data;
13551408}
13561409
1357WRITE16_MEMBER(raiden2_state::sprite_prot_dst2_w)
1410WRITE16_MEMBER(raiden2_state::sprite_prot_maxx_w)
13581411{
1359   dst2 = data;
1412   cop_spr_maxx = data;
13601413}
13611414
1415WRITE16_MEMBER(raiden2_state::sprite_prot_unk_w)
1416{
1417   cop_spr_unk = data;
1418}
1419
13621420READ16_MEMBER(raiden2_state::cop_collision_status_y_r)
13631421{
13641422   return cop_hit_val_y;
r31886r31887
15041562   AM_RANGE(0x006b4, 0x006b7) AM_WRITE(sprcpt_data_2_w)
15051563   AM_RANGE(0x006b8, 0x006bb) AM_WRITE(sprcpt_val_2_w)
15061564   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)
15081567   AM_RANGE(0x006c6, 0x006c7) AM_WRITE(sprite_prot_dst1_w)
15091568   AM_RANGE(0x006ca, 0x006cb) AM_WRITE(raiden2_bank_w)
15101569   AM_RANGE(0x006cc, 0x006cd) AM_WRITE(tile_bank_01_w)
15111570   AM_RANGE(0x006ce, 0x006cf) AM_WRITE(sprcpt_flags_2_w)
15121571   AM_RANGE(0x006d8, 0x006d9) AM_WRITE(sprite_prot_x_w)
15131572   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)
15151574   AM_RANGE(0x006de, 0x006df) AM_WRITE(sprite_prot_src_w)
15161575   AM_RANGE(0x006fc, 0x006fd) AM_WRITE(cop_dma_trigger_w)
15171576   AM_RANGE(0x006fe, 0x006ff) AM_WRITE(cop_sort_dma_trig_w) // sort-DMA trigger

Previous 199869 Revisions Next


© 1997-2024 The MAME Team