18ac919a0SLaurent Vivier /* 28ac919a0SLaurent Vivier * QEMU Motorola 680x0 Macintosh Video Card Emulation 38ac919a0SLaurent Vivier * Copyright (c) 2012-2018 Laurent Vivier 48ac919a0SLaurent Vivier * 58ac919a0SLaurent Vivier * some parts from QEMU G364 framebuffer Emulator. 68ac919a0SLaurent Vivier * Copyright (c) 2007-2011 Herve Poussineau 78ac919a0SLaurent Vivier * 88ac919a0SLaurent Vivier * This work is licensed under the terms of the GNU GPL, version 2 or later. 98ac919a0SLaurent Vivier * See the COPYING file in the top-level directory. 108ac919a0SLaurent Vivier * 118ac919a0SLaurent Vivier */ 128ac919a0SLaurent Vivier 138ac919a0SLaurent Vivier #ifndef MACFB_H 148ac919a0SLaurent Vivier #define MACFB_H 158ac919a0SLaurent Vivier 168ac919a0SLaurent Vivier #include "exec/memory.h" 17c7a2f7baSMark Cave-Ayland #include "hw/irq.h" 18*7a5951f6SMarkus Armbruster #include "hw/nubus/nubus.h" 19*7a5951f6SMarkus Armbruster #include "hw/sysbus.h" 208ac919a0SLaurent Vivier #include "ui/console.h" 21c7a2f7baSMark Cave-Ayland #include "qemu/timer.h" 228ac919a0SLaurent Vivier 23e6108b96SMark Cave-Ayland typedef enum { 24e6108b96SMark Cave-Ayland MACFB_DISPLAY_APPLE_21_COLOR = 0, 25e6108b96SMark Cave-Ayland MACFB_DISPLAY_APPLE_PORTRAIT = 1, 26e6108b96SMark Cave-Ayland MACFB_DISPLAY_APPLE_12_RGB = 2, 27e6108b96SMark Cave-Ayland MACFB_DISPLAY_APPLE_2PAGE_MONO = 3, 28e6108b96SMark Cave-Ayland MACFB_DISPLAY_NTSC_UNDERSCAN = 4, 29e6108b96SMark Cave-Ayland MACFB_DISPLAY_NTSC_OVERSCAN = 5, 30e6108b96SMark Cave-Ayland MACFB_DISPLAY_APPLE_12_MONO = 6, 31e6108b96SMark Cave-Ayland MACFB_DISPLAY_APPLE_13_RGB = 7, 32e6108b96SMark Cave-Ayland MACFB_DISPLAY_16_COLOR = 8, 33e6108b96SMark Cave-Ayland MACFB_DISPLAY_PAL1_UNDERSCAN = 9, 34e6108b96SMark Cave-Ayland MACFB_DISPLAY_PAL1_OVERSCAN = 10, 35e6108b96SMark Cave-Ayland MACFB_DISPLAY_PAL2_UNDERSCAN = 11, 36e6108b96SMark Cave-Ayland MACFB_DISPLAY_PAL2_OVERSCAN = 12, 37e6108b96SMark Cave-Ayland MACFB_DISPLAY_VGA = 13, 38e6108b96SMark Cave-Ayland MACFB_DISPLAY_SVGA = 14, 39e6108b96SMark Cave-Ayland } MacfbDisplayType; 40e6108b96SMark Cave-Ayland 41df8abbbaSMark Cave-Ayland typedef struct MacFbMode { 42df8abbbaSMark Cave-Ayland uint8_t type; 43df8abbbaSMark Cave-Ayland uint8_t depth; 44df8abbbaSMark Cave-Ayland uint32_t mode_ctrl1; 45df8abbbaSMark Cave-Ayland uint32_t mode_ctrl2; 46df8abbbaSMark Cave-Ayland uint32_t width; 47df8abbbaSMark Cave-Ayland uint32_t height; 48df8abbbaSMark Cave-Ayland uint32_t stride; 49df8abbbaSMark Cave-Ayland uint32_t offset; 50df8abbbaSMark Cave-Ayland } MacFbMode; 51df8abbbaSMark Cave-Ayland 52dd2a56abSMark Cave-Ayland #define MACFB_CTRL_TOPADDR 0x200 53dd2a56abSMark Cave-Ayland #define MACFB_NUM_REGS (MACFB_CTRL_TOPADDR / sizeof(uint32_t)) 54df8abbbaSMark Cave-Ayland 558ac919a0SLaurent Vivier typedef struct MacfbState { 568ac919a0SLaurent Vivier MemoryRegion mem_vram; 578ac919a0SLaurent Vivier MemoryRegion mem_ctrl; 588ac919a0SLaurent Vivier QemuConsole *con; 598ac919a0SLaurent Vivier 608ac919a0SLaurent Vivier uint8_t *vram; 618ac919a0SLaurent Vivier uint32_t vram_bit_mask; 628ac919a0SLaurent Vivier uint32_t palette_current; 638ac919a0SLaurent Vivier uint8_t color_palette[256 * 3]; 648ac919a0SLaurent Vivier uint32_t width, height; /* in pixels */ 658ac919a0SLaurent Vivier uint8_t depth; 664317c518SMark Cave-Ayland uint8_t type; 67e6108b96SMark Cave-Ayland 68df8abbbaSMark Cave-Ayland uint32_t regs[MACFB_NUM_REGS]; 69df8abbbaSMark Cave-Ayland MacFbMode *mode; 70c7a2f7baSMark Cave-Ayland 71c7a2f7baSMark Cave-Ayland QEMUTimer *vbl_timer; 72c7a2f7baSMark Cave-Ayland qemu_irq irq; 738ac919a0SLaurent Vivier } MacfbState; 748ac919a0SLaurent Vivier 758ac919a0SLaurent Vivier #define TYPE_MACFB "sysbus-macfb" 768063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MacfbSysBusState, MACFB) 778ac919a0SLaurent Vivier 78db1015e9SEduardo Habkost struct MacfbSysBusState { 798ac919a0SLaurent Vivier SysBusDevice busdev; 808ac919a0SLaurent Vivier 818ac919a0SLaurent Vivier MacfbState macfb; 82db1015e9SEduardo Habkost }; 838ac919a0SLaurent Vivier 84db1015e9SEduardo Habkost #define TYPE_NUBUS_MACFB "nubus-macfb" 85a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(MacfbNubusState, MacfbNubusDeviceClass, NUBUS_MACFB) 868ac919a0SLaurent Vivier 87db1015e9SEduardo Habkost struct MacfbNubusDeviceClass { 888ac919a0SLaurent Vivier DeviceClass parent_class; 898ac919a0SLaurent Vivier 908ac919a0SLaurent Vivier DeviceRealize parent_realize; 91c7a2f7baSMark Cave-Ayland DeviceUnrealize parent_unrealize; 92db1015e9SEduardo Habkost }; 938ac919a0SLaurent Vivier 948ac919a0SLaurent Vivier 95db1015e9SEduardo Habkost struct MacfbNubusState { 968ac919a0SLaurent Vivier NubusDevice busdev; 978ac919a0SLaurent Vivier 988ac919a0SLaurent Vivier MacfbState macfb; 99db1015e9SEduardo Habkost }; 1008ac919a0SLaurent Vivier 1018ac919a0SLaurent Vivier #endif 102