Помогите правильно интерпретировать базовый адрес памяти B0003000h, на котрый отображается пространство регистров устройства.
Сначала приведу часть кода для чтения регистров PCI устройства:
IDEAL
P386
LOCALS
MODEL MEDIUM
SEGMENT sseg para stack 'STACK'
DB 400h DUP(?)
ENDS
DATASEG
VendorID DW ? ;идентификатор изготовителя
DeviceID DW ? ;идентификатор устройства
ClassCode DD ? ;тип устройства
BaseAddress0 DD ? ;базовый адрес 0
BaseAddress1 DD ? ;базовый адрес 1
BaseAddress2 DD ? ;базовый адрес 2
BaseAddress3 DD ? ;базовый адрес 3
BaseAddress4 DD ? ;базовый адрес 4
BaseAddress5 DD ? ;базовый адрес 5
InterruptLine DB ? ;номер используемого прерывания IRQ
BusNumber DB ? ;номер шины
DeviceNumber DB ? ;номер устройства и номер функции
NoPCI DB 12,18,"Система не поддерживает PCI USB",0
NoUSB DB 12,23,"Контроллер USB не найден",0
BadReg DB 12,28,"Неверный номер регистра",0
ENDS
CODESEG
;****************CUT**********************
PROC PCITest
; Опрос PCI-устройств
; Проверить наличие PCI BIOS
mov AX,0B101h
int 1Ah
jc @@PCIBIOSNotFound
cmp EDX,20494350h
jne @@PCIBIOSNotFound
; Найти USB контроллер
mov AX,0B103h
mov ECX,0C0310h
mov SI,0
int 1Ah
jc @@DeviceNotFound
mov [BusNumber],BH
mov [DeviceNumber],BL
; Получить идентификатор изготовителя
mov AX,0B109h ;читать слово
mov DI,0 ;смещение слова
int 1Ah
jc @@BadRegisterNumber
mov [VendorID],CX
; Получить идентификатор устройства
mov AX,0B109h ;читать слово
mov DI,2 ;смещение слова
int 1Ah
jc @@BadRegisterNumber
mov [DeviceID],CX
; Получить тип устройства
mov AX,0B10Ah ;читать двойное слово
mov DI,8 ;смещение слова
int 1Ah
jc @@BadRegisterNumber
shr ECX,8
mov [ClassCode],ECX
; Получить базовый адрес 0
mov AX,0B10Ah ;читать двойное слово
mov DI,10h ;смещение слова
int 1Ah
jc @@BadRegisterNumber
mov [BaseAddress0],ECX
; Получить базовый адрес 1
mov AX,0B10Ah ;читать двойное слово
mov DI,14h ;смещение слова
int 1Ah
jc @@BadRegisterNumber
mov [BaseAddress1],ECX
; Получить базовый адрес 2
mov AX,0B10Ah ;читать двойное слово
mov DI,18h ;смещение слова
int 1Ah
jc @@BadRegisterNumber
mov [BaseAddress2],ECX
; Получить базовый адрес 3
mov AX,0B10Ah ;читать двойное слово
mov DI,1Ch ;смещение слова
int 1Ah
jc @@BadRegisterNumber
mov [BaseAddress3],ECX
; Получить базовый адрес 4
mov AX,0B10Ah ;читать двойное слово
mov DI,20h ;смещение слова
int 1Ah
jc @@BadRegisterNumber
mov [BaseAddress4],ECX
; Получить базовый адрес 5
mov AX,0B10Ah ;читать двойное слово
mov DI,24h ;смещение слова
int 1Ah
jc @@BadRegisterNumber
mov [BaseAddress5],ECX
; Получить номер используемого устройством
; прерывания IRQ
mov AX,0B108h ;читать байт
mov DI,3Ch ;смещение байта
int 1Ah
jc @@BadRegisterNumber
mov [InterruptLine],CL
; *************************CUT******************
@@BadRegisterNumber:
@@DeviceNotFound:
@@PCIBIOSNotFound:
ENDP PCITest
ENDS
END
;***************Результат***************************
;
;BusNumber 00h
;DeviceNumber 13h
;VendorID 0E11h
;DeviceID A0F8h
;ClassCode 0C0310h
;BaseAddress0 00h
;BaseAddress1 00h
;BaseAddress2 00h
;BaseAddress3 00h
;BaseAddress4 B0003000h !
;BaseAddress5 00h
;InterruptLine 09h
;
;*********************************************
; * pointer = getbaseptr(BaseAddress4);
; IOSpace = pointer;
(BaseAddress4 specifies upper 20 bits of the 32 bit starting base adress.
This represents a maximum of 4-KB addressing space for the operation registers)
По адресу BaseAddress4 должен находиться Revision register и,
как сказано в спецификации, всегда должен иметь значение 00000010h,
но при чтении линейного базового адреса IOSpace выводятся какие-то левые коды.
Пожалуйста!
Помогите правильно интерпретировать базовый адрес памяти B0003000h,
промучился с ним уже черти сколько и не знаю, как до него достучаться.