?
This commit is contained in:
138
5i24/utils/dos/source/PCI.PAS
Executable file
138
5i24/utils/dos/source/PCI.PAS
Executable file
@@ -0,0 +1,138 @@
|
||||
const
|
||||
{PCI function identifier in AH }
|
||||
|
||||
PCI_Function_ID : byte = $B1;
|
||||
|
||||
{ PCI function number in AL }
|
||||
|
||||
PCI_BIOS_Present : byte = $01;
|
||||
PCI_Find_PCI_Device : byte = $02;
|
||||
PCI_Find_PCI_ClassCode : byte = $03;
|
||||
PCI_Generate_Special_Cycle : byte = $06;
|
||||
PCI_Read_Config_Byte : byte = $08;
|
||||
PCI_Read_Config_Word : byte = $09;
|
||||
PCI_Read_Config_DWord : byte = $0A;
|
||||
PCI_Write_Config_Byte : byte = $0B;
|
||||
PCI_Write_Config_Word : byte = $0C;
|
||||
PCI_Write_Config_DWord : byte = $0D;
|
||||
PCI_Get_IRQ_Routing_Options : byte = $0E;
|
||||
PCI_Set_PCI_IRQ : byte = $0F;
|
||||
|
||||
{ function results in AH }
|
||||
|
||||
PCI_Result_Successful : byte = $00;
|
||||
PCI_Function_Not_Supported : byte = $81;
|
||||
PCI_Bad_Vendor_ID : byte = $83;
|
||||
PCI_Device_Not_Found : byte = $86;
|
||||
PCI_Bad_Register_Number : byte = $87;
|
||||
PCI_Set_Failed : byte = $88;
|
||||
PCI_Buffer_Too_Small : byte = $89;
|
||||
|
||||
PCIStr : word = $4350; {'CP'}
|
||||
|
||||
{PCI Command register bits }
|
||||
PCICommandRegOffset = 4;
|
||||
PCICommandRegIOEnable : word = $0001;
|
||||
PCICommandRegMEMEnable : word = $0002;
|
||||
PCICommandRegMasterEnable : word = $0004;
|
||||
|
||||
function PCIBIOSPresent : boolean;
|
||||
var flag : boolean;
|
||||
begin
|
||||
asm
|
||||
mov ah,PCI_Function_ID
|
||||
mov al,PCI_BIOS_Present
|
||||
int $1A
|
||||
mov flag,false;
|
||||
or ah,ah
|
||||
jnz @exit
|
||||
cmp dx,PCIStr;
|
||||
jnz @exit
|
||||
mov flag,true
|
||||
@exit:
|
||||
end;
|
||||
PCIBIOSPresent := flag;
|
||||
end;
|
||||
|
||||
function FindPCIDevice(deviceid,vendorid,index : word;var busnum,devnum: byte) : boolean;
|
||||
var
|
||||
flag : boolean;
|
||||
lbusnum,ldevnum : byte;
|
||||
|
||||
begin
|
||||
asm
|
||||
mov ah,PCI_Function_ID
|
||||
mov al,PCI_Find_PCI_Device
|
||||
mov cx,deviceid
|
||||
mov dx,vendorid
|
||||
mov si,index
|
||||
int $1A
|
||||
mov flag,false;
|
||||
or ah,ah
|
||||
jnz @exit
|
||||
mov lbusnum,bh
|
||||
mov ldevnum,bl
|
||||
mov flag,true
|
||||
@exit:
|
||||
end;
|
||||
busnum := lbusnum;
|
||||
devnum := ldevnum;
|
||||
FindPCIDevice := flag;
|
||||
end;
|
||||
|
||||
function ReadPCIConfigWord(busnum,devnum: byte;regnum:word; var configdata :word) : boolean;
|
||||
var
|
||||
flag : boolean;
|
||||
lbusnum,ldevnum : byte;
|
||||
lregnum,lconfigdata : word;
|
||||
|
||||
begin
|
||||
lbusnum := busnum;
|
||||
ldevnum := devnum;
|
||||
lregnum := regnum;
|
||||
asm
|
||||
mov ah,PCI_Function_ID
|
||||
mov al,PCI_Read_Config_Word
|
||||
mov bh,lbusnum
|
||||
mov bl,ldevnum
|
||||
mov di,lregnum
|
||||
int $1A
|
||||
mov flag,false;
|
||||
or ah,ah
|
||||
jnz @exit
|
||||
mov lconfigdata,cx
|
||||
mov flag,true
|
||||
@exit:
|
||||
end;
|
||||
configdata := lconfigdata;
|
||||
ReadPCIConfigWord := flag;
|
||||
end;
|
||||
|
||||
function WritePCIConfigWord(busnum,devnum: byte;regnum:word;configdata :word) : boolean;
|
||||
var
|
||||
flag : boolean;
|
||||
lbusnum,ldevnum : byte;
|
||||
lregnum,lconfigdata : word;
|
||||
|
||||
begin
|
||||
lbusnum := busnum;
|
||||
ldevnum := devnum;
|
||||
lregnum := regnum;
|
||||
lconfigdata := configdata;
|
||||
asm
|
||||
mov ah,PCI_Function_ID
|
||||
mov al,PCI_Write_Config_Word
|
||||
mov bh,lbusnum
|
||||
mov bl,ldevnum
|
||||
mov di,lregnum
|
||||
mov cx,lconfigdata
|
||||
int $1A
|
||||
mov flag,false;
|
||||
or ah,ah
|
||||
jnz @exit
|
||||
mov flag,true
|
||||
@exit:
|
||||
end;
|
||||
WritePCIConfigWord := flag;
|
||||
end;
|
||||
|
||||
Reference in New Issue
Block a user