16dca62a0SLaurent Vivier /* 26dca62a0SLaurent Vivier * 36dca62a0SLaurent Vivier * Copyright (c) 2011-2018 Laurent Vivier 46dca62a0SLaurent Vivier * 56dca62a0SLaurent Vivier * This work is licensed under the terms of the GNU GPL, version 2 or later. 66dca62a0SLaurent Vivier * See the COPYING file in the top-level directory. 76dca62a0SLaurent Vivier */ 86dca62a0SLaurent Vivier 96dca62a0SLaurent Vivier #ifndef HW_MISC_MAC_VIA_H 106dca62a0SLaurent Vivier #define HW_MISC_MAC_VIA_H 116dca62a0SLaurent Vivier 12*8be545baSRichard Henderson #include "system/memory.h" 136dca62a0SLaurent Vivier #include "hw/sysbus.h" 146dca62a0SLaurent Vivier #include "hw/misc/mos6522.h" 15588c5b0bSBALATON Zoltan #include "hw/input/adb.h" 16db1015e9SEduardo Habkost #include "qom/object.h" 176dca62a0SLaurent Vivier 186dca62a0SLaurent Vivier 1902a68a3eSMark Cave-Ayland #define VIA_SIZE 0x2000 2002a68a3eSMark Cave-Ayland 216dca62a0SLaurent Vivier /* VIA 1 */ 2261a608cdSMark Cave-Ayland #define VIA1_IRQ_ONE_SECOND_BIT CA2_INT_BIT 2361a608cdSMark Cave-Ayland #define VIA1_IRQ_60HZ_BIT CA1_INT_BIT 2461a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_READY_BIT SR_INT_BIT 2561a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_DATA_BIT CB2_INT_BIT 2661a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_CLOCK_BIT CB1_INT_BIT 276dca62a0SLaurent Vivier 2861a608cdSMark Cave-Ayland #define VIA1_IRQ_ONE_SECOND BIT(VIA1_IRQ_ONE_SECOND_BIT) 2961a608cdSMark Cave-Ayland #define VIA1_IRQ_60HZ BIT(VIA1_IRQ_60HZ_BIT) 3061a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_READY BIT(VIA1_IRQ_ADB_READY_BIT) 3161a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_DATA BIT(VIA1_IRQ_ADB_DATA_BIT) 3261a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_CLOCK BIT(VIA1_IRQ_ADB_CLOCK_BIT) 336dca62a0SLaurent Vivier 346dca62a0SLaurent Vivier 356dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA1 "mos6522-q800-via1" 368063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA1State, MOS6522_Q800_VIA1) 376dca62a0SLaurent Vivier 38db1015e9SEduardo Habkost struct MOS6522Q800VIA1State { 396dca62a0SLaurent Vivier /*< private >*/ 406dca62a0SLaurent Vivier MOS6522State parent_obj; 416dca62a0SLaurent Vivier 4202a68a3eSMark Cave-Ayland MemoryRegion via_mem; 4302a68a3eSMark Cave-Ayland 44291bc180SMark Cave-Ayland qemu_irq auxmode_irq; 456dca62a0SLaurent Vivier uint8_t last_b; 468064d7bbSMark Cave-Ayland 478064d7bbSMark Cave-Ayland /* RTC */ 486dca62a0SLaurent Vivier uint8_t PRAM[256]; 498064d7bbSMark Cave-Ayland BlockBackend *blk; 508064d7bbSMark Cave-Ayland VMChangeStateEntry *vmstate; 516dca62a0SLaurent Vivier 52741258b0SMark Cave-Ayland uint32_t tick_offset; 53741258b0SMark Cave-Ayland 54741258b0SMark Cave-Ayland uint8_t data_out; 55741258b0SMark Cave-Ayland int data_out_cnt; 56741258b0SMark Cave-Ayland uint8_t data_in; 57741258b0SMark Cave-Ayland uint8_t data_in_cnt; 58741258b0SMark Cave-Ayland uint8_t cmd; 59741258b0SMark Cave-Ayland int wprotect; 60741258b0SMark Cave-Ayland int alt; 61741258b0SMark Cave-Ayland 625f083d42SMark Cave-Ayland /* ADB */ 635f083d42SMark Cave-Ayland ADBBusState adb_bus; 645f083d42SMark Cave-Ayland qemu_irq adb_data_ready; 655f083d42SMark Cave-Ayland int adb_data_in_size; 665f083d42SMark Cave-Ayland int adb_data_in_index; 675f083d42SMark Cave-Ayland int adb_data_out_index; 685f083d42SMark Cave-Ayland uint8_t adb_data_in[128]; 695f083d42SMark Cave-Ayland uint8_t adb_data_out[16]; 705f083d42SMark Cave-Ayland uint8_t adb_autopoll_cmd; 715f083d42SMark Cave-Ayland 726dca62a0SLaurent Vivier /* external timers */ 736dca62a0SLaurent Vivier QEMUTimer *one_second_timer; 746dca62a0SLaurent Vivier int64_t next_second; 754c8f4ab4SMark Cave-Ayland QEMUTimer *sixty_hz_timer; 764c8f4ab4SMark Cave-Ayland int64_t next_sixty_hz; 77366d2779SMark Cave-Ayland 78366d2779SMark Cave-Ayland /* SETUPTIMEK hack */ 79366d2779SMark Cave-Ayland int timer_hack_state; 80db1015e9SEduardo Habkost }; 816dca62a0SLaurent Vivier 826dca62a0SLaurent Vivier 836dca62a0SLaurent Vivier /* VIA 2 */ 84e787221eSMark Cave-Ayland #define VIA2_IRQ_SCSI_DATA_BIT CA2_INT_BIT 85e787221eSMark Cave-Ayland #define VIA2_IRQ_NUBUS_BIT CA1_INT_BIT 86e787221eSMark Cave-Ayland #define VIA2_IRQ_SCSI_BIT CB2_INT_BIT 87e787221eSMark Cave-Ayland #define VIA2_IRQ_ASC_BIT CB1_INT_BIT 886dca62a0SLaurent Vivier 89e787221eSMark Cave-Ayland #define VIA2_IRQ_SCSI_DATA BIT(VIA2_IRQ_SCSI_DATA_BIT) 90e787221eSMark Cave-Ayland #define VIA2_IRQ_NUBUS BIT(VIA2_IRQ_NUBUS_BIT) 91e787221eSMark Cave-Ayland #define VIA2_IRQ_UNUSED BIT(VIA2_IRQ_SCSI_BIT) 92e787221eSMark Cave-Ayland #define VIA2_IRQ_SCSI BIT(VIA2_IRQ_UNUSED_BIT) 93e787221eSMark Cave-Ayland #define VIA2_IRQ_ASC BIT(VIA2_IRQ_ASC_BIT) 946dca62a0SLaurent Vivier 95dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_NB 7 96dde602aeSMark Cave-Ayland 97dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_9 0 98dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_A 1 99dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_B 2 100dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_C 3 101dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_D 4 102dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_E 5 103dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_INTVIDEO 6 104dde602aeSMark Cave-Ayland 1056dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA2 "mos6522-q800-via2" 1068063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA2State, MOS6522_Q800_VIA2) 1076dca62a0SLaurent Vivier 108db1015e9SEduardo Habkost struct MOS6522Q800VIA2State { 1096dca62a0SLaurent Vivier /*< private >*/ 1106dca62a0SLaurent Vivier MOS6522State parent_obj; 1116dca62a0SLaurent Vivier 11202a68a3eSMark Cave-Ayland MemoryRegion via_mem; 113db1015e9SEduardo Habkost }; 1146dca62a0SLaurent Vivier 1156dca62a0SLaurent Vivier #endif 116