trunk/src/mame/drivers/model3.c
| r243053 | r243054 | |
| 1756 | 1756 | |
| 1757 | 1757 | READ64_MEMBER(model3_state::model3_security_r) |
| 1758 | 1758 | { |
| 1759 | UINT64 retvalue = U64(0xffffffffffffffff); |
| 1760 | |
| 1759 | 1761 | switch(offset) |
| 1760 | 1762 | { |
| 1761 | | case 0x00/8: return 0; /* status */ |
| 1763 | case 0x00 / 8: retvalue = 0; break; /* status */ |
| 1762 | 1764 | case 0x1c/8: /* security board data read */ |
| 1763 | 1765 | { |
| 1764 | 1766 | if (core_stricmp(machine().system().name, "vs299") == 0 || |
| 1765 | 1767 | core_stricmp(machine().system().name, "vs2v991") == 0) |
| 1766 | 1768 | { |
| 1767 | | return (UINT64)vs299_prot_data[m_prot_data_ptr++] << 48; |
| 1769 | retvalue = (UINT64)vs299_prot_data[m_prot_data_ptr++] << 48; |
| 1768 | 1770 | } |
| 1769 | 1771 | else if (core_stricmp(machine().system().name, "swtrilgy") == 0 || |
| 1770 | 1772 | core_stricmp(machine().system().name, "swtrilgya") == 0) |
| r243053 | r243054 | |
| 1774 | 1776 | { |
| 1775 | 1777 | m_prot_data_ptr = 0; |
| 1776 | 1778 | } |
| 1777 | | return data; |
| 1779 | retvalue = data; |
| 1778 | 1780 | } |
| 1779 | 1781 | else if (core_stricmp(machine().system().name, "fvipers2") == 0) |
| 1780 | 1782 | { |
| r243053 | r243054 | |
| 1783 | 1785 | { |
| 1784 | 1786 | m_prot_data_ptr = 0; |
| 1785 | 1787 | } |
| 1786 | | return data; |
| 1788 | retvalue = data; |
| 1787 | 1789 | } |
| 1788 | 1790 | else if (core_stricmp(machine().system().name, "spikeout") == 0 || |
| 1789 | 1791 | core_stricmp(machine().system().name, "spikeofe") == 0) |
| r243053 | r243054 | |
| 1793 | 1795 | { |
| 1794 | 1796 | m_prot_data_ptr = 0; |
| 1795 | 1797 | } |
| 1796 | | return data; |
| 1798 | retvalue = data; |
| 1797 | 1799 | } |
| 1798 | 1800 | else if (core_stricmp(machine().system().name, "eca") == 0 || |
| 1799 | 1801 | core_stricmp(machine().system().name, "ecax") == 0) |
| r243053 | r243054 | |
| 1803 | 1805 | { |
| 1804 | 1806 | m_prot_data_ptr = 0; |
| 1805 | 1807 | } |
| 1806 | | return data; |
| 1808 | retvalue = data; |
| 1807 | 1809 | } |
| 1808 | 1810 | else if (core_stricmp(machine().system().name, "oceanhun") == 0) |
| 1809 | 1811 | { |
| r243053 | r243054 | |
| 1812 | 1814 | { |
| 1813 | 1815 | m_prot_data_ptr = 0; |
| 1814 | 1816 | } |
| 1815 | | return data; |
| 1817 | retvalue = data; |
| 1816 | 1818 | } |
| 1817 | 1819 | else |
| 1818 | 1820 | { |
| 1819 | | return 0; |
| 1821 | retvalue = 0; |
| 1820 | 1822 | } |
| 1823 | break; |
| 1821 | 1824 | } |
| 1822 | 1825 | } |
| 1823 | | return U64(0xffffffffffffffff); |
| 1826 | printf("model3_security_r offset %08x : %08x%08x (%08x%08x)\n", offset * 8, (UINT32)(retvalue >> 32), (UINT32)(retvalue & 0xffffffff), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask & 0xffffffff)); |
| 1827 | |
| 1828 | return retvalue; |
| 1824 | 1829 | } |
| 1825 | 1830 | |
| 1831 | READ64_MEMBER(model3_state::model3_5881prot_r) |
| 1832 | { |
| 1833 | UINT64 retvalue = U64(0xffffffffffffffff); |
| 1834 | |
| 1835 | if (offset == 0x00 / 8) |
| 1836 | { |
| 1837 | retvalue = 0; |
| 1838 | } |
| 1839 | else if (offset == 0x18 / 8) |
| 1840 | { |
| 1841 | if (first_read == 1) |
| 1842 | { |
| 1843 | // the RAM based schemes expect a dummy value before the start of the stream |
| 1844 | // to match the previous simulation I use 0xffff here |
| 1845 | first_read = 0; |
| 1846 | retvalue = 0xffff << 16; |
| 1847 | } |
| 1848 | else |
| 1849 | { |
| 1850 | UINT8* base; |
| 1851 | retvalue = m_cryptdevice->do_decrypt(base); |
| 1852 | // retvalue = ((retvalue & 0xff00) >> 8) | ((retvalue & 0x00ff) << 8); // don't endian swap the return value on this hardware |
| 1853 | retvalue <<= 16; |
| 1854 | } |
| 1855 | |
| 1856 | // printf("model3_5881prot_r offset %08x : %08x%08x (%08x%08x)\n", offset * 8, (UINT32)(retvalue >> 32), (UINT32)(retvalue & 0xffffffff), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask & 0xffffffff)); |
| 1857 | } |
| 1858 | else |
| 1859 | { |
| 1860 | printf("model3_5881prot_r offset %08x : %08x%08x (%08x%08x)\n", offset * 8, (UINT32)(retvalue >> 32), (UINT32)(retvalue & 0xffffffff), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask & 0xffffffff)); |
| 1861 | } |
| 1862 | |
| 1863 | return retvalue; |
| 1864 | |
| 1865 | |
| 1866 | } |
| 1867 | |
| 1868 | WRITE64_MEMBER(model3_state::model3_5881prot_w) |
| 1869 | { |
| 1870 | if (offset == 0x10 / 8) |
| 1871 | { |
| 1872 | // code is copied to RAM first, so base address is always 0 |
| 1873 | m_cryptdevice->set_addr_low(0); |
| 1874 | m_cryptdevice->set_addr_high(0); |
| 1875 | |
| 1876 | if (data != 0) |
| 1877 | printf("model3_5881prot_w address isn't 0?\n"); |
| 1878 | |
| 1879 | first_read = 1; |
| 1880 | } |
| 1881 | else if (offset == 0x18 / 8) |
| 1882 | { |
| 1883 | UINT16 subkey = data >> (32 + 16); |
| 1884 | subkey = ((subkey & 0xff00) >> 8) | ((subkey & 0x00ff) << 8); // endian swap the sub-key for this hardware |
| 1885 | printf("model3_5881prot_w setting subkey %04x\n", subkey); |
| 1886 | m_cryptdevice->set_subkey(subkey); |
| 1887 | } |
| 1888 | else |
| 1889 | { |
| 1890 | printf("model3_5881prot_w offset %08x : %08x%08x (%08x%08x)\n", offset * 8, (UINT32)(data >> 32), (UINT32)(data & 0xffffffff), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask & 0xffffffff)); |
| 1891 | } |
| 1892 | |
| 1893 | |
| 1894 | |
| 1895 | } |
| 1896 | |
| 1826 | 1897 | WRITE64_MEMBER(model3_state::daytona2_rombank_w) |
| 1827 | 1898 | { |
| 1828 | 1899 | if (ACCESSING_BITS_56_63) |
| r243053 | r243054 | |
| 1847 | 1918 | AM_RANGE(0xf00c0000, 0xf00dffff) AM_MIRROR(0x0e000000) AM_RAM AM_SHARE("backup") /* backup SRAM */ |
| 1848 | 1919 | AM_RANGE(0xf0100000, 0xf010003f) AM_MIRROR(0x0e000000) AM_READWRITE(model3_sys_r, model3_sys_w ) |
| 1849 | 1920 | AM_RANGE(0xf0140000, 0xf014003f) AM_MIRROR(0x0e000000) AM_READWRITE(model3_rtc_r, model3_rtc_w ) |
| 1850 | | AM_RANGE(0xf0180000, 0xf019ffff) AM_MIRROR(0x0e000000) AM_RAM /* Security Board RAM */ |
| 1851 | | AM_RANGE(0xf01a0000, 0xf01a003f) AM_MIRROR(0x0e000000) AM_READ(model3_security_r ) /* Security board */ |
| 1852 | 1921 | |
| 1853 | 1922 | AM_RANGE(0xf1000000, 0xf10f7fff) AM_READWRITE(model3_char_r, model3_char_w ) /* character RAM */ |
| 1854 | 1923 | AM_RANGE(0xf10f8000, 0xf10fffff) AM_READWRITE(model3_tile_r, model3_tile_w ) /* tilemaps */ |
| r243053 | r243054 | |
| 5591 | 5660 | MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) |
| 5592 | 5661 | MACHINE_CONFIG_END |
| 5593 | 5662 | |
| 5663 | UINT16 model3_state::crypt_read_callback(UINT32 addr) |
| 5664 | { |
| 5665 | UINT16 dat = 0; |
| 5666 | if (addr < 0x8000) |
| 5667 | { |
| 5668 | dat = m_maincpu->space().read_word((0xf0180000 + 4 * addr)); // every other word is unused in this RAM, probably 32-bit ram on 64-bit bus? |
| 5669 | } |
| 5670 | |
| 5671 | // dat = ((dat & 0xff00) >> 8) | ((dat & 0x00ff) << 8); |
| 5672 | // printf("reading %04x\n", dat); |
| 5673 | return dat; |
| 5674 | } |
| 5675 | |
| 5676 | static MACHINE_CONFIG_DERIVED( model3_21_5881, model3_21 ) |
| 5677 | MCFG_DEVICE_ADD("315_5881", SEGA315_5881_CRYPT, 0) |
| 5678 | MCFG_SET_READ_CALLBACK(model3_state, crypt_read_callback) |
| 5679 | MACHINE_CONFIG_END |
| 5680 | |
| 5681 | |
| 5594 | 5682 | static void interleave_vroms(running_machine &machine) |
| 5595 | 5683 | { |
| 5596 | 5684 | model3_state *state = machine.driver_data<model3_state>(); |
| r243053 | r243054 | |
| 5622 | 5710 | } |
| 5623 | 5711 | } |
| 5624 | 5712 | |
| 5713 | DRIVER_INIT_MEMBER(model3_state, genprot) |
| 5714 | { |
| 5715 | INT64 key = get_315_5881_key(machine()); |
| 5716 | |
| 5717 | m_maincpu->space(AS_PROGRAM).install_ram(0xf0180000, 0xf019ffff, 0, 0x0e000000); |
| 5718 | |
| 5719 | if (key != -1) |
| 5720 | { |
| 5721 | // m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xf01a0000, 0xf01a003f, read64_delegate(FUNC(model3_state::model3_5881prot_r), this), write64_delegate(FUNC(model3_state::model3_5881prot_w), this)); |
| 5722 | m_cryptdevice->set_key(key); |
| 5723 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xf01a0000, 0xf01a003f, 0, 0x0e000000, read64_delegate(FUNC(model3_state::model3_5881prot_r), this), write64_delegate(FUNC(model3_state::model3_5881prot_w), this) ); |
| 5724 | } |
| 5725 | else |
| 5726 | { |
| 5727 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xf01a0000, 0xf01a003f, 0, 0x0e000000, read64_delegate(FUNC(model3_state::model3_security_r), this) ); |
| 5728 | } |
| 5729 | } |
| 5730 | |
| 5625 | 5731 | DRIVER_INIT_MEMBER(model3_state,model3_10) |
| 5626 | 5732 | { |
| 5627 | 5733 | interleave_vroms(machine()); |
| r243053 | r243054 | |
| 5842 | 5948 | |
| 5843 | 5949 | DRIVER_INIT_MEMBER(model3_state,swtrilgy) |
| 5844 | 5950 | { |
| 5951 | |
| 5845 | 5952 | UINT32 *rom = (UINT32*)memregion("user1")->base(); |
| 5846 | 5953 | DRIVER_INIT_CALL(model3_20); |
| 5847 | 5954 | |
| r243053 | r243054 | |
| 5852 | 5959 | |
| 5853 | 5960 | rom[(0x043dc^4)/4] = 0x48000090; // skip force feedback setup |
| 5854 | 5961 | rom[(0xf6e44^4)/4] = 0x60000000; |
| 5962 | |
| 5963 | |
| 5964 | DRIVER_INIT_CALL(genprot); |
| 5965 | |
| 5855 | 5966 | } |
| 5856 | 5967 | |
| 5857 | 5968 | DRIVER_INIT_MEMBER(model3_state,swtrilga) |
| r243053 | r243054 | |
| 6003 | 6114 | GAME( 1999, vs299, vs2v991, model3_20, model3, model3_state, vs299, ROT0, "Sega", "Virtua Striker 2 '99", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6004 | 6115 | |
| 6005 | 6116 | /* Model 3 Step 2.1 */ |
| 6006 | | GAME( 1998, daytona2, 0, model3_21, daytona2, model3_state, daytona2, ROT0, "Sega", "Daytona USA 2 (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6007 | | GAME( 1998, dayto2pe, 0, model3_21, daytona2, model3_state, dayto2pe, ROT0, "Sega", "Daytona USA 2 Power Edition", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6008 | | GAME( 1998, dirtdvls, 0, model3_21, scud, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 1) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6009 | | GAME( 1998, dirtdvlsa, dirtdvls, model3_21, scud, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 2) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6010 | | GAME( 1998, swtrilgy, 0, model3_21, swtrilgy, model3_state, swtrilgy, ROT0, "Sega / LucasArts", "Star Wars Trilogy (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6011 | | GAME( 1998, swtrilgya, swtrilgy, model3_21, swtrilgy, model3_state, swtrilga, ROT0, "Sega / LucasArts", "Star Wars Trilogy", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6012 | | GAME( 1998, spikeout, 0, model3_21, model3, model3_state, spikeout, ROT0, "Sega", "Spikeout (Revision C)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6013 | | GAME( 1998, spikeofe, 0, model3_21, model3, model3_state, spikeofe, ROT0, "Sega", "Spikeout Final Edition", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6014 | | GAME( 1998, magtruck, 0, model3_21, eca, model3_state, magtruck, ROT0, "Sega", "Magical Truck Adventure", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6015 | | GAME( 1999, eca, 0, model3_21, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6016 | | GAME( 1999, ecax, eca, model3_21, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance (Export)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6017 | | GAME( 1999, ecap, eca, model3_21, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance (US location test?)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6117 | GAME( 1998, daytona2, 0, model3_21, daytona2, model3_state, daytona2, ROT0, "Sega", "Daytona USA 2 (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6118 | GAME( 1998, dayto2pe, 0, model3_21, daytona2, model3_state, dayto2pe, ROT0, "Sega", "Daytona USA 2 Power Edition", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6119 | GAME( 1998, dirtdvls, 0, model3_21, scud, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 1) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6120 | GAME( 1998, dirtdvlsa, dirtdvls, model3_21, scud, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 2) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6121 | GAME( 1998, swtrilgy, 0, model3_21_5881, swtrilgy, model3_state, swtrilgy, ROT0, "Sega / LucasArts", "Star Wars Trilogy (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6122 | GAME( 1998, swtrilgya, swtrilgy, model3_21_5881, swtrilgy, model3_state, swtrilga, ROT0, "Sega / LucasArts", "Star Wars Trilogy", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6123 | GAME( 1998, spikeout, 0, model3_21, model3, model3_state, spikeout, ROT0, "Sega", "Spikeout (Revision C)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6124 | GAME( 1998, spikeofe, 0, model3_21, model3, model3_state, spikeofe, ROT0, "Sega", "Spikeout Final Edition", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6125 | GAME( 1998, magtruck, 0, model3_21, eca, model3_state, magtruck, ROT0, "Sega", "Magical Truck Adventure", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6126 | GAME( 1999, eca, 0, model3_21, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6127 | GAME( 1999, ecax, eca, model3_21, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance (Export)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6128 | GAME( 1999, ecap, eca, model3_21, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance (US location test?)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |