 366d27796c
			
		
	
	
		366d27796c
		
	
	
	
	
		
			
			The MacOS toolbox ROM calculates the number of branches that can be executed per millisecond as part of its timer calibration. Since modern hosts are considerably quicker than original hardware, the negative counter reaches zero before the calibration completes leading to division by zero later in CALCULATESLOD. Instead of trying to fudge the timing loop (which won't work for TimeDBRA/TimeSCCDB anyhow), use the pattern of access to the VIA1 registers to detect when SETUPTIMEK has finished executing and write some well-known good timer values to TimeDBRA and TimeSCCDB taken from real hardware with a suitable scaling factor. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-ID: <20231004083806.757242-15-mark.cave-ayland@ilande.co.uk> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
		
			
				
	
	
		
			116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *
 | |
|  * Copyright (c) 2011-2018 Laurent Vivier
 | |
|  *
 | |
|  * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | |
|  * See the COPYING file in the top-level directory.
 | |
|  */
 | |
| 
 | |
| #ifndef HW_MISC_MAC_VIA_H
 | |
| #define HW_MISC_MAC_VIA_H
 | |
| 
 | |
| #include "exec/memory.h"
 | |
| #include "hw/sysbus.h"
 | |
| #include "hw/misc/mos6522.h"
 | |
| #include "hw/input/adb.h"
 | |
| #include "qom/object.h"
 | |
| 
 | |
| 
 | |
| #define VIA_SIZE   0x2000
 | |
| 
 | |
| /* VIA 1 */
 | |
| #define VIA1_IRQ_ONE_SECOND_BIT CA2_INT_BIT
 | |
| #define VIA1_IRQ_60HZ_BIT       CA1_INT_BIT
 | |
| #define VIA1_IRQ_ADB_READY_BIT  SR_INT_BIT
 | |
| #define VIA1_IRQ_ADB_DATA_BIT   CB2_INT_BIT
 | |
| #define VIA1_IRQ_ADB_CLOCK_BIT  CB1_INT_BIT
 | |
| 
 | |
| #define VIA1_IRQ_ONE_SECOND     BIT(VIA1_IRQ_ONE_SECOND_BIT)
 | |
| #define VIA1_IRQ_60HZ           BIT(VIA1_IRQ_60HZ_BIT)
 | |
| #define VIA1_IRQ_ADB_READY      BIT(VIA1_IRQ_ADB_READY_BIT)
 | |
| #define VIA1_IRQ_ADB_DATA       BIT(VIA1_IRQ_ADB_DATA_BIT)
 | |
| #define VIA1_IRQ_ADB_CLOCK      BIT(VIA1_IRQ_ADB_CLOCK_BIT)
 | |
| 
 | |
| 
 | |
| #define TYPE_MOS6522_Q800_VIA1 "mos6522-q800-via1"
 | |
| OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA1State, MOS6522_Q800_VIA1)
 | |
| 
 | |
| struct MOS6522Q800VIA1State {
 | |
|     /*< private >*/
 | |
|     MOS6522State parent_obj;
 | |
| 
 | |
|     MemoryRegion via_mem;
 | |
| 
 | |
|     qemu_irq auxmode_irq;
 | |
|     uint8_t last_b;
 | |
| 
 | |
|     /* RTC */
 | |
|     uint8_t PRAM[256];
 | |
|     BlockBackend *blk;
 | |
|     VMChangeStateEntry *vmstate;
 | |
| 
 | |
|     uint32_t tick_offset;
 | |
| 
 | |
|     uint8_t data_out;
 | |
|     int data_out_cnt;
 | |
|     uint8_t data_in;
 | |
|     uint8_t data_in_cnt;
 | |
|     uint8_t cmd;
 | |
|     int wprotect;
 | |
|     int alt;
 | |
| 
 | |
|     /* ADB */
 | |
|     ADBBusState adb_bus;
 | |
|     qemu_irq adb_data_ready;
 | |
|     int adb_data_in_size;
 | |
|     int adb_data_in_index;
 | |
|     int adb_data_out_index;
 | |
|     uint8_t adb_data_in[128];
 | |
|     uint8_t adb_data_out[16];
 | |
|     uint8_t adb_autopoll_cmd;
 | |
| 
 | |
|     /* external timers */
 | |
|     QEMUTimer *one_second_timer;
 | |
|     int64_t next_second;
 | |
|     QEMUTimer *sixty_hz_timer;
 | |
|     int64_t next_sixty_hz;
 | |
| 
 | |
|     /* SETUPTIMEK hack */
 | |
|     int timer_hack_state;
 | |
| };
 | |
| 
 | |
| 
 | |
| /* VIA 2 */
 | |
| #define VIA2_IRQ_SCSI_DATA_BIT  CA2_INT_BIT
 | |
| #define VIA2_IRQ_NUBUS_BIT      CA1_INT_BIT
 | |
| #define VIA2_IRQ_SCSI_BIT       CB2_INT_BIT
 | |
| #define VIA2_IRQ_ASC_BIT        CB1_INT_BIT
 | |
| 
 | |
| #define VIA2_IRQ_SCSI_DATA      BIT(VIA2_IRQ_SCSI_DATA_BIT)
 | |
| #define VIA2_IRQ_NUBUS          BIT(VIA2_IRQ_NUBUS_BIT)
 | |
| #define VIA2_IRQ_UNUSED         BIT(VIA2_IRQ_SCSI_BIT)
 | |
| #define VIA2_IRQ_SCSI           BIT(VIA2_IRQ_UNUSED_BIT)
 | |
| #define VIA2_IRQ_ASC            BIT(VIA2_IRQ_ASC_BIT)
 | |
| 
 | |
| #define VIA2_NUBUS_IRQ_NB       7
 | |
| 
 | |
| #define VIA2_NUBUS_IRQ_9        0
 | |
| #define VIA2_NUBUS_IRQ_A        1
 | |
| #define VIA2_NUBUS_IRQ_B        2
 | |
| #define VIA2_NUBUS_IRQ_C        3
 | |
| #define VIA2_NUBUS_IRQ_D        4
 | |
| #define VIA2_NUBUS_IRQ_E        5
 | |
| #define VIA2_NUBUS_IRQ_INTVIDEO 6
 | |
| 
 | |
| #define TYPE_MOS6522_Q800_VIA2 "mos6522-q800-via2"
 | |
| OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA2State, MOS6522_Q800_VIA2)
 | |
| 
 | |
| struct MOS6522Q800VIA2State {
 | |
|     /*< private >*/
 | |
|     MOS6522State parent_obj;
 | |
| 
 | |
|     MemoryRegion via_mem;
 | |
| };
 | |
| 
 | |
| #endif
 |