注    册
密 码 忘记密码
保存密码         取消

日志

清除键盘缓冲

分类:C/C++

C语言杂记2--标准流猜想
文章源地址:http://www.programfan.com/club/showbbs.asp?id=93427
  作者:ccpp
  发表时间:2005-8-27 10:40:00
  转载日期:2005-10-16 22:38
  转载原因:今天在做程序时,遇到了输入流方面的问题。一时百思不得其解,就在网上查找资料,无意中找到了这篇文章,看过后受益非浅所以收藏了下来。正文:
  网上的cFAQ总说使用fflush(stdin)要谨慎,或者说不应使用。我个人认为只要了解了stdin流的原理,在使用起来应该没有问题。在整理了这些资料的过程中,我发现其中很多理论问题并没有想象的那样难于理解,只是那些“高人”在表述的过程中隐藏了很多的理论细节。
  先说两大流:标准库的流分为两类:文本流(或称为字符流)和二进制流。
  正文流把文件看作行的序列,每行包含0 个或多个字符,一行的最后有换行符号'n'。正文流适合一般输出和输入,包括与人有关的输入输出。
   二进制流用于把内存数据按内部形式直接存储入文件。二进制流操作保证,在写入文件后再以同样方式读回,信息的形式和内容都不改变。二进制流主要用于程序内部数据的保存和重新装入使用,其操作过程中不做信息转换,在保存或装入大批数据时有速度优势,但这种保存形式不适合人阅读。

进入正题, 

int main()
            {
            char c1, c2;
            scanf("%c", &c1);
            scanf("%c", &c2);
            printf("c1 is %c, c2 is %c", c21, c2);
            return 0;
            }

    运行该程序, 输入AB后回车, 那么输出结果为:      c1 is A, c2 is B。
如果输入一个字符A后回车 (要完成输入必须回车), 而后就如上直接结束了输出结
果为: c1 is A, c2 is   ,变量c2输出的是1个换行符(因为字符A后的回车符赋给了c2)。
  要解决以上问题, 可以在输入函数前加入清除函数fflush()修改以上程序变成:

int main()
            {
            char c1, c2;
            scanf("%c", &c1);
            fflush(stdin);/*也可以写成getchar();来达到同样的作用*/
            scanf("%c", &c2);
            printf("c1 is %c, c2 is %c", c1, c2);
            return 0;
            }

运行程序,如果输入一个字符A后回车, 会等待输入下一个字符。fflush(stdin);的作用是清除掉字符A后回车。若使用 getchar();也能读掉字符A后回车,达到同样的效果!

下面介绍一下标准流:
   在程序启动时,会预先定义三个文本流(建立三个文件指针并指定值,但它们不需要显式地打开):  标准输入流(指针名为stdin)、标准输出流(stdout)和标准错误流(stderr)。stdin 通常与操作系统的标准输入连接,stdout 与操作系统的标准输出连接,stderr 通常直接与显示器连接,这说明stderr 不能重新定向(用于输出诊断信息)。在打开时,标准错误流不会完全缓冲;当且仅当流与交互的设备无联系时,标准输入和标准输出流才被完全缓冲(一种常见的方式,与输入设备联系时,比如需要键盘输入数据时,不等输出缓冲区写满就会刷新并显示在屏幕上,此时就不是完全缓冲)。
    要把外存文件作为输入输出对象,一个可能方式是通过标准输入输出的重新定向,把标准流转接到指定文件。这样做能解决一些问题。但这种做法有很大局限性,因为这样形成的定向在程序执行期间不能改变。为能在程序中方便地根据需要使用各种文件,就必须利用标准库的文件操作函数(如fopen),通过为有关文件建立特定输入输出流的方式使用它们。

   下面我们只研究stdin:
   1 我们敲击键盘得到的是扫描码(扫描码有两个字节,低位字节是ASCⅡ码,高位字节是键位码),而不是ASCⅡ码。按键的扫描码会进入键盘的缓冲区。若程序有标准输入函数,接着键入 Enter后,连带着回车符一块把按键数据(扫描码转换ASCⅡ码形成文本流)送到输入缓冲区(stdin),标准输入函数接收数据后,会把未处理的数据留在输入缓冲区(stdin),这样的后果是随后的输入函数继续读入输入缓冲区中残留的数据。
    如果残留在入缓冲区(stdin)中的数据内容无用,如上面例子的回车符 就需要要处理掉。可用 getchar()循环处理,或直接用fflush(stdin)清空缓冲区。
  结论:在这个过程中必须注意,当程序执行到标准输入函数时,键盘的缓冲区中回车键的扫描码之前的其它键扫描码 ,才会被转换成文本流进入 标准输入流。
   2  而非标准输入函数getche() ,getch()还有bioskey(0).这样的函数在使用时是不需要按“回车”键,也就是说他们直接读取键盘缓冲区的扫描码,这他们的特别之处。
如果在使用getch()之前,键盘缓冲区有不需要的扫描码,也得需要清除!下面是实现这个功能的函数

void Clear_Key_Buffer(void)//清除键盘缓冲区函数

{
int offset;
offset=peek(0x40,0x1a);
pokeb(0x40,0x1c,offset);
}


3 测试函数,其中注释掉的函数可取出来研究以上的理论。
程序运行后,快速连续输入: 1234回车5
结果确是:c1= 1, c2= 2, c3= 5, c4= 3

#include<stdio.h>
#include<conio.h>
#include<dos.h>
void Delay(int clicks)/*延迟函数*/
{
    unsigned int far *clock=(unsigned int far *)0x0000046CL;
    unsigned int now;
    now=*clock;
    while(abs(*clock-now)<clicks){}
}
void Clear_Key_Buffer(void)
{
   int offset;
   offset=peek(0x40,0x1a);
   pokeb(0x40,0x1c,offset);
}
int main(void)
{
    char c1,c2,c3,c4;
    int i;

    for(i=0;i<5;i++)
      Delay(20);
           /* Clear_Key_Buffer(); */
    c1 = getche();
    c2 = getchar(); /*只接收输入缓冲区*/
           /* fflush(stdin); */
    c3 = getche(); /*只接收键盘缓冲区*/
    c4 = getchar();

    printf("nc1 = %c, c2 = %c,c3 = %c,c4 = %c", c1, c2,c3,c4);
    getch();
    return 0;
}

內存類型

分类:汇编/硬件

1.RAM(Random Access Memory,随机存取存储器)------可讀寫

   RAM的特点是:电脑开机时,操作系统和应用程序的所有正在运行的数据和程序都会放置其中,并且随时可以对存放在里面的数据进行修改和存取。它的工作需要由持续的电力提供,一旦系统断电,存放在里面的所有数据和程序都会自动清空掉,并且再也无法恢复。

  根据组成元件的不同,RAM内存又分为以下十几种:

01.DRAM(Dynamic RAM,动态随机存取存储器):

  

  这是最普通的RAM,一个电子管与一个电容器组成一个位存储单元,DRAM将每个内存位作为一个电荷保存在位存储单元中,用电容的充放电来做储存动作,但因电容本身有漏电问题,因此必须每几微秒就要刷新一次,否则数据会丢失。存取时间和放电时间一致,约为2~4ms。因为成本比较便宜,通常都用作计算机内的主存储器。

 02.SRAM(Static RAM,静态随机存取存储器)

  静态,指的是内存里面的数据可以长驻其中而不需要随时进行存取。每6颗电子管组成一个位存储单元,因为没有电容器,因此无须不断充电即可正常运作,因此它可以比一般的动态随机处理内存处理速度更快更稳定,往往用来做高速缓存。

 

 

 

03.VRAM(Video RAM,视频内存)

  它的主要功能是将显卡的视频数据输出到数模转换器中,有效降低绘图显示芯片的工作负担。它采用双数据口设计,其中一个数据口是并行式的数据输出入口,另一个是串行式的数据输出口。多用于高级显卡中的高档内存。

  04.FPM DRAM(Fast Page Mode DRAM,快速页切换模式动态随机存取存储器)

  改良版的DRAM,大多数为72Pin或30Pin的模块。传统的DRAM在存取一个BIT的数据时,必须送出行地址和列地址各一次才能读写数据。而FRM DRAM在触发了行地址后,如果CPU需要的地址在同一行内,则可以连续输出列地址而不必再输出行地址了。由于一般的程序和数据在内存中排列的地址是连续的,这种情况下输出行地址后连续输出列地址就可以得到所需要的数据。FPM将记忆体内部隔成许多页数Pages,从512B到数KB不等,在读取一连续区域内的数据时,就可以通过快速页切换模式来直接读取各page内的资料,从而大大提高读取速度。在96年以前,在486时代和PENTIUM时代的初期,FPM DRAM被大量使用。

  05.EDO DRAM(Extended Data Out DRAM,延伸数据输出动态随机存取存储器)

  这是继FPM之后出现的一种存储器,一般为72Pin、168Pin的模块。它不需要像FPM DRAM那样在存取每一BIT 数据时必须输出行地址和列地址并使其稳定一段时间,然后才能读写有效的数据,而下一个BIT的地址必须等待这次读写操作完成才能输出。因此它可以大大缩短等待输出地址的时间,其存取速度一般比FPM模式快15%左右。它一般应用于中档以下的Pentium主板标准内存,后期的486系统开始支持EDO DRAM,到96年后期,EDO DRAM开始执行。。

  06.BEDO DRAM(Burst Extended Data Out DRAM,爆发式延伸数据输出动态随机存取存储器)

  这是改良型的EDO DRAM,是由美光公司提出的,它在芯片上增加了一个地址计数器来追踪下一个地址。它是突发式的读取方式,也就是当一个数据地址被送出后,剩下的三个数据每一个都只需要一个周期就能读取,因此一次可以存取多组数据,速度比EDO DRAM快。但支持BEDO DRAM内存的主板可谓少之又少,只有极少几款提供支持(如VIA APOLLO VP2),因此很快就被DRAM取代了。

  07.MDRAM(Multi-Bank DRAM,多插槽动态随机存取存储器)

  MoSys公司提出的一种内存规格,其内部分成数个类别不同的小储存库 (BANK),也即由数个属立的小单位矩阵所构成,每个储存库之间以高于外部的资料速度相互连接,一般应用于高速显示卡或加速卡中,也有少数主机板用于L2高速缓存中。

 

  08.WRAM(Window RAM,窗口随机存取存储器)

  韩国Samsung公司开发的内存模式,是VRAM内存的改良版,不同之处是它的控制线路有一、二十组的输入/输出控制器,并采用EDO的资料存取模式,因此速度相对较快,另外还提供了区块搬移功能(BitBlt),可应用于专业绘图工作上。

  09.RDRAM(Rambus DRAM,高频动态随机存取存储器)

  Rambus公司独立设计完成的一种内存模式,速度一般可以达到500~530MB/s,是DRAM的10倍以上。但使用该内存后内存控制器需要作相当大的改变,因此它们一般应用于专业的图形加速适配卡或者电视游戏机的视频内存中。

  10.SDRAM(Synchronous DRAM,同步动态随机存取存储器)

 

  这是一种与CPU实现外频Clock同步的内存模式,一般都采用168Pin的内存模组,工作电压为3.3V。 所谓clock同步是指内存能够与CPU同步存取资料,这样可以取消等待周期,减少数据传输的延迟,因此可提升计算机的性能和效率。

  11.SGRAM(Synchronous Graphics RAM,同步绘图随机存取存储器)

  SDRAM的改良版,它以区块Block,即每32bit为基本存取单位,个别地取回或修改存取的资料,减少内存整体读写的次数,另外还针对绘图需要而增加了绘图控制器,并提供区块搬移功能(BitBlt),效率明显高于SDRAM。

  12.SB SRAM(Synchronous Burst SRAM,同步爆发式静态随机存取存储器)

  一般的SRAM是非同步的,为了适应CPU越来越快的速度,需要使它的工作时脉变得与系统同步,这就是SB SRAM产生的原因。

 13.PB SRAM(Pipeline Burst SRAM,管线爆发式静态随机存取存储器)

  CPU外频速度的迅猛提升对与其相搭配的内存提出了更高的要求,管线爆发式SRAM取代同步爆发式SRAM成为必然的选择,因为它可以有效地延长存取时脉,从而有效提高访问速度。

  14.DDR SDRAM(Double Data Rate二倍速率同步动态随机存取存储器)

  作为SDRAM的换代产品,它具有两大特点:其一,速度比SDRAM有一倍的提高;其二,采用了DLL(Delay Locked Loop:延时锁定回路)提供一个数据滤波信号。这是目前内存市场上的主流模式。

  15.SLDRAM (Synchronize Link,同步链环动态随机存取存储器)

 
  这是一种扩展型SDRAM结构内存,在增加了更先进同步电路的同时,还改进了逻辑控制电路,不过由于技术显示,投入实用的难度不小。

  16.CDRAM(CACHED DRAM,同步缓存动态随机存取存储器)

  这是三菱电气公司首先研制的专利技术,它是在DRAM芯片的外部插针和内部DRAM之间插入一个SRAM作为二级CACHE使用。当前,几乎所有的CPU都装有一级CACHE来提高效率,随着CPU时钟频率的成倍提高,CACHE不被选中对系统性能产生的影响将会越来越大,而CACHE DRAM所提供的二级CACHE正好用以补充CPU一级CACHE之不足,因此能极大地提高CPU效率。

  17.DDRII (Double Data Rate Synchronous DRAM,第二代同步双倍速率动态随机存取存储器)

  DDRII 是DDR原有的SLDRAM联盟于1999年解散后将既有的研发成果与DDR整合之后的未来新标准。DDRII的详细规格目前尚未确定。

  18.DRDRAM (Direct Rambus DRAM)

  是下一代的主流内存标准之一,由Rambus 公司所设计发展出来,是将所有的接脚都连结到一个共同的Bus,这样不但可以减少控制器的体积,已可以增加资料传送的效率。

 

