Previous 199869 Revisions Next

r32331 Tuesday 23rd September, 2014 at 22:10:00 UTC by David Haywood
baby steps 2 (nw)
[src/mame/drivers]legionna.c raiden2.c
[src/mame/machine]seicop.c seicop.h

trunk/src/mame/drivers/legionna.c
r32330r32331
118118   AM_RANGE(0x10047a, 0x10047b) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_dma_size_w)
119119   AM_RANGE(0x10047c, 0x10047d) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_dma_dst_w)
120120   AM_RANGE(0x10047e, 0x10047f) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_dma_mode_r, cop_dma_mode_w)
121//   AM_RANGE(0x1004a0, 0x1004a9) AM_READWRITE(cop_reg_high_r, cop_reg_high_w)
122//   AM_RANGE(0x1004c0, 0x1004c9) AM_READWRITE(cop_reg_low_r, cop_reg_low_w)
121   AM_RANGE(0x1004a0, 0x1004ad) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_reg_high_r, cop_reg_high_w)
122   AM_RANGE(0x1004c0, 0x1004cd) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_reg_low_r, cop_reg_low_w)
123123//   AM_RANGE(0x100500, 0x100505) AM_WRITE(cop_cmd_w)
124124//   AM_RANGE(0x100580, 0x100581) AM_READ(cop_collision_status_r)
125125//   AM_RANGE(0x100582, 0x100587) AM_READ(cop_collision_status_val_r)
trunk/src/mame/drivers/raiden2.c
r32330r32331
904904   AM_RANGE(0x0047a, 0x0047b) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_dma_size_w)
905905   AM_RANGE(0x0047c, 0x0047d) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_dma_dst_w)
906906   AM_RANGE(0x0047e, 0x0047f) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_dma_mode_r, cop_dma_mode_w)
907   AM_RANGE(0x004a0, 0x004a9) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_reg_high_r, cop_reg_high_w)
908   AM_RANGE(0x004c0, 0x004c9) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_reg_low_r, cop_reg_low_w)
907   AM_RANGE(0x004a0, 0x004ad) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_reg_high_r, cop_reg_high_w)
908   AM_RANGE(0x004c0, 0x004cd) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_reg_low_r, cop_reg_low_w)
909909   AM_RANGE(0x00500, 0x00505) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_cmd_w)
910910   AM_RANGE(0x00580, 0x00581) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_collision_status_r)
911911   AM_RANGE(0x00582, 0x00587) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_collision_status_val_r)
trunk/src/mame/machine/seicop.c
r32330r32331
16271627   m_raiden2cop(*this, ":raiden2cop")
16281628{
16291629
1630   for (int i = 0; i < 8; i++)
1631   {
1632      m_cop_register[i] = 0;
1633   }
1630
16341631}
16351632
16361633#define seibu_cop_log logerror
r32330r32331
18451842         logerror("%06x: COPX unhandled write data %04x at offset %04x\n", space.device().safe_pc(), data, offset*2);
18461843         break;
18471844      }
1848      case (0x4a0/2): { m_cop_register[0] = (m_cop_register[0]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
1849      case (0x4c0/2): { m_cop_register[0] = (m_cop_register[0]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
18501845
1851      case (0x4a2/2): { m_cop_register[1] = (m_cop_register[1]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
1852      case (0x4c2/2): { m_cop_register[1] = (m_cop_register[1]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
1853
1854      case (0x4a4/2): { m_cop_register[2] = (m_cop_register[2]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
1855      case (0x4c4/2): { m_cop_register[2] = (m_cop_register[2]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
1856
1857      case (0x4a6/2): { m_cop_register[3] = (m_cop_register[3]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
1858      case (0x4c6/2): { m_cop_register[3] = (m_cop_register[3]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
1859
1860      case (0x4a8/2): { m_cop_register[4] = (m_cop_register[4]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
1861      case (0x4c8/2): { m_cop_register[4] = (m_cop_register[4]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
1862
1863      case (0x4aa/2): { m_cop_register[5] = (m_cop_register[5]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
1864      case (0x4ca/2): { m_cop_register[5] = (m_cop_register[5]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
1865
1866      case (0x4ac/2): { m_cop_register[6] = (m_cop_register[6]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
1867      case (0x4cc/2): { m_cop_register[6] = (m_cop_register[6]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
1868
18691846     
18701847      case (0x500/2):
18711848      case (0x502/2):
r32330r32331
18741851         {
18751852            case 0x8100:
18761853            {
1877               int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff);
1854               int raw_angle = (space.read_word(m_raiden2cop->cop_regs[0]+(0x34^2)) & 0xff);
18781855               double angle = raw_angle * M_PI / 128;
1879               double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff);
1856               double amp = (65536 >> 5)*(space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)) & 0xff);
18801857               int res;
18811858
18821859            /* TODO: up direction, why? */
r32330r32331
18851862
18861863               res = int(amp*sin(angle)) << m_cop_scale;
18871864
1888               space.write_dword(m_cop_register[0] + 0x10, res);
1865               space.write_dword(m_raiden2cop->cop_regs[0] + 0x10, res);
18891866
18901867               break;
18911868            }
18921869            case 0x8900:
18931870            {
1894               int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff);
1871               int raw_angle = (space.read_word(m_raiden2cop->cop_regs[0]+(0x34^2)) & 0xff);
18951872               double angle = raw_angle * M_PI / 128;
1896               double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff);
1873               double amp = (65536 >> 5)*(space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)) & 0xff);
18971874               int res;
18981875
18991876               /* TODO: left direction, why? */
r32330r32331
19021879
19031880               res = int(amp*cos(angle)) << m_cop_scale;
19041881
1905               space.write_dword(m_cop_register[0] + 20, res);
1882               space.write_dword(m_raiden2cop->cop_regs[0] + 20, res);
19061883
19071884               break;
19081885            }
r32330r32331
19111888               UINT8 offs;
19121889
19131890               offs = (offset & 3) * 4;
1914               int ppos = space.read_dword(m_cop_register[0] + 4 + offs);
1915               int npos = ppos + space.read_dword(m_cop_register[0] + 0x10 + offs);
1891               int ppos = space.read_dword(m_raiden2cop->cop_regs[0] + 4 + offs);
1892               int npos = ppos + space.read_dword(m_raiden2cop->cop_regs[0] + 0x10 + offs);
19161893               int delta = (npos >> 16) - (ppos >> 16);
19171894
1918               space.write_dword(m_cop_register[0] + 4 + offs, npos);
1919               space.write_word(m_cop_register[0] + 0x1c + offs, space.read_word(m_cop_register[0] + 0x1c + offs) + delta);
1895               space.write_dword(m_raiden2cop->cop_regs[0] + 4 + offs, npos);
1896               space.write_word(m_raiden2cop->cop_regs[0] + 0x1c + offs, space.read_word(m_raiden2cop->cop_regs[0] + 0x1c + offs) + delta);
19201897           
19211898               break;
19221899            }
19231900            case 0x130e:
19241901            case 0x138e:
19251902            {
1926               int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4);
1927               int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8);
1903               int dy = space.read_dword(m_raiden2cop->cop_regs[1]+4) - space.read_dword(m_raiden2cop->cop_regs[0]+4);
1904               int dx = space.read_dword(m_raiden2cop->cop_regs[1]+8) - space.read_dword(m_raiden2cop->cop_regs[0]+8);
19281905
19291906               m_raiden2cop->cop_status = 7;
19301907               if(!dx) {
r32330r32331
19401917               m_r1 = dx;
19411918
19421919               if(m_cop_mcu_ram[offset] & 0x80)
1943                  space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle);
1920                  space.write_word(m_raiden2cop->cop_regs[0]+(0x34^2), m_raiden2cop->cop_angle);
19441921
19451922               break;
19461923            }
r32330r32331
19551932               m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy));
19561933
19571934               if(m_cop_mcu_ram[offset] & 0x80)
1958                  space.write_word(m_cop_register[0]+(0x38), m_raiden2cop->cop_dist);
1935                  space.write_word(m_raiden2cop->cop_regs[0]+(0x38), m_raiden2cop->cop_dist);
19591936
19601937               break;
19611938            }
r32330r32331
21412118         else
21422119         {
21432120            /* guess */
2144            m_cop_register[4]+=8;
2121            m_raiden2cop->cop_regs[4]+=8;
21452122            m_cop_sprite_dma_src+=6;
21462123
21472124            m_cop_sprite_dma_size--;
r32330r32331
22122189      case (0x08c/2): m_cop_sprite_dma_abs_y = (m_cop_mcu_ram[0x08c/2]); break;
22132190      case (0x08e/2): m_cop_sprite_dma_abs_x = (m_cop_mcu_ram[0x08e/2]); break;
22142191
2215      /* Registers */
2216      case (0x0a0/2): { m_cop_register[0] = (m_cop_register[0]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2217      case (0x0c0/2): { m_cop_register[0] = (m_cop_register[0]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2192   
22182193
2219      case (0x0a2/2): { m_cop_register[1] = (m_cop_register[1]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2220      case (0x0c2/2): { m_cop_register[1] = (m_cop_register[1]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2221
2222      case (0x0a4/2): { m_cop_register[2] = (m_cop_register[2]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2223      case (0x0c4/2): { m_cop_register[2] = (m_cop_register[2]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2224
2225      case (0x0a6/2): { m_cop_register[3] = (m_cop_register[3]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2226      case (0x0c6/2): { m_cop_register[3] = (m_cop_register[3]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2227
2228      case (0x0a8/2): { m_cop_register[4] = (m_cop_register[4]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2229      case (0x0c8/2): { m_cop_register[4] = (m_cop_register[4]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2230
2231      case (0x0aa/2): { m_cop_register[5] = (m_cop_register[5]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2232      case (0x0ca/2): { m_cop_register[5] = (m_cop_register[5]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2233
2234      case (0x0ac/2): { m_cop_register[6] = (m_cop_register[6]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2235      case (0x0cc/2): { m_cop_register[6] = (m_cop_register[6]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2236
2237
22382194      case (0x100/2):
22392195      case (0x102/2):
22402196      case (0x104/2):
r32330r32331
22422198         int command;
22432199
22442200
2245         logerror("%06x: COPX execute table macro command %04x %04x | regs %08x %08x %08x %08x %08x\n", space.device().safe_pc(), data, m_cop_mcu_ram[offset], m_cop_register[0], m_cop_register[1], m_cop_register[2], m_cop_register[3], m_cop_register[4]);
2201         logerror("%06x: COPX execute table macro command %04x %04x | regs %08x %08x %08x %08x %08x\n", space.device().safe_pc(), data, m_cop_mcu_ram[offset], m_raiden2cop->cop_regs[0], m_raiden2cop->cop_regs[1], m_raiden2cop->cop_regs[2], m_raiden2cop->cop_regs[3], m_raiden2cop->cop_regs[4]);
22462202
22472203
22482204         command = m_raiden2cop->find_trigger_match(m_cop_mcu_ram[offset], 0xff00);
r32330r32331
22822238            UINT8 offs;
22832239
22842240            offs = (offset & 3) * 4;
2285            int ppos = space.read_dword(m_cop_register[0] + 4 + offs);
2286            int npos = ppos + space.read_dword(m_cop_register[0] + 0x10 + offs);
2241            int ppos = space.read_dword(m_raiden2cop->cop_regs[0] + 4 + offs);
2242            int npos = ppos + space.read_dword(m_raiden2cop->cop_regs[0] + 0x10 + offs);
22872243            int delta = (npos >> 16) - (ppos >> 16);
22882244
2289            space.write_dword(m_cop_register[0] + 4 + offs, npos);
2290            space.write_word(m_cop_register[0] + 0x1c + offs, space.read_word(m_cop_register[0] + 0x1c + offs) + delta);
2245            space.write_dword(m_raiden2cop->cop_regs[0] + 4 + offs, npos);
2246            space.write_word(m_raiden2cop->cop_regs[0] + 0x1c + offs, space.read_word(m_raiden2cop->cop_regs[0] + 0x1c + offs) + delta);
22912247            return;
22922248         }
22932249
r32330r32331
23032259            /* add 0x10 + offs */
23042260            /* write 0x10 + offs */
23052261
2306            space.write_dword(m_cop_register[0] + 0x10 + offs, space.read_dword(m_cop_register[0] + 0x10 + offs) + space.read_dword(m_cop_register[0] + 0x28 + offs));
2262            space.write_dword(m_raiden2cop->cop_regs[0] + 0x10 + offs, space.read_dword(m_raiden2cop->cop_regs[0] + 0x10 + offs) + space.read_dword(m_raiden2cop->cop_regs[0] + 0x28 + offs));
23072263            return;
23082264         }
23092265
r32330r32331
23222278         if(m_raiden2cop->check_command_matches(command, 0xb9a,0xb88,0x888,0x000,0x000,0x000,0x000,0x000,7,0xfdfb))
23232279         {
23242280            executed = 1;
2325            int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff);
2281            int raw_angle = (space.read_word(m_raiden2cop->cop_regs[0]+(0x34^2)) & 0xff);
23262282            double angle = raw_angle * M_PI / 128;
2327            double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff);
2283            double amp = (65536 >> 5)*(space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)) & 0xff);
23282284            int res;
23292285
23302286            /* TODO: up direction, why? */
r32330r32331
23332289
23342290            res = int(amp*sin(angle)) << m_cop_scale;
23352291
2336            space.write_dword(m_cop_register[0] + 0x10, res);
2292            space.write_dword(m_raiden2cop->cop_regs[0] + 0x10, res);
23372293            return;
23382294         }
23392295
r32330r32331
23522308         if(m_raiden2cop->check_command_matches(command, 0xb9a,0xb8a,0x88a,0x000,0x000,0x000,0x000,0x000,7,0xfdfb))
23532309         {
23542310            executed = 1;
2355            int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff);
2311            int raw_angle = (space.read_word(m_raiden2cop->cop_regs[0]+(0x34^2)) & 0xff);
23562312            double angle = raw_angle * M_PI / 128;
2357            double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff);
2313            double amp = (65536 >> 5)*(space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)) & 0xff);
23582314            int res;
23592315
23602316            /* TODO: left direction, why? */
r32330r32331
23632319
23642320            res = int(amp*cos(angle)) << m_cop_scale;
23652321
2366            space.write_dword(m_cop_register[0] + 20, res);
2322            space.write_dword(m_raiden2cop->cop_regs[0] + 20, res);
23672323            return;
23682324         }
23692325
r32330r32331
23712327         if(m_raiden2cop->check_command_matches(command, 0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xa9a,5,0xbf7f))
23722328         {
23732329            executed = 1;
2374            int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4);
2375            int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8);
2330            int dy = space.read_dword(m_raiden2cop->cop_regs[1]+4) - space.read_dword(m_raiden2cop->cop_regs[0]+4);
2331            int dx = space.read_dword(m_raiden2cop->cop_regs[1]+8) - space.read_dword(m_raiden2cop->cop_regs[0]+8);
23762332
23772333            m_raiden2cop->cop_status = 7;
23782334            if(!dx) {
r32330r32331
23902346            //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_raiden2cop->cop_angle);
23912347
23922348            if(m_cop_mcu_ram[offset] & 0x80)
2393               space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle);
2349               space.write_word(m_raiden2cop->cop_regs[0]+(0x34^2), m_raiden2cop->cop_angle);
23942350            return;
23952351         }
23962352
r32330r32331
23992355         if(m_raiden2cop->check_command_matches(command, 0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xb9a,5,0xbf7f))
24002356         {
24012357            executed = 1;
2402            int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4);
2403            int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8);
2358            int dy = space.read_dword(m_raiden2cop->cop_regs[1]+4) - space.read_dword(m_raiden2cop->cop_regs[0]+4);
2359            int dx = space.read_dword(m_raiden2cop->cop_regs[1]+8) - space.read_dword(m_raiden2cop->cop_regs[0]+8);
24042360
24052361            m_raiden2cop->cop_status = 7;
24062362            if(!dx) {
r32330r32331
24172373            m_r1 = dx;
24182374
24192375            if(m_cop_mcu_ram[offset] & 0x80)
2420               space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle);
2376               space.write_word(m_raiden2cop->cop_regs[0]+(0x34^2), m_raiden2cop->cop_angle);
24212377            return;
24222378         }
24232379
r32330r32331
24402396            m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy));
24412397
24422398            if(m_cop_mcu_ram[offset] & 0x80)
2443               space.write_word(m_cop_register[0]+(0x38), m_raiden2cop->cop_dist);
2399               space.write_word(m_raiden2cop->cop_regs[0]+(0x38), m_raiden2cop->cop_dist);
24442400            return;
24452401         }
24462402
r32330r32331
24602416            executed = 1;
24612417            int dy = m_r0;
24622418            int dx = m_r1;
2463            int div = space.read_word(m_cop_register[0]+(0x36^2));
2419            int div = space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2));
24642420            int res;
24652421            int cop_dist_raw;
24662422
r32330r32331
24842440            /* TODO: bits 5-6-15 */
24852441            m_raiden2cop->cop_status = 7;
24862442
2487            space.write_word(m_cop_register[0]+(0x38^2), res);
2443            space.write_word(m_raiden2cop->cop_regs[0]+(0x38^2), res);
24882444            return;
24892445         }
24902446
24912447         /*
24922448             collision detection:
24932449
2494             int dy_0 = space.read_dword(m_cop_register[0]+4);
2495             int dx_0 = space.read_dword(m_cop_register[0]+8);
2496             int dy_1 = space.read_dword(m_cop_register[1]+4);
2497             int dx_1 = space.read_dword(m_cop_register[1]+8);
2498             int hitbox_param1 = space.read_dword(m_cop_register[2]);
2499             int hitbox_param2 = space.read_dword(m_cop_register[3]);
2450             int dy_0 = space.read_dword(m_raiden2cop->cop_regs[0]+4);
2451             int dx_0 = space.read_dword(m_raiden2cop->cop_regs[0]+8);
2452             int dy_1 = space.read_dword(m_raiden2cop->cop_regs[1]+4);
2453             int dx_1 = space.read_dword(m_raiden2cop->cop_regs[1]+8);
2454             int hitbox_param1 = space.read_dword(m_raiden2cop->cop_regs[2]);
2455             int hitbox_param2 = space.read_dword(m_raiden2cop->cop_regs[3]);
25002456
25012457             TODO: we are ignoring the funcval / funcmask params for now
25022458         */
r32330r32331
25042460         if(m_raiden2cop->check_command_matches(command, 0xb80,0xb82,0xb84,0xb86,0x000,0x000,0x000,0x000,funcval,funcmask))
25052461         {
25062462            executed = 1;
2507            m_cop_collision_info[0].y = (space.read_dword(m_cop_register[0]+4));
2508            m_cop_collision_info[0].x = (space.read_dword(m_cop_register[0]+8));
2463            m_cop_collision_info[0].y = (space.read_dword(m_raiden2cop->cop_regs[0]+4));
2464            m_cop_collision_info[0].x = (space.read_dword(m_raiden2cop->cop_regs[0]+8));
25092465            return;
25102466         }
25112467
r32330r32331
25132469         if(m_raiden2cop->check_command_matches(command, 0xb40,0xbc0,0xbc2,0x000,0x000,0x000,0x000,0x000,funcval,funcmask))
25142470         {
25152471            executed = 1;
2516            m_cop_collision_info[0].hitbox = space.read_word(m_cop_register[2]);
2517            m_cop_collision_info[0].hitbox_y = space.read_word((m_cop_register[2]&0xffff0000)|(m_cop_collision_info[0].hitbox));
2518            m_cop_collision_info[0].hitbox_x = space.read_word(((m_cop_register[2]&0xffff0000)|(m_cop_collision_info[0].hitbox))+2);
2472            m_cop_collision_info[0].hitbox = space.read_word(m_raiden2cop->cop_regs[2]);
2473            m_cop_collision_info[0].hitbox_y = space.read_word((m_raiden2cop->cop_regs[2]&0xffff0000)|(m_cop_collision_info[0].hitbox));
2474            m_cop_collision_info[0].hitbox_x = space.read_word(((m_raiden2cop->cop_regs[2]&0xffff0000)|(m_cop_collision_info[0].hitbox))+2);
25192475
25202476            /* do the math */
25212477            cop_take_hit_box_params(0);
r32330r32331
25272483         if(m_raiden2cop->check_command_matches(command, 0xba0,0xba2,0xba4,0xba6,0x000,0x000,0x000,0x000,funcval,funcmask))
25282484         {
25292485            executed = 1;
2530            m_cop_collision_info[1].y = (space.read_dword(m_cop_register[1]+4));
2531            m_cop_collision_info[1].x = (space.read_dword(m_cop_register[1]+8));
2486            m_cop_collision_info[1].y = (space.read_dword(m_raiden2cop->cop_regs[1]+4));
2487            m_cop_collision_info[1].x = (space.read_dword(m_raiden2cop->cop_regs[1]+8));
25322488            return;
25332489         }
25342490
r32330r32331
25362492         if(m_raiden2cop->check_command_matches(command, 0xb60,0xbe0,0xbe2,0x000,0x000,0x000,0x000,0x000,funcval,funcmask))
25372493         {
25382494            executed = 1;
2539            m_cop_collision_info[1].hitbox = space.read_word(m_cop_register[3]);
2540            m_cop_collision_info[1].hitbox_y = space.read_word((m_cop_register[3]&0xffff0000)|(m_cop_collision_info[1].hitbox));
2541            m_cop_collision_info[1].hitbox_x = space.read_word(((m_cop_register[3]&0xffff0000)|(m_cop_collision_info[1].hitbox))+2);
2495            m_cop_collision_info[1].hitbox = space.read_word(m_raiden2cop->cop_regs[3]);
2496            m_cop_collision_info[1].hitbox_y = space.read_word((m_raiden2cop->cop_regs[3]&0xffff0000)|(m_cop_collision_info[1].hitbox));
2497            m_cop_collision_info[1].hitbox_x = space.read_word(((m_raiden2cop->cop_regs[3]&0xffff0000)|(m_cop_collision_info[1].hitbox))+2);
25422498
25432499            /* do the math */
25442500            cop_take_hit_box_params(1);
r32330r32331
25562512            offs = (offset & 3) * 4;
25572513
25582514            /* TODO: I really suspect that following two are actually taken from the 0xa180 macro command then internally loaded */
2559            abs_x = space.read_word(m_cop_register[0] + 8) - m_cop_sprite_dma_abs_x;
2560            abs_y = space.read_word(m_cop_register[0] + 4) - m_cop_sprite_dma_abs_y;
2515            abs_x = space.read_word(m_raiden2cop->cop_regs[0] + 8) - m_cop_sprite_dma_abs_x;
2516            abs_y = space.read_word(m_raiden2cop->cop_regs[0] + 4) - m_cop_sprite_dma_abs_y;
25612517            rel_xy = space.read_word(m_cop_sprite_dma_src + 4 + offs);
25622518
25632519            //if(rel_xy & 0x0706)
25642520            //  printf("sprite rel_xy = %04x\n",rel_xy);
25652521
25662522            if(rel_xy & 1)
2567               space.write_word(m_cop_register[4] + offs + 4,0xc0 + abs_x - (rel_xy & 0xf8));
2523               space.write_word(m_raiden2cop->cop_regs[4] + offs + 4,0xc0 + abs_x - (rel_xy & 0xf8));
25682524            else
2569               space.write_word(m_cop_register[4] + offs + 4,(((rel_xy & 0x78) + (abs_x) - ((rel_xy & 0x80) ? 0x80 : 0))));
2525               space.write_word(m_raiden2cop->cop_regs[4] + offs + 4,(((rel_xy & 0x78) + (abs_x) - ((rel_xy & 0x80) ? 0x80 : 0))));
25702526
2571            space.write_word(m_cop_register[4] + offs + 6,(((rel_xy & 0x7800) >> 8) + (abs_y) - ((rel_xy & 0x8000) ? 0x80 : 0)));
2527            space.write_word(m_raiden2cop->cop_regs[4] + offs + 6,(((rel_xy & 0x7800) >> 8) + (abs_y) - ((rel_xy & 0x8000) ? 0x80 : 0)));
25722528            return;
25732529         }
25742530
r32330r32331
25802536
25812537            offs = (offset & 3) * 4;
25822538
2583            space.write_word(m_cop_register[4] + offs + 0,space.read_word(m_cop_sprite_dma_src + offs) + (m_cop_sprite_dma_param & 0x3f));
2584            //space.write_word(m_cop_register[4] + offs + 2,space.read_word(m_cop_sprite_dma_src+2 + offs));
2539            space.write_word(m_raiden2cop->cop_regs[4] + offs + 0,space.read_word(m_cop_sprite_dma_src + offs) + (m_cop_sprite_dma_param & 0x3f));
2540            //space.write_word(m_raiden2cop->cop_regs[4] + offs + 2,space.read_word(m_cop_sprite_dma_src+2 + offs));
25852541            return;
25862542         }
25872543
r32330r32331
26092565            // what are these two instead? scale factor? offsets? (edit: offsets to apply from the initial sprite data)
26102566            // 0xfc69 ?
26112567            // 0x7f4 ?
2612            //printf("%08x %08x %08x %08x %08x %08x %08x\n",m_cop_register[0],m_cop_register[1],m_cop_register[2],m_cop_register[3],m_cop_register[4],m_cop_register[5],m_cop_register[6]);
2568            //printf("%08x %08x %08x %08x %08x %08x %08x\n",m_raiden2cop->cop_regs[0],m_raiden2cop->cop_regs[1],m_raiden2cop->cop_regs[2],m_raiden2cop->cop_regs[3],m_raiden2cop->cop_regs[4],m_raiden2cop->cop_regs[5],m_raiden2cop->cop_regs[6]);
26132569
26142570            offs = (offset & 3) * 4;
26152571
2616            div = space.read_word(m_cop_register[4] + offs);
2617            dir_offset = space.read_word(m_cop_register[4] + offs + 8);
2618//              offs_val = space.read_word(m_cop_register[3] + offs);
2572            div = space.read_word(m_raiden2cop->cop_regs[4] + offs);
2573            dir_offset = space.read_word(m_raiden2cop->cop_regs[4] + offs + 8);
2574//              offs_val = space.read_word(m_raiden2cop->cop_regs[3] + offs);
26192575            //420 / 180 = 500 : 400 = 30 / 50 = 98 / 18
26202576           
26212577            /* TODO: this probably trips a cop status flag */
26222578            if(div == 0) { div = 1; }
26232579           
26242580           
2625            space.write_word((m_cop_register[6] + offs + 4), ((space.read_word(m_cop_register[5] + offs + 4) + dir_offset) / div));
2581            space.write_word((m_raiden2cop->cop_regs[6] + offs + 4), ((space.read_word(m_raiden2cop->cop_regs[5] + offs + 4) + dir_offset) / div));
26262582            return;
26272583         }
26282584
r32330r32331
26392595            /* 0 [1] */
26402596            /* 0xc [1] */
26412597
2642            cur_angle = space.read_byte(m_cop_register[1] + (0xc ^ 3));
2643            flags = space.read_word(m_cop_register[1]);
2644            //space.write_byte(m_cop_register[1] + (0^3),space.read_byte(m_cop_register[1] + (0^3)) & 0xfb); //correct?
2598            cur_angle = space.read_byte(m_raiden2cop->cop_regs[1] + (0xc ^ 3));
2599            flags = space.read_word(m_raiden2cop->cop_regs[1]);
2600            //space.write_byte(m_raiden2cop->cop_regs[1] + (0^3),space.read_byte(m_raiden2cop->cop_regs[1] + (0^3)) & 0xfb); //correct?
26452601
26462602            m_legacycop_angle_compare &= 0xff;
26472603            m_legacycop_angle_mod_val &= 0xff;
r32330r32331
26732629                  cur_angle -= m_legacycop_angle_mod_val;
26742630            }
26752631
2676            space.write_byte(m_cop_register[1] + (0 ^ 2),flags);
2677            space.write_byte(m_cop_register[1] + (0xc ^ 3),cur_angle);
2632            space.write_byte(m_raiden2cop->cop_regs[1] + (0 ^ 2),flags);
2633            space.write_byte(m_raiden2cop->cop_regs[1] + (0xc ^ 3),cur_angle);
26782634            return;
26792635         }
26802636
r32330r32331
26872643            UINT8 cur_angle;
26882644            UINT16 flags;
26892645           
2690            cur_angle = space.read_byte(m_cop_register[0] + (0x34 ^ 3));
2691            flags = space.read_word(m_cop_register[0] + (0 ^ 2));
2692            //space.write_byte(m_cop_register[1] + (0^3),space.read_byte(m_cop_register[1] + (0^3)) & 0xfb); //correct?
2646            cur_angle = space.read_byte(m_raiden2cop->cop_regs[0] + (0x34 ^ 3));
2647            flags = space.read_word(m_raiden2cop->cop_regs[0] + (0 ^ 2));
2648            //space.write_byte(m_raiden2cop->cop_regs[1] + (0^3),space.read_byte(m_raiden2cop->cop_regs[1] + (0^3)) & 0xfb); //correct?
26932649
26942650            m_legacycop_angle_compare &= 0xff;
26952651            m_legacycop_angle_mod_val &= 0xff;
r32330r32331
27212677                  cur_angle -= m_legacycop_angle_mod_val;
27222678            }
27232679
2724            space.write_byte(m_cop_register[0] + (0 ^ 3),flags);
2725            space.write_word(m_cop_register[0] + (0x34 ^ 3),cur_angle);
2680            space.write_byte(m_raiden2cop->cop_regs[0] + (0 ^ 3),flags);
2681            space.write_word(m_raiden2cop->cop_regs[0] + (0x34 ^ 3),cur_angle);
27262682            return;
27272683         }
27282684
r32330r32331
27302686         if(m_raiden2cop->check_command_matches(command, 0x984,0xac4,0xd82,0xac2,0x39b,0xb9a,0xb9a,0xa9a,5,0xb07f))
27312687         {
27322688            executed = 1;
2733            int dy = space.read_dword(m_cop_register[2]+4) - space.read_dword(m_cop_register[0]+4);
2734            int dx = space.read_dword(m_cop_register[2]+8) - space.read_dword(m_cop_register[0]+8);
2689            int dy = space.read_dword(m_raiden2cop->cop_regs[2]+4) - space.read_dword(m_raiden2cop->cop_regs[0]+4);
2690            int dx = space.read_dword(m_raiden2cop->cop_regs[2]+8) - space.read_dword(m_raiden2cop->cop_regs[0]+8);
27352691
27362692            m_raiden2cop->cop_status = 7;
27372693            if(!dx) {
r32330r32331
27492705            //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_raiden2cop->cop_angle);
27502706
27512707            if(m_cop_mcu_ram[offset] & 0x80)
2752               space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle);
2708               space.write_word(m_raiden2cop->cop_regs[0]+(0x34^2), m_raiden2cop->cop_angle);
27532709            return;
27542710         }
27552711
r32330r32331
27632719            UINT16 rom_data = (ROM[rom_addr + 0]) | (ROM[rom_addr + 1]<<8);
27642720
27652721            /* writes to some unemulated COP registers, then puts the result in here, adding a parameter taken from ROM */
2766            //space.write_word(m_cop_register[0]+(0x44 + offset * 4), rom_data);
2722            //space.write_word(m_raiden2cop->cop_regs[0]+(0x44 + offset * 4), rom_data);
27672723
27682724            printf("%04x%04x %04x %04x\n",m_cop_rom_addr_hi,m_cop_rom_addr_lo,m_cop_rom_addr_unk,rom_data);
27692725            return;
trunk/src/mame/machine/seicop.h
r32330r32331
4444   UINT16 m_cop_scale;
4545   UINT8 m_cop_rng_max_value;
4646   UINT16 m_copd2_offs;
47   UINT32 m_cop_register[8];
4847   UINT16 m_cop_hit_status;
4948   INT16 m_cop_hit_val_x,m_cop_hit_val_y,m_cop_hit_val_z,m_cop_hit_val_unk;
5049   UINT32 m_cop_sort_lookup,m_cop_sort_ram_addr,m_cop_sort_param;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team