--- gforth/prim 2003/08/15 16:47:43 1.134 +++ gforth/prim 2003/08/20 09:23:45 1.139 @@ -141,6 +141,45 @@ undefine(`index') undefine(`shift') undefine(`symbols') +\ run-time routines for non-primitives. They are defined as +\ primitives, because that simplifies things. + +(docol) ( -- R:a_retaddr ) gforth-internal paren_docol +""run-time routine for colon definitions"" +a_retaddr = (Cell *)ip; +SET_IP((Xt *)PFA(CFA)); + +(docon) ( -- w ) gforth-internal paren_docon +""run-time routine for constants"" +w = *(Cell *)PFA(CFA); + +(dovar) ( -- a_body ) gforth-internal paren_dovar +""run-time routine for variables and CREATEd words"" +a_body = PFA(CFA); + +(douser) ( -- a_user ) gforth-internal paren_douser +""run-time routine for constants"" +a_user = (Cell *)(up+*(Cell *)PFA(CFA)); + +(dodefer) ( -- ) gforth-internal paren_dodefer +""run-time routine for deferred words"" +SUPER_END; +EXEC(*(Xt *)PFA(CFA)); + +(dofield) ( n1 -- n2 ) gforth-internal paren_field +""run-time routine for fields"" +n2 = n1 + *(Cell *)PFA(CFA); + +(dodoes) ( -- a_body R:a_retaddr ) gforth-internal paren_dodoes +""run-time routine for @code{does>}-defined words"" +a_retaddr = (Cell *)ip; +a_body = PFA(CFA); +SET_IP(DOES_CODE1(CFA)); + +(does-handler) ( -- ) gforth-internal paren_does_handler +""just a slot to have an encoding for the DOESJUMP, +which is no longer used anyway (!! eliminate this)"" + \g control noop ( -- ) gforth @@ -793,11 +832,10 @@ ud = ummul(u1,u2); ud = (UDCell)u1 * (UDCell)u2; #endif : - >r >r 0 0 r> r> [ 8 cells ] literal 0 + 0 -rot dup [ 8 cells ] literal - DO - over >r dup >r 0< and d2*+ drop - r> 2* r> swap - LOOP 2drop ; + dup 0< I' and d2*+ drop + LOOP ; : d2*+ ( ud n -- ud+n c ) over MINI and >r >r 2dup d+ swap r> + swap r> ; @@ -1084,19 +1122,19 @@ rdrop ( R:w -- ) gforth : r> r> drop >r ; -2>r ( w1 w2 -- R:w1 R:w2 ) core-ext two_to_r +2>r ( d -- R:d ) core-ext two_to_r : swap r> swap >r swap >r >r ; -2r> ( R:w1 R:w2 -- w1 w2 ) core-ext two_r_from +2r> ( R:d -- d ) core-ext two_r_from : r> r> swap r> swap >r swap ; -2r@ ( R:w1 R:w2 -- R:w1 R:w2 w1 w2 ) core-ext two_r_fetch +2r@ ( R:d -- R:d d ) core-ext two_r_fetch : i' j ; -2rdrop ( R:w1 R:w2 -- ) gforth two_r_drop +2rdrop ( R:d -- ) gforth two_r_drop : r> r> drop r> drop >r ; @@ -1316,6 +1354,33 @@ c_addr2 = c_addr1+1; \g compiler +\+f83headerstring + +(f83find) ( c_addr u f83name1 -- f83name2 ) new paren_f83find +for (; f83name1 != NULL; f83name1 = (struct F83Name *)(f83name1->next)) + if ((UCell)F83NAME_COUNT(f83name1)==u && + memcasecmp(c_addr, f83name1->name, u)== 0 /* or inline? */) + break; +f83name2=f83name1; +: + BEGIN dup WHILE (find-samelen) dup WHILE + >r 2dup r@ cell+ char+ capscomp 0= + IF 2drop r> EXIT THEN + r> @ + REPEAT THEN nip nip ; +: (find-samelen) ( u f83name1 -- u f83name2/0 ) + BEGIN 2dup cell+ c@ $1F and <> WHILE @ dup 0= UNTIL THEN ; +: capscomp ( c_addr1 u c_addr2 -- n ) + swap bounds + ?DO dup c@ I c@ <> + IF dup c@ toupper I c@ toupper = + ELSE true THEN WHILE 1+ LOOP drop 0 + ELSE c@ toupper I c@ toupper - unloop THEN sgn ; +: sgn ( n -- -1/0/1 ) + dup 0= IF EXIT THEN 0< 2* 1+ ; + +\- + (listlfind) ( c_addr u longname1 -- longname2 ) new paren_listlfind longname2=listlfind(c_addr, u, longname1); : @@ -1349,6 +1414,12 @@ longname2 = tablelfind(c_addr, u, a_addr IF 2drop r> rdrop EXIT THEN THEN rdrop r> REPEAT nip nip ; +: -text ( c_addr1 u c_addr2 -- n ) + swap bounds + ?DO dup c@ I c@ = WHILE 1+ LOOP drop 0 + ELSE c@ I c@ - unloop THEN sgn ; +: sgn ( n -- -1/0/1 ) + dup 0= IF EXIT THEN 0< 2* 1+ ; (hashkey1) ( c_addr u ubits -- ukey ) gforth paren_hashkey1 ""ukey is the hash key for the string c_addr u fitting in ubits bits"" @@ -1368,6 +1439,8 @@ Create rot-values \+ +\+ + (parse-white) ( c_addr1 u1 -- c_addr2 u2 ) gforth paren_parse_white struct Cellpair r=parse_white(c_addr1, u1); c_addr2 = (Char *)(r.n1); @@ -2191,91 +2264,128 @@ u3 = 0; \+FFCALL -av-start-void ( c_addr -- ) gforth av_start_void +av-start-void ( c_addr -- ) gforth av_start_void av_start_void(alist, c_addr); -av-start-int ( c_addr -- ) gforth av_start_int +av-start-int ( c_addr -- ) gforth av_start_int av_start_int(alist, c_addr, &irv); -av-start-float ( c_addr -- ) gforth av_start_float +av-start-float ( c_addr -- ) gforth av_start_float av_start_float(alist, c_addr, &frv); -av-start-double ( c_addr -- ) gforth av_start_double +av-start-double ( c_addr -- ) gforth av_start_double av_start_double(alist, c_addr, &drv); -av-start-longlong ( c_addr -- ) gforth av_start_longlong +av-start-longlong ( c_addr -- ) gforth av_start_longlong av_start_longlong(alist, c_addr, &llrv); -av-start-ptr ( c_addr -- ) gforth av_start_ptr +av-start-ptr ( c_addr -- ) gforth av_start_ptr av_start_ptr(alist, c_addr, void*, &prv); av-int ( w -- ) gforth av_int av_int(alist, w); -av-float ( r -- ) gforth av_float +av-float ( r -- ) gforth av_float av_float(alist, r); -av-double ( r -- ) gforth av_double +av-double ( r -- ) gforth av_double av_double(alist, r); -av-longlong ( d -- ) gforth av_longlong +av-longlong ( d -- ) gforth av_longlong av_longlong(alist, d); -av-ptr ( c_addr -- ) gforth av_ptr +av-ptr ( c_addr -- ) gforth av_ptr av_ptr(alist, void*, c_addr); -av-call-void ( -- ) gforth av_call_void +av-int-r ( R:w -- ) gforth av_int_r +av_int(alist, w); + +av-float-r ( -- ) gforth av_float_r +float r = *(Float*)lp; +lp += sizeof(Float); +av_float(alist, r); + +av-double-r ( -- ) gforth av_double_r +double r = *(Float*)lp; +lp += sizeof(Float); +av_double(alist, r); + +av-longlong-r ( R:d -- ) gforth av_longlong_r +av_longlong(alist, d); + +av-ptr-r ( R:c_addr -- ) gforth av_ptr_r +av_ptr(alist, void*, c_addr); + +av-call-void ( -- ) gforth av_call_void SAVE_REGS av_call(alist); REST_REGS -av-call-int ( -- w ) gforth av_call_int +av-call-int ( -- w ) gforth av_call_int SAVE_REGS av_call(alist); REST_REGS w = irv; -av-call-float ( -- r ) gforth av_call_float +av-call-float ( -- r ) gforth av_call_float SAVE_REGS av_call(alist); REST_REGS r = frv; -av-call-double ( -- r ) gforth av_call_double +av-call-double ( -- r ) gforth av_call_double SAVE_REGS av_call(alist); REST_REGS r = drv; -av-call-longlong ( -- d ) gforth av_call_longlong +av-call-longlong ( -- d ) gforth av_call_longlong SAVE_REGS av_call(alist); REST_REGS d = llrv; -av-call-ptr ( -- c_addr ) gforth av_call_ptr +av-call-ptr ( -- c_addr ) gforth av_call_ptr SAVE_REGS av_call(alist); REST_REGS c_addr = prv; -alloc-callback ( xt -- c_addr ) gforth alloc_callback -c_addr = (char *)alloc_callback(engine_callback, ((Xt *)xt)+2); +alloc-callback ( a_ip -- c_addr ) gforth alloc_callback +c_addr = (char *)alloc_callback(engine_callback, (Xt *)a_ip); + +va-start-void ( -- ) gforth va_start_void +va_start_void(clist); + +va-start-int ( -- ) gforth va_start_int +va_start_int(clist); + +va-start-longlong ( -- ) gforth va_start_longlong +va_start_longlong(clist); + +va-start-ptr ( -- ) gforth va_start_ptr +va_start_ptr(clist, (char *)); + +va-start-float ( -- ) gforth va_start_float +va_start_float(clist); + +va-start-double ( -- ) gforth va_start_double +va_start_double(clist); -va-start-int ( -- w ) gforth va_start_int -w = va_start_int(clist); +va-arg-int ( -- w ) gforth va_arg_int +w = va_arg_int(clist); -va-start-longlong ( -- d ) gforth va_start_longlong -d = va_start_longlong(clist); +va-arg-longlong ( -- d ) gforth va_arg_longlong +d = va_arg_longlong(clist); -va-start-ptr ( -- c_addr ) gforth va_start_ptr -c_addr = (char *)va_start_ptr(clist, (char *)); +va-arg-ptr ( -- c_addr ) gforth va_arg_ptr +c_addr = (char *)va_arg_ptr(clist,char*); -va-start-float ( -- r ) gforth va_start_float -r = va_start_float(clist); +va-arg-float ( -- r ) gforth va_arg_float +r = va_arg_float(clist); -va-start-double ( -- r ) gforth va_start_double -r = va_start_double(clist); +va-arg-double ( -- r ) gforth va_arg_double +r = va_arg_double(clist); va-return-void ( -- ) gforth va_return_void va_return_void(clist);