OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /eco32/trunk
    from Rev 242 to Rev 243
    Reverse comparison

Rev 242 → Rev 243

/sim/term.c
223,81 → 223,79
}
 
 
static int openPty(int *master, int *slave, char *name) {
/* try to open master */
strcpy(name, "/dev/ptmx");
*master = open(name, O_RDWR | O_NONBLOCK);
if (*master < 0) {
/* open failed */
return -1;
}
grantpt(*master);
unlockpt(*master);
/* master opened, try to open slave */
strcpy(name, ptsname(*master));
*slave = open(name, O_RDWR | O_NONBLOCK);
if (*slave < 0) {
/* open failed, close master */
close(*master);
return -1;
}
/* all is well */
return 0;
}
static void makeRaw(int fd) {
struct termios t;
 
 
static void makeRaw(struct termios *tp) {
tp->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
tp->c_oflag &= ~OPOST;
tp->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
tp->c_cflag &= ~(CSIZE|PARENB);
tp->c_cflag |= CS8;
tcgetattr(fd, &t);
t.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
t.c_oflag &= ~OPOST;
t.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
t.c_cflag &= ~(CSIZE|PARENB);
t.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &t);
}
 
 
void termInit(int numTerms) {
int master, slave;
char ptyName[100];
char ptyTitle[100];
struct termios termios;
void termInit(int numTerms, Bool hasTerm[]) {
int i;
int master;
char slavePath[100];
int slave;
char termTitle[100];
char termSlave[100];
 
numTerminals = numTerms;
for (i = 0; i < numTerminals; i++) {
/* open pseudo terminal */
if (openPty(&master, &slave, ptyName) < 0) {
error("cannot open pseudo terminal %d", i);
master = open("/dev/ptmx", O_RDWR | O_NONBLOCK);
if (master < 0) {
error("cannot open pseudo terminal master for serial line %d", i);
}
grantpt(master);
unlockpt(master);
strcpy(slavePath, ptsname(master));
if (debug) {
cPrintf("pseudo terminal '%s': master fd = %d, slave fd = %d\n",
ptyName, master, slave);
cPrintf("pseudo terminal %d: master fd = %d, slave path = '%s'\n",
i, master, slavePath);
}
/* set mode to raw */
tcgetattr(slave, &termios);
makeRaw(&termios);
tcsetattr(slave, TCSANOW, &termios);
/* fork and exec a new xterm */
terminals[i].pid = fork();
if (terminals[i].pid < 0) {
error("cannot fork xterm process %d", i);
if (hasTerm[i]) {
/* connect a terminal to the serial line */
/* i.e., fork and exec a new xterm process */
terminals[i].pid = fork();
if (terminals[i].pid < 0) {
error("cannot fork xterm process for serial line %d", i);
}
if (terminals[i].pid == 0) {
/* terminal process */
setpgid(0, 0);
close(master);
/* open and configure pseudo terminal slave */
slave = open(slavePath, O_RDWR | O_NONBLOCK);
if (slave < 0) {
error("cannot open pseudo terminal slave '%s'\n", slavePath);
}
makeRaw(slave);
/* exec xterm */
sprintf(termTitle, "ECO32 Terminal %d", i);
sprintf(termSlave, "-Sab%d", slave);
execlp("xterm", "xterm", "-title", termTitle, termSlave, NULL);
error("cannot exec xterm process for serial line %d", i);
}
} else {
/* leave serial line unconnected */
terminals[i].pid = 0;
cPrintf("Serial line %d can be accessed by opening device '%s'.\n",
i, slavePath);
}
if (terminals[i].pid == 0) {
/* terminal process */
setpgid(0, 0);
close(2);
close(master);
sprintf(ptyName, "-Sab%d", slave);
sprintf(ptyTitle, "ECO32 Terminal %d", i);
execlp("xterm", "xterm", "-title", ptyTitle, ptyName, NULL);
error("cannot exec xterm process %d", i);
}
fcntl(master, F_SETFL, O_NONBLOCK);
terminals[i].in = fdopen(master, "r");
setvbuf(terminals[i].in, NULL, _IONBF, 0);
terminals[i].out = fdopen(master, "w");
setvbuf(terminals[i].out, NULL, _IONBF, 0);
/* skip the window id written by xterm */
while (fgetc(terminals[i].in) != '\n') ;
if (hasTerm[i]) {
/* skip the window id written by xterm */
while (fgetc(terminals[i].in) != '\n') ;
}
}
termReset();
}
/sim/term.h
25,7 → 25,7
void termWrite(Word addr, Word data);
 
void termReset(void);
void termInit(int numTerms);
void termInit(int numTerms, Bool hasTerm[]);
void termExit(void);
 
 
/sim/main.c
26,26 → 26,32
 
static void usage(char *myself) {
fprintf(stderr, "Usage: %s\n", myself);
fprintf(stderr, " [-i] set interactive mode\n");
fprintf(stderr, " [-m <n>] install n MB of RAM (1-%d)\n",
fprintf(stderr, " [-i] set interactive mode\n");
fprintf(stderr, " [-m <n>] install n MB of RAM (1-%d)\n",
RAM_SIZE_MAX / M);
fprintf(stderr, " [-l <prog>] set program file name\n");
fprintf(stderr, " [-a <addr>] set program load address\n");
fprintf(stderr, " [-r <rom>] set ROM image file name\n");
fprintf(stderr, " [-d <disk>] set disk image file name\n");
fprintf(stderr, " [-t <n>] connect n terminals (0-%d)\n",
fprintf(stderr, " [-l <prog>] set program file name\n");
fprintf(stderr, " [-a <addr>] set program load address\n");
fprintf(stderr, " [-r <rom>] set ROM image file name\n");
fprintf(stderr, " [-d <disk>] set disk image file name\n");
fprintf(stderr, " [-t <n>] connect n terminals (0-%d)\n",
MAX_NTERMS);
fprintf(stderr, " [-g] install graphics controller\n");
fprintf(stderr, " [-c] install console\n");
fprintf(stderr, " [-o <file>] bind output device to file\n");
fprintf(stderr, " [-n <k>] no terminal on line k (0-%d)\n",
MAX_NTERMS - 1);
fprintf(stderr, " [-g] install graphics controller\n");
fprintf(stderr, " [-c] install console\n");
fprintf(stderr, " [-o <file>] bind output device to file\n");
fprintf(stderr, "The options -l and -r are mutually exclusive.\n");
fprintf(stderr, "If both are omitted, interactive mode is assumed.\n");
fprintf(stderr, "The option -n leaves the specified serial line ");
fprintf(stderr, "unconnected.\nIt can be accessed from within another ");
fprintf(stderr, "process by opening\nthe corresponding pseudo terminal ");
fprintf(stderr, "(path will be shown here).\n");
exit(1);
}
 
 
int main(int argc, char *argv[]) {
int i;
int i, j;
char *argp;
char *endp;
Bool interactive;
55,6 → 61,7
char *romName;
char *diskName;
int numTerms;
Bool hasTerm[MAX_NTERMS];
Bool graphics;
Bool console;
char *outputName;
69,6 → 76,9
romName = NULL;
diskName = NULL;
numTerms = 0;
for (j = 0; j < MAX_NTERMS; j++) {
hasTerm[j] = true;
}
graphics = false;
console = false;
outputName = NULL;
131,6 → 141,18
usage(argv[0]);
}
break;
case 'n':
if (i == argc - 1) {
usage(argv[0]);
}
j = strtol(argv[++i], &endp, 10);
if (*endp != '\0' ||
j < 0 ||
j > MAX_NTERMS - 1) {
usage(argv[0]);
}
hasTerm[j] = false;
break;
case 'g':
graphics = true;
break;
160,7 → 182,7
displayInit();
keyboardInit();
}
termInit(numTerms);
termInit(numTerms, hasTerm);
diskInit(diskName);
outputInit(outputName);
shutdownInit();

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.