转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
读写CMOS内存         ★★★★

读写CMOS内存

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1416 更新时间:2009/4/23 18:40:06

cmos内存的读写

一、CMOS内存信息详解
一般的PC/AT、286、386、486等微机均配有CMOS芯片,CMOS&127;芯片包含了一个实时钟
和64个字节的CMOS内存。在CMOS内存中,0-0DH为实时钟的有关信息,0E-&127;3FH包含
计算机的硬件配置信息,如常规内存的大小、扩展内存的大小、&127;软盘的类型、固定
盘的类型及其物理参数、显示器的类型等,这些参数与计算机能否正常工作具有密切的
关系,另外还有计算机的开机口令和其它辅助设置信息。表1列出了&127;CMOS内存各字
节的用途。
表1 CMOS内存配置信息的含义
地 址
 功能
 说明
0,1
 秒,秒报警
  
2,3
 分,分报警
  
4,5
 时,时报警
  
6
 星期几
  
7,8,9
 日,月,年
  
A
 状态寄存器A
  
B
 状态寄存器B
  
C
 状态寄存器C
  
D
 状态寄存器D
 0=电池失效,80=电池有效
E
 诊断状态
  
F
 关机状态
 由上电诊断定义
10
 软驱
 高4位为A驱,低4位为B驱,0=无, 1=360KB, 2=1.2KB, 4=1.44KB, 6=720KB
11
 保留
  
12
 固定盘
 高4位为C驱,低4位为D驱,0=无,F=用户定义盘, 其它为系统定义盘
13
 保留
  
14
 设备状态
 标志驱动器数、显示器类型、有无数学处理器等
15-16
 内存
 以KB计的常规内存数,100H=256KB,200H=512KB, 280H=640KB
17-18
 扩展内存
 以KB计的扩展内存数,200H=512KB,400H=1024KB等
19
 C盘类型数
 根据具体硬盘类型而定
1A
 D盘类型数
 根据具体硬盘类型而定
1B-1C
 保留
  
1D-1E
 C盘柱体数
 1D-2CH只有当硬盘为用户自定义类型时起作用
1F
 C盘面数
  
20-21
 C盘WP
  
22-23
 C盘LZ
  
24
 C盘每柱扇区
  
25-26
 D盘柱体数
  
27
 D盘面数
  
28-29
 D盘WP
  
2A-2B
 D盘LZ
  
2C
 D盘每柱扇区
  
2D
 保留
  
2E-2F
 校验和
 为10-2DH共30个字节的和数,2EH为高位,2FH为低位
30-31
 扩展内存
  
32
 日期的世纪数
 BCD码的世纪值,如1995年的世纪数为19
33
 标志信息
  
34-3F
 保留
  
                *地址栏均为16进制表示
二、读写CMOS内存的方法
CMOS内存的地址口和数据口的口地址分别为70H和71H。在对CMOS内存进行写操作时,首先
将要写入的CMOS内存的地址送到口地址70H,&127;再将要写入的数据送口地址71H。在对
CMOS内存进行读操作时,首先将要读出的CMOS内存的地址送到口地址70H,再从口地址71H
读出数据到AL寄存器。
三、程序设计与使用
为了方便系统信息丢失后CMOS信息的恢复,作者用BORLAND PASCAL&127;设计了一个CMOS
.PAS的程序,它可以将CMOS内存中的信息直接写入文件,也可以把文件中的信息写入CMOS
内存,同时可以对CMOS内存中的信息进行编辑修改,并重新写回CMOS内存。它不仅解决了
没有SETUP程序的计算机在加电时不能设置CMOS内存的问题,同时解决了CMOS信息的保存
和恢复问题,是广大计算机用户的一个好帮手。
该程序的使用很简单,在DOS提示符下打CMOS,即显示该程序的使用方法,&127;具体使用
方法是:
CMOS [/开关]
开关有3个:
R --- 读取CMOS内存信息,并将其存入CMOS.DAT的文件,共占64个字节。
W --- 从CMOS.DAT中读取信息,并将其写入CMOS内存。&127;注意这样写入的CMOS信息,其
时间和日期是不正确的,写完之后应当用DOS命令DATE和TIME&127;设置正确的日期和时间

