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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dma.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號:
/* * QEMU DMA emulation * * Copyright (c) 2003-2004 Vassili Karpov (malc) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */#include "hw.h"#include "isa.h"/* #define DEBUG_DMA */#define dolog(...) fprintf (stderr, "dma: " __VA_ARGS__)#ifdef DEBUG_DMA#define lwarn(...) fprintf (stderr, "dma: " __VA_ARGS__)#define linfo(...) fprintf (stderr, "dma: " __VA_ARGS__)#define ldebug(...) fprintf (stderr, "dma: " __VA_ARGS__)#else#define lwarn(...)#define linfo(...)#define ldebug(...)#endif#define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))struct dma_regs {    int now[2];    uint16_t base[2];    uint8_t mode;    uint8_t page;    uint8_t pageh;    uint8_t dack;    uint8_t eop;    DMA_transfer_handler transfer_handler;    void *opaque;};#define ADDR 0#define COUNT 1static struct dma_cont {    uint8_t status;    uint8_t command;    uint8_t mask;    uint8_t flip_flop;    int dshift;    struct dma_regs regs[4];} dma_controllers[2];enum {    CMD_MEMORY_TO_MEMORY = 0x01,    CMD_FIXED_ADDRESS    = 0x02,    CMD_BLOCK_CONTROLLER = 0x04,    CMD_COMPRESSED_TIME  = 0x08,    CMD_CYCLIC_PRIORITY  = 0x10,    CMD_EXTENDED_WRITE   = 0x20,    CMD_LOW_DREQ         = 0x40,    CMD_LOW_DACK         = 0x80,    CMD_NOT_SUPPORTED    = CMD_MEMORY_TO_MEMORY | CMD_FIXED_ADDRESS    | CMD_COMPRESSED_TIME | CMD_CYCLIC_PRIORITY | CMD_EXTENDED_WRITE    | CMD_LOW_DREQ | CMD_LOW_DACK};static int channels[8] = {-1, 2, 3, 1, -1, -1, -1, 0};static void write_page (void *opaque, uint32_t nport, uint32_t data){    struct dma_cont *d = opaque;    int ichan;    ichan = channels[nport & 7];    if (-1 == ichan) {        dolog ("invalid channel %#x %#x\n", nport, data);        return;    }    d->regs[ichan].page = data;}static void write_pageh (void *opaque, uint32_t nport, uint32_t data){    struct dma_cont *d = opaque;    int ichan;    ichan = channels[nport & 7];    if (-1 == ichan) {        dolog ("invalid channel %#x %#x\n", nport, data);        return;    }    d->regs[ichan].pageh = data;}static uint32_t read_page (void *opaque, uint32_t nport){    struct dma_cont *d = opaque;    int ichan;    ichan = channels[nport & 7];    if (-1 == ichan) {        dolog ("invalid channel read %#x\n", nport);        return 0;    }    return d->regs[ichan].page;}static uint32_t read_pageh (void *opaque, uint32_t nport){    struct dma_cont *d = opaque;    int ichan;    ichan = channels[nport & 7];    if (-1 == ichan) {        dolog ("invalid channel read %#x\n", nport);        return 0;    }    return d->regs[ichan].pageh;}static inline void init_chan (struct dma_cont *d, int ichan){    struct dma_regs *r;    r = d->regs + ichan;    r->now[ADDR] = r->base[ADDR] << d->dshift;    r->now[COUNT] = 0;}static inline int getff (struct dma_cont *d){    int ff;    ff = d->flip_flop;    d->flip_flop = !ff;    return ff;}static uint32_t read_chan (void *opaque, uint32_t nport){    struct dma_cont *d = opaque;    int ichan, nreg, iport, ff, val, dir;    struct dma_regs *r;    iport = (nport >> d->dshift) & 0x0f;    ichan = iport >> 1;    nreg = iport & 1;    r = d->regs + ichan;    dir = ((r->mode >> 5) & 1) ? -1 : 1;    ff = getff (d);    if (nreg)        val = (r->base[COUNT] << d->dshift) - r->now[COUNT];    else        val = r->now[ADDR] + r->now[COUNT] * dir;    ldebug ("read_chan %#x -> %d\n", iport, val);    return (val >> (d->dshift + (ff << 3))) & 0xff;}static void write_chan (void *opaque, uint32_t nport, uint32_t data){    struct dma_cont *d = opaque;    int iport, ichan, nreg;    struct dma_regs *r;    iport = (nport >> d->dshift) & 0x0f;    ichan = iport >> 1;    nreg = iport & 1;    r = d->regs + ichan;    if (getff (d)) {        r->base[nreg] = (r->base[nreg] & 0xff) | ((data << 8) & 0xff00);        init_chan (d, ichan);    } else {        r->base[nreg] = (r->base[nreg] & 0xff00) | (data & 0xff);    }}static void write_cont (void *opaque, uint32_t nport, uint32_t data){    struct dma_cont *d = opaque;    int iport, ichan = 0;    iport = (nport >> d->dshift) & 0x0f;    switch (iport) {    case 0x08:                  /* command */        if ((data != 0) && (data & CMD_NOT_SUPPORTED)) {            dolog ("command %#x not supported\n", data);            return;        }        d->command = data;        break;    case 0x09:        ichan = data & 3;        if (data & 4) {            d->status |= 1 << (ichan + 4);        }        else {            d->status &= ~(1 << (ichan + 4));        }        d->status &= ~(1 << ichan);        break;    case 0x0a:                  /* single mask */        if (data & 4)            d->mask |= 1 << (data & 3);        else            d->mask &= ~(1 << (data & 3));        break;    case 0x0b:                  /* mode */        {            ichan = data & 3;#ifdef DEBUG_DMA            {                int op, ai, dir, opmode;                op = (data >> 2) & 3;                ai = (data >> 4) & 1;                dir = (data >> 5) & 1;                opmode = (data >> 6) & 3;                linfo ("ichan %d, op %d, ai %d, dir %d, opmode %d\n",                       ichan, op, ai, dir, opmode);            }#endif            d->regs[ichan].mode = data;            break;        }    case 0x0c:                  /* clear flip flop */        d->flip_flop = 0;        break;    case 0x0d:                  /* reset */        d->flip_flop = 0;        d->mask = ~0;        d->status = 0;        d->command = 0;        break;    case 0x0e:                  /* clear mask for all channels */        d->mask = 0;        break;    case 0x0f:                  /* write mask for all channels */        d->mask = data;        break;    default:        dolog ("unknown iport %#x\n", iport);        break;    }#ifdef DEBUG_DMA    if (0xc != iport) {        linfo ("write_cont: nport %#06x, ichan % 2d, val %#06x\n",               nport, ichan, data);    }#endif}static uint32_t read_cont (void *opaque, uint32_t nport){    struct dma_cont *d = opaque;    int iport, val;    iport = (nport >> d->dshift) & 0x0f;    switch (iport) {    case 0x08:                  /* status */        val = d->status;        d->status &= 0xf0;        break;    case 0x0f:                  /* mask */        val = d->mask;        break;    default:        val = 0;        break;    }    ldebug ("read_cont: nport %#06x, iport %#04x val %#x\n", nport, iport, val);    return val;}int DMA_get_channel_mode (int nchan){    return dma_controllers[nchan > 3].regs[nchan & 3].mode;}void DMA_hold_DREQ (int nchan){    int ncont, ichan;    ncont = nchan > 3;    ichan = nchan & 3;    linfo ("held cont=%d chan=%d\n", ncont, ichan);    dma_controllers[ncont].status |= 1 << (ichan + 4);}void DMA_release_DREQ (int nchan){    int ncont, ichan;    ncont = nchan > 3;    ichan = nchan & 3;    linfo ("released cont=%d chan=%d\n", ncont, ichan);    dma_controllers[ncont].status &= ~(1 << (ichan + 4));}static void channel_run (int ncont, int ichan){    int n;    struct dma_regs *r = &dma_controllers[ncont].regs[ichan];#ifdef DEBUG_DMA    int dir, opmode;    dir = (r->mode >> 5) & 1;    opmode = (r->mode >> 6) & 3;    if (dir) {        dolog ("DMA in address decrement mode\n");    }    if (opmode != 1) {        dolog ("DMA not in single mode select %#x\n", opmode);    }#endif    r = dma_controllers[ncont].regs + ichan;    n = r->transfer_handler (r->opaque, ichan + (ncont << 2),                             r->now[COUNT], (r->base[COUNT] + 1) << ncont);    r->now[COUNT] = n;    ldebug ("dma_pos %d size %d\n", n, (r->base[COUNT] + 1) << ncont);}void DMA_run (void){    struct dma_cont *d;    int icont, ichan;    d = dma_controllers;    for (icont = 0; icont < 2; icont++, d++) {        for (ichan = 0; ichan < 4; ichan++) {            int mask;            mask = 1 << ichan;            if ((0 == (d->mask & mask)) && (0 != (d->status & (mask << 4))))                channel_run (icont, ichan);        }    }}void DMA_register_channel (int nchan,                           DMA_transfer_handler transfer_handler,                           void *opaque){    struct dma_regs *r;    int ichan, ncont;    ncont = nchan > 3;    ichan = nchan & 3;    r = dma_controllers[ncont].regs + ichan;    r->transfer_handler = transfer_handler;    r->opaque = opaque;}int DMA_read_memory (int nchan, void *buf, int pos, int len){    struct dma_regs *r = &dma_controllers[nchan > 3].regs[nchan & 3];    target_phys_addr_t addr = ((r->pageh & 0x7f) << 24) | (r->page << 16) | r->now[ADDR];    if (r->mode & 0x20) {        int i;        uint8_t *p = buf;        cpu_physical_memory_read (addr - pos - len, buf, len);        /* What about 16bit transfers? */        for (i = 0; i < len >> 1; i++) {            uint8_t b = p[len - i - 1];            p[i] = b;        }    }    else        cpu_physical_memory_read (addr + pos, buf, len);    return len;}int DMA_write_memory (int nchan, void *buf, int pos, int len){    struct dma_regs *r = &dma_controllers[nchan > 3].regs[nchan & 3];    target_phys_addr_t addr = ((r->pageh & 0x7f) << 24) | (r->page << 16) | r->now[ADDR];    if (r->mode & 0x20) {        int i;        uint8_t *p = buf;        cpu_physical_memory_write (addr - pos - len, buf, len);        /* What about 16bit transfers? */        for (i = 0; i < len; i++) {            uint8_t b = p[len - i - 1];            p[i] = b;        }    }    else        cpu_physical_memory_write (addr + pos, buf, len);    return len;}/* request the emulator to transfer a new DMA memory block ASAP */void DMA_schedule(int nchan){    CPUState *env = cpu_single_env;    if (env)        cpu_interrupt(env, CPU_INTERRUPT_EXIT);}static void dma_reset(void *opaque){    struct dma_cont *d = opaque;    write_cont (d, (0x0d << d->dshift), 0);}/* dshift = 0: 8 bit DMA, 1 = 16 bit DMA */static void dma_init2(struct dma_cont *d, int base, int dshift,                      int page_base, int pageh_base){    const static int page_port_list[] = { 0x1, 0x2, 0x3, 0x7 };    int i;    d->dshift = dshift;    for (i = 0; i < 8; i++) {        register_ioport_write (base + (i << dshift), 1, 1, write_chan, d);        register_ioport_read (base + (i << dshift), 1, 1, read_chan, d);    }    for (i = 0; i < LENOFA (page_port_list); i++) {        register_ioport_write (page_base + page_port_list[i], 1, 1,                               write_page, d);        register_ioport_read (page_base + page_port_list[i], 1, 1,                              read_page, d);        if (pageh_base >= 0) {            register_ioport_write (pageh_base + page_port_list[i], 1, 1,                                   write_pageh, d);            register_ioport_read (pageh_base + page_port_list[i], 1, 1,                                  read_pageh, d);        }    }    for (i = 0; i < 8; i++) {        register_ioport_write (base + ((i + 8) << dshift), 1, 1,                               write_cont, d);        register_ioport_read (base + ((i + 8) << dshift), 1, 1,                              read_cont, d);    }    qemu_register_reset(dma_reset, d);    dma_reset(d);}static void dma_save (QEMUFile *f, void *opaque){    struct dma_cont *d = opaque;    int i;    /* qemu_put_8s (f, &d->status); */    qemu_put_8s (f, &d->command);    qemu_put_8s (f, &d->mask);    qemu_put_8s (f, &d->flip_flop);    qemu_put_be32 (f, d->dshift);    for (i = 0; i < 4; ++i) {        struct dma_regs *r = &d->regs[i];        qemu_put_be32 (f, r->now[0]);        qemu_put_be32 (f, r->now[1]);        qemu_put_be16s (f, &r->base[0]);        qemu_put_be16s (f, &r->base[1]);        qemu_put_8s (f, &r->mode);        qemu_put_8s (f, &r->page);        qemu_put_8s (f, &r->pageh);        qemu_put_8s (f, &r->dack);        qemu_put_8s (f, &r->eop);    }}static int dma_load (QEMUFile *f, void *opaque, int version_id){    struct dma_cont *d = opaque;    int i;    if (version_id != 1)        return -EINVAL;    /* qemu_get_8s (f, &d->status); */    qemu_get_8s (f, &d->command);    qemu_get_8s (f, &d->mask);    qemu_get_8s (f, &d->flip_flop);    d->dshift=qemu_get_be32 (f);    for (i = 0; i < 4; ++i) {        struct dma_regs *r = &d->regs[i];        r->now[0]=qemu_get_be32 (f);        r->now[1]=qemu_get_be32 (f);        qemu_get_be16s (f, &r->base[0]);        qemu_get_be16s (f, &r->base[1]);        qemu_get_8s (f, &r->mode);        qemu_get_8s (f, &r->page);        qemu_get_8s (f, &r->pageh);        qemu_get_8s (f, &r->dack);        qemu_get_8s (f, &r->eop);    }    return 0;}void DMA_init (int high_page_enable){    dma_init2(&dma_controllers[0], 0x00, 0, 0x80,              high_page_enable ? 0x480 : -1);    dma_init2(&dma_controllers[1], 0xc0, 1, 0x88,              high_page_enable ? 0x488 : -1);    register_savevm ("dma", 0, 1, dma_save, dma_load, &dma_controllers[0]);    register_savevm ("dma", 1, 1, dma_save, dma_load, &dma_controllers[1]);}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
偷窥少妇高潮呻吟av久久免费| 日韩国产欧美一区二区三区| 国产又黄又大久久| 欧美一二三区在线| 激情五月婷婷综合网| 精品少妇一区二区三区在线播放 | 亚洲资源中文字幕| 欧美性色黄大片| 日韩av不卡一区二区| 欧美一区二区视频在线观看2020| 日韩激情一二三区| 欧美精品一区二区三区蜜臀| 成人av在线看| 亚洲影院在线观看| 欧美一级免费大片| 国产一区欧美一区| 亚洲蜜桃精久久久久久久| 色8久久精品久久久久久蜜| 天天综合日日夜夜精品| 久久久久久久久免费| 成人小视频免费在线观看| 亚洲三级在线观看| 日韩亚洲欧美在线| 成人免费视频免费观看| 亚洲乱码国产乱码精品精小说 | 99久久精品情趣| 亚洲国产精品一区二区久久恐怖片| 欧美精品日韩一本| 极品尤物av久久免费看| 亚洲视频中文字幕| 欧美一级片在线观看| 东方欧美亚洲色图在线| 亚洲成在人线在线播放| 久久久国产午夜精品| 欧美亚洲免费在线一区| 国产自产视频一区二区三区| 日韩美女视频一区二区 | 日韩欧美一级特黄在线播放| eeuss鲁一区二区三区| 日产国产欧美视频一区精品| 国产精品视频第一区| 在线成人高清不卡| 成人午夜激情影院| 免费av网站大全久久| 亚洲精品videosex极品| 久久久蜜桃精品| 69堂亚洲精品首页| 99久久免费精品高清特色大片| 麻豆精品精品国产自在97香蕉| 中文字幕制服丝袜成人av| 欧美一区二区三区婷婷月色| 色欧美乱欧美15图片| 国产一区二区三区在线观看免费视频| 亚洲激情六月丁香| 国产精品区一区二区三| 日韩一级大片在线| 欧美片网站yy| 91成人在线精品| 成人的网站免费观看| 国产在线乱码一区二区三区| 五月婷婷欧美视频| 亚洲一区二区三区四区的| 国产精品福利一区| 国产欧美一区二区三区鸳鸯浴| 日韩三级高清在线| 日韩一区二区影院| 欧美一级片在线| 91精品国产一区二区三区| 欧美日韩亚洲不卡| 欧美又粗又大又爽| 色88888久久久久久影院野外| av一二三不卡影片| 99视频精品全部免费在线| 福利视频网站一区二区三区| 国产乱淫av一区二区三区| 精品亚洲成a人| 国精产品一区一区三区mba视频 | 中文字幕精品—区二区四季| 精品国产乱码久久久久久免费| 91精品国产综合久久久蜜臀图片 | 亚洲福利国产精品| 亚洲成人av中文| 亚洲成人自拍一区| 日韩福利视频网| 日韩av网站在线观看| 日本中文字幕一区二区有限公司| 日韩精品电影在线观看| 国产91露脸合集magnet| 国产高清亚洲一区| 成人h精品动漫一区二区三区| 国产91精品一区二区麻豆亚洲| 懂色av噜噜一区二区三区av| 成人动漫在线一区| 色欧美片视频在线观看| 欧美三级电影一区| 日韩一区二区高清| 久久久久亚洲综合| 中文字幕一区二区三区四区不卡| 亚洲黄色av一区| 午夜精品一区二区三区免费视频 | 日韩精品91亚洲二区在线观看| 日本午夜精品视频在线观看| 久久se这里有精品| 成人开心网精品视频| 色爱区综合激月婷婷| 欧美一级xxx| 欧美激情资源网| 亚洲乱码国产乱码精品精小说| 亚洲成a人片综合在线| 蓝色福利精品导航| 99在线视频精品| 欧美精品免费视频| 国产亚洲成av人在线观看导航| 中文字幕一区二区三区四区不卡| 亚洲一区在线免费观看| 狂野欧美性猛交blacked| 成a人片国产精品| 欧美欧美午夜aⅴ在线观看| 26uuu精品一区二区| 亚洲人成网站影音先锋播放| 日本免费在线视频不卡一不卡二| 国产精品77777| 欧美精三区欧美精三区| 国产欧美一区二区精品性| 亚洲综合激情网| 国产精品538一区二区在线| 欧美亚洲高清一区| 国产性天天综合网| 日韩高清在线观看| 99re这里都是精品| 久久一区二区三区四区| 亚洲高清免费一级二级三级| 国产乱妇无码大片在线观看| 欧美色偷偷大香| 欧美极品xxx| 日韩av一区二区三区| 99re6这里只有精品视频在线观看| 91精品国产丝袜白色高跟鞋| 亚洲欧美日韩国产综合| 国产乱人伦精品一区二区在线观看| 欧美视频在线观看一区| 国产欧美精品一区二区色综合朱莉| 亚洲va天堂va国产va久| 99麻豆久久久国产精品免费| 日韩欧美一级二级三级| 亚洲激情自拍视频| 成人黄动漫网站免费app| 国产在线视频精品一区| 亚洲欧洲精品一区二区三区| 久久亚洲欧美国产精品乐播| 日韩成人av影视| 日韩欧美一二三四区| 国产在线精品一区二区不卡了 | 欧美国产日韩a欧美在线观看| 欧美男男青年gay1069videost | 成人v精品蜜桃久久一区| 国产亚洲自拍一区| 毛片av中文字幕一区二区| 国产午夜精品福利| 色视频欧美一区二区三区| 亚洲精品视频在线| 日韩欧美国产午夜精品| 蜜臀av性久久久久av蜜臀妖精| 久久综合色天天久久综合图片| 成人av在线一区二区三区| 成人性生交大合| 亚洲一二三四在线观看| 欧美一区二区三区播放老司机| 国产精品亚洲一区二区三区妖精| 欧美高清一级片在线观看| 欧美日韩一区二区三区四区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 国产一区二区三区不卡在线观看| 亚洲一区二区三区激情| 日韩电影免费在线| 成a人片亚洲日本久久| 在线视频中文字幕一区二区| 欧美国产日韩一二三区| 亚洲综合男人的天堂| 国产成人精品网址| 欧美大片在线观看| 午夜精品爽啪视频| 国产91丝袜在线18| 欧美久久高跟鞋激| 久久久99精品免费观看| 久久精品人人做人人综合| 日韩午夜小视频| 国产精品每日更新| 中文子幕无线码一区tr| 国产精品久久久久久久久快鸭| 国产欧美精品一区二区色综合朱莉| 国产精品二三区| 日韩电影免费一区| 成人18视频日本| 欧美草草影院在线视频| 日韩欧美自拍偷拍| 欧美激情一区二区三区在线| 国产精品福利电影一区二区三区四区| 亚洲免费在线观看视频| 久久国产婷婷国产香蕉|