Previous 199869 Revisions Next

r18093 Sunday 23rd September, 2012 at 13:04:36 UTC by Ville Linde
viper.c: Fixed EPIC register access
[src/mame/drivers]viper.c

trunk/src/mame/drivers/viper.c
r18092r18093
292292#define VIPER_DEBUG_LOG
293293#define VIPER_DEBUG_EPIC_INTS      1
294294#define VIPER_DEBUG_EPIC_TIMERS      0
295#define VIPER_DEBUG_EPIC_REGS      0
296#define VIPER_DEBUG_EPIC_I2C      0
295297
296298
297299#define SDRAM_CLOCK         166666666      // Main SDRAMs run at 166MHz
r18092r18093
491493// TODO: move to viper_state
492494static MPC8240_EPIC epic;
493495
496#if VIPER_DEBUG_EPIC_REGS
494497static const char* epic_get_register_name(UINT32 reg)
495498{
496499   switch (reg >> 16)
r18092r18093
604607
605608   return NULL;
606609}
610#endif
607611
608612static TIMER_CALLBACK(epic_global_timer_callback)
609613{
r18092r18093
682686   int reg;
683687   reg = offset * 4;
684688
689#if VIPER_DEBUG_EPIC_REGS
685690   if (reg != 0x600a0)      // IACK is spammy
686691   {
687692      const char *regname = epic_get_register_name(reg);
r18092r18093
694699         printf("EPIC: read %08X at %08X\n", reg, space.device().safe_pc());
695700      }
696701   }
702#endif
697703
704   UINT32 ret = 0;
705
698706   switch (reg >> 16)
699707   {
700708      // 0x00000 - 0x0ffff
r18092r18093
704712         {
705713            case 0x3000:         // Offset 0x3000 - I2CADR
706714            {
707               return epic.i2c_adr;
715               ret = epic.i2c_adr;
716               break;
708717            }
709718            case 0x3004:         // Offset 0x3004 - I2CFDR
710719            {
711               return epic.i2c_freq_div | (epic.i2c_freq_sample_rate << 8);
720               ret = epic.i2c_freq_div | (epic.i2c_freq_sample_rate << 8);
721               break;
712722            }
713723            case 0x3008:         // Offset 0x3008 - I2CCR
714724            {
715               return epic.i2c_cr;
725               ret = epic.i2c_cr;
726               break;
716727            }
717728            case 0x300c:         // Offset 0x300c - I2CSR
718729            {
719               return epic.i2c_sr;
730               ret = epic.i2c_sr;
731               break;
720732            }
721733            case 0x3010:         // Offset 0x3010 - I2CDR
722734            {
r18092r18093
778790            case 0x11e0:         // Offset 0x411e0 - Global Timer 3 vector/priority register
779791            {
780792               int timer_num = ((reg & 0xffff) - 0x1120) >> 6;
781               UINT32 value = 0;
782               value |= epic.irq[MPC8240_GTIMER0_IRQ + timer_num].mask ? 0x80000000 : 0;
783               value |= epic.irq[MPC8240_GTIMER0_IRQ + timer_num].priority << 16;
784               value |= epic.irq[MPC8240_GTIMER0_IRQ + timer_num].vector;
785               value |= epic.irq[MPC8240_GTIMER0_IRQ + timer_num].active ? 0x40000000 : 0;
786               return value;
793
794               ret |= epic.irq[MPC8240_GTIMER0_IRQ + timer_num].mask ? 0x80000000 : 0;
795               ret |= epic.irq[MPC8240_GTIMER0_IRQ + timer_num].priority << 16;
796               ret |= epic.irq[MPC8240_GTIMER0_IRQ + timer_num].vector;
797               ret |= epic.irq[MPC8240_GTIMER0_IRQ + timer_num].active ? 0x40000000 : 0;
798               break;
787799            }
788800         }
789801         break;
r18092r18093
812824            case 0x03e0:         // Offset 0x503e0 - IRQ15 vector/priority register
813825            {
814826               int irq = ((reg & 0xffff) - 0x200) >> 5;
815               int value = 0;
816827
817               value |= epic.irq[MPC8240_IRQ0 + irq].mask ? 0x80000000 : 0;
818               value |= epic.irq[MPC8240_IRQ0 + irq].priority << 16;
819               value |= epic.irq[MPC8240_IRQ0 + irq].vector;
820               value |= epic.irq[MPC8240_IRQ0 + irq].active ? 0x40000000 : 0;
821
822               return value;
828               ret |= epic.irq[MPC8240_IRQ0 + irq].mask ? 0x80000000 : 0;
829               ret |= epic.irq[MPC8240_IRQ0 + irq].priority << 16;
830               ret |= epic.irq[MPC8240_IRQ0 + irq].vector;
831               ret |= epic.irq[MPC8240_IRQ0 + irq].active ? 0x40000000 : 0;
832               break;
823833            }
824834            case 0x1020:         // Offset 0x51020 - I2C IRQ vector/priority register
825835            {
826               UINT32 value = 0;
827               value |= epic.irq[MPC8240_I2C_IRQ].mask ? 0x80000000 : 0;
828               value |= epic.irq[MPC8240_I2C_IRQ].priority << 16;
829               value |= epic.irq[MPC8240_I2C_IRQ].vector;
830               value |= epic.irq[MPC8240_I2C_IRQ].active ? 0x40000000 : 0;
831               return value;
836               ret |= epic.irq[MPC8240_I2C_IRQ].mask ? 0x80000000 : 0;
837               ret |= epic.irq[MPC8240_I2C_IRQ].priority << 16;
838               ret |= epic.irq[MPC8240_I2C_IRQ].vector;
839               ret |= epic.irq[MPC8240_I2C_IRQ].active ? 0x40000000 : 0;
840               return ret;
832841            }
833842         }
834843         break;
r18092r18093
845854
846855               if (epic.active_irq >= 0)
847856               {
848                  return epic.iack;
857                  ret = epic.iack;
849858               }
850859               else
851860               {
852861                  // spurious vector register is returned if no pending interrupts
853                  return epic.svr;
862                  ret = epic.svr;
854863               }
864               break;
855865            }
856866
857867         }
r18092r18093
859869      }
860870   }
861871
862   return 0;
872   return FLIPENDIAN_INT32(ret);
863873}
864874
865875WRITE32_MEMBER(viper_state::epic_w)
r18092r18093
867877   int reg;
868878   reg = offset * 4;
869879
880   data = FLIPENDIAN_INT32(data);
881
882#if VIPER_DEBUG_EPIC_REGS
870883   if (reg != 0x600b0)      // interrupt clearing is spammy
871884   {
872885      const char *regname = epic_get_register_name(reg);
r18092r18093
879892         printf("EPIC: write %08X, %08X at %08X\n", data, reg, space.device().safe_pc());
880893      }
881894   }
895#endif
882896
883897   switch (reg >> 16)
884898   {
r18092r18093
921935               {
922936                  if (epic.i2c_state == I2C_STATE_ADDRESS_CYCLE)         // waiting for address cycle
923937                  {
924                     int addr = (data >> 1) & 0x7f;
925938                     //int rw = data & 1;
926939
940#if VIPER_DEBUG_EPIC_I2C
941                     int addr = (data >> 1) & 0x7f;
927942                     printf("I2C address cycle, addr = %02X\n", addr);
943#endif
928944                     epic.i2c_state = I2C_STATE_DATA_TRANSFER;
929945
930946                     // set transfer complete in status register
r18092r18093
933949                     // generate interrupt if interrupt are enabled
934950                     if (epic.i2c_cr & 0x40)
935951                     {
952#if VIPER_DEBUG_EPIC_I2C
936953                        printf("I2C interrupt\n");
954#endif
937955                        mpc8240_interrupt(machine(), MPC8240_I2C_IRQ);
938956
939957                        // set interrupt flag in status register
r18092r18093
942960                  }
943961                  else if (epic.i2c_state == I2C_STATE_DATA_TRANSFER)      // waiting for data transfer
944962                  {
963#if VIPER_DEBUG_EPIC_I2C
945964                     printf("I2C data transfer, data = %02X\n", data);
965#endif
946966                     epic.i2c_state = I2C_STATE_ADDRESS_CYCLE;
947967
948968                     // set transfer complete in status register
r18092r18093
951971                     // generate interrupt if interrupts are enabled
952972                     if (epic.i2c_cr & 0x40)
953973                     {
974#if VIPER_DEBUG_EPIC_I2C
954975                        printf("I2C interrupt\n");
976#endif
955977                        mpc8240_interrupt(machine(), MPC8240_I2C_IRQ);
956978
957979                        // set interrupt flag in status register

Previous 199869 Revisions Next


© 1997-2024 The MAME Team