trunk/src/mess/machine/sns_spc7110.c
| r21819 | r21820 | |
| 176 | 176 | |
| 177 | 177 | // at this stage, rtc_ram is not yet allocated. this will be fixed when converting RTC to be a separate device. |
| 178 | 178 | // spc7110_update_time(0); |
| 179 | |
| 180 | // set basetime for RTC |
| 181 | machine().current_datetime(m_rtc_basetime); |
| 179 | 182 | |
| 180 | 183 | save_item(NAME(m_rtc_state)); |
| 181 | 184 | save_item(NAME(m_rtc_mode)); |
| r21819 | r21820 | |
| 930 | 933 | // (and indeed current code fails to pass Tengai Makyou Zero tests) |
| 931 | 934 | void sns_rom_spc7110_device::spc7110_update_time(UINT8 offset) |
| 932 | 935 | { |
| 933 | | system_time curtime, *systime = &curtime; |
| 936 | system_time curtime; |
| 934 | 937 | 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; |
| 936 | 941 | |
| 937 | | m_rtc_offset += offset; |
| 938 | | |
| 939 | 942 | // 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); |
| 941 | 944 | |
| 942 | 945 | /* do not update if CR0 or CR2 timer disable flags are set */ |
| 943 | 946 | if ((m_rtc_ram[13] & 0x01) || (m_rtc_ram[15] & 0x03)) |
| 944 | | update = 0; |
| 947 | update = FALSE; |
| 945 | 948 | |
| 946 | | if (update) |
| 949 | if (update && diff > 0) |
| 947 | 950 | { |
| 948 | 951 | /* 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; |
| 953 | 962 | |
| 954 | | while (m_rtc_offset >= 3600) |
| 963 | second += (UINT32)diff; |
| 964 | while (second >= 60) |
| 955 | 965 | { |
| 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; |
| 957 | 974 | hour++; |
| 958 | 975 | |
| 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++; |
| 965 | 982 | |
| 966 | | while (m_rtc_offset >= 60) |
| 967 | | { |
| 968 | | m_rtc_offset -= 60; |
| 969 | | minute++; |
| 983 | weekday = (weekday + 1) % 7; |
| 970 | 984 | |
| 971 | | if (minute == 60) |
| 985 | UINT8 days = spc7110_months[month % 12]; |
| 986 | // check for feb 29th |
| 987 | if (days == 28) |
| 972 | 988 | { |
| 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++; |
| 975 | 997 | } |
| 976 | | } |
| 977 | 998 | |
| 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++; |
| 982 | 1005 | |
| 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++; |
| 988 | 1012 | } |
| 989 | | |
| 1013 | |
| 1014 | day++; |
| 1015 | month++; |
| 1016 | year %= 100; |
| 1017 | |
| 990 | 1018 | m_rtc_ram[0] = second % 10; |
| 991 | 1019 | m_rtc_ram[1] = second / 10; |
| 992 | 1020 | m_rtc_ram[2] = minute % 10; |
| 993 | 1021 | m_rtc_ram[3] = minute / 10; |
| 994 | 1022 | m_rtc_ram[4] = hour % 10; |
| 995 | 1023 | 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; |
| 1004 | 1032 | } |
| 1005 | 1033 | } |
| 1006 | 1034 | |