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

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

?? i8254.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號:
/* * QEMU 8253/8254 interval timer emulation * * Copyright (c) 2003-2004 Fabrice Bellard * * 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 "pc.h"#include "isa.h"#include "qemu-timer.h"//#define DEBUG_PIT#define RW_STATE_LSB 1#define RW_STATE_MSB 2#define RW_STATE_WORD0 3#define RW_STATE_WORD1 4typedef struct PITChannelState {    int count; /* can be 65536 */    uint16_t latched_count;    uint8_t count_latched;    uint8_t status_latched;    uint8_t status;    uint8_t read_state;    uint8_t write_state;    uint8_t write_latch;    uint8_t rw_mode;    uint8_t mode;    uint8_t bcd; /* not supported */    uint8_t gate; /* timer start */    int64_t count_load_time;    /* irq handling */    int64_t next_transition_time;    QEMUTimer *irq_timer;    qemu_irq irq;} PITChannelState;struct PITState {    PITChannelState channels[3];};static PITState pit_state;static void pit_irq_timer_update(PITChannelState *s, int64_t current_time);static int pit_get_count(PITChannelState *s){    uint64_t d;    int counter;    d = muldiv64(qemu_get_clock(vm_clock) - s->count_load_time, PIT_FREQ, ticks_per_sec);    switch(s->mode) {    case 0:    case 1:    case 4:    case 5:        counter = (s->count - d) & 0xffff;        break;    case 3:        /* XXX: may be incorrect for odd counts */        counter = s->count - ((2 * d) % s->count);        break;    default:        counter = s->count - (d % s->count);        break;    }    return counter;}/* get pit output bit */static int pit_get_out1(PITChannelState *s, int64_t current_time){    uint64_t d;    int out;    d = muldiv64(current_time - s->count_load_time, PIT_FREQ, ticks_per_sec);    switch(s->mode) {    default:    case 0:        out = (d >= s->count);        break;    case 1:        out = (d < s->count);        break;    case 2:        if ((d % s->count) == 0 && d != 0)            out = 1;        else            out = 0;        break;    case 3:        out = (d % s->count) < ((s->count + 1) >> 1);        break;    case 4:    case 5:        out = (d == s->count);        break;    }    return out;}int pit_get_out(PITState *pit, int channel, int64_t current_time){    PITChannelState *s = &pit->channels[channel];    return pit_get_out1(s, current_time);}/* return -1 if no transition will occur.  */static int64_t pit_get_next_transition_time(PITChannelState *s,                                            int64_t current_time){    uint64_t d, next_time, base;    int period2;    d = muldiv64(current_time - s->count_load_time, PIT_FREQ, ticks_per_sec);    switch(s->mode) {    default:    case 0:    case 1:        if (d < s->count)            next_time = s->count;        else            return -1;        break;    case 2:        base = (d / s->count) * s->count;        if ((d - base) == 0 && d != 0)            next_time = base + s->count;        else            next_time = base + s->count + 1;        break;    case 3:        base = (d / s->count) * s->count;        period2 = ((s->count + 1) >> 1);        if ((d - base) < period2)            next_time = base + period2;        else            next_time = base + s->count;        break;    case 4:    case 5:        if (d < s->count)            next_time = s->count;        else if (d == s->count)            next_time = s->count + 1;        else            return -1;        break;    }    /* convert to timer units */    next_time = s->count_load_time + muldiv64(next_time, ticks_per_sec, PIT_FREQ);    /* fix potential rounding problems */    /* XXX: better solution: use a clock at PIT_FREQ Hz */    if (next_time <= current_time)        next_time = current_time + 1;    return next_time;}/* val must be 0 or 1 */void pit_set_gate(PITState *pit, int channel, int val){    PITChannelState *s = &pit->channels[channel];    switch(s->mode) {    default:    case 0:    case 4:        /* XXX: just disable/enable counting */        break;    case 1:    case 5:        if (s->gate < val) {            /* restart counting on rising edge */            s->count_load_time = qemu_get_clock(vm_clock);            pit_irq_timer_update(s, s->count_load_time);        }        break;    case 2:    case 3:        if (s->gate < val) {            /* restart counting on rising edge */            s->count_load_time = qemu_get_clock(vm_clock);            pit_irq_timer_update(s, s->count_load_time);        }        /* XXX: disable/enable counting */        break;    }    s->gate = val;}int pit_get_gate(PITState *pit, int channel){    PITChannelState *s = &pit->channels[channel];    return s->gate;}int pit_get_initial_count(PITState *pit, int channel){    PITChannelState *s = &pit->channels[channel];    return s->count;}int pit_get_mode(PITState *pit, int channel){    PITChannelState *s = &pit->channels[channel];    return s->mode;}static inline void pit_load_count(PITChannelState *s, int val){    if (val == 0)        val = 0x10000;    s->count_load_time = qemu_get_clock(vm_clock);    s->count = val;    pit_irq_timer_update(s, s->count_load_time);}/* if already latched, do not latch again */static void pit_latch_count(PITChannelState *s){    if (!s->count_latched) {        s->latched_count = pit_get_count(s);        s->count_latched = s->rw_mode;    }}static void pit_ioport_write(void *opaque, uint32_t addr, uint32_t val){    PITState *pit = opaque;    int channel, access;    PITChannelState *s;    addr &= 3;    if (addr == 3) {        channel = val >> 6;        if (channel == 3) {            /* read back command */            for(channel = 0; channel < 3; channel++) {                s = &pit->channels[channel];                if (val & (2 << channel)) {                    if (!(val & 0x20)) {                        pit_latch_count(s);                    }                    if (!(val & 0x10) && !s->status_latched) {                        /* status latch */                        /* XXX: add BCD and null count */                        s->status =  (pit_get_out1(s, qemu_get_clock(vm_clock)) << 7) |                            (s->rw_mode << 4) |                            (s->mode << 1) |                            s->bcd;                        s->status_latched = 1;                    }                }            }        } else {            s = &pit->channels[channel];            access = (val >> 4) & 3;            if (access == 0) {                pit_latch_count(s);            } else {                s->rw_mode = access;                s->read_state = access;                s->write_state = access;                s->mode = (val >> 1) & 7;                s->bcd = val & 1;                /* XXX: update irq timer ? */            }        }    } else {        s = &pit->channels[addr];        switch(s->write_state) {        default:        case RW_STATE_LSB:            pit_load_count(s, val);            break;        case RW_STATE_MSB:            pit_load_count(s, val << 8);            break;        case RW_STATE_WORD0:            s->write_latch = val;            s->write_state = RW_STATE_WORD1;            break;        case RW_STATE_WORD1:            pit_load_count(s, s->write_latch | (val << 8));            s->write_state = RW_STATE_WORD0;            break;        }    }}static uint32_t pit_ioport_read(void *opaque, uint32_t addr){    PITState *pit = opaque;    int ret, count;    PITChannelState *s;    addr &= 3;    s = &pit->channels[addr];    if (s->status_latched) {        s->status_latched = 0;        ret = s->status;    } else if (s->count_latched) {        switch(s->count_latched) {        default:        case RW_STATE_LSB:            ret = s->latched_count & 0xff;            s->count_latched = 0;            break;        case RW_STATE_MSB:            ret = s->latched_count >> 8;            s->count_latched = 0;            break;        case RW_STATE_WORD0:            ret = s->latched_count & 0xff;            s->count_latched = RW_STATE_MSB;            break;        }    } else {        switch(s->read_state) {        default:        case RW_STATE_LSB:            count = pit_get_count(s);            ret = count & 0xff;            break;        case RW_STATE_MSB:            count = pit_get_count(s);            ret = (count >> 8) & 0xff;            break;        case RW_STATE_WORD0:            count = pit_get_count(s);            ret = count & 0xff;            s->read_state = RW_STATE_WORD1;            break;        case RW_STATE_WORD1:            count = pit_get_count(s);            ret = (count >> 8) & 0xff;            s->read_state = RW_STATE_WORD0;            break;        }    }    return ret;}static void pit_irq_timer_update(PITChannelState *s, int64_t current_time){    int64_t expire_time;    int irq_level;    if (!s->irq_timer)        return;    expire_time = pit_get_next_transition_time(s, current_time);    irq_level = pit_get_out1(s, current_time);    qemu_set_irq(s->irq, irq_level);#ifdef DEBUG_PIT    printf("irq_level=%d next_delay=%f\n",           irq_level,           (double)(expire_time - current_time) / ticks_per_sec);#endif    s->next_transition_time = expire_time;    if (expire_time != -1)        qemu_mod_timer(s->irq_timer, expire_time);    else        qemu_del_timer(s->irq_timer);}static void pit_irq_timer(void *opaque){    PITChannelState *s = opaque;    pit_irq_timer_update(s, s->next_transition_time);}static void pit_save(QEMUFile *f, void *opaque){    PITState *pit = opaque;    PITChannelState *s;    int i;    for(i = 0; i < 3; i++) {        s = &pit->channels[i];        qemu_put_be32(f, s->count);        qemu_put_be16s(f, &s->latched_count);        qemu_put_8s(f, &s->count_latched);        qemu_put_8s(f, &s->status_latched);        qemu_put_8s(f, &s->status);        qemu_put_8s(f, &s->read_state);        qemu_put_8s(f, &s->write_state);        qemu_put_8s(f, &s->write_latch);        qemu_put_8s(f, &s->rw_mode);        qemu_put_8s(f, &s->mode);        qemu_put_8s(f, &s->bcd);        qemu_put_8s(f, &s->gate);        qemu_put_be64(f, s->count_load_time);        if (s->irq_timer) {            qemu_put_be64(f, s->next_transition_time);            qemu_put_timer(f, s->irq_timer);        }    }}static int pit_load(QEMUFile *f, void *opaque, int version_id){    PITState *pit = opaque;    PITChannelState *s;    int i;    if (version_id != 1)        return -EINVAL;    for(i = 0; i < 3; i++) {        s = &pit->channels[i];        s->count=qemu_get_be32(f);        qemu_get_be16s(f, &s->latched_count);        qemu_get_8s(f, &s->count_latched);        qemu_get_8s(f, &s->status_latched);        qemu_get_8s(f, &s->status);        qemu_get_8s(f, &s->read_state);        qemu_get_8s(f, &s->write_state);        qemu_get_8s(f, &s->write_latch);        qemu_get_8s(f, &s->rw_mode);        qemu_get_8s(f, &s->mode);        qemu_get_8s(f, &s->bcd);        qemu_get_8s(f, &s->gate);        s->count_load_time=qemu_get_be64(f);        if (s->irq_timer) {            s->next_transition_time=qemu_get_be64(f);            qemu_get_timer(f, s->irq_timer);        }    }    return 0;}static void pit_reset(void *opaque){    PITState *pit = opaque;    PITChannelState *s;    int i;    for(i = 0;i < 3; i++) {        s = &pit->channels[i];        s->mode = 3;        s->gate = (i != 2);        pit_load_count(s, 0);    }}PITState *pit_init(int base, qemu_irq irq){    PITState *pit = &pit_state;    PITChannelState *s;    s = &pit->channels[0];    /* the timer 0 is connected to an IRQ */    s->irq_timer = qemu_new_timer(vm_clock, pit_irq_timer, s);    s->irq = irq;    register_savevm("i8254", base, 1, pit_save, pit_load, pit);    qemu_register_reset(pit_reset, pit);    register_ioport_write(base, 4, 1, pit_ioport_write, pit);    register_ioport_read(base, 3, 1, pit_ioport_read, pit);    pit_reset(pit);    return pit;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品一区二区三区四区| 国产日韩欧美综合在线| 欧美一区二区视频在线观看2020| 国产精品天美传媒| 韩国毛片一区二区三区| 日韩欧美一区二区不卡| 亚洲成人精品一区二区| 日本韩国欧美在线| 亚洲精品免费电影| 色噜噜狠狠色综合中国| 亚洲美女在线国产| 色欧美日韩亚洲| 亚洲综合在线视频| 欧美三级日韩三级| 亚洲高清视频中文字幕| 日韩色视频在线观看| 福利一区二区在线| 一区二区三区在线观看国产 | 国产精品国产三级国产aⅴ中文 | 色欧美乱欧美15图片| 日本伊人色综合网| 亚洲精品在线三区| 91视频观看免费| 美日韩黄色大片| 欧美高清在线一区二区| 欧美伊人精品成人久久综合97| 日韩电影在线观看网站| 国产婷婷色一区二区三区 | 亚洲欧美另类图片小说| 91精品黄色片免费大全| 国产成人亚洲综合a∨婷婷| 亚洲视频免费看| 欧美一区二区三区免费| 91伊人久久大香线蕉| 日本vs亚洲vs韩国一区三区| 国产精品美女www爽爽爽| 91麻豆精品国产91久久久久久久久| 国产精品一二三区在线| 午夜精品久久久久| 中文字幕乱码久久午夜不卡| 91福利视频网站| 国产精品888| 亚洲电影在线播放| 国产精品女同一区二区三区| 日韩精品一区二区三区视频| 99精品热视频| 国产精品一区专区| 日韩精品一二区| 自拍偷在线精品自拍偷无码专区| 2024国产精品| 欧美精品色一区二区三区| 色综合久久综合中文综合网| 国产尤物一区二区在线| 喷水一区二区三区| 亚洲成人激情自拍| 亚洲免费观看高清| 国产精品网站一区| 国产亚洲精品精华液| 欧美一二三区精品| 欧美人狂配大交3d怪物一区| 色婷婷综合视频在线观看| 国产成人在线网站| 精品一区二区三区欧美| 日本少妇一区二区| 天天爽夜夜爽夜夜爽精品视频| 亚洲欧美日韩国产一区二区三区| 中文在线免费一区三区高中清不卡| 日韩欧美中文字幕制服| 91精品国产丝袜白色高跟鞋| 欧美色综合久久| 日本韩国一区二区三区视频| 99国产麻豆精品| 99精品热视频| 色综合久久99| 色婷婷综合在线| 欧美午夜在线观看| 欧美性感一类影片在线播放| 99re成人精品视频| 91同城在线观看| 色综合一区二区| 91免费观看视频| 欧美视频一区二区三区在线观看| 欧美中文字幕亚洲一区二区va在线 | 久久99精品国产麻豆不卡| 美女精品一区二区| 国产精品一区二区视频| 国产精品小仙女| 成人免费毛片app| 99久久精品免费看国产| 在线观看国产日韩| 在线成人免费视频| 欧美成人精精品一区二区频| 精品国免费一区二区三区| 26uuu成人网一区二区三区| 久久久99久久精品欧美| 欧美国产欧美综合| 国产精品久线在线观看| 亚洲精品中文在线观看| 亚洲国产欧美日韩另类综合| 日韩高清在线观看| 国内精品久久久久影院薰衣草| 国产99久久久国产精品免费看 | 国产精品美女一区二区| 综合欧美亚洲日本| 婷婷综合五月天| 精品一区二区三区香蕉蜜桃| 成人一区在线看| 欧美这里有精品| 精品少妇一区二区三区视频免付费 | 欧美精品18+| 精品捆绑美女sm三区| 国产欧美日产一区| 亚洲中国最大av网站| 黄色日韩三级电影| 91视频在线观看| 精品美女一区二区| 成人免费在线视频| 老司机免费视频一区二区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 狠狠色伊人亚洲综合成人| 不卡视频免费播放| 制服.丝袜.亚洲.中文.综合| 国产午夜亚洲精品羞羞网站| 亚洲va在线va天堂| 成人av资源站| 日韩精品自拍偷拍| 亚洲一区二区3| 国产麻豆91精品| 51久久夜色精品国产麻豆| 中文字幕在线观看不卡| 日韩av一区二| 一本大道久久a久久精品综合| 欧美大片在线观看| 亚洲精品免费在线| 成人深夜在线观看| 欧美va亚洲va在线观看蝴蝶网| 亚洲欧美国产毛片在线| 国产毛片精品一区| 欧美电影在线免费观看| 亚洲精品国产无天堂网2021 | 国产成人无遮挡在线视频| 欧美精品乱码久久久久久| 亚洲欧美自拍偷拍| 国产精品一级片| 精品久久久久久久人人人人传媒| 亚洲精品国产视频| 成人黄色在线看| 久久久影视传媒| 裸体在线国模精品偷拍| 欧美日韩1区2区| 亚洲男人都懂的| 99精品国产视频| 中文久久乱码一区二区| 国产精品亚洲а∨天堂免在线| 日韩午夜小视频| 日韩成人精品视频| 欧美日韩国产中文| 亚洲成人午夜影院| 色美美综合视频| 亚洲免费在线看| 91麻豆精品一区二区三区| 国产精品乱人伦| 成人小视频免费在线观看| 欧美国产日韩在线观看| 国产69精品久久777的优势| 国产婷婷一区二区| 丁香啪啪综合成人亚洲小说 | 91精品国产欧美一区二区成人 | 日韩视频一区二区三区| 日产欧产美韩系列久久99| 欧美精品亚洲二区| 日产国产高清一区二区三区| 777午夜精品视频在线播放| 视频一区二区欧美| 欧美一级日韩不卡播放免费| 免费精品视频在线| 日韩精品自拍偷拍| 国产成人亚洲综合a∨猫咪| 中文字幕乱码久久午夜不卡| aa级大片欧美| 综合激情网...| 精品视频一区二区三区免费| 亚洲超碰97人人做人人爱| 91精品国产欧美一区二区成人| 玖玖九九国产精品| 久久丝袜美腿综合| 成人精品电影在线观看| 亚洲精品老司机| 678五月天丁香亚洲综合网| 久久精品国产亚洲高清剧情介绍 | 国产无遮挡一区二区三区毛片日本 | 久久精品视频一区| 不卡一区在线观看| 亚洲最大的成人av| 欧美v日韩v国产v| 成人黄色a**站在线观看| 一区二区久久久久| 日韩三级中文字幕| 成人avav影音| 日韩在线a电影|