Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть2 / АВМиС / besov / L3
.CPP#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);
}