/*
 * QEMU Motorola 680x0 Macintosh Video Card Emulation
 *                 Copyright (c) 2012-2018 Laurent Vivier
 *
 * some parts from QEMU G364 framebuffer Emulator.
 *                 Copyright (c) 2007-2011 Herve Poussineau
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 *
 */

#ifndef MACFB_H
#define MACFB_H

#include "exec/memory.h"
#include "hw/irq.h"
#include "hw/nubus/nubus.h"
#include "hw/sysbus.h"
#include "ui/console.h"
#include "qemu/timer.h"

typedef enum  {
    MACFB_DISPLAY_APPLE_21_COLOR = 0,
    MACFB_DISPLAY_APPLE_PORTRAIT = 1,
    MACFB_DISPLAY_APPLE_12_RGB = 2,
    MACFB_DISPLAY_APPLE_2PAGE_MONO = 3,
    MACFB_DISPLAY_NTSC_UNDERSCAN = 4,
    MACFB_DISPLAY_NTSC_OVERSCAN = 5,
    MACFB_DISPLAY_APPLE_12_MONO = 6,
    MACFB_DISPLAY_APPLE_13_RGB = 7,
    MACFB_DISPLAY_16_COLOR = 8,
    MACFB_DISPLAY_PAL1_UNDERSCAN = 9,
    MACFB_DISPLAY_PAL1_OVERSCAN = 10,
    MACFB_DISPLAY_PAL2_UNDERSCAN = 11,
    MACFB_DISPLAY_PAL2_OVERSCAN = 12,
    MACFB_DISPLAY_VGA = 13,
    MACFB_DISPLAY_SVGA = 14,
} MacfbDisplayType;

typedef struct MacFbMode {
    uint8_t type;
    uint8_t depth;
    uint32_t mode_ctrl1;
    uint32_t mode_ctrl2;
    uint32_t width;
    uint32_t height;
    uint32_t stride;
    uint32_t offset;
} MacFbMode;

#define MACFB_CTRL_TOPADDR  0x200
#define MACFB_NUM_REGS      (MACFB_CTRL_TOPADDR / sizeof(uint32_t))

typedef struct MacfbState {
    MemoryRegion mem_vram;
    MemoryRegion mem_ctrl;
    QemuConsole *con;

    uint8_t *vram;
    uint32_t vram_bit_mask;
    uint32_t palette_current;
    uint8_t color_palette[256 * 3];
    uint32_t width, height; /* in pixels */
    uint8_t depth;
    uint8_t type;

    uint32_t regs[MACFB_NUM_REGS];
    MacFbMode *mode;

    QEMUTimer *vbl_timer;
    qemu_irq irq;
} MacfbState;

#define TYPE_MACFB "sysbus-macfb"
OBJECT_DECLARE_SIMPLE_TYPE(MacfbSysBusState, MACFB)

struct MacfbSysBusState {
    SysBusDevice busdev;

    MacfbState macfb;
};

#define TYPE_NUBUS_MACFB "nubus-macfb"
OBJECT_DECLARE_TYPE(MacfbNubusState, MacfbNubusDeviceClass, NUBUS_MACFB)

struct MacfbNubusDeviceClass {
    DeviceClass parent_class;

    DeviceRealize parent_realize;
    DeviceUnrealize parent_unrealize;
};


struct MacfbNubusState {
    NubusDevice busdev;

    MacfbState macfb;
};

#endif
