Previous 199869 Revisions Next

r21820 Wednesday 13th March, 2013 at 08:07:31 UTC by Fabio Priuli
(MESS) snes.c: backup of minor work on SPC7110 RTC. still not enough to pass test in Tengai Makyou. nw.
[src/mess/machine]sns_spc7110.c sns_spc7110.h

trunk/src/mess/machine/sns_spc7110.c
r21819r21820
176176   
177177// at this stage, rtc_ram is not yet allocated. this will be fixed when converting RTC to be a separate device.
178178//  spc7110_update_time(0);
179
180   // set basetime for RTC
181   machine().current_datetime(m_rtc_basetime);
179182   
180183   save_item(NAME(m_rtc_state));
181184   save_item(NAME(m_rtc_mode));
r21819r21820
930933// (and indeed current code fails to pass Tengai Makyou Zero tests)
931934void sns_rom_spc7110_device::spc7110_update_time(UINT8 offset)
932935{
933   system_time curtime, *systime = &curtime;
936   system_time curtime;
934937   machine().current_datetime(curtime);
935   int update = 1;
938   INT64 diff = curtime.time - m_rtc_basetime.time - offset;
939//   printf("diff %llx\n", diff);
940   bool update = TRUE;
936941
937   m_rtc_offset += offset;
938
939942   // TEST: can we go beyond 24hrs of rounding?!? I doubt it will ever go beyond 3600, but I could be wrong...
940   assert(m_rtc_offset < 86400);
943   assert(diff < 86400);
941944
942945   /* do not update if CR0 or CR2 timer disable flags are set */
943946   if ((m_rtc_ram[13] & 0x01) || (m_rtc_ram[15] & 0x03))
944      update = 0;
947      update = FALSE;
945948
946   if (update)
949   if (update && diff > 0)
947950   {
948951      /* update time with offset, assuming offset < 3600s */
949      UINT8 second = systime->local_time.second;
950      UINT8 minute = systime->local_time.minute;
951      UINT8 hour = systime->local_time.hour;
952      UINT8 mday = systime->local_time.mday;
952      UINT32 second = m_rtc_ram[0] + m_rtc_ram[1] * 10;
953      UINT8 minute = m_rtc_ram[2] + m_rtc_ram[3] * 10;
954      UINT8 hour = m_rtc_ram[4] + m_rtc_ram[5] * 10;
955      UINT8 day = m_rtc_ram[6] + m_rtc_ram[7] * 10;
956      UINT8 month = m_rtc_ram[8] + m_rtc_ram[9] * 10;
957      UINT8 year = m_rtc_ram[10] + m_rtc_ram[11] * 10;
958      UINT8 weekday = m_rtc_ram[12];
959      day--;
960      month--;
961      year += (year >= 90) ? 1900 : 2000;
953962
954      while (m_rtc_offset >= 3600)
963      second += (UINT32)diff;
964      while (second >= 60)
955965      {
956         m_rtc_offset -= 3600;
966         second -= 60;
967         minute++;
968
969         // are we below 60 minutes?
970         if (minute < 60)
971            continue;
972         // otherwise we have to increase hour!
973         minute = 0;
957974         hour++;
958975
959         if (hour == 24)
960         {
961            mday++;
962            hour = 0;
963         }
964      }
976         // are we below 24 hours?
977         if (hour < 24)
978            continue;
979         // otherwise we have to increase day!
980         hour = 0;
981         day++;
965982
966      while (m_rtc_offset >= 60)
967      {
968         m_rtc_offset -= 60;
969         minute++;
983         weekday = (weekday + 1) % 7;
970984
971         if (minute == 60)
985         UINT8 days = spc7110_months[month % 12];
986         // check for feb 29th
987         if (days == 28)
972988         {
973            hour++;
974            minute = 0;
989            bool leap = FALSE;
990            if ((year % 4) == 0)
991            {
992               if(year % 100 || !(year % 400))
993                  leap = TRUE;
994            }
995            if (leap)
996               days++;
975997         }
976      }
977998
978      while (m_rtc_offset)
979      {
980         m_rtc_offset -= 1;
981         second++;
999         // are we below end of month?
1000         if (day < days)
1001            continue;
1002         // otherwise we have to increase month!
1003         day = 0;
1004         month++;
9821005
983         if (second == 60)
984         {
985            minute++;
986            second = 0;
987         }
1006         // are we below end of year?
1007         if (month < 12)
1008            continue;
1009         // otherwise we have to increase year!
1010         month = 0;
1011         year++;
9881012      }
989
1013     
1014      day++;
1015      month++;
1016      year %= 100;
1017     
9901018      m_rtc_ram[0] = second % 10;
9911019      m_rtc_ram[1] = second / 10;
9921020      m_rtc_ram[2] = minute % 10;
9931021      m_rtc_ram[3] = minute / 10;
9941022      m_rtc_ram[4] = hour % 10;
9951023      m_rtc_ram[5] = hour / 10;
996      m_rtc_ram[6] = mday % 10;
997      m_rtc_ram[7] = mday / 10;
998      m_rtc_ram[8] = systime->local_time.month % 10;
999      m_rtc_ram[9] = systime->local_time.month / 10;
1000      m_rtc_ram[8] = systime->local_time.month;
1001      m_rtc_ram[10] = (systime->local_time.year - 1900) % 10;
1002      m_rtc_ram[11] = ((systime->local_time.year - 1900) / 10) % 10;
1003      m_rtc_ram[12] = systime->local_time.weekday % 7;
1024      m_rtc_ram[6] = day % 10;
1025      m_rtc_ram[7] = day / 10;
1026      m_rtc_ram[8] = month % 10;
1027      m_rtc_ram[9] = month / 10;
1028      m_rtc_ram[10] = year % 10;
1029      m_rtc_ram[11] = (year / 10) % 10;
1030      m_rtc_ram[12] = weekday % 7;
1031      m_rtc_basetime = curtime;
10041032   }
10051033}
10061034
trunk/src/mess/machine/sns_spc7110.h
r21819r21820
176176
177177   UINT64 m_rtc_offset;
178178
179   system_time m_rtc_basetime;
180
179181   //this is now allocated in the main snes cart class, to allow saving to nvram
180182   //UINT8 m_rtc_ram[16];  // 0-12 secs, min, hrs, etc.; 13-14-15 control registers
181183

Previous 199869 Revisions Next


© 1997-2024 The MAME Team