FS-UAE Amiga Emulator

Documentation

Option: uae_rtc

Summary: Enable a real time clock (RTC) module.
Type: Choice
Default: auto
Example: MSM6242B
Tags: hardware

Enabling a real time clock (RTC) module allows the emulated Amiga to read
the current time (automatically retrieved from the host system). When you
want to override this option, you may also have to set
[uae_chipset_compatible][] to `-`.

Value: auto ("Auto") - Automatically enable RTC module for some Amiga models.
Value: none ("None") - Real time clock is explicitly disabled.
Value: MSM6242B (Oki MSM6242B) - RTC module in A500/500+/600/1200/2000 models.
Value: RP5C01A (Ricoh RP5C01A) - RTC module in big-box Amigas (A3000, A4000).
Value: MSM6242B_A2000 (A2000 MSM6242B) - Only used in very early A2000
       revisions, not even WB 1.3 supports it.

A real time clock is enabled automatically (`auto`) for the following Amiga
models:

* A500+, A2000 and CDTV defaults to `MSM6242B`.
* A500 defaults to `MSM6242B` only when a memory expansion is enabled.
* A1200 defaults to `MSM6242B` only when fast memory is added.
* A3000 and A4000 models default to `RP5C01A`.

# FIXME: A1200 Blizzard expansions!

Enabling warp mode can cause Workbench to not detect the RTC module
because the read time does not progress as expected (FIXME).

In versions prior to FS-UAE 2.5.19dev, A600 erroneously defaulted to having 
`MSM6242B`, while the correct default is `none` (A stock A600 does not
have any RTC module).

Code:
    # FIXME: Blizzard expansions!
    
    if c.uae_chipset_compatible == "-":
        if c.uae_rtc.explicit:
            value = c.uae_rtc.explicit
            if f.matches(value, "none"):
                value = "none"
            elif f.matches(value, "auto"):
                value = "none"
            elif f.matches(value, "MSM6242B"):
                value = "MSM6242B"
            elif f.matches(value, "MSM6242B_A2000"):
                value = "MSM6242B_A2000"
            elif f.matches(value, "RP5C01A"):
                value = "RP5C01A"
            else:
                f.warning(value + ": invalid value")
                value = "none"
        else:
            value = "none"
    else:
        if c.uae_rtc.explicit and c.uae_rtc.explicit != "auto":
            f.warning("uae_rtc is ignored (compatible chipset enabled)")
        if c.uae_chipset_compatible == "Generic":
            value = "RP5C01A"
        elif c.uae_chipset_compatible == "CDTV":
            value = "MSM6242B"
        elif c.uae_chipset_compatible == "CD32":
            value = "none"
        elif c.uae_chipset_compatible == "A500":
            if int(c.int_bogomem_size):
                value = "MSM6242B"
            elif int(c.int_chipmem_size) > 0x80000:
                value = "MSM6242B"
            elif int(c.int_fastmem_size):
                value = "MSM6242B"
            else:
                value = "none"
        elif c.uae_chipset_compatible == "A500+":
            value = "MSM6242B"
        elif c.uae_chipset_compatible == "A600":
            value = "none"
        elif c.uae_chipset_compatible == "A1000":
            value = "none"
        elif c.uae_chipset_compatible == "A1200":
            if int(c.int_fastmem_size) or int(c.int_z3fastmem_size):
                value = "MSM6242B"
            else:
                value = "none"
        elif c.uae_chipset_compatible == "A2000":
            value = "MSM6242B"
        elif c.uae_chipset_compatible == "A3000":
            value = "RP5C01A"
        elif c.uae_chipset_compatible == "A3000T":
            value = "RP5C01A"
        elif c.uae_chipset_compatible == "A4000":
            value = "RP5C01A"
        elif c.uae_chipset_compatible == "A4000T":
            value = "RP5C01A"
        else:
            f.fail("unknown uae_chipset_compatible")

Test A500:
    > amiga_model = A500
    uae_rtc = MSM6242B

Test A500/512K:
    > amiga_model = A500/512K
    uae_rtc = none

Test A500+:
    > amiga_model = A500+
    uae_rtc = MSM6242B

Test A600:
    > amiga_model = A600
    uae_rtc = none

Test A1000:
    > amiga_model = A1000
    uae_rtc = none

Test A1200:
    > amiga_model = A1200
    uae_rtc = none

Test A1200 + 8MB:
    > amiga_model = A1200
    > fast_memory = 8M
    uae_rtc = MSM6242B

Test A1200 + 8MB Z3:
    > amiga_model = A1200
    > zorro_iii_memory = 8M
    uae_rtc = MSM6242B

Test A3000:
    > amiga_model = A3000
    uae_rtc = RP5C01A

Test A4000:
    > amiga_model = A4000
    uae_rtc = RP5C01A

Test explicit RP5C01A:
    > amiga_model = A500+
    > uae_rtc = RP5C01A
    uae_rtc = RP5C01A

Test explicit RP5C01A with wrong case:
    > uae_rtc = rp5c01a
    uae_rtc = RP5C01A

Test explicit MSM6242B:
    > amiga_model = A1200
    > uae_rtc = MSM6242B
    uae_rtc = MSM6242B

Test explicit MSM6242B with wrong case:
    > uae_rtc = msm6242b
    uae_rtc = MSM6242B

Test invalid value:
    > uae_rtc = msm5200b
    uae_rtc = none