1*6dca62a0SLaurent Vivier /* 2*6dca62a0SLaurent Vivier * 3*6dca62a0SLaurent Vivier * Copyright (c) 2011-2018 Laurent Vivier 4*6dca62a0SLaurent Vivier * 5*6dca62a0SLaurent Vivier * This work is licensed under the terms of the GNU GPL, version 2 or later. 6*6dca62a0SLaurent Vivier * See the COPYING file in the top-level directory. 7*6dca62a0SLaurent Vivier */ 8*6dca62a0SLaurent Vivier 9*6dca62a0SLaurent Vivier #ifndef HW_MISC_MAC_VIA_H 10*6dca62a0SLaurent Vivier #define HW_MISC_MAC_VIA_H 11*6dca62a0SLaurent Vivier 12*6dca62a0SLaurent Vivier #include "exec/memory.h" 13*6dca62a0SLaurent Vivier #include "hw/sysbus.h" 14*6dca62a0SLaurent Vivier #include "hw/misc/mos6522.h" 15*6dca62a0SLaurent Vivier 16*6dca62a0SLaurent Vivier 17*6dca62a0SLaurent Vivier /* VIA 1 */ 18*6dca62a0SLaurent Vivier #define VIA1_IRQ_ONE_SECOND_BIT 0 19*6dca62a0SLaurent Vivier #define VIA1_IRQ_VBLANK_BIT 1 20*6dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_READY_BIT 2 21*6dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_DATA_BIT 3 22*6dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_CLOCK_BIT 4 23*6dca62a0SLaurent Vivier 24*6dca62a0SLaurent Vivier #define VIA1_IRQ_NB 8 25*6dca62a0SLaurent Vivier 26*6dca62a0SLaurent Vivier #define VIA1_IRQ_ONE_SECOND (1 << VIA1_IRQ_ONE_SECOND_BIT) 27*6dca62a0SLaurent Vivier #define VIA1_IRQ_VBLANK (1 << VIA1_IRQ_VBLANK_BIT) 28*6dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_READY (1 << VIA1_IRQ_ADB_READY_BIT) 29*6dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_DATA (1 << VIA1_IRQ_ADB_DATA_BIT) 30*6dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_CLOCK (1 << VIA1_IRQ_ADB_CLOCK_BIT) 31*6dca62a0SLaurent Vivier 32*6dca62a0SLaurent Vivier 33*6dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA1 "mos6522-q800-via1" 34*6dca62a0SLaurent Vivier #define MOS6522_Q800_VIA1(obj) OBJECT_CHECK(MOS6522Q800VIA1State, (obj), \ 35*6dca62a0SLaurent Vivier TYPE_MOS6522_Q800_VIA1) 36*6dca62a0SLaurent Vivier 37*6dca62a0SLaurent Vivier typedef struct MOS6522Q800VIA1State { 38*6dca62a0SLaurent Vivier /*< private >*/ 39*6dca62a0SLaurent Vivier MOS6522State parent_obj; 40*6dca62a0SLaurent Vivier 41*6dca62a0SLaurent Vivier qemu_irq irqs[VIA1_IRQ_NB]; 42*6dca62a0SLaurent Vivier uint8_t last_b; 43*6dca62a0SLaurent Vivier uint8_t PRAM[256]; 44*6dca62a0SLaurent Vivier 45*6dca62a0SLaurent Vivier /* external timers */ 46*6dca62a0SLaurent Vivier QEMUTimer *one_second_timer; 47*6dca62a0SLaurent Vivier int64_t next_second; 48*6dca62a0SLaurent Vivier QEMUTimer *VBL_timer; 49*6dca62a0SLaurent Vivier int64_t next_VBL; 50*6dca62a0SLaurent Vivier } MOS6522Q800VIA1State; 51*6dca62a0SLaurent Vivier 52*6dca62a0SLaurent Vivier 53*6dca62a0SLaurent Vivier /* VIA 2 */ 54*6dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA_BIT 0 55*6dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT_BIT 1 56*6dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED_BIT 2 57*6dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_BIT 3 58*6dca62a0SLaurent Vivier #define VIA2_IRQ_ASC_BIT 4 59*6dca62a0SLaurent Vivier 60*6dca62a0SLaurent Vivier #define VIA2_IRQ_NB 8 61*6dca62a0SLaurent Vivier 62*6dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA (1 << VIA2_IRQ_SCSI_DATA_BIT) 63*6dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT (1 << VIA2_IRQ_SLOT_BIT) 64*6dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED (1 << VIA2_IRQ_SCSI_BIT) 65*6dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI (1 << VIA2_IRQ_UNUSED_BIT) 66*6dca62a0SLaurent Vivier #define VIA2_IRQ_ASC (1 << VIA2_IRQ_ASC_BIT) 67*6dca62a0SLaurent Vivier 68*6dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA2 "mos6522-q800-via2" 69*6dca62a0SLaurent Vivier #define MOS6522_Q800_VIA2(obj) OBJECT_CHECK(MOS6522Q800VIA2State, (obj), \ 70*6dca62a0SLaurent Vivier TYPE_MOS6522_Q800_VIA2) 71*6dca62a0SLaurent Vivier 72*6dca62a0SLaurent Vivier typedef struct MOS6522Q800VIA2State { 73*6dca62a0SLaurent Vivier /*< private >*/ 74*6dca62a0SLaurent Vivier MOS6522State parent_obj; 75*6dca62a0SLaurent Vivier } MOS6522Q800VIA2State; 76*6dca62a0SLaurent Vivier 77*6dca62a0SLaurent Vivier 78*6dca62a0SLaurent Vivier #define TYPE_MAC_VIA "mac_via" 79*6dca62a0SLaurent Vivier #define MAC_VIA(obj) OBJECT_CHECK(MacVIAState, (obj), TYPE_MAC_VIA) 80*6dca62a0SLaurent Vivier 81*6dca62a0SLaurent Vivier typedef struct MacVIAState { 82*6dca62a0SLaurent Vivier SysBusDevice busdev; 83*6dca62a0SLaurent Vivier 84*6dca62a0SLaurent Vivier /* MMIO */ 85*6dca62a0SLaurent Vivier MemoryRegion mmio; 86*6dca62a0SLaurent Vivier MemoryRegion via1mem; 87*6dca62a0SLaurent Vivier MemoryRegion via2mem; 88*6dca62a0SLaurent Vivier 89*6dca62a0SLaurent Vivier /* VIAs */ 90*6dca62a0SLaurent Vivier MOS6522Q800VIA1State mos6522_via1; 91*6dca62a0SLaurent Vivier MOS6522Q800VIA2State mos6522_via2; 92*6dca62a0SLaurent Vivier 93*6dca62a0SLaurent Vivier /* RTC */ 94*6dca62a0SLaurent Vivier uint32_t tick_offset; 95*6dca62a0SLaurent Vivier 96*6dca62a0SLaurent Vivier uint8_t data_out; 97*6dca62a0SLaurent Vivier int data_out_cnt; 98*6dca62a0SLaurent Vivier uint8_t data_in; 99*6dca62a0SLaurent Vivier uint8_t data_in_cnt; 100*6dca62a0SLaurent Vivier uint8_t cmd; 101*6dca62a0SLaurent Vivier int wprotect; 102*6dca62a0SLaurent Vivier int alt; 103*6dca62a0SLaurent Vivier 104*6dca62a0SLaurent Vivier /* ADB */ 105*6dca62a0SLaurent Vivier ADBBusState adb_bus; 106*6dca62a0SLaurent Vivier } MacVIAState; 107*6dca62a0SLaurent Vivier 108*6dca62a0SLaurent Vivier #endif 109