|
|
@@ -10,10 +10,11 @@ |
|
|
|
#define STDIO_PORT 0x00 |
|
|
|
|
|
|
|
static int running; |
|
|
|
static FILE *fp; |
|
|
|
|
|
|
|
static uint8_t iord_stdio() |
|
|
|
{ |
|
|
|
int c = getchar(); |
|
|
|
int c = getc(fp); |
|
|
|
if (c == EOF) { |
|
|
|
running = 0; |
|
|
|
} |
|
|
@@ -31,19 +32,31 @@ static void iowr_stdio(uint8_t val) |
|
|
|
|
|
|
|
int main(int argc, char *argv[]) |
|
|
|
{ |
|
|
|
bool tty = isatty(fileno(stdin)); |
|
|
|
bool tty = false; |
|
|
|
struct termios termInfo; |
|
|
|
if (tty) { |
|
|
|
// Turn echo off: the shell takes care of its own echoing. |
|
|
|
if (tcgetattr(0, &termInfo) == -1) { |
|
|
|
printf("Can't setup terminal.\n"); |
|
|
|
if (argc == 2) { |
|
|
|
fp = fopen(argv[1], "r"); |
|
|
|
if (fp == NULL) { |
|
|
|
fprintf(stderr, "Can't open %s\n", argv[1]); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
termInfo.c_lflag &= ~ECHO; |
|
|
|
termInfo.c_lflag &= ~ICANON; |
|
|
|
tcsetattr(0, TCSAFLUSH, &termInfo); |
|
|
|
} else if (argc == 1) { |
|
|
|
fp = stdin; |
|
|
|
tty = isatty(fileno(stdin)); |
|
|
|
if (tty) { |
|
|
|
// Turn echo off: the shell takes care of its own echoing. |
|
|
|
if (tcgetattr(0, &termInfo) == -1) { |
|
|
|
printf("Can't setup terminal.\n"); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
termInfo.c_lflag &= ~ECHO; |
|
|
|
termInfo.c_lflag &= ~ICANON; |
|
|
|
tcsetattr(0, TCSAFLUSH, &termInfo); |
|
|
|
} |
|
|
|
} else { |
|
|
|
fprintf(stderr, "Usage: ./forth [filename]\n"); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
Machine *m = emul_init(); |
|
|
|
m->ramstart = RAMSTART; |
|
|
|
m->iord[STDIO_PORT] = iord_stdio; |
|
|
@@ -58,11 +71,12 @@ int main(int argc, char *argv[]) |
|
|
|
while (running && emul_step()); |
|
|
|
|
|
|
|
if (tty) { |
|
|
|
printf("Done!\n"); |
|
|
|
printf("\nDone!\n"); |
|
|
|
termInfo.c_lflag |= ECHO; |
|
|
|
termInfo.c_lflag |= ICANON; |
|
|
|
tcsetattr(0, TCSAFLUSH, &termInfo); |
|
|
|
emul_printdebug(); |
|
|
|
} |
|
|
|
fclose(fp); |
|
|
|
return 0; |
|
|
|
} |