xref: /qemu/include/hw/display/macfb.h (revision 7a5951f6)
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"
187a5951f6SMarkus Armbruster #include "hw/nubus/nubus.h"
197a5951f6SMarkus 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