--- gforth/prim 2007/01/05 13:36:06 1.205 +++ gforth/prim 2007/06/01 18:40:20 1.213 @@ -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 @@ -1781,7 +1800,7 @@ u = strlen((char *)c_addr); call-c ( ... w -- ... ) gforth call_c ""Call the C function pointed to by @i{w}. The C function has to access the stack itself. The stack pointers are exported in the global -variables @code{SP} and @code{FP}."" +variables @code{gforth_SP} and @code{gforth_FP}."" /* This is a first attempt at support for calls to C. This may change in the future */ gforth_FP=fp; @@ -2761,10 +2780,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, `', @@ -2772,15 +2792,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)); ')