--- gforth/prim 2007/02/09 17:53:54 1.206 +++ gforth/prim 2007/05/09 07:12:59 1.212 @@ -209,10 +209,16 @@ goto *next_code; a_retaddr = next_code; a_body = PFA(CFA); INST_TAIL; +#ifdef DEBUG +fprintf(stderr, "dodoes to %x, push %x\n", a_retaddr, a_body); +#endif goto **(Label *)DOES_CODE1(CFA); #else /* !defined(NO_IP) */ a_retaddr = (Cell *)IP; a_body = PFA(CFA); +#ifdef DEBUG +fprintf(stderr, "dodoes to %x, push %x\n", a_retaddr, a_body); +#endif SET_IP(DOES_CODE1(CFA)); #endif /* !defined(NO_IP) */ @@ -248,6 +254,9 @@ SET_IP((Xt *)a_callee); execute ( xt -- ) core ""Perform the semantics represented by the execution token, @i{xt}."" +#ifdef DEBUG +fprintf(stderr, "execute %08x\n", xt); +#endif #ifndef NO_IP ip=IP; #endif @@ -748,6 +757,9 @@ n = n1+n2; \ lit+ / lit_plus = lit + lit+ ( n1 #n2 -- n ) new lit_plus +#ifdef DEBUG +fprintf(stderr, "lit+ %08x\n", n2); +#endif n=n1+n2; \ PFE-0.9.14 has it differently, but the next release will have it as follows @@ -851,14 +863,14 @@ DCell d = (DCell)n1 * (DCell)n2; #endif #ifdef ASM_SM_SLASH_REM ASM_SM_SLASH_REM(DLO(d), DHI(d), n3, n4, n5); -if (((DHI(d)^n3)<0) && n4!=0) { +if (FLOORED_DIV && ((DHI(d)^n3)<0) && n4!=0) { if (CHECK_DIVISION && n5 == CELL_MIN) throw(BALL_RESULTRANGE); n5--; n4+=n3; } #else -DCell r = fmdiv(d,n3); +DCell r = FLOORED_DIV ? fmdiv(d,n3) : smdiv(d,n3); n4=DHI(r); n5=DLO(r); #endif @@ -875,13 +887,13 @@ DCell d = (DCell)n1 * (DCell)n2; #ifdef ASM_SM_SLASH_REM Cell remainder; ASM_SM_SLASH_REM(DLO(d), DHI(d), n3, remainder, n4); -if (((DHI(d)^n3)<0) && remainder!=0) { +if (FLOORED_DIV && ((DHI(d)^n3)<0) && remainder!=0) { if (CHECK_DIVISION && n4 == CELL_MIN) throw(BALL_RESULTRANGE); n4--; } #else -DCell r = fmdiv(d,n3); +DCell r = FLOORED_DIV ? fmdiv(d,n3) : smdiv(d,n3); n4=DLO(r); #endif : @@ -1487,6 +1499,11 @@ for (; f83name1 != NULL; f83name1 = (str memcasecmp(c_addr, f83name1->name, u)== 0 /* or inline? */) break; f83name2=f83name1; +#ifdef DEBUG +fprintf(stderr, "F83find "); +fwrite(c_addr, u, 1, stderr); +fprintf(stderr, " found %08x\n", f83name2); +#endif : BEGIN dup WHILE (find-samelen) dup WHILE >r 2dup r@ cell+ char+ capscomp 0= @@ -1642,8 +1659,6 @@ f = key_query((FILE*)wfileid); f = key_query(stdin); #endif -\+os - stdin ( -- wfileid ) gforth ""The standard input file of the Gforth process."" wfileid = (Cell)stdin; @@ -1656,9 +1671,16 @@ stderr ( -- wfileid ) gforth ""The standard error output file of the Gforth process."" wfileid = (Cell)stderr; +\+os + form ( -- urows ucols ) gforth -""The number of lines and columns in the terminal. These numbers may change -with the window size."" +""The number of lines and columns in the terminal. These numbers may +change with the window size. Note that it depends on the OS whether +this reflects the actual size and changes with the window size +(currently only on Unix-like OSs). On other OSs you just get a +default, and can tell Gforth the terminal size by setting the +environment variables @code{COLUMNS} and @code{LINES} before starting +Gforth."" /* we could block SIGWINCH here to get a consistent size, but I don't think this is necessary or always beneficial */ urows=rows; @@ -1729,12 +1751,9 @@ nhour =ltime->tm_hour; nmin =ltime->tm_min; nsec =ltime->tm_sec; -ms ( n -- ) facility-ext +ms ( u -- ) facility-ext ""Wait at least @i{n} milli-second."" -struct timeval timeout; -timeout.tv_sec=n/1000; -timeout.tv_usec=1000*(n%1000); -(void)select(0,0,0,0,&timeout); +gforth_ms(u); allocate ( u -- a_addr wior ) memory ""Allocate @i{u} address units of contiguous data space. The initial