User:Superleaf1995/PCI in assembly: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
Content deleted Content added
Added the entire code for PCI ReadWord
 
m Bot: Replace deprecated source tag with syntaxhighlight
 
Line 1: Line 1:
<source lang="asm">
<syntaxhighlight lang="asm">
; AL = BUS
; AL = BUS
; BL = SLOT
; BL = SLOT
Line 66: Line 66:
.lfunc dd 0
.lfunc dd 0
.tmp dw 0
.tmp dw 0
</syntaxhighlight>
</source>


'''WARNING''': Code untested, Ctr+C and Ctr+V at your own risk!
'''WARNING''': Code untested, Ctr+C and Ctr+V at your own risk!

Latest revision as of 06:53, 9 June 2024

; AL = BUS
; BL = SLOT
; CL = FUNC
; DL = OFFSET
; Returns AX as TMP
pciConfigReadWord:
	mov byte [.off], dl
	xor edx, edx
	
	mov byte [.tmp], al
	xor eax, eax ; Only leave AL (assume we are using 386+)
	mov al, byte [.tmp]
	mov dword [.lbus], eax
	
	mov byte [.tmp], bl
	xor ebx, ebx
	mov bl, byte [.tmp]
	mov dword [.lslot], ebx
	
	mov byte [.tmp], cl
	xor ecx, ecx
	mov cl, byte [.tmp]
	mov dword [.lfunc], ecx
	
	; Everything set, now calculate address
	xor eax, eax
	xor ebx, ebx
	xor ecx, ecx
	
	mov ecx, [.lfunc]
	mov ebx, [.lslot]
	mov eax, [.lbus]
	shl eax, 16
	shl ebx, 11
	shl ecx, 8
	mov dl, byte [.off]
	and dl, 0FCh
	
	or eax, ebx
	or eax, ecx
	or eax, edx
	mov ebx, 080000000h
	or eax, ebx
	mov dword [.addr], eax
	
	mov eax, dword [.addr]
	out 0CF8h, eax
	
	in eax, 0CFCh
	mov cl, [.off]
	and cl, 2
	shr eax, cl
	
	mov ebx, 8
	mul ebx
	
	and ax, 0FFFFh
	
	ret

.off	db 0
.addr	dd 0
.lbus	dd 0
.lslot	dd 0
.lfunc	dd 0
.tmp	dw 0

WARNING: Code untested, Ctr+C and Ctr+V at your own risk!