--- cci/sys/stand/prf.c 2019/07/28 12:24:19 1.1 +++ cci/sys/stand/prf.c 2019/07/28 12:29:50 1.1.1.2 @@ -8,6 +8,8 @@ #define COUTADR 0xf1000 /* Dummy screen -,,- */ #endif +int wait_for_char = 1; + /* * Scaled down version of C Library printf. * Used to print diagnostic information directly on console tty. @@ -199,21 +201,34 @@ simin(addr) getchar() { + static char_read = 0; char c; - cpin.cp_hdr.cp_unit = CPCONS; /* Resets done bit */ - cpin.cp_hdr.cp_comm = CPREAD; - cpin.cp_hdr.cp_count = 1; - mtpr(&cpin, CPMDCB); + if(!char_read) { + char_read = 1; + cpin.cp_hdr.cp_unit = CPCONS; /* Resets done bit */ + cpin.cp_hdr.cp_comm = CPREAD; + cpin.cp_hdr.cp_count = 1; + mtpr(&cpin, CPMDCB); #ifdef SIMIO - simin(&cpin); + simin(&cpin); #endif - while ((cpin.cp_hdr.cp_unit & CPDONE) == 0) - uncache (&cpin.cp_hdr.cp_unit); + } + uncache (&cpin.cp_hdr.cp_unit); + if(wait_for_char) { + while ((cpin.cp_hdr.cp_unit & CPDONE) == 0) + uncache (&cpin.cp_hdr.cp_unit); + } + else { + if((cpin.cp_hdr.cp_unit & CPDONE) == 0) + return 0; + } uncache (&cpin.cpi_buf[0]); c = cpin.cpi_buf[0] & 0x7f; + char_read = 0; if (c == '\r') c = '\n'; - putchar(c); + if(c != '\b') + putchar(c); return(c); } #endif @@ -222,32 +237,42 @@ getchar() gets(buf) char *buf; { - register char *lp; - register c; + static char line[256]; + static char *lp = line; + register c; - lp = buf; + *buf = '\0'; for (;;) { - c = getchar() & 0177; store: + c = getchar() & 0177; switch(c) { + case '\0' : + if(!wait_for_char) + return; + break; case '\n': case '\r': c = '\n'; - *lp++ = '\0'; + *lp = '\0'; + strcpy(buf, line); + lp = line; return; case '\b': + if (lp > line) + putchar('\b'); case '#': lp--; - if (lp < buf) - lp = buf; + if (lp < line) + lp = line; continue; case '@': case 'u'&037: - lp = buf; + lp = line; putchar('\n'); continue; default: - *lp++ = c; + if((lp - line) < 256) + *lp++ = c; } } }