#include #include #include #include #include /* Определение адресов регистров порта */ #define OUT_REG BASE /*Регистр передачи данных */ #define IN_REG BASE /*Регистр приема данных */ #define LOW_DIV BASE /*Младший байт делителя*/ #define HIGH_DIV BASE+1 /*Старший байт делителя*/ #define INT_REG BASE+1 /*Маска разрешеннах прерываний*/ #define INT_ID_REG BASE+2 /*Причина прерывания*/ #define CONTROL BASE+3 /*Управляющее слово УАПП*/ #define MODEM BASE+4 /*Ругистр управления статических сигналов*/ #define STATUS BASE+5 /*Состояние УАПП*/ #define M_STATUS BASE+6 /*Состояние статистических сигналов*/ /*********Определение основных констант ************/ /******Скорость передачи B_????? в бодах ******/ #define B_110 1040 #define B_150 768 #define B_300 384 #define B_600 192 #define B_1200 96 #define B_2400 48 #define B_4800 24 #define B_9600 13 /********Маски разрешенных прерываний **********/ #define DATA_REC 0x01 /*Данные приняты */ #define EMPTY_BUF 0x02 /*Буфер передачи пуст */ #define ERROR 0x04 /*Ошибка при приеме данных */ #define MODEM_INT 0x08 /*Изменилось состояние статистических сигналов*/ /*Управляющие константы*/ #define DIVISOR 0x80 /*Бит управления доступом к регистрам*/ #define BIT_8 0x03 /*Длина посылки 8 бит */ #define BIT_7 0x02 /*Длина посылки 7 бит */ #define STOP_1 0x00 /*1 стоповый бит */ #define STOP_2 0x04 /*2 стоповый бит */ #define NOPARITY 0x00 /*Нет контроля четности */ #define DTR 0x01 /*Управление линией DTR */ #define RTS 0x02 /*Управление линией RTS */ /*Маски готовности */ #define DATA_IN 0x01 /*Данные приняты */ #define OVERRUN 0x02 /*Переполнение */ #define FRAME_ERR 0x08 /*Ошибка формата посылки */ #define DATA_OUT 0x20 /*Готов к передаче */ /*Маски состояния статических сигналов */ #define CTS 0x10 /*Состояние линии CTS (приемник) */ #define DSR 0x20 /*Состояние линии DSR (передатчик) */ #define ESC 27 #define EOF (-1) /*Определение функций */ void init_port(void); int in_port(int *symbol,int timeout,int *error_code); int BASE=0x3F8; /*Базовый (первый) адрес блока регистров порт*/ FILE *f1; main() { char name[]="noname .bk "; int byte,error_code; int cod; int sum=0; int adr; int leng; init_port(); printf("\nИмя файла ="); gets(name); f1= fopen( name,"wb" ); if( f1 == 0 ) { printf("\n Ошибка открытия файла %s",name); } else { printf("\n Готов к приему файла %s",name); getchar(); in_port(&byte,50,&error_code); fputc(byte,f1); cod=byte; in_port(&byte,50,&error_code); fputc(byte,f1); adr=byte*256+cod; in_port(&byte,50,&error_code); /* printf("\n %o",byte); */ fputc(byte,f1); cod=byte; in_port(&byte,50,&error_code); fputc(byte,f1); leng=byte*256+cod; printf("\nИз адреса %o Длиной %o\n",adr,leng); byte=1; while( leng ) { cod=in_port(&byte,10,&error_code); if( cod == 0 ) { printf("%o \r",leng--); fputc(byte,f1); sum++; } else if( cod==2 ) { printf("= %o",error_code); exit(0); } } outportb(MODEM,0); fclose(f1); } printf("\nsumm=%o\n",sum); } /**********Инициализация порта***********/ void init_port(void) { outportb(CONTROL,DIVISOR); outportb(LOW_DIV,13); outportb(HIGH_DIV,13 >> 8); outportb(CONTROL,BIT_8+STOP_1+NOPARITY); outportb(INT_REG,0); outportb(MODEM,0); } /**********Прием байта из порта***********/ int in_port(int *symbol,int timeout,int *error_code) { long tmp; tmp=clock(); outportb(MODEM,RTS); do { if((clock()-tmp)>= timeout ) { printf("\nвремя приема прошло\n"); return (1); } *error_code=inportb(STATUS); } while (( *error_code & DATA_IN) == 0 ); if(( *error_code & (FRAME_ERR+OVERRUN))!=0) { printf("\nОшибка при приеме" ); return(2); } else { *symbol=inportb(IN_REG); outportb(MODEM,0); return(0); } }