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

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

?? old-fdc.c

?? 用于匯編領(lǐng)域的,運(yùn)用于OS的MAIN函數(shù).基于硬件基礎(chǔ)的源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
    #if 0    {        unsigned i;        LOG_PRINTF(("Result bytes: "));        for (i = 0; i < fdd->fdc->result_size; i++)            LOG_PRINTF(("%u(%02xh) ", fdd->fdc->result[i], fdd->fdc->result[i]));        LOG_PRINTF(("\n"));    }    #endif    return FDC_OK;}/* Returns nonzero if the motor of the specified drive is on */static inline int is_motor_on(Fdc *fdc, unsigned drive){    return fdc->dor & (1 << (drive + 4));}/* Turns the motor off after the spindown time */static void motor_off_cb(void *params){    Fdd *fdd = (Fdd *) params;    if (is_motor_on(fdd->fdc, fdd->number))    {        fdd->fdc->dor &= ~(1 << (fdd->number + 4));        fd32_outb(fdd->fdc->base_port + FDC_DOR, fdd->fdc->dor);        fdd->flags &= ~(DF_SPINUP | DF_SPINDN);    }}/* Signals that motor spinup time elapsed */static void motor_spin_cb(void *fdd){    ((Fdd *) fdd)->flags |= DF_SPINUP;}/* Turns the motor on and selects the drive */static void motor_on(Fdd *fdd){    if (fdd->flags & DF_SPINDN) fd32_event_delete(fdd->spin_down);    fdd->flags   &= ~DF_SPINDN;    if (!is_motor_on(fdd->fdc, fdd->number))    {        if (!(fdd->flags & DF_SPINUP))            /* TODO: Check for FD32_EVENT_NULL */            if (fd32_event_post(fdd->dp->spin_up, motor_spin_cb, fdd) < 0)                LOG_PRINTF(("Motor on: Out of events!\n"));        fdd->fdc->dor |= (1 << (fdd->number + 4));        /* Select drive */        fdd->fdc->dor = (fdd->fdc->dor & 0xFC) | fdd->number;        fd32_outb(fdd->fdc->base_port + FDC_DOR, fdd->fdc->dor);    }}/* Schedule motor off setting up the spindown timer */static void motor_down(Fdd *fdd){    if (is_motor_on(fdd->fdc, fdd->number))    {        if (fdd->flags & DF_SPINDN) return;        fdd->spin_down = fd32_event_post(fdd->dp->spin_down, motor_off_cb, fdd);        if (fdd->spin_down == -1) LOG_PRINTF(("[FDC] motor_down: out of events!\n"));        fdd->flags |= DF_SPINDN;    }}/* This is the IRQ6 handler. irq_signaled is global! */static void irq6(int n){    irq_signaled = 1;  /* Signal operation finished */    fd32_master_eoi(); /* Send EOI the PIC          */}/* Returns nonzero if there was a disk change */int fdc_disk_changed(Fdd *fdd){    unsigned changeline;    motor_on(fdd);    changeline = fd32_inb(fdd->fdc->base_port + FDC_DIR) & 0x80;    motor_down(fdd);    return changeline || (fdd->flags & DF_CHANGED);}/* Recalibrates a drive (seek head to track 0).                     *//* Since the RECALIBRATE command sends up to 79 pulses to the head, *//* this function issues as many RECALIBRATE as needed.              *//* The drive is supposed to be selected (motor on).                 */static void recalibrate(Fdd *fdd){    unsigned k;    LOG_PRINTF(("Recalibrate\n"));    for (k = 0; k < 13; k++)    {        sendbyte(fdd->fdc->base_port, CMD_RECAL);        sendbyte(fdd->fdc->base_port, fdd->number);        wait_fdc(fdd);        /* Send a "sense interrupt status" command */        sendbyte(fdd->fdc->base_port, CMD_SENSEI);        fdd->fdc->sr0 = getbyte(fdd->fdc->base_port);        fdd->track    = getbyte(fdd->fdc->base_port);        if (!(fdd->fdc->sr0 & 0x10)) break; /* Exit if Unit Check is not set */    }    LOG_PRINTF(("Calibration result on drive %u: SR0=%02xh, Track=%u\n",                fdd->number, fdd->fdc->sr0, fdd->track));}/* Seeks a drive to the specified track.            *//* The drive is supposed to be selected (motor on). */int fdc_seek(Fdd *fdd, unsigned track){    if (fdd->track == track) return FDC_OK; /* Already there */    if (track >= fdd->fmt->tracks) return FDC_ERROR; /* Invalid track */    sendbyte(fdd->fdc->base_port, CMD_SEEK);    sendbyte(fdd->fdc->base_port, fdd->number);    sendbyte(fdd->fdc->base_port, track);    if (wait_fdc(fdd)) return FDC_TIMEOUT; /* Timeout */    /* Send a "sense interrupt status" command */    sendbyte(fdd->fdc->base_port, CMD_SENSEI);    fdd->fdc->sr0 = getbyte(fdd->fdc->base_port);    fdd->track    = getbyte(fdd->fdc->base_port);    /* Check that seek worked */    if ((fdd->fdc->sr0 != 0x20 + fdd->number) || (fdd->track != track))    {        LOG_PRINTF(("Seek error on drive %u: SR0=%02xh, Track=%u Expected=%u\n",                    fdd->number, fdd->fdc->sr0, fdd->track, track));        return FDC_ERROR;    }    LOG_PRINTF(("Seek result on drive %u: SR0=%02xh, Track=%u\n", fdd->number,                fdd->fdc->sr0, fdd->track));    return FDC_OK;}/* Gets the position of the heads by reading the next sector identifier. *//* Fills chs with the current head position.                             *//* The drive is supposed to be selected (motor on).                      */static int readid(Fdd *fdd, Chs *chs){    int res = 0;    sendbyte(fdd->fdc->base_port, CMD_READID);    sendbyte(fdd->fdc->base_port, fdd->number);    if (wait_fdc(fdd)) res = FDC_TIMEOUT;    if (res < 0) return res;    if ((fdd->fdc->result[0] & 0xC0) != 0) return FDC_ERROR;    chs->c = fdd->fdc->result[3];    chs->h = fdd->fdc->result[4];    chs->s = fdd->fdc->result[5];    return FDC_OK;}/* Program data rate and specify drive timings using the SPECIFY command */static void specify(const Fdd *fdd){    fd32_outb(fdd->fdc->base_port + FDC_CCR, fdd->fmt->rate);    sendbyte(fdd->fdc->base_port, CMD_SPECIFY);    sendbyte(fdd->fdc->base_port, fdd->fmt->sr_hut);    sendbyte(fdd->fdc->base_port, fdd->dp->hlt << 1); /* Always DMA */}#endif/* Resets the FDC to a known state */static void reset_fdc(Fdc *fdc){    unsigned      k;    volatile int  irq_timeout = 0;    int irq_timeout_event;    fd32_outb(fdc->base_port + FDC_DOR, 0);    /* Stop the motor and disable IRQ/DMA  */    /* TODO: Add a small delay (20 us) to make older controllers more happy */    //fd32_outb(fdc->base_port + FDC_DOR, 0x1C); /* Re-enable IRQ/DMA and release reset */    fd32_outb(fdc->base_port + FDC_MSR, 0x80); /* reset */    fd32_outb(fdc->base_port + FDC_DOR, 0x0C); /* Re-enable IRQ/DMA and release reset */    fdc->dor = 0x0C;    /* Resetting triggered 4 interrupts - handle them */    //irq_timeout_event = fd32_event_post(default_drive_params[0].int_tmout, irq_timeout_cb, (void *) &irq_timeout);    /* TODO: Check for FD32_EVENT_NULL */    //WFC(!irq_signaled && !irq_timeout);    //fd32_event_delete(irq_timeout_event);	irq_signaled=0;	printk("now waiting for irq6\n");	k = inp(0x3f4); // read status of fdc	printk("status of fdc: %x\n",k);	while (!irq_signaled);	printk("pased irq6\n");    //if (irq_timeout)    //    LOG_PRINTF(("Timed out while waiting for FDC after reset\n"));    /* FDC specs say to sense interrupt status four times */    for (k = 0; k < 4; k++)    {        /* Send a "sense interrupt status" command */        sendbyte(fdc->base_port, CMD_SENSEI);        fdc->sr0            = getbyte(fdc->base_port);		printk("sr0:%x\n",fdc->sr0);        fdc->drive[k].track = getbyte(fdc->base_port);    }    irq_signaled = 0;}#ifdef MYFDC     /* Get a drive to a known state */static void reset_drive(Fdd *fdd){    if (fdd->dp->cmos_type == 0) return;    if (fdd->flags & DF_SPINDN) fd32_event_delete(fdd->spin_down);    fdd->flags   = 0;    fdd->track   = 0;    specify(fdd);    motor_on(fdd);    fdc_seek(fdd, SAFESEEK);    recalibrate(fdd);    motor_down(fdd);    fdd->flags |= DF_CHANGED; /* So that fdc_log_disk can be issued */}/* Transfer sectors between the disk and the DMA buffer. *//* The drive is supposed to be selected (motor on).      */static int fdc_xfer(Fdd *fdd, const Chs *chs, DWORD dma_addr, unsigned num_sectors, FdcTransfer op){    LOG_PRINTF(("[FDC] fdc_xfer: C=%u, H=%u, S=%u, n=%u, op=%u\n", chs->c, chs->h, chs->s, num_sectors, op));    /* Wait for motor spin quickly enough */    WFC(!(fdd->flags & DF_SPINUP));    /* Send read/write command */    if (op == FDC_READ)    {        dma_xfer(dma_addr, 512 * num_sectors, 0); /* Read */        sendbyte(fdd->fdc->base_port, CMD_READ);    }    else    {        dma_xfer(dma_addr, 512 * num_sectors, 1); /* Write */        sendbyte(fdd->fdc->base_port, CMD_WRITE);    }    sendbyte(fdd->fdc->base_port, (chs->h << 2) | fdd->number);    sendbyte(fdd->fdc->base_port, chs->c);    sendbyte(fdd->fdc->base_port, chs->h);    sendbyte(fdd->fdc->base_port, chs->s);    sendbyte(fdd->fdc->base_port, 2); /* 512 bytes per sector */    sendbyte(fdd->fdc->base_port, fdd->fmt->sec_per_trk);    sendbyte(fdd->fdc->base_port, fdd->fmt->gap3);    sendbyte(fdd->fdc->base_port, 0xFF); /* DTL (bytes to transfer) = unused */    /* Wait for completion and produce exit code */    if (wait_fdc(fdd))    {        reset_fdc(fdd->fdc);        reset_drive(fdd);        return FDC_TIMEOUT;    }    if ((fdd->fdc->result[0] & 0xC0) == 0) return FDC_OK;    return FDC_ERROR;}/* Reads sectors from the floppy, up to the end of the cylinder.         *//* If buffer is NULL, the read data is discarded (may be used to probe). */int fdc_read(Fdd *fdd, const Chs *chs, BYTE *buffer, unsigned num_sectors){    unsigned tries;    int      res = FDC_ERROR;    if (fdd->dp->cmos_type == 0) return FDC_ERROR; /* Drive not available */    /* TODO: Place a timeout for Busy check */    while (busy); /* Wait while the floppy driver is already busy: BUSY WAIT! */    busy = 1;    motor_on(fdd);    specify(fdd);    for (tries = 0; tries < 3; tries++)    {        /* Move head to right track */        if (fdc_seek(fdd, chs->c) == FDC_OK)        {            /* If changeline is active, no disk is in drive */            if (fd32_inb(fdd->fdc->base_port + FDC_DIR) & 0x80)            {                LOG_PRINTF(("[FDC] fdc_read: no disk in drive\n"));                res = FDC_NODISK;                break;            }            res = fdc_xfer(fdd, chs, dma_addr, num_sectors, FDC_READ);            if (res == FDC_OK) break;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性受xxxx黑人xyx性爽| 成人小视频免费观看| 91精品黄色片免费大全| 亚洲成人动漫在线免费观看| 欧美人xxxx| 精品一区二区三区免费毛片爱| 欧美一区二区精品在线| 激情五月婷婷综合| 国产视频一区不卡| 成人久久18免费网站麻豆| 亚洲色图欧美偷拍| 91精品午夜视频| 国产一区二区三区久久久| 国产精品久久毛片a| 日本高清成人免费播放| 人人爽香蕉精品| 国产精品私人影院| 欧美美女一区二区| 国产一本一道久久香蕉| 亚洲蜜臀av乱码久久精品| 91精品免费观看| 福利电影一区二区三区| 一区二区高清视频在线观看| 91麻豆精品91久久久久同性| 国产一区二区美女| 亚洲免费观看高清| 精品日产卡一卡二卡麻豆| 91丝袜高跟美女视频| 日日噜噜夜夜狠狠视频欧美人| 精品蜜桃在线看| 一本一道综合狠狠老| 久久不见久久见中文字幕免费| 国产精品久久久久精k8| 日韩欧美国产麻豆| 91在线精品一区二区三区| 久热成人在线视频| 亚洲免费成人av| 久久一区二区视频| 欧美人妖巨大在线| 成人久久视频在线观看| 蜜桃视频第一区免费观看| 亚洲欧美另类图片小说| 精品精品国产高清a毛片牛牛 | 免费的国产精品| 国产精品久久福利| 日韩女优毛片在线| 欧美美女一区二区三区| 成人手机电影网| 久久精品国产久精国产爱| 一区二区三区不卡视频在线观看 | 色综合天天视频在线观看| 奇米亚洲午夜久久精品| 一区二区免费在线| 最新热久久免费视频| 久久精品男人天堂av| 91精品国产福利在线观看| 99久久婷婷国产综合精品| 国产一区视频网站| 免费不卡在线观看| 亚洲动漫第一页| 一区二区三区久久| 一区在线播放视频| 亚洲国产精品99久久久久久久久 | 欧美性猛交xxxxxxxx| 成人av电影在线观看| 精品无码三级在线观看视频| 日韩av一区二区三区| 亚洲国产成人va在线观看天堂| 国产精品美女久久久久高潮| 国产色一区二区| 久久天堂av综合合色蜜桃网| 欧美成人精品福利| 日韩欧美国产精品一区| 日韩欧美成人午夜| 日韩精品中文字幕在线一区| 欧美一级在线观看| 欧美一区二区三区免费在线看 | 亚洲精品免费在线观看| 国产精品久久久久四虎| 国产精品灌醉下药二区| 欧美日韩国产成人在线免费| 91精品欧美久久久久久动漫| 欧美大片日本大片免费观看| 日韩欧美精品三级| 久久嫩草精品久久久精品一| 国产欧美日韩在线观看| 国产精品久久久久永久免费观看| 国产日韩精品一区二区浪潮av| 中文字幕乱码一区二区免费| 亚洲欧洲日产国产综合网| 成人欧美一区二区三区白人 | 中文字幕一区二区三区在线播放| 国产精品美女久久久久av爽李琼 | 欧美国产禁国产网站cc| 中文字幕一区三区| 香港成人在线视频| 精品一区二区三区在线播放| 国产传媒日韩欧美成人| 97精品久久久午夜一区二区三区| 在线观看亚洲精品视频| 欧美一区二区三区视频免费播放 | 欧美成人在线直播| 久久人人超碰精品| 亚洲天堂免费在线观看视频| 午夜影视日本亚洲欧洲精品| 久久99久久久久| av资源网一区| 777午夜精品视频在线播放| 欧美tickle裸体挠脚心vk| 欧美韩国日本综合| 亚洲国产毛片aaaaa无费看| 日韩 欧美一区二区三区| 国产酒店精品激情| 欧美午夜不卡视频| 久久久精品免费网站| 亚洲综合小说图片| 国模冰冰炮一区二区| 97精品电影院| 久久婷婷一区二区三区| 亚洲美女免费在线| 国产精品一区二区你懂的| 欧美吞精做爰啪啪高潮| 久久影院午夜片一区| 午夜欧美一区二区三区在线播放| 国产成人一级电影| 91精品国产色综合久久ai换脸 | 国产69精品久久99不卡| 欧美日韩精品三区| 中文字幕亚洲一区二区av在线| 日日噜噜夜夜狠狠视频欧美人 | 日韩一区二区在线观看视频 | 日韩精品中文字幕在线不卡尤物| 1区2区3区欧美| 国产在线国偷精品产拍免费yy| 欧美性生活久久| 中文字幕一区二区三区在线播放 | 成人免费视频caoporn| 91精品国产色综合久久久蜜香臀| 中文字幕亚洲区| 国产宾馆实践打屁股91| 日韩免费视频一区二区| 亚洲国产精品久久人人爱蜜臀| 成人丝袜高跟foot| 欧美精品一区二区三区蜜桃| 午夜在线电影亚洲一区| 日本久久电影网| 1024亚洲合集| 成人久久18免费网站麻豆| 久久综合999| 精品一区二区在线观看| 欧美一区二区三区爱爱| 亚洲va中文字幕| 在线视频亚洲一区| 亚洲人成网站色在线观看| 懂色av中文字幕一区二区三区| 欧美mv日韩mv| 国内精品伊人久久久久av影院 | 亚洲国产aⅴ天堂久久| 99久久精品免费观看| 中文字幕欧美激情| 成人av网址在线| 国产精品你懂的| 波波电影院一区二区三区| 国产欧美日韩视频一区二区 | 99九九99九九九视频精品| 中文在线免费一区三区高中清不卡| 久久se这里有精品| 久久久久久毛片| 国产高清无密码一区二区三区| 2024国产精品| 国产成人av电影在线观看| 久久久久久久久97黄色工厂| 国产乱子伦一区二区三区国色天香| 精品国产不卡一区二区三区| 国产一区二区三区四区五区美女| 久久久久久久久蜜桃| 国产99精品在线观看| 亚洲欧洲av色图| 日本道精品一区二区三区| 亚洲国产精品天堂| 4hu四虎永久在线影院成人| 日本不卡中文字幕| 精品国产凹凸成av人导航| 国产老肥熟一区二区三区| 国产精品美女久久久久aⅴ | 蜜臀a∨国产成人精品| 精品国产乱码久久久久久久久| 国产成人免费在线视频| 国产精品久久久久久久蜜臀| 一本色道久久综合亚洲91| 天堂蜜桃一区二区三区| 精品999久久久| 成人午夜免费电影| 亚洲一区二区三区四区五区黄 | 欧美精品一区二区三区蜜臀| 成人伦理片在线| 亚洲成人你懂的| 亚洲精品一线二线三线| 99在线视频精品| 日本不卡一区二区三区|