From 0cf951a2faadfe3c4af96a3d1b7785638ea21493 Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Mon, 23 Apr 2018 11:43:57 +0800 Subject: PCI9052 --- PCI9052/PCI.org | 47 +++++++++++++++++++++++++ PCI9052/PCI9052.ASM | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 PCI9052/PCI.org create mode 100644 PCI9052/PCI9052.ASM diff --git a/PCI9052/PCI.org b/PCI9052/PCI.org new file mode 100644 index 0000000..1f721f8 --- /dev/null +++ b/PCI9052/PCI.org @@ -0,0 +1,47 @@ +* PCI + - 配置空间: 映射到接口卡上256字节的特殊功能寄存器 + - 访问: 物理连接情况 + - 总线号: 0-255(8bit) + - 设备号: 0-31(5bit) + - 功能号: 0-8(3bit) + - 通过端口访问: + - 地址端口: 0xCF8, 把总线号,设备号,功能号,偏移写入该端口 + - 数据端口: 0xCFC +* PCI BIOS 系统调用 + AH=B1H + INT 1AH (BIOS中断) + - AL=01H + - 检查PCI是否存在 + - AH=00 存在 + BL: 接口版本 + CL: 最后一个局部总线号 + CF=0 存在BIOS + - AL=02H CX=DevID DX=VenderID SI:索引号(区别设备号和厂商号相同的设备) + - PCI设备查找 + - BH=总线号 + BL:高5位设备号,低3位功能号 + AH=00 检测成功 86 未发现 + CF=0 成功 + - AL=03H ECX低3字节为分类代码 SI:索引号 + - PCI类码查找 + - 返回值同AL=02H + - AL=08H BH=总线号 BL=设备号:功能号 DI=寄存器号(配置空间地址) + - 读配置字节 + - CL=读出的配置字节 + - AH=00 成功 + CF=0 成功 + - AL=09H BH,BL,DI(0,2,4)意义同上 + - 读配置字 + - CX=读出的配置字,其余同上 + - AL=0BH,0CH BH,BL,DI意义同上,CL/CX=写入内容 + - 写配置字节/字 + - AH=00,CF=0 表示成功 +* PCI 9052 + 设备ID: 9050H 厂商ID: 10B5H + 1. 基址寄存器 0 + 这部分被作为内存方式访问 PCI9052 配置寄存器的地址。 + 2. 基址寄存器 1 + 这部分被作为 IO 方式访问 PCI9052 配置寄存器的地址。 + 3. 基址寄存器 3 + 这部分是我们实验中需要使用的 IO 空间 + diff --git a/PCI9052/PCI9052.ASM b/PCI9052/PCI9052.ASM new file mode 100644 index 0000000..a46d748 --- /dev/null +++ b/PCI9052/PCI9052.ASM @@ -0,0 +1,99 @@ +stack segment para stack + dw 128h dup (0) +stack ends + +data segment + notfound db 'NOT FOUND!', 0dh, 0ah, '$' + io db 0dh, 0ah, 'IO ADDRESS IS: $' +data ends + +code segment + assume cs:code, ss:stack, ds:data +start: + mov ax, data + mov ds, ax + mov ah, 0b1h + mov al, 2 + mov cx, 9050h ; Device ID + mov dx, 10b5h ; Vender ID + mov si, 0 + int 1ah + cmp ah, 0 + jz got + mov dx, offset notfound + mov ah, 9 + int 21h + jmp gout +got: + mov ax, bx + call disp + mov dl, 0ah + mov ah, 2 + int 21h + mov dl, 0dh + int 21h + mov di, 0 +loop1: + mov ax, 0b109h + int 1ah + mov ax, cx + call disp + mov dl, ' ' + mov ah, 2 + int 21h + inc di + inc di + cmp di, 40h + jl loop1 + mov dx, offset io + mov ah, 9 + int 21h + mov ax, 0b109h + mov di, 1ch ; base reg #3 + int 1ah + and cx, 0fffeh + mov ax, cx + call disp +gout: + mov ah, 4ch + int 21h + +disp proc near + push bx + push cx + mov bx, ax + mov cx, 4 +lloop1: + mov ax, bx + call disp2 + push cx + mov cl, 4 + shl bx, cl + pop cx + loop lloop1 + pop cx + pop bx + ret +disp endp + +disp2 proc near + push dx + push cx + and ah, 0f0h + mov cl, 4 + shr ah, cl + mov dl, ah + cmp dl, 9 + jle num + add dl, 7 +num: + add dl, 30h + mov ah, 02h + int 21h + pop cx + pop dx + ret +disp2 endp +code ends + end start + -- cgit v1.2.3