亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pl110.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號:
/* * Arm PrimeCell PL110 Color LCD Controller * * Copyright (c) 2005-2006 CodeSourcery. * Written by Paul Brook * * This code is licenced under the GNU LGPL */#include "hw.h"#include "primecell.h"#include "console.h"#define PL110_CR_EN   0x001#define PL110_CR_BGR  0x100#define PL110_CR_BEBO 0x200#define PL110_CR_BEPO 0x400#define PL110_CR_PWR  0x800enum pl110_bppmode{    BPP_1,    BPP_2,    BPP_4,    BPP_8,    BPP_16,    BPP_32};typedef struct {    uint32_t base;    DisplayState *ds;    /* The Versatile/PB uses a slightly modified PL110 controller.  */    int versatile;    uint32_t timing[4];    uint32_t cr;    uint32_t upbase;    uint32_t lpbase;    uint32_t int_status;    uint32_t int_mask;    int cols;    int rows;    enum pl110_bppmode bpp;    int invalidate;    uint32_t pallette[256];    uint32_t raw_pallette[128];    qemu_irq irq;} pl110_state;static const unsigned char pl110_id[] ={ 0x10, 0x11, 0x04, 0x00, 0x0d, 0xf0, 0x05, 0xb1 };/* The Arm documentation (DDI0224C) says the CLDC on the Versatile board   has a different ID.  However Linux only looks for the normal ID.  */#if 0static const unsigned char pl110_versatile_id[] ={ 0x93, 0x10, 0x04, 0x00, 0x0d, 0xf0, 0x05, 0xb1 };#else#define pl110_versatile_id pl110_id#endifstatic inline uint32_t rgb_to_pixel8(unsigned int r, unsigned int g, unsigned b){    return ((r >> 5) << 5) | ((g >> 5) << 2) | (b >> 6);}static inline uint32_t rgb_to_pixel15(unsigned int r, unsigned int g, unsigned b){    return ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);}static inline uint32_t rgb_to_pixel16(unsigned int r, unsigned int g, unsigned b){    return ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);}static inline uint32_t rgb_to_pixel24(unsigned int r, unsigned int g, unsigned b){    return (r << 16) | (g << 8) | b;}static inline uint32_t rgb_to_pixel32(unsigned int r, unsigned int g, unsigned b){    return (r << 16) | (g << 8) | b;}typedef void (*drawfn)(uint32_t *, uint8_t *, const uint8_t *, int);#define BITS 8#include "pl110_template.h"#define BITS 15#include "pl110_template.h"#define BITS 16#include "pl110_template.h"#define BITS 24#include "pl110_template.h"#define BITS 32#include "pl110_template.h"static int pl110_enabled(pl110_state *s){  return (s->cr & PL110_CR_EN) && (s->cr & PL110_CR_PWR);}static void pl110_update_display(void *opaque){    pl110_state *s = (pl110_state *)opaque;    drawfn* fntable;    drawfn fn;    uint32_t *pallette;    uint32_t addr;    uint32_t base;    int dest_width;    int src_width;    uint8_t *dest;    uint8_t *src;    int first, last = 0;    int dirty, new_dirty;    int i;    int bpp_offset;    if (!pl110_enabled(s))        return;    switch (s->ds->depth) {    case 0:        return;    case 8:        fntable = pl110_draw_fn_8;        dest_width = 1;        break;    case 15:        fntable = pl110_draw_fn_15;        dest_width = 2;        break;    case 16:        fntable = pl110_draw_fn_16;        dest_width = 2;        break;    case 24:        fntable = pl110_draw_fn_24;        dest_width = 3;        break;    case 32:        fntable = pl110_draw_fn_32;        dest_width = 4;        break;    default:        fprintf(stderr, "pl110: Bad color depth\n");        exit(1);    }    if (s->cr & PL110_CR_BGR)        bpp_offset = 0;    else        bpp_offset = 18;    if (s->cr & PL110_CR_BEBO)        fn = fntable[s->bpp + 6 + bpp_offset];    else if (s->cr & PL110_CR_BEPO)        fn = fntable[s->bpp + 12 + bpp_offset];    else        fn = fntable[s->bpp + bpp_offset];    src_width = s->cols;    switch (s->bpp) {    case BPP_1:        src_width >>= 3;        break;    case BPP_2:        src_width >>= 2;        break;    case BPP_4:        src_width >>= 1;        break;    case BPP_8:        break;    case BPP_16:        src_width <<= 1;        break;    case BPP_32:        src_width <<= 2;        break;    }    dest_width *= s->cols;    pallette = s->pallette;    base = s->upbase;    /* HACK: Arm aliases physical memory at 0x80000000.  */    if (base > 0x80000000)        base -= 0x80000000;    src = phys_ram_base + base;    dest = s->ds->data;    first = -1;    addr = base;    dirty = cpu_physical_memory_get_dirty(addr, VGA_DIRTY_FLAG);    new_dirty = dirty;    for (i = 0; i < s->rows; i++) {        if ((addr & ~TARGET_PAGE_MASK) + src_width >= TARGET_PAGE_SIZE) {            uint32_t tmp;            new_dirty = 0;            for (tmp = 0; tmp < src_width; tmp += TARGET_PAGE_SIZE) {                new_dirty |= cpu_physical_memory_get_dirty(addr + tmp,                                                           VGA_DIRTY_FLAG);            }        }        if (dirty || new_dirty || s->invalidate) {            fn(pallette, dest, src, s->cols);            if (first == -1)                first = i;            last = i;        }        dirty = new_dirty;        addr += src_width;        dest += dest_width;        src += src_width;    }    if (first < 0)      return;    s->invalidate = 0;    cpu_physical_memory_reset_dirty(base + first * src_width,                                    base + (last + 1) * src_width,                                    VGA_DIRTY_FLAG);    dpy_update(s->ds, 0, first, s->cols, last - first + 1);}static void pl110_invalidate_display(void * opaque){    pl110_state *s = (pl110_state *)opaque;    s->invalidate = 1;}static void pl110_update_pallette(pl110_state *s, int n){    int i;    uint32_t raw;    unsigned int r, g, b;    raw = s->raw_pallette[n];    n <<= 1;    for (i = 0; i < 2; i++) {        r = (raw & 0x1f) << 3;        raw >>= 5;        g = (raw & 0x1f) << 3;        raw >>= 5;        b = (raw & 0x1f) << 3;        /* The I bit is ignored.  */        raw >>= 6;        switch (s->ds->depth) {        case 8:            s->pallette[n] = rgb_to_pixel8(r, g, b);            break;        case 15:            s->pallette[n] = rgb_to_pixel15(r, g, b);            break;        case 16:            s->pallette[n] = rgb_to_pixel16(r, g, b);            break;        case 24:        case 32:            s->pallette[n] = rgb_to_pixel32(r, g, b);            break;        }        n++;    }}static void pl110_resize(pl110_state *s, int width, int height){    if (width != s->cols || height != s->rows) {        if (pl110_enabled(s)) {            dpy_resize(s->ds, width, height);        }    }    s->cols = width;    s->rows = height;}/* Update interrupts.  */static void pl110_update(pl110_state *s){  /* TODO: Implement interrupts.  */}static uint32_t pl110_read(void *opaque, target_phys_addr_t offset){    pl110_state *s = (pl110_state *)opaque;    offset -= s->base;    if (offset >= 0xfe0 && offset < 0x1000) {        if (s->versatile)            return pl110_versatile_id[(offset - 0xfe0) >> 2];        else            return pl110_id[(offset - 0xfe0) >> 2];    }    if (offset >= 0x200 && offset < 0x400) {        return s->raw_pallette[(offset - 0x200) >> 2];    }    switch (offset >> 2) {    case 0: /* LCDTiming0 */        return s->timing[0];    case 1: /* LCDTiming1 */        return s->timing[1];    case 2: /* LCDTiming2 */        return s->timing[2];    case 3: /* LCDTiming3 */        return s->timing[3];    case 4: /* LCDUPBASE */        return s->upbase;    case 5: /* LCDLPBASE */        return s->lpbase;    case 6: /* LCDIMSC */	if (s->versatile)	  return s->cr;        return s->int_mask;    case 7: /* LCDControl */	if (s->versatile)	  return s->int_mask;        return s->cr;    case 8: /* LCDRIS */        return s->int_status;    case 9: /* LCDMIS */        return s->int_status & s->int_mask;    case 11: /* LCDUPCURR */        /* TODO: Implement vertical refresh.  */        return s->upbase;    case 12: /* LCDLPCURR */        return s->lpbase;    default:        cpu_abort (cpu_single_env, "pl110_read: Bad offset %x\n", (int)offset);        return 0;    }}static void pl110_write(void *opaque, target_phys_addr_t offset,                        uint32_t val){    pl110_state *s = (pl110_state *)opaque;    int n;    /* For simplicity invalidate the display whenever a control register       is writen to.  */    s->invalidate = 1;    offset -= s->base;    if (offset >= 0x200 && offset < 0x400) {        /* Pallette.  */        n = (offset - 0x200) >> 2;        s->raw_pallette[(offset - 0x200) >> 2] = val;        pl110_update_pallette(s, n);        return;    }    switch (offset >> 2) {    case 0: /* LCDTiming0 */        s->timing[0] = val;        n = ((val & 0xfc) + 4) * 4;        pl110_resize(s, n, s->rows);        break;    case 1: /* LCDTiming1 */        s->timing[1] = val;        n = (val & 0x3ff) + 1;        pl110_resize(s, s->cols, n);        break;    case 2: /* LCDTiming2 */        s->timing[2] = val;        break;    case 3: /* LCDTiming3 */        s->timing[3] = val;        break;    case 4: /* LCDUPBASE */        s->upbase = val;        break;    case 5: /* LCDLPBASE */        s->lpbase = val;        break;    case 6: /* LCDIMSC */        if (s->versatile)            goto control;    imsc:        s->int_mask = val;        pl110_update(s);        break;    case 7: /* LCDControl */        if (s->versatile)            goto imsc;    control:        s->cr = val;        s->bpp = (val >> 1) & 7;        if (pl110_enabled(s)) {            dpy_resize(s->ds, s->cols, s->rows);        }        break;    case 10: /* LCDICR */        s->int_status &= ~val;        pl110_update(s);        break;    default:        cpu_abort (cpu_single_env, "pl110_write: Bad offset %x\n", (int)offset);    }}static CPUReadMemoryFunc *pl110_readfn[] = {   pl110_read,   pl110_read,   pl110_read};static CPUWriteMemoryFunc *pl110_writefn[] = {   pl110_write,   pl110_write,   pl110_write};void *pl110_init(DisplayState *ds, uint32_t base, qemu_irq irq,                 int versatile){    pl110_state *s;    int iomemtype;    s = (pl110_state *)qemu_mallocz(sizeof(pl110_state));    iomemtype = cpu_register_io_memory(0, pl110_readfn,                                       pl110_writefn, s);    cpu_register_physical_memory(base, 0x00001000, iomemtype);    s->base = base;    s->ds = ds;    s->versatile = versatile;    s->irq = irq;    graphic_console_init(ds, pl110_update_display, pl110_invalidate_display,                         NULL, s);    /* ??? Save/restore.  */    return s;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久亚洲精华液精华液精华液| 亚洲人成网站影音先锋播放| 午夜精品久久久久久| 欧美性感一区二区三区| 亚洲h动漫在线| 日韩欧美一二三区| 国产精品综合二区| 国产精品进线69影院| 91亚洲国产成人精品一区二区三 | 日本不卡视频在线| 成人一区在线观看| 国产欧美一区二区精品性色 | 67194成人在线观看| 午夜精品久久久| 99久久久国产精品免费蜜臀| 国产区在线观看成人精品| 成人免费视频视频在线观看免费| 国产日韩欧美综合在线| 国产精品亚洲成人| 久久精品一区蜜桃臀影院| 一本久久综合亚洲鲁鲁五月天| 亚洲女同一区二区| 欧美日韩成人综合在线一区二区| 肉肉av福利一精品导航| 精品国产免费一区二区三区香蕉| 国产在线观看一区二区| 中文字幕精品一区二区精品绿巨人| 福利电影一区二区三区| 亚洲少妇30p| 欧美日韩国产一级二级| 精品无码三级在线观看视频| 欧美韩国一区二区| 欧美亚一区二区| 久久精品久久久精品美女| 国产亚洲成年网址在线观看| 色婷婷亚洲精品| 日本成人在线看| 欧美—级在线免费片| 一本大道久久a久久精品综合| 手机精品视频在线观看| 久久精品欧美一区二区三区不卡| 色综合久久中文字幕| 蜜臀av在线播放一区二区三区| 中文字幕欧美激情| 91精品欧美综合在线观看最新| 国产精品66部| 亚洲黄色性网站| 欧美白人最猛性xxxxx69交| 99久久久久免费精品国产 | 亚洲大片在线观看| 精品va天堂亚洲国产| 91色乱码一区二区三区| 久久99蜜桃精品| 亚洲免费观看高清| 亚洲精品在线网站| 精品视频123区在线观看| 国产精品亚洲第一区在线暖暖韩国| 一区二区三区在线不卡| 欧美一区二区三区四区高清| 国产成都精品91一区二区三| 国产精品欧美极品| 51午夜精品国产| va亚洲va日韩不卡在线观看| 五月婷婷综合网| 2020国产精品久久精品美国| 欧美高清你懂得| 99精品欧美一区| 国产在线视频一区二区三区| 日韩av电影免费观看高清完整版在线观看| 国产精品免费免费| 精品国产精品一区二区夜夜嗨| 欧美性感一区二区三区| 91香蕉视频黄| 粉嫩高潮美女一区二区三区| 捆绑变态av一区二区三区| 午夜激情久久久| 一区二区三区丝袜| 国产精品久久久久久妇女6080| 久久综合成人精品亚洲另类欧美 | 国产精品久久久久久久岛一牛影视| 欧美日韩大陆一区二区| 色999日韩国产欧美一区二区| 成人在线一区二区三区| 国产精品亚洲视频| 亚洲美女屁股眼交3| 亚洲三级理论片| 国产精品五月天| 国产精品的网站| 国产精品毛片久久久久久| 欧美国产一区二区在线观看| 久久理论电影网| 国产亚洲人成网站| 久久精品人人爽人人爽| 久久婷婷色综合| 亚洲精品在线三区| 久久精品亚洲麻豆av一区二区| 精品少妇一区二区三区视频免付费 | 国产视频一区二区在线观看| 欧美一级免费观看| 6080yy午夜一二三区久久| 9191成人精品久久| 欧美一区二区私人影院日本| 91精品午夜视频| 日韩一区二区在线观看| 日韩精品一区二区三区视频在线观看| 欧美一级片在线观看| 精品嫩草影院久久| 国产人久久人人人人爽| 综合久久久久久久| 尤物av一区二区| 午夜伦理一区二区| 美女视频黄 久久| 国产福利精品一区| 成人av手机在线观看| 97久久精品人人做人人爽50路| 成人午夜视频在线观看| 成人h动漫精品一区二区| 99久久夜色精品国产网站| 成人av资源站| 91国产免费看| 欧美丰满一区二区免费视频| 久久久久高清精品| 欧美极品少妇xxxxⅹ高跟鞋| 一区二区三区精品久久久| 丝袜亚洲另类欧美| 国产·精品毛片| 欧美亚一区二区| 精品国产乱码久久久久久浪潮| 国产欧美综合色| 亚洲一区二区精品久久av| 免费看黄色91| 成人免费高清视频在线观看| 色久优优欧美色久优优| 欧美一级国产精品| 国产精品久久久久久久久免费相片 | 99这里只有精品| 欧美日韩1234| 日本一区二区成人| 日韩毛片一二三区| 日韩精品免费视频人成| 国产毛片精品一区| 99视频一区二区三区| 91精品国产福利在线观看| 国产精品视频观看| 美女性感视频久久| 在线观看国产一区二区| 久久新电视剧免费观看| 亚洲成人动漫在线免费观看| 国产成人自拍高清视频在线免费播放| 91美女视频网站| 欧美激情中文不卡| 日本欧美一区二区三区| 99九九99九九九视频精品| 日韩精品在线看片z| 亚洲午夜激情av| 成人毛片视频在线观看| 日韩免费看网站| 亚洲国产aⅴ成人精品无吗| 成人免费看的视频| 精品日韩一区二区三区| 亚洲一区二区三区激情| voyeur盗摄精品| 国产精品免费久久| 国模少妇一区二区三区| 91精品在线免费观看| 亚洲成人免费看| 97精品电影院| 国产精品视频看| 国精产品一区一区三区mba视频 | 欧美三级在线看| 日韩美女精品在线| 丁香网亚洲国际| 久久精品欧美一区二区三区不卡 | 亚洲精品videosex极品| 成人av电影在线观看| 久久久久久久久久久99999| 视频在线在亚洲| 欧美美女一区二区| 亚瑟在线精品视频| 欧美亚洲图片小说| 一区二区三区中文字幕电影| 色综合 综合色| 亚洲欧美欧美一区二区三区| gogo大胆日本视频一区| 国产精品久久三区| 色综合久久六月婷婷中文字幕| 国产精品国产三级国产aⅴ原创 | 日韩av一区二区三区| 91欧美一区二区| 国产精品对白交换视频 | 久草在线在线精品观看| 日韩一二三区视频| 极品尤物av久久免费看| 精品国产乱码久久久久久久| 久久成人免费网站| 久久精品视频在线看| 国产很黄免费观看久久| 国产区在线观看成人精品| eeuss国产一区二区三区| 狠狠狠色丁香婷婷综合久久五月|