Le 24/05/2023 à 23:10, Mark Cave-Ayland a écrit :
> Analysis of the MacOS toolbox ROM code shows that on startup it attempts 2
> separate reads of the seconds registers with commands 0x9d...0x91 followed by
> 0x8d..0x81 without resetting the command to its initial value. The PRAM seconds
> value is only accepted when the values of the 2 separate reads match.
>
> From this we conclude that bit 4 of the rtc command is not decoded or we don't
> care about its value when reading the PRAM seconds registers. Implement this
> decoding change so that both reads return successfully which allows the MacOS
> toolbox ROM to correctly set the date/time.
>
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
> hw/misc/mac_via.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
> index d7067030db..5d5334b0f6 100644
> --- a/hw/misc/mac_via.c
> +++ b/hw/misc/mac_via.c
> @@ -366,10 +366,10 @@ static void pram_update(MOS6522Q800VIA1State *v1s)
> *
> * Command byte Register addressed by the command
> *
> - * z0000001 Seconds register 0 (lowest-order byte)
> - * z0000101 Seconds register 1
> - * z0001001 Seconds register 2
> - * z0001101 Seconds register 3 (highest-order byte)
> + * z00x0001 Seconds register 0 (lowest-order byte)
> + * z00x0101 Seconds register 1
> + * z00x1001 Seconds register 2
> + * z00x1101 Seconds register 3 (highest-order byte)
> * 00110001 Test register (write-only)
> * 00110101 Write-Protect Register (write-only)
> * z010aa01 RAM address 100aa ($10-$13) (first 20 bytes only)
> @@ -377,6 +377,7 @@ static void pram_update(MOS6522Q800VIA1State *v1s)
> * z0111aaa Extended memory designator and sector number
> *
> * For a read request, z=1, for a write z=0
> + * The letter x indicates don't care
> * The letter a indicates bits whose value depend on what parameter
> * RAM byte you want to address
> */
> @@ -393,7 +394,7 @@ static int via1_rtc_compact_cmd(uint8_t value)
> }
> if ((value & 0x03) == 0x01) {
> value >>= 2;
> - if ((value & 0x1c) == 0) {
> + if ((value & 0x18) == 0) {
> /* seconds registers */
> return read | (REG_0 + (value & 0x03));
> } else if ((value == 0x0c) && !read) {
Reviewed-by: Laurent Vivier <laurent@vivier.eu>