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

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

?? pc_com.c

?? DD sample implements serial port support for the Virtual DOS Machine (VDM). Driver for windows. Tool
?? C
?? 第 1 頁 / 共 2 頁
字號:
// Copyright (c) Microsoft 1992-1999, All Rights Reserved
// portions copyright 1991 by Insignia Solutions Ltd., used by permission.
//   

/*
 * PC_com.c
 *
 * This module handles the virtual UART I/O and interrupt interface
 *
 * Note:
 *  Refer to National Semiconductor literature for a detailed description
 *  of the NS16450/NS8250A UART.  Refer to the PC-XT Tech Ref Manual 
 *  Section 1-185 for a description of the Asynchronous Adaptor Card.
 *
 *
 * revision history:
 *  24-Dec-1992 John Morgan:  written based (in part) on 
 *                             serial driver support from Windows NT VDM.
 *
 */


//
//    useful utility macros
//
#include "util_def.h"

//
//    standard library include files
//
#include <windows.h>

#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <string.h>

//
//    COM_VDD specific include files
//
#include "com_vdd.h"
#include "PC_def.h"
#include "PC_com.h"
#include "NT_com.h"
#include "vddsvc.h"

/*
 * =====================================================================
 * Subsidiary functions - for interrupt emulation
 * =====================================================================
 */
static void check_interrupt( UART_STATE *asp )
{
    /*
     * Follow somewhat dubious advice on Page 1-188 of XT Tech Ref
     * regarding the adapter card sending interrupts to the system.
     * Apparently confirmed by the logic diagram.
     */
    if (asp->out2_state
        && !asp->loopback_state
        && (asp->data_available_interrupt_state
            || asp->tx_holding_register_empty_interrupt_state
            || asp->receiver_line_status_interrupt_state
            || asp->modem_status_interrupt_state))
    {
        if (!asp->interrupt_line_state)
        {
            asp->interrupt_line_state = TRUE;
            VDDSimulateInterrupt( 0, asp->hw_interrupt_priority, 1);
        }
    }     
    else
    {
        asp->interrupt_line_state = FALSE;
    }
}

extern void raise_rls_interrupt( UART_STATE *asp )
{
    /*
     * Check if receiver line status interrupt is enabled
     */
    if (asp->int_enable_reg.bits.rx_line)
    {
        asp->receiver_line_status_interrupt_state = TRUE;
        check_interrupt(asp);
    }
}

extern void raise_rda_interrupt( UART_STATE *asp )
{
    /*
     * Check if data available interrupt is enabled
     */
    if (asp->int_enable_reg.bits.data_available)
    {
        asp->data_available_interrupt_state = TRUE;
        check_interrupt(asp);
    }
}

extern void raise_ms_interrupt( UART_STATE *asp )
{
    /*
     * Check if modem status interrupt is enabled
     */
    if (asp->int_enable_reg.bits.modem_status)
    {
        asp->modem_status_interrupt_state = TRUE;
        check_interrupt(asp);
    }
    asp->modem_status_changed = TRUE;
}

extern void raise_thre_interrupt( UART_STATE *asp )
{
    /*
     * Check if tx holding register empty interrupt is enabled
     */
    if (asp->int_enable_reg.bits.tx_holding)
    {
        asp->tx_holding_register_empty_interrupt_state = TRUE;
        check_interrupt(asp);
    }
}


/*
 * =====================================================================
 * Subsidiary functions - for data available
 * =====================================================================
 */

/*
 * signal all characters transmitted!
 */
void clear_tbr_flag( UART_STATE *asp )
{
    asp->line_status_reg.bits.tx_shift_empty = 1;
}

/*
 * check for data available and line status changes
 */
