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" 156dca62a0SLaurent Vivier 166dca62a0SLaurent Vivier 176dca62a0SLaurent Vivier /* VIA 1 */ 186dca62a0SLaurent Vivier #define VIA1_IRQ_ONE_SECOND_BIT 0 196dca62a0SLaurent Vivier #define VIA1_IRQ_VBLANK_BIT 1 206dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_READY_BIT 2 216dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_DATA_BIT 3 226dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_CLOCK_BIT 4 236dca62a0SLaurent Vivier 246dca62a0SLaurent Vivier #define VIA1_IRQ_NB 8 256dca62a0SLaurent Vivier 266dca62a0SLaurent Vivier #define VIA1_IRQ_ONE_SECOND (1 << VIA1_IRQ_ONE_SECOND_BIT) 276dca62a0SLaurent Vivier #define VIA1_IRQ_VBLANK (1 << VIA1_IRQ_VBLANK_BIT) 286dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_READY (1 << VIA1_IRQ_ADB_READY_BIT) 296dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_DATA (1 << VIA1_IRQ_ADB_DATA_BIT) 306dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_CLOCK (1 << VIA1_IRQ_ADB_CLOCK_BIT) 316dca62a0SLaurent Vivier 326dca62a0SLaurent Vivier 336dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA1 "mos6522-q800-via1" 346dca62a0SLaurent Vivier #define MOS6522_Q800_VIA1(obj) OBJECT_CHECK(MOS6522Q800VIA1State, (obj), \ 356dca62a0SLaurent Vivier TYPE_MOS6522_Q800_VIA1) 366dca62a0SLaurent Vivier 376dca62a0SLaurent Vivier typedef struct MOS6522Q800VIA1State { 386dca62a0SLaurent Vivier /*< private >*/ 396dca62a0SLaurent Vivier MOS6522State parent_obj; 406dca62a0SLaurent Vivier 416dca62a0SLaurent Vivier qemu_irq irqs[VIA1_IRQ_NB]; 426dca62a0SLaurent Vivier uint8_t last_b; 436dca62a0SLaurent Vivier uint8_t PRAM[256]; 446dca62a0SLaurent Vivier 456dca62a0SLaurent Vivier /* external timers */ 466dca62a0SLaurent Vivier QEMUTimer *one_second_timer; 476dca62a0SLaurent Vivier int64_t next_second; 486dca62a0SLaurent Vivier QEMUTimer *VBL_timer; 496dca62a0SLaurent Vivier int64_t next_VBL; 506dca62a0SLaurent Vivier } MOS6522Q800VIA1State; 516dca62a0SLaurent Vivier 526dca62a0SLaurent Vivier 536dca62a0SLaurent Vivier /* VIA 2 */ 546dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA_BIT 0 556dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT_BIT 1 566dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED_BIT 2 576dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_BIT 3 586dca62a0SLaurent Vivier #define VIA2_IRQ_ASC_BIT 4 596dca62a0SLaurent Vivier 606dca62a0SLaurent Vivier #define VIA2_IRQ_NB 8 616dca62a0SLaurent Vivier 626dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA (1 << VIA2_IRQ_SCSI_DATA_BIT) 636dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT (1 << VIA2_IRQ_SLOT_BIT) 646dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED (1 << VIA2_IRQ_SCSI_BIT) 656dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI (1 << VIA2_IRQ_UNUSED_BIT) 666dca62a0SLaurent Vivier #define VIA2_IRQ_ASC (1 << VIA2_IRQ_ASC_BIT) 676dca62a0SLaurent Vivier 686dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA2 "mos6522-q800-via2" 696dca62a0SLaurent Vivier #define MOS6522_Q800_VIA2(obj) OBJECT_CHECK(MOS6522Q800VIA2State, (obj), \ 706dca62a0SLaurent Vivier TYPE_MOS6522_Q800_VIA2) 716dca62a0SLaurent Vivier 726dca62a0SLaurent Vivier typedef struct MOS6522Q800VIA2State { 736dca62a0SLaurent Vivier /*< private >*/ 746dca62a0SLaurent Vivier MOS6522State parent_obj; 756dca62a0SLaurent Vivier } MOS6522Q800VIA2State; 766dca62a0SLaurent Vivier 776dca62a0SLaurent Vivier 786dca62a0SLaurent Vivier #define TYPE_MAC_VIA "mac_via" 796dca62a0SLaurent Vivier #define MAC_VIA(obj) OBJECT_CHECK(MacVIAState, (obj), TYPE_MAC_VIA) 806dca62a0SLaurent Vivier 816dca62a0SLaurent Vivier typedef struct MacVIAState { 826dca62a0SLaurent Vivier SysBusDevice busdev; 836dca62a0SLaurent Vivier 846dca62a0SLaurent Vivier /* MMIO */ 856dca62a0SLaurent Vivier MemoryRegion mmio; 866dca62a0SLaurent Vivier MemoryRegion via1mem; 876dca62a0SLaurent Vivier MemoryRegion via2mem; 886dca62a0SLaurent Vivier 896dca62a0SLaurent Vivier /* VIAs */ 906dca62a0SLaurent Vivier MOS6522Q800VIA1State mos6522_via1; 916dca62a0SLaurent Vivier MOS6522Q800VIA2State mos6522_via2; 926dca62a0SLaurent Vivier 936dca62a0SLaurent Vivier /* RTC */ 946dca62a0SLaurent Vivier uint32_t tick_offset; 956dca62a0SLaurent Vivier 966dca62a0SLaurent Vivier uint8_t data_out; 976dca62a0SLaurent Vivier int data_out_cnt; 986dca62a0SLaurent Vivier uint8_t data_in; 996dca62a0SLaurent Vivier uint8_t data_in_cnt; 1006dca62a0SLaurent Vivier uint8_t cmd; 1016dca62a0SLaurent Vivier int wprotect; 1026dca62a0SLaurent Vivier int alt; 1036dca62a0SLaurent Vivier 1046dca62a0SLaurent Vivier /* ADB */ 1056dca62a0SLaurent Vivier ADBBusState adb_bus; 106*87a34e2aSLaurent Vivier QEMUTimer *adb_poll_timer; 107*87a34e2aSLaurent Vivier qemu_irq adb_data_ready; 108*87a34e2aSLaurent Vivier int adb_data_in_size; 109*87a34e2aSLaurent Vivier int adb_data_in_index; 110*87a34e2aSLaurent Vivier int adb_data_out_index; 111*87a34e2aSLaurent Vivier uint8_t adb_data_in[128]; 112*87a34e2aSLaurent Vivier uint8_t adb_data_out[16]; 1136dca62a0SLaurent Vivier } MacVIAState; 1146dca62a0SLaurent Vivier 1156dca62a0SLaurent Vivier #endif 116