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 126dca62a0SLaurent Vivier #include "exec/memory.h" 136dca62a0SLaurent Vivier #include "hw/sysbus.h" 146dca62a0SLaurent Vivier #include "hw/misc/mos6522.h" 15db1015e9SEduardo Habkost #include "qom/object.h" 166dca62a0SLaurent Vivier 176dca62a0SLaurent Vivier 18*02a68a3eSMark Cave-Ayland #define VIA_SIZE 0x2000 19*02a68a3eSMark Cave-Ayland 206dca62a0SLaurent Vivier /* VIA 1 */ 216dca62a0SLaurent Vivier #define VIA1_IRQ_ONE_SECOND_BIT 0 224c8f4ab4SMark Cave-Ayland #define VIA1_IRQ_60HZ_BIT 1 236dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_READY_BIT 2 246dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_DATA_BIT 3 256dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_CLOCK_BIT 4 266dca62a0SLaurent Vivier 276dca62a0SLaurent Vivier #define VIA1_IRQ_NB 8 286dca62a0SLaurent Vivier 296dca62a0SLaurent Vivier #define VIA1_IRQ_ONE_SECOND (1 << VIA1_IRQ_ONE_SECOND_BIT) 304c8f4ab4SMark Cave-Ayland #define VIA1_IRQ_60HZ (1 << VIA1_IRQ_60HZ_BIT) 316dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_READY (1 << VIA1_IRQ_ADB_READY_BIT) 326dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_DATA (1 << VIA1_IRQ_ADB_DATA_BIT) 336dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_CLOCK (1 << VIA1_IRQ_ADB_CLOCK_BIT) 346dca62a0SLaurent Vivier 356dca62a0SLaurent Vivier 366dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA1 "mos6522-q800-via1" 378063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA1State, MOS6522_Q800_VIA1) 386dca62a0SLaurent Vivier 39db1015e9SEduardo Habkost struct MOS6522Q800VIA1State { 406dca62a0SLaurent Vivier /*< private >*/ 416dca62a0SLaurent Vivier MOS6522State parent_obj; 426dca62a0SLaurent Vivier 43*02a68a3eSMark Cave-Ayland MemoryRegion via_mem; 44*02a68a3eSMark Cave-Ayland 456dca62a0SLaurent Vivier qemu_irq irqs[VIA1_IRQ_NB]; 466dca62a0SLaurent Vivier uint8_t last_b; 478064d7bbSMark Cave-Ayland 488064d7bbSMark Cave-Ayland /* RTC */ 496dca62a0SLaurent Vivier uint8_t PRAM[256]; 508064d7bbSMark Cave-Ayland BlockBackend *blk; 518064d7bbSMark Cave-Ayland VMChangeStateEntry *vmstate; 526dca62a0SLaurent Vivier 53741258b0SMark Cave-Ayland uint32_t tick_offset; 54741258b0SMark Cave-Ayland 55741258b0SMark Cave-Ayland uint8_t data_out; 56741258b0SMark Cave-Ayland int data_out_cnt; 57741258b0SMark Cave-Ayland uint8_t data_in; 58741258b0SMark Cave-Ayland uint8_t data_in_cnt; 59741258b0SMark Cave-Ayland uint8_t cmd; 60741258b0SMark Cave-Ayland int wprotect; 61741258b0SMark Cave-Ayland int alt; 62741258b0SMark Cave-Ayland 635f083d42SMark Cave-Ayland /* ADB */ 645f083d42SMark Cave-Ayland ADBBusState adb_bus; 655f083d42SMark Cave-Ayland qemu_irq adb_data_ready; 665f083d42SMark Cave-Ayland int adb_data_in_size; 675f083d42SMark Cave-Ayland int adb_data_in_index; 685f083d42SMark Cave-Ayland int adb_data_out_index; 695f083d42SMark Cave-Ayland uint8_t adb_data_in[128]; 705f083d42SMark Cave-Ayland uint8_t adb_data_out[16]; 715f083d42SMark Cave-Ayland uint8_t adb_autopoll_cmd; 725f083d42SMark Cave-Ayland 736dca62a0SLaurent Vivier /* external timers */ 746dca62a0SLaurent Vivier QEMUTimer *one_second_timer; 756dca62a0SLaurent Vivier int64_t next_second; 764c8f4ab4SMark Cave-Ayland QEMUTimer *sixty_hz_timer; 774c8f4ab4SMark Cave-Ayland int64_t next_sixty_hz; 78db1015e9SEduardo Habkost }; 796dca62a0SLaurent Vivier 806dca62a0SLaurent Vivier 816dca62a0SLaurent Vivier /* VIA 2 */ 826dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA_BIT 0 836dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT_BIT 1 846dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED_BIT 2 856dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_BIT 3 866dca62a0SLaurent Vivier #define VIA2_IRQ_ASC_BIT 4 876dca62a0SLaurent Vivier 886dca62a0SLaurent Vivier #define VIA2_IRQ_NB 8 896dca62a0SLaurent Vivier 906dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA (1 << VIA2_IRQ_SCSI_DATA_BIT) 916dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT (1 << VIA2_IRQ_SLOT_BIT) 926dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED (1 << VIA2_IRQ_SCSI_BIT) 936dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI (1 << VIA2_IRQ_UNUSED_BIT) 946dca62a0SLaurent Vivier #define VIA2_IRQ_ASC (1 << VIA2_IRQ_ASC_BIT) 956dca62a0SLaurent Vivier 966dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA2 "mos6522-q800-via2" 978063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA2State, MOS6522_Q800_VIA2) 986dca62a0SLaurent Vivier 99db1015e9SEduardo Habkost struct MOS6522Q800VIA2State { 1006dca62a0SLaurent Vivier /*< private >*/ 1016dca62a0SLaurent Vivier MOS6522State parent_obj; 1026dca62a0SLaurent Vivier 103*02a68a3eSMark Cave-Ayland MemoryRegion via_mem; 104db1015e9SEduardo Habkost }; 1056dca62a0SLaurent Vivier 1066dca62a0SLaurent Vivier #endif 107