RAM 總述:

目前工作站中常用的内存有SDRAM、DDR及RAMBUS等几种内存。 SDRAM SDRAM是“Synchronous Dynamic random access memory”的缩写,意思是“同步动态随机存储器”,就是我们平时所说的“同步内存”,这种内存采用168线结构,如上图,它的插槽示意图如下: DDR DDR是一种新诞生的内存技术,DDR,英文原意为“DoubleDataRate”,顾名思义,就是双数据传输模式。之所以称其为“双”,也就意味着有“单”,我们日常所使用的SDRAM都是“单数据传输模式”,这种内存的特性是在一个内存时钟周期中,在一个方波上升沿时进行一次操作(读或写),而DDR则引用了一种新的设计,其在一个内存时钟周期中,在方波上升沿时进行一次操作,在方波的下降沿时也做一次操作,之所以在一个时钟周期中,DDR则可以完成SDR两个周期才能完成的任务,所以理论上同速率的DDR内存与SDR内存相比,性能要超出一倍,可以简单理解为100MHZ DDR=200MHZ SDR。 DDR内存采用184线结构,DDR内存不向后兼容SDRAM,要求专为DDR设计的主板与系统,如下图:DDR2 SDRAM内存详解 RAMBUS RAMBUS内存是RAMBUS公司推出的新一带内存,这种内存能够提供十倍于普通DRAM和三倍于PC100 SDRAM的性能,单根的RAMBUS DRAM,即RDRAM,在16位的数据传输通道上速度可高达800MHz。

 

 二、ROM(READ Only Memory,只读存储器)

  ROM是线路最简单半导体电路,通过掩模工艺,一次性制造,在元件正常工作的情况下,其中的代码与数据将永久保存,并且不能够进行修改。一般应用于PC系统的程序码、主机板上的 BIOS (基本输入/输出系统Basic Input/Output System)等。它的读取速度比RAM慢很多。

  根据组成元件的不同,ROM内存又分为以下五种:

  1.MASK ROM(掩模型只读存储器)

  制造商为了大量生产ROM内存,需要先制作一颗有原始数据的ROM或EPROM作为样本,然后再大量复制,这一样本就是MASK ROM,而烧录在MASK ROM中的资料永远无法做修改。它的成本比较低。

  2.PROM(Programmable ROM,可编程只读存储器)

  这是一种可以用刻录机将资料写入的ROM内存,但只能写入一次,所以也被称为“一次可编程只读存储器”(One Time Progarmming ROM,OTP-ROM)。PROM在出厂时,存储的内容全为1,用户可以根据需要将其中的某些单元写入数据0(部分的PROM在出厂时数据全为0,则用户可以将其中的部分单元写入1), 以实现对其“编程”的目的。

  3.EPROM(Erasable Programmable,可擦可编程只读存储器)

  这是一种具有可擦除功能,擦除后即可进行再编程的ROM内存,写入前必须先把里面的内容用紫外线照射它的IC卡上的透明视窗的方式来清除掉。这一类芯片比较容易识别,其封装中包含有“石英玻璃窗”,一个编程后的EPROM芯片的“石英玻璃窗”一般使用黑色不干胶纸盖住, 以防止遭到阳光直射。

  4.EEPROM(Electrically Erasable Programmable,电可擦可编程只读存储器)

  功能与使用方式与EPROM一样,不同之处是清除数据的方式,它是以约20V的电压来进行清除的。另外它还可以用电信号进行数据写入。这类ROM内存多应用于即插即用(PnP)接口中。

  5.Flash Memory(快闪存储器)

  这是一种可以直接在主机板上修改内容而不需要将IC拔下的内存,当电源关掉后储存在里面的资料并不会流失掉,在写入资料时必须先将原本的资料清除掉,然后才能再写入新的资料,缺点为写入资料的速度太慢。


 

HD modem/HD aduio control

分类:AP_work

1. use class code(03040000) find the device

2.get the base address(register10h)

(a).baseaddress+E to check the codec

(b).command register: baseaddress+60h,baseaddress+64h,baseaddress+68h 

   base+68H: if HDAC can ready for issuing CMD ?

   base+68H:; clear bit2 before issuing a new cmd.

  base+60H: cmd=000F0004  ; issuing getting subordinate node count cmd

  base+64h:  read value from it

 (c). if command register is not valid, can reset the base+08h to reset the register

     base+08H=01h ;software must read a 1 from this bit before accessing any controller register

   base+68H: if HDAC can ready for issuing CMD ?

   base+68H:; clear bit2 before issuing a new cmd.

   base+60H: cmd=000F0004  ; issuing getting subordinate node count cmd

   base+64h:  read value from it

 

(d).   base+08H=01h ;

        baseaddress+EH to check the codec

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

codec reset

 base+08h=00H

 base+08h=01H

 then use the base+0EH=? to check the codecs.

 

;===================device to reset
      xor si,si  ;0D000000h    ;base address
      add si,08H
      mov BYTE PTR ds:[si],00h
      mov cx,8000h
  wait_statu_enter:
      mov BYTE PTR ds:[si],00h
      loop   wait_statu_enter
      xor si,si  ;0D0000000h
      add si,08H
      mov BYTE PTR ds:[si],01h
      mov cx,8000h
  wait_statu_enter1:
        mov BYTE PTR ds:[si],01h
      loop   wait_statu_enter1
;===================
 xor si,si  ;0D0000000h
 add si,0eH
 mov al,BYTE PTR ds:[si]
 mov BYTE PTR es:[di],al

Check modem(AZ HD) by CMD WLAN by USB LAN---MCP67

分类:默认栏目

;;;; Modem/Lan/Wireless Lan Detect Tool For MTN70/PTB72 V1.0
;;;; By John1_wu modified from Kun_Zhao
;;;; fic/sw/bios
;;;; audio/modem are all present in one chip
include macros.inc

jump        macro selector,offsetv
            db 0eah
            dw offsetv
            dw selector
            endm

descriptor  struc
limitl      dw 0
basel       dw 0
basem       db 0
attributes  dw 0
baseh       db 0
descriptor  ends

pdesc       struc
limit       dw 0
base        dd 0
pdesc       ends

atdw =      92h
atce =      98h
;----------------------------------------------------------------------
WlanPcieAddr_Nvidia_MCP67 EQU  80006000H

CONFADD  equ 0CF8h
CONFDATA equ 0CFCh
;-----------------------------------------------------------------------
 LAN_CID  equ 020000A2h
;-----------------------------------------------------------------------
 DEVINFO  equ 000h
 CLASSCODE equ 008h
 SUBINFO  equ 02Ch
;------------------------------------------------------------------------

.586

DATA SEGMENT use16
 TITLE_MSG db 'MODEM/LAN/Wireless LAN Detector v1.0 for MTN70/PTB72 ',13,10,13,10,'$'


 DCT_LAN  db '<< LAN chip detecting ............>> : ','$'
 DCT_WLAN db '<<  WlAN detecting ...............>> : ','$'
 DCT_MODEM db '<< MODEM transformer detecting ...>> : ','$'

 M_DEV_INFO label byte
  M_CLSSCODE db ' Class Code : ','$'
  M_VID  db ' Vendor ID.............','$'
  M_DID  db 'Device ID.............','$'
  M_SSYSVID db ' Subsystem Vendor ID...','$'
  M_SSYSID db 'Subsystem ID..........','$'
 
 LAN_FND  db 'LAN chip found.',13,10,'$'
 WLAN_FND_PCIE db 'Wireless LAN with PCIE interface.',13,10,'$'
 WLAN_FND_USB20 db 'Wireless LAN with USB2.0 interface.',13,10,'$'
 MDM_FND  db 'MODEM transformer is present.',13,10,'$'
 BT_MDM_FND db 'BlueTooth Modem Codec found.',13,10,'$'
 NO_FND  db 'NONE!',13,10,13,10,'$'

 SPLITOR  db '    *=*=*    ','$'
 RTN  db 13,10,'$'

 ERFlag  db 0

;-----------------------------------------------------------------------

gdt         label   byte
dummy       descriptor<>
code        descriptor<0ffffh,,,atce,>
code_sel  = code-gdt

datasModem       descriptor<0ffffh,0000h,00h,atdw,0B0H> ; B000 000eh FOR modem BASE=B000 0000H ,REG=00H
datas_selModem = datasModem-gdt
datasUSB20       descriptor<0ffffh,7464h,00h,atdw,0B0H> ; B000 7464h FOR USB20 wlan  BASE=B000 7400 ,REG=64H
datas_selUSB20 = datasUSB20-gdt

datad       descriptor<0ffffh,,,atdw,>
datad_sel = datad-gdt

gdtlen    = $-gdt
vgdtr       pdesc<gdtlen-1,>

bufferlen = 256
buffer      db bufferlen dup(?)

DATA ENDS


cseg SEGMENT use16
 assume cs:cseg,ds:data,es:data
START:
 mov ax,data
 mov ds,ax
 mov es,ax

;-----------------------------------------------------------------------
 lea dx,TITLE_MSG
 mov ah,09h
 int 21h
;------------------------------------------------------------------------
 and ERFlag,11111110b
 lea dx,DCT_LAN
 mov ah,09h
 int 21h
 xor eax,eax
 mov ebx,LAN_CID
 call GetDeviceAddress
 jc MAIN_NO_LAN
 lea dx,LAN_FND
 push eax
 mov ah,09h
 int 21h
 pop eax
 call GetDevInfo
 call DisplayDevice
 or ERFlag,00000001b
 jmp MAIN_WLAN_??PCIE
MAIN_NO_LAN:
 lea dx,NO_FND
 push eax
 mov ah,09h
 int 21h
 pop eax
;-----------------------------------------------------------------------
MAIN_WLAN_??PCIE:
 and ERFlag,11111101b
 lea dx,DCT_WLAN
 mov ah,09h
 int 21h
COMMENT!
 mov dx,CONFADD 
 mov eax,WlanPcieAddr_Nvidia_MCP67+98h     ;bit22 0-empty,1-present
 out dx,eax
 mov dx,CONFDATA
 in eax,dx
 and eax,00400000h
 jz MAIN_WLAN_??USB20
 lea dx,WLAN_FND_PCIE
 mov ah,09h
 int 21h
 or ERFlag,00000010b
 jmp MAIN_MODEM
!

;-----------------------------------------------------------------------
MAIN_WLAN_??USB20:
 and ERFlag,11111011b
 call CheckUSB20WlanCard
 jz MAIN_NO_USB20_WLAN
 lea dx,WLAN_FND_USB20
 mov ah,09h
 int 21h
 or ERFlag,00000100b
 jmp MAIN_MODEM
