--- gforth/prim 2006/12/31 13:39:13 1.204 +++ gforth/prim 2007/03/31 21:43:18 1.210 @@ -248,6 +248,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 @@ -851,14 +854,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 +878,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 : @@ -1028,12 +1031,7 @@ d2 = -d1; d2* ( d1 -- d2 ) double d_two_star ""Shift left by 1; also works on unsigned numbers"" -#ifdef BUGGY_LL_SHIFT -DLO_IS(d2, DLO(d1)<<1); -DHI_IS(d2, (DHI(d1)<<1) | (DLO(d1)>>(CELL_BITS-1))); -#else -d2 = 2*d1; -#endif +d2 = DLSHIFT(d1,1); : 2dup d+ ; @@ -1492,6 +1490,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= @@ -1647,8 +1650,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; @@ -1661,9 +1662,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; @@ -2766,10 +2774,11 @@ define(`uploop', define(`_uploop', `ifelse($1, `$3', `$5', `$4`'define(`$1', incr($1))_uploop(`$1', `$2', `$3', `$4', `$5')')') + \ argflist(argnum): Forth argument list define(argflist, `ifelse($1, 0, `', - `uploop(`_i', 1, $1, `format(`u%d ', _i)', `format(`u%d ', _i)')')') + `uploop(`_i', 1, $1, ``u''`_i ', ``u''`_i')')') \ argdlist(argnum): declare C's arguments define(argdlist, `ifelse($1, 0, `', @@ -2777,15 +2786,15 @@ define(argdlist, \ argclist(argnum): pass C's arguments define(argclist, `ifelse($1, 0, `', - `uploop(`_i', 1, $1, `format(`u%d, ', _i)', `format(`u%d', _i)')')') + `uploop(`_i', 1, $1, ``u''`_i, ', ``u''`_i')')') \ icall(argnum) define(icall, -`icall$1 ( argflist($1)u -- uret ) gforth +`icall$1 ( argflist($1) u -- uret ) gforth uret = (SYSCALL(Cell(*)(argdlist($1)))u)(argclist($1)); ') define(fcall, -`fcall$1 ( argflist($1)u -- rret ) gforth +`fcall$1 ( argflist($1) u -- rret ) gforth rret = (SYSCALL(Float(*)(argdlist($1)))u)(argclist($1)); ')