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

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

?? sb16.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * QEMU Soundblaster 16 emulation * * Copyright (c) 2003-2005 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 "audiodev.h"#include "audio/audio.h"#include "isa.h"#include "qemu-timer.h"#define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))#define dolog(...) AUD_log ("sb16", __VA_ARGS__)/* #define DEBUG *//* #define DEBUG_SB16_MOST */#ifdef DEBUG#define ldebug(...) dolog (__VA_ARGS__)#else#define ldebug(...)#endif#define IO_READ_PROTO(name)                             \    uint32_t name (void *opaque, uint32_t nport)#define IO_WRITE_PROTO(name)                                    \    void name (void *opaque, uint32_t nport, uint32_t val)static const char e3[] = "COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.";static struct {    int ver_lo;    int ver_hi;    int irq;    int dma;    int hdma;    int port;} conf = {5, 4, 5, 1, 5, 0x220};typedef struct SB16State {    QEMUSoundCard card;    qemu_irq *pic;    int irq;    int dma;    int hdma;    int port;    int ver;    int in_index;    int out_data_len;    int fmt_stereo;    int fmt_signed;    int fmt_bits;    audfmt_e fmt;    int dma_auto;    int block_size;    int fifo;    int freq;    int time_const;    int speaker;    int needed_bytes;    int cmd;    int use_hdma;    int highspeed;    int can_write;    int v2x6;    uint8_t csp_param;    uint8_t csp_value;    uint8_t csp_mode;    uint8_t csp_regs[256];    uint8_t csp_index;    uint8_t csp_reg83[4];    int csp_reg83r;    int csp_reg83w;    uint8_t in2_data[10];    uint8_t out_data[50];    uint8_t test_reg;    uint8_t last_read_byte;    int nzero;    int left_till_irq;    int dma_running;    int bytes_per_second;    int align;    int audio_free;    SWVoiceOut *voice;    QEMUTimer *aux_ts;    /* mixer state */    int mixer_nreg;    uint8_t mixer_regs[256];} SB16State;static void SB_audio_callback (void *opaque, int free);static int magic_of_irq (int irq){    switch (irq) {    case 5:        return 2;    case 7:        return 4;    case 9:        return 1;    case 10:        return 8;    default:        dolog ("bad irq %d\n", irq);        return 2;    }}static int irq_of_magic (int magic){    switch (magic) {    case 1:        return 9;    case 2:        return 5;    case 4:        return 7;    case 8:        return 10;    default:        dolog ("bad irq magic %d\n", magic);        return -1;    }}#if 0static void log_dsp (SB16State *dsp){    ldebug ("%s:%s:%d:%s:dmasize=%d:freq=%d:const=%d:speaker=%d\n",            dsp->fmt_stereo ? "Stereo" : "Mono",            dsp->fmt_signed ? "Signed" : "Unsigned",            dsp->fmt_bits,            dsp->dma_auto ? "Auto" : "Single",            dsp->block_size,            dsp->freq,            dsp->time_const,            dsp->speaker);}#endifstatic void speaker (SB16State *s, int on){    s->speaker = on;    /* AUD_enable (s->voice, on); */}static void control (SB16State *s, int hold){    int dma = s->use_hdma ? s->hdma : s->dma;    s->dma_running = hold;    ldebug ("hold %d high %d dma %d\n", hold, s->use_hdma, dma);    if (hold) {        DMA_hold_DREQ (dma);        AUD_set_active_out (s->voice, 1);    }    else {        DMA_release_DREQ (dma);        AUD_set_active_out (s->voice, 0);    }}static void aux_timer (void *opaque){    SB16State *s = opaque;    s->can_write = 1;    qemu_irq_raise (s->pic[s->irq]);}#define DMA8_AUTO 1#define DMA8_HIGH 2static void continue_dma8 (SB16State *s){    if (s->freq > 0) {        audsettings_t as;        s->audio_free = 0;        as.freq = s->freq;        as.nchannels = 1 << s->fmt_stereo;        as.fmt = s->fmt;        as.endianness = 0;        s->voice = AUD_open_out (            &s->card,            s->voice,            "sb16",            s,            SB_audio_callback,            &as            );    }    control (s, 1);}static void dma_cmd8 (SB16State *s, int mask, int dma_len){    s->fmt = AUD_FMT_U8;    s->use_hdma = 0;    s->fmt_bits = 8;    s->fmt_signed = 0;    s->fmt_stereo = (s->mixer_regs[0x0e] & 2) != 0;    if (-1 == s->time_const) {        if (s->freq <= 0)            s->freq = 11025;    }    else {        int tmp = (256 - s->time_const);        s->freq = (1000000 + (tmp / 2)) / tmp;    }    if (dma_len != -1) {        s->block_size = dma_len << s->fmt_stereo;    }    else {        /* This is apparently the only way to make both Act1/PL           and SecondReality/FC work           Act1 sets block size via command 0x48 and it's an odd number           SR does the same with even number           Both use stereo, and Creatives own documentation states that           0x48 sets block size in bytes less one.. go figure */        s->block_size &= ~s->fmt_stereo;    }    s->freq >>= s->fmt_stereo;    s->left_till_irq = s->block_size;    s->bytes_per_second = (s->freq << s->fmt_stereo);    /* s->highspeed = (mask & DMA8_HIGH) != 0; */    s->dma_auto = (mask & DMA8_AUTO) != 0;    s->align = (1 << s->fmt_stereo) - 1;    if (s->block_size & s->align) {        dolog ("warning: misaligned block size %d, alignment %d\n",               s->block_size, s->align + 1);    }    ldebug ("freq %d, stereo %d, sign %d, bits %d, "            "dma %d, auto %d, fifo %d, high %d\n",            s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,            s->block_size, s->dma_auto, s->fifo, s->highspeed);    continue_dma8 (s);    speaker (s, 1);}static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len){    s->use_hdma = cmd < 0xc0;    s->fifo = (cmd >> 1) & 1;    s->dma_auto = (cmd >> 2) & 1;    s->fmt_signed = (d0 >> 4) & 1;    s->fmt_stereo = (d0 >> 5) & 1;    switch (cmd >> 4) {    case 11:        s->fmt_bits = 16;        break;    case 12:        s->fmt_bits = 8;        break;    }    if (-1 != s->time_const) {#if 1        int tmp = 256 - s->time_const;        s->freq = (1000000 + (tmp / 2)) / tmp;#else        /* s->freq = 1000000 / ((255 - s->time_const) << s->fmt_stereo); */        s->freq = 1000000 / ((255 - s->time_const));#endif        s->time_const = -1;    }    s->block_size = dma_len + 1;    s->block_size <<= (s->fmt_bits == 16);    if (!s->dma_auto) {        /* It is clear that for DOOM and auto-init this value           shouldn't take stereo into account, while Miles Sound Systems           setsound.exe with single transfer mode wouldn't work without it           wonders of SB16 yet again */        s->block_size <<= s->fmt_stereo;    }    ldebug ("freq %d, stereo %d, sign %d, bits %d, "            "dma %d, auto %d, fifo %d, high %d\n",            s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,            s->block_size, s->dma_auto, s->fifo, s->highspeed);    if (16 == s->fmt_bits) {        if (s->fmt_signed) {            s->fmt = AUD_FMT_S16;        }        else {            s->fmt = AUD_FMT_U16;        }    }    else {        if (s->fmt_signed) {            s->fmt = AUD_FMT_S8;        }        else {            s->fmt = AUD_FMT_U8;        }    }    s->left_till_irq = s->block_size;    s->bytes_per_second = (s->freq << s->fmt_stereo) << (s->fmt_bits == 16);    s->highspeed = 0;    s->align = (1 << (s->fmt_stereo + (s->fmt_bits == 16))) - 1;    if (s->block_size & s->align) {        dolog ("warning: misaligned block size %d, alignment %d\n",               s->block_size, s->align + 1);    }    if (s->freq) {        audsettings_t as;        s->audio_free = 0;        as.freq = s->freq;        as.nchannels = 1 << s->fmt_stereo;        as.fmt = s->fmt;        as.endianness = 0;        s->voice = AUD_open_out (            &s->card,            s->voice,            "sb16",            s,            SB_audio_callback,            &as            );    }    control (s, 1);    speaker (s, 1);}static inline void dsp_out_data (SB16State *s, uint8_t val){    ldebug ("outdata %#x\n", val);    if ((size_t) s->out_data_len < sizeof (s->out_data)) {        s->out_data[s->out_data_len++] = val;    }}static inline uint8_t dsp_get_data (SB16State *s){    if (s->in_index) {        return s->in2_data[--s->in_index];    }    else {        dolog ("buffer underflow\n");        return 0;    }}static void command (SB16State *s, uint8_t cmd){    ldebug ("command %#x\n", cmd);    if (cmd > 0xaf && cmd < 0xd0) {        if (cmd & 8) {            dolog ("ADC not yet supported (command %#x)\n", cmd);        }        switch (cmd >> 4) {        case 11:        case 12:            break;        default:            dolog ("%#x wrong bits\n", cmd);        }        s->needed_bytes = 3;    }    else {        s->needed_bytes = 0;        switch (cmd) {        case 0x03:            dsp_out_data (s, 0x10); /* s->csp_param); */            goto warn;        case 0x04:            s->needed_bytes = 1;            goto warn;        case 0x05:            s->needed_bytes = 2;            goto warn;        case 0x08:            /* __asm__ ("int3"); */            goto warn;        case 0x0e:            s->needed_bytes = 2;            goto warn;        case 0x09:            dsp_out_data (s, 0xf8);            goto warn;        case 0x0f:            s->needed_bytes = 1;            goto warn;        case 0x10:            s->needed_bytes = 1;            goto warn;        case 0x14:            s->needed_bytes = 2;            s->block_size = 0;            break;        case 0x1c:              /* Auto-Initialize DMA DAC, 8-bit */            dma_cmd8 (s, DMA8_AUTO, -1);            break;        case 0x20:              /* Direct ADC, Juice/PL */            dsp_out_data (s, 0xff);            goto warn;        case 0x35:            dolog ("0x35 - MIDI command not implemented\n");            break;        case 0x40:            s->freq = -1;            s->time_const = -1;            s->needed_bytes = 1;            break;        case 0x41:            s->freq = -1;            s->time_const = -1;            s->needed_bytes = 2;            break;        case 0x42:            s->freq = -1;            s->time_const = -1;            s->needed_bytes = 2;            goto warn;        case 0x45:            dsp_out_data (s, 0xaa);            goto warn;        case 0x47:                /* Continue Auto-Initialize DMA 16bit */            break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩福利视频导航| 色av成人天堂桃色av| 99riav一区二区三区| 欧美天堂一区二区三区| 久久老女人爱爱| 丝袜a∨在线一区二区三区不卡| 国产麻豆精品视频| 欧美日本视频在线| 亚洲欧洲国产专区| 国产一区 二区 三区一级| 欧美午夜精品一区| 午夜a成v人精品| 国产成人精品免费视频网站| 欧美日韩成人综合天天影院 | 欧美一区二区三区影视| 国产精品传媒入口麻豆| 狠狠色综合播放一区二区| 欧美日韩国产小视频在线观看| 国产精品久久久久影视| 国产制服丝袜一区| 日韩精品在线一区| 麻豆91免费观看| 日韩精品中文字幕在线一区| 亚洲综合在线免费观看| 一本一道久久a久久精品| 国产情人综合久久777777| 日产精品久久久久久久性色| 欧美三级韩国三级日本一级| 一区二区三区成人| 色88888久久久久久影院按摩| 中文一区二区完整视频在线观看| 国产精品自在在线| 久久久噜噜噜久久中文字幕色伊伊| 蜜桃av噜噜一区| 精品美女一区二区三区| 激情五月婷婷综合网| 日韩美女视频在线| 国产精品一区二区久久不卡| 久久先锋资源网| 国产精品一区二区久激情瑜伽| 久久精品人人做人人综合 | 成人av午夜电影| 中文字幕一区三区| 色婷婷亚洲精品| 天天影视网天天综合色在线播放| 欧美日韩国产首页| 激情综合色播五月| 久久久久综合网| 99re6这里只有精品视频在线观看| 国产精品成人免费在线| 色综合色综合色综合色综合色综合| 一区二区在线观看视频| 欧美日韩视频不卡| 六月婷婷色综合| 国产精品免费丝袜| 欧美亚洲动漫精品| 久久精品国产久精国产| 国产午夜精品一区二区三区视频 | 欧美电影一区二区| 麻豆成人av在线| 国产精品久久久久aaaa樱花| 91色porny| 美女www一区二区| 国产精品久久久久9999吃药| 欧美日韩亚洲综合一区| 韩国精品久久久| 亚洲精品中文在线观看| 8x8x8国产精品| 粉嫩一区二区三区在线看| 亚洲最色的网站| xvideos.蜜桃一区二区| 在线一区二区三区四区五区| 免费人成精品欧美精品 | 国产一区二区伦理片| 国产精品久久久久久户外露出 | 亚洲福利一区二区三区| 精品国产乱码久久久久久浪潮| 91在线视频官网| 美女性感视频久久| 亚洲免费观看视频| 欧美精品一区二区三| 在线一区二区视频| 成人av资源在线观看| 麻豆成人久久精品二区三区小说| 亚洲视频在线观看三级| 精品成人在线观看| 欧美精品aⅴ在线视频| 99精品在线免费| 国产高清不卡二三区| 天天综合日日夜夜精品| 亚洲免费观看高清完整版在线| 久久精品人人做| 欧美一区二区三区日韩视频| 色哟哟日韩精品| 不卡电影免费在线播放一区| 美女脱光内衣内裤视频久久影院| 夜夜嗨av一区二区三区网页| 国产三级三级三级精品8ⅰ区| 日韩网站在线看片你懂的| 91久久国产综合久久| 成人丝袜高跟foot| 国产成人精品网址| 国产精品一区二区在线播放| 蜜桃视频第一区免费观看| 亚洲国产精品一区二区www在线| 国产精品女主播av| 久久精品视频一区二区三区| 2023国产精品视频| 久久香蕉国产线看观看99| 欧美大度的电影原声| 日韩午夜在线观看视频| 91精品国产综合久久久久久久| 欧美性色综合网| 欧美日韩亚洲丝袜制服| 欧美日韩国产精选| 欧美日韩视频不卡| 91精品在线免费观看| 欧美一卡二卡三卡四卡| 欧美电影免费提供在线观看| 日韩视频国产视频| 欧美精品一区二区三区在线| 精品久久久久久无| 国产免费久久精品| 国产精品护士白丝一区av| 亚洲欧美一区二区在线观看| 亚洲人精品一区| 亚洲激情图片小说视频| 亚洲444eee在线观看| 日韩主播视频在线| 美女网站色91| 成人免费黄色大片| 在线这里只有精品| 7777精品伊人久久久大香线蕉最新版 | 成人黄色av网站在线| 99久久精品99国产精品| 日本电影亚洲天堂一区| 欧美日韩国产中文| 精品国产91洋老外米糕| 欧美国产一区在线| 一区二区三区中文字幕在线观看| 亚洲午夜精品网| 美女视频一区二区| 99精品桃花视频在线观看| 欧美日韩国产在线观看| 欧美成人aa大片| 中文字幕亚洲在| 午夜伊人狠狠久久| 国产精品69毛片高清亚洲| 91美女福利视频| 欧美成人综合网站| 亚洲日本va午夜在线影院| 爽好多水快深点欧美视频| 国产精品亚洲午夜一区二区三区 | 日韩欧美中文字幕一区| 国产女主播视频一区二区| 亚洲电影欧美电影有声小说| 国内精品伊人久久久久影院对白| 不卡视频一二三| 欧美成人一区二区三区| 最新国产成人在线观看| 免费不卡在线观看| 色婷婷精品久久二区二区蜜臀av| 精品国产一区二区三区久久影院| 偷拍一区二区三区| a在线播放不卡| 精品久久久影院| 午夜精品久久久久久| 成人午夜激情影院| 久久综合色8888| 日日骚欧美日韩| 色婷婷精品久久二区二区蜜臂av| 精品福利一区二区三区免费视频| 亚洲成人777| 色综合色综合色综合| 日本一区二区高清| 经典三级一区二区| 7777精品久久久大香线蕉| 亚洲视频综合在线| 高清av一区二区| 久久奇米777| 久久疯狂做爰流白浆xx| 在线播放亚洲一区| 亚洲一区二区在线视频| fc2成人免费人成在线观看播放 | 欧美吞精做爰啪啪高潮| 国产精品毛片久久久久久久| 久久精品国产99久久6| 欧美在线综合视频| 亚洲免费av在线| a美女胸又www黄视频久久| 久久欧美中文字幕| 美女国产一区二区三区| 欧美一级高清大全免费观看| 亚洲成人黄色影院| 欧美日韩亚洲国产综合| 亚洲h动漫在线| 7777精品伊人久久久大香线蕉经典版下载 | 国产麻豆一精品一av一免费 | 91精品在线观看入口| 午夜av一区二区|