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(); |