X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=sw%2Fdumprest%2Foriginal%2Fcomm.c;fp=sw%2Fdumprest%2Foriginal%2Fcomm.c;h=b17aa50d1cbb87a1fd8ca4683488278cd874383d;hb=81e70d488b71bf995c459ca3a02c025993460ffa;hp=0000000000000000000000000000000000000000;hpb=07ec0278333ed187ac242dedcff13c56cf1b0b91;p=pdp8.git diff --git a/sw/dumprest/original/comm.c b/sw/dumprest/original/comm.c new file mode 100644 index 0000000..b17aa50 --- /dev/null +++ b/sw/dumprest/original/comm.c @@ -0,0 +1,216 @@ + +#ifdef PC +PORT port_handle; + + +void (interrupt EN_FAR *(old_vect23))(void); +void (interrupt EN_FAR *(old_vect1b))(void); + +/* Trap break etc to allow program to terminate on PC */ +void interrupt EN_FAR en_ctrl_brk() +{ + terminate = 1; +} +void interrupt EN_FAR en_ctrl_c() { + terminate = 1; +} + +int ser_read(int fd,char *buf,int bufsize) +{ + int bufcnt = 0; + int t; + + t = com_getc(&port_handle); + while (t != -1 && bufcnt < bufsize) { + *(buf++) = t; + t = com_getc(&port_handle); + bufcnt++; + } + return bufcnt; +} + +int ser_write(int fd,char *buf,int bufsize) +{ + int bufcnt = bufsize; + + while (bufsize-- > 0) { + while (com_putc(*buf,&port_handle) != 0); + buf++; + } + return bufcnt; +} + +void cleanup(void) +{ + while (!terminate && port_handle.tx_cnt != 0) + ; + if (terminate) + com_clear_que(RX | TX, &port_handle); + suspend(50); + printf("Parity err %d framing err %d overrun err %d dropped %d\n", + port_handle.parity_errs,port_handle.framing_errs, + port_handle.overrun_errs,port_handle.rx_overflow); + com_port_destroy(&port_handle); + end_clock(); + setvect(0x23, old_vect23); /* restore ^C, ^Break */ + setvect(0x1b, old_vect1b); +} + +int init_comm(char *cport,long baud,int two_stop) +{ + printf("Port: %s, Baud rate: %i\n", port, baud); + int port; + int base,irq; + + if (sscanf(cport,"%x,%x",&base,&irq) == 2) { + port = COM1; + com_config(COM1,base,irq); + } else { + if (strlen(cport) != 4 || strnicmp(cport,"COM",3) != 0 || + (cport[3] > '4' || cport[3] < '1')) { + printf("Illegal port %s, must be com1 to com4\n",cport); + exit(1); + } + switch(cport[3]) + { + case '1': port = COM1; break; + case '2': port = COM2; break; + case '3': port = COM3; break; + case '4': port = COM4; break; + default: + printf("Illegal port %s, must be com1 to com4\n",cport); + exit(1); + } + } + if( com_port_create(port, baud,'N',8,1 + two_stop, 4096, 4096, + &port_handle) < 0 ) + { + printf("Cannot create COM port"); + exit(1); + } + + init_clock(0x3333); + + /*--------- take over 0x23 and 0x1B to suppress CTRL-C and Break ---------*/ + old_vect23 = getvect(0x23); + old_vect1b = getvect(0x1b); + setvect(0x23, en_ctrl_c); + setvect(0x1b, en_ctrl_brk); + atexit(cleanup); + + com_clear_que(RX | TX, &port_handle); + + if (port_handle.uart_type == ID_16550) { + fifo_enable(&port_handle); + com_fifo_trigger(RX_TRIG_4,&port_handle); + } + + return 0; +} + + +int getchar_nonblock(void) { + if (kbhit()) { + return getch(); + } else{ + return 0; + } +} + +#else + +#define ser_read(a,b,c) read(a,b,c) +#define ser_write(a,b,c) write(a,b,c) + +#ifdef _STDC_ +int init_comm(char *, long, int); +#endif + +int init_comm(port,baud,two_stop) + char *port; + long baud; + int two_stop; + +{ + printf("Port: %s, Baud rate: %i\n", port, baud); + + struct termios tios; /* Serial port TERMIO structure */ + int port_fd; + + port_fd = open(port,O_RDWR,0); + if (port_fd < 0) { + fprintf (stderr,"init_comm: Open failed on port '%s': ",port); + perror(""); + exit(1); + } + + /* Set to 8 bit selected baud no parity with no special processing */ + if (tcgetattr(port_fd,&tios) < 0) { + perror("init_comm: tcgetattr failed"); + exit(1); + } + tios.c_cflag = CS8 | CREAD | HUPCL | CLOCAL | baud; + if (two_stop) + tios.c_cflag |= CSTOPB; + tios.c_iflag = 0; + tios.c_lflag = 0; + tios.c_oflag = 0; + tios.c_cc[VMIN] = 0; + tios.c_cc[VTIME] = 1; + + if (cfsetispeed(&tios,baud) != 0) + printf("init_comm: set ispeed failed\n"); + if (cfsetospeed(&tios,baud) != 0) + printf("init_comm: set ospeed failed\n"); + + if (tcsetattr(port_fd,TCSANOW,&tios) < 0) { + perror("init_comm: tcsetattr failed"); + exit(1); + } + tcflush(port_fd,TCIOFLUSH); + return(port_fd); +} + +struct termios orig_tios; /* Serial port TERMIO structure */ + +void restore_termio() { + if (tcsetattr(STDIN_FILENO,TCSANOW,&orig_tios) < 0) { + perror("restore_termio: tcsetattr failed"); + exit(1); + } + printf("Terminal settings restored\n"); + + exit(0); +} + +void set_input_nonblock() { + struct termios tios; /* Serial port TERMIO structure */ + + signal(SIGINT, restore_termio); + if (tcgetattr(STDIN_FILENO,&orig_tios) < 0) { + perror("set_input_nonblock: tcgetattr failed"); + exit(1); + } + if (tcgetattr(STDIN_FILENO,&tios) < 0) { + perror("tcgetattr failed"); + exit(1); + } + tios.c_cc[VMIN] = 0; + tios.c_cc[VTIME] = 0; + tios.c_lflag &= ~(ICANON | ECHO); + if (tcsetattr(STDIN_FILENO,TCSANOW,&tios) < 0) { + perror("set_input_nonblock: tcsetattr failed"); + exit(1); + } +} + +int getchar_nonblock(void) { + static int init = 0; + if (!init) { + set_input_nonblock(); + init = 1; + } + + return getchar(); +} +#endif