Previous 199869 Revisions Next

r26058 Friday 8th November, 2013 at 15:56:09 UTC by David Haywood
part 2 (nw)
[src/mame/machine]igs025.c igs025.h

trunk/src/mame/machine/igs025.c
r26057r26058
6464   save_item(NAME(m_kb_ptr));
6565
6666
67   m_olds_prot_hold = 0;
68   m_olds_prot_hilo = 0;
69   m_olds_prot_hilo_select = 0;
7067
71   m_olds_cmd = 0;
72   m_olds_reg = 0;
73   m_olds_ptr = 0;
68
7469   m_olds_bs = 0;
75   m_olds_cmd3 = 0;
70   m_kb_cmd3 = 0;
7671
77   save_item(NAME(m_olds_cmd));
78   save_item(NAME(m_olds_reg));
79   save_item(NAME(m_olds_ptr));
72
8073   save_item(NAME(m_olds_bs));
81   save_item(NAME(m_olds_cmd3));
74   save_item(NAME(m_kb_cmd3));
8275
8376
84   m_drgw2_cmd = 0;
85   m_drgw2_ptr = 0;
86   m_drgw2_prot_hilo = 0;
87   m_drgw2_prot_hilo_select = 0;
88   m_drgw2_prot_hold = 0;
8977
90   save_item(NAME(m_drgw2_cmd));
91   save_item(NAME(m_drgw2_ptr));
92   save_item(NAME(m_drgw2_prot_hilo));
93   save_item(NAME(m_drgw2_prot_hilo_select));
94   save_item(NAME(m_drgw2_prot_hold));
9578}
9679
9780void igs025_device::device_reset()
r26057r26058
10588   m_kb_ptr = 0;
10689   m_kb_swap = 0;
10790
108   m_olds_prot_hold = 0;
109   m_olds_prot_hilo = 0;
110   m_olds_prot_hilo_select = 0;
11191
112   m_olds_cmd = 0;
113   m_olds_reg = 0;
114   m_olds_ptr = 0;
11592   m_olds_bs = 0;
116   m_olds_cmd3 = 0;
93   m_kb_cmd3 = 0;
11794
118   m_drgw2_cmd = 0;
119   m_drgw2_ptr = 0;
120   m_drgw2_prot_hilo = 0;
121   m_drgw2_prot_hilo_select = 0;
122   m_drgw2_prot_hold = 0;
123
12495}
12596
126void igs025_device::killbld_protection_calculate_hold(int y, int z)
127{
128   unsigned short old = m_kb_prot_hold;
12997
130   m_kb_prot_hold = ((old << 1) | (old >> 15));
131
132   m_kb_prot_hold ^= 0x2bad;
133   m_kb_prot_hold ^= BIT(z, y);
134   m_kb_prot_hold ^= BIT( old,  7) <<  0;
135   m_kb_prot_hold ^= BIT(~old, 13) <<  4;
136   m_kb_prot_hold ^= BIT( old,  3) << 11;
137
138   m_kb_prot_hold ^= (m_kb_prot_hilo & ~0x0408) << 1;
139}
140
14198void igs025_device::killbld_protection_calculate_hilo()
14299{
143100   UINT8 source;
r26057r26058
269226
270227/* todo, collapse this all into above */
271228
272void igs025_device::olds_protection_calculate_hold(int y, int z) // calculated in routine $12dbc2 in olds
273{
274   unsigned short old = m_olds_prot_hold;
275229
276   m_olds_prot_hold = ((old << 1) | (old >> 15));
277
278   m_olds_prot_hold ^= 0x2bad;
279   m_olds_prot_hold ^= BIT(z, y);
280   m_olds_prot_hold ^= BIT( old,  7) <<  0;
281   m_olds_prot_hold ^= BIT(~old, 13) <<  4;
282   m_olds_prot_hold ^= BIT( old,  3) << 11;
283
284   m_olds_prot_hold ^= (m_olds_prot_hilo & ~0x0408) << 1; // $81790c
285}
286
287230void igs025_device::olds_protection_calculate_hilo() // calculated in routine $12dbc2 in olds
288231{
289232   UINT8 source;
290233
291   m_olds_prot_hilo_select++;
292   if (m_olds_prot_hilo_select > 0xeb) {
293      m_olds_prot_hilo_select = 0;
234   m_kb_prot_hilo_select++;
235   if (m_kb_prot_hilo_select > 0xeb) {
236      m_kb_prot_hilo_select = 0;
294237   }
295238
296   source = olds_source_data[m_drgw2_protection_region][m_olds_prot_hilo_select];
239   source = olds_source_data[m_drgw2_protection_region][m_kb_prot_hilo_select];
297240
298   if (m_olds_prot_hilo_select & 1)    // $8178fa
241   if (m_kb_prot_hilo_select & 1)    // $8178fa
299242   {
300      m_olds_prot_hilo = (m_olds_prot_hilo & 0x00ff) | (source << 8);     // $8178d8
243      m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8);     // $8178d8
301244   }
302245   else
303246   {
304      m_olds_prot_hilo = (m_olds_prot_hilo & 0xff00) | (source << 0);     // $8178d8
247      m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0);     // $8178d8
305248   }
306249}
307250
r26057r26058
309252{
310253   if (offset == 0)
311254   {
312      m_olds_cmd = data;
255      m_kb_cmd = data;
313256   }
314257   else
315258   {
316      switch (m_olds_cmd)
259      switch (m_kb_cmd)
317260      {
318261         case 0x00:
319            m_olds_reg = data;
262            m_kb_reg = data;
320263         break;
321264
322265         case 0x02:
r26057r26058
327270         {
328271            m_execute_external();
329272
330            m_olds_cmd3 = ((data >> 4) + 1) & 0x3;
273            m_kb_cmd3 = ((data >> 4) + 1) & 0x3;
331274         }
332275         break;
333276
334277         case 0x04:
335            m_olds_ptr = data;
278            m_kb_ptr = data;
336279         break;
337280
338281         case 0x20:
r26057r26058
343286         case 0x25:
344287         case 0x26:
345288         case 0x27:
346            m_olds_ptr++;
347            olds_protection_calculate_hold(m_olds_cmd & 0x0f, data & 0xff);
289            m_kb_ptr++;
290            olds_protection_calculate_hold(m_kb_cmd & 0x0f, data & 0xff);
348291         break;
349292
350293      //  default:
r26057r26058
357300{
358301   if (offset)
359302   {
360      switch (m_olds_cmd)
303      switch (m_kb_cmd)
361304      {
362305         case 0x01:
363            return m_olds_reg & 0x7f;
306            return m_kb_reg & 0x7f;
364307
365308         case 0x02:
366309            return m_olds_bs | 0x80;
367310
368311         case 0x03:
369            return m_olds_cmd3;
312            return m_kb_cmd3;
370313
371314         case 0x05:
372315         {
373            switch (m_olds_ptr)
316            switch (m_kb_ptr)
374317            {
375318               case 1:
376319                  return 0x3f00 | ((m_kb_game_id >> 0) & 0xff);
r26057r26058
389332
390333               case 5:
391334               default: // >= 5
392                  return 0x3f00 | BITSWAP8(m_olds_prot_hold, 5,2,9,7,10,13,12,15);    // $817906
335                  return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5,2,9,7,10,13,12,15);    // $817906
393336            }
394337         }
395338
r26057r26058
403346}
404347
405348
406void igs025_device::drgw2_protection_calculate_hold(int y, int z)
407{
408   unsigned short old = m_drgw2_prot_hold;
409349
410   m_drgw2_prot_hold = ((old << 1) | (old >> 15));
411350
412   m_drgw2_prot_hold ^= 0x2bad;
413   m_drgw2_prot_hold ^= BIT(z, y);
414   m_drgw2_prot_hold ^= BIT( old,  7) <<  0;
415   m_drgw2_prot_hold ^= BIT(~old, 13) <<  4;
416   m_drgw2_prot_hold ^= BIT( old,  3) << 11;
417
418   m_drgw2_prot_hold ^= (m_drgw2_prot_hilo & ~0x0408) << 1;
419}
420
421351void igs025_device::drgw2_protection_calculate_hilo()
422352{
423353   UINT8 source;
424354
425   m_drgw2_prot_hilo_select++;
426   if (m_drgw2_prot_hilo_select > 0xeb) {
427      m_drgw2_prot_hilo_select = 0;
355   m_kb_prot_hilo_select++;
356   if (m_kb_prot_hilo_select > 0xeb) {
357      m_kb_prot_hilo_select = 0;
428358   }
429359
430   source = m_drgw2_source_data[m_drgw2_protection_region][m_drgw2_prot_hilo_select];
360   source = m_drgw2_source_data[m_drgw2_protection_region][m_kb_prot_hilo_select];
431361
432   if (m_drgw2_prot_hilo_select & 1)
362   if (m_kb_prot_hilo_select & 1)
433363   {
434      m_drgw2_prot_hilo = (m_drgw2_prot_hilo & 0x00ff) | (source << 8);
364      m_kb_prot_hilo = (m_kb_prot_hilo & 0x00ff) | (source << 8);
435365   }
436366   else
437367   {
438      m_drgw2_prot_hilo = (m_drgw2_prot_hilo & 0xff00) | (source << 0);
368      m_kb_prot_hilo = (m_kb_prot_hilo & 0xff00) | (source << 0);
439369   }
440370}
441371
442372READ16_MEMBER(igs025_device::drgw2_d80000_protection_r )
443373{
444   switch (m_drgw2_cmd)
374   switch (m_kb_cmd)
445375   {
446376      case 0x05:
447377      {
448         switch (m_drgw2_ptr)
378         switch (m_kb_ptr)
449379         {
450380            case 1:
451381               return 0x3f00 | ((m_kb_game_id >> 0) & 0xff);
r26057r26058
461391
462392            case 5:
463393            default:
464               return 0x3f00 | BITSWAP8(m_drgw2_prot_hold, 5,2,9,7,10,13,12,15);
394               return 0x3f00 | BITSWAP8(m_kb_prot_hold, 5,2,9,7,10,13,12,15);
465395         }
466396
467397         return 0x3f00;
r26057r26058
479409   //      return 0;
480410
481411   //  default:
482   //      logerror("%06x: warning, reading with igs003_reg = %02x\n", space.device().safe_pc(), m_drgw2_cmd);
412   //      logerror("%06x: warning, reading with igs003_reg = %02x\n", space.device().safe_pc(), m_kb_cmd);
483413   }
484414
485415   return 0;
r26057r26058
489419{
490420   if (offset == 0)
491421   {
492      m_drgw2_cmd = data;
422      m_kb_cmd = data;
493423      return;
494424   }
495425
496   switch (m_drgw2_cmd)
426   switch (m_kb_cmd)
497427   {
498428      case 0x20:
499429      case 0x21:
r26057r26058
503433      case 0x25:
504434      case 0x26:
505435      case 0x27:
506         m_drgw2_ptr++;
507         drgw2_protection_calculate_hold(m_drgw2_cmd & 0x0f, data & 0xff);
436         m_kb_ptr++;
437         drgw2_protection_calculate_hold(m_kb_cmd & 0x0f, data & 0xff);
508438      break;
509439
510440   //  case 0x08: // Used only on init..
r26057r26058
520450   //  break;
521451
522452   //  default:
523   //      logerror("%06x: warning, writing to igs003_reg %02x = %02x\n", space.device().safe_pc(), m_drgw2_cmd, data);
453   //      logerror("%06x: warning, writing to igs003_reg %02x = %02x\n", space.device().safe_pc(), m_kb_cmd, data);
524454   }
525455}
526456
527457
528458
459void igs025_device::drgw2_protection_calculate_hold(int y, int z)
460{
461   unsigned short old = m_kb_prot_hold;
529462
463   m_kb_prot_hold = ((old << 1) | (old >> 15));
464
465   m_kb_prot_hold ^= 0x2bad;
466   m_kb_prot_hold ^= BIT(z, y);
467   m_kb_prot_hold ^= BIT(old, 7) << 0;
468   m_kb_prot_hold ^= BIT(~old, 13) << 4;
469   m_kb_prot_hold ^= BIT(old, 3) << 11;
470
471   m_kb_prot_hold ^= (m_kb_prot_hilo & ~0x0408) << 1;
472}
473
474
475void igs025_device::olds_protection_calculate_hold(int y, int z) // calculated in routine $12dbc2 in olds
476{
477   unsigned short old = m_kb_prot_hold;
478
479   m_kb_prot_hold = ((old << 1) | (old >> 15));
480
481   m_kb_prot_hold ^= 0x2bad;
482   m_kb_prot_hold ^= BIT(z, y);
483   m_kb_prot_hold ^= BIT(old, 7) << 0;
484   m_kb_prot_hold ^= BIT(~old, 13) << 4;
485   m_kb_prot_hold ^= BIT(old, 3) << 11;
486
487   m_kb_prot_hold ^= (m_kb_prot_hilo & ~0x0408) << 1; // $81790c
488}
489
490void igs025_device::killbld_protection_calculate_hold(int y, int z)
491{
492   unsigned short old = m_kb_prot_hold;
493
494   m_kb_prot_hold = ((old << 1) | (old >> 15));
495
496   m_kb_prot_hold ^= 0x2bad;
497   m_kb_prot_hold ^= BIT(z, y);
498   m_kb_prot_hold ^= BIT(old, 7) << 0;
499   m_kb_prot_hold ^= BIT(~old, 13) << 4;
500   m_kb_prot_hold ^= BIT(old, 3) << 11;
501
502   m_kb_prot_hold ^= (m_kb_prot_hilo & ~0x0408) << 1;
503}
504
505
506
507
530508const device_type IGS025 = &device_creator<igs025_device>;
trunk/src/mame/machine/igs025.h
r26057r26058
2626
2727   DECLARE_READ16_MEMBER( olds_r );
2828   DECLARE_WRITE16_MEMBER( olds_w );
29   //const UINT8  *m_olds_prot_hilo_source2;
29   //const UINT8  *m_kb_prot_hilo_source2;
3030   const UINT8 (*olds_source_data)[0xec];
3131
3232   DECLARE_READ16_MEMBER( drgw2_d80000_protection_r );
r26057r26058
5555
5656   void no_callback_setup(void);
5757
58   int           m_olds_cmd;
59   int           m_olds_reg;
60   int           m_olds_ptr;
58
6159   UINT16        m_olds_bs;
62   UINT16        m_olds_cmd3;
63   UINT16        m_olds_prot_hold;
64   UINT16        m_olds_prot_hilo;
65   UINT16        m_olds_prot_hilo_select;
60   UINT16        m_kb_cmd3;
6661
6762
6863   void olds_protection_calculate_hilo();
r26057r26058
7267
7368
7469
75   UINT16        m_drgw2_prot_hold;
76   UINT16        m_drgw2_prot_hilo;
77   UINT16        m_drgw2_prot_hilo_select;
78   int           m_drgw2_cmd;
79   int           m_drgw2_ptr;
8070
8171
8272   void drgw2_protection_calculate_hilo();

Previous 199869 Revisions Next


© 1997-2024 The MAME Team