trunk/src/mame/drivers/model3.c
| r243072 | r243073 | |
| 664 | 664 | #include "machine/nvram.h" |
| 665 | 665 | #include "includes/model3.h" |
| 666 | 666 | |
| 667 | //#define DECRYPT_ANALYSIS_HACKS |
| 667 | 668 | |
| 669 | #ifdef DECRYPT_ANALYSIS_HACKS |
| 670 | int readcount = 0; |
| 671 | int segcount = 0; |
| 672 | #endif |
| 673 | |
| 668 | 674 | void model3_state::update_irq_state() |
| 669 | 675 | { |
| 670 | 676 | if ((m_irq_enable & m_irq_state) || m_scsi_irq_state) |
| r243072 | r243073 | |
| 1710 | 1716 | 0x7470, 0x202e, 0x3123, 0x660a, 0x726f, 0x7420, 0x7365, 0x0a74, |
| 1711 | 1717 | }; |
| 1712 | 1718 | |
| 1713 | | static const UINT16 oceanhun_prot_data[] = |
| 1714 | | { |
| 1715 | | 0x0000, // dummy read |
| 1716 | | 0x3d3d, 0x203d, 0x434f, 0x4145, 0x204e, 0x5548, 0x544e, 0x5245, |
| 1717 | | 0x3d20, 0x3d3d, 0x430a, 0x706f, 0x5279, 0x6769, 0x7468, 0x5320, |
| 1718 | | 0x4745, 0x2041, 0x6e45, 0x6574, 0x7072, 0x6972, 0x6573, 0x2c73, |
| 1719 | | 0x4c20, 0x6474, 0x0a2e, 0x6d41, 0x7375, 0x6d65, 0x6e65, 0x2074, |
| 1720 | | 0x2652, 0x2044, 0x6544, 0x7470, 0x202e, 0x3123, 0x4b0a, 0x7a61, |
| 1721 | | 0x6e75, 0x7261, 0x2069, 0x7354, 0x6b75, 0x6d61, 0x746f, 0x206f, |
| 1722 | | 0x6553, 0x7463, 0x6f69, 0x206e, 0x614d, 0x616e, 0x6567, 0x0a72 |
| 1723 | | }; |
| 1724 | | /* |
| 1725 | | dirtdvls: first 2 words read are discarded, then every other word |
| 1726 | | is written to char RAM starting at f1013400 (in between words are |
| 1727 | | discarded). |
| 1728 | | */ |
| 1729 | 1719 | |
| 1720 | |
| 1721 | |
| 1730 | 1722 | READ64_MEMBER(model3_state::model3_security_r) |
| 1731 | 1723 | { |
| 1732 | 1724 | UINT64 retvalue = U64(0xffffffffffffffff); |
| r243072 | r243073 | |
| 1736 | 1728 | case 0x00 / 8: retvalue = 0; break; /* status */ |
| 1737 | 1729 | case 0x1c/8: /* security board data read */ |
| 1738 | 1730 | { |
| 1731 | #ifdef DECRYPT_ANALYSIS_HACKS |
| 1732 | readcount += 2; |
| 1733 | printf("model3_security_r offset %08x : %08x%08x (%08x%08x) count %08x\n", offset * 8, (UINT32)(retvalue >> 32), (UINT32)(retvalue & 0xffffffff), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask & 0xffffffff), readcount); |
| 1734 | #endif |
| 1735 | |
| 1739 | 1736 | if (core_stricmp(machine().system().name, "fvipers2") == 0) |
| 1740 | 1737 | { |
| 1741 | 1738 | UINT64 data = (UINT64)fvipers2_prot_data[m_prot_data_ptr++] << 16; |
| r243072 | r243073 | |
| 1765 | 1762 | } |
| 1766 | 1763 | retvalue = data; |
| 1767 | 1764 | } |
| 1768 | | else if (core_stricmp(machine().system().name, "oceanhun") == 0) |
| 1769 | | { |
| 1770 | | UINT64 data = (UINT64)oceanhun_prot_data[m_prot_data_ptr++] << 16; |
| 1771 | | if (m_prot_data_ptr >= 58) |
| 1772 | | { |
| 1773 | | m_prot_data_ptr = 0; |
| 1774 | | } |
| 1775 | | retvalue = data; |
| 1776 | | } |
| 1777 | | else if (core_stricmp(machine().system().name, "dirtdvls") == 0) |
| 1778 | | { |
| 1779 | | retvalue = U64(0xffffffffffffffff); |
| 1780 | | } |
| 1781 | 1765 | else |
| 1782 | 1766 | { |
| 1783 | 1767 | retvalue = 0; |
| r243072 | r243073 | |
| 1785 | 1769 | break; |
| 1786 | 1770 | } |
| 1787 | 1771 | } |
| 1788 | | 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)); |
| 1789 | 1772 | |
| 1790 | 1773 | return retvalue; |
| 1791 | 1774 | } |
| 1792 | 1775 | |
| 1776 | |
| 1777 | |
| 1778 | WRITE64_MEMBER(model3_state::model3_security_w) |
| 1779 | { |
| 1780 | if (offset == 0x10 / 8) |
| 1781 | { |
| 1782 | if (data != 0) |
| 1783 | printf("model3_security_w address isn't 0?\n"); |
| 1784 | |
| 1785 | first_read = 1; |
| 1786 | |
| 1787 | printf("setting base %08x%08x\n", (UINT32)(data >> 32), (UINT32)(data & 0xffffffff)); |
| 1788 | } |
| 1789 | else if (offset == 0x18 / 8) |
| 1790 | { |
| 1791 | UINT16 subkey = data >> (32 + 16); |
| 1792 | subkey = ((subkey & 0xff00) >> 8) | ((subkey & 0x00ff) << 8); // endian swap the sub-key for this hardware |
| 1793 | printf("model3_5881prot_w setting subkey %04x\n", subkey); |
| 1794 | |
| 1795 | #ifdef DECRYPT_ANALYSIS_HACKS // dump out a copy of protection RAM |
| 1796 | FILE* fp2; |
| 1797 | char filename[256]; |
| 1798 | sprintf(filename,"xxxencrypted_%s_part%d", machine().system().name, segcount); |
| 1799 | segcount++; |
| 1800 | readcount = 0; |
| 1801 | fp2 = fopen(filename, "w+b"); |
| 1802 | |
| 1803 | { |
| 1804 | for (int i = 0; i < 0x8000; i++) |
| 1805 | { |
| 1806 | UINT16 dat = m_maincpu->space().read_word((0xf0180000 + 4 * i)); |
| 1807 | UINT8* dst2 = (UINT8*)&dat; |
| 1808 | fwrite(&dst2[1], 1, 1, fp2); |
| 1809 | fwrite(&dst2[0], 1, 1, fp2); |
| 1810 | } |
| 1811 | |
| 1812 | } |
| 1813 | fclose(fp2); |
| 1814 | #endif |
| 1815 | |
| 1816 | } |
| 1817 | else |
| 1818 | { |
| 1819 | 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)); |
| 1820 | } |
| 1821 | } |
| 1822 | |
| 1793 | 1823 | READ64_MEMBER(model3_state::model3_5881prot_r) |
| 1794 | 1824 | { |
| 1795 | 1825 | UINT64 retvalue = U64(0xffffffffffffffff); |
| r243072 | r243073 | |
| 1851 | 1881 | { |
| 1852 | 1882 | 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)); |
| 1853 | 1883 | } |
| 1854 | | |
| 1855 | | |
| 1856 | | |
| 1857 | 1884 | } |
| 1858 | 1885 | |
| 1859 | 1886 | WRITE64_MEMBER(model3_state::daytona2_rombank_w) |
| r243072 | r243073 | |
| 5548 | 5575 | MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) |
| 5549 | 5576 | MACHINE_CONFIG_END |
| 5550 | 5577 | |
| 5551 | | static MACHINE_CONFIG_START( model3_20, model3_state ) |
| 5578 | static MACHINE_CONFIG_START(model3_20, model3_state) |
| 5552 | 5579 | MCFG_CPU_ADD("maincpu", PPC603R, 166000000) |
| 5553 | 5580 | MCFG_PPC_BUS_FREQUENCY(66000000) /* Multiplier 2.5, Bus = 66MHz, Core = 166MHz */ |
| 5554 | 5581 | MCFG_CPU_PROGRAM_MAP(model3_mem) |
| r243072 | r243073 | |
| 5557 | 5584 | MCFG_CPU_ADD("audiocpu", M68000, 12000000) |
| 5558 | 5585 | MCFG_CPU_PROGRAM_MAP(model3_snd) |
| 5559 | 5586 | |
| 5560 | | MCFG_MACHINE_START_OVERRIDE(model3_state,model3_20) |
| 5561 | | MCFG_MACHINE_RESET_OVERRIDE(model3_state,model3_20) |
| 5587 | MCFG_MACHINE_START_OVERRIDE(model3_state, model3_20) |
| 5588 | MCFG_MACHINE_RESET_OVERRIDE(model3_state, model3_20) |
| 5562 | 5589 | |
| 5563 | 5590 | MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") |
| 5564 | 5591 | MCFG_NVRAM_ADD_1FILL("backup") |
| r243072 | r243073 | |
| 5585 | 5612 | MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) |
| 5586 | 5613 | MACHINE_CONFIG_END |
| 5587 | 5614 | |
| 5588 | | static MACHINE_CONFIG_DERIVED( model3_20_5881, model3_20 ) |
| 5615 | static MACHINE_CONFIG_DERIVED(model3_20_5881, model3_20) |
| 5589 | 5616 | MCFG_DEVICE_ADD("315_5881", SEGA315_5881_CRYPT, 0) |
| 5590 | 5617 | MCFG_SET_READ_CALLBACK(model3_state, crypt_read_callback) |
| 5591 | 5618 | MACHINE_CONFIG_END |
| 5592 | 5619 | |
| 5593 | | static MACHINE_CONFIG_START( model3_21, model3_state ) |
| 5620 | static MACHINE_CONFIG_START(model3_21, model3_state) |
| 5594 | 5621 | MCFG_CPU_ADD("maincpu", PPC603R, 166000000) |
| 5595 | 5622 | MCFG_PPC_BUS_FREQUENCY(66000000) /* Multiplier 2.5, Bus = 66MHz, Core = 166MHz */ |
| 5596 | 5623 | MCFG_CPU_PROGRAM_MAP(model3_mem) |
| r243072 | r243073 | |
| 5599 | 5626 | MCFG_CPU_ADD("audiocpu", M68000, 12000000) |
| 5600 | 5627 | MCFG_CPU_PROGRAM_MAP(model3_snd) |
| 5601 | 5628 | |
| 5602 | | MCFG_MACHINE_START_OVERRIDE(model3_state,model3_21) |
| 5603 | | MCFG_MACHINE_RESET_OVERRIDE(model3_state,model3_21) |
| 5629 | MCFG_MACHINE_START_OVERRIDE(model3_state, model3_21) |
| 5630 | MCFG_MACHINE_RESET_OVERRIDE(model3_state, model3_21) |
| 5604 | 5631 | |
| 5605 | 5632 | MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") |
| 5606 | 5633 | MCFG_NVRAM_ADD_1FILL("backup") |
| r243072 | r243073 | |
| 5627 | 5654 | MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) |
| 5628 | 5655 | MACHINE_CONFIG_END |
| 5629 | 5656 | |
| 5657 | |
| 5630 | 5658 | UINT16 model3_state::crypt_read_callback(UINT32 addr) |
| 5631 | 5659 | { |
| 5632 | 5660 | UINT16 dat = 0; |
| r243072 | r243073 | |
| 5637 | 5665 | |
| 5638 | 5666 | // dat = ((dat & 0xff00) >> 8) | ((dat & 0x00ff) << 8); |
| 5639 | 5667 | // printf("reading %04x\n", dat); |
| 5668 | |
| 5640 | 5669 | return dat; |
| 5641 | 5670 | } |
| 5642 | 5671 | |
| r243072 | r243073 | |
| 5691 | 5720 | } |
| 5692 | 5721 | else |
| 5693 | 5722 | { |
| 5694 | | m_maincpu->space(AS_PROGRAM).install_read_handler(0xf01a0000, 0xf01a003f, 0, 0x0e000000, read64_delegate(FUNC(model3_state::model3_security_r), this) ); |
| 5723 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xf01a0000, 0xf01a003f, 0, 0x0e000000, read64_delegate(FUNC(model3_state::model3_security_r), this), write64_delegate(FUNC(model3_state::model3_security_w), this) ); |
| 5695 | 5724 | } |
| 5696 | 5725 | } |
| 5697 | 5726 | |
| r243072 | r243073 | |
| 5925 | 5954 | { |
| 5926 | 5955 | //UINT32 *rom = (UINT32*)memregion("user1")->base(); |
| 5927 | 5956 | DRIVER_INIT_CALL(model3_20); |
| 5957 | DRIVER_INIT_CALL(genprot); |
| 5928 | 5958 | |
| 5929 | 5959 | //rom[(0xf6dd0^4)/4] = 0x60000000; |
| 5930 | 5960 | } |
| r243072 | r243073 | |
| 5934 | 5964 | m_step20_with_old_real3d = true; |
| 5935 | 5965 | |
| 5936 | 5966 | DRIVER_INIT_CALL(model3_20); |
| 5967 | DRIVER_INIT_CALL(genprot); |
| 5937 | 5968 | } |
| 5938 | 5969 | |
| 5939 | 5970 | DRIVER_INIT_MEMBER(model3_state,dirtdvls) |
| r243072 | r243073 | |
| 5956 | 5987 | rom[(0x6063c4^4)/4] = 0x60000000; |
| 5957 | 5988 | rom[(0x616434^4)/4] = 0x60000000; |
| 5958 | 5989 | rom[(0x69f4e4^4)/4] = 0x60000000; |
| 5990 | |
| 5991 | DRIVER_INIT_CALL(genprot); |
| 5959 | 5992 | } |
| 5960 | 5993 | |
| 5961 | 5994 | DRIVER_INIT_MEMBER(model3_state,dayto2pe) |
| r243072 | r243073 | |
| 5971 | 6004 | rom[(0x618b28^4)/4] = 0x60000000; // jump to encrypted code |
| 5972 | 6005 | |
| 5973 | 6006 | rom[(0x64ca34^4)/4] = 0x60000000; // dec |
| 6007 | |
| 6008 | DRIVER_INIT_CALL(genprot); |
| 5974 | 6009 | } |
| 5975 | 6010 | |
| 5976 | 6011 | DRIVER_INIT_MEMBER(model3_state,spikeout) |
| r243072 | r243073 | |
| 6027 | 6062 | m_step20_with_old_real3d = true; |
| 6028 | 6063 | |
| 6029 | 6064 | DRIVER_INIT_CALL(model3_20); |
| 6065 | DRIVER_INIT_CALL(genprot); |
| 6030 | 6066 | } |
| 6031 | 6067 | |
| 6032 | 6068 | DRIVER_INIT_MEMBER(model3_state,lamachin) |
| r243072 | r243073 | |
| 6034 | 6070 | m_step20_with_old_real3d = true; |
| 6035 | 6071 | |
| 6036 | 6072 | DRIVER_INIT_CALL(model3_20); |
| 6073 | DRIVER_INIT_CALL(genprot); |
| 6037 | 6074 | } |
| 6038 | 6075 | |
| 6039 | 6076 | |
| r243072 | r243073 | |
| 6061 | 6098 | GAME( 1997, vs2, 0, model3_20, model3, model3_state, vs2, ROT0, "Sega", "Virtua Striker 2 (Step 2.0)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6062 | 6099 | GAME( 1997, harley, 0, model3_20, harley, model3_state, harley, ROT0, "Sega", "Harley-Davidson and L.A. Riders (Revision B)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6063 | 6100 | GAME( 1997, harleya, harley, model3_20, harley, model3_state, harleya, ROT0, "Sega", "Harley-Davidson and L.A. Riders (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6064 | | GAME( 1998, lamachin, 0, model3_20, model3, model3_state, lamachin, ROT0, "Sega", "L.A. Machineguns", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6101 | GAME( 1998, lamachin, 0, model3_20_5881, model3, model3_state, lamachin, ROT0, "Sega", "L.A. Machineguns", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6065 | 6102 | GAME( 1998, oceanhun, 0, model3_20_5881, model3, model3_state, oceanhun, ROT0, "Sega", "The Ocean Hunter", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6066 | 6103 | GAME( 1998, skichamp, 0, model3_20, skichamp, model3_state, skichamp, ROT0, "Sega", "Ski Champ", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6067 | 6104 | GAME( 1998, srally2, 0, model3_20, scud, model3_state, srally2, ROT0, "Sega", "Sega Rally 2", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6068 | 6105 | GAME( 1998, srally2x, 0, model3_20, scud, model3_state, srally2, ROT0, "Sega", "Sega Rally 2 DX", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6069 | | GAME( 1998, von2, 0, model3_20, model3, model3_state, von2, ROT0, "Sega", "Virtual On 2: Oratorio Tangram (Revision B)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6070 | | GAME( 1998, von254g, von2, model3_20, model3, model3_state, von2, ROT0, "Sega", "Virtual On 2: Oratorio Tangram (ver 5.4g)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6106 | GAME( 1998, von2, 0, model3_20_5881, model3, model3_state, von2, ROT0, "Sega", "Virtual On 2: Oratorio Tangram (Revision B)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6107 | GAME( 1998, von254g, von2, model3_20_5881, model3, model3_state, von2, ROT0, "Sega", "Virtual On 2: Oratorio Tangram (ver 5.4g)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6071 | 6108 | GAME( 1998, fvipers2, 0, model3_20_5881, model3, model3_state, vs299, ROT0, "Sega", "Fighting Vipers 2 (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6072 | 6109 | GAME( 1998, vs298, 0, model3_20_5881, model3, model3_state, vs298, ROT0, "Sega", "Virtua Striker 2 '98 (Step 2.0)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6073 | 6110 | GAME( 1999, vs2v991, 0, model3_20_5881, model3, model3_state, vs299, ROT0, "Sega", "Virtua Striker 2 '99.1 (Revision B)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| r243072 | r243073 | |
| 6076 | 6113 | GAME( 1999, vs299, vs2v991, model3_20_5881, model3, model3_state, vs299, ROT0, "Sega", "Virtua Striker 2 '99", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6077 | 6114 | |
| 6078 | 6115 | /* Model 3 Step 2.1 */ |
| 6079 | | 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 ) |
| 6080 | | 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 ) |
| 6116 | GAME( 1998, daytona2, 0, model3_21_5881, daytona2, model3_state, daytona2, ROT0, "Sega", "Daytona USA 2 (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6117 | GAME( 1998, dayto2pe, 0, model3_21_5881, daytona2, model3_state, dayto2pe, ROT0, "Sega", "Daytona USA 2 Power Edition", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6081 | 6118 | GAME( 1998, dirtdvls, 0, model3_21_5881, scud, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 1) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6082 | 6119 | GAME( 1998, dirtdvlsa, dirtdvls, model3_21_5881, scud, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 2) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6083 | 6120 | 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 ) |
| 6084 | 6121 | 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 ) |
| 6085 | 6122 | GAME( 1998, spikeout, 0, model3_21_5881, model3, model3_state, spikeout, ROT0, "Sega", "Spikeout (Revision C)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6086 | 6123 | GAME( 1998, spikeofe, 0, model3_21_5881, model3, model3_state, spikeofe, ROT0, "Sega", "Spikeout Final Edition", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6087 | | GAME( 1998, magtruck, 0, model3_21, eca, model3_state, magtruck, ROT0, "Sega", "Magical Truck Adventure", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6124 | GAME( 1998, magtruck, 0, model3_21_5881, eca, model3_state, magtruck, ROT0, "Sega", "Magical Truck Adventure", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6088 | 6125 | GAME( 1999, eca, 0, model3_21_5881, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6089 | 6126 | GAME( 1999, ecax, eca, model3_21_5881, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance (Export)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6090 | 6127 | GAME( 1999, ecap, eca, model3_21_5881, eca, model3_state, eca, ROT0, "Sega", "Emergency Call Ambulance (US location test?)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |