Скачиваний:
25
Добавлен:
15.09.2014
Размер:
2.56 Кб
Скачать
#include<dos.h>
#include <ctype.h>
#include <stdio.h>
#include <conio.h>



char* names[] =  {"sec", "min", "hour", "weekday", "mounthday", "mounth", "year"};
int registers[] ={0x00, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09};
int count = 7;
char tmp;

void printf_bits(char val)
{
	int i;
	char g;
	g=0x80;
	for (i = 0; i < 8; i++)
	{
		if (val & g)  printf("1");
		else          printf("0");

		val = val << 1;
	}
}

void pre_head()
{
	char sevenbit;
	char value;
	sevenbit=0x80;
	do
	{
		outp(0x70, 0x0A);
	} while( inp(0x71) & sevenbit );

	outp(0x70, 0x0B);
	value = inp(0x71);
	value=0x80;
	outp(0x70, 0x0B);
	outp(0x71, value);
}

void post_head()
{

	char value;
	outp(0x70, 0x0B);
	value = inp(0x71);
	asm and value, 01111111b
	outp(0x70, 0x0B);
	outp(0x71, value);
}

void read_time()
{
	pre_head();
	for (int i = 0; i < count; i++)
	{
		outp(0x70, registers[i]);
		char val = inp(0x71);
		printf("%-10s = %c%c \n", names[i], (val>>4)+'0', (val&0xf)+'0');
	}
	post_head();
}

void write_time()
{
	pre_head();
	for (int i = 0; i < count; i++)
	{
		printf("new %-10s = ", names[i]);
		int value;
		scanf("%d", &value);
		char val = ((value/10)<<4)|(value%10);
		outp(0x70, registers[i]);
		outp(0x71, val);
	}
	post_head();
}

unsigned long global;

void delay(unsigned long how)
{
	global = 0;
	while(global != how);
}



void interrupt far handler(...)
{
	global++;
	outp(0x70,0x0C);
	tmp = inp(0x71);
	outp(0xa0,0x20);
	outp(0x20,0x20);
}

void delay_test()
{
	pre_head();
	unsigned long how;
	printf("Enter delay time in millisecs: ");
	scanf("%ld", &how);
	printf("Testing delay ...");
	int temp,temp1=0;
	while(1)
	{
		outp(0x70, 0x0C);
		inp(0x0C);
		outp(0x70, 0x0B);
		temp=0;
		if(temp=inp(0x70))temp1++;
		if(temp1==how)break;
		//printf("0x%X. %d\n",temp, temp1);
	}
	//delay(how);
	printf("\nEnd\n");
	post_head();
}
main()
{
	clrscr();
	char c, value;
      //	outp(0xA1,0x00);
	outp(0x70, 0x0B);
	value = inp(0x71);
	//asm and value, 11111011b
	outp(0x70, 0x0B);
	outp(0x71, value);
	disable();
	void interrupt (*oldhandler)(...) = getvect(0x70);
	setvect(0x70, handler);
	enable();
	outp(0xA1, inp(0xA1) & 0xfe);
	while(1)
	{
		printf(" r - read | w - write | d - delay | q - quit \n");
		c = getch();
		c = tolower(c);//konvertirovanie v nizhnij registr
		if(c == 'r') read_time();
		if(c == 'w') write_time();
		if(c == 'd') delay_test();
		if(c == 'q') break;
	}
	setvect(0x70, oldhandler);
}
Соседние файлы в папке besov