bl=regs.h.bl; //返回的设备号高5位,低3位为功能号 bh=regs.h.bh; //返回的总线号 return(regs.h.ah); //返回状态 }
int getPCIbase0() //获得PCI卡的IO0的地址 {
union REGS regs; //定义用C语言调用BIOS中断所用的寄存器组合
regs.h.ah=0xb1; // regs.h.al=0x09; // regs.x.di=0x14; //PCI regs.h.bl=bl; // regs.h.bh=bh; // int86(0x1a,®s,®s); // iobase0=regs.x.cx; //CX return(regs.h.ah); //}
int getPCIbase1() {
union REGS regs; // regs.h.ah=0xb1; regs.h.al=0x09;
regs.x.di=0x1c; //PCI regs.h.bl=bl; regs.h.bh=bh;
int86(0x1a,®s,®s); iobase1=regs.x.cx; return(regs.h.ah); }
int getPCImembase0() {
调用PCI BIOS中断 配置空间用字的方式读入 配置空间中基地址0的地址
要读入配置空间的PCI卡的设备号和功能号 要读入配置空间的PCI卡的总线号 调用指定的X86中断 为返回的IO0的基地址 返回状态 同上 配置空间基地址1的地址 36
union REGS regs; //同上 regs.h.ah=0xb1; regs.h.al=0x09;
regs.x.di=0x18; //PCI配置空间存储器基地址0的低位地址 regs.h.bl=bl; regs.h.bh=bh;
int86(0x1a,®s,®s); membase0=regs.x.cx; return(regs.h.ah); }
int getPCImembase1() {
union REGS regs; // regs.h.ah=0xb1; regs.h.al=0x09;
regs.x.di=0x1a; //PCI regs.h.bl=bl; regs.h.bh=bh;
int86(0x1a,®s,®s); membase1=regs.x.cx; return(regs.h.ah); }
int getPCIIRQ() {
union REGS regs; // regs.h.ah=0xb1; regs.h.al=0x09;
regs.x.di=0x3c; //PCI regs.h.bl=bl; regs.h.bh=bh;
int86(0x1a,®s,®s);
同上 配置空间存储器基地址0的高位地址 同上 配置空间中断线的地址 37
return(regs.h.cl); } main() {
int err,rt1=0,count1=0,flagm=1,flag1=0; void plus1(); void mydisp1(); int mypckey();
err=findPCIcard(); if (err!=0) {
printf(\ flagm=0; }
err=getPCIbase0();
iobase0=iobase0&0xfffc;
//从PCI配置空间读入的与地址空间有关的数据其bit 0位为1, printf(\//表明此空间为IO空间参与PCI总线地址译码 err=getPCIbase1(); iobase1=iobase1&0xfffc;
printf(\ err=getPCImembase1(); err=getPCImembase0();
membase0=membase0+membase1<<16; //左移16位,将高位地址变换成双字中的高位字 printf(\ err=getPCIIRQ();
printf(\
38
ic82530=ic82530+iobase1; //获取8253 T0 T1 控制寄存器的地址 ic82531=ic82531+iobase1; ic8253type=ic8253type+iobase1;
ic8255a=ic8255a+iobase1; //获取8255 A、B口和控制寄存器的地址
ic8255b=ic8255b+iobase1; ic8255type=ic8255type+iobase1;
printf(\
outportb(ic8255type,0x80); //
outportb(ic8255a,0x0ff); outportb(ic8255b,0x0ff);
outportb(ic8253type,0x3e); // outportb(ic82530,0x0ff); outportb(ic82530,0x0f);
outportb(ic8253type,0x5e); outportb(ic82531,0x8);
do // {
rt1=inportb(ic82531); // if (rt1==2) // { if (flag1==0) // {
flag1=1; //
显示提示字符初始化8255 初始化8253 主循环 读8253 T1 判断是否计数到2 判断是否计过2 若是则置标志位
39
count1=count1+1; //count1加1 if (count1==2) //判断是否计过两次2 {
count1=0; //若是则清count1 plus1(); //调加1子程序
} }
} else
flag1=0; //若rt1不为2,则清flag1 mydisp1(); //调显示子程序 flagm=mypckey(); //调扫描键盘子程序 }while (flagm==1);
//////////////////////////////////////////////////////////////////////////// return; }
int mypckey() //扫描键盘子程序 {
int pckey1();
int flagk,judge; judge=pckey1(); if (judge=='e') flagk=0; else flagk=1; return (flagk); }
40