
  MS-DOSpaPCIhCoɂ                                            
                                                                          
  Copyright ADTEK SYSTEM SCIENCE Co.,Ltd.                                 
  Rev.1.11                                                                
                                                                          


@{́AMS-DOS 5.0ȍ~ aPCI{[hfoCXhCo(ȉuaPCIhCov)
"APIC21DV.EXE"gp@L܂B


aPCIhCȏgݍ

@aPCIhCȏgݍ݂ɂ́A

    1.CONFIG.SYSɒǉ
    2.DOSvvgR}hs

̂Q̕@܂B

1.MS-DOSCONFIG.SYSt@CɈȉ̍sǉĂB


  DEVICE=x:\PATH\APIC21DV.EXE     


2.MS-DOSvvgŃhCo풓ꍇ͈ȉ̂悤ɍs܂B


  x:>APIC21DV /I                  


@aPCIhCõR}h/IvV́Aȉ̒ʂłB

    APIC21DV [] [߼]

               
        /I      APIC21DV.EXEذɏ풓܂D
        /R      APIC21DV.EXȄ풓܂D
        /Ddddd[,vvvv]
                w肳ꂽaPCIްނؿ\܂D
                    dddd = PCIްނ޲ID
                    vvvv = PCIްނID
        /Xdddd[,vvvv]
                w肳ꂽaPCIްނؿ\܂D
                PCI۰ׂؿ\܂D
                    dddd = PCIްނ޲ID
                    vvvv = PCIްނID
        /?      gp@\܂D

    ߼
        /P       ʖɕ\ꎞ~܂D
        /J       {ŕ\܂D
        /E       pŕ\܂D

@aPCI{[h̃\[X\ꍇAu/DvIvVgpB
@aPCI{[hɂA\[X\́uI/O Port addressvQ\ꍇ
܂B
@ڂ́uI/O Port addressvInterrupt Control AddressA
@ڂ́uI/O Port addressvI/O Control Address܂B
@̂ݕ\ꍇaPCII/O|[gAhXɂȂ܂B

:
@aPCIhCoMS-DOS Ver.5.0ȍ~ł̂ݓ\łB
@WindowsMS-DOSvvgł͕̓ۏ؂܂B



aPCIhCo𗘗pAvP[V쐬@

@MS-DOSaPCI{[h𐧌䂷AvP[VvO̍쐬@ɂ
܂BȉɂaPCIhCoւ̃ANZX@LqĂ܂B

@ۂ̃vO~OɂẮADOS fBNgCTv\[X
Bꂩ鏈́ATv\[X"APCICTRL.C"
֐ƂĂ܂Ƃ߂Ă܂B܂AaPCIhCoƒʐMf[^\
"APCISRVS.H"ɒ`Ă܂B

:
@MS-DOSpTv\[XMS-C6/7TC++4œmFsĂ܂B
@̑RpCgp̏ꍇ̓\[X̏CKvɂȂꍇL܂B
@Tv\[XMS-DOSœ\Ȏst@C𐶐łRpC
̂݃RpC\łB


<aPCIfoCX擾>

(1) aPCIhCoI[v

@aPCIpaPCIhCoĆuopen()v֐gpăI[v܂B
hCoI[vꍇ́At@Cł͂ȂfoCXŃI[v܂B
@foCX "APCIINF$" łB

:
void main( void ){
{
int     handle;

    handle = open("APCIINF$",O_CREAT | O_RDWR | O_BINARY,S_IWRITE | S_IREAD ) ;
    if ( -1 != handle ){
        /*
        //  AvP[V̏
        */
        close( handle );
    }
}

@aPCIhCoɑgݍ܂ĂȂꍇ́AI[vG[܂B
G[ꍇ"CONFIG.SYS"LqĂ邩AĊmFĂB

@ۂaPCIhCõI[v@ɂẮATv\[X"APCICTRL.C"
uApciGetDriverFunc()v֐B


(2) I/ORg[[haPCIhCõT[rX[`AhX擾

@I/ORg[[hsAaPCIhCõT[rX[`̃AhX
擾܂B
@I/ORg[[hɂẮAMS-DOS̉B

@ۂI/ORg[[h̎s@ɂẮATv\[X"APCICTRL.C"
́uioctrlRead()v֐B


(3) aPCIhCõT[rX[`̌Ăяo

@I/ORg[[hŎ擾aPCIhCõT[rX[`ĂсA
aPCIhCõo[WfoCXI/OAhXȂǂ̏ǂݏo܂B

@aPCIhCõT[rX[`ɓnR}h͈ȉ̒ʂłB
@ĂяoɁuAXvWX^ɐݒ肵܂B

#define APCIC_GET_VERSION       0u      /* ްޮݔԍ擾 */
#define APCIC_FIND_RESOURCE     1u      /* ؿT */

@APIC21ڂaPCI{[hł́A荞ݐp̃|[g擾邽
߂ɉL̃R}hpӂĂ܂B

#define APCIC_GET_ADAPTER_PORT  2u      /* ؿ擾 */

@aPCIhCõT[rX[`Ԃsʂ͈ȉ̒ʂłB
@sIɁuAXvWX^ɐݒ肳܂B

#define CMD_COMPLETE            0u      /* ނ͐I */
#define INVALID_CMD             1u      /* ŶȂނł */
#define INVALID_PTR             2u      /* үނ܂ڽݽ߲ */

@aPCIhCõT[rX[`ɓn\͈̂ȉ̒ʂłB
@ĂяoɁuES:DIvWX^ɍ\̂̃AhXݒ肵܂B

typedef struct _APCI_CMD_PACKET {
    void far    *lpMessage;             /* ײĂүޯ̧ւ߲ */
    void far    *lpResponse;            /* ײĂւڽݽޯ̧ւ߲ */
} APCI_CMD_PACKET, far *LPAPCI_CMD_PACKET;

@L̒`́ATv\[X"APCISRVS.H"ɒ`Ă܂B

@T[rX[`̌ĂяóuAPCI_CMD_PACKETv\̂ɁAT[rX[`
΂Ȃǂ̍\̂̃|C^ƃT[rX[`f[^擾邽߂
f[^\̃|C^ݒ肵AWX^ɃR}hƁuAPCI_CMD_PACKETv\̂
|C^ݒ肵T[rX[`s܂B

@ۂaPCIhCõT[rX[`Ăяo@ɂẮATv\[X
"APCICTRL.C"́uServiceFunc()v֐B


(4) aPCIhCõo[Wǂݏo

@I/ORg[[hŎ擾aPCIhCõT[rX[`ĂсA
aPCIhCõo[Wǂݏo܂B
@aPCIhCõT[rX[`ɓnR}h"APCISRVS.H"ɒ`
uAPCIC_GET_VERSIONvgp܂B
@aPCIhCõo[W͉L̍\̂ɐݒ肳܂B
@ȉ̍\̂"APCISRVS.H"ɒ`Ă܂B

typedef struct _APCI_VER_RES {
    ushort      wPciBiosVersion;    /* PCI BIOSްޮݔԍ */
    ushort      wDriverVersion;     /* {ײންޮݔԍ */
} APCI_VER_RES, far *LPAPCI_VER_RES;

uAPCI_CMD_PACKETv\̂Ƀo[Wԍݒ肷\̂̃|C^ݒ肵
T[rX[`Ăт܂B

:
ushort getPciVer( void )
{
APCI_VER_RES        ver;
APCI_CMD_PACKET     pkt;
ushort              pkt_seg,
                    pkt_ofs,
                    res;
void far            *ptr;

    pkt.lpMessage  = NULL;
    pkt.lpResponse = &ver;          /* ްޮ݂ݒ肷\߲̂ */
    ptr = (void far *)&pkt;
    pkt_seg = FP_SEG( ptr );        /* ıڽ擾 */
    pkt_ofs = FP_OFF( ptr );        /* ̾ıڽ擾 */
    asm {
        push    es
        mov     ax,pkt_seg
        mov     es,ax                       /* es <- ıڽ */
        mov     di,pkt_ofs                  /* di <- ̾ıڽ */
        mov     ax,APCIC_GET_VERSION        /* ax <-  */
        call    dword ptr T[rX[`  /* ޽ٰ݂ق */
        pop     es
        mov     res,ax
    }
    return res;                             /* sʂԂ */
}

@ۂaPCIhCõo[Wǂݍݕ@ɂẮATv\[X
"APCICTRL.C"́uApciGetVersion()v֐B


(5) aPCIhCõT[rX[`ĂяoăfoCX̏ǂݏo

@I/ORg[[hŎ擾aPCIhCõT[rX[`ĂсA
foCXI/OAhXȂǂ̏ǂݏo܂B
@aPCIhCõT[rX[`ɓnR}h"APCISRVS.H"ɒ`
uAPCIC_FIND_RESOURCEvgp܂B

@foCXݒ̏̐ݒ͉L̍\̂ɐݒ肵܂B

typedef struct _APCI_FIND_MES {
    ushort  wIndex;             /* ޯ */
    ushort  wDeviceID;          /* ޲ID */
} APCI_FIND_MES, far *LPAPCI_FIND_MES;

@foCX͉̏L̍\̂ɐݒ肳܂B

typedef struct _APCI_FIND_RES {
    ushort  wIndex;             /* ޯ */
    ushort  wVendorID;          /* ID */
    ushort  wDeviceID;          /* ޲ID */
    ushort  wNumMemWindows;     /* ذީ */
    ulong   dMemBase;           /* ذީ ް ڽ */
    ulong   dMemLength;         /* ذީ */
    ushort  wNumIOPort;         /* I/Oީ */
    ushort  wIOPortBase;        /* I/Oީ ް ڽ */
    ushort  wIOPortLength;      /* I/Oީ */
    ushort  wNumIRQs;           /* IRQ */
    uchar   bIRQRegisters;      /* gpIRQ */
} APCI_FIND_RES, far *LPAPCI_FIND_RES;

@foCXݒ̏ݒ肷邽߂̍\̂ւ̃|C^ƃfoCX
ݒ肷\̂ւ̃|C^uAPCI_CMD_PACKETv\̂ɐݒ肵T[rX[`
Ăт܂B

@L̃f[^̂AaPCI{[hAvP[VŎgp͈̂ȉ̍
łB

    EI/OީiwNumIOPortj
        I[vI/OEChEBaPCI͂PŒB
    EI/Oީ ް ڽiwIOPortBasej
        I[vI/OEChẼx[XAhXB
    EI/OީiwIOPortLengthj
        I[vI/OEChEI/OB
    EIRQiwNumIRQsj
        荞ݐB
    EgpIRQibIRQRegistersj
        蓖Ăꂽ荞ݔԍB

@\̂̓oCgACgŎgpĂB

:
ushort getInfo( ushort wDeviceID, ushort wNum )
{
APCI_FIND_MES       msg;
LPAPCI_FIND_RES     inf;
APCI_CMD_PACKET     pkt;
ushort              pkt_seg,
                    pkt_ofs,
                    res;
void far            *ptr;

    msg.wDeviceID  = wDeviceID;         /* ޲ID */
    msg.wIndex     = wNum;              /* ޯ# */
    pkt.lpMessage  = &msg;
    pkt.lpResponse = &inf;              /* ޲ݒ肷\߲̂ */
    ptr = (void far *)&pkt;
    pkt_seg = FP_SEG( ptr );            /* ıڽ擾 */
    pkt_ofs = FP_OFF( ptr );            /* ̾ıڽ擾 */
    asm {
        push    es
        mov     ax,pkt_seg
        mov     es,ax                       /* es <- ıڽ */
        mov     di,pkt_ofs                  /* di <- ̾ıڽ */
        mov     ax, APCIC_FIND_RESOURCE     /* ax <-  */
        call    dword ptr T[rX[`  /* ޽ٰ݂ق */
        pop     es
        mov     res,ax
    }
    return res;                             /* sʂԂ */
}

@ۂ̃foCX̏ǂݍݖ@ɂẮATv\[X"APCICTRL.C"
uApciGetDeviceInfo()v֐B



<|[g̓o͂ɂ>

@aPCIhCõT[rX[`ĂяoăfoCX̏擾
uAPCI_FIND_RESv\̂̃ouwIOPortBasevx[XAhXƂ
o͂s܂B

:
void inout( LPAPCI_FIND_RES Rsp )
{
uchar   dat;

    dat = inportb( Rsp->wIOPortBase + 0u );     /* ްڽ + 0 */
    outportb( Rsp->wIOPortBase + 0u, dat );     /* ްڽ + 0o */
    dat = inportb( Rsp->wIOPortBase + 1u );     /* ްڽ + 1 */
    outportb( Rsp->wIOPortBase + 1u, dat );     /* ްڽ + 1o */
}

@ۂ̃foCX̓o͂ɂẮATv\[X"APCICTRL.C"
uApciInPort()vƁuApciOutPort()v֐B



<荞ݐɂ>

(1) APIC21𓋍ڂĂȂaPCI{[h̊荞ݐ

@APIC21ڂĂȂaPCI{[hł́A荞ݐL̂悤
s܂B

@aPCIhCõT[rX[`ĂяoăfoCX̏擾
uAPCI_FIND_RESv\̂̃ouwIOPortBasevx[XAhXƂ
L̃|[ggp܂B

    荞ݐ䃌WX^            ްڽ + 0xf
    荞݃Xe[^XWX^      ްڽ + 0xf

@荞ݐ䃌WX^̃rbgATCLɋL܂B

    BIT0    1 IRQ0 荞݋
    BIT1    1 IRQ1 荞݋
    BIT2    1 IRQ2 荞݋
    BIT3    1 IRQ3 荞݋
    BIT4    1Ŋ荞݃tONA

@荞݃Xe[^XWX^̃rbgATCLɋL܂B

    BIT0    1 IRQ0 荞݃T[rX󂯂
    BIT1    1 IRQ1 荞݃T[rX󂯂
    BIT2    1 IRQ2 荞݃T[rX󂯂
    BIT3    1 IRQ3 荞݃T[rX󂯂

@ۂ̃foCX̊荞ݐẮATv\[X"APCICTRL.C"
uApciGetIrq()vƁuApciSetIen()v֐B


(2) APIC21aPCI{[h̊荞ݐ

@APIC21ڂaPCI{[hł́A荞ݐL̂悤ɍs܂B

@I/ORg[[hŎ擾aPCIhCõT[rX[`ĂсA
foCX Interrupt Control Address ߰ ǂݏo܂B
@aPCIhCõT[rX[`ɓnR}h"APCISRVS.H"ɒ`
uAPCIC_GET_ADAPTER_PORTvgp܂B

@foCXݒ̏̐ݒ͉L̍\̂ɐݒ肵܂B

typedef struct _APCI_GET_ADP_MES {
    ushort  wIndex;             /* ޯ */
    ushort  wDeviceID;          /* ޲ID */
} APCI_GET_ADP_MES, far *LPAPCI_GET_ADP_MES;

@foCX Interrupt Control Address ߰ ͉L̍\̂ɐݒ肳܂B

typedef struct _APCI_GET_ADP_RES {
    ushort  wIndex;             /* ޯ */
    ushort  wVendorID;          /* ID */
    ushort  wDeviceID;          /* ޲ID */
    ushort  wNumIOPort;         /* I/Oީ */
    ushort  wIOPortBase;        /* I/Oީ ް ڽ */
    ushort  wIOPortLength;      /* I/Oީ */
} APCI_GET_ADP_RES, far *LPAPCI_GET_ADP_RES;

@foCXݒ̏ݒ肷邽߂̍\̂ւ̃|C^ƃfoCX
Interrupt Control Address ߰ ݒ肷\̂ւ̃|C^
uAPCI_CMD_PACKETv\̂ɐݒ肵T[rX[`Ăт܂B

@Interrupt Control Address ߰  ް ڽ ́uwIOPortBasevɐݒ肳܂

@\̂̓oCgACgŎgpĂB

:
ushort getAdapterInfo( ushort wDeviceID, ushort wNum )
{
APCI_GET_ADP_MES    msg;
APCI_GET_ADP_RES    inf;
APCI_CMD_PACKET     pkt;
ushort              pkt_seg,
                    pkt_ofs,
                    res;
void far            *ptr;

    msg.wDeviceID  = wDeviceID;         /* ޲ID */
    msg.wIndex     = wNum;              /* ޯ# */
    pkt.lpMessage  = &msg;
    pkt.lpResponse = &inf;              /* ޲ݒ肷\߲̂ */
    ptr = (void far *)&pkt;
    pkt_seg = FP_SEG( ptr );            /* ıڽ擾 */
    pkt_ofs = FP_OFF( ptr );            /* ̾ıڽ擾 */
    asm {
        push    es
        mov     ax,pkt_seg
        mov     es,ax                       /* es <- ıڽ */
        mov     di,pkt_ofs                  /* di <- ̾ıڽ */
        mov     ax, APCIC_GET_ADAPTER_PORT  /* ax <-  */
        call    dword ptr T[rX[`  /* ޽ٰ݂ق */
        pop     es
        mov     res,ax
    }
    return res;                             /* sʂԂ */
}

@ۂ̃foCX̊荞ݐẮATv\[X"APCICTRL.C"
uApciGetAdapterInfo()v֐B


@aPCIhCõT[rX[`ĂяoăfoCX̏擾
uAPCI_GET_ADP_RESv\̂̃ouwIOPortBasevx[XAhXƂ
L̃|[ggp܂B

    荞݃Xe[^XWX^      ްڽ + 0x2
    荞ݗvNAWX^      ްڽ + 0x3
    荞ݐݒ背WX^            ްڽ + 0xe
    듮邽ߏLȊÕ|[gɂ͐΂ɃANZXȂŉB

@e|[g̃rbgATĆA{[h̃}jAQƂĉB

@ۂ̃foCX̊荞ݐẮATv\[X"APCICTRL.C"
uApciGetIfr()vƁuApciClrIrq()vƁuApciSetIrq()v֐B



<TvAvP[Vɂ>

@aPCIhCo𗘗paPCI{[h𐧌䂷TvAvP[V
    "SAMPLEx.C/EXE"
YtĂ܂B

@TvAvP[V̓ɂĂ͂̓\[XvOQƂĉB