M --- 从CMOS中读取当前信息,进行修改,然后将其写入CMOS内存和CMOS.DAT的文件。
四、程序清单
由于篇幅的限制,程序中略去了用TURBO &127;VISION&127;编写的程序界面部分。
program CMOS;
type
TCMOSType = record
    Seconds : byte;
    SecondAlarm : byte;
    Minutes : byte;
    MinuteAlarm : byte;
    Hours : byte;
    HourAlarm : byte;
    DayOfWeek : byte;
    DayOfMonth : byte;
    Month : byte;
    Year : byte;
    StatusRegA : byte;
    StatusRegB : byte;
    StatusRegC : byte;
    StatusRegD : byte;
    DiagStatus : Byte;
    ShutDownStatus : Byte;
    FloppyDrive : byte;
    Reserved1 : byte;
    FixedDrive : Byte;
    Reserved2 : byte;
    Equipment : byte;
    RAM : word;
    XMS : word;
    FixedDriveType1 : byte;
    FixedDriveType2 : byte;
    Reserved3 : word;
    Cylinder1 : word;
    Head1 : byte;
    WP1 : word;
    LZ1 : word;
    Sector1 : byte;
    Cylinder2 : word;
    Head2 : byte;
    WP2 : word;
    LZ2 : word;
    Sector2 : byte;
    Sys : byte;
    CheckSum : word;
    XMS1 : word;
    DateCentury : byte;
    InfoFlags : byte;
    Reserved4: array[1..12] of byte;
end;
TByte64 = array[1..64] of byte;
TCMOS = object
    CMOSRec : TCMOSType;
    procedure ReadCMOS;
    procedure WriteCMOS;
    procedure DisplayCMOS;
    procedure ModifyCMOS;
    procedure ReadFile;
    procedure WriteFile;
end;
procedure TCMOS.ReadFile;
var
    f1 : file;
    data : tbyte64 absolute CMOSRec;
    ch : char;