static void check_data_available( tAdapter adapter )
{
    UART_STATE *asp = & UART_ADAPTER(adapter);
    DWORD error;
    
    if (!asp->loopback_state)
    {
        if (!asp->line_status_reg.bits.data_ready)
        {
            if (!(asp->line_status_reg.bits.data_ready = (BYTE_BIT_FIELD)host_com_read_rx( adapter, &asp->rx_buff_reg ))
                && asp->int_enable_reg.bits.data_available)
            {
                host_com_rx_wait( adapter );
            }
        }

        if ((error = host_com_get_error( adapter )) != 0)
        {
            /*
             * Set line status register and raise line status interrupt
             */
            if (error & (CE_OVERRUN | CE_RXOVER))
                asp->line_status_reg.bits.overrun_error = 1;

            if (error & CE_FRAME)
                asp->line_status_reg.bits.framing_error = 1;

            if (error & CE_RXPARITY)
                asp->line_status_reg.bits.parity_error = 1;

            if (error & CE_BREAK)
                asp->line_status_reg.bits.break_interrupt = 1;

            raise_rls_interrupt( asp );
        }
    }
}


/*
 * flush all received input
 */
static void com_flush_input(tAdapter adapter)
{
    BYTE dummy;
    
    while (host_com_read_rx( adapter, &dummy ))
        /* do nothing */;

    UART_ADAPTER(adapter).line_status_reg.bits.data_ready = FALSE;
}

/*
 * set the IIR for current interrupts pending
 */
static BYTE generate_iir( tAdapter adapter )
{
    UART_STATE *asp = & UART_ADAPTER(adapter);

    /*
     * Set up interrupt identification register with highest priority
     * pending interrupt.
     */

    check_data_available( adapter );

    return 
        (asp->receiver_line_status_interrupt_state) ?           UART_RLS_INT
        : (asp->line_status_reg.bits.data_ready) ?              UART_RDA_INT
          : (asp->tx_holding_register_empty_interrupt_state) ?  UART_THRE_INT
            : (asp->modem_status_interrupt_state) ?             UART_MS_INT
              :                                                 UART_NO_INT;
}


/*
 * set modem status register to new status
 */
static void set_modem_status( tAdapter adapter, long modem_status )
{
    UART_STATE *asp = & UART_ADAPTER( adapter );
    int cts_state, dsr_state, rlsd_state, ri_state;

    cts_state  = ((modem_status & HOST_MS_CTS)  != 0);
    dsr_state  = ((modem_status & HOST_MS_DSR)  != 0);
    rlsd_state = ((modem_status & HOST_MS_RLSD) != 0);
    ri_state   = ((modem_status & HOST_MS_RI)   != 0);

    /*
     * Establish CTS state
     */
    if (cts_state != asp->modem_status_reg.bits.CTS)
    {
        asp->modem_status_reg.bits.CTS = (BYTE_BIT_FIELD)cts_state;
        asp->modem_status_reg.bits.delta_CTS = TRUE;
        raise_ms_interrupt(asp);
    }

    /*
     * Establish DSR state
     */
    if (dsr_state != asp->modem_status_reg.bits.DSR)
    {
        asp->modem_status_reg.bits.DSR = (BYTE_BIT_FIELD)dsr_state;
        asp->modem_status_reg.bits.delta_DSR = TRUE;
        raise_ms_interrupt(asp);
    }

    /*
     * Establish RLSD state
     */
    if (rlsd_state != asp->modem_status_reg.bits.RLSD)
    {
        asp->modem_status_reg.bits.RLSD = (BYTE_BIT_FIELD)rlsd_state;
        asp->modem_status_reg.bits.delta_RLSD = TRUE;
        raise_ms_interrupt(asp);
    }

    /*
     * Establish RI state
     */
    if (ri_state != asp->modem_status_reg.bits.RI)
    {
        if ((asp->modem_status_reg.bits.RI = (BYTE_BIT_FIELD)ri_state) == FALSE)
        {
            asp->modem_status_reg.bits.TERI = TRUE;
            raise_ms_interrupt(asp);
        }
    }
}

/*
 * One of the modem control input lines has changed state
 */
static void refresh_modem_status( tAdapter adapter )
{
    /*
     * Update the modem status register after a change to one of the
     * modem status input lines
     */
    UART_STATE *asp = & UART_ADAPTER(adapter);

    if (! UART_ADAPTER(adapter).loopback_state)
    {
        /* get current modem input state */
        set_modem_status( adapter, host_com_ioctl( adapter, HOST_COM_MSTATUS, 0 ) );
    }
}