MAIN_NO_USB20_WLAN:
 lea dx,NO_FND
 mov ah,09h
 int 21h
;-----------------------------------------------------------------------
MAIN_MODEM:
 and ERFlag,11110111b
 lea dx,DCT_MODEM
 mov ah,09h
 int 21h


 call CheckHDModemCodec
 jnz MAIN_NO_MDM ;MAIN_NO_MDM
MAIN_AZ_MDM_FND:
 lea dx,MDM_FND
 push eax
 mov ah,09h
 int 21h
 pop eax
 or ERFlag,00001000b
 jmp MAIN_EXIT
MAIN_NO_MDM:
 lea dx,NO_FND
 push eax
 mov ah,09h
 int 21h
 pop eax

MAIN_EXIT:
 mov ah,04ch
 int 21h

;=========================================================================================
; process: write 32bit data to 32bit memory address
;
; input: eax --- 32bit memory address
;  ebx --- 32bit data to write
;  
;
.386p
write32AddrMem proc
     pushad
     push ebx
     push eax
    
     mov ax,data
     mov ds,ax

     mov bx,16
     mul bx
     add ax,OFFSET gdt
     adc dx,0
     mov WORD PTR vgdtr.base,ax
     mov WORD PTR vgdtr.base+2,dx

     mov ax,cs
     mul bx
     mov code.basel,ax
     mov code.basem,dl
     mov code.baseh,dh
           
     pop eax   ; fill in destination address .
     mov datad.basel,ax
     shr eax,16
     mov datad.basem,al
     mov datad.baseh,ah

     lgdt FWORD PTR vgdtr

     cli
     call enablea20

     mov  eax,cr0
     or   eax,1
     mov  cr0,eax

     jump <code_sel>,<OFFSET virtualWrite>
virtualWrite:
            mov  ax,datad_sel
     mov  ds,ax
     xor  si,si
     pop  ebx
     mov  [si],ebx

     mov  eax,cr0
     and  eax,0fffffffeh
     mov  cr0,eax
           
     jump <SEG realWrite>,<OFFSET realWrite>
realWrite:      
     call disablea20
            sti
     mov  ax,data
     mov  ds,ax

 popad

 ret
write32AddrMem endp

;=========================================================================================
; process: read 32bit data from 32bit memory address
;
; input: eax --- 32bit memory address to read

; output: eax --- 32bit data to return

.386p
read32AddrMem proc
     push ebx
     push edx
     push esi

     push eax

     mov ax,data
     mov ds,ax

     mov bx,16
     mul bx
     add ax,OFFSET gdt
     adc dx,0
     mov WORD PTR vgdtr.base,ax
     mov WORD PTR vgdtr.base+2,dx

     mov ax,cs
     mul bx
     mov code.basel,ax
     mov code.basem,dl
     mov code.baseh,dh
           
     pop eax   ; fill in destination address .
     mov datad.basel,ax
     shr eax,16
     mov datad.basem,al
     mov datad.baseh,ah

     lgdt FWORD PTR vgdtr

     cli
     call enablea20

     mov  eax,cr0
     or   eax,1
     mov  cr0,eax

     jump <code_sel>,<OFFSET virtualRead>
virtualRead:
            mov  ax,datad_sel
     mov  ds,ax
     xor  si,si
     mov  eax,[si]
     push eax

     mov  eax,cr0
     and  eax,0fffffffeh
     mov  cr0,eax
           
     jump <SEG realRead>,<OFFSET realRead>

realRead:       call disablea20
            sti
     mov  ax,data
     mov  ds,ax

     pop eax   ; return 32bit data to be read

 pop esi
 pop edx
 pop ebx

 ret
read32AddrMem endp

;==========================================================================================
;ENTRY:  NONE!
;
;EXPORT: ZF-----1,found modem
;  ZF-----0,no modem
.386p
CheckHDModemCodec proc near
 push eax
 push ebx

LoopReadySendCMD???:
 mov eax,0B0000068h   ; if HDAC can ready for issuing CMD ?
 call read32AddrMem
 and eax,00000001h
 jnz LoopReadySendCMD???

 mov eax,0B0000068h   ; clear bit2 before issuing a new cmd.
 mov ebx,00000002h    
 call write32AddrMem
 
 mov eax,0B0000060h   ; issuing getting subordinate node count cmd
 mov ebx,000F0004h
 call write32AddrMem

HDAreadDataReady???:
 mov eax,0B0000068h
 call read32AddrMem
 and eax,00000002h
 jz HDAreadDataReady???

 mov eax,0B0000064h
 call read32AddrMem
 cmp al,02h    ; if is modem transformer present ?

 pop ebx
 pop eax
 ret
CheckHDModemCodec endp

;==========================================================================================
;ENTRY:  NONE!
;
;EXPORT: ZF-----0,found WALN CARD
;  ZF-----1,no WALN CARD
.386p
CheckUSB20WlanCard proc near
 push eax

 mov eax,0B0007464h
 call read32AddrMem
 and al,00000001b 
 
 pop eax
 ret
CheckUSB20WlanCard endp

enablea20   proc
            push ax
            in   al,92h
     or   al,2
     out  92h,al
     pop  ax
            ret
enablea20   endp

disablea20  proc
            push ax
            in   al,92h
     and  al,0fdh
     out  92h,al
     pop  ax
            ret
disablea20  endp

 

;==========================================================================================
;Get PCI Device Infos : Bus#, Device#, Function#
;ENTRY:  EAX Start Device Configuration Address
;  EBX PCI Device Type Info
;
;EXPORT: EAX PCI Device Configuration Address
;  CF---0 SUCC
;  CF---1 FAIL
;
GetDeviceAddress proc
 push ebx
 push ecx
 push edx

 mov BYTE PTR cs:bDev_Func_GDA,ah
 ror eax,16
 mov BYTE PTR cs:bBus_GDA,al
GDA_LOOP_DEVICE:
 xor eax,eax
 mov ax,8000h
 add al,bBus_GDA
 shl eax,16
 mov ah,bDev_Func_GDA
 mov dwDevAddr,eax ;Save Current Device Address
 mov al,PCI_DEV_TYPE_REG

 mov dx,CONFADD
 out dx,eax
 mov dx,CONFDATA
 in eax,dx  ;Get the Data of Reg# 0Ah,0Bh,09h,08h

 and eax,PCI_DEV_TYPE_MASK
 and ebx,PCI_DEV_TYPE_MASK
 cmp eax,ebx  ;Is Target Device?
 je GDA_OK  ;Found Target Device

 add BYTE PTR cs:bDev_Func_GDA,1
 cmp BYTE PTR cs:bDev_Func_GDA,00h
 jne GDA_LOOP_DEVICE
 add BYTE PTR cs:bBus_GDA,1
 cmp BYTE PTR cs:bBus_GDA,00h
 jne GDA_LOOP_DEVICE
 stc
 jmp GDA_RET
GDA_OK:
 mov eax,dwDevAddr
 clc
GDA_RET:
 pop edx
 pop ecx
 pop ebx
 ret

 PCI_DEV_TYPE_REG equ 08h
 PCI_DEV_TYPE_MASK equ 0FFFF0000h

 bBus_GDA db 00h
 bDev_Func_GDA db 00h
 dwDevAddr dd 00000000h

GetDeviceAddress endp

 
 ;==========================================================================================
;ENTRY:  EBX---Lw16bit Vendor ID
;  EBX---Hi16bit Device ID
;  ECX---Lw16bit Subsystem Vendor ID
;  ECX---Hi16bit Subsystem ID
;  EDX  Class Code
;EXPORT: NONE
;
DisplayDevice proc near
 push eax
 push ebx
 push ecx
 push edx

 lea dx,M_CLSSCODE
 mov ah,09h
 int 21h
 pop edx
 push edx
 PrintDWord edx

 lea dx,RTN
 mov ah,09h
 int 21h

 lea dx,M_VID
 mov ah,09h
 int 21h
 PrintWord bx

 lea dx,SPLITOR
 mov ah,09h
 int 21h

 lea dx,M_DID
 mov ah,09h
 int 21h
 ror ebx,16
 PrintWord bx

 lea dx,RTN
 mov ah,09h
 int 21h

 lea dx,M_SSYSVID
 mov ah,09h
 int 21h
 PrintWord cx

 lea dx,SPLITOR
 mov ah,09h
 int 21h

 lea dx,M_SSYSID
 mov ah,09h
 int 21h
 ror ecx,16
 PrintWord cx

 lea dx,RTN
 mov ah,09h
 int 21h
 lea dx,RTN
 mov ah,09h
 int 21h

 pop edx
 pop ecx
 pop ebx
 pop eax
 ret

DisplayDevice endp


;==========================================================================================
;ENTRY:  EAX----Device Configuration Address
;
;EXPORT: EBX---Lw16bit Vendor ID
;  EBX---Hi16bit Device ID
;  ECX---Lw16bit Subsystem Vendor ID
;  ECX---Hi16bit Subsystem ID
;  EDX  Class Code
;
GetDevInfo proc near
 push eax

 push eax
 add eax,DEVINFO
 mov dx,CONFADD
 out dx,eax
 mov dx,CONFDATA
 in eax,dx
 mov ebx,eax  ;Save VID and DID
 pop eax

 push eax
 add eax,SUBINFO
 mov dx,CONFADD
 out dx,eax
 mov dx,CONFDATA
 in eax,dx
 mov ecx,eax  ;Save SVID and SID
 pop eax

 add eax,CLASSCODE
 mov dx,CONFADD
 out dx,eax
 mov dx,CONFDATA
 in eax,dx
 mov edx,eax  ;Save Class Code

 pop eax
 ret
GetDevInfo endp

cseg ENDS
 END START

Check modem(AZ HD) by CMD WLAN by USB LAN---MCP67

分类:默认栏目

;;;; Modem/Lan/Wireless Lan Detect Tool For MTN70/PTB72 V1.0
;;;; By John1_wu modified from Kun_Zhao
;;;; fic/sw/bios
;;;; audio/modem are all present in one chip
include macros.inc

jump        macro selector,offsetv
            db 0eah
            dw offsetv
            dw selector
            endm

descriptor  struc
limitl      dw 0
basel       dw 0
basem       db 0
attributes  dw 0
baseh       db 0
descriptor  ends

pdesc       struc
limit       dw 0
base        dd 0
pdesc       ends

atdw =      92h
atce =      98h
;----------------------------------------------------------------------
WlanPcieAddr_Nvidia_MCP67 EQU  80006000H

CONFADD  equ 0CF8h
CONFDATA equ 0CFCh
;-----------------------------------------------------------------------
 LAN_CID  equ 020000A2h
;-----------------------------------------------------------------------
 DEVINFO  equ 000h
 CLASSCODE equ 008h
 SUBINFO  equ 02Ch
;------------------------------------------------------------------------

.586

DATA SEGMENT use16
 TITLE_MSG db 'MODEM/LAN/Wireless LAN Detector v1.0 for MTN70/PTB72 ',13,10,13,10,'$'


 DCT_LAN  db '<< LAN chip detecting ............>> : ','$'
 DCT_WLAN db '<<  WlAN detecting ...............>> : ','$'
 DCT_MODEM db '<< MODEM transformer detecting ...>> : ','$'

 M_DEV_INFO label byte
  M_CLSSCODE db ' Class Code : ','$'
  M_VID  db ' Vendor ID.............','$'
  M_DID  db 'Device ID.............','$'
  M_SSYSVID db ' Subsystem Vendor ID...','$'
  M_SSYSID db 'Subsystem ID..........','$'
 
 LAN_FND  db 'LAN chip found.',13,10,'$'
 WLAN_FND_PCIE db 'Wireless LAN with PCIE interface.',13,10,'$'
 WLAN_FND_USB20 db 'Wireless LAN with USB2.0 interface.',13,10,'$'
 MDM_FND  db 'MODEM transformer is present.',13,10,'$'
 BT_MDM_FND db 'BlueTooth Modem Codec found.',13,10,'$'
 NO_FND  db 'NONE!',13,10,13,10,'$'

 SPLITOR  db '    *=*=*    ','$'
 RTN  db 13,10,'$'

 ERFlag  db 0

;-----------------------------------------------------------------------

gdt         label   byte
dummy       descriptor<>
code        descriptor<0ffffh,,,atce,>
code_sel  = code-gdt

