--- gforth/prim 2006/10/30 16:20:41 1.203 +++ gforth/prim 2007/04/01 21:30:26 1.211 @@ -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. @@ -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 : @@ -1028,12 +1040,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 +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= @@ -1647,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; @@ -1661,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; @@ -2766,10 +2783,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 +2795,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)); ')