Previous 199869 Revisions Next

r26059 Friday 8th November, 2013 at 16:04:45 UTC by David Haywood
part 3 (nw)
[src/mame/machine]igs025.c igs025.h pgmprot_igs025_igs012.c pgmprot_igs025_igs022.c pgmprot_igs025_igs028.c pgmprot_igs027a_type3.c

trunk/src/mame/machine/pgmprot_igs025_igs022.c
r26058r26059
314314{
315315   int region = (ioport(":Region")->read()) & 0xff;
316316
317   m_igs025->m_drgw2_protection_region = region - 0x16;
317   m_igs025->m_kb_region = region - 0x16;
318318   m_igs025->m_kb_game_id = 0x89911400 | region;
319319
320320   MACHINE_RESET_CALL_MEMBER(pgm);
r26058r26059
324324{
325325   int region = (ioport(":Region")->read()) & 0xff;
326326
327   m_igs025->m_drgw2_protection_region = region;
327   m_igs025->m_kb_region = region;
328328   m_igs025->m_kb_game_id = 0x00060000 | region;
329329
330330   MACHINE_RESET_CALL_MEMBER(pgm);
r26058r26059
350350   m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xd40000, 0xd40003, read16_delegate(FUNC(igs025_device::killbld_igs025_prot_r), (igs025_device*)m_igs025), write16_delegate(FUNC(igs025_device::killbld_igs025_prot_w), (igs025_device*)m_igs025));
351351   m_igs022->m_sharedprotram = m_sharedprotram;
352352   m_igs025->m_kb_source_data = killbld_source_data;
353   m_igs025->m_kb_source_data_offset = 0x16;
354353}
355354
356355DRIVER_INIT_MEMBER(pgm_022_025_state,drgw3)
r26058r26059
362361   m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xda5610, 0xda5613, read16_delegate(FUNC(igs025_device::killbld_igs025_prot_r), (igs025_device*)m_igs025), write16_delegate(FUNC(igs025_device::killbld_igs025_prot_w), (igs025_device*)m_igs025));
363362   m_igs022->m_sharedprotram = m_sharedprotram;
364363   m_igs025->m_kb_source_data = dw3_source_data;
365   m_igs025->m_kb_source_data_offset = 0;
366364}
367365
368366
trunk/src/mame/machine/pgmprot_igs027a_type3.c
r26058r26059
169169void pgm_arm_type3_state::svg_basic_init()
170170{
171171   pgm_basic_init();
172   m_svg_shareram[0] = auto_alloc_array(machine(), UINT32, 0x10000 / 4);
173   m_svg_shareram[1] = auto_alloc_array(machine(), UINT32, 0x10000 / 4);
172   m_svg_shareram[0] = auto_alloc_array(machine(), UINT32, 0x20000 / 4);
173   m_svg_shareram[1] = auto_alloc_array(machine(), UINT32, 0x20000 / 4);
174174   m_svg_ram_sel = 0;
175175
176   save_pointer(NAME(m_svg_shareram[0]), 0x10000 / 4);
177   save_pointer(NAME(m_svg_shareram[1]), 0x10000 / 4);
176   save_pointer(NAME(m_svg_shareram[0]), 0x20000 / 4);
177   save_pointer(NAME(m_svg_shareram[1]), 0x20000 / 4);
178178   save_item(NAME(m_svg_ram_sel));
179179}
180180
trunk/src/mame/machine/pgmprot_igs025_igs028.c
r26058r26059
2323
2424// tables are xored by table at $1998dc
2525// tables are the same as drgw3 and drgw2
26static const UINT8 olds_source_data[8][0xec] = // table addresses $2951CA
26static const UINT8 m_olds_source_data[8][0xec] = // table addresses $2951CA
2727{
2828   { // region 0, unused...
2929      0,
r26058r26059
153153{
154154   int region = (ioport(":Region")->read()) & 0xff;
155155
156   m_igs025->m_drgw2_protection_region = region;
156   m_igs025->m_kb_region = region;
157157   m_igs025->m_kb_game_id = 0x00900000 | region;
158158
159159   MACHINE_RESET_CALL_MEMBER(pgm);
r26058r26059
165165
166166   m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xdcb400, 0xdcb403, read16_delegate(FUNC(igs025_device::olds_r), (igs025_device*)m_igs025), write16_delegate(FUNC(igs025_device::olds_w), (igs025_device*)m_igs025));
167167   m_igs028->m_sharedprotram = m_sharedprotram;
168   m_igs025->olds_source_data = olds_source_data;
168   m_igs025->m_kb_source_data = m_olds_source_data;
169169
170170}
171171
trunk/src/mame/machine/pgmprot_igs025_igs012.c
r26058r26059
115115   m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xd80000, 0xd80003, read16_delegate(FUNC(igs025_device::drgw2_d80000_protection_r), (igs025_device*)m_igs025), write16_delegate(FUNC(igs025_device::drgw2_d80000_protection_w), (igs025_device*)m_igs025));
116116
117117
118   m_igs025->m_drgw2_source_data = drgw2_source_data;
118   m_igs025->m_kb_source_data = drgw2_source_data;
119119
120120   pgm_basic_init();
121121   pgm_drgw2_decrypt();
r26058r26059
150150   drgw2_common_init();
151151
152152   int region = 0x06;
153   m_igs025->m_drgw2_protection_region = region;
153   m_igs025->m_kb_region = region;
154154   m_igs025->m_kb_game_id = region | (region << 8) | (region << 16) | (region << 24);
155155
156156   mem16[0x131098 / 2] = 0x4e93;
r26058r26059
165165   drgw2_common_init();
166166
167167   int region = 0x06;
168   m_igs025->m_drgw2_protection_region = region;
168   m_igs025->m_kb_region = region;
169169   m_igs025->m_kb_game_id = region | (region << 8) | (region << 16) | (region << 24);
170170
171171   mem16[0x131084 / 2] = 0x4e93;
r26058r26059
180180   drgw2_common_init();
181181
182182   int region = 0x05;
183   m_igs025->m_drgw2_protection_region = region;
183   m_igs025->m_kb_region = region;
184184   m_igs025->m_kb_game_id = region | (region << 8) | (region << 16) | (region << 24);
185185
186186   mem16[0x1303bc / 2] = 0x4e93;
r26058r26059
195195   drgw2_common_init();
196196
197197   int region = 0x01;
198   m_igs025->m_drgw2_protection_region = region;
198   m_igs025->m_kb_region = region;
199199   m_igs025->m_kb_game_id = region | (region << 8) | (region << 16) | (region << 24);
200200
201201   mem16[0x1302c0 / 2] = 0x4e93;
trunk/src/mame/machine/igs025.c
r26058r26059
9494
9595}
9696
97/****************************************/
98/* WRITE */
99/****************************************/
97100
98void igs025_device::killbld_protection_calculate_hilo()
99{
100   UINT8 source;
101
102   m_kb_prot_hilo_select++;
103
104   if (m_kb_prot_hilo_select > 0xeb) {
105      m_kb_prot_hilo_select = 0;
106   }
107
108   source = m_kb_source_data[m_drgw2_protection_region][m_kb_prot_hilo_select];
109
110   if (m_kb_prot_hilo_select & 1)
111   {
112      m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8);
113   }
114   else
115   {
116      m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0);
117   }
118}
119
120101WRITE16_MEMBER(igs025_device::killbld_igs025_prot_w )
121102{
122103   if (offset == 0)
r26058r26059
176157   }
177158}
178159
179READ16_MEMBER(igs025_device::killbld_igs025_prot_r )
180{
181   if (offset)
182   {
183      switch (m_kb_cmd)
184      {
185         case 0x00:
186            return BITSWAP8((m_kb_swap+1) & 0x7f, 0,1,2,3,4,5,6,7); // drgw3
187
188         case 0x01:
189            return m_kb_reg & 0x7f;
190
191         case 0x05:
192         {
193            switch (m_kb_ptr)
194            {
195               case 1:
196                  return 0x3f00 | ((m_kb_game_id >> 0) & 0xff);
197
198               case 2:
199                  return 0x3f00 | ((m_kb_game_id >> 8) & 0xff);
200
201               case 3:
202                  return 0x3f00 | ((m_kb_game_id >> 16) & 0xff);
203
204               case 4:
205                  return 0x3f00 | ((m_kb_game_id >> 24) & 0xff);
206
207               default: // >= 5
208                  return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5,2,9,7,10,13,12,15);
209            }
210
211            return 0;
212         }
213
214         case 0x40:
215            killbld_protection_calculate_hilo();
216            return 0; // Read and then discarded
217
218      //  default:
219      //      logerror("%06X: ASIC25 R CMD %X\n", space.device().safe_pc(), m_kb_cmd);
220      }
221   }
222
223   return 0;
224}
225
226
227/* todo, collapse this all into above */
228
229
230void igs025_device::olds_protection_calculate_hilo() // calculated in routine $12dbc2 in olds
231{
232   UINT8 source;
233
234   m_kb_prot_hilo_select++;
235   if (m_kb_prot_hilo_select > 0xeb) {
236      m_kb_prot_hilo_select = 0;
237   }
238
239   source = olds_source_data[m_drgw2_protection_region][m_kb_prot_hilo_select];
240
241   if (m_kb_prot_hilo_select & 1)    // $8178fa
242   {
243      m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8);     // $8178d8
244   }
245   else
246   {
247      m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0);     // $8178d8
248   }
249}
250
251160WRITE16_MEMBER(igs025_device::olds_w )
252161{
253162   if (offset == 0)
r26058r26059
296205   }
297206}
298207
299READ16_MEMBER(igs025_device::olds_r )
208
209
210
211
212
213WRITE16_MEMBER(igs025_device::drgw2_d80000_protection_w )
300214{
215   if (offset == 0)
216   {
217      m_kb_cmd = data;
218      return;
219   }
220
221   switch (m_kb_cmd)
222   {
223      case 0x20:
224      case 0x21:
225      case 0x22:
226      case 0x23:
227      case 0x24:
228      case 0x25:
229      case 0x26:
230      case 0x27:
231         m_kb_ptr++;
232         drgw2_protection_calculate_hold(m_kb_cmd & 0x0f, data & 0xff);
233      break;
234
235   //  case 0x08: // Used only on init..
236   //  case 0x09:
237   //  case 0x0a:
238   //  case 0x0b:
239   //  case 0x0c:
240   //  break;
241
242   //  case 0x15: // ????
243   //  case 0x17:
244   //  case 0xf2:
245   //  break;
246
247   //  default:
248   //      logerror("%06x: warning, writing to igs003_reg %02x = %02x\n", space.device().safe_pc(), m_kb_cmd, data);
249   }
250}
251
252/****************************************/
253/* READ */
254/****************************************/
255
256READ16_MEMBER(igs025_device::killbld_igs025_prot_r)
257{
301258   if (offset)
302259   {
303260      switch (m_kb_cmd)
304261      {
305         case 0x01:
306            return m_kb_reg & 0x7f;
262      case 0x00:
263         return BITSWAP8((m_kb_swap + 1) & 0x7f, 0, 1, 2, 3, 4, 5, 6, 7); // drgw3
307264
308         case 0x02:
309            return m_olds_bs | 0x80;
265      case 0x01:
266         return m_kb_reg & 0x7f;
310267
311         case 0x03:
312            return m_kb_cmd3;
268      case 0x05:
269      {
270                switch (m_kb_ptr)
271                {
272                case 1:
273                   return 0x3f00 | ((m_kb_game_id >> 0) & 0xff);
313274
314         case 0x05:
315         {
316            switch (m_kb_ptr)
317            {
318               case 1:
319                  return 0x3f00 | ((m_kb_game_id >> 0) & 0xff);
275                case 2:
276                   return 0x3f00 | ((m_kb_game_id >> 8) & 0xff);
320277
321               case 2:
322                  return 0x3f00 | ((m_kb_game_id >> 8) & 0xff);
278                case 3:
279                   return 0x3f00 | ((m_kb_game_id >> 16) & 0xff);
323280
324               case 3:
325                  return 0x3f00 | ((m_kb_game_id >> 16) & 0xff);
281                case 4:
282                   return 0x3f00 | ((m_kb_game_id >> 24) & 0xff);
326283
327               case 4:
328                  return 0x3f00 | ((m_kb_game_id >> 24) & 0xff);
284                default: // >= 5
285                   return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5, 2, 9, 7, 10, 13, 12, 15);
286                }
329287
288                return 0;
289      }
330290
291      case 0x40:
292         killbld_protection_calculate_hilo();
293         return 0; // Read and then discarded
331294
332
333               case 5:
334               default: // >= 5
335                  return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5,2,9,7,10,13,12,15);    // $817906
336            }
337         }
338
339         case 0x40:
340            olds_protection_calculate_hilo();
341            return 0; // unused?
295         //  default:
296         //      logerror("%06X: ASIC25 R CMD %X\n", space.device().safe_pc(), m_kb_cmd);
342297      }
343298   }
344299
r26058r26059
346301}
347302
348303
349
350
351void igs025_device::drgw2_protection_calculate_hilo()
304READ16_MEMBER(igs025_device::olds_r)
352305{
353   UINT8 source;
306   if (offset)
307   {
308      switch (m_kb_cmd)
309      {
310      case 0x01:
311         return m_kb_reg & 0x7f;
354312
355   m_kb_prot_hilo_select++;
356   if (m_kb_prot_hilo_select > 0xeb) {
357      m_kb_prot_hilo_select = 0;
358   }
313      case 0x02:
314         return m_olds_bs | 0x80;
359315
360   source = m_drgw2_source_data[m_drgw2_protection_region][m_kb_prot_hilo_select];
316      case 0x03:
317         return m_kb_cmd3;
361318
362   if (m_kb_prot_hilo_select & 1)
363   {
364      m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8);
365   }
366   else
367   {
368      m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0);
369   }
370}
371
372READ16_MEMBER(igs025_device::drgw2_d80000_protection_r )
373{
374   switch (m_kb_cmd)
375   {
376319      case 0x05:
377320      {
378         switch (m_kb_ptr)
379         {
380            case 1:
381               return 0x3f00 | ((m_kb_game_id >> 0) & 0xff);
321                switch (m_kb_ptr)
322                {
323                case 1:
324                   return 0x3f00 | ((m_kb_game_id >> 0) & 0xff);
382325
383            case 2:
384               return 0x3f00 | ((m_kb_game_id >> 8) & 0xff);
326                case 2:
327                   return 0x3f00 | ((m_kb_game_id >> 8) & 0xff);
385328
386            case 3:
387               return 0x3f00 | ((m_kb_game_id >> 16) & 0xff);
329                case 3:
330                   return 0x3f00 | ((m_kb_game_id >> 16) & 0xff);
388331
389            case 4:
390               return 0x3f00 | ((m_kb_game_id >> 24) & 0xff);
332                case 4:
333                   return 0x3f00 | ((m_kb_game_id >> 24) & 0xff);
391334
392            case 5:
393            default:
394               return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5,2,9,7,10,13,12,15);
395         }
396335
397         return 0x3f00;
336
337
338                case 5:
339                default: // >= 5
340                   return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5, 2, 9, 7, 10, 13, 12, 15);    // $817906
341                }
398342      }
399343
400344      case 0x40:
401         drgw2_protection_calculate_hilo();
402         return 0;
403
404   //  case 0x13: // Read to $80eeb8
405   //  case 0x1f: // Read to $80eeb8
406   //  case 0xf4: // Read to $80eeb8
407   //  case 0xf6: // Read to $80eeb8
408   //  case 0xf8: // Read to $80eeb8
409   //      return 0;
410
411   //  default:
412   //      logerror("%06x: warning, reading with igs003_reg = %02x\n", space.device().safe_pc(), m_kb_cmd);
345         olds_protection_calculate_hilo();
346         return 0; // unused?
347      }
413348   }
414349
415350   return 0;
416351}
417352
418WRITE16_MEMBER(igs025_device::drgw2_d80000_protection_w )
353
354READ16_MEMBER(igs025_device::drgw2_d80000_protection_r)
419355{
420   if (offset == 0)
356   switch (m_kb_cmd)
421357   {
422      m_kb_cmd = data;
423      return;
358   case 0x05:
359   {
360             switch (m_kb_ptr)
361             {
362             case 1:
363                return 0x3f00 | ((m_kb_game_id >> 0) & 0xff);
364
365             case 2:
366                return 0x3f00 | ((m_kb_game_id >> 8) & 0xff);
367
368             case 3:
369                return 0x3f00 | ((m_kb_game_id >> 16) & 0xff);
370
371             case 4:
372                return 0x3f00 | ((m_kb_game_id >> 24) & 0xff);
373
374             case 5:
375             default:
376                return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5, 2, 9, 7, 10, 13, 12, 15);
377             }
378
379             return 0x3f00;
424380   }
425381
426   switch (m_kb_cmd)
427   {
428      case 0x20:
429      case 0x21:
430      case 0x22:
431      case 0x23:
432      case 0x24:
433      case 0x25:
434      case 0x26:
435      case 0x27:
436         m_kb_ptr++;
437         drgw2_protection_calculate_hold(m_kb_cmd & 0x0f, data & 0xff);
438      break;
382   case 0x40:
383      drgw2_protection_calculate_hilo();
384      return 0;
439385
440   //  case 0x08: // Used only on init..
441   //  case 0x09:
442   //  case 0x0a:
443   //  case 0x0b:
444   //  case 0x0c:
445   //  break;
386      //  case 0x13: // Read to $80eeb8
387      //  case 0x1f: // Read to $80eeb8
388      //  case 0xf4: // Read to $80eeb8
389      //  case 0xf6: // Read to $80eeb8
390      //  case 0xf8: // Read to $80eeb8
391      //      return 0;
446392
447   //  case 0x15: // ????
448   //  case 0x17:
449   //  case 0xf2:
450   //  break;
393      //  default:
394      //      logerror("%06x: warning, reading with igs003_reg = %02x\n", space.device().safe_pc(), m_kb_cmd);
395   }
451396
452   //  default:
453   //      logerror("%06x: warning, writing to igs003_reg %02x = %02x\n", space.device().safe_pc(), m_kb_cmd, data);
454   }
397   return 0;
455398}
456399
457400
458401
402
459403void igs025_device::drgw2_protection_calculate_hold(int y, int z)
460404{
461405   unsigned short old = m_kb_prot_hold;
r26058r26059
504448
505449
506450
451void igs025_device::killbld_protection_calculate_hilo()
452{
453   UINT8 source;
507454
455   m_kb_prot_hilo_select++;
456
457   if (m_kb_prot_hilo_select > 0xeb) {
458      m_kb_prot_hilo_select = 0;
459   }
460
461   source = m_kb_source_data[m_kb_region][m_kb_prot_hilo_select];
462
463   if (m_kb_prot_hilo_select & 1)
464   {
465      m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8);
466   }
467   else
468   {
469      m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0);
470   }
471}
472
473
474void igs025_device::drgw2_protection_calculate_hilo()
475{
476   UINT8 source;
477
478   m_kb_prot_hilo_select++;
479   if (m_kb_prot_hilo_select > 0xeb) {
480      m_kb_prot_hilo_select = 0;
481   }
482
483   source = m_kb_source_data[m_kb_region][m_kb_prot_hilo_select];
484
485   if (m_kb_prot_hilo_select & 1)
486   {
487      m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8);
488   }
489   else
490   {
491      m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0);
492   }
493}
494
495void igs025_device::olds_protection_calculate_hilo() // calculated in routine $12dbc2 in olds
496{
497   UINT8 source;
498
499   m_kb_prot_hilo_select++;
500   if (m_kb_prot_hilo_select > 0xeb) {
501      m_kb_prot_hilo_select = 0;
502   }
503
504   source = m_kb_source_data[m_kb_region][m_kb_prot_hilo_select];
505
506   if (m_kb_prot_hilo_select & 1)    // $8178fa
507   {
508      m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8);     // $8178d8
509   }
510   else
511   {
512      m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0);     // $8178d8
513   }
514}
515
516
517
518
508519const device_type IGS025 = &device_creator<igs025_device>;
trunk/src/mame/machine/igs025.h
r26058r26059
1717   DECLARE_READ16_MEMBER( killbld_igs025_prot_r );
1818   // use setters instead of making public?
1919   const UINT8 (*m_kb_source_data)[0xec];
20   INT32 m_kb_source_data_offset;
2120   UINT32 m_kb_game_id;
21   UINT32 m_kb_region;
2222
23
2324   igs025_execute_external m_execute_external;
2425   static void set_external_cb(device_t &device,igs025_execute_external newcb);
2526
r26058r26059
2728   DECLARE_READ16_MEMBER( olds_r );
2829   DECLARE_WRITE16_MEMBER( olds_w );
2930   //const UINT8  *m_kb_prot_hilo_source2;
30   const UINT8 (*olds_source_data)[0xec];
3131
3232   DECLARE_READ16_MEMBER( drgw2_d80000_protection_r );
3333   DECLARE_WRITE16_MEMBER( drgw2_d80000_protection_w );
34   UINT32 m_drgw2_protection_region;
35   const UINT8 (*m_drgw2_source_data)[0xec];
34   
3635
3736protected:
3837   virtual void device_config_complete();

Previous 199869 Revisions Next


© 1997-2024 The MAME Team