17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*3aa1cd26Sgovinda * Common Development and Distribution License (the "License"). 6*3aa1cd26Sgovinda * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22*3aa1cd26Sgovinda * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23*3aa1cd26Sgovinda * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate #include <stdio.h> 297c478bd9Sstevel@tonic-gate #include <stdlib.h> 307c478bd9Sstevel@tonic-gate #include <string.h> 317c478bd9Sstevel@tonic-gate #include <stdarg.h> 327c478bd9Sstevel@tonic-gate #include <ctype.h> 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate #include <fcode/private.h> 357c478bd9Sstevel@tonic-gate #include <fcode/log.h> 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate void (*semi_ptr)(fcode_env_t *env) = do_semi; 387c478bd9Sstevel@tonic-gate void (*does_ptr)(fcode_env_t *env) = install_does; 397c478bd9Sstevel@tonic-gate void (*quote_ptr)(fcode_env_t *env) = do_quote; 407c478bd9Sstevel@tonic-gate void (*blit_ptr)(fcode_env_t *env) = do_literal; 417c478bd9Sstevel@tonic-gate void (*tlit_ptr)(fcode_env_t *env) = do_literal; 427c478bd9Sstevel@tonic-gate void (*do_bdo_ptr)(fcode_env_t *env) = do_bdo; 437c478bd9Sstevel@tonic-gate void (*do_bqdo_ptr)(fcode_env_t *env) = do_bqdo; 447c478bd9Sstevel@tonic-gate void (*create_ptr)(fcode_env_t *env) = do_creator; 457c478bd9Sstevel@tonic-gate void (*do_leave_ptr)(fcode_env_t *env) = do_bleave; 467c478bd9Sstevel@tonic-gate void (*do_loop_ptr)(fcode_env_t *env) = do_bloop; 477c478bd9Sstevel@tonic-gate void (*do_ploop_ptr)(fcode_env_t *env) = do_bploop; 487c478bd9Sstevel@tonic-gate 497c478bd9Sstevel@tonic-gate void unaligned_lstore(fcode_env_t *); 507c478bd9Sstevel@tonic-gate void unaligned_wstore(fcode_env_t *); 517c478bd9Sstevel@tonic-gate void unaligned_lfetch(fcode_env_t *); 527c478bd9Sstevel@tonic-gate void unaligned_wfetch(fcode_env_t *); 537c478bd9Sstevel@tonic-gate 547c478bd9Sstevel@tonic-gate /* start with the simple maths functions */ 557c478bd9Sstevel@tonic-gate 567c478bd9Sstevel@tonic-gate 577c478bd9Sstevel@tonic-gate void 587c478bd9Sstevel@tonic-gate add(fcode_env_t *env) 597c478bd9Sstevel@tonic-gate { 607c478bd9Sstevel@tonic-gate fstack_t d; 617c478bd9Sstevel@tonic-gate 627c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "+"); 637c478bd9Sstevel@tonic-gate d = POP(DS); 647c478bd9Sstevel@tonic-gate TOS += d; 657c478bd9Sstevel@tonic-gate } 667c478bd9Sstevel@tonic-gate 677c478bd9Sstevel@tonic-gate void 687c478bd9Sstevel@tonic-gate subtract(fcode_env_t *env) 697c478bd9Sstevel@tonic-gate { 707c478bd9Sstevel@tonic-gate fstack_t d; 717c478bd9Sstevel@tonic-gate 727c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "-"); 737c478bd9Sstevel@tonic-gate d = POP(DS); 747c478bd9Sstevel@tonic-gate TOS -= d; 757c478bd9Sstevel@tonic-gate } 767c478bd9Sstevel@tonic-gate 777c478bd9Sstevel@tonic-gate void 787c478bd9Sstevel@tonic-gate multiply(fcode_env_t *env) 797c478bd9Sstevel@tonic-gate { 807c478bd9Sstevel@tonic-gate fstack_t d; 817c478bd9Sstevel@tonic-gate 827c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "*"); 837c478bd9Sstevel@tonic-gate d = POP(DS); 847c478bd9Sstevel@tonic-gate TOS *= d; 857c478bd9Sstevel@tonic-gate } 867c478bd9Sstevel@tonic-gate 877c478bd9Sstevel@tonic-gate void 887c478bd9Sstevel@tonic-gate slash_mod(fcode_env_t *env) 897c478bd9Sstevel@tonic-gate { 907c478bd9Sstevel@tonic-gate fstack_t d, o, t, rem; 917c478bd9Sstevel@tonic-gate int sign = 1; 927c478bd9Sstevel@tonic-gate 937c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "/mod"); 947c478bd9Sstevel@tonic-gate d = POP(DS); 957c478bd9Sstevel@tonic-gate o = t = POP(DS); 967c478bd9Sstevel@tonic-gate 977c478bd9Sstevel@tonic-gate if (d == 0) { 987c478bd9Sstevel@tonic-gate throw_from_fclib(env, 1, "/mod divide by zero"); 997c478bd9Sstevel@tonic-gate } 1007c478bd9Sstevel@tonic-gate sign = ((d ^ t) < 0); 1017c478bd9Sstevel@tonic-gate if (d < 0) { 1027c478bd9Sstevel@tonic-gate d = -d; 1037c478bd9Sstevel@tonic-gate if (sign) { 1047c478bd9Sstevel@tonic-gate t += (d-1); 1057c478bd9Sstevel@tonic-gate } 1067c478bd9Sstevel@tonic-gate } 1077c478bd9Sstevel@tonic-gate if (t < 0) { 1087c478bd9Sstevel@tonic-gate if (sign) { 1097c478bd9Sstevel@tonic-gate t -= (d-1); 1107c478bd9Sstevel@tonic-gate } 1117c478bd9Sstevel@tonic-gate t = -t; 1127c478bd9Sstevel@tonic-gate } 1137c478bd9Sstevel@tonic-gate t = t / d; 1147c478bd9Sstevel@tonic-gate if ((o ^ sign) < 0) { 1157c478bd9Sstevel@tonic-gate rem = (t * d) + o; 1167c478bd9Sstevel@tonic-gate } else { 1177c478bd9Sstevel@tonic-gate rem = o - (t*d); 1187c478bd9Sstevel@tonic-gate } 1197c478bd9Sstevel@tonic-gate if (sign) { 1207c478bd9Sstevel@tonic-gate t = -t; 1217c478bd9Sstevel@tonic-gate } 1227c478bd9Sstevel@tonic-gate PUSH(DS, rem); 1237c478bd9Sstevel@tonic-gate PUSH(DS, t); 1247c478bd9Sstevel@tonic-gate } 1257c478bd9Sstevel@tonic-gate 1267c478bd9Sstevel@tonic-gate /* 1277c478bd9Sstevel@tonic-gate * 'u/mod' Fcode implementation. 1287c478bd9Sstevel@tonic-gate */ 1297c478bd9Sstevel@tonic-gate void 1307c478bd9Sstevel@tonic-gate uslash_mod(fcode_env_t *env) 1317c478bd9Sstevel@tonic-gate { 1327c478bd9Sstevel@tonic-gate u_lforth_t u1, u2; 1337c478bd9Sstevel@tonic-gate 1347c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "u/mod"); 1357c478bd9Sstevel@tonic-gate u2 = POP(DS); 1367c478bd9Sstevel@tonic-gate u1 = POP(DS); 1377c478bd9Sstevel@tonic-gate 1387c478bd9Sstevel@tonic-gate if (u2 == 0) 1397c478bd9Sstevel@tonic-gate forth_abort(env, "u/mod: divide by zero"); 1407c478bd9Sstevel@tonic-gate PUSH(DS, u1 % u2); 1417c478bd9Sstevel@tonic-gate PUSH(DS, u1 / u2); 1427c478bd9Sstevel@tonic-gate } 1437c478bd9Sstevel@tonic-gate 1447c478bd9Sstevel@tonic-gate void 1457c478bd9Sstevel@tonic-gate divide(fcode_env_t *env) 1467c478bd9Sstevel@tonic-gate { 1477c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "/"); 1487c478bd9Sstevel@tonic-gate slash_mod(env); 1497c478bd9Sstevel@tonic-gate nip(env); 1507c478bd9Sstevel@tonic-gate } 1517c478bd9Sstevel@tonic-gate 1527c478bd9Sstevel@tonic-gate void 1537c478bd9Sstevel@tonic-gate mod(fcode_env_t *env) 1547c478bd9Sstevel@tonic-gate { 1557c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "mod"); 1567c478bd9Sstevel@tonic-gate slash_mod(env); 1577c478bd9Sstevel@tonic-gate drop(env); 1587c478bd9Sstevel@tonic-gate } 1597c478bd9Sstevel@tonic-gate 1607c478bd9Sstevel@tonic-gate void 1617c478bd9Sstevel@tonic-gate and(fcode_env_t *env) 1627c478bd9Sstevel@tonic-gate { 1637c478bd9Sstevel@tonic-gate fstack_t d; 1647c478bd9Sstevel@tonic-gate 1657c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "and"); 1667c478bd9Sstevel@tonic-gate d = POP(DS); 1677c478bd9Sstevel@tonic-gate TOS &= d; 1687c478bd9Sstevel@tonic-gate } 1697c478bd9Sstevel@tonic-gate 1707c478bd9Sstevel@tonic-gate void 1717c478bd9Sstevel@tonic-gate or(fcode_env_t *env) 1727c478bd9Sstevel@tonic-gate { 1737c478bd9Sstevel@tonic-gate fstack_t d; 1747c478bd9Sstevel@tonic-gate 1757c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "or"); 1767c478bd9Sstevel@tonic-gate d = POP(DS); 1777c478bd9Sstevel@tonic-gate TOS |= d; 1787c478bd9Sstevel@tonic-gate } 1797c478bd9Sstevel@tonic-gate 1807c478bd9Sstevel@tonic-gate void 1817c478bd9Sstevel@tonic-gate xor(fcode_env_t *env) 1827c478bd9Sstevel@tonic-gate { 1837c478bd9Sstevel@tonic-gate fstack_t d; 1847c478bd9Sstevel@tonic-gate 1857c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "xor"); 1867c478bd9Sstevel@tonic-gate d = POP(DS); 1877c478bd9Sstevel@tonic-gate TOS ^= d; 1887c478bd9Sstevel@tonic-gate } 1897c478bd9Sstevel@tonic-gate 1907c478bd9Sstevel@tonic-gate void 1917c478bd9Sstevel@tonic-gate invert(fcode_env_t *env) 1927c478bd9Sstevel@tonic-gate { 1937c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "invert"); 1947c478bd9Sstevel@tonic-gate TOS = ~TOS; 1957c478bd9Sstevel@tonic-gate } 1967c478bd9Sstevel@tonic-gate 1977c478bd9Sstevel@tonic-gate void 1987c478bd9Sstevel@tonic-gate lshift(fcode_env_t *env) 1997c478bd9Sstevel@tonic-gate { 2007c478bd9Sstevel@tonic-gate fstack_t d; 2017c478bd9Sstevel@tonic-gate 2027c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "lshift"); 2037c478bd9Sstevel@tonic-gate d = POP(DS); 2047c478bd9Sstevel@tonic-gate TOS = TOS << d; 2057c478bd9Sstevel@tonic-gate } 2067c478bd9Sstevel@tonic-gate 2077c478bd9Sstevel@tonic-gate void 2087c478bd9Sstevel@tonic-gate rshift(fcode_env_t *env) 2097c478bd9Sstevel@tonic-gate { 2107c478bd9Sstevel@tonic-gate fstack_t d; 2117c478bd9Sstevel@tonic-gate 2127c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "rshift"); 2137c478bd9Sstevel@tonic-gate d = POP(DS); 2147c478bd9Sstevel@tonic-gate TOS = ((ufstack_t)TOS) >> d; 2157c478bd9Sstevel@tonic-gate } 2167c478bd9Sstevel@tonic-gate 2177c478bd9Sstevel@tonic-gate void 2187c478bd9Sstevel@tonic-gate rshifta(fcode_env_t *env) 2197c478bd9Sstevel@tonic-gate { 2207c478bd9Sstevel@tonic-gate fstack_t d; 2217c478bd9Sstevel@tonic-gate 2227c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, ">>a"); 2237c478bd9Sstevel@tonic-gate d = POP(DS); 2247c478bd9Sstevel@tonic-gate TOS = ((s_lforth_t)TOS) >> d; 2257c478bd9Sstevel@tonic-gate } 2267c478bd9Sstevel@tonic-gate 2277c478bd9Sstevel@tonic-gate void 2287c478bd9Sstevel@tonic-gate negate(fcode_env_t *env) 2297c478bd9Sstevel@tonic-gate { 2307c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "negate"); 2317c478bd9Sstevel@tonic-gate TOS = -TOS; 2327c478bd9Sstevel@tonic-gate } 2337c478bd9Sstevel@tonic-gate 2347c478bd9Sstevel@tonic-gate void 2357c478bd9Sstevel@tonic-gate f_abs(fcode_env_t *env) 2367c478bd9Sstevel@tonic-gate { 2377c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "abs"); 2387c478bd9Sstevel@tonic-gate if (TOS < 0) TOS = -TOS; 2397c478bd9Sstevel@tonic-gate } 2407c478bd9Sstevel@tonic-gate 2417c478bd9Sstevel@tonic-gate void 2427c478bd9Sstevel@tonic-gate f_min(fcode_env_t *env) 2437c478bd9Sstevel@tonic-gate { 2447c478bd9Sstevel@tonic-gate fstack_t d; 2457c478bd9Sstevel@tonic-gate 2467c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "min"); 2477c478bd9Sstevel@tonic-gate d = POP(DS); 2487c478bd9Sstevel@tonic-gate if (d < TOS) TOS = d; 2497c478bd9Sstevel@tonic-gate } 2507c478bd9Sstevel@tonic-gate 2517c478bd9Sstevel@tonic-gate void 2527c478bd9Sstevel@tonic-gate f_max(fcode_env_t *env) 2537c478bd9Sstevel@tonic-gate { 2547c478bd9Sstevel@tonic-gate fstack_t d; 2557c478bd9Sstevel@tonic-gate 2567c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "max"); 2577c478bd9Sstevel@tonic-gate d = POP(DS); 2587c478bd9Sstevel@tonic-gate if (d > TOS) TOS = d; 2597c478bd9Sstevel@tonic-gate } 2607c478bd9Sstevel@tonic-gate 2617c478bd9Sstevel@tonic-gate void 2627c478bd9Sstevel@tonic-gate to_r(fcode_env_t *env) 2637c478bd9Sstevel@tonic-gate { 2647c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, ">r"); 2657c478bd9Sstevel@tonic-gate PUSH(RS, POP(DS)); 2667c478bd9Sstevel@tonic-gate } 2677c478bd9Sstevel@tonic-gate 2687c478bd9Sstevel@tonic-gate void 2697c478bd9Sstevel@tonic-gate from_r(fcode_env_t *env) 2707c478bd9Sstevel@tonic-gate { 2717c478bd9Sstevel@tonic-gate CHECK_RETURN_DEPTH(env, 1, "r>"); 2727c478bd9Sstevel@tonic-gate PUSH(DS, POP(RS)); 2737c478bd9Sstevel@tonic-gate } 2747c478bd9Sstevel@tonic-gate 2757c478bd9Sstevel@tonic-gate void 2767c478bd9Sstevel@tonic-gate rfetch(fcode_env_t *env) 2777c478bd9Sstevel@tonic-gate { 2787c478bd9Sstevel@tonic-gate CHECK_RETURN_DEPTH(env, 1, "r@"); 2797c478bd9Sstevel@tonic-gate PUSH(DS, *RS); 2807c478bd9Sstevel@tonic-gate } 2817c478bd9Sstevel@tonic-gate 2827c478bd9Sstevel@tonic-gate void 2837c478bd9Sstevel@tonic-gate f_exit(fcode_env_t *env) 2847c478bd9Sstevel@tonic-gate { 2857c478bd9Sstevel@tonic-gate CHECK_RETURN_DEPTH(env, 1, "exit"); 2867c478bd9Sstevel@tonic-gate IP = (token_t *)POP(RS); 2877c478bd9Sstevel@tonic-gate } 2887c478bd9Sstevel@tonic-gate 2897c478bd9Sstevel@tonic-gate #define COMPARE(cmp, rhs) ((((s_lforth_t)TOS) cmp((s_lforth_t)(rhs))) ? \ 2907c478bd9Sstevel@tonic-gate TRUE : FALSE) 2917c478bd9Sstevel@tonic-gate #define UCOMPARE(cmp, rhs) ((((u_lforth_t)TOS) cmp((u_lforth_t)(rhs))) ? \ 2927c478bd9Sstevel@tonic-gate TRUE : FALSE) 2937c478bd9Sstevel@tonic-gate #define EQUALS == 2947c478bd9Sstevel@tonic-gate #define NOTEQUALS != 2957c478bd9Sstevel@tonic-gate #define LESSTHAN < 2967c478bd9Sstevel@tonic-gate #define LESSEQUALS <= 2977c478bd9Sstevel@tonic-gate #define GREATERTHAN > 2987c478bd9Sstevel@tonic-gate #define GREATEREQUALS >= 2997c478bd9Sstevel@tonic-gate 3007c478bd9Sstevel@tonic-gate void 3017c478bd9Sstevel@tonic-gate zero_equals(fcode_env_t *env) 3027c478bd9Sstevel@tonic-gate { 3037c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "0="); 3047c478bd9Sstevel@tonic-gate TOS = COMPARE(EQUALS, 0); 3057c478bd9Sstevel@tonic-gate } 3067c478bd9Sstevel@tonic-gate 3077c478bd9Sstevel@tonic-gate void 3087c478bd9Sstevel@tonic-gate zero_not_equals(fcode_env_t *env) 3097c478bd9Sstevel@tonic-gate { 3107c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "0<>"); 3117c478bd9Sstevel@tonic-gate TOS = COMPARE(NOTEQUALS, 0); 3127c478bd9Sstevel@tonic-gate } 3137c478bd9Sstevel@tonic-gate 3147c478bd9Sstevel@tonic-gate void 3157c478bd9Sstevel@tonic-gate zero_less(fcode_env_t *env) 3167c478bd9Sstevel@tonic-gate { 3177c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "0<"); 3187c478bd9Sstevel@tonic-gate TOS = COMPARE(LESSTHAN, 0); 3197c478bd9Sstevel@tonic-gate } 3207c478bd9Sstevel@tonic-gate 3217c478bd9Sstevel@tonic-gate void 3227c478bd9Sstevel@tonic-gate zero_less_equals(fcode_env_t *env) 3237c478bd9Sstevel@tonic-gate { 3247c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "0<="); 3257c478bd9Sstevel@tonic-gate TOS = COMPARE(LESSEQUALS, 0); 3267c478bd9Sstevel@tonic-gate } 3277c478bd9Sstevel@tonic-gate 3287c478bd9Sstevel@tonic-gate void 3297c478bd9Sstevel@tonic-gate zero_greater(fcode_env_t *env) 3307c478bd9Sstevel@tonic-gate { 3317c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "0>"); 3327c478bd9Sstevel@tonic-gate TOS = COMPARE(GREATERTHAN, 0); 3337c478bd9Sstevel@tonic-gate } 3347c478bd9Sstevel@tonic-gate 3357c478bd9Sstevel@tonic-gate void 3367c478bd9Sstevel@tonic-gate zero_greater_equals(fcode_env_t *env) 3377c478bd9Sstevel@tonic-gate { 3387c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "0>="); 3397c478bd9Sstevel@tonic-gate TOS = COMPARE(GREATEREQUALS, 0); 3407c478bd9Sstevel@tonic-gate } 3417c478bd9Sstevel@tonic-gate 3427c478bd9Sstevel@tonic-gate void 3437c478bd9Sstevel@tonic-gate less(fcode_env_t *env) 3447c478bd9Sstevel@tonic-gate { 3457c478bd9Sstevel@tonic-gate fstack_t d; 3467c478bd9Sstevel@tonic-gate 3477c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "<"); 3487c478bd9Sstevel@tonic-gate d = POP(DS); 3497c478bd9Sstevel@tonic-gate TOS = COMPARE(LESSTHAN, d); 3507c478bd9Sstevel@tonic-gate } 3517c478bd9Sstevel@tonic-gate 3527c478bd9Sstevel@tonic-gate void 3537c478bd9Sstevel@tonic-gate greater(fcode_env_t *env) 3547c478bd9Sstevel@tonic-gate { 3557c478bd9Sstevel@tonic-gate fstack_t d; 3567c478bd9Sstevel@tonic-gate 3577c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, ">"); 3587c478bd9Sstevel@tonic-gate d = POP(DS); 3597c478bd9Sstevel@tonic-gate TOS = COMPARE(GREATERTHAN, d); 3607c478bd9Sstevel@tonic-gate } 3617c478bd9Sstevel@tonic-gate 3627c478bd9Sstevel@tonic-gate void 3637c478bd9Sstevel@tonic-gate equals(fcode_env_t *env) 3647c478bd9Sstevel@tonic-gate { 3657c478bd9Sstevel@tonic-gate fstack_t d; 3667c478bd9Sstevel@tonic-gate 3677c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "="); 3687c478bd9Sstevel@tonic-gate d = POP(DS); 3697c478bd9Sstevel@tonic-gate TOS = COMPARE(EQUALS, d); 3707c478bd9Sstevel@tonic-gate } 3717c478bd9Sstevel@tonic-gate 3727c478bd9Sstevel@tonic-gate void 3737c478bd9Sstevel@tonic-gate not_equals(fcode_env_t *env) 3747c478bd9Sstevel@tonic-gate { 3757c478bd9Sstevel@tonic-gate fstack_t d; 3767c478bd9Sstevel@tonic-gate 3777c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "<>"); 3787c478bd9Sstevel@tonic-gate d = POP(DS); 3797c478bd9Sstevel@tonic-gate TOS = COMPARE(NOTEQUALS, d); 3807c478bd9Sstevel@tonic-gate } 3817c478bd9Sstevel@tonic-gate 3827c478bd9Sstevel@tonic-gate 3837c478bd9Sstevel@tonic-gate void 3847c478bd9Sstevel@tonic-gate unsign_greater(fcode_env_t *env) 3857c478bd9Sstevel@tonic-gate { 3867c478bd9Sstevel@tonic-gate ufstack_t d; 3877c478bd9Sstevel@tonic-gate 3887c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "u>"); 3897c478bd9Sstevel@tonic-gate d = POP(DS); 3907c478bd9Sstevel@tonic-gate TOS = UCOMPARE(GREATERTHAN, d); 3917c478bd9Sstevel@tonic-gate } 3927c478bd9Sstevel@tonic-gate 3937c478bd9Sstevel@tonic-gate void 3947c478bd9Sstevel@tonic-gate unsign_less_equals(fcode_env_t *env) 3957c478bd9Sstevel@tonic-gate { 3967c478bd9Sstevel@tonic-gate ufstack_t d; 3977c478bd9Sstevel@tonic-gate 3987c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "u<="); 3997c478bd9Sstevel@tonic-gate d = POP(DS); 4007c478bd9Sstevel@tonic-gate TOS = UCOMPARE(LESSEQUALS, d); 4017c478bd9Sstevel@tonic-gate } 4027c478bd9Sstevel@tonic-gate 4037c478bd9Sstevel@tonic-gate void 4047c478bd9Sstevel@tonic-gate unsign_less(fcode_env_t *env) 4057c478bd9Sstevel@tonic-gate { 4067c478bd9Sstevel@tonic-gate ufstack_t d; 4077c478bd9Sstevel@tonic-gate 4087c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "u<"); 4097c478bd9Sstevel@tonic-gate d = POP(DS); 4107c478bd9Sstevel@tonic-gate TOS = UCOMPARE(LESSTHAN, d); 4117c478bd9Sstevel@tonic-gate } 4127c478bd9Sstevel@tonic-gate 4137c478bd9Sstevel@tonic-gate void 4147c478bd9Sstevel@tonic-gate unsign_greater_equals(fcode_env_t *env) 4157c478bd9Sstevel@tonic-gate { 4167c478bd9Sstevel@tonic-gate ufstack_t d; 4177c478bd9Sstevel@tonic-gate 4187c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "u>="); 4197c478bd9Sstevel@tonic-gate d = POP(DS); 4207c478bd9Sstevel@tonic-gate TOS = UCOMPARE(GREATEREQUALS, d); 4217c478bd9Sstevel@tonic-gate } 4227c478bd9Sstevel@tonic-gate 4237c478bd9Sstevel@tonic-gate void 4247c478bd9Sstevel@tonic-gate greater_equals(fcode_env_t *env) 4257c478bd9Sstevel@tonic-gate { 4267c478bd9Sstevel@tonic-gate fstack_t d; 4277c478bd9Sstevel@tonic-gate 4287c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, ">="); 4297c478bd9Sstevel@tonic-gate d = POP(DS); 4307c478bd9Sstevel@tonic-gate TOS = COMPARE(GREATEREQUALS, d); 4317c478bd9Sstevel@tonic-gate } 4327c478bd9Sstevel@tonic-gate 4337c478bd9Sstevel@tonic-gate void 4347c478bd9Sstevel@tonic-gate less_equals(fcode_env_t *env) 4357c478bd9Sstevel@tonic-gate { 4367c478bd9Sstevel@tonic-gate fstack_t d; 4377c478bd9Sstevel@tonic-gate 4387c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "<="); 4397c478bd9Sstevel@tonic-gate d = POP(DS); 4407c478bd9Sstevel@tonic-gate TOS = COMPARE(LESSEQUALS, d); 4417c478bd9Sstevel@tonic-gate } 4427c478bd9Sstevel@tonic-gate 4437c478bd9Sstevel@tonic-gate void 4447c478bd9Sstevel@tonic-gate between(fcode_env_t *env) 4457c478bd9Sstevel@tonic-gate { 446*3aa1cd26Sgovinda u_lforth_t hi, lo; 4477c478bd9Sstevel@tonic-gate 4487c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "between"); 449*3aa1cd26Sgovinda hi = (u_lforth_t)POP(DS); 450*3aa1cd26Sgovinda lo = (u_lforth_t)POP(DS); 451*3aa1cd26Sgovinda TOS = (((u_lforth_t)TOS >= lo) && ((u_lforth_t)TOS <= hi) ? -1 : 0); 4527c478bd9Sstevel@tonic-gate } 4537c478bd9Sstevel@tonic-gate 4547c478bd9Sstevel@tonic-gate void 4557c478bd9Sstevel@tonic-gate within(fcode_env_t *env) 4567c478bd9Sstevel@tonic-gate { 457*3aa1cd26Sgovinda u_lforth_t lo, hi; 4587c478bd9Sstevel@tonic-gate 4597c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "within"); 460*3aa1cd26Sgovinda hi = (u_lforth_t)POP(DS); 461*3aa1cd26Sgovinda lo = (u_lforth_t)POP(DS); 462*3aa1cd26Sgovinda TOS = ((((u_lforth_t)TOS >= lo) && ((u_lforth_t)TOS < hi)) ? -1 : 0); 4637c478bd9Sstevel@tonic-gate } 4647c478bd9Sstevel@tonic-gate 4657c478bd9Sstevel@tonic-gate void 4667c478bd9Sstevel@tonic-gate do_literal(fcode_env_t *env) 4677c478bd9Sstevel@tonic-gate { 4687c478bd9Sstevel@tonic-gate PUSH(DS, *IP); 4697c478bd9Sstevel@tonic-gate IP++; 4707c478bd9Sstevel@tonic-gate } 4717c478bd9Sstevel@tonic-gate 4727c478bd9Sstevel@tonic-gate void 4737c478bd9Sstevel@tonic-gate literal(fcode_env_t *env) 4747c478bd9Sstevel@tonic-gate { 4757c478bd9Sstevel@tonic-gate if (env->state) { 4767c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&blit_ptr); 4777c478bd9Sstevel@tonic-gate compile_comma(env); 4787c478bd9Sstevel@tonic-gate } 4797c478bd9Sstevel@tonic-gate } 4807c478bd9Sstevel@tonic-gate 4817c478bd9Sstevel@tonic-gate void 4827c478bd9Sstevel@tonic-gate do_also(fcode_env_t *env) 4837c478bd9Sstevel@tonic-gate { 4847c478bd9Sstevel@tonic-gate token_t *d = *ORDER; 4857c478bd9Sstevel@tonic-gate 4867c478bd9Sstevel@tonic-gate if (env->order_depth < (MAX_ORDER - 1)) { 4877c478bd9Sstevel@tonic-gate env->order[++env->order_depth] = d; 4887c478bd9Sstevel@tonic-gate debug_msg(DEBUG_CONTEXT, "CONTEXT:also: %d/%p/%p\n", 4897c478bd9Sstevel@tonic-gate env->order_depth, CONTEXT, env->current); 4907c478bd9Sstevel@tonic-gate } else 4917c478bd9Sstevel@tonic-gate log_message(MSG_WARN, "Vocabulary search order exceeds: %d\n", 4927c478bd9Sstevel@tonic-gate MAX_ORDER); 4937c478bd9Sstevel@tonic-gate } 4947c478bd9Sstevel@tonic-gate 4957c478bd9Sstevel@tonic-gate void 4967c478bd9Sstevel@tonic-gate do_previous(fcode_env_t *env) 4977c478bd9Sstevel@tonic-gate { 4987c478bd9Sstevel@tonic-gate if (env->order_depth) { 4997c478bd9Sstevel@tonic-gate env->order_depth--; 5007c478bd9Sstevel@tonic-gate debug_msg(DEBUG_CONTEXT, "CONTEXT:previous: %d/%p/%p\n", 5017c478bd9Sstevel@tonic-gate env->order_depth, CONTEXT, env->current); 5027c478bd9Sstevel@tonic-gate } 5037c478bd9Sstevel@tonic-gate } 5047c478bd9Sstevel@tonic-gate 5057c478bd9Sstevel@tonic-gate #ifdef DEBUG 5067c478bd9Sstevel@tonic-gate void 5077c478bd9Sstevel@tonic-gate do_order(fcode_env_t *env) 5087c478bd9Sstevel@tonic-gate { 5097c478bd9Sstevel@tonic-gate int i; 5107c478bd9Sstevel@tonic-gate 5117c478bd9Sstevel@tonic-gate log_message(MSG_INFO, "Order: Depth: %ld: ", env->order_depth); 5127c478bd9Sstevel@tonic-gate for (i = env->order_depth; i >= 0 && env->order[i]; i--) 5137c478bd9Sstevel@tonic-gate log_message(MSG_INFO, "%p ", (void *)env->order[i]); 5147c478bd9Sstevel@tonic-gate log_message(MSG_INFO, "\n"); 5157c478bd9Sstevel@tonic-gate } 5167c478bd9Sstevel@tonic-gate #endif 5177c478bd9Sstevel@tonic-gate 5187c478bd9Sstevel@tonic-gate void 5197c478bd9Sstevel@tonic-gate noop(fcode_env_t *env) 5207c478bd9Sstevel@tonic-gate { 5217c478bd9Sstevel@tonic-gate /* what a waste of cycles */ 5227c478bd9Sstevel@tonic-gate } 5237c478bd9Sstevel@tonic-gate 5247c478bd9Sstevel@tonic-gate 5257c478bd9Sstevel@tonic-gate #define FW_PER_FL (sizeof (lforth_t)/sizeof (wforth_t)) 5267c478bd9Sstevel@tonic-gate 5277c478bd9Sstevel@tonic-gate void 5287c478bd9Sstevel@tonic-gate lwsplit(fcode_env_t *env) 5297c478bd9Sstevel@tonic-gate { 5307c478bd9Sstevel@tonic-gate union { 5317c478bd9Sstevel@tonic-gate u_wforth_t l_wf[FW_PER_FL]; 5327c478bd9Sstevel@tonic-gate u_lforth_t l_lf; 5337c478bd9Sstevel@tonic-gate } d; 5347c478bd9Sstevel@tonic-gate int i; 5357c478bd9Sstevel@tonic-gate 5367c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "lwsplit"); 5377c478bd9Sstevel@tonic-gate d.l_lf = POP(DS); 5387c478bd9Sstevel@tonic-gate for (i = 0; i < FW_PER_FL; i++) 5397c478bd9Sstevel@tonic-gate PUSH(DS, d.l_wf[(FW_PER_FL - 1) - i]); 5407c478bd9Sstevel@tonic-gate } 5417c478bd9Sstevel@tonic-gate 5427c478bd9Sstevel@tonic-gate void 5437c478bd9Sstevel@tonic-gate wljoin(fcode_env_t *env) 5447c478bd9Sstevel@tonic-gate { 5457c478bd9Sstevel@tonic-gate union { 5467c478bd9Sstevel@tonic-gate u_wforth_t l_wf[FW_PER_FL]; 5477c478bd9Sstevel@tonic-gate u_lforth_t l_lf; 5487c478bd9Sstevel@tonic-gate } d; 5497c478bd9Sstevel@tonic-gate int i; 5507c478bd9Sstevel@tonic-gate 5517c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, FW_PER_FL, "wljoin"); 5527c478bd9Sstevel@tonic-gate for (i = 0; i < FW_PER_FL; i++) 5537c478bd9Sstevel@tonic-gate d.l_wf[i] = POP(DS); 5547c478bd9Sstevel@tonic-gate PUSH(DS, d.l_lf); 5557c478bd9Sstevel@tonic-gate } 5567c478bd9Sstevel@tonic-gate 5577c478bd9Sstevel@tonic-gate void 5587c478bd9Sstevel@tonic-gate lwflip(fcode_env_t *env) 5597c478bd9Sstevel@tonic-gate { 5607c478bd9Sstevel@tonic-gate union { 5617c478bd9Sstevel@tonic-gate u_wforth_t l_wf[FW_PER_FL]; 5627c478bd9Sstevel@tonic-gate u_lforth_t l_lf; 5637c478bd9Sstevel@tonic-gate } d, c; 5647c478bd9Sstevel@tonic-gate int i; 5657c478bd9Sstevel@tonic-gate 5667c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "lwflip"); 5677c478bd9Sstevel@tonic-gate d.l_lf = POP(DS); 5687c478bd9Sstevel@tonic-gate for (i = 0; i < FW_PER_FL; i++) 5697c478bd9Sstevel@tonic-gate c.l_wf[i] = d.l_wf[(FW_PER_FL - 1) - i]; 5707c478bd9Sstevel@tonic-gate PUSH(DS, c.l_lf); 5717c478bd9Sstevel@tonic-gate } 5727c478bd9Sstevel@tonic-gate 5737c478bd9Sstevel@tonic-gate void 5747c478bd9Sstevel@tonic-gate lbsplit(fcode_env_t *env) 5757c478bd9Sstevel@tonic-gate { 5767c478bd9Sstevel@tonic-gate union { 5777c478bd9Sstevel@tonic-gate uchar_t l_bytes[sizeof (lforth_t)]; 5787c478bd9Sstevel@tonic-gate u_lforth_t l_lf; 5797c478bd9Sstevel@tonic-gate } d; 5807c478bd9Sstevel@tonic-gate int i; 5817c478bd9Sstevel@tonic-gate 5827c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "lbsplit"); 5837c478bd9Sstevel@tonic-gate d.l_lf = POP(DS); 5847c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (lforth_t); i++) 5857c478bd9Sstevel@tonic-gate PUSH(DS, d.l_bytes[(sizeof (lforth_t) - 1) - i]); 5867c478bd9Sstevel@tonic-gate } 5877c478bd9Sstevel@tonic-gate 5887c478bd9Sstevel@tonic-gate void 5897c478bd9Sstevel@tonic-gate bljoin(fcode_env_t *env) 5907c478bd9Sstevel@tonic-gate { 5917c478bd9Sstevel@tonic-gate union { 5927c478bd9Sstevel@tonic-gate uchar_t l_bytes[sizeof (lforth_t)]; 5937c478bd9Sstevel@tonic-gate u_lforth_t l_lf; 5947c478bd9Sstevel@tonic-gate } d; 5957c478bd9Sstevel@tonic-gate int i; 5967c478bd9Sstevel@tonic-gate 5977c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, sizeof (lforth_t), "bljoin"); 5987c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (lforth_t); i++) 5997c478bd9Sstevel@tonic-gate d.l_bytes[i] = POP(DS); 6007c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)d.l_lf); 6017c478bd9Sstevel@tonic-gate } 6027c478bd9Sstevel@tonic-gate 6037c478bd9Sstevel@tonic-gate void 6047c478bd9Sstevel@tonic-gate lbflip(fcode_env_t *env) 6057c478bd9Sstevel@tonic-gate { 6067c478bd9Sstevel@tonic-gate union { 6077c478bd9Sstevel@tonic-gate uchar_t l_bytes[sizeof (lforth_t)]; 6087c478bd9Sstevel@tonic-gate u_lforth_t l_lf; 6097c478bd9Sstevel@tonic-gate } d, c; 6107c478bd9Sstevel@tonic-gate int i; 6117c478bd9Sstevel@tonic-gate 6127c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "lbflip"); 6137c478bd9Sstevel@tonic-gate d.l_lf = POP(DS); 6147c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (lforth_t); i++) 6157c478bd9Sstevel@tonic-gate c.l_bytes[i] = d.l_bytes[(sizeof (lforth_t) - 1) - i]; 6167c478bd9Sstevel@tonic-gate PUSH(DS, c.l_lf); 6177c478bd9Sstevel@tonic-gate } 6187c478bd9Sstevel@tonic-gate 6197c478bd9Sstevel@tonic-gate void 6207c478bd9Sstevel@tonic-gate wbsplit(fcode_env_t *env) 6217c478bd9Sstevel@tonic-gate { 6227c478bd9Sstevel@tonic-gate union { 6237c478bd9Sstevel@tonic-gate uchar_t w_bytes[sizeof (wforth_t)]; 6247c478bd9Sstevel@tonic-gate u_wforth_t w_wf; 6257c478bd9Sstevel@tonic-gate } d; 6267c478bd9Sstevel@tonic-gate int i; 6277c478bd9Sstevel@tonic-gate 6287c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "wbsplit"); 6297c478bd9Sstevel@tonic-gate d.w_wf = POP(DS); 6307c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (wforth_t); i++) 6317c478bd9Sstevel@tonic-gate PUSH(DS, d.w_bytes[(sizeof (wforth_t) - 1) - i]); 6327c478bd9Sstevel@tonic-gate } 6337c478bd9Sstevel@tonic-gate 6347c478bd9Sstevel@tonic-gate void 6357c478bd9Sstevel@tonic-gate bwjoin(fcode_env_t *env) 6367c478bd9Sstevel@tonic-gate { 6377c478bd9Sstevel@tonic-gate union { 6387c478bd9Sstevel@tonic-gate uchar_t w_bytes[sizeof (wforth_t)]; 6397c478bd9Sstevel@tonic-gate u_wforth_t w_wf; 6407c478bd9Sstevel@tonic-gate } d; 6417c478bd9Sstevel@tonic-gate int i; 6427c478bd9Sstevel@tonic-gate 6437c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, sizeof (wforth_t), "bwjoin"); 6447c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (wforth_t); i++) 6457c478bd9Sstevel@tonic-gate d.w_bytes[i] = POP(DS); 6467c478bd9Sstevel@tonic-gate PUSH(DS, d.w_wf); 6477c478bd9Sstevel@tonic-gate } 6487c478bd9Sstevel@tonic-gate 6497c478bd9Sstevel@tonic-gate void 6507c478bd9Sstevel@tonic-gate wbflip(fcode_env_t *env) 6517c478bd9Sstevel@tonic-gate { 6527c478bd9Sstevel@tonic-gate union { 6537c478bd9Sstevel@tonic-gate uchar_t w_bytes[sizeof (wforth_t)]; 6547c478bd9Sstevel@tonic-gate u_wforth_t w_wf; 6557c478bd9Sstevel@tonic-gate } c, d; 6567c478bd9Sstevel@tonic-gate int i; 6577c478bd9Sstevel@tonic-gate 6587c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "wbflip"); 6597c478bd9Sstevel@tonic-gate d.w_wf = POP(DS); 6607c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (wforth_t); i++) 6617c478bd9Sstevel@tonic-gate c.w_bytes[i] = d.w_bytes[(sizeof (wforth_t) - 1) - i]; 6627c478bd9Sstevel@tonic-gate PUSH(DS, c.w_wf); 6637c478bd9Sstevel@tonic-gate } 6647c478bd9Sstevel@tonic-gate 6657c478bd9Sstevel@tonic-gate void 6667c478bd9Sstevel@tonic-gate upper_case(fcode_env_t *env) 6677c478bd9Sstevel@tonic-gate { 6687c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "upc"); 6697c478bd9Sstevel@tonic-gate TOS = toupper(TOS); 6707c478bd9Sstevel@tonic-gate } 6717c478bd9Sstevel@tonic-gate 6727c478bd9Sstevel@tonic-gate void 6737c478bd9Sstevel@tonic-gate lower_case(fcode_env_t *env) 6747c478bd9Sstevel@tonic-gate { 6757c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "lcc"); 6767c478bd9Sstevel@tonic-gate TOS = tolower(TOS); 6777c478bd9Sstevel@tonic-gate } 6787c478bd9Sstevel@tonic-gate 6797c478bd9Sstevel@tonic-gate void 6807c478bd9Sstevel@tonic-gate pack_str(fcode_env_t *env) 6817c478bd9Sstevel@tonic-gate { 6827c478bd9Sstevel@tonic-gate char *buf; 6837c478bd9Sstevel@tonic-gate size_t len; 6847c478bd9Sstevel@tonic-gate char *str; 6857c478bd9Sstevel@tonic-gate 6867c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "pack"); 6877c478bd9Sstevel@tonic-gate buf = (char *)POP(DS); 6887c478bd9Sstevel@tonic-gate len = (size_t)POP(DS); 6897c478bd9Sstevel@tonic-gate str = (char *)TOS; 6907c478bd9Sstevel@tonic-gate TOS = (fstack_t)buf; 6917c478bd9Sstevel@tonic-gate *buf++ = (uchar_t)len; 6927c478bd9Sstevel@tonic-gate strncpy(buf, str, (len&0xff)); 6937c478bd9Sstevel@tonic-gate } 6947c478bd9Sstevel@tonic-gate 6957c478bd9Sstevel@tonic-gate void 6967c478bd9Sstevel@tonic-gate count_str(fcode_env_t *env) 6977c478bd9Sstevel@tonic-gate { 6987c478bd9Sstevel@tonic-gate uchar_t *len; 6997c478bd9Sstevel@tonic-gate 7007c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "count"); 7017c478bd9Sstevel@tonic-gate len = (uchar_t *)TOS; 7027c478bd9Sstevel@tonic-gate TOS += 1; 7037c478bd9Sstevel@tonic-gate PUSH(DS, *len); 7047c478bd9Sstevel@tonic-gate } 7057c478bd9Sstevel@tonic-gate 7067c478bd9Sstevel@tonic-gate void 7077c478bd9Sstevel@tonic-gate to_body(fcode_env_t *env) 7087c478bd9Sstevel@tonic-gate { 7097c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, ">body"); 7107c478bd9Sstevel@tonic-gate TOS = (fstack_t)(((acf_t)TOS)+1); 7117c478bd9Sstevel@tonic-gate } 7127c478bd9Sstevel@tonic-gate 7137c478bd9Sstevel@tonic-gate void 7147c478bd9Sstevel@tonic-gate to_acf(fcode_env_t *env) 7157c478bd9Sstevel@tonic-gate { 7167c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "body>"); 7177c478bd9Sstevel@tonic-gate TOS = (fstack_t)(((acf_t)TOS)-1); 7187c478bd9Sstevel@tonic-gate } 7197c478bd9Sstevel@tonic-gate 7207c478bd9Sstevel@tonic-gate /* 7217c478bd9Sstevel@tonic-gate * 'unloop' Fcode implementation, drop 3 loop ctrl elements off return stack. 7227c478bd9Sstevel@tonic-gate */ 7237c478bd9Sstevel@tonic-gate static void 7247c478bd9Sstevel@tonic-gate unloop(fcode_env_t *env) 7257c478bd9Sstevel@tonic-gate { 7267c478bd9Sstevel@tonic-gate CHECK_RETURN_DEPTH(env, 3, "unloop"); 7277c478bd9Sstevel@tonic-gate RS -= 3; 7287c478bd9Sstevel@tonic-gate } 7297c478bd9Sstevel@tonic-gate 7307c478bd9Sstevel@tonic-gate /* 7317c478bd9Sstevel@tonic-gate * 'um*' Fcode implementation. 7327c478bd9Sstevel@tonic-gate */ 7337c478bd9Sstevel@tonic-gate static void 7347c478bd9Sstevel@tonic-gate um_multiply(fcode_env_t *env) 7357c478bd9Sstevel@tonic-gate { 7367c478bd9Sstevel@tonic-gate ufstack_t u1, u2; 7377c478bd9Sstevel@tonic-gate dforth_t d; 7387c478bd9Sstevel@tonic-gate 7397c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "um*"); 7407c478bd9Sstevel@tonic-gate u1 = POP(DS); 7417c478bd9Sstevel@tonic-gate u2 = POP(DS); 7427c478bd9Sstevel@tonic-gate d = u1 * u2; 7437c478bd9Sstevel@tonic-gate push_double(env, d); 7447c478bd9Sstevel@tonic-gate } 7457c478bd9Sstevel@tonic-gate 7467c478bd9Sstevel@tonic-gate /* 7477c478bd9Sstevel@tonic-gate * um/mod (d.lo d.hi u -- urem uquot) 7487c478bd9Sstevel@tonic-gate */ 7497c478bd9Sstevel@tonic-gate static void 7507c478bd9Sstevel@tonic-gate um_slash_mod(fcode_env_t *env) 7517c478bd9Sstevel@tonic-gate { 7527c478bd9Sstevel@tonic-gate u_dforth_t d; 7537c478bd9Sstevel@tonic-gate uint32_t u, urem, uquot; 7547c478bd9Sstevel@tonic-gate 7557c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "um/mod"); 7567c478bd9Sstevel@tonic-gate u = (uint32_t)POP(DS); 7577c478bd9Sstevel@tonic-gate d = pop_double(env); 7587c478bd9Sstevel@tonic-gate urem = d % u; 7597c478bd9Sstevel@tonic-gate uquot = d / u; 7607c478bd9Sstevel@tonic-gate PUSH(DS, urem); 7617c478bd9Sstevel@tonic-gate PUSH(DS, uquot); 7627c478bd9Sstevel@tonic-gate } 7637c478bd9Sstevel@tonic-gate 7647c478bd9Sstevel@tonic-gate /* 7657c478bd9Sstevel@tonic-gate * d+ (d1.lo d1.hi d2.lo d2.hi -- dsum.lo dsum.hi) 7667c478bd9Sstevel@tonic-gate */ 7677c478bd9Sstevel@tonic-gate static void 7687c478bd9Sstevel@tonic-gate d_plus(fcode_env_t *env) 7697c478bd9Sstevel@tonic-gate { 7707c478bd9Sstevel@tonic-gate dforth_t d1, d2; 7717c478bd9Sstevel@tonic-gate 7727c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 4, "d+"); 7737c478bd9Sstevel@tonic-gate d2 = pop_double(env); 7747c478bd9Sstevel@tonic-gate d1 = pop_double(env); 7757c478bd9Sstevel@tonic-gate d1 += d2; 7767c478bd9Sstevel@tonic-gate push_double(env, d1); 7777c478bd9Sstevel@tonic-gate } 7787c478bd9Sstevel@tonic-gate 7797c478bd9Sstevel@tonic-gate /* 7807c478bd9Sstevel@tonic-gate * d- (d1.lo d1.hi d2.lo d2.hi -- ddif.lo ddif.hi) 7817c478bd9Sstevel@tonic-gate */ 7827c478bd9Sstevel@tonic-gate static void 7837c478bd9Sstevel@tonic-gate d_minus(fcode_env_t *env) 7847c478bd9Sstevel@tonic-gate { 7857c478bd9Sstevel@tonic-gate dforth_t d1, d2; 7867c478bd9Sstevel@tonic-gate 7877c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 4, "d-"); 7887c478bd9Sstevel@tonic-gate d2 = pop_double(env); 7897c478bd9Sstevel@tonic-gate d1 = pop_double(env); 7907c478bd9Sstevel@tonic-gate d1 -= d2; 7917c478bd9Sstevel@tonic-gate push_double(env, d1); 7927c478bd9Sstevel@tonic-gate } 7937c478bd9Sstevel@tonic-gate 7947c478bd9Sstevel@tonic-gate void 7957c478bd9Sstevel@tonic-gate set_here(fcode_env_t *env, uchar_t *new_here, char *where) 7967c478bd9Sstevel@tonic-gate { 7977c478bd9Sstevel@tonic-gate if (new_here < HERE) { 7987c478bd9Sstevel@tonic-gate if (strcmp(where, "temporary_execute")) { 7997c478bd9Sstevel@tonic-gate /* 8007c478bd9Sstevel@tonic-gate * Other than temporary_execute, no one should set 8017c478bd9Sstevel@tonic-gate * here backwards. 8027c478bd9Sstevel@tonic-gate */ 8037c478bd9Sstevel@tonic-gate log_message(MSG_WARN, "Warning: set_here(%s) back: old:" 8047c478bd9Sstevel@tonic-gate " %p new: %p\n", where, HERE, new_here); 8057c478bd9Sstevel@tonic-gate } 8067c478bd9Sstevel@tonic-gate } 8077c478bd9Sstevel@tonic-gate if (new_here >= env->base + dict_size) 8087c478bd9Sstevel@tonic-gate forth_abort(env, "Here (%p) set past dictionary end (%p)", 8097c478bd9Sstevel@tonic-gate new_here, env->base + dict_size); 8107c478bd9Sstevel@tonic-gate HERE = new_here; 8117c478bd9Sstevel@tonic-gate } 8127c478bd9Sstevel@tonic-gate 8137c478bd9Sstevel@tonic-gate static void 8147c478bd9Sstevel@tonic-gate unaligned_store(fcode_env_t *env) 8157c478bd9Sstevel@tonic-gate { 8167c478bd9Sstevel@tonic-gate extern void unaligned_xstore(fcode_env_t *); 8177c478bd9Sstevel@tonic-gate 8187c478bd9Sstevel@tonic-gate if (sizeof (fstack_t) == sizeof (lforth_t)) 8197c478bd9Sstevel@tonic-gate unaligned_lstore(env); 8207c478bd9Sstevel@tonic-gate else 8217c478bd9Sstevel@tonic-gate unaligned_xstore(env); 8227c478bd9Sstevel@tonic-gate } 8237c478bd9Sstevel@tonic-gate 8247c478bd9Sstevel@tonic-gate static void 8257c478bd9Sstevel@tonic-gate unaligned_fetch(fcode_env_t *env) 8267c478bd9Sstevel@tonic-gate { 8277c478bd9Sstevel@tonic-gate extern void unaligned_xfetch(fcode_env_t *); 8287c478bd9Sstevel@tonic-gate 8297c478bd9Sstevel@tonic-gate if (sizeof (fstack_t) == sizeof (lforth_t)) 8307c478bd9Sstevel@tonic-gate unaligned_lfetch(env); 8317c478bd9Sstevel@tonic-gate else 8327c478bd9Sstevel@tonic-gate unaligned_xfetch(env); 8337c478bd9Sstevel@tonic-gate } 8347c478bd9Sstevel@tonic-gate 8357c478bd9Sstevel@tonic-gate void 8367c478bd9Sstevel@tonic-gate comma(fcode_env_t *env) 8377c478bd9Sstevel@tonic-gate { 8387c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, ","); 8397c478bd9Sstevel@tonic-gate DEBUGF(COMMA, dump_comma(env, ",")); 8407c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)HERE); 8417c478bd9Sstevel@tonic-gate unaligned_store(env); 8427c478bd9Sstevel@tonic-gate set_here(env, HERE + sizeof (fstack_t), "comma"); 8437c478bd9Sstevel@tonic-gate } 8447c478bd9Sstevel@tonic-gate 8457c478bd9Sstevel@tonic-gate void 8467c478bd9Sstevel@tonic-gate lcomma(fcode_env_t *env) 8477c478bd9Sstevel@tonic-gate { 8487c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "l,"); 8497c478bd9Sstevel@tonic-gate DEBUGF(COMMA, dump_comma(env, "l,")); 8507c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)HERE); 8517c478bd9Sstevel@tonic-gate unaligned_lstore(env); 8527c478bd9Sstevel@tonic-gate set_here(env, HERE + sizeof (u_lforth_t), "lcomma"); 8537c478bd9Sstevel@tonic-gate } 8547c478bd9Sstevel@tonic-gate 8557c478bd9Sstevel@tonic-gate void 8567c478bd9Sstevel@tonic-gate wcomma(fcode_env_t *env) 8577c478bd9Sstevel@tonic-gate { 8587c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "w,"); 8597c478bd9Sstevel@tonic-gate DEBUGF(COMMA, dump_comma(env, "w,")); 8607c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)HERE); 8617c478bd9Sstevel@tonic-gate unaligned_wstore(env); 8627c478bd9Sstevel@tonic-gate set_here(env, HERE + sizeof (u_wforth_t), "wcomma"); 8637c478bd9Sstevel@tonic-gate } 8647c478bd9Sstevel@tonic-gate 8657c478bd9Sstevel@tonic-gate void 8667c478bd9Sstevel@tonic-gate ccomma(fcode_env_t *env) 8677c478bd9Sstevel@tonic-gate { 8687c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "c,"); 8697c478bd9Sstevel@tonic-gate DEBUGF(COMMA, dump_comma(env, "c,")); 8707c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)HERE); 8717c478bd9Sstevel@tonic-gate cstore(env); 8727c478bd9Sstevel@tonic-gate set_here(env, HERE + sizeof (uchar_t), "ccomma"); 8737c478bd9Sstevel@tonic-gate } 8747c478bd9Sstevel@tonic-gate 8757c478bd9Sstevel@tonic-gate void 8767c478bd9Sstevel@tonic-gate token_roundup(fcode_env_t *env, char *where) 8777c478bd9Sstevel@tonic-gate { 8787c478bd9Sstevel@tonic-gate if ((((token_t)HERE) & (sizeof (token_t) - 1)) != 0) { 8797c478bd9Sstevel@tonic-gate set_here(env, (uchar_t *)TOKEN_ROUNDUP(HERE), where); 8807c478bd9Sstevel@tonic-gate } 8817c478bd9Sstevel@tonic-gate } 8827c478bd9Sstevel@tonic-gate 8837c478bd9Sstevel@tonic-gate void 8847c478bd9Sstevel@tonic-gate compile_comma(fcode_env_t *env) 8857c478bd9Sstevel@tonic-gate { 8867c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "compile,"); 8877c478bd9Sstevel@tonic-gate DEBUGF(COMMA, dump_comma(env, "compile,")); 8887c478bd9Sstevel@tonic-gate token_roundup(env, "compile,"); 8897c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)HERE); 8907c478bd9Sstevel@tonic-gate unaligned_store(env); 8917c478bd9Sstevel@tonic-gate set_here(env, HERE + sizeof (fstack_t), "compile,"); 8927c478bd9Sstevel@tonic-gate } 8937c478bd9Sstevel@tonic-gate 8947c478bd9Sstevel@tonic-gate void 8957c478bd9Sstevel@tonic-gate unaligned_lfetch(fcode_env_t *env) 8967c478bd9Sstevel@tonic-gate { 8977c478bd9Sstevel@tonic-gate fstack_t addr; 8987c478bd9Sstevel@tonic-gate int i; 8997c478bd9Sstevel@tonic-gate 9007c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "unaligned-l@"); 9017c478bd9Sstevel@tonic-gate addr = POP(DS); 9027c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (lforth_t); i++, addr++) { 9037c478bd9Sstevel@tonic-gate PUSH(DS, addr); 9047c478bd9Sstevel@tonic-gate cfetch(env); 9057c478bd9Sstevel@tonic-gate } 9067c478bd9Sstevel@tonic-gate bljoin(env); 9077c478bd9Sstevel@tonic-gate lbflip(env); 9087c478bd9Sstevel@tonic-gate } 9097c478bd9Sstevel@tonic-gate 9107c478bd9Sstevel@tonic-gate void 9117c478bd9Sstevel@tonic-gate unaligned_lstore(fcode_env_t *env) 9127c478bd9Sstevel@tonic-gate { 9137c478bd9Sstevel@tonic-gate fstack_t addr; 9147c478bd9Sstevel@tonic-gate int i; 9157c478bd9Sstevel@tonic-gate 9167c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "unaligned-l!"); 9177c478bd9Sstevel@tonic-gate addr = POP(DS); 9187c478bd9Sstevel@tonic-gate lbsplit(env); 9197c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (lforth_t); i++, addr++) { 9207c478bd9Sstevel@tonic-gate PUSH(DS, addr); 9217c478bd9Sstevel@tonic-gate cstore(env); 9227c478bd9Sstevel@tonic-gate } 9237c478bd9Sstevel@tonic-gate } 9247c478bd9Sstevel@tonic-gate 9257c478bd9Sstevel@tonic-gate void 9267c478bd9Sstevel@tonic-gate unaligned_wfetch(fcode_env_t *env) 9277c478bd9Sstevel@tonic-gate { 9287c478bd9Sstevel@tonic-gate fstack_t addr; 9297c478bd9Sstevel@tonic-gate int i; 9307c478bd9Sstevel@tonic-gate 9317c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "unaligned-w@"); 9327c478bd9Sstevel@tonic-gate addr = POP(DS); 9337c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (wforth_t); i++, addr++) { 9347c478bd9Sstevel@tonic-gate PUSH(DS, addr); 9357c478bd9Sstevel@tonic-gate cfetch(env); 9367c478bd9Sstevel@tonic-gate } 9377c478bd9Sstevel@tonic-gate bwjoin(env); 9387c478bd9Sstevel@tonic-gate wbflip(env); 9397c478bd9Sstevel@tonic-gate } 9407c478bd9Sstevel@tonic-gate 9417c478bd9Sstevel@tonic-gate void 9427c478bd9Sstevel@tonic-gate unaligned_wstore(fcode_env_t *env) 9437c478bd9Sstevel@tonic-gate { 9447c478bd9Sstevel@tonic-gate fstack_t addr; 9457c478bd9Sstevel@tonic-gate int i; 9467c478bd9Sstevel@tonic-gate 9477c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "unaligned-w!"); 9487c478bd9Sstevel@tonic-gate addr = POP(DS); 9497c478bd9Sstevel@tonic-gate wbsplit(env); 9507c478bd9Sstevel@tonic-gate for (i = 0; i < sizeof (wforth_t); i++, addr++) { 9517c478bd9Sstevel@tonic-gate PUSH(DS, addr); 9527c478bd9Sstevel@tonic-gate cstore(env); 9537c478bd9Sstevel@tonic-gate } 9547c478bd9Sstevel@tonic-gate } 9557c478bd9Sstevel@tonic-gate 9567c478bd9Sstevel@tonic-gate /* 9577c478bd9Sstevel@tonic-gate * 'lbflips' Fcode implementation. 9587c478bd9Sstevel@tonic-gate */ 9597c478bd9Sstevel@tonic-gate static void 9607c478bd9Sstevel@tonic-gate lbflips(fcode_env_t *env) 9617c478bd9Sstevel@tonic-gate { 9627c478bd9Sstevel@tonic-gate fstack_t len, addr; 9637c478bd9Sstevel@tonic-gate int i; 9647c478bd9Sstevel@tonic-gate 9657c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "lbflips"); 9667c478bd9Sstevel@tonic-gate len = POP(DS); 9677c478bd9Sstevel@tonic-gate addr = POP(DS); 9687c478bd9Sstevel@tonic-gate for (i = 0; i < len; i += sizeof (lforth_t), 9697c478bd9Sstevel@tonic-gate addr += sizeof (lforth_t)) { 9707c478bd9Sstevel@tonic-gate PUSH(DS, addr); 9717c478bd9Sstevel@tonic-gate unaligned_lfetch(env); 9727c478bd9Sstevel@tonic-gate lbflip(env); 9737c478bd9Sstevel@tonic-gate PUSH(DS, addr); 9747c478bd9Sstevel@tonic-gate unaligned_lstore(env); 9757c478bd9Sstevel@tonic-gate } 9767c478bd9Sstevel@tonic-gate } 9777c478bd9Sstevel@tonic-gate 9787c478bd9Sstevel@tonic-gate /* 9797c478bd9Sstevel@tonic-gate * 'wbflips' Fcode implementation. 9807c478bd9Sstevel@tonic-gate */ 9817c478bd9Sstevel@tonic-gate static void 9827c478bd9Sstevel@tonic-gate wbflips(fcode_env_t *env) 9837c478bd9Sstevel@tonic-gate { 9847c478bd9Sstevel@tonic-gate fstack_t len, addr; 9857c478bd9Sstevel@tonic-gate int i; 9867c478bd9Sstevel@tonic-gate 9877c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "wbflips"); 9887c478bd9Sstevel@tonic-gate len = POP(DS); 9897c478bd9Sstevel@tonic-gate addr = POP(DS); 9907c478bd9Sstevel@tonic-gate for (i = 0; i < len; i += sizeof (wforth_t), 9917c478bd9Sstevel@tonic-gate addr += sizeof (wforth_t)) { 9927c478bd9Sstevel@tonic-gate PUSH(DS, addr); 9937c478bd9Sstevel@tonic-gate unaligned_wfetch(env); 9947c478bd9Sstevel@tonic-gate wbflip(env); 9957c478bd9Sstevel@tonic-gate PUSH(DS, addr); 9967c478bd9Sstevel@tonic-gate unaligned_wstore(env); 9977c478bd9Sstevel@tonic-gate } 9987c478bd9Sstevel@tonic-gate } 9997c478bd9Sstevel@tonic-gate 10007c478bd9Sstevel@tonic-gate /* 10017c478bd9Sstevel@tonic-gate * 'lwflips' Fcode implementation. 10027c478bd9Sstevel@tonic-gate */ 10037c478bd9Sstevel@tonic-gate static void 10047c478bd9Sstevel@tonic-gate lwflips(fcode_env_t *env) 10057c478bd9Sstevel@tonic-gate { 10067c478bd9Sstevel@tonic-gate fstack_t len, addr; 10077c478bd9Sstevel@tonic-gate int i; 10087c478bd9Sstevel@tonic-gate 10097c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "lwflips"); 10107c478bd9Sstevel@tonic-gate len = POP(DS); 10117c478bd9Sstevel@tonic-gate addr = POP(DS); 10127c478bd9Sstevel@tonic-gate for (i = 0; i < len; i += sizeof (lforth_t), 10137c478bd9Sstevel@tonic-gate addr += sizeof (lforth_t)) { 10147c478bd9Sstevel@tonic-gate PUSH(DS, addr); 10157c478bd9Sstevel@tonic-gate unaligned_lfetch(env); 10167c478bd9Sstevel@tonic-gate lwflip(env); 10177c478bd9Sstevel@tonic-gate PUSH(DS, addr); 10187c478bd9Sstevel@tonic-gate unaligned_lstore(env); 10197c478bd9Sstevel@tonic-gate } 10207c478bd9Sstevel@tonic-gate } 10217c478bd9Sstevel@tonic-gate 10227c478bd9Sstevel@tonic-gate void 10237c478bd9Sstevel@tonic-gate base(fcode_env_t *env) 10247c478bd9Sstevel@tonic-gate { 10257c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)&env->num_base); 10267c478bd9Sstevel@tonic-gate } 10277c478bd9Sstevel@tonic-gate 10287c478bd9Sstevel@tonic-gate void 10297c478bd9Sstevel@tonic-gate dot_s(fcode_env_t *env) 10307c478bd9Sstevel@tonic-gate { 10317c478bd9Sstevel@tonic-gate output_data_stack(env, MSG_INFO); 10327c478bd9Sstevel@tonic-gate } 10337c478bd9Sstevel@tonic-gate 10347c478bd9Sstevel@tonic-gate void 10357c478bd9Sstevel@tonic-gate state(fcode_env_t *env) 10367c478bd9Sstevel@tonic-gate { 10377c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)&env->state); 10387c478bd9Sstevel@tonic-gate } 10397c478bd9Sstevel@tonic-gate 10407c478bd9Sstevel@tonic-gate int 10417c478bd9Sstevel@tonic-gate is_digit(char digit, int num_base, fstack_t *dptr) 10427c478bd9Sstevel@tonic-gate { 10437c478bd9Sstevel@tonic-gate int error = 0; 10447c478bd9Sstevel@tonic-gate char base; 10457c478bd9Sstevel@tonic-gate 10467c478bd9Sstevel@tonic-gate if (num_base < 10) { 10477c478bd9Sstevel@tonic-gate base = '0' + (num_base-1); 10487c478bd9Sstevel@tonic-gate } else { 10497c478bd9Sstevel@tonic-gate base = 'a' + (num_base - 10); 10507c478bd9Sstevel@tonic-gate } 10517c478bd9Sstevel@tonic-gate 10527c478bd9Sstevel@tonic-gate *dptr = 0; 10537c478bd9Sstevel@tonic-gate if (digit > '9') digit |= 0x20; 10547c478bd9Sstevel@tonic-gate if (((digit < '0') || (digit > base)) || 10557c478bd9Sstevel@tonic-gate ((digit > '9') && (digit < 'a') && (num_base > 10))) 10567c478bd9Sstevel@tonic-gate error = 1; 10577c478bd9Sstevel@tonic-gate else { 10587c478bd9Sstevel@tonic-gate if (digit <= '9') 10597c478bd9Sstevel@tonic-gate digit -= '0'; 10607c478bd9Sstevel@tonic-gate else 10617c478bd9Sstevel@tonic-gate digit = digit - 'a' + 10; 10627c478bd9Sstevel@tonic-gate *dptr = digit; 10637c478bd9Sstevel@tonic-gate } 10647c478bd9Sstevel@tonic-gate return (error); 10657c478bd9Sstevel@tonic-gate } 10667c478bd9Sstevel@tonic-gate 10677c478bd9Sstevel@tonic-gate void 10687c478bd9Sstevel@tonic-gate dollar_number(fcode_env_t *env) 10697c478bd9Sstevel@tonic-gate { 10707c478bd9Sstevel@tonic-gate char *buf; 10717c478bd9Sstevel@tonic-gate fstack_t value; 10727c478bd9Sstevel@tonic-gate int len, sign = 1, error = 0; 10737c478bd9Sstevel@tonic-gate 10747c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "$number"); 10757c478bd9Sstevel@tonic-gate buf = pop_a_string(env, &len); 10767c478bd9Sstevel@tonic-gate if (*buf == '-') { 10777c478bd9Sstevel@tonic-gate sign = -1; 10787c478bd9Sstevel@tonic-gate buf++; 10797c478bd9Sstevel@tonic-gate len--; 10807c478bd9Sstevel@tonic-gate } 10817c478bd9Sstevel@tonic-gate value = 0; 10827c478bd9Sstevel@tonic-gate while (len-- && !error) { 10837c478bd9Sstevel@tonic-gate fstack_t digit; 10847c478bd9Sstevel@tonic-gate 10857c478bd9Sstevel@tonic-gate if (*buf == '.') { 10867c478bd9Sstevel@tonic-gate buf++; 10877c478bd9Sstevel@tonic-gate continue; 10887c478bd9Sstevel@tonic-gate } 10897c478bd9Sstevel@tonic-gate value *= env->num_base; 10907c478bd9Sstevel@tonic-gate error = is_digit(*buf++, env->num_base, &digit); 10917c478bd9Sstevel@tonic-gate value += digit; 10927c478bd9Sstevel@tonic-gate } 10937c478bd9Sstevel@tonic-gate if (error) { 10947c478bd9Sstevel@tonic-gate PUSH(DS, -1); 10957c478bd9Sstevel@tonic-gate } else { 10967c478bd9Sstevel@tonic-gate value *= sign; 10977c478bd9Sstevel@tonic-gate PUSH(DS, value); 10987c478bd9Sstevel@tonic-gate PUSH(DS, 0); 10997c478bd9Sstevel@tonic-gate } 11007c478bd9Sstevel@tonic-gate } 11017c478bd9Sstevel@tonic-gate 11027c478bd9Sstevel@tonic-gate void 11037c478bd9Sstevel@tonic-gate digit(fcode_env_t *env) 11047c478bd9Sstevel@tonic-gate { 11057c478bd9Sstevel@tonic-gate fstack_t base; 11067c478bd9Sstevel@tonic-gate fstack_t value; 11077c478bd9Sstevel@tonic-gate 11087c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "digit"); 11097c478bd9Sstevel@tonic-gate base = POP(DS); 11107c478bd9Sstevel@tonic-gate if (is_digit(TOS, base, &value)) 11117c478bd9Sstevel@tonic-gate PUSH(DS, 0); 11127c478bd9Sstevel@tonic-gate else { 11137c478bd9Sstevel@tonic-gate TOS = value; 11147c478bd9Sstevel@tonic-gate PUSH(DS, -1); 11157c478bd9Sstevel@tonic-gate } 11167c478bd9Sstevel@tonic-gate } 11177c478bd9Sstevel@tonic-gate 11187c478bd9Sstevel@tonic-gate void 11197c478bd9Sstevel@tonic-gate space(fcode_env_t *env) 11207c478bd9Sstevel@tonic-gate { 11217c478bd9Sstevel@tonic-gate PUSH(DS, ' '); 11227c478bd9Sstevel@tonic-gate } 11237c478bd9Sstevel@tonic-gate 11247c478bd9Sstevel@tonic-gate void 11257c478bd9Sstevel@tonic-gate backspace(fcode_env_t *env) 11267c478bd9Sstevel@tonic-gate { 11277c478bd9Sstevel@tonic-gate PUSH(DS, '\b'); 11287c478bd9Sstevel@tonic-gate } 11297c478bd9Sstevel@tonic-gate 11307c478bd9Sstevel@tonic-gate void 11317c478bd9Sstevel@tonic-gate bell(fcode_env_t *env) 11327c478bd9Sstevel@tonic-gate { 11337c478bd9Sstevel@tonic-gate PUSH(DS, '\a'); 11347c478bd9Sstevel@tonic-gate } 11357c478bd9Sstevel@tonic-gate 11367c478bd9Sstevel@tonic-gate void 11377c478bd9Sstevel@tonic-gate fc_bounds(fcode_env_t *env) 11387c478bd9Sstevel@tonic-gate { 11397c478bd9Sstevel@tonic-gate fstack_t lo, hi; 11407c478bd9Sstevel@tonic-gate 11417c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "bounds"); 11427c478bd9Sstevel@tonic-gate lo = DS[-1]; 11437c478bd9Sstevel@tonic-gate hi = TOS; 11447c478bd9Sstevel@tonic-gate DS[-1] = lo+hi; 11457c478bd9Sstevel@tonic-gate TOS = lo; 11467c478bd9Sstevel@tonic-gate } 11477c478bd9Sstevel@tonic-gate 11487c478bd9Sstevel@tonic-gate void 11497c478bd9Sstevel@tonic-gate here(fcode_env_t *env) 11507c478bd9Sstevel@tonic-gate { 11517c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)HERE); 11527c478bd9Sstevel@tonic-gate } 11537c478bd9Sstevel@tonic-gate 11547c478bd9Sstevel@tonic-gate void 11557c478bd9Sstevel@tonic-gate aligned(fcode_env_t *env) 11567c478bd9Sstevel@tonic-gate { 11577c478bd9Sstevel@tonic-gate ufstack_t a; 11587c478bd9Sstevel@tonic-gate 11597c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "aligned"); 11607c478bd9Sstevel@tonic-gate a = (TOS & (sizeof (lforth_t) - 1)); 11617c478bd9Sstevel@tonic-gate if (a) 11627c478bd9Sstevel@tonic-gate TOS += (sizeof (lforth_t) - a); 11637c478bd9Sstevel@tonic-gate } 11647c478bd9Sstevel@tonic-gate 11657c478bd9Sstevel@tonic-gate void 11667c478bd9Sstevel@tonic-gate instance(fcode_env_t *env) 11677c478bd9Sstevel@tonic-gate { 11687c478bd9Sstevel@tonic-gate env->instance_mode |= 1; 11697c478bd9Sstevel@tonic-gate } 11707c478bd9Sstevel@tonic-gate 11717c478bd9Sstevel@tonic-gate void 11727c478bd9Sstevel@tonic-gate semi(fcode_env_t *env) 11737c478bd9Sstevel@tonic-gate { 11747c478bd9Sstevel@tonic-gate 11757c478bd9Sstevel@tonic-gate env->state &= ~1; 11767c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&semi_ptr); 11777c478bd9Sstevel@tonic-gate 11787c478bd9Sstevel@tonic-gate /* 11797c478bd9Sstevel@tonic-gate * check if we need to supress expose action; 11807c478bd9Sstevel@tonic-gate * If so this is an internal word and has no link field 11817c478bd9Sstevel@tonic-gate * or it is a temporary compile 11827c478bd9Sstevel@tonic-gate */ 11837c478bd9Sstevel@tonic-gate 11847c478bd9Sstevel@tonic-gate if (env->state == 0) { 11857c478bd9Sstevel@tonic-gate expose_acf(env, "<semi>"); 11867c478bd9Sstevel@tonic-gate } 11877c478bd9Sstevel@tonic-gate if (env->state & 8) { 11887c478bd9Sstevel@tonic-gate env->state ^= 8; 11897c478bd9Sstevel@tonic-gate } 11907c478bd9Sstevel@tonic-gate } 11917c478bd9Sstevel@tonic-gate 11927c478bd9Sstevel@tonic-gate void 11937c478bd9Sstevel@tonic-gate do_create(fcode_env_t *env) 11947c478bd9Sstevel@tonic-gate { 11957c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)WA); 11967c478bd9Sstevel@tonic-gate } 11977c478bd9Sstevel@tonic-gate 11987c478bd9Sstevel@tonic-gate void 11997c478bd9Sstevel@tonic-gate drop(fcode_env_t *env) 12007c478bd9Sstevel@tonic-gate { 12017c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "drop"); 12027c478bd9Sstevel@tonic-gate (void) POP(DS); 12037c478bd9Sstevel@tonic-gate } 12047c478bd9Sstevel@tonic-gate 12057c478bd9Sstevel@tonic-gate void 12067c478bd9Sstevel@tonic-gate f_dup(fcode_env_t *env) 12077c478bd9Sstevel@tonic-gate { 12087c478bd9Sstevel@tonic-gate fstack_t d; 12097c478bd9Sstevel@tonic-gate 12107c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "dup"); 12117c478bd9Sstevel@tonic-gate d = TOS; 12127c478bd9Sstevel@tonic-gate PUSH(DS, d); 12137c478bd9Sstevel@tonic-gate } 12147c478bd9Sstevel@tonic-gate 12157c478bd9Sstevel@tonic-gate void 12167c478bd9Sstevel@tonic-gate over(fcode_env_t *env) 12177c478bd9Sstevel@tonic-gate { 12187c478bd9Sstevel@tonic-gate fstack_t d; 12197c478bd9Sstevel@tonic-gate 12207c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "over"); 12217c478bd9Sstevel@tonic-gate d = DS[-1]; 12227c478bd9Sstevel@tonic-gate PUSH(DS, d); 12237c478bd9Sstevel@tonic-gate } 12247c478bd9Sstevel@tonic-gate 12257c478bd9Sstevel@tonic-gate void 12267c478bd9Sstevel@tonic-gate swap(fcode_env_t *env) 12277c478bd9Sstevel@tonic-gate { 12287c478bd9Sstevel@tonic-gate fstack_t d; 12297c478bd9Sstevel@tonic-gate 12307c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "swap"); 12317c478bd9Sstevel@tonic-gate d = DS[-1]; 12327c478bd9Sstevel@tonic-gate DS[-1] = DS[0]; 12337c478bd9Sstevel@tonic-gate DS[0] = d; 12347c478bd9Sstevel@tonic-gate } 12357c478bd9Sstevel@tonic-gate 12367c478bd9Sstevel@tonic-gate 12377c478bd9Sstevel@tonic-gate void 12387c478bd9Sstevel@tonic-gate rot(fcode_env_t *env) 12397c478bd9Sstevel@tonic-gate { 12407c478bd9Sstevel@tonic-gate fstack_t d; 12417c478bd9Sstevel@tonic-gate 12427c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "rot"); 12437c478bd9Sstevel@tonic-gate d = DS[-2]; 12447c478bd9Sstevel@tonic-gate DS[-2] = DS[-1]; 12457c478bd9Sstevel@tonic-gate DS[-1] = TOS; 12467c478bd9Sstevel@tonic-gate TOS = d; 12477c478bd9Sstevel@tonic-gate } 12487c478bd9Sstevel@tonic-gate 12497c478bd9Sstevel@tonic-gate void 12507c478bd9Sstevel@tonic-gate minus_rot(fcode_env_t *env) 12517c478bd9Sstevel@tonic-gate { 12527c478bd9Sstevel@tonic-gate fstack_t d; 12537c478bd9Sstevel@tonic-gate 12547c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "-rot"); 12557c478bd9Sstevel@tonic-gate d = TOS; 12567c478bd9Sstevel@tonic-gate TOS = DS[-1]; 12577c478bd9Sstevel@tonic-gate DS[-1] = DS[-2]; 12587c478bd9Sstevel@tonic-gate DS[-2] = d; 12597c478bd9Sstevel@tonic-gate } 12607c478bd9Sstevel@tonic-gate 12617c478bd9Sstevel@tonic-gate void 12627c478bd9Sstevel@tonic-gate tuck(fcode_env_t *env) 12637c478bd9Sstevel@tonic-gate { 12647c478bd9Sstevel@tonic-gate fstack_t d; 12657c478bd9Sstevel@tonic-gate 12667c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "tuck"); 12677c478bd9Sstevel@tonic-gate d = TOS; 12687c478bd9Sstevel@tonic-gate swap(env); 12697c478bd9Sstevel@tonic-gate PUSH(DS, d); 12707c478bd9Sstevel@tonic-gate } 12717c478bd9Sstevel@tonic-gate 12727c478bd9Sstevel@tonic-gate void 12737c478bd9Sstevel@tonic-gate nip(fcode_env_t *env) 12747c478bd9Sstevel@tonic-gate { 12757c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "nip"); 12767c478bd9Sstevel@tonic-gate swap(env); 12777c478bd9Sstevel@tonic-gate drop(env); 12787c478bd9Sstevel@tonic-gate } 12797c478bd9Sstevel@tonic-gate 12807c478bd9Sstevel@tonic-gate void 12817c478bd9Sstevel@tonic-gate qdup(fcode_env_t *env) 12827c478bd9Sstevel@tonic-gate { 12837c478bd9Sstevel@tonic-gate fstack_t d; 12847c478bd9Sstevel@tonic-gate 12857c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "?dup"); 12867c478bd9Sstevel@tonic-gate d = TOS; 12877c478bd9Sstevel@tonic-gate if (d) 12887c478bd9Sstevel@tonic-gate PUSH(DS, d); 12897c478bd9Sstevel@tonic-gate } 12907c478bd9Sstevel@tonic-gate 12917c478bd9Sstevel@tonic-gate void 12927c478bd9Sstevel@tonic-gate depth(fcode_env_t *env) 12937c478bd9Sstevel@tonic-gate { 12947c478bd9Sstevel@tonic-gate fstack_t d; 12957c478bd9Sstevel@tonic-gate 12967c478bd9Sstevel@tonic-gate d = DS - env->ds0; 12977c478bd9Sstevel@tonic-gate PUSH(DS, d); 12987c478bd9Sstevel@tonic-gate } 12997c478bd9Sstevel@tonic-gate 13007c478bd9Sstevel@tonic-gate void 13017c478bd9Sstevel@tonic-gate pick(fcode_env_t *env) 13027c478bd9Sstevel@tonic-gate { 13037c478bd9Sstevel@tonic-gate fstack_t p; 13047c478bd9Sstevel@tonic-gate 13057c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "pick"); 13067c478bd9Sstevel@tonic-gate p = POP(DS); 13077c478bd9Sstevel@tonic-gate if (p < 0 || p >= (env->ds - env->ds0)) 13087c478bd9Sstevel@tonic-gate forth_abort(env, "pick: invalid pick value: %d\n", (int)p); 13097c478bd9Sstevel@tonic-gate p = DS[-p]; 13107c478bd9Sstevel@tonic-gate PUSH(DS, p); 13117c478bd9Sstevel@tonic-gate } 13127c478bd9Sstevel@tonic-gate 13137c478bd9Sstevel@tonic-gate void 13147c478bd9Sstevel@tonic-gate roll(fcode_env_t *env) 13157c478bd9Sstevel@tonic-gate { 13167c478bd9Sstevel@tonic-gate fstack_t d, r; 13177c478bd9Sstevel@tonic-gate 13187c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "roll"); 13197c478bd9Sstevel@tonic-gate r = POP(DS); 13207c478bd9Sstevel@tonic-gate if (r <= 0 || r >= (env->ds - env->ds0)) 13217c478bd9Sstevel@tonic-gate forth_abort(env, "roll: invalid roll value: %d\n", (int)r); 13227c478bd9Sstevel@tonic-gate 13237c478bd9Sstevel@tonic-gate d = DS[-r]; 13247c478bd9Sstevel@tonic-gate while (r) { 13257c478bd9Sstevel@tonic-gate DS[-r] = DS[ -(r-1) ]; 13267c478bd9Sstevel@tonic-gate r--; 13277c478bd9Sstevel@tonic-gate } 13287c478bd9Sstevel@tonic-gate TOS = d; 13297c478bd9Sstevel@tonic-gate } 13307c478bd9Sstevel@tonic-gate 13317c478bd9Sstevel@tonic-gate void 13327c478bd9Sstevel@tonic-gate two_drop(fcode_env_t *env) 13337c478bd9Sstevel@tonic-gate { 13347c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "2drop"); 13357c478bd9Sstevel@tonic-gate DS -= 2; 13367c478bd9Sstevel@tonic-gate } 13377c478bd9Sstevel@tonic-gate 13387c478bd9Sstevel@tonic-gate void 13397c478bd9Sstevel@tonic-gate two_dup(fcode_env_t *env) 13407c478bd9Sstevel@tonic-gate { 13417c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "2dup"); 13427c478bd9Sstevel@tonic-gate DS[1] = DS[-1]; 13437c478bd9Sstevel@tonic-gate DS[2] = TOS; 13447c478bd9Sstevel@tonic-gate DS += 2; 13457c478bd9Sstevel@tonic-gate } 13467c478bd9Sstevel@tonic-gate 13477c478bd9Sstevel@tonic-gate void 13487c478bd9Sstevel@tonic-gate two_over(fcode_env_t *env) 13497c478bd9Sstevel@tonic-gate { 13507c478bd9Sstevel@tonic-gate fstack_t a, b; 13517c478bd9Sstevel@tonic-gate 13527c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 4, "2over"); 13537c478bd9Sstevel@tonic-gate a = DS[-3]; 13547c478bd9Sstevel@tonic-gate b = DS[-2]; 13557c478bd9Sstevel@tonic-gate PUSH(DS, a); 13567c478bd9Sstevel@tonic-gate PUSH(DS, b); 13577c478bd9Sstevel@tonic-gate } 13587c478bd9Sstevel@tonic-gate 13597c478bd9Sstevel@tonic-gate void 13607c478bd9Sstevel@tonic-gate two_swap(fcode_env_t *env) 13617c478bd9Sstevel@tonic-gate { 13627c478bd9Sstevel@tonic-gate fstack_t a, b; 13637c478bd9Sstevel@tonic-gate 13647c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 4, "2swap"); 13657c478bd9Sstevel@tonic-gate a = DS[-3]; 13667c478bd9Sstevel@tonic-gate b = DS[-2]; 13677c478bd9Sstevel@tonic-gate DS[-3] = DS[-1]; 13687c478bd9Sstevel@tonic-gate DS[-2] = TOS; 13697c478bd9Sstevel@tonic-gate DS[-1] = a; 13707c478bd9Sstevel@tonic-gate TOS = b; 13717c478bd9Sstevel@tonic-gate } 13727c478bd9Sstevel@tonic-gate 13737c478bd9Sstevel@tonic-gate void 13747c478bd9Sstevel@tonic-gate two_rot(fcode_env_t *env) 13757c478bd9Sstevel@tonic-gate { 13767c478bd9Sstevel@tonic-gate fstack_t a, b; 13777c478bd9Sstevel@tonic-gate 13787c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 6, "2rot"); 13797c478bd9Sstevel@tonic-gate a = DS[-5]; 13807c478bd9Sstevel@tonic-gate b = DS[-4]; 13817c478bd9Sstevel@tonic-gate DS[-5] = DS[-3]; 13827c478bd9Sstevel@tonic-gate DS[-4] = DS[-2]; 13837c478bd9Sstevel@tonic-gate DS[-3] = DS[-1]; 13847c478bd9Sstevel@tonic-gate DS[-2] = TOS; 13857c478bd9Sstevel@tonic-gate DS[-1] = a; 13867c478bd9Sstevel@tonic-gate TOS = b; 13877c478bd9Sstevel@tonic-gate } 13887c478bd9Sstevel@tonic-gate 13897c478bd9Sstevel@tonic-gate void 13907c478bd9Sstevel@tonic-gate two_slash(fcode_env_t *env) 13917c478bd9Sstevel@tonic-gate { 13927c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "2/"); 13937c478bd9Sstevel@tonic-gate TOS = TOS >> 1; 13947c478bd9Sstevel@tonic-gate } 13957c478bd9Sstevel@tonic-gate 13967c478bd9Sstevel@tonic-gate void 13977c478bd9Sstevel@tonic-gate utwo_slash(fcode_env_t *env) 13987c478bd9Sstevel@tonic-gate { 13997c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "u2/"); 14007c478bd9Sstevel@tonic-gate TOS = (ufstack_t)((ufstack_t)TOS) >> 1; 14017c478bd9Sstevel@tonic-gate } 14027c478bd9Sstevel@tonic-gate 14037c478bd9Sstevel@tonic-gate void 14047c478bd9Sstevel@tonic-gate two_times(fcode_env_t *env) 14057c478bd9Sstevel@tonic-gate { 14067c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "2*"); 14077c478bd9Sstevel@tonic-gate TOS = (ufstack_t)((ufstack_t)TOS) << 1; 14087c478bd9Sstevel@tonic-gate } 14097c478bd9Sstevel@tonic-gate 14107c478bd9Sstevel@tonic-gate void 14117c478bd9Sstevel@tonic-gate slash_c(fcode_env_t *env) 14127c478bd9Sstevel@tonic-gate { 14137c478bd9Sstevel@tonic-gate PUSH(DS, sizeof (char)); 14147c478bd9Sstevel@tonic-gate } 14157c478bd9Sstevel@tonic-gate 14167c478bd9Sstevel@tonic-gate void 14177c478bd9Sstevel@tonic-gate slash_w(fcode_env_t *env) 14187c478bd9Sstevel@tonic-gate { 14197c478bd9Sstevel@tonic-gate PUSH(DS, sizeof (wforth_t)); 14207c478bd9Sstevel@tonic-gate } 14217c478bd9Sstevel@tonic-gate 14227c478bd9Sstevel@tonic-gate void 14237c478bd9Sstevel@tonic-gate slash_l(fcode_env_t *env) 14247c478bd9Sstevel@tonic-gate { 14257c478bd9Sstevel@tonic-gate PUSH(DS, sizeof (lforth_t)); 14267c478bd9Sstevel@tonic-gate } 14277c478bd9Sstevel@tonic-gate 14287c478bd9Sstevel@tonic-gate void 14297c478bd9Sstevel@tonic-gate slash_n(fcode_env_t *env) 14307c478bd9Sstevel@tonic-gate { 14317c478bd9Sstevel@tonic-gate PUSH(DS, sizeof (fstack_t)); 14327c478bd9Sstevel@tonic-gate } 14337c478bd9Sstevel@tonic-gate 14347c478bd9Sstevel@tonic-gate void 14357c478bd9Sstevel@tonic-gate ca_plus(fcode_env_t *env) 14367c478bd9Sstevel@tonic-gate { 14377c478bd9Sstevel@tonic-gate fstack_t d; 14387c478bd9Sstevel@tonic-gate 14397c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "ca+"); 14407c478bd9Sstevel@tonic-gate d = POP(DS); 14417c478bd9Sstevel@tonic-gate TOS += d * sizeof (char); 14427c478bd9Sstevel@tonic-gate } 14437c478bd9Sstevel@tonic-gate 14447c478bd9Sstevel@tonic-gate void 14457c478bd9Sstevel@tonic-gate wa_plus(fcode_env_t *env) 14467c478bd9Sstevel@tonic-gate { 14477c478bd9Sstevel@tonic-gate fstack_t d; 14487c478bd9Sstevel@tonic-gate 14497c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "wa+"); 14507c478bd9Sstevel@tonic-gate d = POP(DS); 14517c478bd9Sstevel@tonic-gate TOS += d * sizeof (wforth_t); 14527c478bd9Sstevel@tonic-gate } 14537c478bd9Sstevel@tonic-gate 14547c478bd9Sstevel@tonic-gate void 14557c478bd9Sstevel@tonic-gate la_plus(fcode_env_t *env) 14567c478bd9Sstevel@tonic-gate { 14577c478bd9Sstevel@tonic-gate fstack_t d; 14587c478bd9Sstevel@tonic-gate 14597c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "la+"); 14607c478bd9Sstevel@tonic-gate d = POP(DS); 14617c478bd9Sstevel@tonic-gate TOS += d * sizeof (lforth_t); 14627c478bd9Sstevel@tonic-gate } 14637c478bd9Sstevel@tonic-gate 14647c478bd9Sstevel@tonic-gate void 14657c478bd9Sstevel@tonic-gate na_plus(fcode_env_t *env) 14667c478bd9Sstevel@tonic-gate { 14677c478bd9Sstevel@tonic-gate fstack_t d; 14687c478bd9Sstevel@tonic-gate 14697c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "na+"); 14707c478bd9Sstevel@tonic-gate d = POP(DS); 14717c478bd9Sstevel@tonic-gate TOS += d * sizeof (fstack_t); 14727c478bd9Sstevel@tonic-gate } 14737c478bd9Sstevel@tonic-gate 14747c478bd9Sstevel@tonic-gate void 14757c478bd9Sstevel@tonic-gate char_plus(fcode_env_t *env) 14767c478bd9Sstevel@tonic-gate { 14777c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "char+"); 14787c478bd9Sstevel@tonic-gate TOS += sizeof (char); 14797c478bd9Sstevel@tonic-gate } 14807c478bd9Sstevel@tonic-gate 14817c478bd9Sstevel@tonic-gate void 14827c478bd9Sstevel@tonic-gate wa1_plus(fcode_env_t *env) 14837c478bd9Sstevel@tonic-gate { 14847c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "wa1+"); 14857c478bd9Sstevel@tonic-gate TOS += sizeof (wforth_t); 14867c478bd9Sstevel@tonic-gate } 14877c478bd9Sstevel@tonic-gate 14887c478bd9Sstevel@tonic-gate void 14897c478bd9Sstevel@tonic-gate la1_plus(fcode_env_t *env) 14907c478bd9Sstevel@tonic-gate { 14917c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "la1+"); 14927c478bd9Sstevel@tonic-gate TOS += sizeof (lforth_t); 14937c478bd9Sstevel@tonic-gate } 14947c478bd9Sstevel@tonic-gate 14957c478bd9Sstevel@tonic-gate void 14967c478bd9Sstevel@tonic-gate cell_plus(fcode_env_t *env) 14977c478bd9Sstevel@tonic-gate { 14987c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "cell+"); 14997c478bd9Sstevel@tonic-gate TOS += sizeof (fstack_t); 15007c478bd9Sstevel@tonic-gate } 15017c478bd9Sstevel@tonic-gate 15027c478bd9Sstevel@tonic-gate void 15037c478bd9Sstevel@tonic-gate do_chars(fcode_env_t *env) 15047c478bd9Sstevel@tonic-gate { 15057c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "chars"); 15067c478bd9Sstevel@tonic-gate } 15077c478bd9Sstevel@tonic-gate 15087c478bd9Sstevel@tonic-gate void 15097c478bd9Sstevel@tonic-gate slash_w_times(fcode_env_t *env) 15107c478bd9Sstevel@tonic-gate { 15117c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "/w*"); 15127c478bd9Sstevel@tonic-gate TOS *= sizeof (wforth_t); 15137c478bd9Sstevel@tonic-gate } 15147c478bd9Sstevel@tonic-gate 15157c478bd9Sstevel@tonic-gate void 15167c478bd9Sstevel@tonic-gate slash_l_times(fcode_env_t *env) 15177c478bd9Sstevel@tonic-gate { 15187c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "/l*"); 15197c478bd9Sstevel@tonic-gate TOS *= sizeof (lforth_t); 15207c478bd9Sstevel@tonic-gate } 15217c478bd9Sstevel@tonic-gate 15227c478bd9Sstevel@tonic-gate void 15237c478bd9Sstevel@tonic-gate cells(fcode_env_t *env) 15247c478bd9Sstevel@tonic-gate { 15257c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "cells"); 15267c478bd9Sstevel@tonic-gate TOS *= sizeof (fstack_t); 15277c478bd9Sstevel@tonic-gate } 15287c478bd9Sstevel@tonic-gate 15297c478bd9Sstevel@tonic-gate void 15307c478bd9Sstevel@tonic-gate do_on(fcode_env_t *env) 15317c478bd9Sstevel@tonic-gate { 15327c478bd9Sstevel@tonic-gate variable_t *d; 15337c478bd9Sstevel@tonic-gate 15347c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "on"); 15357c478bd9Sstevel@tonic-gate d = (variable_t *)POP(DS); 15367c478bd9Sstevel@tonic-gate *d = -1; 15377c478bd9Sstevel@tonic-gate } 15387c478bd9Sstevel@tonic-gate 15397c478bd9Sstevel@tonic-gate void 15407c478bd9Sstevel@tonic-gate do_off(fcode_env_t *env) 15417c478bd9Sstevel@tonic-gate { 15427c478bd9Sstevel@tonic-gate variable_t *d; 15437c478bd9Sstevel@tonic-gate 15447c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "off"); 15457c478bd9Sstevel@tonic-gate d = (variable_t *)POP(DS); 15467c478bd9Sstevel@tonic-gate *d = 0; 15477c478bd9Sstevel@tonic-gate } 15487c478bd9Sstevel@tonic-gate 15497c478bd9Sstevel@tonic-gate void 15507c478bd9Sstevel@tonic-gate fetch(fcode_env_t *env) 15517c478bd9Sstevel@tonic-gate { 15527c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "@"); 15537c478bd9Sstevel@tonic-gate TOS = *((variable_t *)TOS); 15547c478bd9Sstevel@tonic-gate } 15557c478bd9Sstevel@tonic-gate 15567c478bd9Sstevel@tonic-gate void 15577c478bd9Sstevel@tonic-gate lfetch(fcode_env_t *env) 15587c478bd9Sstevel@tonic-gate { 15597c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "l@"); 15607c478bd9Sstevel@tonic-gate TOS = *((lforth_t *)TOS); 15617c478bd9Sstevel@tonic-gate } 15627c478bd9Sstevel@tonic-gate 15637c478bd9Sstevel@tonic-gate void 15647c478bd9Sstevel@tonic-gate wfetch(fcode_env_t *env) 15657c478bd9Sstevel@tonic-gate { 15667c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "w@"); 15677c478bd9Sstevel@tonic-gate TOS = *((wforth_t *)TOS); 15687c478bd9Sstevel@tonic-gate } 15697c478bd9Sstevel@tonic-gate 15707c478bd9Sstevel@tonic-gate void 15717c478bd9Sstevel@tonic-gate swfetch(fcode_env_t *env) 15727c478bd9Sstevel@tonic-gate { 15737c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "<w@"); 15747c478bd9Sstevel@tonic-gate TOS = *((s_wforth_t *)TOS); 15757c478bd9Sstevel@tonic-gate } 15767c478bd9Sstevel@tonic-gate 15777c478bd9Sstevel@tonic-gate void 15787c478bd9Sstevel@tonic-gate cfetch(fcode_env_t *env) 15797c478bd9Sstevel@tonic-gate { 15807c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "c@"); 15817c478bd9Sstevel@tonic-gate TOS = *((uchar_t *)TOS); 15827c478bd9Sstevel@tonic-gate } 15837c478bd9Sstevel@tonic-gate 15847c478bd9Sstevel@tonic-gate void 15857c478bd9Sstevel@tonic-gate store(fcode_env_t *env) 15867c478bd9Sstevel@tonic-gate { 15877c478bd9Sstevel@tonic-gate variable_t *dptr; 15887c478bd9Sstevel@tonic-gate 15897c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "!"); 15907c478bd9Sstevel@tonic-gate dptr = (variable_t *)POP(DS); 15917c478bd9Sstevel@tonic-gate *dptr = POP(DS); 15927c478bd9Sstevel@tonic-gate } 15937c478bd9Sstevel@tonic-gate 15947c478bd9Sstevel@tonic-gate void 15957c478bd9Sstevel@tonic-gate addstore(fcode_env_t *env) 15967c478bd9Sstevel@tonic-gate { 15977c478bd9Sstevel@tonic-gate variable_t *dptr; 15987c478bd9Sstevel@tonic-gate 15997c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "+!"); 16007c478bd9Sstevel@tonic-gate dptr = (variable_t *)POP(DS); 16017c478bd9Sstevel@tonic-gate *dptr = POP(DS) + *dptr; 16027c478bd9Sstevel@tonic-gate } 16037c478bd9Sstevel@tonic-gate 16047c478bd9Sstevel@tonic-gate void 16057c478bd9Sstevel@tonic-gate lstore(fcode_env_t *env) 16067c478bd9Sstevel@tonic-gate { 16077c478bd9Sstevel@tonic-gate lforth_t *dptr; 16087c478bd9Sstevel@tonic-gate 16097c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "l!"); 16107c478bd9Sstevel@tonic-gate dptr = (lforth_t *)POP(DS); 16117c478bd9Sstevel@tonic-gate *dptr = (lforth_t)POP(DS); 16127c478bd9Sstevel@tonic-gate } 16137c478bd9Sstevel@tonic-gate 16147c478bd9Sstevel@tonic-gate void 16157c478bd9Sstevel@tonic-gate wstore(fcode_env_t *env) 16167c478bd9Sstevel@tonic-gate { 16177c478bd9Sstevel@tonic-gate wforth_t *dptr; 16187c478bd9Sstevel@tonic-gate 16197c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "w!"); 16207c478bd9Sstevel@tonic-gate dptr = (wforth_t *)POP(DS); 16217c478bd9Sstevel@tonic-gate *dptr = (wforth_t)POP(DS); 16227c478bd9Sstevel@tonic-gate } 16237c478bd9Sstevel@tonic-gate 16247c478bd9Sstevel@tonic-gate void 16257c478bd9Sstevel@tonic-gate cstore(fcode_env_t *env) 16267c478bd9Sstevel@tonic-gate { 16277c478bd9Sstevel@tonic-gate uchar_t *dptr; 16287c478bd9Sstevel@tonic-gate 16297c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "c!"); 16307c478bd9Sstevel@tonic-gate dptr = (uchar_t *)POP(DS); 16317c478bd9Sstevel@tonic-gate *dptr = (uchar_t)POP(DS); 16327c478bd9Sstevel@tonic-gate } 16337c478bd9Sstevel@tonic-gate 16347c478bd9Sstevel@tonic-gate void 16357c478bd9Sstevel@tonic-gate two_fetch(fcode_env_t *env) 16367c478bd9Sstevel@tonic-gate { 16377c478bd9Sstevel@tonic-gate variable_t *d; 16387c478bd9Sstevel@tonic-gate 16397c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "2@"); 16407c478bd9Sstevel@tonic-gate d = (variable_t *)POP(DS); 16417c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)(d + 1)); 16427c478bd9Sstevel@tonic-gate unaligned_fetch(env); 16437c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)d); 16447c478bd9Sstevel@tonic-gate unaligned_fetch(env); 16457c478bd9Sstevel@tonic-gate } 16467c478bd9Sstevel@tonic-gate 16477c478bd9Sstevel@tonic-gate void 16487c478bd9Sstevel@tonic-gate two_store(fcode_env_t *env) 16497c478bd9Sstevel@tonic-gate { 16507c478bd9Sstevel@tonic-gate variable_t *d; 16517c478bd9Sstevel@tonic-gate 16527c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "2!"); 16537c478bd9Sstevel@tonic-gate d = (variable_t *)POP(DS); 16547c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)d); 16557c478bd9Sstevel@tonic-gate unaligned_store(env); 16567c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)(d + 1)); 16577c478bd9Sstevel@tonic-gate unaligned_store(env); 16587c478bd9Sstevel@tonic-gate } 16597c478bd9Sstevel@tonic-gate 16607c478bd9Sstevel@tonic-gate /* 16617c478bd9Sstevel@tonic-gate * 'move' Fcode reimplemented in fcdriver to check for mapped addresses. 16627c478bd9Sstevel@tonic-gate */ 16637c478bd9Sstevel@tonic-gate void 16647c478bd9Sstevel@tonic-gate fc_move(fcode_env_t *env) 16657c478bd9Sstevel@tonic-gate { 16667c478bd9Sstevel@tonic-gate void *dest, *src; 16677c478bd9Sstevel@tonic-gate size_t len; 16687c478bd9Sstevel@tonic-gate 16697c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "move"); 16707c478bd9Sstevel@tonic-gate len = (size_t)POP(DS); 16717c478bd9Sstevel@tonic-gate dest = (void *)POP(DS); 16727c478bd9Sstevel@tonic-gate src = (void *)POP(DS); 16737c478bd9Sstevel@tonic-gate 16747c478bd9Sstevel@tonic-gate memmove(dest, src, len); 16757c478bd9Sstevel@tonic-gate } 16767c478bd9Sstevel@tonic-gate 16777c478bd9Sstevel@tonic-gate void 16787c478bd9Sstevel@tonic-gate fc_fill(fcode_env_t *env) 16797c478bd9Sstevel@tonic-gate { 16807c478bd9Sstevel@tonic-gate void *dest; 16817c478bd9Sstevel@tonic-gate uchar_t val; 16827c478bd9Sstevel@tonic-gate size_t len; 16837c478bd9Sstevel@tonic-gate 16847c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "fill"); 16857c478bd9Sstevel@tonic-gate val = (uchar_t)POP(DS); 16867c478bd9Sstevel@tonic-gate len = (size_t)POP(DS); 16877c478bd9Sstevel@tonic-gate dest = (void *)POP(DS); 16887c478bd9Sstevel@tonic-gate memset(dest, val, len); 16897c478bd9Sstevel@tonic-gate } 16907c478bd9Sstevel@tonic-gate 16917c478bd9Sstevel@tonic-gate void 16927c478bd9Sstevel@tonic-gate fc_comp(fcode_env_t *env) 16937c478bd9Sstevel@tonic-gate { 16947c478bd9Sstevel@tonic-gate char *str1, *str2; 16957c478bd9Sstevel@tonic-gate size_t len; 16967c478bd9Sstevel@tonic-gate int res; 16977c478bd9Sstevel@tonic-gate 16987c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "comp"); 16997c478bd9Sstevel@tonic-gate len = (size_t)POP(DS); 17007c478bd9Sstevel@tonic-gate str1 = (char *)POP(DS); 17017c478bd9Sstevel@tonic-gate str2 = (char *)POP(DS); 17027c478bd9Sstevel@tonic-gate res = memcmp(str2, str1, len); 17037c478bd9Sstevel@tonic-gate if (res > 0) 17047c478bd9Sstevel@tonic-gate res = 1; 17057c478bd9Sstevel@tonic-gate else if (res < 0) 17067c478bd9Sstevel@tonic-gate res = -1; 17077c478bd9Sstevel@tonic-gate PUSH(DS, res); 17087c478bd9Sstevel@tonic-gate } 17097c478bd9Sstevel@tonic-gate 17107c478bd9Sstevel@tonic-gate void 17117c478bd9Sstevel@tonic-gate set_temporary_compile(fcode_env_t *env) 17127c478bd9Sstevel@tonic-gate { 17137c478bd9Sstevel@tonic-gate if (!env->state) { 17147c478bd9Sstevel@tonic-gate token_roundup(env, "set_temporary_compile"); 17157c478bd9Sstevel@tonic-gate PUSH(RS, (fstack_t)HERE); 17167c478bd9Sstevel@tonic-gate env->state = 3; 17177c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_colon); 17187c478bd9Sstevel@tonic-gate } 17197c478bd9Sstevel@tonic-gate } 17207c478bd9Sstevel@tonic-gate 17217c478bd9Sstevel@tonic-gate void 17227c478bd9Sstevel@tonic-gate bmark(fcode_env_t *env) 17237c478bd9Sstevel@tonic-gate { 17247c478bd9Sstevel@tonic-gate set_temporary_compile(env); 17257c478bd9Sstevel@tonic-gate env->level++; 17267c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)HERE); 17277c478bd9Sstevel@tonic-gate } 17287c478bd9Sstevel@tonic-gate 17297c478bd9Sstevel@tonic-gate void 17307c478bd9Sstevel@tonic-gate temporary_execute(fcode_env_t *env) 17317c478bd9Sstevel@tonic-gate { 17327c478bd9Sstevel@tonic-gate uchar_t *saved_here; 17337c478bd9Sstevel@tonic-gate 17347c478bd9Sstevel@tonic-gate if ((env->level == 0) && (env->state & 2)) { 17357c478bd9Sstevel@tonic-gate fstack_t d = POP(RS); 17367c478bd9Sstevel@tonic-gate 17377c478bd9Sstevel@tonic-gate semi(env); 17387c478bd9Sstevel@tonic-gate 17397c478bd9Sstevel@tonic-gate saved_here = HERE; 17407c478bd9Sstevel@tonic-gate /* execute the temporary definition */ 17417c478bd9Sstevel@tonic-gate env->state &= ~2; 17427c478bd9Sstevel@tonic-gate PUSH(DS, d); 17437c478bd9Sstevel@tonic-gate execute(env); 17447c478bd9Sstevel@tonic-gate 17457c478bd9Sstevel@tonic-gate /* now wind the dictionary back! */ 17467c478bd9Sstevel@tonic-gate if (saved_here != HERE) { 17477c478bd9Sstevel@tonic-gate debug_msg(DEBUG_COMMA, "Ignoring set_here in" 17487c478bd9Sstevel@tonic-gate " temporary_execute\n"); 17497c478bd9Sstevel@tonic-gate } else 17507c478bd9Sstevel@tonic-gate set_here(env, (uchar_t *)d, "temporary_execute"); 17517c478bd9Sstevel@tonic-gate } 17527c478bd9Sstevel@tonic-gate } 17537c478bd9Sstevel@tonic-gate 17547c478bd9Sstevel@tonic-gate void 17557c478bd9Sstevel@tonic-gate bresolve(fcode_env_t *env) 17567c478bd9Sstevel@tonic-gate { 17577c478bd9Sstevel@tonic-gate token_t *prev = (token_t *)POP(DS); 17587c478bd9Sstevel@tonic-gate 17597c478bd9Sstevel@tonic-gate env->level--; 17607c478bd9Sstevel@tonic-gate *prev = (token_t)HERE; 17617c478bd9Sstevel@tonic-gate temporary_execute(env); 17627c478bd9Sstevel@tonic-gate } 17637c478bd9Sstevel@tonic-gate 17647c478bd9Sstevel@tonic-gate #define BRANCH_IP(ipp) ((token_t *)(*((token_t *)(ipp)))) 17657c478bd9Sstevel@tonic-gate 17667c478bd9Sstevel@tonic-gate void 17677c478bd9Sstevel@tonic-gate do_bbranch(fcode_env_t *env) 17687c478bd9Sstevel@tonic-gate { 17697c478bd9Sstevel@tonic-gate IP = BRANCH_IP(IP); 17707c478bd9Sstevel@tonic-gate } 17717c478bd9Sstevel@tonic-gate 17727c478bd9Sstevel@tonic-gate void 17737c478bd9Sstevel@tonic-gate do_bqbranch(fcode_env_t *env) 17747c478bd9Sstevel@tonic-gate { 17757c478bd9Sstevel@tonic-gate fstack_t flag; 17767c478bd9Sstevel@tonic-gate 17777c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "b?branch"); 17787c478bd9Sstevel@tonic-gate flag = POP(DS); 17797c478bd9Sstevel@tonic-gate if (flag) { 17807c478bd9Sstevel@tonic-gate IP++; 17817c478bd9Sstevel@tonic-gate } else { 17827c478bd9Sstevel@tonic-gate IP = BRANCH_IP(IP); 17837c478bd9Sstevel@tonic-gate } 17847c478bd9Sstevel@tonic-gate } 17857c478bd9Sstevel@tonic-gate 17867c478bd9Sstevel@tonic-gate void 17877c478bd9Sstevel@tonic-gate do_bofbranch(fcode_env_t *env) 17887c478bd9Sstevel@tonic-gate { 17897c478bd9Sstevel@tonic-gate fstack_t d; 17907c478bd9Sstevel@tonic-gate 17917c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "bofbranch"); 17927c478bd9Sstevel@tonic-gate d = POP(DS); 17937c478bd9Sstevel@tonic-gate if (d == TOS) { 17947c478bd9Sstevel@tonic-gate (void) POP(DS); 17957c478bd9Sstevel@tonic-gate IP++; 17967c478bd9Sstevel@tonic-gate } else { 17977c478bd9Sstevel@tonic-gate IP = BRANCH_IP(IP); 17987c478bd9Sstevel@tonic-gate } 17997c478bd9Sstevel@tonic-gate } 18007c478bd9Sstevel@tonic-gate 18017c478bd9Sstevel@tonic-gate void 18027c478bd9Sstevel@tonic-gate do_bleave(fcode_env_t *env) 18037c478bd9Sstevel@tonic-gate { 18047c478bd9Sstevel@tonic-gate CHECK_RETURN_DEPTH(env, 3, "do_bleave"); 18057c478bd9Sstevel@tonic-gate (void) POP(RS); 18067c478bd9Sstevel@tonic-gate (void) POP(RS); 18077c478bd9Sstevel@tonic-gate IP = (token_t *)POP(RS); 18087c478bd9Sstevel@tonic-gate } 18097c478bd9Sstevel@tonic-gate 18107c478bd9Sstevel@tonic-gate void 18117c478bd9Sstevel@tonic-gate loop_inc(fcode_env_t *env, fstack_t inc) 18127c478bd9Sstevel@tonic-gate { 18137c478bd9Sstevel@tonic-gate ufstack_t a; 18147c478bd9Sstevel@tonic-gate 18157c478bd9Sstevel@tonic-gate CHECK_RETURN_DEPTH(env, 2, "loop_inc"); 18167c478bd9Sstevel@tonic-gate 18177c478bd9Sstevel@tonic-gate /* 18187c478bd9Sstevel@tonic-gate * Note: end condition is when the sign bit of R[0] changes. 18197c478bd9Sstevel@tonic-gate */ 18207c478bd9Sstevel@tonic-gate a = RS[0]; 18217c478bd9Sstevel@tonic-gate RS[0] += inc; 18227c478bd9Sstevel@tonic-gate if (((a ^ RS[0]) & SIGN_BIT) == 0) { 18237c478bd9Sstevel@tonic-gate IP = BRANCH_IP(IP); 18247c478bd9Sstevel@tonic-gate } else { 18257c478bd9Sstevel@tonic-gate do_bleave(env); 18267c478bd9Sstevel@tonic-gate } 18277c478bd9Sstevel@tonic-gate } 18287c478bd9Sstevel@tonic-gate 18297c478bd9Sstevel@tonic-gate void 18307c478bd9Sstevel@tonic-gate do_bloop(fcode_env_t *env) 18317c478bd9Sstevel@tonic-gate { 18327c478bd9Sstevel@tonic-gate loop_inc(env, 1); 18337c478bd9Sstevel@tonic-gate } 18347c478bd9Sstevel@tonic-gate 18357c478bd9Sstevel@tonic-gate void 18367c478bd9Sstevel@tonic-gate do_bploop(fcode_env_t *env) 18377c478bd9Sstevel@tonic-gate { 18387c478bd9Sstevel@tonic-gate fstack_t d; 18397c478bd9Sstevel@tonic-gate 18407c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "+loop"); 18417c478bd9Sstevel@tonic-gate d = POP(DS); 18427c478bd9Sstevel@tonic-gate loop_inc(env, d); 18437c478bd9Sstevel@tonic-gate } 18447c478bd9Sstevel@tonic-gate 18457c478bd9Sstevel@tonic-gate void 18467c478bd9Sstevel@tonic-gate loop_common(fcode_env_t *env, fstack_t ptr) 18477c478bd9Sstevel@tonic-gate { 18487c478bd9Sstevel@tonic-gate short offset = get_short(env); 18497c478bd9Sstevel@tonic-gate 18507c478bd9Sstevel@tonic-gate COMPILE_TOKEN(ptr); 18517c478bd9Sstevel@tonic-gate env->level--; 18527c478bd9Sstevel@tonic-gate compile_comma(env); 18537c478bd9Sstevel@tonic-gate bresolve(env); 18547c478bd9Sstevel@tonic-gate } 18557c478bd9Sstevel@tonic-gate 18567c478bd9Sstevel@tonic-gate void 18577c478bd9Sstevel@tonic-gate bloop(fcode_env_t *env) 18587c478bd9Sstevel@tonic-gate { 18597c478bd9Sstevel@tonic-gate loop_common(env, (fstack_t)&do_loop_ptr); 18607c478bd9Sstevel@tonic-gate } 18617c478bd9Sstevel@tonic-gate 18627c478bd9Sstevel@tonic-gate void 18637c478bd9Sstevel@tonic-gate bplusloop(fcode_env_t *env) 18647c478bd9Sstevel@tonic-gate { 18657c478bd9Sstevel@tonic-gate loop_common(env, (fstack_t)&do_ploop_ptr); 18667c478bd9Sstevel@tonic-gate } 18677c478bd9Sstevel@tonic-gate 18687c478bd9Sstevel@tonic-gate void 18697c478bd9Sstevel@tonic-gate common_do(fcode_env_t *env, fstack_t endpt, fstack_t start, fstack_t limit) 18707c478bd9Sstevel@tonic-gate { 18717c478bd9Sstevel@tonic-gate ufstack_t i, l; 18727c478bd9Sstevel@tonic-gate 18737c478bd9Sstevel@tonic-gate /* 18747c478bd9Sstevel@tonic-gate * Same computation as OBP, sets up so that loop_inc will terminate 18757c478bd9Sstevel@tonic-gate * when the sign bit of RS[0] changes. 18767c478bd9Sstevel@tonic-gate */ 18777c478bd9Sstevel@tonic-gate i = (start - limit) - SIGN_BIT; 18787c478bd9Sstevel@tonic-gate l = limit + SIGN_BIT; 18797c478bd9Sstevel@tonic-gate PUSH(RS, endpt); 18807c478bd9Sstevel@tonic-gate PUSH(RS, l); 18817c478bd9Sstevel@tonic-gate PUSH(RS, i); 18827c478bd9Sstevel@tonic-gate } 18837c478bd9Sstevel@tonic-gate 18847c478bd9Sstevel@tonic-gate void 18857c478bd9Sstevel@tonic-gate do_bdo(fcode_env_t *env) 18867c478bd9Sstevel@tonic-gate { 18877c478bd9Sstevel@tonic-gate fstack_t lo, hi; 18887c478bd9Sstevel@tonic-gate fstack_t endpt; 18897c478bd9Sstevel@tonic-gate 18907c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "bdo"); 18917c478bd9Sstevel@tonic-gate endpt = (fstack_t)BRANCH_IP(IP); 18927c478bd9Sstevel@tonic-gate IP++; 18937c478bd9Sstevel@tonic-gate lo = POP(DS); 18947c478bd9Sstevel@tonic-gate hi = POP(DS); 18957c478bd9Sstevel@tonic-gate common_do(env, endpt, lo, hi); 18967c478bd9Sstevel@tonic-gate } 18977c478bd9Sstevel@tonic-gate 18987c478bd9Sstevel@tonic-gate void 18997c478bd9Sstevel@tonic-gate do_bqdo(fcode_env_t *env) 19007c478bd9Sstevel@tonic-gate { 19017c478bd9Sstevel@tonic-gate fstack_t lo, hi; 19027c478bd9Sstevel@tonic-gate fstack_t endpt; 19037c478bd9Sstevel@tonic-gate 19047c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "b?do"); 19057c478bd9Sstevel@tonic-gate endpt = (fstack_t)BRANCH_IP(IP); 19067c478bd9Sstevel@tonic-gate IP++; 19077c478bd9Sstevel@tonic-gate lo = POP(DS); 19087c478bd9Sstevel@tonic-gate hi = POP(DS); 19097c478bd9Sstevel@tonic-gate if (lo == hi) { 19107c478bd9Sstevel@tonic-gate IP = (token_t *)endpt; 19117c478bd9Sstevel@tonic-gate } else { 19127c478bd9Sstevel@tonic-gate common_do(env, endpt, lo, hi); 19137c478bd9Sstevel@tonic-gate } 19147c478bd9Sstevel@tonic-gate } 19157c478bd9Sstevel@tonic-gate 19167c478bd9Sstevel@tonic-gate void 19177c478bd9Sstevel@tonic-gate compile_do_common(fcode_env_t *env, fstack_t ptr) 19187c478bd9Sstevel@tonic-gate { 19197c478bd9Sstevel@tonic-gate set_temporary_compile(env); 19207c478bd9Sstevel@tonic-gate COMPILE_TOKEN(ptr); 19217c478bd9Sstevel@tonic-gate bmark(env); 19227c478bd9Sstevel@tonic-gate COMPILE_TOKEN(0); 19237c478bd9Sstevel@tonic-gate bmark(env); 19247c478bd9Sstevel@tonic-gate } 19257c478bd9Sstevel@tonic-gate 19267c478bd9Sstevel@tonic-gate void 19277c478bd9Sstevel@tonic-gate bdo(fcode_env_t *env) 19287c478bd9Sstevel@tonic-gate { 19297c478bd9Sstevel@tonic-gate short offset = (short)get_short(env); 19307c478bd9Sstevel@tonic-gate compile_do_common(env, (fstack_t)&do_bdo_ptr); 19317c478bd9Sstevel@tonic-gate } 19327c478bd9Sstevel@tonic-gate 19337c478bd9Sstevel@tonic-gate void 19347c478bd9Sstevel@tonic-gate bqdo(fcode_env_t *env) 19357c478bd9Sstevel@tonic-gate { 19367c478bd9Sstevel@tonic-gate short offset = (short)get_short(env); 19377c478bd9Sstevel@tonic-gate compile_do_common(env, (fstack_t)&do_bqdo_ptr); 19387c478bd9Sstevel@tonic-gate } 19397c478bd9Sstevel@tonic-gate 19407c478bd9Sstevel@tonic-gate void 19417c478bd9Sstevel@tonic-gate loop_i(fcode_env_t *env) 19427c478bd9Sstevel@tonic-gate { 19437c478bd9Sstevel@tonic-gate fstack_t i; 19447c478bd9Sstevel@tonic-gate 19457c478bd9Sstevel@tonic-gate CHECK_RETURN_DEPTH(env, 2, "i"); 19467c478bd9Sstevel@tonic-gate i = RS[0] + RS[-1]; 19477c478bd9Sstevel@tonic-gate PUSH(DS, i); 19487c478bd9Sstevel@tonic-gate } 19497c478bd9Sstevel@tonic-gate 19507c478bd9Sstevel@tonic-gate void 19517c478bd9Sstevel@tonic-gate loop_j(fcode_env_t *env) 19527c478bd9Sstevel@tonic-gate { 19537c478bd9Sstevel@tonic-gate fstack_t j; 19547c478bd9Sstevel@tonic-gate 19557c478bd9Sstevel@tonic-gate CHECK_RETURN_DEPTH(env, 5, "j"); 19567c478bd9Sstevel@tonic-gate j = RS[-3] + RS[-4]; 19577c478bd9Sstevel@tonic-gate PUSH(DS, j); 19587c478bd9Sstevel@tonic-gate } 19597c478bd9Sstevel@tonic-gate 19607c478bd9Sstevel@tonic-gate void 19617c478bd9Sstevel@tonic-gate bleave(fcode_env_t *env) 19627c478bd9Sstevel@tonic-gate { 19637c478bd9Sstevel@tonic-gate 19647c478bd9Sstevel@tonic-gate if (env->state) { 19657c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_leave_ptr); 19667c478bd9Sstevel@tonic-gate } 19677c478bd9Sstevel@tonic-gate } 19687c478bd9Sstevel@tonic-gate 19697c478bd9Sstevel@tonic-gate void 19707c478bd9Sstevel@tonic-gate push_string(fcode_env_t *env, char *str, int len) 19717c478bd9Sstevel@tonic-gate { 19727c478bd9Sstevel@tonic-gate #define NSTRINGS 16 19737c478bd9Sstevel@tonic-gate static int string_count = 0; 19747c478bd9Sstevel@tonic-gate static int buflen[NSTRINGS]; 19757c478bd9Sstevel@tonic-gate static char *buffer[NSTRINGS]; 19767c478bd9Sstevel@tonic-gate char *dest; 19777c478bd9Sstevel@tonic-gate 19787c478bd9Sstevel@tonic-gate if (!len) { 19797c478bd9Sstevel@tonic-gate PUSH(DS, 0); 19807c478bd9Sstevel@tonic-gate PUSH(DS, 0); 19817c478bd9Sstevel@tonic-gate return; 19827c478bd9Sstevel@tonic-gate } 19837c478bd9Sstevel@tonic-gate if (len != buflen[string_count]) { 19847c478bd9Sstevel@tonic-gate if (buffer[string_count]) FREE(buffer[string_count]); 19857c478bd9Sstevel@tonic-gate buffer[ string_count ] = (char *)MALLOC(len+1); 19867c478bd9Sstevel@tonic-gate buflen[ string_count ] = len; 19877c478bd9Sstevel@tonic-gate } 19887c478bd9Sstevel@tonic-gate dest = buffer[ string_count++ ]; 19897c478bd9Sstevel@tonic-gate string_count = string_count%NSTRINGS; 19907c478bd9Sstevel@tonic-gate memcpy(dest, str, len); 19917c478bd9Sstevel@tonic-gate *(dest+len) = 0; 19927c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)dest); 19937c478bd9Sstevel@tonic-gate PUSH(DS, len); 19947c478bd9Sstevel@tonic-gate #undef NSTRINGS 19957c478bd9Sstevel@tonic-gate } 19967c478bd9Sstevel@tonic-gate 19977c478bd9Sstevel@tonic-gate void 19987c478bd9Sstevel@tonic-gate parse_word(fcode_env_t *env) 19997c478bd9Sstevel@tonic-gate { 20007c478bd9Sstevel@tonic-gate int len = 0; 20017c478bd9Sstevel@tonic-gate char *next, *dest, *here = ""; 20027c478bd9Sstevel@tonic-gate 20037c478bd9Sstevel@tonic-gate if (env->input) { 20047c478bd9Sstevel@tonic-gate here = env->input->scanptr; 20057c478bd9Sstevel@tonic-gate while (*here == env->input->separator) here++; 20067c478bd9Sstevel@tonic-gate next = strchr(here, env->input->separator); 20077c478bd9Sstevel@tonic-gate if (next) { 20087c478bd9Sstevel@tonic-gate len = next - here; 20097c478bd9Sstevel@tonic-gate while (*next == env->input->separator) next++; 20107c478bd9Sstevel@tonic-gate } else { 20117c478bd9Sstevel@tonic-gate len = strlen(here); 20127c478bd9Sstevel@tonic-gate next = here + len; 20137c478bd9Sstevel@tonic-gate } 20147c478bd9Sstevel@tonic-gate env->input->scanptr = next; 20157c478bd9Sstevel@tonic-gate } 20167c478bd9Sstevel@tonic-gate push_string(env, here, len); 20177c478bd9Sstevel@tonic-gate } 20187c478bd9Sstevel@tonic-gate 20197c478bd9Sstevel@tonic-gate void 20207c478bd9Sstevel@tonic-gate install_does(fcode_env_t *env) 20217c478bd9Sstevel@tonic-gate { 20227c478bd9Sstevel@tonic-gate token_t *dptr; 20237c478bd9Sstevel@tonic-gate 20247c478bd9Sstevel@tonic-gate dptr = (token_t *)LINK_TO_ACF(env->lastlink); 20257c478bd9Sstevel@tonic-gate 20267c478bd9Sstevel@tonic-gate log_message(MSG_WARN, "install_does: Last acf at: %p\n", (void *)dptr); 20277c478bd9Sstevel@tonic-gate 20287c478bd9Sstevel@tonic-gate *dptr = ((token_t)(IP+1)) | 1; 20297c478bd9Sstevel@tonic-gate } 20307c478bd9Sstevel@tonic-gate 20317c478bd9Sstevel@tonic-gate void 20327c478bd9Sstevel@tonic-gate does(fcode_env_t *env) 20337c478bd9Sstevel@tonic-gate { 20347c478bd9Sstevel@tonic-gate token_t *dptr; 20357c478bd9Sstevel@tonic-gate 20367c478bd9Sstevel@tonic-gate token_roundup(env, "does"); 20377c478bd9Sstevel@tonic-gate 20387c478bd9Sstevel@tonic-gate if (env->state) { 20397c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&does_ptr); 20407c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&semi_ptr); 20417c478bd9Sstevel@tonic-gate } else { 20427c478bd9Sstevel@tonic-gate dptr = (token_t *)LINK_TO_ACF(env->lastlink); 20437c478bd9Sstevel@tonic-gate log_message(MSG_WARN, "does: Last acf at: %p\n", (void *)dptr); 20447c478bd9Sstevel@tonic-gate *dptr = ((token_t)(HERE)) | 1; 20457c478bd9Sstevel@tonic-gate env->state |= 1; 20467c478bd9Sstevel@tonic-gate } 20477c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_colon); 20487c478bd9Sstevel@tonic-gate } 20497c478bd9Sstevel@tonic-gate 20507c478bd9Sstevel@tonic-gate void 20517c478bd9Sstevel@tonic-gate do_current(fcode_env_t *env) 20527c478bd9Sstevel@tonic-gate { 20537c478bd9Sstevel@tonic-gate debug_msg(DEBUG_CONTEXT, "CONTEXT:pushing &CURRENT\n"); 20547c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)&env->current); 20557c478bd9Sstevel@tonic-gate } 20567c478bd9Sstevel@tonic-gate 20577c478bd9Sstevel@tonic-gate void 20587c478bd9Sstevel@tonic-gate do_context(fcode_env_t *env) 20597c478bd9Sstevel@tonic-gate { 20607c478bd9Sstevel@tonic-gate debug_msg(DEBUG_CONTEXT, "CONTEXT:pushing &CONTEXT\n"); 20617c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)&CONTEXT); 20627c478bd9Sstevel@tonic-gate } 20637c478bd9Sstevel@tonic-gate 20647c478bd9Sstevel@tonic-gate void 20657c478bd9Sstevel@tonic-gate do_definitions(fcode_env_t *env) 20667c478bd9Sstevel@tonic-gate { 20677c478bd9Sstevel@tonic-gate env->current = CONTEXT; 20687c478bd9Sstevel@tonic-gate debug_msg(DEBUG_CONTEXT, "CONTEXT:definitions: %d/%p/%p\n", 20697c478bd9Sstevel@tonic-gate env->order_depth, CONTEXT, env->current); 20707c478bd9Sstevel@tonic-gate } 20717c478bd9Sstevel@tonic-gate 20727c478bd9Sstevel@tonic-gate void 20737c478bd9Sstevel@tonic-gate make_header(fcode_env_t *env, int flags) 20747c478bd9Sstevel@tonic-gate { 20757c478bd9Sstevel@tonic-gate int len; 20767c478bd9Sstevel@tonic-gate char *name; 20777c478bd9Sstevel@tonic-gate 20787c478bd9Sstevel@tonic-gate name = parse_a_string(env, &len); 20797c478bd9Sstevel@tonic-gate header(env, name, len, flags); 20807c478bd9Sstevel@tonic-gate } 20817c478bd9Sstevel@tonic-gate 20827c478bd9Sstevel@tonic-gate void 20837c478bd9Sstevel@tonic-gate do_creator(fcode_env_t *env) 20847c478bd9Sstevel@tonic-gate { 20857c478bd9Sstevel@tonic-gate make_header(env, 0); 20867c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_create); 20877c478bd9Sstevel@tonic-gate expose_acf(env, "<create>"); 20887c478bd9Sstevel@tonic-gate } 20897c478bd9Sstevel@tonic-gate 20907c478bd9Sstevel@tonic-gate void 20917c478bd9Sstevel@tonic-gate create(fcode_env_t *env) 20927c478bd9Sstevel@tonic-gate { 20937c478bd9Sstevel@tonic-gate if (env->state) { 20947c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&create_ptr); 20957c478bd9Sstevel@tonic-gate } else 20967c478bd9Sstevel@tonic-gate do_creator(env); 20977c478bd9Sstevel@tonic-gate } 20987c478bd9Sstevel@tonic-gate 20997c478bd9Sstevel@tonic-gate void 21007c478bd9Sstevel@tonic-gate colon(fcode_env_t *env) 21017c478bd9Sstevel@tonic-gate { 21027c478bd9Sstevel@tonic-gate make_header(env, 0); 21037c478bd9Sstevel@tonic-gate env->state |= 1; 21047c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_colon); 21057c478bd9Sstevel@tonic-gate } 21067c478bd9Sstevel@tonic-gate 21077c478bd9Sstevel@tonic-gate void 21087c478bd9Sstevel@tonic-gate recursive(fcode_env_t *env) 21097c478bd9Sstevel@tonic-gate { 21107c478bd9Sstevel@tonic-gate expose_acf(env, "<recursive>"); 21117c478bd9Sstevel@tonic-gate } 21127c478bd9Sstevel@tonic-gate 21137c478bd9Sstevel@tonic-gate void 21147c478bd9Sstevel@tonic-gate compile_string(fcode_env_t *env) 21157c478bd9Sstevel@tonic-gate { 21167c478bd9Sstevel@tonic-gate int len; 21177c478bd9Sstevel@tonic-gate uchar_t *str, *tostr; 21187c478bd9Sstevel@tonic-gate 21197c478bd9Sstevel@tonic-gate COMPILE_TOKEN("e_ptr); 21207c478bd9Sstevel@tonic-gate len = POP(DS); 21217c478bd9Sstevel@tonic-gate str = (uchar_t *)POP(DS); 21227c478bd9Sstevel@tonic-gate tostr = HERE; 21237c478bd9Sstevel@tonic-gate *tostr++ = len; 21247c478bd9Sstevel@tonic-gate while (len--) 21257c478bd9Sstevel@tonic-gate *tostr++ = *str++; 21267c478bd9Sstevel@tonic-gate *tostr++ = '\0'; 21277c478bd9Sstevel@tonic-gate set_here(env, tostr, "compile_string"); 21287c478bd9Sstevel@tonic-gate token_roundup(env, "compile_string"); 21297c478bd9Sstevel@tonic-gate } 21307c478bd9Sstevel@tonic-gate 21317c478bd9Sstevel@tonic-gate void 21327c478bd9Sstevel@tonic-gate run_quote(fcode_env_t *env) 21337c478bd9Sstevel@tonic-gate { 21347c478bd9Sstevel@tonic-gate char osep; 21357c478bd9Sstevel@tonic-gate 21367c478bd9Sstevel@tonic-gate osep = env->input->separator; 21377c478bd9Sstevel@tonic-gate env->input->separator = '"'; 21387c478bd9Sstevel@tonic-gate parse_word(env); 21397c478bd9Sstevel@tonic-gate env->input->separator = osep; 21407c478bd9Sstevel@tonic-gate 21417c478bd9Sstevel@tonic-gate if (env->state) { 21427c478bd9Sstevel@tonic-gate compile_string(env); 21437c478bd9Sstevel@tonic-gate } 21447c478bd9Sstevel@tonic-gate } 21457c478bd9Sstevel@tonic-gate 21467c478bd9Sstevel@tonic-gate void 21477c478bd9Sstevel@tonic-gate does_vocabulary(fcode_env_t *env) 21487c478bd9Sstevel@tonic-gate { 21497c478bd9Sstevel@tonic-gate CONTEXT = WA; 21507c478bd9Sstevel@tonic-gate debug_msg(DEBUG_CONTEXT, "CONTEXT:vocabulary: %d/%p/%p\n", 21517c478bd9Sstevel@tonic-gate env->order_depth, CONTEXT, env->current); 21527c478bd9Sstevel@tonic-gate } 21537c478bd9Sstevel@tonic-gate 21547c478bd9Sstevel@tonic-gate void 21557c478bd9Sstevel@tonic-gate do_vocab(fcode_env_t *env) 21567c478bd9Sstevel@tonic-gate { 21577c478bd9Sstevel@tonic-gate make_header(env, 0); 21587c478bd9Sstevel@tonic-gate COMPILE_TOKEN(does_vocabulary); 21597c478bd9Sstevel@tonic-gate PUSH(DS, 0); 21607c478bd9Sstevel@tonic-gate compile_comma(env); 21617c478bd9Sstevel@tonic-gate expose_acf(env, "<vocabulary>"); 21627c478bd9Sstevel@tonic-gate } 21637c478bd9Sstevel@tonic-gate 21647c478bd9Sstevel@tonic-gate void 21657c478bd9Sstevel@tonic-gate do_forth(fcode_env_t *env) 21667c478bd9Sstevel@tonic-gate { 21677c478bd9Sstevel@tonic-gate CONTEXT = (token_t *)(&env->forth_voc_link); 21687c478bd9Sstevel@tonic-gate debug_msg(DEBUG_CONTEXT, "CONTEXT:forth: %d/%p/%p\n", 21697c478bd9Sstevel@tonic-gate env->order_depth, CONTEXT, env->current); 21707c478bd9Sstevel@tonic-gate } 21717c478bd9Sstevel@tonic-gate 21727c478bd9Sstevel@tonic-gate acf_t 21737c478bd9Sstevel@tonic-gate voc_find(fcode_env_t *env) 21747c478bd9Sstevel@tonic-gate { 21757c478bd9Sstevel@tonic-gate token_t *voc; 21767c478bd9Sstevel@tonic-gate token_t *dptr; 21777c478bd9Sstevel@tonic-gate char *find_name, *name; 21787c478bd9Sstevel@tonic-gate 21797c478bd9Sstevel@tonic-gate voc = (token_t *)POP(DS); 21807c478bd9Sstevel@tonic-gate find_name = pop_a_string(env, NULL); 21817c478bd9Sstevel@tonic-gate 21827c478bd9Sstevel@tonic-gate for (dptr = (token_t *)(*voc); dptr; dptr = (token_t *)(*dptr)) { 21837c478bd9Sstevel@tonic-gate if ((name = get_name(dptr)) == NULL) 21847c478bd9Sstevel@tonic-gate continue; 21857c478bd9Sstevel@tonic-gate if (strcmp(find_name, name) == 0) { 21867c478bd9Sstevel@tonic-gate debug_msg(DEBUG_VOC_FIND, "%s -> %p\n", find_name, 21877c478bd9Sstevel@tonic-gate LINK_TO_ACF(dptr)); 21887c478bd9Sstevel@tonic-gate return (LINK_TO_ACF(dptr)); 21897c478bd9Sstevel@tonic-gate } 21907c478bd9Sstevel@tonic-gate } 21917c478bd9Sstevel@tonic-gate debug_msg(DEBUG_VOC_FIND, "%s not found\n", find_name); 21927c478bd9Sstevel@tonic-gate return (NULL); 21937c478bd9Sstevel@tonic-gate } 21947c478bd9Sstevel@tonic-gate 21957c478bd9Sstevel@tonic-gate void 21967c478bd9Sstevel@tonic-gate dollar_find(fcode_env_t *env) 21977c478bd9Sstevel@tonic-gate { 21987c478bd9Sstevel@tonic-gate acf_t acf = NULL; 21997c478bd9Sstevel@tonic-gate int i; 22007c478bd9Sstevel@tonic-gate 22017c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "$find"); 22027c478bd9Sstevel@tonic-gate for (i = env->order_depth; i >= 0 && env->order[i] && !acf; i--) { 22037c478bd9Sstevel@tonic-gate two_dup(env); 22047c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)env->order[i]); 22057c478bd9Sstevel@tonic-gate acf = voc_find(env); 22067c478bd9Sstevel@tonic-gate } 22077c478bd9Sstevel@tonic-gate if (acf) { 22087c478bd9Sstevel@tonic-gate two_drop(env); 22097c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)acf); 22107c478bd9Sstevel@tonic-gate PUSH(DS, TRUE); 22117c478bd9Sstevel@tonic-gate } else 22127c478bd9Sstevel@tonic-gate PUSH(DS, FALSE); 22137c478bd9Sstevel@tonic-gate } 22147c478bd9Sstevel@tonic-gate 22157c478bd9Sstevel@tonic-gate void 22167c478bd9Sstevel@tonic-gate interpret(fcode_env_t *env) 22177c478bd9Sstevel@tonic-gate { 22187c478bd9Sstevel@tonic-gate char *name; 22197c478bd9Sstevel@tonic-gate 22207c478bd9Sstevel@tonic-gate parse_word(env); 22217c478bd9Sstevel@tonic-gate while (TOS) { 22227c478bd9Sstevel@tonic-gate two_dup(env); 22237c478bd9Sstevel@tonic-gate dollar_find(env); 22247c478bd9Sstevel@tonic-gate if (TOS) { 22257c478bd9Sstevel@tonic-gate flag_t *flags; 22267c478bd9Sstevel@tonic-gate 22277c478bd9Sstevel@tonic-gate drop(env); 22287c478bd9Sstevel@tonic-gate nip(env); 22297c478bd9Sstevel@tonic-gate nip(env); 22307c478bd9Sstevel@tonic-gate flags = LINK_TO_FLAGS(ACF_TO_LINK(TOS)); 22317c478bd9Sstevel@tonic-gate 22327c478bd9Sstevel@tonic-gate if ((env->state) && 22337c478bd9Sstevel@tonic-gate ((*flags & IMMEDIATE) == 0)) { 22347c478bd9Sstevel@tonic-gate /* Compile in references */ 22357c478bd9Sstevel@tonic-gate compile_comma(env); 22367c478bd9Sstevel@tonic-gate } else { 22377c478bd9Sstevel@tonic-gate execute(env); 22387c478bd9Sstevel@tonic-gate } 22397c478bd9Sstevel@tonic-gate } else { 22407c478bd9Sstevel@tonic-gate int bad; 22417c478bd9Sstevel@tonic-gate drop(env); 22427c478bd9Sstevel@tonic-gate dollar_number(env); 22437c478bd9Sstevel@tonic-gate bad = POP(DS); 22447c478bd9Sstevel@tonic-gate if (bad) { 22457c478bd9Sstevel@tonic-gate two_dup(env); 22467c478bd9Sstevel@tonic-gate name = pop_a_string(env, NULL); 22477c478bd9Sstevel@tonic-gate log_message(MSG_INFO, "%s?\n", name); 22487c478bd9Sstevel@tonic-gate break; 22497c478bd9Sstevel@tonic-gate } else { 22507c478bd9Sstevel@tonic-gate nip(env); 22517c478bd9Sstevel@tonic-gate nip(env); 22527c478bd9Sstevel@tonic-gate literal(env); 22537c478bd9Sstevel@tonic-gate } 22547c478bd9Sstevel@tonic-gate } 22557c478bd9Sstevel@tonic-gate parse_word(env); 22567c478bd9Sstevel@tonic-gate } 22577c478bd9Sstevel@tonic-gate two_drop(env); 22587c478bd9Sstevel@tonic-gate } 22597c478bd9Sstevel@tonic-gate 22607c478bd9Sstevel@tonic-gate void 22617c478bd9Sstevel@tonic-gate evaluate(fcode_env_t *env) 22627c478bd9Sstevel@tonic-gate { 22637c478bd9Sstevel@tonic-gate input_typ *old_input = env->input; 22647c478bd9Sstevel@tonic-gate input_typ *eval_bufp = MALLOC(sizeof (input_typ)); 22657c478bd9Sstevel@tonic-gate 22667c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "evaluate"); 22677c478bd9Sstevel@tonic-gate eval_bufp->separator = ' '; 22687c478bd9Sstevel@tonic-gate eval_bufp->maxlen = POP(DS); 22697c478bd9Sstevel@tonic-gate eval_bufp->buffer = (char *)POP(DS); 22707c478bd9Sstevel@tonic-gate eval_bufp->scanptr = eval_bufp->buffer; 22717c478bd9Sstevel@tonic-gate env->input = eval_bufp; 22727c478bd9Sstevel@tonic-gate interpret(env); 22737c478bd9Sstevel@tonic-gate FREE(eval_bufp); 22747c478bd9Sstevel@tonic-gate env->input = old_input; 22757c478bd9Sstevel@tonic-gate } 22767c478bd9Sstevel@tonic-gate 22777c478bd9Sstevel@tonic-gate void 22787c478bd9Sstevel@tonic-gate make_common_access(fcode_env_t *env, 22797c478bd9Sstevel@tonic-gate char *name, int len, 22807c478bd9Sstevel@tonic-gate int ncells, 22817c478bd9Sstevel@tonic-gate int instance_mode, 22827c478bd9Sstevel@tonic-gate void (*acf_instance)(fcode_env_t *env), 22837c478bd9Sstevel@tonic-gate void (*acf_static)(fcode_env_t *env), 22847c478bd9Sstevel@tonic-gate void (*set_action)(fcode_env_t *env, int)) 22857c478bd9Sstevel@tonic-gate { 22867c478bd9Sstevel@tonic-gate if (instance_mode && !MYSELF) { 22877c478bd9Sstevel@tonic-gate system_message(env, "No instance context"); 22887c478bd9Sstevel@tonic-gate } 22897c478bd9Sstevel@tonic-gate 22907c478bd9Sstevel@tonic-gate debug_msg(DEBUG_ACTIONS, "make_common_access:%s '%s', %d\n", 22917c478bd9Sstevel@tonic-gate (instance_mode ? "instance" : ""), 22927c478bd9Sstevel@tonic-gate (name ? name : ""), ncells); 22937c478bd9Sstevel@tonic-gate 22947c478bd9Sstevel@tonic-gate if (len) 22957c478bd9Sstevel@tonic-gate header(env, name, len, 0); 22967c478bd9Sstevel@tonic-gate if (instance_mode) { 22977c478bd9Sstevel@tonic-gate token_t *dptr; 22987c478bd9Sstevel@tonic-gate int offset; 22997c478bd9Sstevel@tonic-gate 23007c478bd9Sstevel@tonic-gate COMPILE_TOKEN(acf_instance); 23017c478bd9Sstevel@tonic-gate dptr = alloc_instance_data(env, INIT_DATA, ncells, &offset); 23027c478bd9Sstevel@tonic-gate debug_msg(DEBUG_ACTIONS, "Data: %p, offset %d\n", (char *)dptr, 23037c478bd9Sstevel@tonic-gate offset); 23047c478bd9Sstevel@tonic-gate PUSH(DS, offset); 23057c478bd9Sstevel@tonic-gate compile_comma(env); 23067c478bd9Sstevel@tonic-gate while (ncells--) 23077c478bd9Sstevel@tonic-gate *dptr++ = MYSELF->data[INIT_DATA][offset++] = POP(DS); 23087c478bd9Sstevel@tonic-gate env->instance_mode = 0; 23097c478bd9Sstevel@tonic-gate } else { 23107c478bd9Sstevel@tonic-gate COMPILE_TOKEN(acf_static); 23117c478bd9Sstevel@tonic-gate while (ncells--) 23127c478bd9Sstevel@tonic-gate compile_comma(env); 23137c478bd9Sstevel@tonic-gate } 23147c478bd9Sstevel@tonic-gate expose_acf(env, name); 23157c478bd9Sstevel@tonic-gate if (set_action) 23167c478bd9Sstevel@tonic-gate set_action(env, instance_mode); 23177c478bd9Sstevel@tonic-gate } 23187c478bd9Sstevel@tonic-gate 23197c478bd9Sstevel@tonic-gate void 23207c478bd9Sstevel@tonic-gate do_constant(fcode_env_t *env) 23217c478bd9Sstevel@tonic-gate { 23227c478bd9Sstevel@tonic-gate PUSH(DS, (variable_t)(*WA)); 23237c478bd9Sstevel@tonic-gate } 23247c478bd9Sstevel@tonic-gate 23257c478bd9Sstevel@tonic-gate void 23267c478bd9Sstevel@tonic-gate do_crash(fcode_env_t *env) 23277c478bd9Sstevel@tonic-gate { 23287c478bd9Sstevel@tonic-gate forth_abort(env, "Unitialized defer"); 23297c478bd9Sstevel@tonic-gate } 23307c478bd9Sstevel@tonic-gate 23317c478bd9Sstevel@tonic-gate /* 23327c478bd9Sstevel@tonic-gate * 'behavior' Fcode retrieve execution behavior for a defer word. 23337c478bd9Sstevel@tonic-gate */ 23347c478bd9Sstevel@tonic-gate static void 23357c478bd9Sstevel@tonic-gate behavior(fcode_env_t *env) 23367c478bd9Sstevel@tonic-gate { 23377c478bd9Sstevel@tonic-gate acf_t defer_xt; 23387c478bd9Sstevel@tonic-gate token_t token; 23397c478bd9Sstevel@tonic-gate acf_t contents_xt; 23407c478bd9Sstevel@tonic-gate 23417c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "behavior"); 23427c478bd9Sstevel@tonic-gate defer_xt = (acf_t)POP(DS); 23437c478bd9Sstevel@tonic-gate token = *defer_xt; 23447c478bd9Sstevel@tonic-gate contents_xt = (token_t *)(token & ~1); 23457c478bd9Sstevel@tonic-gate if ((token & 1) == 0 || *contents_xt != (token_t)&do_default_action) 23467c478bd9Sstevel@tonic-gate forth_abort(env, "behavior: bad xt: %p indir: %x/%p\n", 23477c478bd9Sstevel@tonic-gate defer_xt, token & 1, *contents_xt); 23487c478bd9Sstevel@tonic-gate defer_xt++; 23497c478bd9Sstevel@tonic-gate PUSH(DS, *((variable_t *)defer_xt)); 23507c478bd9Sstevel@tonic-gate } 23517c478bd9Sstevel@tonic-gate 23527c478bd9Sstevel@tonic-gate void 23537c478bd9Sstevel@tonic-gate fc_abort(fcode_env_t *env, char *type) 23547c478bd9Sstevel@tonic-gate { 23557c478bd9Sstevel@tonic-gate forth_abort(env, "%s Fcode '%s' Executed", type, 23567c478bd9Sstevel@tonic-gate acf_to_name(env, WA - 1)); 23577c478bd9Sstevel@tonic-gate } 23587c478bd9Sstevel@tonic-gate 23597c478bd9Sstevel@tonic-gate void 23607c478bd9Sstevel@tonic-gate f_abort(fcode_env_t *env) 23617c478bd9Sstevel@tonic-gate { 23627c478bd9Sstevel@tonic-gate fc_abort(env, "Abort"); 23637c478bd9Sstevel@tonic-gate } 23647c478bd9Sstevel@tonic-gate 23657c478bd9Sstevel@tonic-gate /* 23667c478bd9Sstevel@tonic-gate * Fcodes chosen not to support. 23677c478bd9Sstevel@tonic-gate */ 23687c478bd9Sstevel@tonic-gate void 23697c478bd9Sstevel@tonic-gate fc_unimplemented(fcode_env_t *env) 23707c478bd9Sstevel@tonic-gate { 23717c478bd9Sstevel@tonic-gate fc_abort(env, "Unimplemented"); 23727c478bd9Sstevel@tonic-gate } 23737c478bd9Sstevel@tonic-gate 23747c478bd9Sstevel@tonic-gate /* 23757c478bd9Sstevel@tonic-gate * Fcodes that are Obsolete per P1275-1994. 23767c478bd9Sstevel@tonic-gate */ 23777c478bd9Sstevel@tonic-gate void 23787c478bd9Sstevel@tonic-gate fc_obsolete(fcode_env_t *env) 23797c478bd9Sstevel@tonic-gate { 23807c478bd9Sstevel@tonic-gate fc_abort(env, "Obsolete"); 23817c478bd9Sstevel@tonic-gate } 23827c478bd9Sstevel@tonic-gate 23837c478bd9Sstevel@tonic-gate /* 23847c478bd9Sstevel@tonic-gate * Fcodes that are Historical per P1275-1994 23857c478bd9Sstevel@tonic-gate */ 23867c478bd9Sstevel@tonic-gate void 23877c478bd9Sstevel@tonic-gate fc_historical(fcode_env_t *env) 23887c478bd9Sstevel@tonic-gate { 23897c478bd9Sstevel@tonic-gate fc_abort(env, "Historical"); 23907c478bd9Sstevel@tonic-gate } 23917c478bd9Sstevel@tonic-gate 23927c478bd9Sstevel@tonic-gate void 23937c478bd9Sstevel@tonic-gate catch(fcode_env_t *env) 23947c478bd9Sstevel@tonic-gate { 23957c478bd9Sstevel@tonic-gate error_frame *new; 23967c478bd9Sstevel@tonic-gate 23977c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "catch"); 23987c478bd9Sstevel@tonic-gate new = MALLOC(sizeof (error_frame)); 23997c478bd9Sstevel@tonic-gate new->ds = DS-1; 24007c478bd9Sstevel@tonic-gate new->rs = RS; 24017c478bd9Sstevel@tonic-gate new->myself = MYSELF; 24027c478bd9Sstevel@tonic-gate new->next = env->catch_frame; 24037c478bd9Sstevel@tonic-gate new->code = 0; 24047c478bd9Sstevel@tonic-gate env->catch_frame = new; 24057c478bd9Sstevel@tonic-gate execute(env); 24067c478bd9Sstevel@tonic-gate PUSH(DS, new->code); 24077c478bd9Sstevel@tonic-gate env->catch_frame = new->next; 24087c478bd9Sstevel@tonic-gate FREE(new); 24097c478bd9Sstevel@tonic-gate } 24107c478bd9Sstevel@tonic-gate 24117c478bd9Sstevel@tonic-gate void 24127c478bd9Sstevel@tonic-gate throw_from_fclib(fcode_env_t *env, fstack_t errcode, char *fmt, ...) 24137c478bd9Sstevel@tonic-gate { 24147c478bd9Sstevel@tonic-gate error_frame *efp; 24157c478bd9Sstevel@tonic-gate va_list ap; 24167c478bd9Sstevel@tonic-gate char msg[256]; 24177c478bd9Sstevel@tonic-gate 24187c478bd9Sstevel@tonic-gate va_start(ap, fmt); 24197c478bd9Sstevel@tonic-gate vsprintf(msg, fmt, ap); 24207c478bd9Sstevel@tonic-gate 24217c478bd9Sstevel@tonic-gate if (errcode) { 24227c478bd9Sstevel@tonic-gate 24237c478bd9Sstevel@tonic-gate env->last_error = errcode; 24247c478bd9Sstevel@tonic-gate 24257c478bd9Sstevel@tonic-gate /* 24267c478bd9Sstevel@tonic-gate * No catch frame set => fatal error 24277c478bd9Sstevel@tonic-gate */ 24287c478bd9Sstevel@tonic-gate efp = env->catch_frame; 24297c478bd9Sstevel@tonic-gate if (!efp) 24307c478bd9Sstevel@tonic-gate forth_abort(env, "%s: No catch frame", msg); 24317c478bd9Sstevel@tonic-gate 24327c478bd9Sstevel@tonic-gate debug_msg(DEBUG_TRACING, "throw_from_fclib: throw: %s\n", msg); 24337c478bd9Sstevel@tonic-gate 24347c478bd9Sstevel@tonic-gate /* 24357c478bd9Sstevel@tonic-gate * Setting IP=0 will force the unwinding of the calls 24367c478bd9Sstevel@tonic-gate * (see execute) which is how we will return (eventually) 24377c478bd9Sstevel@tonic-gate * to the test in catch that follows 'execute'. 24387c478bd9Sstevel@tonic-gate */ 24397c478bd9Sstevel@tonic-gate DS = efp->ds; 24407c478bd9Sstevel@tonic-gate RS = efp->rs; 24417c478bd9Sstevel@tonic-gate MYSELF = efp->myself; 24427c478bd9Sstevel@tonic-gate IP = 0; 24437c478bd9Sstevel@tonic-gate efp->code = errcode; 24447c478bd9Sstevel@tonic-gate } 24457c478bd9Sstevel@tonic-gate } 24467c478bd9Sstevel@tonic-gate 24477c478bd9Sstevel@tonic-gate void 24487c478bd9Sstevel@tonic-gate throw(fcode_env_t *env) 24497c478bd9Sstevel@tonic-gate { 24507c478bd9Sstevel@tonic-gate fstack_t t; 24517c478bd9Sstevel@tonic-gate 24527c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "throw"); 24537c478bd9Sstevel@tonic-gate t = POP(DS); 24547c478bd9Sstevel@tonic-gate if (t >= -20 && t <= 20) 24557c478bd9Sstevel@tonic-gate throw_from_fclib(env, t, "throw Fcode errcode: 0x%x", (int)t); 24567c478bd9Sstevel@tonic-gate else { 24577c478bd9Sstevel@tonic-gate if (t) 24587c478bd9Sstevel@tonic-gate log_message(MSG_ERROR, "throw: errcode: 0x%x\n", 24597c478bd9Sstevel@tonic-gate (int)t); 24607c478bd9Sstevel@tonic-gate throw_from_fclib(env, t, "throw Fcode err: %s", (char *)t); 24617c478bd9Sstevel@tonic-gate } 24627c478bd9Sstevel@tonic-gate } 24637c478bd9Sstevel@tonic-gate 24647c478bd9Sstevel@tonic-gate void 24657c478bd9Sstevel@tonic-gate tick_literal(fcode_env_t *env) 24667c478bd9Sstevel@tonic-gate { 24677c478bd9Sstevel@tonic-gate if (env->state) { 24687c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&tlit_ptr); 24697c478bd9Sstevel@tonic-gate compile_comma(env); 24707c478bd9Sstevel@tonic-gate } 24717c478bd9Sstevel@tonic-gate } 24727c478bd9Sstevel@tonic-gate 24737c478bd9Sstevel@tonic-gate void 24747c478bd9Sstevel@tonic-gate do_tick(fcode_env_t *env) 24757c478bd9Sstevel@tonic-gate { 24767c478bd9Sstevel@tonic-gate parse_word(env); 24777c478bd9Sstevel@tonic-gate dollar_find(env); 24787c478bd9Sstevel@tonic-gate invert(env); 24797c478bd9Sstevel@tonic-gate throw(env); 24807c478bd9Sstevel@tonic-gate tick_literal(env); 24817c478bd9Sstevel@tonic-gate } 24827c478bd9Sstevel@tonic-gate 24837c478bd9Sstevel@tonic-gate void 24847c478bd9Sstevel@tonic-gate bracket_tick(fcode_env_t *env) 24857c478bd9Sstevel@tonic-gate { 24867c478bd9Sstevel@tonic-gate do_tick(env); 24877c478bd9Sstevel@tonic-gate } 24887c478bd9Sstevel@tonic-gate 24897c478bd9Sstevel@tonic-gate #pragma init(_init) 24907c478bd9Sstevel@tonic-gate 24917c478bd9Sstevel@tonic-gate static void 24927c478bd9Sstevel@tonic-gate _init(void) 24937c478bd9Sstevel@tonic-gate { 24947c478bd9Sstevel@tonic-gate fcode_env_t *env = initial_env; 24957c478bd9Sstevel@tonic-gate 24967c478bd9Sstevel@tonic-gate NOTICE; 24977c478bd9Sstevel@tonic-gate ASSERT(env); 24987c478bd9Sstevel@tonic-gate 24997c478bd9Sstevel@tonic-gate ANSI(0x019, 0, "i", loop_i); 25007c478bd9Sstevel@tonic-gate ANSI(0x01a, 0, "j", loop_j); 25017c478bd9Sstevel@tonic-gate ANSI(0x01d, 0, "execute", execute); 25027c478bd9Sstevel@tonic-gate ANSI(0x01e, 0, "+", add); 25037c478bd9Sstevel@tonic-gate ANSI(0x01f, 0, "-", subtract); 25047c478bd9Sstevel@tonic-gate ANSI(0x020, 0, "*", multiply); 25057c478bd9Sstevel@tonic-gate ANSI(0x021, 0, "/", divide); 25067c478bd9Sstevel@tonic-gate ANSI(0x022, 0, "mod", mod); 25077c478bd9Sstevel@tonic-gate FORTH(0, "/mod", slash_mod); 25087c478bd9Sstevel@tonic-gate ANSI(0x023, 0, "and", and); 25097c478bd9Sstevel@tonic-gate ANSI(0x024, 0, "or", or); 25107c478bd9Sstevel@tonic-gate ANSI(0x025, 0, "xor", xor); 25117c478bd9Sstevel@tonic-gate ANSI(0x026, 0, "invert", invert); 25127c478bd9Sstevel@tonic-gate ANSI(0x027, 0, "lshift", lshift); 25137c478bd9Sstevel@tonic-gate ANSI(0x028, 0, "rshift", rshift); 25147c478bd9Sstevel@tonic-gate ANSI(0x029, 0, ">>a", rshifta); 25157c478bd9Sstevel@tonic-gate ANSI(0x02a, 0, "/mod", slash_mod); 25167c478bd9Sstevel@tonic-gate ANSI(0x02b, 0, "u/mod", uslash_mod); 25177c478bd9Sstevel@tonic-gate ANSI(0x02c, 0, "negate", negate); 25187c478bd9Sstevel@tonic-gate ANSI(0x02d, 0, "abs", f_abs); 25197c478bd9Sstevel@tonic-gate ANSI(0x02e, 0, "min", f_min); 25207c478bd9Sstevel@tonic-gate ANSI(0x02f, 0, "max", f_max); 25217c478bd9Sstevel@tonic-gate ANSI(0x030, 0, ">r", to_r); 25227c478bd9Sstevel@tonic-gate ANSI(0x031, 0, "r>", from_r); 25237c478bd9Sstevel@tonic-gate ANSI(0x032, 0, "r@", rfetch); 25247c478bd9Sstevel@tonic-gate ANSI(0x033, 0, "exit", f_exit); 25257c478bd9Sstevel@tonic-gate ANSI(0x034, 0, "0=", zero_equals); 25267c478bd9Sstevel@tonic-gate ANSI(0x035, 0, "0<>", zero_not_equals); 25277c478bd9Sstevel@tonic-gate ANSI(0x036, 0, "0<", zero_less); 25287c478bd9Sstevel@tonic-gate ANSI(0x037, 0, "0<=", zero_less_equals); 25297c478bd9Sstevel@tonic-gate ANSI(0x038, 0, "0>", zero_greater); 25307c478bd9Sstevel@tonic-gate ANSI(0x039, 0, "0>=", zero_greater_equals); 25317c478bd9Sstevel@tonic-gate ANSI(0x03a, 0, "<", less); 25327c478bd9Sstevel@tonic-gate ANSI(0x03b, 0, ">", greater); 25337c478bd9Sstevel@tonic-gate ANSI(0x03c, 0, "=", equals); 25347c478bd9Sstevel@tonic-gate ANSI(0x03d, 0, "<>", not_equals); 25357c478bd9Sstevel@tonic-gate ANSI(0x03e, 0, "u>", unsign_greater); 25367c478bd9Sstevel@tonic-gate ANSI(0x03f, 0, "u<=", unsign_less_equals); 25377c478bd9Sstevel@tonic-gate ANSI(0x040, 0, "u<", unsign_less); 25387c478bd9Sstevel@tonic-gate ANSI(0x041, 0, "u>=", unsign_greater_equals); 25397c478bd9Sstevel@tonic-gate ANSI(0x042, 0, ">=", greater_equals); 25407c478bd9Sstevel@tonic-gate ANSI(0x043, 0, "<=", less_equals); 25417c478bd9Sstevel@tonic-gate ANSI(0x044, 0, "between", between); 25427c478bd9Sstevel@tonic-gate ANSI(0x045, 0, "within", within); 25437c478bd9Sstevel@tonic-gate ANSI(0x046, 0, "drop", drop); 25447c478bd9Sstevel@tonic-gate ANSI(0x047, 0, "dup", f_dup); 25457c478bd9Sstevel@tonic-gate ANSI(0x048, 0, "over", over); 25467c478bd9Sstevel@tonic-gate ANSI(0x049, 0, "swap", swap); 25477c478bd9Sstevel@tonic-gate ANSI(0x04a, 0, "rot", rot); 25487c478bd9Sstevel@tonic-gate ANSI(0x04b, 0, "-rot", minus_rot); 25497c478bd9Sstevel@tonic-gate ANSI(0x04c, 0, "tuck", tuck); 25507c478bd9Sstevel@tonic-gate ANSI(0x04d, 0, "nip", nip); 25517c478bd9Sstevel@tonic-gate ANSI(0x04e, 0, "pick", pick); 25527c478bd9Sstevel@tonic-gate ANSI(0x04f, 0, "roll", roll); 25537c478bd9Sstevel@tonic-gate ANSI(0x050, 0, "?dup", qdup); 25547c478bd9Sstevel@tonic-gate ANSI(0x051, 0, "depth", depth); 25557c478bd9Sstevel@tonic-gate ANSI(0x052, 0, "2drop", two_drop); 25567c478bd9Sstevel@tonic-gate ANSI(0x053, 0, "2dup", two_dup); 25577c478bd9Sstevel@tonic-gate ANSI(0x054, 0, "2over", two_over); 25587c478bd9Sstevel@tonic-gate ANSI(0x055, 0, "2swap", two_swap); 25597c478bd9Sstevel@tonic-gate ANSI(0x056, 0, "2rot", two_rot); 25607c478bd9Sstevel@tonic-gate ANSI(0x057, 0, "2/", two_slash); 25617c478bd9Sstevel@tonic-gate ANSI(0x058, 0, "u2/", utwo_slash); 25627c478bd9Sstevel@tonic-gate ANSI(0x059, 0, "2*", two_times); 25637c478bd9Sstevel@tonic-gate ANSI(0x05a, 0, "/c", slash_c); 25647c478bd9Sstevel@tonic-gate ANSI(0x05b, 0, "/w", slash_w); 25657c478bd9Sstevel@tonic-gate ANSI(0x05c, 0, "/l", slash_l); 25667c478bd9Sstevel@tonic-gate ANSI(0x05d, 0, "/n", slash_n); 25677c478bd9Sstevel@tonic-gate ANSI(0x05e, 0, "ca+", ca_plus); 25687c478bd9Sstevel@tonic-gate ANSI(0x05f, 0, "wa+", wa_plus); 25697c478bd9Sstevel@tonic-gate ANSI(0x060, 0, "la+", la_plus); 25707c478bd9Sstevel@tonic-gate ANSI(0x061, 0, "na+", na_plus); 25717c478bd9Sstevel@tonic-gate ANSI(0x062, 0, "char+", char_plus); 25727c478bd9Sstevel@tonic-gate ANSI(0x063, 0, "wa1+", wa1_plus); 25737c478bd9Sstevel@tonic-gate ANSI(0x064, 0, "la1+", la1_plus); 25747c478bd9Sstevel@tonic-gate ANSI(0x065, 0, "cell+", cell_plus); 25757c478bd9Sstevel@tonic-gate ANSI(0x066, 0, "chars", do_chars); 25767c478bd9Sstevel@tonic-gate ANSI(0x067, 0, "/w*", slash_w_times); 25777c478bd9Sstevel@tonic-gate ANSI(0x068, 0, "/l*", slash_l_times); 25787c478bd9Sstevel@tonic-gate ANSI(0x069, 0, "cells", cells); 25797c478bd9Sstevel@tonic-gate ANSI(0x06a, 0, "on", do_on); 25807c478bd9Sstevel@tonic-gate ANSI(0x06b, 0, "off", do_off); 25817c478bd9Sstevel@tonic-gate ANSI(0x06c, 0, "+!", addstore); 25827c478bd9Sstevel@tonic-gate ANSI(0x06d, 0, "@", fetch); 25837c478bd9Sstevel@tonic-gate ANSI(0x06e, 0, "l@", lfetch); 25847c478bd9Sstevel@tonic-gate ANSI(0x06f, 0, "w@", wfetch); 25857c478bd9Sstevel@tonic-gate ANSI(0x070, 0, "<w@", swfetch); 25867c478bd9Sstevel@tonic-gate ANSI(0x071, 0, "c@", cfetch); 25877c478bd9Sstevel@tonic-gate ANSI(0x072, 0, "!", store); 25887c478bd9Sstevel@tonic-gate ANSI(0x073, 0, "l!", lstore); 25897c478bd9Sstevel@tonic-gate ANSI(0x074, 0, "w!", wstore); 25907c478bd9Sstevel@tonic-gate ANSI(0x075, 0, "c!", cstore); 25917c478bd9Sstevel@tonic-gate ANSI(0x076, 0, "2@", two_fetch); 25927c478bd9Sstevel@tonic-gate ANSI(0x077, 0, "2!", two_store); 25937c478bd9Sstevel@tonic-gate ANSI(0x078, 0, "move", fc_move); 25947c478bd9Sstevel@tonic-gate ANSI(0x079, 0, "fill", fc_fill); 25957c478bd9Sstevel@tonic-gate ANSI(0x07a, 0, "comp", fc_comp); 25967c478bd9Sstevel@tonic-gate ANSI(0x07b, 0, "noop", noop); 25977c478bd9Sstevel@tonic-gate ANSI(0x07c, 0, "lwsplit", lwsplit); 25987c478bd9Sstevel@tonic-gate ANSI(0x07d, 0, "wljoin", wljoin); 25997c478bd9Sstevel@tonic-gate ANSI(0x07e, 0, "lbsplit", lbsplit); 26007c478bd9Sstevel@tonic-gate ANSI(0x07f, 0, "bljoin", bljoin); 26017c478bd9Sstevel@tonic-gate ANSI(0x080, 0, "wbflip", wbflip); 26027c478bd9Sstevel@tonic-gate ANSI(0x081, 0, "upc", upper_case); 26037c478bd9Sstevel@tonic-gate ANSI(0x082, 0, "lcc", lower_case); 26047c478bd9Sstevel@tonic-gate ANSI(0x083, 0, "pack", pack_str); 26057c478bd9Sstevel@tonic-gate ANSI(0x084, 0, "count", count_str); 26067c478bd9Sstevel@tonic-gate ANSI(0x085, 0, "body>", to_acf); 26077c478bd9Sstevel@tonic-gate ANSI(0x086, 0, ">body", to_body); 26087c478bd9Sstevel@tonic-gate 26097c478bd9Sstevel@tonic-gate ANSI(0x089, 0, "unloop", unloop); 26107c478bd9Sstevel@tonic-gate 26117c478bd9Sstevel@tonic-gate ANSI(0x09f, 0, ".s", dot_s); 26127c478bd9Sstevel@tonic-gate ANSI(0x0a0, 0, "base", base); 26137c478bd9Sstevel@tonic-gate FCODE(0x0a1, 0, "convert", fc_historical); 26147c478bd9Sstevel@tonic-gate ANSI(0x0a2, 0, "$number", dollar_number); 26157c478bd9Sstevel@tonic-gate ANSI(0x0a3, 0, "digit", digit); 26167c478bd9Sstevel@tonic-gate 26177c478bd9Sstevel@tonic-gate ANSI(0x0a9, 0, "bl", space); 26187c478bd9Sstevel@tonic-gate ANSI(0x0aa, 0, "bs", backspace); 26197c478bd9Sstevel@tonic-gate ANSI(0x0ab, 0, "bell", bell); 26207c478bd9Sstevel@tonic-gate ANSI(0x0ac, 0, "bounds", fc_bounds); 26217c478bd9Sstevel@tonic-gate ANSI(0x0ad, 0, "here", here); 26227c478bd9Sstevel@tonic-gate 26237c478bd9Sstevel@tonic-gate ANSI(0x0af, 0, "wbsplit", wbsplit); 26247c478bd9Sstevel@tonic-gate ANSI(0x0b0, 0, "bwjoin", bwjoin); 26257c478bd9Sstevel@tonic-gate 26267c478bd9Sstevel@tonic-gate P1275(0x0cb, 0, "$find", dollar_find); 26277c478bd9Sstevel@tonic-gate 26287c478bd9Sstevel@tonic-gate ANSI(0x0d0, 0, "c,", ccomma); 26297c478bd9Sstevel@tonic-gate ANSI(0x0d1, 0, "w,", wcomma); 26307c478bd9Sstevel@tonic-gate ANSI(0x0d2, 0, "l,", lcomma); 26317c478bd9Sstevel@tonic-gate ANSI(0x0d3, 0, ",", comma); 26327c478bd9Sstevel@tonic-gate ANSI(0x0d4, 0, "um*", um_multiply); 26337c478bd9Sstevel@tonic-gate ANSI(0x0d5, 0, "um/mod", um_slash_mod); 26347c478bd9Sstevel@tonic-gate 26357c478bd9Sstevel@tonic-gate ANSI(0x0d8, 0, "d+", d_plus); 26367c478bd9Sstevel@tonic-gate ANSI(0x0d9, 0, "d-", d_minus); 26377c478bd9Sstevel@tonic-gate 26387c478bd9Sstevel@tonic-gate ANSI(0x0dc, 0, "state", state); 26397c478bd9Sstevel@tonic-gate ANSI(0x0de, 0, "behavior", behavior); 26407c478bd9Sstevel@tonic-gate ANSI(0x0dd, 0, "compile,", compile_comma); 26417c478bd9Sstevel@tonic-gate 26427c478bd9Sstevel@tonic-gate ANSI(0x216, 0, "abort", f_abort); 26437c478bd9Sstevel@tonic-gate ANSI(0x217, 0, "catch", catch); 26447c478bd9Sstevel@tonic-gate ANSI(0x218, 0, "throw", throw); 26457c478bd9Sstevel@tonic-gate 26467c478bd9Sstevel@tonic-gate ANSI(0x226, 0, "lwflip", lwflip); 26477c478bd9Sstevel@tonic-gate ANSI(0x227, 0, "lbflip", lbflip); 26487c478bd9Sstevel@tonic-gate ANSI(0x228, 0, "lbflips", lbflips); 26497c478bd9Sstevel@tonic-gate 26507c478bd9Sstevel@tonic-gate ANSI(0x236, 0, "wbflips", wbflips); 26517c478bd9Sstevel@tonic-gate ANSI(0x237, 0, "lwflips", lwflips); 26527c478bd9Sstevel@tonic-gate 26537c478bd9Sstevel@tonic-gate FORTH(0, "forth", do_forth); 26547c478bd9Sstevel@tonic-gate FORTH(0, "current", do_current); 26557c478bd9Sstevel@tonic-gate FORTH(0, "context", do_context); 26567c478bd9Sstevel@tonic-gate FORTH(0, "definitions", do_definitions); 26577c478bd9Sstevel@tonic-gate FORTH(0, "vocabulary", do_vocab); 26587c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, ":", colon); 26597c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, ";", semi); 26607c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "create", create); 26617c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "does>", does); 26627c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "recursive", recursive); 26637c478bd9Sstevel@tonic-gate FORTH(0, "parse-word", parse_word); 26647c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "\"", run_quote); 26657c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "order", do_order); 26667c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "also", do_also); 26677c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "previous", do_previous); 26687c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "'", do_tick); 26697c478bd9Sstevel@tonic-gate FORTH(IMMEDIATE, "[']", bracket_tick); 26707c478bd9Sstevel@tonic-gate FORTH(0, "unaligned-l@", unaligned_lfetch); 26717c478bd9Sstevel@tonic-gate FORTH(0, "unaligned-l!", unaligned_lstore); 26727c478bd9Sstevel@tonic-gate FORTH(0, "unaligned-w@", unaligned_wfetch); 26737c478bd9Sstevel@tonic-gate FORTH(0, "unaligned-w!", unaligned_wstore); 26747c478bd9Sstevel@tonic-gate } 2675