--- gforth/prim 2006/10/30 16:20:41 1.203 +++ gforth/prim 2007/03/25 21:30:59 1.208 @@ -1,6 +1,6 @@ \ Gforth primitives -\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005 Free Software Foundation, Inc. +\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006 Free Software Foundation, Inc. \ This file is part of Gforth. @@ -851,14 +851,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 +875,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 +1028,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+ ; @@ -1647,8 +1642,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,6 +1654,8 @@ 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."" @@ -2766,10 +2761,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 +2773,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)); ')