datasModem       descriptor<0ffffh,0000h,00h,atdw,0B0H> ; B000 000eh FOR modem BASE=B000 0000H ,REG=00H
datas_selModem = datasModem-gdt
datasUSB20       descriptor<0ffffh,7464h,00h,atdw,0B0H> ; B000 7464h FOR USB20 wlan  BASE=B000 7400 ,REG=64H
datas_selUSB20 = datasUSB20-gdt

datad       descriptor<0ffffh,,,atdw,>
datad_sel = datad-gdt

gdtlen    = $-gdt
vgdtr       pdesc<gdtlen-1,>

bufferlen = 256
buffer      db bufferlen dup(?)

DATA ENDS


cseg SEGMENT use16
 assume cs:cseg,ds:data,es:data
START:
 mov ax,data
 mov ds,ax
 mov es,ax

;-----------------------------------------------------------------------
 lea dx,TITLE_MSG
 mov ah,09h
 int 21h
;------------------------------------------------------------------------
 and ERFlag,11111110b
 lea dx,DCT_LAN
 mov ah,09h
 int 21h
 xor eax,eax
 mov ebx,LAN_CID
 call GetDeviceAddress
 jc MAIN_NO_LAN
 lea dx,LAN_FND
 push eax
 mov ah,09h
 int 21h
 pop eax
 call GetDevInfo
 call DisplayDevice
 or ERFlag,00000001b
 jmp MAIN_WLAN_??PCIE
MAIN_NO_LAN:
 lea dx,NO_FND
 push eax
 mov ah,09h
 int 21h
 pop eax
;-----------------------------------------------------------------------
MAIN_WLAN_??PCIE:
 and ERFlag,11111101b
 lea dx,DCT_WLAN
 mov ah,09h
 int 21h
COMMENT!
 mov dx,CONFADD 
 mov eax,WlanPcieAddr_Nvidia_MCP67+98h     ;bit22 0-empty,1-present
 out dx,eax
 mov dx,CONFDATA
 in eax,dx
 and eax,00400000h
 jz MAIN_WLAN_??USB20
 lea dx,WLAN_FND_PCIE
 mov ah,09h
 int 21h
 or ERFlag,00000010b
 jmp MAIN_MODEM
!

;-----------------------------------------------------------------------
MAIN_WLAN_??USB20:
 and ERFlag,11111011b
 call CheckUSB20WlanCard
 jz MAIN_NO_USB20_WLAN
 lea dx,WLAN_FND_USB20
 mov ah,09h
 int 21h
 or ERFlag,00000100b
 jmp MAIN_MODEM
MAIN_NO_USB20_WLAN:
 lea dx,NO_FND
 mov ah,09h
 int 21h
;-----------------------------------------------------------------------
MAIN_MODEM:
 and ERFlag,11110111b
 lea dx,DCT_MODEM
 mov ah,09h
 int 21h


 call CheckHDModemCodec
 jnz MAIN_NO_MDM ;MAIN_NO_MDM
MAIN_AZ_MDM_FND:
 lea dx,MDM_FND
 push eax
 mov ah,09h
 int 21h
 pop eax
 or ERFlag,00001000b
 jmp MAIN_EXIT
MAIN_NO_MDM:
 lea dx,NO_FND
 push eax
 mov ah,09h
 int 21h
 pop eax

MAIN_EXIT:
 mov ah,04ch
 int 21h

;=========================================================================================
; process: write 32bit data to 32bit memory address
;
; input: eax --- 32bit memory address
;  ebx --- 32bit data to write
;  
;
.386p
write32AddrMem proc
     pushad
     push ebx
     push eax
    
     mov ax,data
     mov ds,ax

     mov bx,16
     mul bx
     add ax,OFFSET gdt
     adc dx,0
     mov WORD PTR vgdtr.base,ax
     mov WORD PTR vgdtr.base+2,dx

     mov ax,cs
     mul bx
     mov code.basel,ax
     mov code.basem,dl
     mov code.baseh,dh
           
     pop eax   ; fill in destination address .
     mov datad.basel,ax
     shr eax,16
     mov datad.basem,al
     mov datad.baseh,ah

     lgdt FWORD PTR vgdtr

     cli
     call enablea20

     mov  eax,cr0
     or   eax,1
     mov  cr0,eax

     jump <code_sel>,<OFFSET virtualWrite>
virtualWrite:
            mov  ax,datad_sel
     mov  ds,ax
     xor  si,si
     pop  ebx
     mov  [si],ebx

     mov  eax,cr0
     and  eax,0fffffffeh
     mov  cr0,eax
           
     jump <SEG realWrite>,<OFFSET realWrite>
realWrite:      
     call disablea20
            sti
     mov  ax,data
     mov  ds,ax

 popad

 ret
write32AddrMem endp

;=========================================================================================
; process: read 32bit data from 32bit memory address
;
; input: eax --- 32bit memory address to read

; output: eax --- 32bit data to return

.386p
read32AddrMem proc
     push ebx
     push edx
     push esi

     push eax

     mov ax,data
     mov ds,ax

     mov bx,16
     mul bx
     add ax,OFFSET gdt
     adc dx,0
     mov WORD PTR vgdtr.base,ax
     mov WORD PTR vgdtr.base+2,dx

     mov ax,cs
     mul bx
     mov code.basel,ax
     mov code.basem,dl
     mov code.baseh,dh
           
     pop eax   ; fill in destination address .
     mov datad.basel,ax
     shr eax,16
     mov datad.basem,al
     mov datad.baseh,ah

     lgdt FWORD PTR vgdtr

     cli
     call enablea20

     mov  eax,cr0
     or   eax,1
     mov  cr0,eax

     jump <code_sel>,<OFFSET virtualRead>
virtualRead:
            mov  ax,datad_sel
     mov  ds,ax
     xor  si,si
     mov  eax,[si]
     push eax

     mov  eax,cr0
     and  eax,0fffffffeh
     mov  cr0,eax
           
     jump <SEG realRead>,<OFFSET realRead>

realRead:       call disablea20
            sti
     mov  ax,data
     mov  ds,ax

     pop eax   ; return 32bit data to be read

 pop esi
 pop edx
 pop ebx

 ret
read32AddrMem endp

;==========================================================================================
;ENTRY:  NONE!
;
;EXPORT: ZF-----1,found modem
;  ZF-----0,no modem
.386p
CheckHDModemCodec proc near
 push eax
 push ebx

LoopReadySendCMD???:
 mov eax,0B0000068h   ; if HDAC can ready for issuing CMD ?
 call read32AddrMem
 and eax,00000001h
 jnz LoopReadySendCMD???

 mov eax,0B0000068h   ; clear bit2 before issuing a new cmd.
 mov ebx,00000002h    
 call write32AddrMem
 
 mov eax,0B0000060h   ; issuing getting subordinate node count cmd
 mov ebx,000F0004h
 call write32AddrMem

HDAreadDataReady???:
 mov eax,0B0000068h
 call read32AddrMem
 and eax,00000002h
 jz HDAreadDataReady???

 mov eax,0B0000064h
 call read32AddrMem
 cmp al,02h    ; if is modem transformer present ?

 pop ebx
 pop eax
 ret
CheckHDModemCodec endp

;==========================================================================================
;ENTRY:  NONE!
;
;EXPORT: ZF-----0,found WALN CARD
;  ZF-----1,no WALN CARD
.386p
CheckUSB20WlanCard proc near
 push eax

 mov eax,0B0007464h
 call read32AddrMem
 and al,00000001b 
 
 pop eax
 ret
CheckUSB20WlanCard endp

enablea20   proc
            push ax
            in   al,92h
     or   al,2
     out  92h,al
     pop  ax
            ret
enablea20   endp

disablea20  proc
            push ax
            in   al,92h
     and  al,0fdh
     out  92h,al
     pop  ax
            ret
disablea20  endp

 

;==========================================================================================
;Get PCI Device Infos : Bus#, Device#, Function#
;ENTRY:  EAX Start Device Configuration Address
;  EBX PCI Device Type Info
;
;EXPORT: EAX PCI Device Configuration Address
;  CF---0 SUCC
;  CF---1 FAIL
;
GetDeviceAddress proc
 push ebx
 push ecx
 push edx

 mov BYTE PTR cs:bDev_Func_GDA,ah
 ror eax,16
 mov BYTE PTR cs:bBus_GDA,al
GDA_LOOP_DEVICE:
 xor eax,eax
 mov ax,8000h
 add al,bBus_GDA
 shl eax,16
 mov ah,bDev_Func_GDA
 mov dwDevAddr,eax ;Save Current Device Address
 mov al,PCI_DEV_TYPE_REG

 mov dx,CONFADD
 out dx,eax
 mov dx,CONFDATA
 in eax,dx  ;Get the Data of Reg# 0Ah,0Bh,09h,08h

 and eax,PCI_DEV_TYPE_MASK
 and ebx,PCI_DEV_TYPE_MASK
 cmp eax,ebx  ;Is Target Device?
 je GDA_OK  ;Found Target Device

 add BYTE PTR cs:bDev_Func_GDA,1
 cmp BYTE PTR cs:bDev_Func_GDA,00h
 jne GDA_LOOP_DEVICE
 add BYTE PTR cs:bBus_GDA,1
 cmp BYTE PTR cs:bBus_GDA,00h
 jne GDA_LOOP_DEVICE
 stc
 jmp GDA_RET
GDA_OK:
 mov eax,dwDevAddr
 clc
GDA_RET:
 pop edx
 pop ecx
 pop ebx
 ret

 PCI_DEV_TYPE_REG equ 08h
 PCI_DEV_TYPE_MASK equ 0FFFF0000h

 bBus_GDA db 00h
 bDev_Func_GDA db 00h
 dwDevAddr dd 00000000h

GetDeviceAddress endp

 
 ;==========================================================================================
;ENTRY:  EBX---Lw16bit Vendor ID
;  EBX---Hi16bit Device ID
;  ECX---Lw16bit Subsystem Vendor ID
;  ECX---Hi16bit Subsystem ID
;  EDX  Class Code
;EXPORT: NONE
;
DisplayDevice proc near
 push eax
 push ebx
 push ecx
 push edx

 lea dx,M_CLSSCODE
 mov ah,09h
 int 21h
 pop edx
 push edx
 PrintDWord edx

 lea dx,RTN
 mov ah,09h
 int 21h

 lea dx,M_VID
 mov ah,09h
 int 21h
 PrintWord bx

 lea dx,SPLITOR
 mov ah,09h
 int 21h

 lea dx,M_DID
 mov ah,09h
 int 21h
 ror ebx,16
 PrintWord bx

 lea dx,RTN
 mov ah,09h
 int 21h

 lea dx,M_SSYSVID
 mov ah,09h
 int 21h
 PrintWord cx

 lea dx,SPLITOR
 mov ah,09h
 int 21h

 lea dx,M_SSYSID
 mov ah,09h
 int 21h
 ror ecx,16
 PrintWord cx

 lea dx,RTN
 mov ah,09h
 int 21h
 lea dx,RTN
 mov ah,09h
 int 21h

 pop edx
 pop ecx
 pop ebx
 pop eax
 ret

DisplayDevice endp


;==========================================================================================
;ENTRY:  EAX----Device Configuration Address
;
;EXPORT: EBX---Lw16bit Vendor ID
;  EBX---Hi16bit Device ID
;  ECX---Lw16bit Subsystem Vendor ID
;  ECX---Hi16bit Subsystem ID
;  EDX  Class Code
;
GetDevInfo proc near
 push eax

 push eax
 add eax,DEVINFO
 mov dx,CONFADD
 out dx,eax
 mov dx,CONFDATA
 in eax,dx
 mov ebx,eax  ;Save VID and DID
 pop eax

 push eax
 add eax,SUBINFO
 mov dx,CONFADD
 out dx,eax
 mov dx,CONFDATA
 in eax,dx
 mov ecx,eax  ;Save SVID and SID
 pop eax

 add eax,CLASSCODE
 mov dx,CONFADD
 out dx,eax
 mov dx,CONFDATA
 in eax,dx
 mov edx,eax  ;Save Class Code

 pop eax
 ret
GetDevInfo endp

cseg ENDS
 END START

USB---WLAN

分类:AP_work

check USB WLAN