/*
 * =====================================================================
 * Subsidiary functions - for setting comms parameters
 * =====================================================================
 */

static void set_baud_rate( tAdapter adapter )
{
    const long UART_bit_clock = 115200;
    UART_STATE *asp = & UART_ADAPTER(adapter);

    if (UART_ADAPTER(adapter).divisor_latch.all != 0)
    {
        com_flush_input( adapter );
        host_com_ioctl( adapter, 
                        HOST_COM_BAUD, 
                        UART_bit_clock / UART_ADAPTER(adapter).divisor_latch.all
                      );
    }
}

static void set_break( tAdapter adapter )
{
    /*
     * Process the set break control bit. Bit 6 of the Line Control
     * Register.
     */
    UART_STATE *asp = & UART_ADAPTER(adapter);

    if (asp->line_control_reg.bits.set_break != asp->break_state )
    {
        asp->break_state = asp->line_control_reg.bits.set_break;
        host_com_ioctl( adapter, HOST_COM_SBRK, 0 );
    }
}

static void set_line_control( tAdapter adapter )
{
    /*
     * Set Number of data bits
     *     Parity bits
     *     Number of stop bits
     */
    UART_STATE *asp = & UART_ADAPTER(adapter);
    int host_line_ctrl;
    const int host_bits[4][2] =
        { HOST_LC_DATA_5 | HOST_LC_STOP_1,
          HOST_LC_DATA_5 | HOST_LC_STOP_15,
          HOST_LC_DATA_6 | HOST_LC_STOP_1,
          HOST_LC_DATA_6 | HOST_LC_STOP_2,
          HOST_LC_DATA_7 | HOST_LC_STOP_1,
          HOST_LC_DATA_7 | HOST_LC_STOP_2,
          HOST_LC_DATA_8 | HOST_LC_STOP_1,
          HOST_LC_DATA_8 | HOST_LC_STOP_2};

    host_line_ctrl =

    // the number of data bits
        host_bits[asp->line_control_reg.bits.word_length]

    // and stop bits
                    [asp->line_control_reg.bits.no_of_stop_bits]

    // and the parity settings
        | ((asp->line_control_reg.bits.parity_enabled == UART_PARITY_OFF)
            ? HOST_LC_PARITY_NONE

            : (asp->line_control_reg.bits.stick_parity == UART_PARITY_STICK)
                ? (asp->line_control_reg.bits.even_parity == UART_PARITY_ODD)
                    ? HOST_LC_PARITY_MARK

                    : HOST_LC_PARITY_SPACE

                : (asp->line_control_reg.bits.even_parity == UART_PARITY_ODD)
                    ? HOST_LC_PARITY_ODD

                    : HOST_LC_PARITY_EVEN
          );

    host_com_ioctl(adapter, HOST_COM_LINE_CTRL, host_line_ctrl);
}

void set_modem_control( tAdapter adapter )
{
    UART_STATE *asp = & UART_ADAPTER( adapter );

    /*
     * Process the loopback control bit
     */

    if (asp->modem_control_reg.bits.loop != asp->loopback_state)
    {
        if (!(asp->loopback_state = asp->modem_control_reg.bits.loop))
        {
            /*
             * Reset the modem status inputs according to the real
             * modem status
             */
            refresh_modem_status( adapter );
        }
    }

    /*
     * Modem control function depends on the loopback control bit
     */
    
    if (asp->loopback_state)
    {
        set_modem_status( adapter, 

        // loop DTR back to DSR
            (asp->modem_control_reg.bits.DTR && HOST_MS_DSR)

        // loop RTS back to CTS
            | (asp->modem_control_reg.bits.RTS && HOST_MS_CTS)
    
        // loop OUT1 back to RI
            | (asp->modem_control_reg.bits.OUT1 && HOST_MS_RI)

        // loop OUT2 back to RLSD
            | (asp->modem_control_reg.bits.OUT2 && HOST_MS_RLSD) );

    }
    else  // not in loopback state
    {
        BYTE host_modem_control = 
            (asp->modem_control_reg.bits.DTR ? HOST_MC_DTR : 0)
            | (asp->modem_control_reg.bits.RTS ? HOST_MC_RTS : 0);

        /*
         * In the real adapter, the OUT1 control bit is not connected
         * so no real modem control change is required
         */

        /*
         * In the real adapter the OUT2 control bit is used to determine
         * whether the communications card can send interrupts; so no
         * real modem control change is required
         */
        asp->out2_state = asp->modem_control_reg.bits.OUT2;

        if (asp->modem_ctrl_state != host_modem_control)
        {
            asp->modem_ctrl_state = host_modem_control;
            host_com_ioctl( adapter, HOST_COM_MODEM_CTRL, host_modem_control );
        }
    }
}

