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 1802a68a3eSMark Cave-Ayland #define VIA_SIZE 0x2000 1902a68a3eSMark Cave-Ayland 206dca62a0SLaurent Vivier /* VIA 1 */ 21*61a608cdSMark Cave-Ayland #define VIA1_IRQ_ONE_SECOND_BIT CA2_INT_BIT 22*61a608cdSMark Cave-Ayland #define VIA1_IRQ_60HZ_BIT CA1_INT_BIT 23*61a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_READY_BIT SR_INT_BIT 24*61a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_DATA_BIT CB2_INT_BIT 25*61a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_CLOCK_BIT CB1_INT_BIT 266dca62a0SLaurent Vivier 276dca62a0SLaurent Vivier #define VIA1_IRQ_NB 8 286dca62a0SLaurent Vivier 29*61a608cdSMark Cave-Ayland #define VIA1_IRQ_ONE_SECOND BIT(VIA1_IRQ_ONE_SECOND_BIT) 30*61a608cdSMark Cave-Ayland #define VIA1_IRQ_60HZ BIT(VIA1_IRQ_60HZ_BIT) 31*61a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_READY BIT(VIA1_IRQ_ADB_READY_BIT) 32*61a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_DATA BIT(VIA1_IRQ_ADB_DATA_BIT) 33*61a608cdSMark Cave-Ayland #define VIA1_IRQ_ADB_CLOCK BIT(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 4302a68a3eSMark Cave-Ayland MemoryRegion via_mem; 4402a68a3eSMark Cave-Ayland 456dca62a0SLaurent Vivier qemu_irq irqs[VIA1_IRQ_NB]; 46291bc180SMark Cave-Ayland qemu_irq auxmode_irq; 476dca62a0SLaurent Vivier uint8_t last_b; 488064d7bbSMark Cave-Ayland 498064d7bbSMark Cave-Ayland /* RTC */ 506dca62a0SLaurent Vivier uint8_t PRAM[256]; 518064d7bbSMark Cave-Ayland BlockBackend *blk; 528064d7bbSMark Cave-Ayland VMChangeStateEntry *vmstate; 536dca62a0SLaurent Vivier 54741258b0SMark Cave-Ayland uint32_t tick_offset; 55741258b0SMark Cave-Ayland 56741258b0SMark Cave-Ayland uint8_t data_out; 57741258b0SMark Cave-Ayland int data_out_cnt; 58741258b0SMark Cave-Ayland uint8_t data_in; 59741258b0SMark Cave-Ayland uint8_t data_in_cnt; 60741258b0SMark Cave-Ayland uint8_t cmd; 61741258b0SMark Cave-Ayland int wprotect; 62741258b0SMark Cave-Ayland int alt; 63741258b0SMark Cave-Ayland 645f083d42SMark Cave-Ayland /* ADB */ 655f083d42SMark Cave-Ayland ADBBusState adb_bus; 665f083d42SMark Cave-Ayland qemu_irq adb_data_ready; 675f083d42SMark Cave-Ayland int adb_data_in_size; 685f083d42SMark Cave-Ayland int adb_data_in_index; 695f083d42SMark Cave-Ayland int adb_data_out_index; 705f083d42SMark Cave-Ayland uint8_t adb_data_in[128]; 715f083d42SMark Cave-Ayland uint8_t adb_data_out[16]; 725f083d42SMark Cave-Ayland uint8_t adb_autopoll_cmd; 735f083d42SMark Cave-Ayland 746dca62a0SLaurent Vivier /* external timers */ 756dca62a0SLaurent Vivier QEMUTimer *one_second_timer; 766dca62a0SLaurent Vivier int64_t next_second; 774c8f4ab4SMark Cave-Ayland QEMUTimer *sixty_hz_timer; 784c8f4ab4SMark Cave-Ayland int64_t next_sixty_hz; 79db1015e9SEduardo Habkost }; 806dca62a0SLaurent Vivier 816dca62a0SLaurent Vivier 826dca62a0SLaurent Vivier /* VIA 2 */ 836dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA_BIT 0 84812f0699SMark Cave-Ayland #define VIA2_IRQ_NUBUS_BIT 1 856dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED_BIT 2 866dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_BIT 3 876dca62a0SLaurent Vivier #define VIA2_IRQ_ASC_BIT 4 886dca62a0SLaurent Vivier 896dca62a0SLaurent Vivier #define VIA2_IRQ_NB 8 906dca62a0SLaurent Vivier 916dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA (1 << VIA2_IRQ_SCSI_DATA_BIT) 92812f0699SMark Cave-Ayland #define VIA2_IRQ_NUBUS (1 << VIA2_IRQ_NUBUS_BIT) 936dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED (1 << VIA2_IRQ_SCSI_BIT) 946dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI (1 << VIA2_IRQ_UNUSED_BIT) 956dca62a0SLaurent Vivier #define VIA2_IRQ_ASC (1 << VIA2_IRQ_ASC_BIT) 966dca62a0SLaurent Vivier 97dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_NB 7 98dde602aeSMark Cave-Ayland 99dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_9 0 100dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_A 1 101dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_B 2 102dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_C 3 103dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_D 4 104dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_E 5 105dde602aeSMark Cave-Ayland #define VIA2_NUBUS_IRQ_INTVIDEO 6 106dde602aeSMark Cave-Ayland 1076dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA2 "mos6522-q800-via2" 1088063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA2State, MOS6522_Q800_VIA2) 1096dca62a0SLaurent Vivier 110db1015e9SEduardo Habkost struct MOS6522Q800VIA2State { 1116dca62a0SLaurent Vivier /*< private >*/ 1126dca62a0SLaurent Vivier MOS6522State parent_obj; 1136dca62a0SLaurent Vivier 11402a68a3eSMark Cave-Ayland MemoryRegion via_mem; 115db1015e9SEduardo Habkost }; 1166dca62a0SLaurent Vivier 1176dca62a0SLaurent Vivier #endif 118