begin
    write(''''Please input the drive name (A/B/C/D): '''');
    readln(ch);
    assign(f1,ch+'''':\CMOS.DAT'''');
    reset(f1,1);
    blockread(f1,data,sizeof(data));
    close(f1);
end;
procedure TCMOS.WriteFile;
var
    f1:file;
    data : tbyte64 absolute CMOSRec;
    ch : char;
begin
    write(''''Please input the drive name (A/B/C/D): '''');
    readln(ch);
    assign(f1,ch+'''':\CMOS.DAT'''');
    rewrite(f1,1);
    blockwrite(f1,data,sizeof(data));
    close(f1);
end;
procedure TCMOS.ReadCMOS;
begin
asm
les di,self
add di,CMOSRec
MOV CX,40H
MOV AH,0H
MOV BX,0
@1:
MOV DX,70H
MOV AL,AH
OUT DX,AL
INC DX
in AL,dx
MOV BYTE PTR es:[di+BX],al
INC AH
INC BX
DEC CX
JNZ @1
end;
end;
procedure TCMOS.WriteCMOS;
begin
asm
les di,self
add di,CMOSRec
MOV CX,40H
MOV AH,0H
MOV BX,0
@1:
MOV DX,70H
MOV AL,AH
OUT DX,AL
MOV AL,BYTE PTR es:[di+BX]
INC DX
OUT DX,AL
INC AH
INC BX
DEC CX
JNZ @1
end;
end;
procedure TCMOS.DisplayCMOS;
var
hd1,hd2,fd1,fd2 : byte;
begin
Writeln(^J^M''''CMOS RAM information:'''');
writeln(''''Date(MM-DD-YY): '''',CMOSRec.Month shr 4,CMOSRec.Month and $f,
''''-'''',CMOSRec.DayOfMonth shr 4,CMOSRec.DayOfMonth and $f,
''''-'''',CMOSRec.Year shr 4,CMOSRec.Year and $f);
writeln(''''Time(HH:MM:SS): '''',CMOSRec.Hours shr 4,CMOSRec.Hours and $f,
'''':'''',CMOSRec.Minutes shr 4,CMOSRec.Minutes and $f,
'''':'''',CMOSRec.Seconds shr 4,CMOSRec.Seconds and $f);
writeln(''''Conventional Memory: '''',CMOSRec.Ram,''''KB'''');
writeln(''''Extended Memory: '''',CMOSRec.XMS,''''KB'''');
hd2 := CMOSRec.FixedDrive and $f;
hd1 := CMOSRec.FixedDrive shr 4;
if (hd1 <> 0) then
begin
writeln(''''Fixed Drive 1: '''',CMOSRec.FixedDriveType1);
writeln('''' Cylinder : '''',CMOSRec.Cylinder1);
writeln('''' Head : '''',CMOSRec.Head1);
writeln('''' Sector: '''',CMOSRec.Sector1);
writeln('''' LZ: '''',CMOSRec.LZ1);
writeln('''' WP: '''',CMOSRec.WP1);
end;
if (hd2 <> 0) then
begin
writeln(''''Fixed Drive 2: '''',CMOSRec.FixedDriveType2);
writeln('''' Cylinder : '''',CMOSRec.Cylinder2);
writeln('''' Head : '''',CMOSRec.Head2);
writeln('''' Sector: '''',CMOSRec.Sector2);
writeln('''' LZ: '''',CMOSRec.LZ2);
writeln('''' WP: '''',CMOSRec.WP2);
end;
fd2 := CMOSRec.FloppyDrive and $f;
fd1 := CMOSRec.FloppyDrive shr 4;
if (fd1 <> 0) then
begin
write(''''Floppy Drive 1 : '''');
case fd1 of
1 : writeln(''''360KB 5.25'''''''''''');
2 : writeln(''''1.2MB 5.25'''''''''''');
4 : writeln(''''1.44MB 3.5'''''''''''');
6 : writeln(''''720KB 3.5'''''''''''');
end;
end ;
if (fd2 <> 0) then
begin
write(''''Floppy Drive 2 : '''');
case fd2 of
1 : writeln(''''360KB 5.25'''''''''''');
2 : writeln(''''1.2MB 5.25'''''''''''');
4 : writeln(''''1.44MB 3.5'''''''''''');
6 : writeln(''''720KB 3.5'''''''''''');
end;
end;
end;
procedure TCMOS.ModifyCMOS;
var
hd1,hd2,fd1,fd2 : byte;
data : tbyte64 absolute CMOSRec;
i : word;
begin
Writeln(''''Please input CORRECT CMOS information !'''');
write(''''Conventional Memory ('''',CMOSRec.ram,''''KB): '''');readln(CMOSRec.ram);
write(''''Extended Memory ('''',CMOSRec.XMS,''''KB): '''');readln(CMOSRec.XMS);
write(''''Type of Fixed Disk 1: ('''',CMOSRec.FixedDriveType1,''''): '''');readln(CMOSRe
c.FixedDriveType1);
write('''' Cylinder ('''',CMOSRec.Cylinder1,''''):''''); readln(CMOSRec.Cylinder1);
write('''' Head ('''',CMOSRec.Head1,''''): '''');readln(CMOSRec.Head1);
write('''' Sector ('''',CMOSRec.Sector1,''''): '''');readln(CMOSRec.Sector1);
write('''' LZ ('''',CMOSRec.LZ1,''''): '''');readln(CMOSRec.LZ1);
write('''' WP ('''',CMOSRec.WP1,''''): '''');readln(CMOSRec.WP1);
write(''''Type of Fixed Disk 2: ('''',CMOSRec.FixedDriveType2,''''): '''');readln(CMOSRe
c.FixedDriveType2);
write('''' Cylinder ('''',CMOSRec.Cylinder2,''''):''''); readln(CMOSRec.Cylinder2);
write('''' Head ('''',CMOSRec.Head2,''''): '''');readln(CMOSRec.Head2);
write('''' Sector ('''',CMOSRec.Sector2,''''): '''');readln(CMOSRec.Sector2);
write('''' LZ ('''',CMOSRec.LZ2,''''): '''');readln(CMOSRec.LZ2);
write('''' WP ('''',CMOS

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台