亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
日韩精品最新网址| 91成人在线免费观看| 亚洲人成7777| 精品国产一二三| 欧美日韩成人激情| 99久久精品免费| 久久精品久久久精品美女| 亚洲一线二线三线视频| 中文字幕av一区二区三区免费看| 欧美丰满少妇xxxbbb| 成人性生交大片免费看中文网站| 奇米精品一区二区三区在线观看一 | 丁香婷婷综合激情五月色| 青青草精品视频| 日本在线不卡视频| 亚洲444eee在线观看| 亚洲愉拍自拍另类高清精品| 亚洲国产精品t66y| 国产精品成人一区二区三区夜夜夜| 欧美日韩一区二区不卡| 欧美在线影院一区二区| 91久久精品一区二区| 波多野结衣91| 91丝袜美腿高跟国产极品老师 | 国产精品久久久久三级| 国产日产欧产精品推荐色| 久久色在线视频| 国产色婷婷亚洲99精品小说| 国产清纯在线一区二区www| 国产欧美日韩在线| 亚洲麻豆国产自偷在线| 亚洲伦理在线免费看| 亚洲激情第一区| 日韩专区欧美专区| 精品一区二区三区日韩| 国产成人午夜99999| 在线免费精品视频| 欧美精品日韩一区| 26uuu精品一区二区在线观看| 久久久91精品国产一区二区三区| 国产欧美日韩亚州综合| 亚洲尤物在线视频观看| 蜜臀精品一区二区三区在线观看| 91精品国产综合久久福利软件 | 国产不卡视频在线观看| 99国产精品久久久久久久久久| 欧美午夜在线观看| 亚洲精品一区在线观看| 一区二区三区在线影院| 国产精品资源站在线| 在线免费视频一区二区| 久久久久久日产精品| 日韩影院免费视频| 91免费版在线| 久久久影视传媒| 免费在线观看一区二区三区| 成人高清视频免费观看| 2024国产精品视频| 日韩精品一二三区| 欧美亚洲动漫精品| 玉米视频成人免费看| 成人在线视频一区二区| 精品日韩一区二区三区免费视频| 亚洲一区二区视频在线观看| 成人精品鲁一区一区二区| 精品国产91乱码一区二区三区| 午夜精品久久一牛影视| 欧美图片一区二区三区| 亚洲免费在线观看| 色一情一乱一乱一91av| 国产精品久久久久久久久久久免费看 | 欧美色图片你懂的| 亚洲综合av网| 日本久久一区二区三区| 亚洲精品欧美二区三区中文字幕| 成人av电影观看| 国产精品久久久久久久久免费樱桃| 国产精品综合久久| 国产欧美精品一区二区三区四区| 国产一区美女在线| 国产精品久久久久久久久免费丝袜| 国产成人精品亚洲日本在线桃色 | www国产成人| 成人亚洲一区二区一| 国产精品不卡视频| 欧洲一区二区三区在线| 蜜臀av性久久久久蜜臀aⅴ | 成人黄色av电影| 中文字幕欧美一| 国产片一区二区| 欧美性大战久久久| 精品一区二区三区不卡| 国产午夜精品美女毛片视频| 99vv1com这只有精品| 亚洲成人tv网| 国产精品乱码久久久久久| 在线看不卡av| 久99久精品视频免费观看| 中文字幕中文字幕一区| 欧美精品久久99久久在免费线 | 亚洲色图清纯唯美| 日韩欧美国产成人一区二区| 99久久99久久精品免费看蜜桃| 香蕉成人啪国产精品视频综合网 | 国产精品初高中害羞小美女文| 欧美三级蜜桃2在线观看| 日本视频免费一区| 亚洲一区二区成人在线观看| 精品国产一区二区三区不卡| 欧美唯美清纯偷拍| 成a人片亚洲日本久久| 国产资源精品在线观看| 天堂av在线一区| 亚洲欧美日韩国产手机在线 | 天天做天天摸天天爽国产一区| 国产午夜精品久久久久久久 | 欧美日韩另类一区| 一本久久a久久免费精品不卡| 国产激情视频一区二区三区欧美| 日韩不卡在线观看日韩不卡视频| 亚洲色图都市小说| 亚洲婷婷综合色高清在线| 中文字幕欧美激情一区| 精品av综合导航| 精品国产凹凸成av人网站| 欧美第一区第二区| 日韩欧美激情四射| 精品99一区二区| 国产精品嫩草影院com| 国产精品网站在线| 国产精品久久久久久妇女6080| 国产精品伦一区| 亚洲美女区一区| 蜜臀久久久99精品久久久久久| 日韩国产欧美一区二区三区| 久久精品国产成人一区二区三区| 蜜臀久久99精品久久久画质超高清 | 欧美无砖专区一中文字| 制服丝袜激情欧洲亚洲| 欧美精品一区二区三区高清aⅴ| 国产拍欧美日韩视频二区| 亚洲欧美日韩中文字幕一区二区三区| 一区二区免费在线播放| 免费观看久久久4p| 99精品视频一区二区| 在线播放中文一区| 国产欧美一区视频| 亚洲第一av色| 高清日韩电视剧大全免费| 91免费视频网址| 久久蜜桃一区二区| 亚洲狠狠爱一区二区三区| 粗大黑人巨茎大战欧美成人| 欧美乱熟臀69xxxxxx| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 成人动漫精品一区二区| 日韩片之四级片| 亚洲国产精品麻豆| av中文一区二区三区| 久久久久国产精品麻豆ai换脸 | 亚洲最新在线观看| 国产成人亚洲精品青草天美| 欧美二区乱c少妇| 夜夜精品视频一区二区| av成人免费在线观看| 久久色成人在线| 国内精品久久久久影院一蜜桃| 午夜欧美在线一二页| 婷婷综合五月天| 欧美日本乱大交xxxxx| 亚洲图片你懂的| 91日韩在线专区| 亚洲另类在线制服丝袜| av电影在线不卡| 日韩美女精品在线| 色哟哟国产精品| 一区二区成人在线| 欧美日韩一级片网站| 日韩不卡免费视频| 日韩一级成人av| 激情五月播播久久久精品| 欧美tickling挠脚心丨vk| 久久66热偷产精品| 国产亚洲精品中文字幕| 波多野结衣一区二区三区| 一区二区三区四区高清精品免费观看 | 成人精品视频一区| 亚洲婷婷在线视频| 欧美欧美午夜aⅴ在线观看| 久久精品国产亚洲aⅴ | 国产日韩欧美精品电影三级在线| 国产一区二区不卡在线| 日韩毛片在线免费观看| 欧美日韩美少妇| 国产精品一区二区果冻传媒| 一区精品在线播放| 欧美xxx久久| 91麻豆高清视频| 国产精品一区在线观看你懂的| 国产精品国产三级国产aⅴ原创|