|
|
1.1 ! root 1: \ ***************************************************************************** ! 2: \ * Copyright (c) 2004, 2008 IBM Corporation ! 3: \ * All rights reserved. ! 4: \ * This program and the accompanying materials ! 5: \ * are made available under the terms of the BSD License ! 6: \ * which accompanies this distribution, and is available at ! 7: \ * http://www.opensource.org/licenses/bsd-license.php ! 8: \ * ! 9: \ * Contributors: ! 10: \ * IBM Corporation - initial implementation ! 11: \ ****************************************************************************/ ! 12: ! 13: 0 value function-type ' function-type @ constant <value> ! 14: variable function-type ' function-type @ constant <variable> ! 15: 0 constant function-type ' function-type @ constant <constant> ! 16: : function-type ; ' function-type @ constant <colon> ! 17: create function-type ' function-type @ constant <create> ! 18: defer function-type ' function-type @ constant <defer> ! 19: ! 20: \ variable tmp-buf-current ! 21: \ variable orig-here ! 22: \ create tmp-buf 10000 allot ! 23: ! 24: ( ---------------------------------------------------- ) ! 25: ! 26: : fcode-revision ( -- n ) ! 27: 00030000 \ major * 65536 + minor ! 28: ; ! 29: ! 30: : b(lit) ( -- n ) ! 31: next-ip read-fcode-num32 ! 32: ?compile-mode IF literal, THEN ! 33: ; ! 34: ! 35: : b(") ! 36: next-ip read-fcode-string ! 37: ?compile-mode IF fc-string, align postpone count THEN ! 38: ; ! 39: ! 40: : b(') ! 41: next-ip read-fcode# get-token drop ?compile-mode IF literal, THEN ! 42: ; ! 43: ! 44: : ?jump-direction ( n -- ) ! 45: dup 8000 >= IF FFFF swap - negate 2- THEN ! 46: ; ! 47: ! 48: : ?negative ! 49: 8000 and ! 50: ; ! 51: ! 52: : dest-on-top ! 53: 0 >r BEGIN dup @ 0= WHILE >r REPEAT ! 54: BEGIN r> dup WHILE swap REPEAT ! 55: drop ! 56: ; ! 57: ! 58: : ?branch ! 59: true = ! 60: ; ! 61: ! 62: : read-fcode-offset \ ELSE needs to be fixed! ! 63: ?offset16 IF next-ip read-fcode-num16 ELSE THEN ! 64: ; ! 65: ! 66: : b?branch ( flag -- ) ! 67: ?compile-mode IF ! 68: read-fcode-offset ?negative IF dest-on-top postpone until ! 69: ELSE postpone if ! 70: THEN ! 71: ELSE ! 72: ?branch IF 2 jump-n-ip ! 73: ELSE read-fcode-offset ! 74: ?jump-direction 2- jump-n-ip ! 75: THEN ! 76: THEN ! 77: ; immediate ! 78: ! 79: : bbranch ( -- ) ! 80: ?compile-mode IF ! 81: read-fcode-offset ! 82: ?negative IF dest-on-top postpone again ! 83: ELSE postpone else ! 84: get-ip next-ip fcode@ B2 = IF drop ELSE set-ip THEN ! 85: THEN ! 86: ELSE ! 87: read-fcode-offset ?jump-direction 2- jump-n-ip ! 88: THEN ! 89: ; immediate ! 90: ! 91: : b(<mark) ( -- ) ! 92: ?compile-mode IF postpone begin THEN ! 93: ; immediate ! 94: ! 95: : b(>resolve) ( -- ) ! 96: ?compile-mode IF postpone then THEN ! 97: ; immediate ! 98: ! 99: : ffwto; ( -- ) ! 100: BEGIN fcode@ dup c2 <> WHILE ! 101: ." ffwto: skipping " dup . ." @ " get-ip . cr ! 102: CASE 10 OF ( lit ) read-fcode-num32 drop ENDOF ! 103: 11 OF ( ' ) read-fcode# drop ENDOF ! 104: 12 OF ( " ) read-fcode-string 2drop ENDOF ! 105: 13 OF ( bbranch ) read-fcode-offset drop ENDOF ! 106: 14 OF ( b?branch ) read-fcode-offset drop ENDOF ! 107: 15 OF ( loop ) read-fcode-offset drop ENDOF ! 108: 16 OF ( +loop ) read-fcode-offset drop ENDOF ! 109: 17 OF ( do ) read-fcode-offset drop ENDOF ! 110: 18 OF ( ?do ) read-fcode-offset drop ENDOF ! 111: 1C OF ( of ) read-fcode-offset drop ENDOF ! 112: C6 OF ( endof ) read-fcode-offset drop ENDOF ! 113: C3 OF ( to ) read-fcode# drop ENDOF ! 114: dup OF next-ip ENDOF ! 115: ENDCASE ! 116: REPEAT next-ip ! 117: ; ! 118: ! 119: : rpush ( rparm -- ) \ push the rparm to be on top of return stack after exit ! 120: r> swap >r >r ! 121: ; ! 122: ! 123: : rpop ( -- rparm ) \ pop the rparm that was on top of return stack before this ! 124: r> r> swap >r ! 125: ; ! 126: ! 127: : b1(;) ( -- ) ! 128: ." b1(;)" cr ! 129: rpop set-ip ! 130: ; ! 131: ! 132: \ : b1(:) ( -- ) ! 133: \ ." b1(:)" cr ! 134: \ <colon> compile, get-ip 1+ literal ] get-ip rpush set-ip [ ! 135: \ ffwto; ! 136: \ ; immediate ! 137: ! 138: : b(;) ( -- ) ! 139: postpone exit reveal postpone [ ! 140: ; immediate ! 141: ! 142: : b(:) ( -- ) ! 143: <colon> compile, ] ! 144: ; immediate ! 145: ! 146: : b(case) ( sel -- sel ) ! 147: postpone case ! 148: ; immediate ! 149: ! 150: : b(endcase) ! 151: postpone endcase ! 152: ; immediate ! 153: ! 154: : b(of) ! 155: postpone of ! 156: read-fcode-offset drop \ read and discard offset ! 157: ; immediate ! 158: ! 159: : b(endof) ! 160: postpone endof ! 161: read-fcode-offset drop ! 162: ; immediate ! 163: ! 164: : b(do) ! 165: postpone do ! 166: read-fcode-offset drop ! 167: ; immediate ! 168: ! 169: : b(?do) ! 170: postpone ?do ! 171: read-fcode-offset drop ! 172: ; immediate ! 173: ! 174: : b(loop) ! 175: postpone loop ! 176: read-fcode-offset drop ! 177: ; immediate ! 178: ! 179: : b(+loop) ! 180: postpone +loop ! 181: read-fcode-offset drop ! 182: ; immediate ! 183: ! 184: : b(leave) ! 185: postpone leave ! 186: ; immediate ! 187: ! 188: : new-token \ unnamed local fcode function ! 189: align here next-ip read-fcode# 0 swap set-token ! 190: ; ! 191: ! 192: : external-token ( -- ) \ named local fcode function ! 193: next-ip read-fcode-string ! 194: header ( str len -- ) \ create a header in the current dictionary entry ! 195: new-token ! 196: ; ! 197: ! 198: : new-token ! 199: eva-debug? IF ! 200: s" x" get-ip >r next-ip read-fcode# r> set-ip (u.) $cat strdup ! 201: header ! 202: THEN new-token ! 203: ; ! 204: ! 205: : named-token \ decide wether or not to give a new token an own name in the dictionary ! 206: fcode-debug? IF new-token ELSE external-token THEN ! 207: ; ! 208: ! 209: : b(to) ( x -- ) ! 210: next-ip read-fcode# ! 211: get-token drop ! 212: >body cell - ! 213: ?compile-mode IF literal, postpone ! ELSE ! THEN ! 214: ; immediate ! 215: ! 216: : b(value) ! 217: <value> , , reveal ! 218: ; ! 219: ! 220: : b(variable) ! 221: <variable> , 0 , reveal ! 222: ; ! 223: ! 224: : b(constant) ! 225: <constant> , , reveal ! 226: ; ! 227: ! 228: : undefined-defer ! 229: cr cr ." Unititialized defer word has been executed!" cr cr ! 230: true fcode-end ! ! 231: ; ! 232: ! 233: : b(defer) ! 234: <defer> , reveal ! 235: postpone undefined-defer ! 236: ; ! 237: ! 238: : b(create) ! 239: <variable> , ! 240: postpone noop reveal ! 241: ; ! 242: ! 243: : b(field) ( E: addr -- addr+offset ) ( F: offset size -- offset+size ) ! 244: <colon> , over literal, ! 245: postpone + postpone exit ! 246: + ! 247: ; ! 248: ! 249: : b(buffer:) ( E: -- a-addr) ( F: size -- ) ! 250: <variable> , allot ! 251: ; ! 252: ! 253: : suspend-fcode ( -- ) ! 254: noop \ has to be implemented more efficiently ;-) ! 255: ; ! 256: ! 257: : offset16 ( -- ) ! 258: 16 to fcode-offset ! 259: ; ! 260: ! 261: : version1 ( -- ) ! 262: 1 to fcode-spread ! 263: 8 to fcode-offset ! 264: read-header ! 265: ; ! 266: ! 267: : start0 ( -- ) ! 268: 0 to fcode-spread ! 269: offset16 ! 270: read-header ! 271: ; ! 272: ! 273: : start1 ( -- ) ! 274: 1 to fcode-spread ! 275: offset16 ! 276: read-header ! 277: ; ! 278: ! 279: : start2 ( -- ) ! 280: 2 to fcode-spread ! 281: offset16 ! 282: read-header ! 283: ; ! 284: ! 285: : start4 ( -- ) ! 286: 4 to fcode-spread ! 287: offset16 ! 288: read-header ! 289: ; ! 290: ! 291: : end0 ( -- ) ! 292: true fcode-end ! ! 293: ; ! 294: ! 295: : end1 ( -- ) ! 296: end0 ! 297: ; ! 298: ! 299: : ferror ( -- ) ! 300: clear end0 ! 301: cr ." FCode# " fcode-num @ . ." not assigned!" ! 302: cr ." FCode evaluation aborted." cr ! 303: ." ( -- S:" depth . ." R:" rdepth . ." ) " .s cr ! 304: abort ! 305: ; ! 306: ! 307: : reset-local-fcodes ! 308: FFF 800 DO ['] ferror 0 i set-token LOOP ! 309: ; ! 310: ! 311: : byte-load ( addr xt -- ) ! 312: >r >r ! 313: save-evaluator-state ! 314: r> r> ! 315: reset-fcode-end ! 316: 1 to fcode-spread ! 317: dup 1 = IF drop ['] rb@ THEN to fcode-rb@ ! 318: set-ip ! 319: reset-local-fcodes ! 320: depth >r ! 321: evaluate-fcode ! 322: r> depth 1- <> IF clear end0 ! 323: cr ." Ambiguous stack depth after byte-load!" ! 324: cr ." FCode evaluation aborted." cr cr ! 325: ELSE restore-evaluator-state ! 326: THEN ! 327: ['] c@ to fcode-rb@ ! 328: ; ! 329: ! 330: create byte-load-test-fcode ! 331: f1 c, 08 c, 18 c, 69 c, 00 c, 00 c, 00 c, 68 c, ! 332: 12 c, 16 c, 62 c, 79 c, 74 c, 65 c, 2d c, 6c c, ! 333: 6f c, 61 c, 64 c, 2d c, 74 c, 65 c, 73 c, 74 c, ! 334: 2d c, 66 c, 63 c, 6f c, 64 c, 65 c, 21 c, 21 c, ! 335: 90 c, 92 c, ( a6 c, a7 c, 2e c, ) 00 c, ! 336: ! 337: : byte-load-test ! 338: byte-load-test-fcode ['] w@ ! 339: ; immediate ! 340: ! 341: : fcode-ms ! 342: s" ms" $find IF 0= IF compile, ELSE execute THEN THEN ; immediate ! 343: ! 344: : fcode-$find ! 345: $find ! 346: IF ! 347: drop true ! 348: ELSE ! 349: false ! 350: THEN ! 351: ; ! 352: ! 353: ( ---------------------------------------------------- )
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.