MCP67-----------such PTB72

find USB device

get the USB base address(Register 10h)=XXXXXXXXH

use base address+64h bitX to check the USB WLAN codec

 

 

USB WLAN & USB bluetooth check for CE261&CE260-----VX700
1.Find the USB controller base address:  bus0 driver10h  fun4  register40
2.make the WLAN & bluetooth LED on:  PMU B5h=11h,51h(Ce260 on,off)
                                     PMU b5h=81h,D1h(CE261 on,off)
3.base+60H=05h:  WLAN chip has
  base+5Dh=38h:  Bluetooth chip has

GPIO/KB switch

分类:AP_work

1.MCP51/MCP67

IO mapped resgisters behind a BAR

IO BAR register:  MCP_SM_CFG_25=64h----------MCP_SM SMBus and System Management PCI Configuration Registers(device1,fun 1,register64h=1400h)

GPIO address=1400h    P355 is the GPIO register specification

 

2.ICHX

LPC I/F Bridge Register(D31:F0)

GPIO address=GPIOBASE=1180H   ACPI address=PMBASE=1000H

 

3.VT8237a

PMIO=4000H    GPIO pin    PMIO 4B-4C(GPI 0-31)

 

 4.PMU08 registerA0---Cx   ====>GPIO register

 

5.MCP KB Switch

Keyboard Select1  SW1(Bit3)---PIN3  ( GPIO47) register=GPIO base+EE=14EEh  bit5=1 is off,bit5=0 is on

Keyboard Select2  SW1(Bit4)---PIN4  ( GPIO62) register=GPIO base+FD=14FDh  bit5=1 is off,bit5=0 is on

Ghost命令行参数

分类:軟件/工具用法

Ghost命令行参数

分类:IT游戏

命令行参数:(Ghost 的无人 备份/恢复/复制 操作)

  其实 Ghost 2001 的功能远远不止它主程序中显示的那些,Ghost 可以在其启动的命令行中添加众多参数以实现更多的功能。命令行参数在使用时颇为复杂,不过我们可以制作批处理文件,从而“一劳永逸”(类似于无人安装 Windows 98 和Windows 2000)。现在让我们来了解一些常用的参数(了解更加详细的参数介绍可查看 Ghost 的帮助文件)。

  1.-rb

  本次 Ghost 操作结束退出时自动重启。这样,在复制系统时就可以放心离开了。

  2.-fx

  本次 Ghost 操作结束退出时自动回到DOS提示符。

  3.-sure

  对所有要求确认的提示或警告一律回答“Yes”。此参数有一定危险性,只建议高级用户使用。

  4.-fro

  如果源分区发现坏簇,则略过提示而强制拷贝。此参数可用于试着挽救硬盘坏道中的数据。

  5.@filename

  在 filename 中指定 txt 文件。txt文件中为 Ghost 的附加参数,这样做可以不受DOS命令行 150 个字符的限制。

  6.-f32

  将源 FAT16 分区拷贝后转换成 FAT32(前提是目标分区不小于 2G)。WinNT 4 和Windows95、97用户慎用。

  7.-bootcd

  当直接向光盘中备份文件时,此选项可以使光盘变成可引导。此过程需要放入启动盘。

  8.-fatlimit

  将 NT 的 FAT16 分区限制在 2G。此参数在复制 Windows NT 分区,且不想使用64k/簇的 FAT16 时非常有用。

  9.-span

  分卷参数。当空间不足时提示复制到另一个分区的另一个备份包。

  10.-auto

  分卷拷贝时不提示就自动赋予一个文件名继续执行。

  11.-crcignore

  忽略备份包中的 CRC ERROR。除非需要抢救备份包中的数据,否则不要使用此参数,以防数据错误。

  12.-ia

  全部映像。Ghost 会对硬盘上所有的分区逐个进行备份。

  13.-ial

  全部映像,类似于 -ia 参数,对 Linux 分区逐个进行备份。

  14.-id

  全部映像。类似于 -ia 参数,但包含分区的引导信息。

  15.-quiet

  操作过程中禁止状态更新和用户干预。

  16.-script

  可以执行多个 Ghost 命令行。命令行存放在指定的文件中。

  17.-split=x

  将备份包划分成多个分卷,每个分卷的大小为 x兆。这个功能非常实用,用于大型备份包复制到移动式存储设备上,例如将一个 1.9G 的备份包复制到 3 张刻录盘上。

  18.-z

  将磁盘或分区上的内容保存到映像文件时进行压缩。-z 或 -z1 为低压缩率(快速);-z2 为高压缩率(中速);-z3 至 -z9 压缩率依次增大(速度依次减慢)。

  19.-clone

  这是实现 Ghost 无人备份/恢复的核心参数。使用语法为:

-clone,MODE=(operation),SRC=(source),DST=(destination),[SZE(size),SZE(size)...]

  此参数行较为复杂,且各参数之间不能含有空格。其中 operation意为操作类型,值可取:copy:磁盘到磁盘;load:文件到磁盘;dump:磁盘到文件;pcopy:分区到分区;pload:文件到分区;pdump:分区到文件。

  Source 意为操作源,值可取:驱动器号,从1开始;或者为文件名,需要写绝对路径。

  Destination 意为目标位置,值可取:驱动器号,从 1开始;或者为文件名,需要写绝对路径;@CDx,刻录机,x 表示刻录机的驱动器号,从1开始。



下面举例说明:



1.命令行参数:ghostpe.exe -clone,mode=copy,src=1,dst=2

完成操作:将本地磁盘1复制到本地磁盘2。



2.命令行参数:ghostpe.exe -clone,mode=pcopy,src=1:2,dst=2:1

完成操作:将本地磁盘1上的第二分区复制到本地磁盘2的第一分区。



3.命令行参数:ghostpe.exe-clone,mode=load,src=g:3prtdisk.gho,dst=1,sze1=450M,sze2=1599M,sze3=2047M

完成操作:从映像文件装载磁盘1,并将第一个分区的大小调整为450MB,第二个调整为1599MB,第三个调整为2047MB。



4.命令行参数:ghostpe.exe -clone,mode=pdump,src2:1:4:6,dst=d:prt246.gho

完成操作:创建仅含有选定分区的映像文件。从磁盘2上选择分区1、4、6。



一些示例



ghost.exe -clone,mode=copy,src=1,dst=2 -sure

硬盘对拷



ghost.exe -clone,mode=pcopy,src=1:2,dst=2:1 -sure

将一号硬盘的第二个分区复制到二号硬盘的第一个分区



ghost.exe -clone,mode=pdump,src=1:2,dst=g:bac.gho

将一号硬盘的第二个分区做成映像文件放到 g 分区中



ghost.exe -clone,mode=pload,src=g:bac.gho:2,dst=1:2

从内部存有两个分区的映像文件中,把第二个分区还原到硬盘的第二个分区



ghost.exe -clone,mode=pload,src=g:bac.gho,dst=1:1 -fx -sure -rb

用 g 盘的 bac.gho 文件还原 c 盘。完成后不显示任何信息,直接启动



ghost.exe -clone,mode=load,src=g:bac.gho,dst=2,SZE1=60P,SZE2=40P

将映像文件还原到第二个硬盘,并将分区大小比例修改成 60:40



自动还原磁盘:

  首先做一个启动盘,包含 Config.sys, Autoexec.bat, Command.com, Io.sys, Ghost.exe 文件(可以用 windows 做启动盘的程序完成)。Autoexec.bat 包含以下命令:

Ghost.exe -clone,mode=pload,src=d:bac.gho,dst=1:1 -fx -sure -rb

  利用在 D 盘的文件自动还原,结束以后自动退出 ghost 并且重新启动。



自动备份磁盘:

  ghost.exe -clone,mode=pdump,src=1:1,dst=d:bac.gho -fx -sure -rb



自动还原光盘:

  包含文件:Config.sys, Autoexec.bat, Mscdex.exe (CDROM 执行程序), Oakcdrom.sys (ATAPI CDROM 兼容驱动程序), Ghost.exe。

  Config.sys 内容为:

DEVICE=OAKCDROM.SYS /D:IDECD001

  Autoexec.bat 内容为:

MSCDEX.EXE /D:IDECE001 /L:Z

Ghost -clone,mode=load,src=z:bac.gho,dst=1:1 -sure -rb



可以根据下面的具体说明修改示例:



1.-clone



-clone 在使用时必须加入参数,它同时也是所有的 switch{batch switch} 里最实用的。下面是 clone 所定义的参数:



mode={copy|load|dump|pcopy|pload|pdump},

src={drive|file|driveartition},

dst={drive|file|driveartition}



mode 指定要使用哪种 clone 所提供的命令

copy 硬盘到硬盘的复制 (disk to disk copy)

load 文件还原到硬盘 (file to disk load)

dump 将硬盘做成映像文件 (disk to file dump)

pcopy 分区到分区的复制 (partition to partition copy)

pload 文件还原到分区 (file to partition load)

pdump 分区备份成映像文件(partition to file dump)



src 指定了 ghost 运行时使用的源分区的位置模式及其意义。对应 mode 命令 src 所使用参数例子:

COPY/DUMP 源硬盘号。以 1 代表第一号硬盘

LOAD 映像文件名。g:/back98/setup98.gho 或装置名称 (drive)

PCOPY/PDUMP 源分区号。1:2 代表的是硬盘1的第二个分区

PLOAD 分区映像文件名加上分区号或是驱动器名加上分区号。g:back98.gho:2 代表映像文件里的第二个分区



dst 指定运行 Ghost 时使用的目标位置模式及其意义。对应 mode 命令 dst 所使用参数例子:

COPY/DUMP 目的硬盘号。2 代表第二号硬盘

LOAD 硬盘映像文件名。例 g:back98setup98.gho

PCOPY/PLOAD 目的分区号。2:2 代表硬盘 2 的第二个分区

PDUMP 分区映像文件名加分区号。g:back98setup98.gho:2

SZEn 指定所使用目的分区的大小:

n=xxxxM 指定第 n 目的分区的大小为 xxxxMB。如 SZE2=800M 表示分区 2 的大小为 800MB

n=mmP 指定第 n 目的分区的大小为整个硬盘的 mm 个百分比。



2.-fxo 当源物件出现坏块时,强迫复制继续进行



3.-fx 当ghost完成新系统的工作后不显示 press ctrl-alt-del to reboot 直接回到DOS下



4.-ia 完全执行扇区到扇区的复制。当由一个映像文件或由另一个硬盘为来源,复制一个分区时,Ghost将首先检查来源分区,再决定是要复制文件和目录结构还是要做映像复制(扇区到扇区)。预设是这种形式。但是有的时候,硬盘里特定的位置可能会放一些隐藏的与系统安全有关的文件。只有用扇区到扇区复制的方法才能正确复制



5.-pwd and -pwd=x 给映像文件加密



6.-rb 在还原或复制完成以后,让系统重新启动



7.-sure 可以和 clone 合用。Ghost 不会显示 proceed with disk clone-destination drive will be overwritten? 提示信息





九、注意事项



1.在备份系统时,单个的备份文件最好不要超过 2GB。

2.在备份系统前,最好将一些无用的文件删除以减少Ghost文件的体积。通常无用的文件有:Windows 的临时文件夹、IE 临时文件夹、Windows 的内存交换文件。这些文件通常要占去100 多兆硬盘空间。

3.在备份系统前,整理目标盘和源盘,以加快备份速度。

4.在备份系统前及恢复系统前,最好检查一下目标盘和源盘,纠正磁盘错误。

5.在恢复系统时,最好先检查一下要恢复的目标盘是否有重要的文件还未转移,千万不要等硬盘信息被覆盖后才后悔莫及啊。

6.在选择压缩率时,建议不要选择最高压缩率,因为最高压缩率非常耗时,而压缩率又没有明显的提高。

7.在新安装了软件和硬件后,最好重新制作映像文件,否则很可能在恢复后出现一些莫名其妙的错误。

Turbo C 2.0 使用指南

分类:C/C++

Turbo C 2.0 使用指南

             网上摘抄了龚建伟整理的这篇文章

