USB support
git-svn-id: svn://kolibrios.org@3520 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
|
||||
; Detect all BIOS hard drives.
|
||||
; diamond, 2008
|
||||
; Do not include USB mass storages. CleverMouse, 2013
|
||||
|
||||
xor cx, cx
|
||||
mov es, cx
|
||||
@@ -24,21 +25,40 @@ bdds:
|
||||
test ah, ah
|
||||
jz bddc
|
||||
inc cx
|
||||
; We are going to call int 13h/func 48h, Extended get drive parameters.
|
||||
; The latest version of the EDD specification is 3.0.
|
||||
; There are two slightly incompatible variants for version 3.0;
|
||||
; original one from Phoenix in 1998, see e.g.
|
||||
; http://www.t10.org/t13/technical/d98120r0.pdf, and T13 draft,
|
||||
; http://www.t13.org/documents/UploadedDocuments/docs2004/d1572r3-EDD3.pdf
|
||||
; T13 draft addresses more possible buses, so it gives additional 8 bytes
|
||||
; for device path.
|
||||
; Most BIOSes follow Phoenix, but T13 version is also known to be used
|
||||
; (e.g. systems based on AMD Geode).
|
||||
; Fortunately, there is an in/out length field, so
|
||||
; it is easy to tell what variant was selected by the BIOS:
|
||||
; Phoenix-3.0 has 42h bytes, T13-3.0 has 4Ah bytes.
|
||||
; Note that 2.0 has 1Eh bytes, 1.1 has 1Ah bytes; both variants of 3.0 have
|
||||
; the same structure for first 1Eh bytes, compatible with previous versions.
|
||||
; Note also that difference between Phoenix-3.0 and T13-3.0 starts near the
|
||||
; end of the structure, so the current code doesn't even need to distinguish.
|
||||
; It needs, however, give at least 4Ah bytes as input and expect that BIOS
|
||||
; could return 42h bytes as output while still giving all the information.
|
||||
mov ah, 48h
|
||||
push ds
|
||||
push es
|
||||
pop ds
|
||||
mov si, 0xA000
|
||||
mov word [si], 1Eh
|
||||
mov word [si], 4Ah
|
||||
mov ah, 48h
|
||||
int 13h
|
||||
pop ds
|
||||
jc bddc2
|
||||
inc byte [es:0x907F]
|
||||
cmp word [es:si], 1Eh
|
||||
jb bddl
|
||||
jb .noide
|
||||
cmp word [es:si+1Ah], 0xFFFF
|
||||
jz bddl
|
||||
jz .noide
|
||||
inc byte [es:0x907F]
|
||||
mov al, dl
|
||||
stosb
|
||||
push ds
|
||||
@@ -61,7 +81,15 @@ bdds:
|
||||
stosw
|
||||
pop ds
|
||||
jmp bddc2
|
||||
bddl:
|
||||
.noide:
|
||||
cmp word [es:si], 42h
|
||||
jb .nousb
|
||||
cmp word [es:si+28h], 'US'
|
||||
jnz .nousb
|
||||
cmp byte [es:si+2Ah], 'B'
|
||||
jz bddc2
|
||||
.nousb:
|
||||
inc byte [es:0x907F]
|
||||
mov al, dl
|
||||
stosb
|
||||
xor ax, ax
|
||||
|
Reference in New Issue
Block a user