\n'); } function setFlash(){ var myFlshObj = document.myFlash; var photoAlbum=document.getElementById('photoAlbum'); if(photoAlbum&&myFlshObj){ var awidth=0; awidth=parseInt(photoAlbum.offsetWidth); if(awidth<260) myFlshObj.height='150px'; if(awidth>=260 && awidth<350) myFlshObj.height='240px'; if(awidth>=350 && awidth<370) myFlshObj.height='305px'; if(awidth>=370 && awidth<550) myFlshObj.height='320px'; if(awidth>=550 && awidth<730) myFlshObj.height='455px'; if(awidth>=730) myFlshObj.height='590px'; } } function setAlbumUrl(name){ albumTypename=name; setFlash(); myFlash_DoFSCommand(null,"test"); } function showLoginWindow(ev){ var obj = document.getElementById("pop-login"); if(document.all){ obj.style.top = ev.clientY +'px'; obj.style.left = ev.clientX - 272 +'px'; } else{ obj.style.top = ev.pageY +'px'; obj.style.left = ev.pageX - 272 +'px' } obj.style.display ="block"; document.getElementById("pop-user-name").focus(); } function hideLoginWindow(){ document.getElementById("pop-login").style.display ="none"; } var blogID=getBlogID(); var UserName = ""; if(blogID!=null){ var tmpUserName=blogID.split("."); UserName=tmpUserName[0]; } function resize(obj){ if(window.event.srcElement.tagName == 'A'){ return; } obj.parentNode.childNodes[1].style.display = obj.parentNode.childNodes[1].style.display=='none' ? 'block': 'none'; obj.parentNode.childNodes[2].style.display = obj.parentNode.childNodes[2].style.display=='none' ? 'block': 'none'; } function tab(event){ var evt = (document.all)?window.event:event; if(evt.keyCode == 9){ document.getElementById("pop-password").focus(); return false; } else{ return evt.keyCode; } } function tab1(event){ var evt = (document.all)?window.event:event; if(evt.keyCode == 9){ document.getElementById("save").focus(); return false; } else{ return evt.keyCode; } } function tabTrack(event) { var evt = (document.all)?window.event:event; if(evt.keyCode == 9){ document.getElementById("pop-password-track").focus(); return false; } else{ return evt.keyCode; } }
一路飞翔
日志索引
日志
|
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,同步链环动态随机存取存储器)

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拔下的内存,当电源关掉后储存在里面的资料并不会流失掉,在写入资料时必须先将原本的资料清除掉,然后才能再写入新的资料,缺点为写入资料的速度太慢。
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
;;;; 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
;;;; 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 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
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 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.在新安装了软件和硬件后,最好重新制作映像文件,否则很可能在恢复后出现一些莫名其妙的错误。
在开始看本文以前,我先说明一下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中的缺省值。
经常在程序中看到类似如下的句子:
#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"
>
mov errorlevel,1 ; 1 is errol
mov al,errorlevel-------return value
mov ah,04ch
int 21h
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
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
chapter 2
P40-----
2.2.1
P43-----
2.1.6
p56
目錄:
1.網絡設備
P241-----275----295------481
P483---連接
20.017-----内存自检之前的外部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内存插槽存在,则使register的DDR2有效位有效(via -----device0 function 3,register
B.检测内存的存在与否并并设置寄存器:(通过读spd来判断)
-àcsDRAMFreqsettingJ: (debug 010h) : 根据SPD信息设置register62的值
。。。。。。。。。。。。。。。。。。。。。。。
2].pbPostRamAutosizeJBX:
3].preShadEccDetectFarJ:如果DRAM支持ECC,则初始化ECC
根据SPD值来初始化register80,8XH等的值
22. 028-------冷启动的DRAM的自检
csRamAutosizeJL 如上
028------pmpost的DRAM的自检: 如上
23.
24.0CB------csSaveMemConfigJ
25.
26.
根据minimum RAM规格(ramtests.asm),测试最高地址线
27. 2E-----postBaseRamTestJ: 测试开始的4MB内存
基于minimum RAM位于chipset内存表中的规格(ramtests.asm)执行内存测试。次测试分为芯片地址线测试和内存测试
………..
++++++++++++++++++++++++++++++++++++++++++++++++
为了保存BCG空间,从postsegment段切换到compatsegment段
1.001-----postSetIpmiTimeFarJ
2. 20-----postRefreshTestJ
初始化所有硬件到已知状态
00F----fdiskInitializeJ
自己动手写操作系统-----P57(保护模式)
对书的浏览
P145------OS进入保护模式-------P221----end
深入理解計算機體系
P138------程序的機器級表示 chapter 3
p241------處理器體系結構 chapter 4