Previous 199869 Revisions Next

r32008 Monday 8th September, 2014 at 22:00:38 UTC by Angelo Salese
Experiment with the bootleg ...
[src/mame/includes]legionna.h
[src/mame/machine]seicop.c

trunk/src/mame/machine/seicop.c
r32007r32008
20362036         return retvalue;
20372037      }
20382038
2039      case 0x5b0/2:
2040         return m_cop_status;
2041
2042      case 0x5b2/2:
2043         return m_cop_dist;
2044
2045      case 0x5b4/2:
2046         return m_cop_angle;
20392047      //case (0x47e/2):
20402048      //case (0x5b0/2):
20412049      //case (0x5b4/2):
r32007r32008
20612069         logerror("%06x: COPX unhandled write data %04x at offset %04x\n", space.device().safe_pc(), data, offset*2);
20622070         break;
20632071      }
2072      case (0x4a0/2): { m_cop_register[0] = (m_cop_register[0]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2073      case (0x4c0/2): { m_cop_register[0] = (m_cop_register[0]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
20642074
2075      case (0x4a2/2): { m_cop_register[1] = (m_cop_register[1]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2076      case (0x4c2/2): { m_cop_register[1] = (m_cop_register[1]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2077
2078      case (0x4a4/2): { m_cop_register[2] = (m_cop_register[2]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2079      case (0x4c4/2): { m_cop_register[2] = (m_cop_register[2]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2080
2081      case (0x4a6/2): { m_cop_register[3] = (m_cop_register[3]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2082      case (0x4c6/2): { m_cop_register[3] = (m_cop_register[3]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2083
2084      case (0x4a8/2): { m_cop_register[4] = (m_cop_register[4]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2085      case (0x4c8/2): { m_cop_register[4] = (m_cop_register[4]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2086
2087      case (0x4aa/2): { m_cop_register[5] = (m_cop_register[5]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2088      case (0x4ca/2): { m_cop_register[5] = (m_cop_register[5]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2089
2090      case (0x4ac/2): { m_cop_register[6] = (m_cop_register[6]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; }
2091      case (0x4cc/2): { m_cop_register[6] = (m_cop_register[6]&0xffff0000)|(m_cop_mcu_ram[offset]<<0);  break; }
2092
2093     
2094      case (0x500/2):
2095      case (0x502/2):
2096      case (0x504/2):
2097         switch(m_cop_mcu_ram[offset])
2098         {
2099            case 0x8100:
2100            {
2101               int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff);
2102               double angle = raw_angle * M_PI / 128;
2103               double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff);
2104               int res;
2105
2106            /* TODO: up direction, why? */
2107               if(raw_angle == 0xc0)
2108                  amp*=2;
2109
2110               res = int(amp*sin(angle)) << m_cop_scale;
2111
2112               space.write_dword(m_cop_register[0] + 0x10, res);
2113
2114               break;
2115            }
2116            case 0x8900:
2117            {
2118               int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff);
2119               double angle = raw_angle * M_PI / 128;
2120               double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff);
2121               int res;
2122
2123               /* TODO: left direction, why? */
2124               if(raw_angle == 0x80)
2125                  amp*=2;
2126
2127               res = int(amp*cos(angle)) << m_cop_scale;
2128
2129               space.write_dword(m_cop_register[0] + 20, res);
2130
2131               break;
2132            }
2133            case 0x0205:
2134            {
2135               UINT8 offs;
2136
2137               offs = (offset & 3) * 4;
2138               int ppos = space.read_dword(m_cop_register[0] + 4 + offs);
2139               int npos = ppos + space.read_dword(m_cop_register[0] + 0x10 + offs);
2140               int delta = (npos >> 16) - (ppos >> 16);
2141
2142               space.write_dword(m_cop_register[0] + 4 + offs, npos);
2143               space.write_word(m_cop_register[0] + 0x1c + offs, space.read_word(m_cop_register[0] + 0x1c + offs) + delta);
2144           
2145               break;
2146            }
2147            case 0x130e:
2148            case 0x138e:
2149            {
2150               int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4);
2151               int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8);
2152
2153               m_cop_status = 7;
2154               if(!dx) {
2155                  m_cop_status |= 0x8000;
2156                  m_cop_angle = 0;
2157               } else {
2158                  m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
2159                  if(dx<0)
2160                     m_cop_angle += 0x80;
2161               }
2162
2163               m_r0 = dy;
2164               m_r1 = dx;
2165
2166               if(m_cop_mcu_ram[offset] & 0x80)
2167                  space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle);
2168
2169               break;
2170            }
2171            case 0x3b30:
2172            case 0x3bb0:
2173            {
2174               int dy = m_r0;
2175               int dx = m_r1;
2176
2177               dx >>= 16;
2178               dy >>= 16;
2179               m_cop_dist = sqrt((double)(dx*dx+dy*dy));
2180
2181               if(m_cop_mcu_ram[offset] & 0x80)
2182                  space.write_word(m_cop_register[0]+(0x38), m_cop_dist);
2183
2184               break;
2185            }
2186            default:
2187               printf("%04x\n",m_cop_mcu_ram[offset]);
2188               break;
2189         }
2190         break;
2191     
20652192      /*TODO: kludge on x-axis.*/
20662193      case (0x660/2): { state->m_scrollram16[0] = m_cop_mcu_ram[offset] - 0x1f0; break; }
20672194      case (0x662/2): { state->m_scrollram16[1] = m_cop_mcu_ram[offset]; break; }
r32007r32008
31083235         }
31093236
31103237         /* private buffer copies */
3111         if ((m_cop_dma_trigger==0x14) || (m_cop_dma_trigger==0x15)) return;
3238         if ((m_cop_dma_trigger==0x14) || (m_cop_dma_trigger==0x15))
3239         return;
31123240
31133241         printf("SRC: %08x %08x DST:%08x SIZE:%08x TRIGGER: %08x\n",m_cop_dma_src[m_cop_dma_trigger] << 6,m_cop_dma_fade_table,m_cop_dma_dst[m_cop_dma_trigger] << 6,m_cop_dma_size[m_cop_dma_trigger] << 5,m_cop_dma_trigger);
31143242
trunk/src/mame/includes/legionna.h
r32007r32008
55public:
66   legionna_state(const machine_config &mconfig, device_type type, const char *tag)
77      : driver_device(mconfig, type, tag),
8         m_spriteram(*this, "spriteram") ,
8         m_spriteram(*this, "spriteram"),
99      m_back_data(*this, "back_data"),
1010      m_fore_data(*this, "fore_data"),
1111      m_mid_data(*this, "mid_data"),

Previous 199869 Revisions Next


© 1997-2024 The MAME Team