⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 settd.c

📁 Many C samples. It is a good sample for students to learn C language.
💻 C
字号:
typedef int FILE;
#define CMOS_ADR 0x70
#define CMOS_DATA 0x71
#define CMOS_BYTES 64
extern char *index();
extern int _rax, _rbx, _rcx, _rdx;
int RAX, RBX, RCX, RDX;
char *p; char cmosfilename[] = "\\CMOSINFO";
char cmos[CMOS_BYTES]; 
int hour,minute,second; 
int day,month,year,century; 
int dayofweek; 
char *monthname[] = {"Jan", 
                    "Feb",
                    "Mar",
                    "Apr",
                    "May",
                    "Jun",
                    "Jul",
                    "Aug",
                    "Sep",
                    "Oct",
                    "Nov",
                    "Dec"
                   };
char *dayname[] = {"Sunday",
                  "Monday",
                  "Tuesday",
                  "Wednesday",
                  "Thursday",
                  "Friday",
                  "Saturday"
                 };

main(argc,argv)
int argc;
char *argv[];
{int i,j,flag;
 FILE *fp;
 if (argc < 2)
   {printf("\n");
    printf("\nThis program will save and restore the AT's CMOS data, which");
    printf("\nincludes, but is not limited to, the configuration, and the");
    printf("\ntime and date.  This program will also let you change the time");
    printf("\nand date (The DOS DATE and TIME commands do not work).");
    printf("\n");
    printf("\nTo save the configuration (do this before your battery dies)");
    printf("\nC:>settd /s (will store configuration in file \\CMOSINFO.)");
    printf("\n");
    printf("\nTo restore the configuration (do this after you replace your battery)");
    printf("\nC:>settd /r (will restore from file \\CMOSINFO.)");
    printf("\n");
    printf("\nTo set the time and date (either one is optional):");
    printf("\nC:>settd hh:mm:ss dd-mm-yy");
    printf("\n");
    printf("\nTo display the current time and date:");
    printf("\nC:>settd /d");
    printf("\n");
    exit(0);
   }
 for (i=1; i<argc; ++i)
   {p = index(argv[i],'/');
    if (p != 0)
      {flag = toupper(*(p+1));
       switch(flag)
         {case 'S': /* Save CMOS info */
                    for (j = 0; j<CMOS_BYTES; ++j)
                       {_outb(j,CMOS_ADR);         /* Tell CMOS which byte */
                        j = j;                     /* Kill some time */
                        cmos[j] = _inb(CMOS_DATA); /* Read byte from CMOS */
                       }
                    fp = creat(cmosfilename);
                    write(fp,cmos,CMOS_BYTES);
                    close(fp);
                    break;

          case 'R': /* Restore CMOS info */
                    get_current_td();
                    fp = open(cmosfilename,0);
                    read(fp,cmos,CMOS_BYTES);
                    close(fp);
                    for (j = 0; j<CMOS_BYTES; ++j)
                       {_outb(j,CMOS_ADR);         /* Tell CMOS which byte */
                        j = j;                     /* Kill some time */
                        _outb(cmos[j],CMOS_DATA);  /* Send byte to CMOS */
                       }
                    set_current_td();
                    break;

          case 'D': /* Display current time and date */
                    get_current_td();
                    printf("\n\n%02d:%02d:%02d  %s  %d %s %d\n\n"
                          ,hour
                          ,minute
                          ,second
                          ,dayname[dayofweek]
                          ,day
                          ,monthname[month-1]
                          ,century * 100 + year
                          );
                    break;
         }
      }
    if (index(argv[i],':') != 0) /* Set time */
      {sscanf(argv[i],"%d:%d:%d",&hour,&minute,&second);
       set_current_t();
      }
    if (index(argv[i],'-') != 0) /* Set date */
      {sscanf(argv[i],"%d-%d-%d",&day,&month,&year);
       if (month > 12) {j = month; month = day; day = j;}
       if (year < 100) year += 1900;
       if (year < 1980) year += 100;
       century = year / 100;
       year %= 100;
       set_current_d();
      }
   }
} 

get_current_td()
{
 RAX = 0x2A00;
 _rax = RAX;
 _doint(0x21);
 RAX = _rax;
 RCX = _rcx;
 RDX = _rdx;
 dayofweek = RAX & 0x00FF;
 century = RCX / 100;
 year = RCX % 100;
 month = (RDX >> 8) & 0x00FF;
 day = RDX & 0x00FF;
 RAX = 0x2C00;
 _rax = RAX;
 _doint(0x21);
 RAX = _rax; RCX = _rcx; RDX = _rdx;
 hour = (RCX >> 8) & 0x00FF;
 minute = RCX & 0x00FF;
 second = (RDX >> 8) & 0x00FF;
}

set_current_td()
{set_current_t();
 set_current_t();
}

set_current_t()
{
 RCX = (((hour/10) << 4) + (hour % 10)) << 8;
 RCX += ((minute/10) << 4) + (minute % 10);
 RDX = (((second/10) << 4) + (second % 10)) << 8;
 RAX = 0x0300;
 _rax = RAX; _rcx = RCX; _rdx = RDX;
 _doint(0x1A);
 RCX = (hour << 8) + minute;
 RDX = second << 8;
 RAX = 0x2D00;
 _rax = RAX; _rcx = RCX; _rdx = RDX;
 _doint(0x21);
}

set_current_d()
{
 RCX = (((century/10) << 4) + (century % 10)) << 8;
 RCX += ((year/10) << 4) + (year % 10);
 RDX = (((month/10) << 4) + (month % 10)) << 8;
 RDX += ((day/10) << 4) + (day % 10);
 RAX = 0x0500;
 _rax = RAX; _rcx = RCX; _rdx = RDX;
 _doint(0x1A);
 RCX = century * 100 + year;
 RDX = (month << 8) + day;
 RAX = 0x2B00;
 _rax = RAX; _rcx = RCX; _rdx = RDX;
 _doint(0x21);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -