+#ifdef HAVE_TERMIOS_H
+ int i;
+ struct termios tattr;
+#endif
+
+ set_name("mcs51_uart");
+ sfr= uc->address_space(MEM_SFR_ID);
+ if (sfr)
+ {
+ //sbuf= sfr->register_hw(SBUF, this, 0);
+ //pcon= sfr->register_hw(PCON, this, 0);
+ //scon= sfr->register_hw(SCON, this, 0);
+ register_cell(sfr, SBUF, &sbuf, wtd_restore_write);
+ register_cell(sfr, PCON, &pcon, wtd_restore_write);
+ register_cell(sfr, SCON, &scon, wtd_restore_write);
+ }
+
+ serial_in_file_option= new cl_optref(this);
+ serial_in_file_option->init();
+ serial_in_file_option->use("serial_in_file");
+ serial_out_file_option= new cl_optref(this);
+ serial_out_file_option->init();
+ serial_out_file_option->use("serial_out_file");
+
+ //char *fni, *fno;
+ /*if ((fni= serial_in_file_option->get_value((char*)0)))
+ serial_in= fopen(fni, "r");
+ if ((fno= serial_out_file_option->get_value((char*)0)))
+ serial_out= fopen(fno, "w");*/
+
+ //serial_in = (FILE*)application->args->get_parg(0, "Ser_in");
+ //serial_out= (FILE*)application->args->get_parg(0, "Ser_out");
+ serial_in = (FILE*)serial_in_file_option->get_value((void*)0);
+ serial_out= (FILE*)serial_out_file_option->get_value((void*)0);
+
+ if (serial_in != serial_out && serial_in)
+ {
+ // making `serial' unbuffered
+ if (setvbuf(serial_in, NULL, _IONBF, 0))
+ perror("Unbuffer serial input channel");
+#ifdef _WIN32
+ if (CH_SERIAL != get_handle_type((HANDLE)_get_osfhandle(fileno(serial_in))))
+#elif defined HAVE_TERMIOS_H
+ // setting O_NONBLOCK
+ if ((i= fcntl(fileno(serial_in), F_GETFL, 0)) < 0)
+ perror("Get flags of serial input");
+ i|= O_NONBLOCK;
+ if (fcntl(fileno(serial_in), F_SETFL, i) < 0)
+ perror("Set flags of serial input");
+ // switching terminal to noncanonical mode
+ if (isatty(fileno(serial_in)))
+ {
+ tcgetattr(fileno(serial_in), &saved_attributes_in);
+ tcgetattr(fileno(serial_in), &tattr);
+ tattr.c_lflag&= ~(ICANON|ECHO);
+ tattr.c_cc[VMIN] = 1;
+ tattr.c_cc[VTIME]= 0;
+ tcsetattr(fileno(serial_in), TCSAFLUSH, &tattr);
+ }
+ else
+#endif
+ fprintf(stderr, "Warning: serial input interface connected to a "
+ "non-terminal file.\n");
+ }
+ if (serial_out)
+ {
+ // making `serial' unbuffered
+ if (setvbuf(serial_out, NULL, _IONBF, 0))
+ perror("Unbuffer serial output channel");
+#ifdef _WIN32
+ if (CH_SERIAL != get_handle_type((HANDLE)_get_osfhandle(fileno(serial_out))))
+#elif defined HAVE_TERMIOS_H
+ // setting O_NONBLOCK
+ if ((i= fcntl(fileno(serial_out), F_GETFL, 0)) < 0)
+ perror("Get flags of serial output");
+ i|= O_NONBLOCK;
+ if (fcntl(fileno(serial_out), F_SETFL, i) < 0)
+ perror("Set flags of serial output");
+ // switching terminal to noncanonical mode
+ if (isatty(fileno(serial_out)))
+ {
+ tcgetattr(fileno(serial_out), &saved_attributes_out);
+ tcgetattr(fileno(serial_out), &tattr);
+ tattr.c_lflag&= ~(ICANON|ECHO);
+ tattr.c_cc[VMIN] = 1;
+ tattr.c_cc[VTIME]= 0;
+ tcsetattr(fileno(serial_out), TCSAFLUSH, &tattr);
+ }
+ else
+#endif
+ fprintf(stderr, "Warning: serial output interface connected to a "
+ "non-terminal file.\n");
+ }
+
+ class cl_hw *t2= uc->get_hw(HW_TIMER, 2, 0);
+ if ((there_is_t2= t2 != 0))
+ {
+ t_mem d= sfr->get(T2CON);
+ t2_baud= d & (bmRCLK | bmTCLK);
+ }
+ else
+ t2_baud= DD_FALSE;
+