Previous 199869 Revisions Next

r20148 Wednesday 9th January, 2013 at 13:13:39 UTC by Robbbert
Dragon World 2 : protection patch [iq_132]
[src/mame/drivers]pgm.c
[src/mame/includes]pgm.h
[src/mame/machine]pgmprot5.c

trunk/src/mame/machine/pgmprot5.c
r20147r20148
1313 IGS025 is some kind of state machine / logic device which the game
1414 uses for various security checks bitswap checks.
1515
16 Simulation is incomplete for some regions
16 To do:
17   How is the additional xor data is calculated?
18   Should the "hold" value be reset if the power is turned off? How?
19   Patches are actually overlays or just hacks?
1720
1821 ***********************************************************************/
1922
20
2123#include "emu.h"
2224#include "includes/pgm.h"
2325
2426
2527/* Dragon World 2 */
2628
27#define DW2BITSWAP(s,d,bs,bd)  d=((d&(~(1<<bd)))|(((s>>bs)&1)<<bd))
28//Use this handler for reading from 0xd80000-0xd80002
29static int protection_address;
30
31static UINT16 dw2_asic_reg[2];
32static UINT8 dw2_asic_z;
33static UINT8 dw2_asic_y;
34static UINT16 dw2_asic_hold;
35
2936READ16_HANDLER( dw2_d80000_r )
3037{
31// addr&=0xff;
32// if(dw2reg<0x20) //NOT SURE!!
38//   pgm_state *state = space.machine().driver_data<pgm_state>();
39   UINT16 ret;
40/*   UINT16 test;
41
42   switch (dw2_asic_reg[0])
3343   {
34      //The value at 0x80EECE is computed in the routine at 0x107c18
35      pgm_state *state = space.machine().driver_data<pgm_state>();
36      UINT16 d = state->m_mainram[0xEECE/2];
37      UINT16 d2 = 0;
38      d = (d >> 8) | (d << 8);
39      DW2BITSWAP(d, d2, 7,  0);
40      DW2BITSWAP(d, d2, 4,  1);
41      DW2BITSWAP(d, d2, 5,  2);
42      DW2BITSWAP(d, d2, 2,  3);
43      DW2BITSWAP(d, d2, 15, 4);
44      DW2BITSWAP(d, d2, 1,  5);
45      DW2BITSWAP(d, d2, 10, 6);
46      DW2BITSWAP(d, d2, 13, 7);
47      // ... missing bitswaps here (8-15) there is not enough data to know them
48      // the code only checks the lowest 8 bytes
49      return d2;
44      case 0x05: // Read to $80eec0
45      case 0x13: // Read to $80eeb8
46      case 0x1f: // Read to $80eeb8
47      case 0x40: // Read to $80eeb8, increase counters
48      case 0xf4: // Read to $80eeb8
49      case 0xf6: // Read to $80eeb8
50      case 0xf8: // Read to $80eeb8
51      break;
52
53      default:
54         logerror("%06x: warning, reading with igs003_reg = %02x\n", space.device().safe_pc(), dw2_asic_reg[0]);
5055   }
56
57   test = BITSWAP16(state->m_mainram[protection_address], 14,11,8,6,4,3,1,0, 5,2,9,7,10,13,12,15) & 0xff; // original hack
58*/
59   // This bitswap seems to also be common to a few IGS protection devices (igs011.c, Oriental Legend)
60   ret = BITSWAP16(dw2_asic_hold, 14,11,8,6,4,3,1,0, 5,2,9,7,10,13,12,15) & 0xff;
61/*
62   if ((ret != test) || (dw2_asic_hold != state->m_mainram[protection_address])) {
63      logerror ("Protection calculation error: SIMRET: %2.2x, HACKRET: %2.2x, SIMHOLD: %4.4x, REALHOLD: %4.4x\n", ret, test, dw2_asic_hold, state->m_mainram[protection_address]);
64   }
65*/
66   return ret;
5167}
5268
69WRITE16_HANDLER( dw2_d80000_w )
70{
71   pgm_state *state = space.machine().driver_data<pgm_state>();
72
73   COMBINE_DATA(&dw2_asic_reg[offset]);
74
75   if (offset == 0)
76      return;
77
78   switch (dw2_asic_reg[0])
79   {
80      case 0x08:
81         // This reg doesn't seem to be used for anything useful but is
82         // initialized. Ok to use as reset??
83         // The last "hold" value used is stored in NVRAM. Otherwise we either
84         // need to set the "hold" value as non-volatile or wipe NVRAM.
85         dw2_asic_hold = state->m_mainram[protection_address]; // hack
86      break;
87
88      case 0x09: // Used only on init...
89      case 0x0a:
90      case 0x0b:
91      case 0x0c:
92      break;
93
94      case 0x15: // ????
95      case 0x17:
96      break;
97
98      case 0x20:
99      case 0x21:
100      case 0x22:
101      case 0x23:
102      case 0x24:
103      case 0x25:
104      case 0x26:
105      case 0x27:
106      {
107         // computed ~$107000
108         UINT16 old;
109
110         dw2_asic_y = dw2_asic_reg[0] & 0x07;
111         dw2_asic_z = data;
112
113         // drgw2c = $80eecc, drgw2/dw2v100x = $80cb7c, drgw2j = $8091ca
114         old = dw2_asic_hold;
115
116         // drgw2c = $80eece, drgw2/dw2v100x = $80cb7e, drgw2j = $8091cc
117
118         // roation, fixed xor, and z/y xor all also common to asic-type protection devices
119         dw2_asic_hold  = old << 1;
120         dw2_asic_hold |= BIT(old, 15); // rotate
121         dw2_asic_hold ^= 0x2bad;
122         dw2_asic_hold ^= BIT(dw2_asic_z, dw2_asic_y);
123
124         dw2_asic_hold ^= BIT( old,  7);
125         dw2_asic_hold ^= BIT( old,  3) << 11;
126         dw2_asic_hold ^= BIT(~old, 13) <<  4; // inverted!
127
128   /*
129         // additional...
130         // how is this calculated? is it ever used??
131         // drgw2c = $80eeca, drgw2/dw2v100x = $80cb7a, drgw2j = $809168
132         dw2_asic_hold ^= BIT(space.read_byte(0x80eecb), 0) << 1;
133         dw2_asic_hold ^= BIT(space.read_byte(0x80eecb), 1) << 2;
134         dw2_asic_hold ^= BIT(space.read_byte(0x80eecb), 2) << 3;
135         dw2_asic_hold ^= BIT(space.read_byte(0x80eecb), 4) << 5;
136         dw2_asic_hold ^= BIT(space.read_byte(0x80eecb), 5) << 6;
137         dw2_asic_hold ^= BIT(space.read_byte(0x80eecb), 6) << 7;
138         dw2_asic_hold ^= BIT(space.read_byte(0x80eecb), 7) << 8;
139         dw2_asic_hold ^= BIT(space.read_byte(0x80eeca), 0) << 9;
140         dw2_asic_hold ^= BIT(space.read_byte(0x80eeca), 1) << 10;
141         dw2_asic_hold ^= BIT(space.read_byte(0x80eeca), 3) << 12;
142         dw2_asic_hold ^= BIT(space.read_byte(0x80eeca), 4) << 13;
143         dw2_asic_hold ^= BIT(space.read_byte(0x80eeca), 5) << 14;
144         dw2_asic_hold ^= BIT(space.read_byte(0x80eeca), 6) << 15;
145   */
146      }
147      break;
148
149      case 0xf2: // ????
150      break;
151
152      default:
153         logerror("%06x: warning, writing to igs003_reg %02x = %02x\n", space.device().safe_pc(), dw2_asic_reg[0], data);
154   }
155}
156
157// What purpose to writes to this region serve? Written, but never read back? Must be related to the protection device?
158WRITE16_HANDLER(dw2_unk_w)
159{
160//   logerror("%06x: warning, writing to address %6.6x = %4.4x\n", space.device().safe_pc(), 0xd00000+(offset*2), data);
161}
162
53163static void pgm_dw2_decrypt(running_machine &machine)
54164{
55
56165   int i;
57166   UINT16 *src = (UINT16 *) (machine.root_device().memregion("maincpu")->base()+0x100000);
58167
59168   int rom_size = 0x80000;
60169
61   for(i=0; i<rom_size/2; i++) {
170   for (i=0; i<rom_size/2; i++) {
62171      UINT16 x = src[i];
63172
64      if(((i & 0x020890) == 0x000000)
65         || ((i & 0x020000) == 0x020000 && (i & 0x001500) != 0x001400))
173      if (((i & 0x20890) == 0) || ((i & 0x20000) == 0x20000 && (i & 0x01500) != 0x01400))
66174         x ^= 0x0002;
67175
68      if(((i & 0x020400) == 0x000000 && (i & 0x002010) != 0x002010)
69         || ((i & 0x020000) == 0x020000 && (i & 0x000148) != 0x000140))
176      if (((i & 0x20400) == 0 && (i & 0x02010) != 0x02010) || ((i & 0x20000) == 0x20000 && (i & 0x00148) != 0x00140))
70177         x ^= 0x0400;
71178
72179      src[i] = x;
r20147r20148
77184{
78185   pgm_basic_init(machine);
79186   pgm_dw2_decrypt(machine);
80   /*
81    Info from Elsemi
82    Here is how to "bypass" the dw2 hang protection, it fixes the mode
83    select and after failing in the 2nd stage (probably there are other checks
84    out there).
85    */
187
86188   machine.device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0xd80000, 0xd80003, FUNC(dw2_d80000_r));
189   machine.device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(0xd80000, 0xd80003, FUNC(dw2_d80000_w));
190   machine.device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(0xd00000, 0xd00fff, FUNC(dw2_unk_w));
87191}
88192
89193DRIVER_INIT_MEMBER(pgm_state,drgw2)
90{   /* incomplete? */
194{
195   /* incomplete? */
91196   UINT16 *mem16 = (UINT16 *)machine().root_device().memregion("maincpu")->base();
197
92198   drgwld2_common_init(machine());
199
200   protection_address = 0xcb7e/2; // $80cb7e;
201
93202   /* These ROM patches are not hacks, the protection device
94203       overlays the normal ROM code, this has been confirmed on a real PCB
95204       although some addresses may be missing */
r20147r20148
101210DRIVER_INIT_MEMBER(pgm_state,dw2v100x)
102211{
103212   UINT16 *mem16 = (UINT16 *)machine().root_device().memregion("maincpu")->base();
213
104214   drgwld2_common_init(machine());
105215
216   protection_address = 0xcb7e/2; // $80cb7e;
217
218   /* These ROM patches are not hacks, the protection device
219       overlays the normal ROM code, this has been confirmed on a real PCB
220       although some addresses may be missing */
106221   mem16[0x131084 / 2] = 0x4e93;
107   mem16[(0x131084+0xa6) / 2] = 0x4e93;
108   mem16[(0x131084+0x136) / 2] = 0x4e93;
222   mem16[0x13112a / 2] = 0x4e93;
223   mem16[0x1311ba / 2] = 0x4e93;
109224}
110225
111226DRIVER_INIT_MEMBER(pgm_state,drgw2c)
112227{
113228   UINT16 *mem16 = (UINT16 *)machine().root_device().memregion("maincpu")->base();
229
114230   drgwld2_common_init(machine());
231
232   protection_address = 0xeece/2; // $80eece;
233
115234   /* These ROM patches are not hacks, the protection device
116235       overlays the normal ROM code, this has been confirmed on a real PCB
117236       although some addresses may be missing */
r20147r20148
123242DRIVER_INIT_MEMBER(pgm_state,drgw2j)
124243{
125244   UINT16 *mem16 = (UINT16 *)machine().root_device().memregion("maincpu")->base();
245
126246   drgwld2_common_init(machine());
247
248   protection_address = 0x91cc/2; // $8091cc;
249
127250   /* These ROM patches are not hacks, the protection device
128251       overlays the normal ROM code, this has been confirmed on a real PCB
129252       although some addresses may be missing */
r20147r20148
131254   mem16[0x130366 / 2] = 0x4e93;
132255   mem16[0x1303f6 / 2] = 0x4e93;
133256}
134
trunk/src/mame/includes/pgm.h
r20147r20148
6666
6767   DECLARE_READ16_MEMBER(pgm_videoram_r);
6868   DECLARE_WRITE16_MEMBER(pgm_videoram_w);
69   DECLARE_WRITE16_MEMBER(pgm_coin_counter_w);
6970   DECLARE_READ16_MEMBER(z80_ram_r);
7071   DECLARE_WRITE16_MEMBER(z80_ram_w);
7172   DECLARE_WRITE16_MEMBER(z80_reset_w);
trunk/src/mame/drivers/pgm.c
r20147r20148
193193
194194READ16_MEMBER(pgm_state::pgm_videoram_r)
195195{
196
197196   if (offset < 0x4000 / 2)
198197      return m_bg_videoram[offset&0x7ff];
199198   else if (offset < 0x7000 / 2)
r20147r20148
202201      return m_videoram[offset];
203202}
204203
205
206204WRITE16_MEMBER(pgm_state::pgm_videoram_w)
207205{
208
209206   if (offset < 0x4000 / 2)
210207      pgm_bg_videoram_w(space, offset&0x7ff, data, mem_mask);
211208   else if (offset < 0x7000 / 2)
r20147r20148
214211      COMBINE_DATA(&m_videoram[offset]);
215212}
216213
214WRITE16_MEMBER(pgm_state::pgm_coin_counter_w)
215{
216   coin_counter_w(machine(), 0, data & 0x0001);
217   coin_counter_w(machine(), 1, data & 0x0002);
218   coin_counter_w(machine(), 2, data & 0x0004);
219   coin_counter_w(machine(), 3, data & 0x0008);
220}
221
217222READ16_MEMBER(pgm_state::z80_ram_r)
218223{
219224   return (m_z80_mainram[offset * 2] << 8) | m_z80_mainram[offset * 2 + 1];
r20147r20148
235240
236241WRITE16_MEMBER(pgm_state::z80_reset_w)
237242{
238
239243   if (PGMLOGERROR)
240244      logerror("Z80: reset %04x @ %04x (%06x)\n", data, mem_mask, space.device().safe_pc());
241245
r20147r20148
244248      m_ics->reset();
245249      m_soundcpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
246250      m_soundcpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
247      if(0)
248      {
249         FILE *out;
250         out = fopen("z80ram.bin", "wb");
251         fwrite(m_z80_mainram, 1, 65536, out);
252         fclose(out);
253      }
254251   }
255252   else
256253   {
257254      /* this might not be 100% correct, but several of the games (ddp2, puzzli2 etc. expect the z80 to be turned
258           off during data uploads, they write here before the upload */
255      off during data uploads, they write here before the upload */
259256      m_soundcpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
260257   }
261258}
r20147r20148
268265
269266WRITE16_MEMBER(pgm_state::m68k_l1_w)
270267{
271
272268   if(ACCESSING_BITS_0_7)
273269   {
274270      if (PGMLOGERROR)
r20147r20148
333329   AM_RANGE(0xc08000, 0xc08001) AM_READ_PORT("P1P2")
334330   AM_RANGE(0xc08002, 0xc08003) AM_READ_PORT("P3P4")
335331   AM_RANGE(0xc08004, 0xc08005) AM_READ_PORT("Service")
336   AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW")
332   AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW") AM_WRITE(pgm_coin_counter_w)
337333
338334   AM_RANGE(0xc10000, 0xc1ffff) AM_READWRITE(z80_ram_r, z80_ram_w) /* Z80 Program */
339335ADDRESS_MAP_END
r20147r20148
349345ADDRESS_MAP_END
350346
351347
352
353
354348/*** Input Ports *************************************************************/
355349
356350/* enough for 4 players, the basic dips mapped are listed in the test mode */
r20147r20148
397391   PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
398392   PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 )
399393   PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN4 )
400//  PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 )  // test 1p+2p
394//   PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 )  // test 1p+2p
401395   PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )   // what should i use?
402396   PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SERVICE1 )   // service 1p+2p
403//  PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON6 )  // test 3p+4p
397//   PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON6 )  // test 3p+4p
404398   PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )   // what should i use?
405399   PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_SERVICE2 )   // service 3p+4p
406400   PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1)
r20147r20148
441435INPUT_PORTS_END
442436
443437
444
445
446
447
448438/*** GFX Decodes *************************************************************/
449439
450440/* we can't decode the sprite data like this because it isn't tile based.  the
r20147r20148
501491
502492MACHINE_START_MEMBER(pgm_state,pgm)
503493{
494//   machine().base_datetime(m_systime);
504495
505//  machine().base_datetime(m_systime);
506
507496   m_maincpu = machine().device<cpu_device>("maincpu");
508497   m_soundcpu = machine().device<cpu_device>("soundcpu");
509498   m_ics = machine().device("ics");
r20147r20148
514503   machine().device("soundcpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
515504}
516505
517
518506MACHINE_CONFIG_FRAGMENT( pgmbase )
519507   /* basic machine hardware */
520508   MCFG_CPU_ADD("maincpu", M68000, 20000000) /* 20 mhz! verified on real board */
r20147r20148
548536
549537   /*sound hardware */
550538   MCFG_SPEAKER_STANDARD_MONO("mono")
551    MCFG_ICS2115_ADD("ics", 0, pgm_sound_irq)
539   MCFG_ICS2115_ADD("ics", 0, pgm_sound_irq)
552540   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 5.0)
553541MACHINE_CONFIG_END
554542
r20147r20148
557545MACHINE_CONFIG_END
558546
559547
560
561
562
563
564
565
566
567
568
569548/*** Rom Loading *************************************************************/
570549
571550/* take note of "gfx2" needed for expanding the 32x32x5bpp data and
r20147r20148
980959ROM_END
981960
982961
983
984962/*
985963
986964Dragon World 3 (KOREA 106 Ver.)
r20147r20148
11491127ROM_END
11501128
11511129
1152
1153
11541130ROM_START( kov )
11551131   ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
11561132   PGM_68K_BIOS
r20147r20148
13571333   ROM_LOAD( "m0600.rom",    0x400000, 0x400000, CRC(3ada4fd6) SHA1(4c87adb25d31cbd41f04fbffe31f7bc37173da76) )
13581334ROM_END
13591335
1360
13611336ROM_START( kovsgqyz )
13621337   ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
13631338   PGM_68K_BIOS
r20147r20148
14401415ROM_END
14411416
14421417
1443
1444
14451418ROM_START( kovsh )
14461419   ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
14471420   PGM_68K_BIOS
r20147r20148
15921565ROM_END
15931566
15941567
1595
15961568/*
15971569
15981570p0701_v105.u2
r20147r20148
17261698ROM_END
17271699
17281700
1729
1730
17311701/*
17321702
17331703Photo Y2K2 IGS PGM cart
r20147r20148
17751745ROM_END
17761746
17771747
1778
1779
17801748ROM_START( pgm3in1 )
17811749   ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
17821750   PGM_68K_BIOS
r20147r20148
26152583ROM_END
26162584
26172585
2618
2619
26202586ROM_START( dwpc )
26212587   ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
26222588   PGM_68K_BIOS
r20147r20148
27222688ROM_END
27232689
27242690
2725
27262691ROM_START( puzzli2s )
27272692   ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
27282693   PGM_68K_BIOS
r20147r20148
27482713ROM_END
27492714
27502715
2751
27522716/*
27532717
27542718Martial Masters
r20147r20148
34603424ROM_END
34613425
34623426
3463
34643427/* all known revisions of ketsui have roms marked v100, even when the actual game revision is upgraded */
34653428
34663429ROM_START( ket )
r20147r20148
36793642ROM_END
36803643
36813644
3682
3683
3684
3685
3686
36873645/*** Init Stuff **************************************************************/
36883646
36893647/* This function expands the 32x32 5-bit data into a format which is easier to
r20147r20148
37583716   }
37593717}
37603718
3761
3762
3763
3764
37653719void pgm_basic_init( running_machine &machine, bool set_bank)
37663720{
37673721   pgm_state *state = machine.driver_data<pgm_state>();
r20147r20148
37833737}
37843738
37853739
3786
3787
3788
3789
3790
3791
37923740/*** GAME ********************************************************************/
37933741
37943742GAME( 1997, pgm,          0,         pgm,     pgm, pgm_state,      pgm,        ROT0,   "IGS", "PGM (Polygame Master) System BIOS", GAME_IS_BIOS_ROOT )
r20147r20148
38053753GAME( 1997, orlegend111c, orlegend,  pgm_asic3,     orlegend, pgm_asic3_state, orlegend,   ROT0,   "IGS", "Oriental Legend / Xi You Shi E Zhuan (ver. 111, Chinese Board)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // V0001 no date!          - runs as HongKong, China, China
38063754GAME( 1997, orlegend105k, orlegend,  pgm_asic3,     orld105k, pgm_asic3_state, orlegend,   ROT0,   "IGS", "Oriental Legend / Xi You Shi E Zhuan (ver. 105, Korean Board)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )  // V0000 no date!          - runs as Korea
38073755
3808GAME( 1997, drgw2,        pgm,       pgm,     pgm, pgm_state,      drgw2,      ROT0,   "IGS", "Dragon World II (ver. 110X, Export)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues!
3809GAME( 1997, dw2v100x,     drgw2,     pgm,     pgm, pgm_state,      dw2v100x,   ROT0,   "IGS", "Dragon World II (ver. 100X, Export)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues!
3810GAME( 1997, drgw2j,       drgw2,     pgm,     pgm, pgm_state,      drgw2j,     ROT0,   "IGS", "Chuugokuryuu II (ver. 100J, Japan)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues!
3756GAME( 1997, drgw2,        pgm,       pgm,     pgm, pgm_state,      drgw2,      ROT0,   "IGS", "Dragon World II (ver. 110X, Export)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
3757GAME( 1997, dw2v100x,     drgw2,     pgm,     pgm, pgm_state,      dw2v100x,   ROT0,   "IGS", "Dragon World II (ver. 100X, Export)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
3758GAME( 1997, drgw2j,       drgw2,     pgm,     pgm, pgm_state,      drgw2j,     ROT0,   "IGS", "Chuugokuryuu II (ver. 100J, Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
38113759GAME( 1997, drgw2c,       drgw2,     pgm,     pgm, pgm_state,      drgw2c,     ROT0,   "IGS", "Zhong Guo Long II (ver. 100C, China)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
38123760
38133761// region provided by internal ARM rom
r20147r20148
38513799// japan region only?
38523800GAME( 2001, dwpc,         pgm,       pgm_arm_type2,     dw2001, pgm_arm_type2_state,   dwpc,      ROT0,   "IGS", "Dragon World Pretty Chance (V101, Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // 09/26/01 10:23:26
38533801
3854
3855
38563802// we bypass the internal ARM rom on these, ideally it should still be dumped tho!
38573803// ARM version strings don't match 100% with labels... for 68k ROMs I'm using the build time / date stamp from near the start of the rom, there are some slightly different time stamps later
38583804GAME( 2002, dmnfrnt,      pgm,       pgm_arm_type3,     pgm, pgm_arm_type3_state,    dmnfrnt,    ROT0,   "IGS", "Demon Front (68k label V105, ROM M105XX 08/05/02) (ARM label V105, ROM 08/05/02 S105XX)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // 68k time: 10:24:11 ARM time: 10:33:23
38593805GAME( 2002, dmnfrnta,     dmnfrnt,   pgm_arm_type3,     pgm, pgm_arm_type3_state,    dmnfrnt,    ROT0,   "IGS", "Demon Front (68k label V102, ROM M102XX 06/19/02) (ARM label V102, ROM 05/24/02 S101XX)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // 68k time: 13:44:08 ARM time: 13:04:31
38603806GAME( 2002, dmnfrntpcb,   dmnfrnt,   pgm_arm_type3,     pgm, pgm_arm_type3_state,    dmnfrnt,    ROT0,   "IGS", "Demon Front (68k label V107KR, ROM M107KR 11/03/03) (ARM label V106KR, ROM 10/16/03 S106KR) (JAMMA PCB)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // works but reports version mismatch (wants internal rom version and region to match external?)
38613807
3862
3863
38643808/* these don't use an External ARM rom, and don't have any weak internal functions which would allow the internal ROM to be read out */
38653809
38663810GAME( 2002, ddpdoj,       0,         pgm_arm_type1_cave,    pgm, pgm_arm_type1_state,     ddp3,      ROT270, "Cave", "DoDonPachi Dai-Ou-Jou V101 (2002.04.05.Master Ver)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // is there a v101 without the . after 05?
r20147r20148
38763820GAME( 2003, espgal,       0,         pgm_arm_type1_cave,    pgm, pgm_arm_type1_state,     espgal,    ROT270, "Cave", "Espgaluda (2003/10/15 Master Ver)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
38773821
38783822
3879
3880
38813823/* -----------------------------------------------------------------------------------------------------------------------
38823824   Partially Working, playable, but some imperfections
38833825   -----------------------------------------------------------------------------------------------------------------------*/
r20147r20148
39033845GAME( 1999, kovsgqyzb,    kovplus,   pgm_arm_type1_sim,     sango_ch, pgm_arm_type1_state,    kovboot,    ROT0,   "bootleg", "Knights of Valour: SanGuo QunYingZhuan / Sangoku Senki: SanGuo QunYingZhuan (bootleg, set 3)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */
39043846
39053847
3906
3907
39083848/* -----------------------------------------------------------------------------------------------------------------------
39093849   NOT Working (mostly due to needing internal protection roms dumped)
39103850   -----------------------------------------------------------------------------------------------------------------------*/
r20147r20148
39263866GAME( 2001, puzzli2s,     puzzli2,   pgm_arm_type1_sim,  puzzli2, pgm_arm_type1_state,    puzzli2,    ROT0,   "IGS", "Puzzli 2 Super (ver. 200)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
39273867
39283868
3929
39303869/* Games below this point are known to have an 'execute only' internal ROM area covering an area at the start of the internal ROM.  This can't be read when running code from either internal or external ROM space. */
39313870
3932
39333871// all 3 68k roms still have V100 strings, but are clearly different builds, there don't appear to be build string dates in them.  Two of the external ARM roms are marked V100 but are different builds, it's possible the single PCB version 100 is based on a later main revision
39343872GAME( 2003, theglad,      pgm,       pgm_arm_type3,     pgm, pgm_arm_type3_state,    theglad,    ROT0,   "IGS", "The Gladiator - Road of the Sword / Shen Jian (M68k label V100) (ARM label V100, ROM 01/16/03 SHEN JIAN)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // ARM time: 10:39:25
39353873GAME( 2003, theglada,     theglad,   pgm_arm_type3,     pgm, pgm_arm_type3_state,    theglad,    ROT0,   "IGS", "The Gladiator - Road of the Sword / Shen Jian (M68k label V101) (ARM label V107, ROM 06/06/03 SHEN JIAN V107)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // ARM time: 16:17:27
39363874GAME( 2003, thegladpcb,   theglad,   pgm_arm_type3,     pgm, pgm_arm_type3_state,    theglad,    ROT0,   "IGS", "The Gladiator - Road of the Sword / Shen Jian (M68k label V100) (ARM label V100, ROM 02/25/03 SHEN JIAN) (JAMMA PCB)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // ARM time: 16:32:21
39373875
3938
39393876// simulation doesn't seem 100%
39403877GAME( 2004, oldsplus,     pgm,       pgm_arm_type1_sim, oldsplus, pgm_arm_type1_state,     oldsplus,   ROT0,   "IGS", "Oriental Legend Special Plus / Xi You Shi E Zhuan Super Plus", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */
39413878
r20147r20148
39583895
39593896GAME( 2005, svg,          pgm,       pgm_arm_type3,     pgm, pgm_arm_type3_state,    svg,        ROT0,   "IGS / Idea Factory", "S.V.G. - Spectral vs Generation (M68k label V200) (ARM label V200, ROM 10/11/05 S.V.G V201)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // label was 200, but it's code rev 201? // ARM time: 10:07:20
39603897GAME( 2005, svgpcb,       svg,       pgm_arm_type3,     pgm, pgm_arm_type3_state,    svgpcb,     ROT0,   "IGS / Idea Factory", "S.V.G. - Spectral vs Generation (M68k label V100JP) (ARM label V100JP ROM 05/12/05  S.V.G V100) (JAMMA PCB)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // ARM time: 15:31:35
3961
3962
3963

Previous 199869 Revisions Next


© 1997-2024 The MAME Team