在开始看本文以前,我先说明一下C语言的安装和使用中最应该注意的地方:
许多网友在下载Turbo C 2.0和Turbo C++ 3.0后,向我问得最多的是在使用过程中碰到如下问题:
1)出现找不到 stdio.h conio.h等include文件;
2)出现cos.obj无法连接之类的错误
这些问题是由于没有设置好路径引起的,目前下载的TC2,TC3按安装分类大概有两种版本:一是通过install安装,这类应该已经设置好了路径;二是直接解压后建立TC.EXE的快捷方式,在WINDOWS下双击即可运行(DOS下直接运行TC.EXE),目前国内大多为这种,(因为前段我将自己上传在269网络家园的TC2英文版推荐给十多家软件站),因此下载使用前请注意路径设置:
设置方法为: OPTION->DIRECTORIES:
INCLUDE: [TC2/3所在目录]/include
LIB: [TC2/3所在目录]/lib
output输出目录请自己设置一个工作目录,以免混在一起。
最后还提醒一点:FILES中的Change dir(改变当前目录)中应设置为当前程序所在目录。

(下面的文稿来由一朋友推荐,在此感谢)

一、C语言的起源


C 语言是1972年由美国的Dennis Ritchie设计发明的, 并首次在UNIX操作系统 
的 DEC PDP-11 计算机上使用。 它由早期的编程语言 BCPL( Basic Combind 
Programming Language) 发展演变而来。在1970年, AT&T 贝尔实验室的 Ken 
Thompson根据BCPL语言设计出较先进的并取名为 B的语言, 最后导了C 语言的问世。 
随着微型计算机的日益普及, 出现了许多C 语言版本。由于没有统一的标准, 
使得这些C 语言之间出现了一些不一致的地方。为了改变这种情况, 美国国家标准 
研究所(ANSI)为C 语言制定了一套ANSI标准, 成为现行的C语言标准。 


二、C 语言的特点 

C 语言发展如此迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的 
功能。许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。 
用C 语言加上一些汇编语言子程序, 就更能显示C 语言的优势了, 象PC- DOS 、 
WORDSTAR等就是用这种方法编写的。归纳起来C 语言具有下列特点: 
1. C是中级语言 
它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以象 
汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。 
2. C是结构式语言 
结构式语言的显著特点是代码及数据的分隔化, 即程序的各个部分除了必要的 
信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调 
试。C 语言是以函数形式提供给用户的, 这些函数可方便的调用, 并具有多种循 
环、条件语句控制程序流向, 从而使程序完全结构化。 
3. C语言功能齐全 
C 语言具有各种各样的数据类型, 并引入了指针概念, 可使程序效率更高。另 
外C 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑 
判断功能也比较强大, 可以实现决策目的。 
4. C语言适用范围大 
C 语言还有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于 
多种机型。 



三、 Turbo C 概述 


1 Turbo C 的产生与发展 

Turbo C 是美国Borland 公司的产品,Borland公司是一家专门从事软件开发、 
研制的大公司。该公司相继推出了一套 Turbo系列软件, 如Turbo BASIC, Turbo 
Pascal, Turbo Prolog, 这些软件很受用户欢迎。该公司在1987年首次推出Turbo 
C 1.0 产品, 其中使用了全然一新的集成开发环境, 即使用了一系列下拉式菜单, 
将文本编辑、程序编译、连接以及程序运行一体化, 大大方便了程序的开发。1988 
年, Borland 公司又推出Turbo C1.5版本, 增加了图形库和文本窗口函数库等, 而 
Turbo C 2.0 则是该公司1989年出版的。Turbo C2.0在原来集成开发环境的基础上 
增加了查错功能, 并可以在Tiny模式下直接生成.COM (数据、代码、堆栈处在同一 
64K 内存中) 文件。还可对数学协处理器 (支持8087/80287/80387等)进行仿真。 
Borland 公司后来又推出了面向对象的程序软件包Turbo C++, 它继承发展 
Turbo C 2.0 的集成开发环境, 并包含了面向对象的基本思想和设计方法。 
1991年为了适用Microsoft 公司的Windows 3.0 版本, Borland 公司又将Turbo 
C++ 作了更新, 即Turbo C 的新一代产品Borlandc C++也已经问世了。 


2 Turbo C 2.0基本配置要求 

Turbo C 2.0可运行于IBM-PC系列微机, 包括XT, AT及IBM 兼容机。 此时要求 
DOS 2.0或更高版本支持, 并至少需要448K的RAM, 可在任何彩、单色80列监视器上 
运行。支持数学协处理器芯片, 也可进行浮点仿真, 这将加快程序的执行。 

3 Turbo C 2.0内容简介 

Turbo C 2.0有六张低密软盘(或两张高密软盘)。下面对Turbo C 2.0的主要文 
件作一简单介绍: 
INSTALL.EXE 安装程序文件 
TC.EXE 集成编译 
TCINST.EXE 集成开发环境的配置设置程序 
TCHELP.TCH 帮助文件 
THELP.COM 读取TCHELP.TCH的驻留程序 
README 关于Turbo C的信息文件 
TCCONFIG.EXE 配置文件转换程序 
MAKE.EXE 项目管理工具 
TCC.EXE 命令行编译 
TLINK.EXE Turbo C系列连接器 
TLIB.EXE Turbo C系列库管理工具 
C0?.OBJ 不同模式启动代码 
C?.LIB 不同模式运行库 
GRAPHICS.LIB 图形库 
EMU.LIB 8087仿真库 
FP87.LIB 8087库 
*.H Turbo C头文件 
*.BGI 不同显示器图形驱动程序 
*.C Turbo C例行程序(源文件) 
其中: 上面的?分别为: 
T Tiny(微型模式) 
S Small(小模式) 
C Compact(紧凑模式) 
M Medium(中型模式) 
L Large(大模式) 
H Huge(巨大模式) 


四、 Turbo C 2.0的安装和启动 

Turbo C 2.0的安装非常简单, 只要将1#盘插入A驱动器中, 在DOS的"A>" 下键 
入: 
A>INSTALL 
即可, 此时屏幕上显示三种选择: 
1. 在硬盘上创造一个新目录来安装整个Turbo C 2.0系统。 
2. 对Turbo C 1.5更新版本。 
这样的安装将保留原来对选择项、颜色和编辑功能键的设置。 
3. 为只有两个软盘而无硬盘的系统安装Turbo C 2.0。 
这里假定按第一种选择进行安装, 只要在安装过程中按对盘号的提示, 顺序插 
入各个软盘, 就可以顺利地进行安装, 安装完毕将在C盘根目录下建立一个TC 子目 
录, TC下还建立了两个了目录LIB和INCLUDE, LIB子目录中存放库文件, INCLUDE 
子目录中存放所有头文件。 
运行Turbo C 2.0时, 只要在TC 子目录下键入TC并回车即可进入Turbo C 2. 0 
集成开发环境。 


五、 Turbo C 2.0集成开发环境的使用 

进入Turbo C 2.0集成开发环境中后, 屏幕上显示: 
──────────────────────────────
   File Edit Run Compile Project Options Debug Break/watch
┌────────────Edit──────────────┐
│ Line 1 Col 1 Insert Indent Tab File Unindent c:NONAME.C│
│                                                        │
│                                                        │
│                                                        │
│                                                        │
│                                                        │
│                                                        │
│                                                        │
│─────────Message─────────────── │
│                                                        │
│                                                        │
└────────────────────────────┘
F1-Help  F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu
───────────────────────────────
其中顶上一行为Turbo C 2.0 主菜单, 中间窗口为编辑区, 接下来是信息窗 
口, 最底下一行为参考行。这四个窗口构成了Turbo C 2.0的主屏幕, 以后的编程、 
编译、调试以及运行都将在这个主屏幕中进行。下面详细介绍主菜单的内容。 

1 主菜单 

主菜单 在Turbo C 2.0主屏幕顶上一行, 显示下列内容: 
File Edit Run Compile Project Options Debug Break/watch 
除Edit外, 其它各项均有子菜单, 只要用Alt加上某项中第一个字母(即大写字 
母), 就可进入该项的子菜单中。 
(1)、File(文件)菜单 
按Alt+F可进入File菜单, 该菜单包括以下内容: 
.Load(加载) 
装入一个文件, 可用类似DOS的通配符(如*.C)来进行列表选择。也可装入其它 
扩展名的文件, 只要给出文件名(或只给路径)即可。该项的热键为F3, 即只要在主 
菜单中按F3即可进入该项, 而不需要先进入File菜单再选此项。 
.Pick(选择) 
将最近装入编辑窗口的8个文件列成一个表让用户选择, 选择后将该程序装入 
编辑区, 并将光标置在上次修改过的地方。其热健为Alt-F3。 
.New(新文件) 
说明文件是新的, 缺省文件名为NONAME.C, 存盘时可改名。 
.Save(存盘) 
将编辑区中的文件存盘, 若文件名是NONAME.C时, 将询问是否更改文件名, 其 
热键为F2。 
.Write to(存盘) 
可由用户给出文件名将编辑区中的文件存盘, 若该文件已存在, 则询问要不要 
覆盖。 
.Directory(目录) 
显示目录及目录中的文件, 并可由用户选择。 
.Change dir(改变目录) 
显示当前目录, 用户可以改变显示的目录。 
.Os shell(暂时退出) 
暂时退出Turbo C 2.0到DOS提示符下, 此时可以运行DOS 命令, 若想回到 
Turbo C 2.0中, 只要在DOS状态下键入EXIT即可。 
.Quit(退出) 
退出Turbo C 2.0, 返回到DOS操作系统中, 其热键为Alt+X。 

说明: 
以上各项可用光标键移动色棒进行选择, 回车则执行。也可用每一项的第一个 
大写字母直接选择。若要退到主菜单或从它的下一级菜单列表框退回均可用Esc键, 
Turbo C 2.0所有菜单均采用这种方法进行操作, 以下不再说明。 
(2)、Edit(编辑)菜单 
按Alt+E可进入编辑菜单, 若再回车, 则光标出现在编辑窗口, 此时用户可以 
进行文本编辑。 
编辑方法基本与wordstar相同, 可用F1键获得有关编辑方法的帮助信息。 
与编辑有关的功能键如下: 
F1 获得Turbo C 2.0编辑命令的帮助信息 
F5 扩大编辑窗口到整个屏幕 
F6 在编辑窗口与信息窗口之间进行切换 
F10 从编辑窗口转到主菜单 
编辑命令简介: 
PageUp 向前翻页 
PageDn 向后翻页 
Home 将光标移到所在行的开始 
End 将光标移到所在行的结尾 
Ctrl+Y 删除光标所在的一行 
Ctrl+T 删除光标所在处的一个词 
Ctrl+KB 设置块开始 
Ctrl+KK 设置块结尾 
Ctrl+KV 块移动 
Ctrl+KC 块拷贝 
Ctrl+KY 块删除 
Ctrl+KR 读文件 
Ctrl+KW 存文件 
Ctrl+KP 块文件打印 
Ctrl+F1 如果光标所在处为Turbo C 2.0库函数, 则获得有关该函数的帮助 
信息 
Ctrl+Q[ 查找Turbo C 2.0双界符的后匹配符 
Ctrl+Q] 查找Turbo C 2.0双界符的前匹配符 

说明: 
a. Turbo C 2.0的双界符包括以下几种符号: 
花括符 {和} 
尖括符 <和> 
圆括符 (和) 
方括符 [和] 
注释符 /*和*/ 
双引号 " 
单引号 ' 
b. Turbo C 2.0在编辑文件时还有一种功能, 就是能够自动缩进, 即光标定位 
和上一个非空字符对齐。在编辑窗口中, Ctrl+OL为自动缩进开关的控制键。 
(3)Run(运行)菜单 
按Alt+R可进入Run菜单, 该菜单有以下各项: 
.Run(运行程序) 
运行由Project/Project name项指定的文件名或当前编辑区的文件。如果对上 
次编译后的源代码未做过修改, 则直接运行到下一个断点(没有断点则运行到结束)。 
否则先进行编译、连接后才运行, 其热键为Ctrl+F9。 
.Program reset(程序重启) 
中止当前的调试, 释放分给程序的空间, 其热键为Ctrl+F2。 
.Go to cursor(运行到光标处) 
调试程序时使用, 选择该项可使程序运行到光标所在行。光标所在行必须为一 
条可执行语句, 否则提示错误。其热键为F4。 
.Trace into(跟踪进入) 
在执行一条调用其它用户定义的子函数时, 若用Trace into项, 则执行长条将 
跟踪到该子函数内部去执行, 其热键为F7。 
.Step over(单步执行) 
执行当前函数的下一条语句, 即使用户函数调用, 执行长条也不会跟踪进函数 
内部, 其热键为F8。 
.User screen(用户屏幕) 
显示程序运行时在屏幕上显示的结果。其热键为Alt+F5。 

