Previous 199869 Revisions Next

r32330 Tuesday 23rd September, 2014 at 21:54:41 UTC by David Haywood
baby steps (nw)
[src/mame/drivers]legionna.c
[src/mame/machine]seicop.c seicop.h

trunk/src/mame/machine/seicop.c
r32329r32330
16041604   m_cop_scale(0),
16051605   m_cop_rng_max_value(0),
16061606   m_copd2_offs(0),
1607   m_cop_status(0),
1608   m_cop_dist(0),
1609   m_cop_angle(0),
16101607   m_cop_hit_status(0),
16111608   m_cop_hit_val_x(0),
16121609   m_cop_hit_val_y(0),
r32329r32330
16151612   m_cop_sort_lookup(0),
16161613   m_cop_sort_ram_addr(0),
16171614   m_cop_sort_param(0),
1618   m_cop_angle_compare(0),
1619   m_cop_angle_mod_val(0),
1615   m_legacycop_angle_compare(0),
1616   m_legacycop_angle_mod_val(0),
16201617   m_r0(0),
16211618   m_r1(0),
16221619   m_cop_rom_addr_lo(0),
r32329r32330
16591656   save_item(NAME(m_cop_scale));
16601657   save_item(NAME(m_cop_rng_max_value));
16611658   save_item(NAME(m_copd2_offs));
1662   save_item(NAME(m_cop_status));
1663   save_item(NAME(m_cop_dist));
1664   save_item(NAME(m_cop_angle));
16651659   save_item(NAME(m_cop_hit_status));
16661660   save_item(NAME(m_cop_hit_val_x));
16671661   save_item(NAME(m_cop_hit_val_y));
r32329r32330
16701664   save_item(NAME(m_cop_sort_lookup));
16711665   save_item(NAME(m_cop_sort_ram_addr));
16721666   save_item(NAME(m_cop_sort_param));
1673   save_item(NAME(m_cop_angle_compare));
1674   save_item(NAME(m_cop_angle_mod_val));
1667   save_item(NAME(m_legacycop_angle_compare));
1668   save_item(NAME(m_legacycop_angle_mod_val));
16751669   save_item(NAME(m_r0));
16761670   save_item(NAME(m_r1));
16771671   save_item(NAME(m_cop_rom_addr_lo));
r32329r32330
18241818         return retvalue;
18251819      }
18261820
1827      case 0x5b0/2:
1828         return m_cop_status;
18291821
1830      case 0x5b2/2:
1831         return m_cop_dist;
18321822
1833      case 0x5b4/2:
1834         return m_cop_angle;
18351823      //case (0x47e/2):
18361824      //case (0x5b0/2):
18371825      //case (0x5b4/2):
r32329r32330
19381926               int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4);
19391927               int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8);
19401928
1941               m_cop_status = 7;
1929               m_raiden2cop->cop_status = 7;
19421930               if(!dx) {
1943                  m_cop_status |= 0x8000;
1944                  m_cop_angle = 0;
1931                  m_raiden2cop->cop_status |= 0x8000;
1932                  m_raiden2cop->cop_angle = 0;
19451933               } else {
1946                  m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
1934                  m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
19471935                  if(dx<0)
1948                     m_cop_angle += 0x80;
1936                     m_raiden2cop->cop_angle += 0x80;
19491937               }
19501938
19511939               m_r0 = dy;
19521940               m_r1 = dx;
19531941
19541942               if(m_cop_mcu_ram[offset] & 0x80)
1955                  space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle);
1943                  space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle);
19561944
19571945               break;
19581946            }
r32329r32330
19641952
19651953               dx >>= 16;
19661954               dy >>= 16;
1967               m_cop_dist = sqrt((double)(dx*dx+dy*dy));
1955               m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy));
19681956
19691957               if(m_cop_mcu_ram[offset] & 0x80)
1970                  space.write_word(m_cop_register[0]+(0x38), m_cop_dist);
1958                  space.write_word(m_cop_register[0]+(0x38), m_raiden2cop->cop_dist);
19711959
19721960               break;
19731961            }
r32329r32330
21212109      case 0x1a6/2:
21222110         return space.machine().firstcpu->total_cycles() % (m_cop_rng_max_value+1);
21232111
2124      case 0x1b0/2:
2125         return m_cop_status;
21262112
2127      case 0x1b2/2:
2128         return m_cop_dist;
2129
2130      case 0x1b4/2:
2131         return m_cop_angle;
2132
21332113      default:
21342114         seibu_cop_log("%06x: COPX unhandled read returning %04x from offset %04x\n", space.device().safe_pc(), retvalue, offset*2);
21352115         return retvalue;
r32329r32330
21672147            m_cop_sprite_dma_size--;
21682148
21692149            if(m_cop_sprite_dma_size > 0)
2170               m_cop_status &= ~2;
2150               m_raiden2cop->cop_status &= ~2;
21712151            else
2172               m_cop_status |= 2;
2152               m_raiden2cop->cop_status |= 2;
21732153         }
21742154         break;
21752155      }
r32329r32330
21802160         break;
21812161
21822162      /* triggered before 0x6200 in Seibu Cup, looks like an angle value ... */
2183      case (0x01c/2): m_cop_angle_compare = UINT16(m_cop_mcu_ram[0x1c/2]);  break;
2184      case (0x01e/2): m_cop_angle_mod_val = UINT16(m_cop_mcu_ram[0x1e/2]); break;
2163      case (0x01c/2): m_legacycop_angle_compare = UINT16(m_cop_mcu_ram[0x1c/2]);  break;
2164      case (0x01e/2): m_legacycop_angle_mod_val = UINT16(m_cop_mcu_ram[0x1e/2]); break;
21852165
21862166
21872167
r32329r32330
23942374            int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4);
23952375            int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8);
23962376
2397            m_cop_status = 7;
2377            m_raiden2cop->cop_status = 7;
23982378            if(!dx) {
2399               m_cop_status |= 0x8000;
2400               m_cop_angle = 0;
2379               m_raiden2cop->cop_status |= 0x8000;
2380               m_raiden2cop->cop_angle = 0;
24012381            } else {
2402               m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
2382               m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
24032383               if(dx<0)
2404                  m_cop_angle += 0x80;
2384                  m_raiden2cop->cop_angle += 0x80;
24052385            }
24062386
24072387            m_r0 = dy;
24082388            m_r1 = dx;
24092389
2410            //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_cop_angle);
2390            //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_raiden2cop->cop_angle);
24112391
24122392            if(m_cop_mcu_ram[offset] & 0x80)
2413               space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle);
2393               space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle);
24142394            return;
24152395         }
24162396
r32329r32330
24222402            int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4);
24232403            int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8);
24242404
2425            m_cop_status = 7;
2405            m_raiden2cop->cop_status = 7;
24262406            if(!dx) {
2427               m_cop_status |= 0x8000;
2428               m_cop_angle = 0;
2407               m_raiden2cop->cop_status |= 0x8000;
2408               m_raiden2cop->cop_angle = 0;
24292409            } else {
2430               m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
2410               m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
24312411               if(dx<0)
2432                  m_cop_angle += 0x80;
2412                  m_raiden2cop->cop_angle += 0x80;
24332413            }
24342414
2435            m_cop_angle-=0x80;
2415            m_raiden2cop->cop_angle-=0x80;
24362416            m_r0 = dy;
24372417            m_r1 = dx;
24382418
24392419            if(m_cop_mcu_ram[offset] & 0x80)
2440               space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle);
2420               space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle);
24412421            return;
24422422         }
24432423
r32329r32330
24572437
24582438            dx >>= 16;
24592439            dy >>= 16;
2460            m_cop_dist = sqrt((double)(dx*dx+dy*dy));
2440            m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy));
24612441
24622442            if(m_cop_mcu_ram[offset] & 0x80)
2463               space.write_word(m_cop_register[0]+(0x38), m_cop_dist);
2443               space.write_word(m_cop_register[0]+(0x38), m_raiden2cop->cop_dist);
24642444            return;
24652445         }
24662446
r32329r32330
24822462            int dx = m_r1;
24832463            int div = space.read_word(m_cop_register[0]+(0x36^2));
24842464            int res;
2485            int m_cop_dist_raw;
2465            int cop_dist_raw;
24862466
24872467            if(!div)
24882468            {
r32329r32330
24942474            /* TODO: recheck if m_cop_scale still masks at 3 with this command */
24952475            dx >>= 11 + m_cop_scale;
24962476            dy >>= 11 + m_cop_scale;
2497            m_cop_dist_raw = sqrt((double)(dx*dx+dy*dy));
2477            cop_dist_raw = sqrt((double)(dx*dx+dy*dy));
24982478
2499            res = m_cop_dist_raw;
2479            res = cop_dist_raw;
25002480            res /= div;
25012481
2502            m_cop_dist = (1 << (5 - m_cop_scale)) / div;
2482            m_raiden2cop->cop_dist = (1 << (5 - m_cop_scale)) / div;
25032483
25042484            /* TODO: bits 5-6-15 */
2505            m_cop_status = 7;
2485            m_raiden2cop->cop_status = 7;
25062486
25072487            space.write_word(m_cop_register[0]+(0x38^2), res);
25082488            return;
r32329r32330
26632643            flags = space.read_word(m_cop_register[1]);
26642644            //space.write_byte(m_cop_register[1] + (0^3),space.read_byte(m_cop_register[1] + (0^3)) & 0xfb); //correct?
26652645
2666            m_cop_angle_compare &= 0xff;
2667            m_cop_angle_mod_val &= 0xff;
2646            m_legacycop_angle_compare &= 0xff;
2647            m_legacycop_angle_mod_val &= 0xff;
26682648            flags &= ~0x0004;
26692649           
2670            int delta = cur_angle - m_cop_angle_compare;
2650            int delta = cur_angle - m_legacycop_angle_compare;
26712651            if(delta >= 128)
26722652               delta -= 256;
26732653            else if(delta < -128)
26742654               delta += 256;
26752655            if(delta < 0)
26762656            {
2677               if(delta >= -m_cop_angle_mod_val)
2657               if(delta >= -m_legacycop_angle_mod_val)
26782658               {
2679                  cur_angle = m_cop_angle_compare;
2659                  cur_angle = m_legacycop_angle_compare;
26802660                  flags |= 0x0004;
26812661               }
26822662               else
2683                  cur_angle += m_cop_angle_mod_val;
2663                  cur_angle += m_legacycop_angle_mod_val;
26842664            }
26852665            else
26862666            {
2687               if(delta <= m_cop_angle_mod_val)
2667               if(delta <= m_legacycop_angle_mod_val)
26882668               {
2689                  cur_angle = m_cop_angle_compare;
2669                  cur_angle = m_legacycop_angle_compare;
26902670                  flags |= 0x0004;
26912671               }
26922672               else
2693                  cur_angle -= m_cop_angle_mod_val;
2673                  cur_angle -= m_legacycop_angle_mod_val;
26942674            }
26952675
26962676            space.write_byte(m_cop_register[1] + (0 ^ 2),flags);
r32329r32330
27112691            flags = space.read_word(m_cop_register[0] + (0 ^ 2));
27122692            //space.write_byte(m_cop_register[1] + (0^3),space.read_byte(m_cop_register[1] + (0^3)) & 0xfb); //correct?
27132693
2714            m_cop_angle_compare &= 0xff;
2715            m_cop_angle_mod_val &= 0xff;
2694            m_legacycop_angle_compare &= 0xff;
2695            m_legacycop_angle_mod_val &= 0xff;
27162696            flags &= ~0x0004;
27172697           
2718            int delta = cur_angle - m_cop_angle_compare;
2698            int delta = cur_angle - m_legacycop_angle_compare;
27192699            if(delta >= 128)
27202700               delta -= 256;
27212701            else if(delta < -128)
27222702               delta += 256;
27232703            if(delta < 0)
27242704            {
2725               if(delta >= -m_cop_angle_mod_val)
2705               if(delta >= -m_legacycop_angle_mod_val)
27262706               {
2727                  cur_angle = m_cop_angle_compare;
2707                  cur_angle = m_legacycop_angle_compare;
27282708                  flags |= 0x0004;
27292709               }
27302710               else
2731                  cur_angle += m_cop_angle_mod_val;
2711                  cur_angle += m_legacycop_angle_mod_val;
27322712            }
27332713            else
27342714            {
2735               if(delta <= m_cop_angle_mod_val)
2715               if(delta <= m_legacycop_angle_mod_val)
27362716               {
2737                  cur_angle = m_cop_angle_compare;
2717                  cur_angle = m_legacycop_angle_compare;
27382718                  flags |= 0x0004;
27392719               }
27402720               else
2741                  cur_angle -= m_cop_angle_mod_val;
2721                  cur_angle -= m_legacycop_angle_mod_val;
27422722            }
27432723
27442724            space.write_byte(m_cop_register[0] + (0 ^ 3),flags);
r32329r32330
27532733            int dy = space.read_dword(m_cop_register[2]+4) - space.read_dword(m_cop_register[0]+4);
27542734            int dx = space.read_dword(m_cop_register[2]+8) - space.read_dword(m_cop_register[0]+8);
27552735
2756            m_cop_status = 7;
2736            m_raiden2cop->cop_status = 7;
27572737            if(!dx) {
2758               m_cop_status |= 0x8000;
2759               m_cop_angle = 0;
2738               m_raiden2cop->cop_status |= 0x8000;
2739               m_raiden2cop->cop_angle = 0;
27602740            } else {
2761               m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
2741               m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
27622742               if(dx<0)
2763                  m_cop_angle += 0x80;
2743                  m_raiden2cop->cop_angle += 0x80;
27642744            }
27652745
27662746            m_r0 = dy;
27672747            m_r1 = dx;
27682748
2769            //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_cop_angle);
2749            //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_raiden2cop->cop_angle);
27702750
27712751            if(m_cop_mcu_ram[offset] & 0x80)
2772               space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle);
2752               space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle);
27732753            return;
27742754         }
27752755
trunk/src/mame/machine/seicop.h
r32329r32330
4545   UINT8 m_cop_rng_max_value;
4646   UINT16 m_copd2_offs;
4747   UINT32 m_cop_register[8];
48   UINT16 m_cop_status,m_cop_dist,m_cop_angle;
4948   UINT16 m_cop_hit_status;
5049   INT16 m_cop_hit_val_x,m_cop_hit_val_y,m_cop_hit_val_z,m_cop_hit_val_unk;
5150   UINT32 m_cop_sort_lookup,m_cop_sort_ram_addr,m_cop_sort_param;
52   INT8 m_cop_angle_compare;
53   INT8 m_cop_angle_mod_val;
51   INT8 m_legacycop_angle_compare;
52   INT8 m_legacycop_angle_mod_val;
5453   struct collision_info m_cop_collision_info[2];
5554   int m_r0, m_r1;
5655   UINT16 m_cop_rom_addr_lo,m_cop_rom_addr_hi,m_cop_rom_addr_unk;
trunk/src/mame/drivers/legionna.c
r32329r32330
125125//   AM_RANGE(0x100582, 0x100587) AM_READ(cop_collision_status_val_r)
126126//   AM_RANGE(0x100588, 0x100589) AM_READ(cop_collision_status_stat_r)
127127   AM_RANGE(0x100590, 0x100599) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_itoa_digits_r)
128//   AM_RANGE(0x1005b0, 0x1005b1) AM_READ(cop_status_r)
129//   AM_RANGE(0x1005b2, 0x1005b3) AM_READ(cop_dist_r)
130//   AM_RANGE(0x1005b4, 0x1005b5) AM_READ(cop_angle_r)
128   AM_RANGE(0x1005b0, 0x1005b1) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_status_r)
129   AM_RANGE(0x1005b2, 0x1005b3) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_dist_r)
130   AM_RANGE(0x1005b4, 0x1005b5) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_angle_r)
131131
132132   AM_RANGE(0x1006fc, 0x1006fd) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_dma_trigger_w)
133133//   AM_RANGE(0x1006fe, 0x1006ff) AM_WRITE(cop_sort_dma_trig_w) // sort-DMA trigger

Previous 199869 Revisions Next


© 1997-2024 The MAME Team