Previous 199869 Revisions Next

r32333 Tuesday 23rd September, 2014 at 22:55:48 UTC by David Haywood
more (nw)
[src/mame/drivers]legionna.c
[src/mame/machine]raiden2cop.c raiden2cop.h seicop.c seicop.h

trunk/src/mame/drivers/legionna.c
r32332r32333
9797   AM_RANGE(0x100424, 0x100425) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_itoa_digit_count_w)
9898   AM_RANGE(0x100428, 0x100429) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_dma_v1_w)
9999   AM_RANGE(0x10042a, 0x10042b) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_dma_v2_w)
100   AM_RANGE(0x10042c, 0x10042d) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_prng_maxvalue_r, cop_prng_maxvalue_w)
100101   AM_RANGE(0x100432, 0x100433) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_data_w)
101102   AM_RANGE(0x100434, 0x100435) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_addr_w)
102103//   AM_RANGE(0x100436, 0x100437) AM_WRITE(cop_hitbox_baseadr_w)
103104   AM_RANGE(0x100438, 0x100439) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_value_w)
104105   AM_RANGE(0x10043a, 0x10043b) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_mask_w)
105106   AM_RANGE(0x10043c, 0x10043d) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_trigger_w)
106//   AM_RANGE(0x100444, 0x100445) AM_WRITE(cop_scale_w)
107//   AM_RANGE(0x100450, 0x100451) AM_WRITE(cop_sort_ram_addr_hi_w)
108//   AM_RANGE(0x100452, 0x100453) AM_WRITE(cop_sort_ram_addr_lo_w)
109//   AM_RANGE(0x100454, 0x100455) AM_WRITE(cop_sort_lookup_hi_w)
110//   AM_RANGE(0x100456, 0x100457) AM_WRITE(cop_sort_lookup_lo_w)
111//   AM_RANGE(0x100458, 0x100459) AM_WRITE(cop_sort_param_w)
107   AM_RANGE(0x100444, 0x100445) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_scale_w)
108   AM_RANGE(0x100450, 0x100451) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_ram_addr_hi_w)
109   AM_RANGE(0x100452, 0x100453) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_ram_addr_lo_w)
110   AM_RANGE(0x100454, 0x100455) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_lookup_hi_w)
111   AM_RANGE(0x100456, 0x100457) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_lookup_lo_w)
112   AM_RANGE(0x100458, 0x100459) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_param_w)
112113   AM_RANGE(0x10045a, 0x10045b) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pal_brightness_val_w) //palette DMA brightness val, used by X Se Dae / Zero Team
113114   AM_RANGE(0x10045c, 0x10045d) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pal_brightness_mode_w)  //palette DMA brightness mode, used by X Se Dae / Zero Team (sets to 5)
114115//   AM_RANGE(0x100470, 0x100471) AM_READWRITE(cop_tile_bank_2_r,cop_tile_bank_2_w)
r32332r32333
125126//   AM_RANGE(0x100582, 0x100587) AM_READ(cop_collision_status_val_r)
126127//   AM_RANGE(0x100588, 0x100589) AM_READ(cop_collision_status_stat_r)
127128   AM_RANGE(0x100590, 0x100599) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_itoa_digits_r)
129
130   AM_RANGE(0x1005a0, 0x1005a7) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_prng_r)
131
128132   AM_RANGE(0x1005b0, 0x1005b1) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_status_r)
129133   AM_RANGE(0x1005b2, 0x1005b3) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_dist_r)
130134   AM_RANGE(0x1005b4, 0x1005b5) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_angle_r)
131135
132136   AM_RANGE(0x1006fc, 0x1006fd) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_dma_trigger_w)
133//   AM_RANGE(0x1006fe, 0x1006ff) AM_WRITE(cop_sort_dma_trig_w) // sort-DMA trigger
137   AM_RANGE(0x1006fe, 0x1006ff) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_sort_dma_trig_w) // sort-DMA trigger
134138ADDRESS_MAP_END
135139
136140
trunk/src/mame/machine/seicop.c
r32332r32333
16011601seibu_cop_legacy_device::seibu_cop_legacy_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
16021602   : device_t(mconfig, SEIBU_COP_LEGACY, "Seibu COP Legacy", tag, owner, clock, "seibu_cop_legacy", __FILE__),
16031603   m_cop_mcu_ram(NULL),
1604   m_cop_scale(0),
1605   m_cop_rng_max_value(0),
16061604   m_copd2_offs(0),
1607   m_cop_hit_status(0),
16081605   m_cop_hit_val_x(0),
16091606   m_cop_hit_val_y(0),
16101607   m_cop_hit_val_z(0),
16111608   m_cop_hit_val_unk(0),
1612   m_cop_sort_lookup(0),
1613   m_cop_sort_ram_addr(0),
1614   m_cop_sort_param(0),
16151609   m_legacycop_angle_compare(0),
16161610   m_legacycop_angle_mod_val(0),
16171611   m_r0(0),
r32332r32333
16501644{
16511645   m_cop_mcu_ram = reinterpret_cast<UINT16 *>(machine().root_device().memshare("cop_mcu_ram")->ptr());
16521646
1653   save_item(NAME(m_cop_scale));
1654   save_item(NAME(m_cop_rng_max_value));
1647
16551648   save_item(NAME(m_copd2_offs));
1656   save_item(NAME(m_cop_hit_status));
16571649   save_item(NAME(m_cop_hit_val_x));
16581650   save_item(NAME(m_cop_hit_val_y));
16591651   save_item(NAME(m_cop_hit_val_z));
16601652   save_item(NAME(m_cop_hit_val_unk));
1661   save_item(NAME(m_cop_sort_lookup));
1662   save_item(NAME(m_cop_sort_ram_addr));
1663   save_item(NAME(m_cop_sort_param));
16641653   save_item(NAME(m_legacycop_angle_compare));
16651654   save_item(NAME(m_legacycop_angle_mod_val));
16661655   save_item(NAME(m_r0));
r32332r32333
18601849               if(raw_angle == 0xc0)
18611850                  amp*=2;
18621851
1863               res = int(amp*sin(angle)) << m_cop_scale;
1852               res = int(amp*sin(angle)) << m_raiden2cop->cop_scale;
18641853
18651854               space.write_dword(m_raiden2cop->cop_regs[0] + 0x10, res);
18661855
r32332r32333
18771866               if(raw_angle == 0x80)
18781867                  amp*=2;
18791868
1880               res = int(amp*cos(angle)) << m_cop_scale;
1869               res = int(amp*cos(angle)) << m_raiden2cop->cop_scale;
18811870
18821871               space.write_dword(m_raiden2cop->cop_regs[0] + 20, res);
18831872
r32332r32333
20532042
20542043   switch (offset)
20552044   {
2056      /* RNG max value readback, trusted */
2057      case 0x02c/2:
2058         return retvalue;
20592045
2060      /* DMA mode register readback, trusted */
2061      case 0x07e/2:
2062         return retvalue;
2063
2064      case 0x180/2:
2065         return m_cop_hit_status;
2066
20672046      /* these two controls facing direction in Godzilla opponents (only vs.) - x value compare? */
20682047      case 0x182/2:
20692048         return (m_cop_hit_val_y);
r32332r32333
20792058         return m_cop_hit_val_unk;
20802059
20812060
2082      /* RNG, trusted */
2083      case 0x1a0/2:
2084      case 0x1a2/2:
2085      case 0x1a4/2:
2086      case 0x1a6/2:
2087         return space.machine().firstcpu->total_cycles() % (m_cop_rng_max_value+1);
20882061
20892062
20902063      default:
r32332r32333
21462119         
21472120         
21482121
2149      /* max possible value returned by the RNG at 0x5a*, trusted */
2150      case (0x02c/2): m_cop_rng_max_value = m_cop_mcu_ram[0x2c/2] & 0xff; break;
2151
2122     
21522123      case (0x03e/2):
21532124         /*
21542125         0 in all 68k based games
r32332r32333
21582129         */
21592130         break;
21602131
2161      case (0x044/2): { m_cop_scale = data & 3; break; }
21622132      case (0x046/2): { m_cop_rom_addr_unk = data & 0xffff; break; }
21632133      case (0x048/2): { m_cop_rom_addr_lo = data & 0xffff; break; }
21642134      case (0x04a/2): { m_cop_rom_addr_hi = data & 0xffff; break; }
r32332r32333
22872257            if(raw_angle == 0xc0)
22882258               amp*=2;
22892259
2290            res = int(amp*sin(angle)) << m_cop_scale;
2260            res = int(amp*sin(angle)) << m_raiden2cop->cop_scale;
22912261
22922262            space.write_dword(m_raiden2cop->cop_regs[0] + 0x10, res);
22932263            return;
r32332r32333
23172287            if(raw_angle == 0x80)
23182288               amp*=2;
23192289
2320            res = int(amp*cos(angle)) << m_cop_scale;
2290            res = int(amp*cos(angle)) << m_raiden2cop->cop_scale;
23212291
23222292            space.write_dword(m_raiden2cop->cop_regs[0] + 20, res);
23232293            return;
r32332r32333
24272397            }
24282398
24292399            /* TODO: calculation of this one should occur at 0x3b30/0x3bb0 I *think* */
2430            /* TODO: recheck if m_cop_scale still masks at 3 with this command */
2431            dx >>= 11 + m_cop_scale;
2432            dy >>= 11 + m_cop_scale;
2400            /* TODO: recheck if m_raiden2cop->cop_scale still masks at 3 with this command */
2401            dx >>= 11 + m_raiden2cop->cop_scale;
2402            dy >>= 11 + m_raiden2cop->cop_scale;
24332403            cop_dist_raw = sqrt((double)(dx*dx+dy*dy));
24342404
24352405            res = cop_dist_raw;
24362406            res /= div;
24372407
2438            m_raiden2cop->cop_dist = (1 << (5 - m_cop_scale)) / div;
2408            m_raiden2cop->cop_dist = (1 << (5 - m_raiden2cop->cop_scale)) / div;
24392409
24402410            /* TODO: bits 5-6-15 */
24412411            m_raiden2cop->cop_status = 7;
r32332r32333
24752445
24762446            /* do the math */
24772447            cop_take_hit_box_params(0);
2478            m_cop_hit_status = cop_calculate_collsion_detection();
2448            m_raiden2cop->cop_hit_status = cop_calculate_collsion_detection();
24792449
24802450            return;
24812451         }
r32332r32333
24982468
24992469            /* do the math */
25002470            cop_take_hit_box_params(1);
2501            m_cop_hit_status = cop_calculate_collsion_detection();
2471            m_raiden2cop->cop_hit_status = cop_calculate_collsion_detection();
25022472            return;
25032473         }
25042474
r32332r32333
27292699         break;
27302700      }
27312701
2732      /* DMA go register */
2733      case (0x2fc/2):   m_raiden2cop->cop_dma_trigger_w(space, offset, data, mem_mask);   break;
27342702
27352703
2736      /* sort-DMA, oh my ... */
2737      case (0x054/2): { m_cop_sort_lookup = (m_cop_sort_lookup&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2738      case (0x056/2): { m_cop_sort_lookup = (m_cop_sort_lookup&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2739      case (0x050/2): { m_cop_sort_ram_addr = (m_cop_sort_ram_addr&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2740      case (0x052/2): { m_cop_sort_ram_addr = (m_cop_sort_ram_addr&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2741      case (0x058/2): { m_cop_sort_param = m_cop_mcu_ram[offset]; break; }
27422704
2743      case (0x2fe/2):
2744      {
2745         UINT16 sort_size;
27462705
2747         sort_size = m_cop_mcu_ram[offset];
2748
2749         {
2750            int i,j;
2751            UINT8 xchg_flag;
2752            UINT32 addri,addrj;
2753            UINT16 vali,valj;
2754
2755            /* TODO: use a better algorithm than bubble sort! */
2756            for(i=2;i<sort_size;i+=2)
2757            {
2758               for(j=i-2;j<sort_size;j+=2)
2759               {
2760                  addri = m_cop_sort_ram_addr+space.read_word(m_cop_sort_lookup+i);
2761                  addrj = m_cop_sort_ram_addr+space.read_word(m_cop_sort_lookup+j);
2762
2763                  vali = space.read_word(addri);
2764                  valj = space.read_word(addrj);
2765
2766                  //printf("%08x %08x %04x %04x\n",addri,addrj,vali,valj);
2767
2768                  switch(m_cop_sort_param)
2769                  {
2770                     case 2: xchg_flag = (vali > valj); break;
2771                     case 1: xchg_flag = (vali < valj); break;
2772                     case 0: xchg_flag = 0; break; /* ??? */
2773                     default: xchg_flag = 0; printf("Warning: sort-DMA used with param %02x\n",m_cop_sort_param); break;
2774                  }
2775
2776                  if(xchg_flag)
2777                  {
2778                     UINT16 xch_val;
2779
2780                     xch_val = space.read_word(m_cop_sort_lookup+i);
2781                     space.write_word(m_cop_sort_lookup+i,space.read_word(m_cop_sort_lookup+j));
2782                     space.write_word(m_cop_sort_lookup+j,xch_val);
2783                  }
2784               }
2785            }
2786         }
2787         //else
2788
2789         break;
2790      }
27912706   }
27922707}
trunk/src/mame/machine/seicop.h
r32332r32333
4141   UINT16 *m_cop_mcu_ram;
4242
4343
44   UINT16 m_cop_scale;
45   UINT8 m_cop_rng_max_value;
44
4645   UINT16 m_copd2_offs;
47   UINT16 m_cop_hit_status;
4846   INT16 m_cop_hit_val_x,m_cop_hit_val_y,m_cop_hit_val_z,m_cop_hit_val_unk;
49   UINT32 m_cop_sort_lookup,m_cop_sort_ram_addr,m_cop_sort_param;
5047   INT8 m_legacycop_angle_compare;
5148   INT8 m_legacycop_angle_mod_val;
5249   struct collision_info m_cop_collision_info[2];
r32332r32333
5754   int m_cop_sprite_dma_abs_x,m_cop_sprite_dma_abs_y,m_cop_sprite_dma_size;
5855   UINT32 m_cop_sprite_dma_param;
5956
60   void copd2_set_tableoffset(UINT16 data);
61   void copd2_set_tabledata(UINT16 data);
57
6258   void cop_take_hit_box_params(UINT8 offs);
6359   UINT8 cop_calculate_collsion_detection();
6460
trunk/src/mame/machine/raiden2cop.c
r32332r32333
4141   cop_sort_lookup(0),
4242   cop_sort_param(0),
4343
44   m_cop_rng_max_value(0),
45
4446   m_videoramout_cb(*this),
4547   m_palette(*this, ":palette")
4648{
r32332r32333
125127   save_item(NAME(cop_collision_info[1].allow_swap));
126128   save_item(NAME(cop_collision_info[1].flags_swap));
127129
130   save_item(NAME(m_cop_rng_max_value));
131
132
128133   m_videoramout_cb.resolve_safe();
129134
130135   cop_itoa_digit_count = 4; //TODO: Raiden 2 never inits the BCD register, value here is a guess (8 digits, as WR is 10.000.000 + a)
r32332r32333
10581063   }
10591064}
10601065
1066/* Random number generators (only verified on 68k games) */
10611067
1068READ16_MEMBER(raiden2cop_device::cop_prng_r)
1069{
1070   return space.machine().firstcpu->total_cycles() % (m_cop_rng_max_value + 1);
1071}
1072
1073/* max possible value returned by the RNG at 0x5a*, trusted */
1074WRITE16_MEMBER(raiden2cop_device::cop_prng_maxvalue_w)
1075{
1076   COMBINE_DATA(&m_cop_rng_max_value);
1077}
1078
1079READ16_MEMBER(raiden2cop_device::cop_prng_maxvalue_r)
1080{
1081   return m_cop_rng_max_value;
1082}
No newline at end of file
trunk/src/mame/machine/raiden2cop.h
r32332r32333
144144   UINT32 cop_sort_ram_addr, cop_sort_lookup;
145145   UINT16 cop_sort_param;
146146
147   // RNG
148   UINT16 m_cop_rng_max_value;
149   DECLARE_READ16_MEMBER(cop_prng_r);
150   DECLARE_WRITE16_MEMBER(cop_prng_maxvalue_w);
151   DECLARE_READ16_MEMBER(cop_prng_maxvalue_r);
152
153
147154protected:
148155   // device-level overrides
149156   virtual void device_start();

Previous 199869 Revisions Next


© 1997-2024 The MAME Team