(4)、Compile(编译)菜单 
按Alt+C可进入Compile菜单, 该菜单有以下几个内容: 
.Compile to OBJ(编译生成目标码) 
将一个C源文件编译生成.OBJ目标文件, 同时显示生成的文件名。其热键为 
Alt+F9。 
.Make EXE file(生成执行文件) 
此命令生成一个.EXE的文件, 并显示生成的.EXE文件名。其中.EXE文件名是下 
面几项之一。 
a. 由Project/Project name说明的项目文件名。 
b. 若没有项目文件名, 则由Primary C file说明的源文件。 
c. 若以上两项都没有文件名, 则为当前窗口的文件名。 
.Link EXE file(连接生成执行文件) 
把当前.OBJ文件及库文件连接在一起生成.EXE文件。 
.Build all(建立所有文件) 
重新编译项目里的所有文件, 并进行装配生成.EXE文件。该命令不作过时检查 
(上面的几条命令要作过时检查, 即如果目前项目里源文件的日期和时间与目标文 
件相同或更早, 则拒绝对源文件进行编译)。 
.Primary C file(主C文件) 
当在该项中指定了主文件后, 在以后的编译中, 如没有项目文件名则编译此项 
中规定的主C文件, 如果编译中有错误, 则将此文件调入编辑窗口, 不管目前窗口 
中是不是主C文件。 
.Get info(获得有关当前路径、源文件名、源文件字节大小、编译中的错误数 
目、可用空间等信息。 
(5)、Project(项目)菜单 
按Alt+P可进入Project菜单, 该菜单包括以下内容: 
.Project name(项目名) 
项目名具有.PRJ的扩展名, 其中包括将要编译、连接的文件名。例如有一个程 
序由file1.c, file2.c, file3.c组成, 要将这3个文件编译装配成一个file.exe的 
执行文件, 可以先建立一个file.prj的项目文件, 其内容如下: 
file1.c 
file2.c 
file3.c 
此时将file.prj放入Project name项中, 以后进行编译时将自动对项目文件中 
规定的三个源文件分别进行编译。然后连接成file.exe文件。 
如果其中有些文件已经编译成.OBJ文件, 而又没有修改过, 可直接写上.OBJ扩 
展名。此时将不再编译而只进行连接。 
例如: file1.obj 
file2.c 
file3.c 
将不对file1.c进行编译, 而直接连接。 
说明: 

当项目文件中的每个文件无扩展名时, 均按源文件对待, 另外, 其中的文件也 
可以是库文件, 但必须写上扩展名.LIB。 
.Break make on(中止编译) 
由用户选择是否在有Warining(警告)、Errors(错误)、Fatal Errors( 致命错 
误)时或Link(连接)之前退出Make编译。 
.Auto dependencies(自动依赖) 
当开关置为on, 编译时将检查源文件与对应的.OBJ文件日期和时间, 否则不进 
行检查。 
.Clear project(清除项目文件) 
清除Project/Project name中的项目文件名。 
.Remove messages(删除信息) 
把错误信息从信息窗口中清除掉。 
(6)、Options(选择菜单) 
按Alt+O可进入Options菜单, 该菜单对初学者来说要谨慎使用。 
.Compiler(编译器) 
本项选择又有许多子菜单, 可以让用户选择硬件配置、存储模型、调试技术、 
代码优化、对话信息控制和宏定义。这些子菜单如下: 
Model 
共有Tiny, small, medium, compact, large, huge 六种不同模式可由同户选 
择。 
Define 
打开一个宏定义框, 同户可输入宏定义。多重定义可同分号, 赋值可用等号。 
Code generation 
它又有许多任选项, 这些任选项告诉编译器产生什么样的目标代码。 
Calling convention 可选择C或Pascal方式传递参数。 
Instruction set 可选择8088/8086或80186/80286指令系列。 
Floating point 可选择仿真浮点、数学协处理器浮点或无浮点运算。 
Default char type 规定char的类型。 
Alignonent 规定地址对准原则。 
Merge duplicate strings 作优化用, 将重复的字符串合并在一起。 
Standard stack frame 产生一个标准的栈结构。 
Test stack overflow 产生一段程序运行时检测堆栈溢出的代码。 
Line number 在.OBJ文件中放进行号以供调试时用。 
OBJ debug information 在.OBJ文件中产生调试信息。 
Optimization 
Optimize for 选择是对程序小型化还是对程序速度进行优 
化处理。 
Use register variable 用来选择是否允许使用寄存器变量。 
Register optimization 尽可能使用寄存器变量以减少过多的取数操 
作。 
Jump optimization   通过去除多余的跳转和调整循环与开关语句 
的办法, 压缩代码。 
Source 
Indentifier length 说明标识符有效字符的个数, 默认为32个。 
Nested comments 是否允许嵌套注释。 
ANSI keywords only   是只允许ANSI关键字还是也允许Turbo C 
2.0关键字 
Error 
Error stop after 多少个错误时停止编译, 默认为25个。 
Warning stop after   多少个警告错误时停止编译, 默认为100个。 
Display warning 
Portability warning 移植性警告错误。 
ANSI Violations 侵犯了ANSI关键字的警告错误。 
Common error    常见的警告错误。 
Less common error 少见的警告错误。 
Names 用于改变段(segment)、 组( group) 和类 
(class)的名字, 默认值为CODE,DATA,BSS。 

.Linker(连接器) 
本菜单设置有关连接的选择项, 它有以下内容: 
Map file menu 选择是否产生.MAP文件。 
Initialize segments   是否在连接时初始化没有初始化的段。 
Devault libraries 是否在连接其它编译程序产生的目标文件时去寻 
找其缺省库。 
Graphics library 是否连接graphics库中的函数。 
Warn duplicate symbols 当有重复符号时产生警告信息。 
Stack warinig 是否让连接程序产生No stack的警告信息。 
Case-sensitive link 是否区分大、小写字。 

.Environment(环境) 
本菜单规定是否对某些文件自动存盘及制表键和屏幕大小的设置 
Message tracking 
Current file 跟踪在编辑窗口中的文件错误。 
All files 跟踪所有文件错误。 
Off 不跟踪。 
Keep message 编译前是否清除Message窗口中的信息。 
Config auto save 选on时, 在Run, Shell或退出集成开发环境之前, 
如果Turbo C 2.0的配置被改过, 则所做的改动 
将存入配置文件中。选off时不存。 
Edit auto save 是否在Run或Shell之前, 自动存储编辑的源文件。 
Backup file 是否在源文件存盘时产生后备文件(.BAK文件)。 
Tab size 设置制表键大小, 默认为8。 
Zoomed windows 将现行活动窗口放大到整个屏幕, 其热键为F5。 
Screen size 设置屏幕文本大小。 

.Directories(路径) 
规定编译、连接所需文件的路径, 有下列各项: 
Include directories 包含文件的路径, 多个子目录用";"分开。 
Library directories 库文件路径, 多个子目录用";"分开。 
Output directoried 输出文件(.OBJ, .EXE, .MAP文件)的目录。 
Turbo C directoried Turbo C 所在的目录。 
Pick file name 定义加载的pick文件名, 如不定义则从current 
pick file中取。 

.Arguments(命令行参数) 
允许用户使用命令行参数。 

.Save options(存储配置) 
保存所有选择的编译、连接、调试和项目到配置文件中, 缺省的配置文件为 
TCCONFIG.TC。 

.Retrive options 
装入一个配置文件到TC中, TC将使用该文件的选择项。 
(7)、Debug(调试)菜单 
按Alt+D可选择Debug菜单, 该菜单主要用于查错, 它包括以下内容: 
Evaluate 
Expression 要计算结果的表达式。 
Result 显示表达式的计算结果。 
New value 赋给新值。 
Call stack 该项不可接触。而在Turbo C debuger 时用于检 
查堆栈情况。 
Find function 在运行Turbo C debugger时用于显示规定的函数。 
Refresh display 如果编辑窗口偶然被用户窗口重写了可用此恢复 
编辑窗口的内容。 

(8)、Break/watch(断点及监视表达式) 
按Alt+B可进入Break/watch菜单, 该菜单有以下内容: 
Add watch 向监视窗口插入一监视表达式。 
Delete watch 从监视窗口中删除当前的监视表达式。 
Edit watch 在监视窗口中编辑一个监视表达式。 
Remove all watches 从监视窗口中删除所有的监视表达式。 
Toggle breakpoint 对光标所在的行设置或清除断点。 
Clear all breakpoints 清除所有断点。 
View next breakpoint 将光标移动到下一个断点处。 



六 Turbo C 2.0的配置文件 

所谓配置文件是包含Turbo C 2.0有关信息的文件, 其中存有编译、连接的选 
择和路径等信息。 
可以用下述方法建立Turbo C 2.0的配置: 
1. 建立用户自命名的配置文件 
可以从Options菜单中选择Options/Save options命令, 将当前集成开发环境 
的所有配置存入一个由用户命名的配置文件中。下次启动TC时只要在DOS下键入: 
tc/c<用户命名的配置文件名> 
就会按这个配置文件中的内容作为Turbo C 2.0的选择。 
2. 若设置Options/Environment/Config auto save 为on, 则退出集成开发环 
境时, 当前的设置会自动存放到Turbo C 2.0配置文件TCCONFIG.TC中。Turbo C 在 
启动时会自动寻找这个配置文件。 
3. 用TCINST设置Turbo C的有关配置, 并将结果存入TC.EXE中。Turbo C 在启 
动时, 若没有找到配置文件, 则取TC.EXE中的缺省值。 

TC 中函数调用外部函数的问题/头文件問題

分类:C/C++

经常在程序中看到类似如下的句子:
#ifndef FILENAME
#define FILENAME

这个是怎么回事--------防止重复定义

如果包含了当前的头文件,
会有一个 FILENAME 宏定义,
所以,
#ifndef FILENAME
#define FILENAME
的意义就是:  如果包含过当前的 h 文件(定义了 FILENAME 宏)那么就不再重复包含该 h 文件

这样就防止了重复包含 h 文件,
预防 例如 重复定义一类的错误 ~
它的作用就是防止一个头文件被重复的编译.
我们还可以才用
#program once
简单地说,一个头文件可能被另一个文件include两次(直接或间接地)
简单地说,一个头文件可能被另一个文件include两次(直接或间接地)

//a.h
void func(){}

//b.h
#include "a.h"

//c.h
#include "a.h"
#include "b.h"

展开后,c.h变成
void func() {}
void func() {}
重复定义了
如果加了#ifdef,则c.h变成
#ifdef INCLUDE_A_H
#define INCLUDE_A_H
void func() {}
#endif

#ifdef INCLUDE_B_H
#define INCLUDE_B_H

#ifdef INCLUDE_A_H
#define INCLUDE_A_H
void func() {}
#endif

#endif
第二个void func() {}会在预处理的时候被去掉,就没事啦

 

 

a.h:(只做了声明,没有具体实现)
////////////////////////begin
void record(some args);
int  next(some args);
/////////////////////end


a.h中的函数仅仅是一个用户界面,其具体实现完全
在别的.c文件中实现的,例如可能是a.c:
//////////////////////
void record(some args)
{
  some code;
}

int next(some args)
{
  some code;
}

 编译的时候只需要知道这个名字是个函数就可以了。 然后会在这个位置留个占位符, 并把函数名字放到 obj 中。 连接器扫描所有的 obj 文件中的符号, 把对应的地址添在占位符上。

 

 

 

 

 

 为何有的语言不需要“头文件”进行“预编译”呢?
--------
由于"头文件"里放置的全是"声明",而不是"定义"。所以不需要"头文件"的语言也就是不需要声明的语言,从某种意义上说,就是"弱类型"的语言。

 因为 C/C++ 的语言设计在很多方面对当时的编译器实现水平进行了妥协。引入头文件和声明语法是因为全局分析的实现复杂度 —— 与其让编译器进行全局分析,记录所有公开的符号,不如由程序员承担这个麻烦,提供全局声明。而 People make mistakes,所以头文件实际是一个 drawback 而不是什么模块化设计的 silver bullet.

 接口和实现的分离

 

 

  extern   void   enter_string(char   *str);  
  extern   void   delete_string(char   *str,   char   c);  
  extern   void   print_string(char   *str);  

 

file1.c,file2.c
main是在file1里面,函数写在file2.c里面
单独编译file2.c
再做一个file2.h,包含外部函数的原型声明.
然后在file1.c里面#include "file2.h"

>

 

 

 

 

ASM 返回值得寫法

分类:AP_work

      

 

        mov errorlevel,1  ; 1 is errol

       mov al,errorlevel-------return value
        mov ah,04ch
        int 21h

 

 

 

FAN--------用C語言寫

分类:AP_work

 

51=high temp ;  52=rmp
53=mem  temp ;  54=rmp
55h=low temp;  56=rmp

if temp<Low temp 55h;  fan=00
    else fan speed=56h
if temp(E7h register)<53h Men regster, speed=56h
    else fan speed=54h register
if <51h high; speed=54h
    else speed=56h
fan speed

 

 

 

 

 #include <stdio.h>
#include <dos.h>
#include <conio.h>

#define PMU_CommandPort 0x06c
#define PMU_DataPort 0x068

#define PMU_EC_RD_CMD 0x080
#define PMU_EC_WR_CMD 0x081

#define PMU_OBF  0x001
#define PMU_IBF  0x002
#define PMU_CMD  0x008
#define PMU_ACC  0x010
#define PMU_ERR  0x020

typedef int bool;
typedef unsigned char   BYTE;

#define true    1
#define false   0

/*====================*/
void DoubleDelay(unsigned int lowDelay,unsigned int highDelay);

bool Chk_IBF_Err();
bool Chk_Err_Acc();
bool Chk_IBF_OBF_Acc();
bool Chk_IB_Err_Acc();
bool PmuWait4IBE();
bool PmuWait4OBF();

bool SmbPmuWriteSMI(BYTE EC_Reg_Addr, BYTE Write_Val);
BYTE smbPmuReadSMI(int EC_Reg_Addr);

void OutputText(char message[],int TextColor,int BkColor,int x,int y);

/*
   ============= colors ===================
   BLACK-BLUE-GREEN-CYAN-RED-MAGENTA
   BROWN-LIGHTGRAY-DARKGRAY-LIGHTBLUE-LIGHTGREEN-LIGHTCYAN-LIGHTRED
   LIGHTMAGENTA-YELLOW-WHITE

   ============= color end ===============
*/


int main(int argc, char* argv[])
{
 int i;
 BYTE Fan_Speed;

 clrscr();
 gotoxy(1,1);
 printf("FAN.exe---V1.A--FIC/SW n");
 printf("Usage: FAN on/off n");

  if(argc!=2)
  {
  clrscr();
  printf("FAN.exe---V1.A--FIC/SW n");
  printf("nParameters error!n");
  printf("Usage: FAN on/off n");
  return -1;
   }  


/* SmbPmuWriteSMI(0x58,0x00);
 SmbPmuWriteSMI(0x5A,0x0FF);
 SmbPmuWriteSMI(0x59,0x00);
 DoubleDelay(0x0FFFF,0x7000);
 Fan_Speed=smbPmuReadSMI(0x59);

 if(Fan_Speed==0)
 {
  
  printf("n Error! NO fan or it's damaged !n");
  return -2;
 }
 SmbPmuWriteSMI(0x5A,0x00);
*/
 if(stricmp(argv[1],"on")==0)
 {
 /* SmbPmuWriteSMI(0x58,0x00);
  SmbPmuWriteSMI(0x5A,0x0FF);
         */
              
                SmbPmuWriteSMI(0x52,0xFE);
                SmbPmuWriteSMI(0x54,0xFE);
                SmbPmuWriteSMI(0x56,0xFE);
  printf("n Turn on Fan !n");
  return true;
 }


 if(stricmp(argv[1],"off")==0)
 {
/*  SmbPmuWriteSMI(0x58,0x00);
  SmbPmuWriteSMI(0x5A,0x00);
*/
                SmbPmuWriteSMI(0x52,0x00);
                SmbPmuWriteSMI(0x54,0x00);
                SmbPmuWriteSMI(0x56,0x00);
  printf("n Turn off Fan !n");
  return false;
 }

 clrscr();
 printf("FAN.exe---V1.A--FIC/SW n");
 printf("nParameters error!n");
 printf("Usage: FAN on/off n");
 return -1;

}

void OutputText(char message[],int TextColor,int BkColor,int x,int y)
{
 int cx=x,cy=y;
 int tc=TextColor,bc=BkColor;

 textcolor(tc);
 textbackground(bc);
 clrscr();
 gotoxy(cx,cy);
 cprintf(message);

}


void DoubleDelay(unsigned int lowDelay,unsigned int highDelay)
{
 int i,j;
 for(j=0;j<highDelay;j++)
 {
  for(i=0;i<lowDelay;i++)
  {
  }
 } 
}

bool SmbPmuWriteSMI(BYTE EC_Reg_Addr, BYTE Write_Val)
{
 int i,j=10; 
 BYTE val;
 for(i=0;i<10;i++)
 { 
  if(Chk_IBF_OBF_Acc())
  {
   outportb(PMU_CommandPort,PMU_EC_WR_CMD);
   if(Chk_IBF_Err())
   {   
    outportb(PMU_DataPort,EC_Reg_Addr);
    if(Chk_IBF_Err())
    {
     outportb(PMU_DataPort,Write_Val);
     if(Chk_IB_Err_Acc())
      return true;
    }
   }
  }
 }
 return false;
}

BYTE smbPmuReadSMI(int EC_Reg_Addr)
{
 int i,j; 
 BYTE val;
 for(i=0;i<10;i++)
 { 
  if(Chk_IBF_OBF_Acc())
  {
   outportb(PMU_CommandPort,PMU_EC_RD_CMD);
   if(Chk_IBF_Err())
   {   
    outportb(PMU_DataPort,EC_Reg_Addr);
    if(Chk_Err_Acc())
    {
     if(PmuWait4OBF())
     {
      val=inportb(PMU_DataPort);
      return(val);
     }
    }
   }
  }
 }
 return 0x0ff;
}

bool PmuWait4OBF()
{
 unsigned int i ; 
 BYTE val;
 for(i=0;i<0x0ffff;i++)
 {
  val=inportb(PMU_CommandPort); 
  if((val&PMU_OBF)!=0)
   break;
 }

 if(((val&PMU_ERR)!=0)||(i==0xffff))
  return false;
 return true;
}

bool PmuWait4IBE()
{
 unsigned int i ; 
 BYTE val;
 for(i=0;i<0x0ffff;i++)
 {

  val=inportb(PMU_CommandPort);
  if((val&PMU_IBF)==0)
   break;
 }

 if(((val&PMU_ERR)!=0)||(i==0xffff))
  return false;
 return true;
}

bool Chk_IBF_Err()
{
 unsigned int i ; 
 BYTE val;
 for(i=0;i<0x0ffff;i++)
 {
  val=inportb(PMU_CommandPort);
  val=val&(PMU_IBF|PMU_ERR);
  if(val==0)
   return true; 
 }
 return false;
}

bool Chk_IB_Err_Acc()
{
 unsigned int i ; 
 BYTE val;
 for(i=0;i<0x0ffff;i++)
 {
  val=inportb(PMU_CommandPort);
  val=val&(PMU_IBF|PMU_ERR|PMU_ACC);
  if(val==0)
   return true; 
 }
 return false; 
}

bool Chk_Err_Acc()
{
 unsigned int i ; 
 BYTE val;
 for(i=0;i<0x0ffff;i++)
 {
  val=inportb(PMU_CommandPort);
  val=val&(PMU_ERR|PMU_ACC);
  if(val==0)
   return true; 
 }
 return false;
 
}

bool Chk_IBF_OBF_Acc()
{
 unsigned int i ; 
 BYTE val;
 for(i=0;i<0x0ffff;i++)
 {
  val=inportb(PMU_CommandPort);
  val=val&(PMU_OBF|PMU_IBF|PMU_ACC);
  if(val==0)
   return true; 
 }
 return false;

}

 

RAM size/SIMM

分类:AP_work

   RAM

1.ram size read
  a.read SPD   (DMMIO)
    SMBase+0 :status
          +4 :Slave Address(A2/A0/XXH)
          +2 :index number
          +0 : and 01E
          +5 : Value

        SPD_INDEX
        SPD_MEMORY_TYPE  equ 02h
 SPD_NUMBER_OF_RANK equ 05h
 SPD_CYCLE_TIME  equ 09h
 SPD_RANK_DENSITY equ 1Fh
  b.PTB50: read device 18,fun2,reg80,reg40......referance BIOS.....AMD P108
  c.Northbridge 80000060H,------64H--get Base
  d.LW10W device 0 fun3 reg 40(end addr)  reg48H(begin addr): *256=XXMB
2.CPU speed
  a.read DMI table
  b.
3.CPU TYPE
  a.CPUID command
3.VRAM
  a.LM10W---read d0f0reg13-10h

紅帽Linux9從入門到精通----筆記

分类:讀書

紅帽Linux9從入門到精通  P200

P3Manu-3.pdf(V3.System Programming)-------筆記

分类:讀書

chapter 2

P40-----

2.2.1

P43-----

2.1.6

p56

 

 

 

<<網管員世界>>精華本------筆記

分类:讀書

目錄:

 1.網絡設備

深入理解計算機體系-----讀書記2007/3/6,3/12

分类:讀書

P241-----275----295------481

 P483---連接

解读bios post过程笔记(2)

分类:BIOS_study

2007/3/1

 

20017-----内存自检之前的外部cache的初始化

     确保cpu cache 的关闭(使无效)

21.        0CC-----恢复内存配置

 

22  028------在热启动中对内存的自检

 csRamAutosizeJ(Interface.asm)-à检测SDRAM/VCM/REGISTERED DIMM类型(impcode.asm---

1].preShadDramDetectFarJ: DRAM 类型与大小的例程-

   VIA _DRAM_Init  (viadram.asm)

àcsDRAMDetectionJ:检测DRAM的存在(DEBUG 005H

A.检测插槽的类型并设置寄存器: VIA DRAM的初始化(viadram.asm):   如果DDR2 DIMM内存插槽存在,则使registerDDR2有效位有效(via -----device0 function 3,register6c-----cs.inc

     B.检测内存的存在与否并并设置寄存器:(通过读spd来判断)

  -àcsDRAMFreqsettingJ:  (debug 010h)  :  根据SPD信息设置register62的值

 。。。。。。。。。。。。。。。。。。。。。。。

2].pbPostRamAutosizeJBX:

3].preShadEccDetectFarJ:如果DRAM支持ECC,则初始化ECC

   根据SPD值来初始化register808XH等的值

22.        028-------冷启动的DRAM的自检

csRamAutosizeJL  如上

028------pmpostDRAM的自检: 如上

2303A----cacheAutoSizeJ

240CB------csSaveMemConfigJ

25. 02A-------postZeroBaseRamJ:  chipset表中是基于0minimum RAM规格(ramtests.asm

2602C--------postRealAddressTestJ:

根据minimum RAM规格(ramtests.asm,测试最高地址线

27. 2E-----postBaseRamTestJ: 测试开始的4MB内存

基于minimum RAM位于chipset内存表中的规格(ramtests.asm)执行内存测试。次测试分为芯片地址线测试和内存测试

 

………..

++++++++++++++++++++++++++++++++++++++++++++++++

为了保存BCG空间,从postsegment段切换到compatsegment

1001-----postSetIpmiTimeFarJ

2.  20-----postRefreshTestJ

 

初始化所有硬件到已知状态

00A------cpuInintializeJ

00F----fdiskInitializeJ

 

自己动手写操作系统-----read log

分类:讀書

自己动手写操作系统-----P57(保护模式)

对书的浏览

P145------OS进入保护模式-------P221----end

深入理解計算機體系-----讀書記2007/2/24

分类:讀書

深入理解計算機體系

P138------程序的機器級表示   chapter 3

p241------處理器體系結構       chapter 4

更多日志..