void com_reset(tAdapter adapter)
{
    /*
     * Set host devices to current state
     */
    set_baud_rate( adapter );
    set_line_control( adapter );
    set_break( adapter );
    set_modem_control( adapter );
}

static int port_start[4] = {PC_COM1_PORT_START,
                            PC_COM2_PORT_START,
                            PC_COM3_PORT_START,
                            PC_COM4_PORT_START};
static int port_end[4] = {PC_COM1_PORT_END,
                          PC_COM2_PORT_END,
                          PC_COM3_PORT_END,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线播| 99精品欧美一区| 欧美一区日本一区韩国一区| 亚洲成a人片在线观看中文| 欧美天堂一区二区三区| 一区二区三区国产豹纹内裤在线| 91小视频免费观看| 亚洲香肠在线观看| 欧美日韩国产美女| 久久99精品国产麻豆不卡| 精品1区2区在线观看| 国产成人精品亚洲午夜麻豆| 中文字幕成人网| 91精彩视频在线| 石原莉奈在线亚洲二区| 久久综合狠狠综合久久综合88| 国产精品一区久久久久| 中文字幕亚洲不卡| 欧美国产一区二区在线观看| 日韩视频免费观看高清完整版在线观看| 亚洲不卡av一区二区三区| 正在播放一区二区| 国产麻豆精品95视频| 中文字幕中文乱码欧美一区二区| 91久久精品网| 麻豆国产精品视频| 国产精品少妇自拍| 欧美日韩久久久| 国产麻豆精品在线| 亚洲五月六月丁香激情| 精品国产乱码久久久久久老虎 | 欧美图区在线视频| 男女男精品网站| 亚洲欧洲精品成人久久奇米网| 欧美日韩成人激情| 国产成人日日夜夜| 亚洲国产精品嫩草影院| 国产精品全国免费观看高清| 欧美高清视频一二三区| 成人免费观看视频| 人妖欧美一区二区| 亚洲精品乱码久久久久久久久| 欧美成人一区二区三区片免费| av成人免费在线| 韩国v欧美v日本v亚洲v| 亚洲午夜在线电影| 国产精品女主播av| 亚洲精品在线观看网站| 欧洲在线/亚洲| 成人aa视频在线观看| 麻豆免费精品视频| 香港成人在线视频| 亚洲免费观看高清完整版在线观看| 欧美r级在线观看| 精品视频999| 91网站在线观看视频| 激情都市一区二区| 日本强好片久久久久久aaa| 椎名由奈av一区二区三区| 久久精品在线免费观看| 精品少妇一区二区三区在线播放 | 91香蕉视频污| 国产成都精品91一区二区三| 日本不卡视频在线| 午夜成人免费电影| 亚洲老司机在线| 日韩一级二级三级精品视频| 色综合久久久久网| 懂色av一区二区三区免费观看| 日韩激情中文字幕| 亚洲一本大道在线| 一区二区三区不卡在线观看 | 欧美视频在线播放| 91网上在线视频| 盗摄精品av一区二区三区| 精品无人码麻豆乱码1区2区| 青青草国产成人av片免费| 午夜精品在线视频一区| 亚洲成va人在线观看| 亚洲高清不卡在线观看| 亚洲成年人影院| 亚洲成a人v欧美综合天堂| 亚洲综合一区二区三区| 亚洲国产精品人人做人人爽| 亚洲一区二区三区四区在线免费观看| 亚洲另类在线视频| 一个色综合网站| 一区二区三区四区五区视频在线观看| 国产精品女上位| 亚洲日本韩国一区| 亚洲综合色噜噜狠狠| 午夜私人影院久久久久| 日本成人在线视频网站| 精品影视av免费| 成人性色生活片免费看爆迷你毛片| 丁香亚洲综合激情啪啪综合| av一区二区三区四区| 在线影视一区二区三区| 欧美日韩国产精品自在自线| 日韩三级在线观看| 国产精品午夜在线| 一区二区日韩电影| 蓝色福利精品导航| 国产精品一级在线| 91丨porny丨蝌蚪视频| 欧美亚洲图片小说| 日韩视频一区二区三区在线播放| 日韩美女主播在线视频一区二区三区| 精品国产欧美一区二区| 久久综合色播五月| 国产精品国产三级国产三级人妇| 国产精品久久久久久久蜜臀| 亚洲福利一二三区| 日韩美女久久久| 五月婷婷综合激情| 日韩高清在线不卡| 精品一区二区三区不卡| 99精品桃花视频在线观看| 日本高清免费不卡视频| 精品国精品自拍自在线| 国产欧美一区二区精品久导航| 亚洲男同性视频| 亚洲成人www| 成人不卡免费av| 欧美日韩精品欧美日韩精品| 国产亚洲福利社区一区| 亚洲欧美区自拍先锋| 久久国产综合精品| 国产一区高清在线| 色吧成人激情小说| 欧美精品一二三四| 国产精品水嫩水嫩| 免费美女久久99| 波多野洁衣一区| 精品剧情在线观看| 亚洲免费观看视频| 懂色av一区二区三区免费看| 欧美色图免费看| 国产午夜精品久久久久久久| 亚洲午夜激情网页| 久久国产精品一区二区| 99国产麻豆精品| 日韩欧美国产综合在线一区二区三区| 亚洲人成在线播放网站岛国| 久热成人在线视频| 欧美男人的天堂一二区| 久久伊人蜜桃av一区二区| 亚洲高清免费一级二级三级| 91免费在线视频观看| 精品88久久久久88久久久| 日韩成人精品在线观看| 91丨九色丨尤物| 中文字幕一区二区5566日韩| 美脚の诱脚舐め脚责91| 欧美电影在线免费观看| 亚洲欧洲一区二区三区| 成人亚洲精品久久久久软件| 国内精品伊人久久久久影院对白| 欧美军同video69gay| 一区二区三区国产| www.激情成人| 国产欧美一区二区在线| 精品制服美女久久| 欧美日韩国产美| 亚洲欧美综合网| 日韩国产一二三区| 欧美亚洲综合久久| 亚洲手机成人高清视频| 色综合久久99| 国产精品进线69影院| 9i在线看片成人免费| 国产日本亚洲高清| 成人高清视频在线| 91精品国产一区二区三区蜜臀| 五月婷婷色综合| 91精品国产乱| 日韩精品一级中文字幕精品视频免费观看| 欧美午夜影院一区| 一区二区三区小说| 欧美中文字幕一二三区视频| 一区二区中文视频| 欧美午夜精品免费| 午夜免费久久看| 欧美精品丝袜中出| 久久成人综合网| 亚洲精品在线观看网站| 成人国产视频在线观看| 国产精品午夜免费| 欧美中文字幕一区二区三区| 手机精品视频在线观看| 日韩午夜激情视频| 国产成人小视频| 国产精品免费看片| caoporn国产精品| 国产精品国产精品国产专区不蜜| 成人高清在线视频| 亚洲精品老司机| 欧美一区永久视频免费观看| 喷白浆一区二区| 国产精品久久午夜夜伦鲁鲁|