Annotation of gforth/arch/4stack/prim-new.fs, revision 1.1
1.1 ! pazsan 1: \ 4stack primitives
! 2:
! 3: Label start ;;
! 4: nop ;; first opcode must be a nop!
! 5: $80000000 ## ;;
! 6: #, ;;
! 7: sr! jmpa $828 >IP ;;
! 8:
! 9: $800 .org
! 10: ip0: .int 0
! 11: .int 0
! 12: conpat: nop nop ip@ jmpa ;;
! 13: varpat: nop nop ip@ jmpa ;;
! 14: jmppat: nop ip@ nop jmpa ;;
! 15: colpat: nop nop ip@ jmpa ;;
! 16: ;; ds cfa fs rs
! 17: main: ;;
! 18: -$200 ## nop nop nop -12 # ld 1: ip ;;
! 19: #, nop nop nop set 0: R3 ;;
! 20: nop nop nop nop 0 # set 1: R1 ;;
! 21: nop nop nop nop 0 # ld 1: R1 N+ ;;
! 22: nop nop nop nop 0 # ld 1: R1 N+ ;;
! 23: nop ip! nop nop 0 # ld 1: R1 N+ ;;
! 24: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 25:
! 26: docol: .endif ;;
! 27: ;; nop nop ip@ jmp docol ;;
! 28: ;; ds ca cfa fs rs
! 29: nop 8 # drop -12 # get 0: R1 get 3: R1 ;;
! 30: drop add 0s0 nop add 0 # set 1: R1 ;;
! 31: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 32: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 33: nop ip! nop nop 0 # ld 1: R1 N+ ;;
! 34: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 35: dodoes: .endif ;;
! 36: ;; nop nop ip@ jmp doesjump
! 37: ;; nop ip@ nop jmp dodoes
! 38: ;; ds df ca cfa fs rs
! 39: 8 # nop drop -12 # get 0: R1 get 3: R1 ;;
! 40: add nop nop add 0 # set 1: R1 ;;
! 41: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 42: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 43: nop ip! nop nop 0 # ld 1: R1 N+ ;;
! 44: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 45: dovar: .endif ;;
! 46: ;; nop nop ip@ jmp dovar ;;
! 47: ;; ds cfa fs rs
! 48: 8 # swap ip! nop get 0: R1 ;;
! 49: add ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 50:
! 51: docon: .endif ;;
! 52: ;; nop nop ip@ jmp dovar ;;
! 53: ;; ds cfa fs rs
! 54: nop swap ip! nop ld 0: R1 2 # ;;
! 55: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 56: end-code
! 57:
! 58: -3 Alias: :docon
! 59:
! 60: Code execute ( xt -- )
! 61: nop nop nop ip@ br .endif
! 62: ip! drop pick 0s0 nop set 2: R1 ;;
! 63: nop nop nop ip! -1 # ld 1: R1 ;;
! 64: end-code
! 65:
! 66: Code ?branch
! 67: nop nop nop ip@ br .endif
! 68: nop swap nop nop br 0 ?0<>
! 69: nop nop nop nop -12 # R1= R1 3: +s0 ;;
! 70: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 71: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 72: .endif
! 73: nop ip! nop drop 0 # ld 1: R1 N+ ;;
! 74: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 75: end-code
! 76:
! 77: Code +
! 78: add ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 79: end-code
! 80:
! 81: Code and
! 82: and ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 83: end-code
! 84:
! 85: Code xor
! 86: xor ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 87: end-code
! 88:
! 89: Code sp@
! 90: sp@ ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 91: end-code
! 92:
! 93: Code sp!
! 94: sp! ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 95: end-code
! 96:
! 97: Code rp@
! 98: nop nop ip@ sp@ br .endif
! 99: pick 3s0 swap ip! drop ;;
! 100: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 101: end-code
! 102:
! 103: Code rp!
! 104: drop nop ip@ pick 0s0 br .endif
! 105: nop swap ip! sp! ;;
! 106: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 107: end-code
! 108:
! 109: Code ;s
! 110: nop nop nop nop br .endif
! 111: nop drop nop nop 0 # set 3: R1 ;;
! 112: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 113: nop nop nop nop 0 # ld 1: R1 N+ ;;
! 114: nop ip! nop nop 0 # ld 1: R1 N+ ;;
! 115: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 116: end-code
! 117:
! 118: Code @
! 119: nop nop ip@ nop br .endif
! 120: drop swap ip! nop ld 0: s0b 0 # ;;
! 121: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 122: end-code
! 123:
! 124: Code !
! 125: nop nop ip@ nop br .endif
! 126: drop swap ip! nop st 0: s0b 0 # ;;
! 127: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 128: end-code
! 129:
! 130: \ obligatory IO
! 131:
! 132: Code key?
! 133: nop nop ip@ nop br .endif
! 134: nop swap nop nop inb R3 3 # ;;
! 135: nop nop ip! nop ;;
! 136: 0<> ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 137: end-code
! 138:
! 139: Code (key)
! 140: nop nop ip@ nop br .endif
! 141: .begin inb R3 3 # ;;
! 142: nop br 0 ?0= .until
! 143: inb R3 2 # ;;
! 144: nop swap ip! nop ;;
! 145: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 146: end-code
! 147:
! 148: Code (emit)
! 149: nop nop ip@ nop br .endif
! 150: ;; .begin inb R3 1 # ;;
! 151: ;; nop br 0 ?0= .until
! 152: outb 0: R3 0 # ;;
! 153: nop swap ip! nop ;;
! 154: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 155: end-code
! 156:
! 157: : (type)
! 158: bounds ?DO I c@ (emit) LOOP ;
! 159: \ BEGIN dup WHILE
! 160: \ >r dup c@ (emit) 1+ r> 1- REPEAT 2drop ;
! 161:
! 162: \ obligatory code address manipulations
! 163:
! 164: : >code-address ( xt -- addr ) cell+ @ -8 and ;
! 165: : >does-code ( xt -- addr )
! 166: cell+ @ -8 and \ dup 3 and 3 <> IF drop 0 EXIT THEN
! 167: 8 + dup cell - @ 3 and 0<> and ;
! 168: : code-address! ( addr xt -- ) >r 3 or $808 @ r> 2! ;
! 169: : does-code! ( a_addr xt -- ) >r 5 - $808 @ r> 2! ;
! 170: : does-handler! ( a_addr -- ) $818 2@ rot 2! ;
! 171:
! 172: \ this was obligatory, now some things to speed it up
! 173:
! 174: Code 2/
! 175: asr ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 176: end-code
! 177:
! 178: Code branch
! 179: nop nop nop ip@ br .endif
! 180: nop nop nop nop -12 # R1= R1 3: +s0 ;;
! 181: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 182: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 183: nop ip! nop drop 0 # ld 1: R1 N+ ;;
! 184: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 185: end-code
! 186:
! 187: Code (loop)
! 188: pick 3s1 nop nop ip@ br .endif
! 189: dec nop nop nop ;;
! 190: sub 3s1 swap nop nop br 0 ?0=
! 191: nop nop nop nop -12 # R1= R1 3: +s0 ;;
! 192: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 193: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 194: .endif
! 195: nop ip! nop drop 0 # ld 1: R1 N+ ;;
! 196: nop ip! ip@ inc set 2: R1 ld 1: R1 N+ ;;
! 197: end-code
! 198:
! 199: Code (+loop)
! 200: pick 3s1 nop nop ip@ br .endif
! 201: subr 3s1 nop nop nop ;;
! 202: xor #min nop nop nop ;;
! 203: add s1 swap nop nop br 0 ?ov
! 204: nop nop nop nop -12 # R1= R1 3: +s0 ;;
! 205: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 206: nop drop nop nop 0 # ld 1: R1 N+ ;;
! 207: .endif
! 208: nop ip! nop drop 0 # ld 1: R1 N+ ;;
! 209: drop ip! ip@ add 0s0 set 2: R1 ld 1: R1 N+ ;;
! 210: end-code
! 211:
! 212: Code (do)
! 213: nop nop ip@ nop br .endif
! 214: nip swap ip! pick 0s1 ;;
! 215: drop ip! ip@ pick 0s0 set 2: R1 ld 1: R1 N+ ;;
! 216: end-code
! 217:
! 218: Code -
! 219: subr ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 220: end-code
! 221:
! 222: Code or
! 223: or ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 224: end-code
! 225:
! 226: Code 1+
! 227: inc ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 228: end-code
! 229:
! 230: Code 2*
! 231: asl ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 232: end-code
! 233:
! 234: Code cell+
! 235: add c2 ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 236: end-code
! 237:
! 238: Code cells
! 239: nop nop ip@ nop br .endif
! 240: asl swap ip! nop ;;
! 241: asl ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 242: end-code
! 243:
! 244: Code c@
! 245: nop nop ip@ nop br .endif
! 246: drop swap ip! nop ldb 0: s0b 0 # ;;
! 247: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 248: end-code
! 249:
! 250: Code c!
! 251: nop nop ip@ nop br .endif
! 252: drop swap ip! nop stb 0: s0b 0 # ;;
! 253: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 254: end-code
! 255:
! 256: Code um*
! 257: nop nop ip@ nop br .endif
! 258: umul swap ip! nop ;;
! 259: mul@ ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 260: end-code
! 261:
! 262: Code m*
! 263: nop nop ip@ nop br .endif
! 264: mul swap ip! nop ;;
! 265: mul@ ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 266: end-code
! 267:
! 268: Code d+
! 269: nop nop ip@ nop br .endif
! 270: pass swap ip! nop ;;
! 271: mul@+ ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 272: end-code
! 273:
! 274: Code >r
! 275: drop ip! ip@ pick 0s0 set 2: R1 ld 1: R1 N+ ;;
! 276: end-code
! 277:
! 278: Code r>
! 279: pick 3s0 ip! ip@ drop set 2: R1 ld 1: R1 N+ ;;
! 280: end-code
! 281:
! 282: Code drop
! 283: drop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 284: end-code
! 285:
! 286: Code swap
! 287: swap ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 288: end-code
! 289:
! 290: Code over
! 291: over ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 292: end-code
! 293:
! 294: Code 2dup
! 295: nop nop ip@ nop br .endif
! 296: over swap ip! nop ;;
! 297: over ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 298: end-code
! 299:
! 300: Code rot
! 301: rot ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 302: end-code
! 303:
! 304: Code -rot
! 305: nop nop ip@ nop br .endif
! 306: rot swap ip! nop ;;
! 307: rot ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 308: end-code
! 309:
! 310: Code i
! 311: pick 3s0 ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 312: end-code
! 313:
! 314: Code i'
! 315: pick 3s1 ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 316: end-code
! 317:
! 318: Code j
! 319: pick 3s2 ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 320: end-code
! 321:
! 322: Code lit
! 323: ip@ nop pick 1s0 nop br .endif ;;
! 324: nop nip ip! nop 0 # ld 1: R1 N+ ;;
! 325: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 326: end-code
! 327:
! 328: Code 0=
! 329: 0= ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 330: end-code
! 331:
! 332: Code 0<>
! 333: 0<> ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 334: end-code
! 335:
! 336: Code u<
! 337: nop nop ip@ nop br .endif
! 338: subr swap ip! nop ;;
! 339: u< ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 340: end-code
! 341:
! 342: Code u>
! 343: nop nop ip@ nop br .endif
! 344: subr swap ip! nop ;;
! 345: u> ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 346: end-code
! 347:
! 348: Code u>=
! 349: nop nop ip@ nop br .endif
! 350: subr swap ip! nop ;;
! 351: u>= ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 352: end-code
! 353:
! 354: Code u<=
! 355: nop nop ip@ nop br .endif
! 356: subr swap ip! nop ;;
! 357: u<= ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 358: end-code
! 359:
! 360: Code >=
! 361: nop nop ip@ nop br .endif
! 362: subr swap ip! nop ;;
! 363: >= ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 364: end-code
! 365:
! 366: Code <=
! 367: nop nop ip@ nop br .endif
! 368: subr swap ip! nop ;;
! 369: <= ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 370: end-code
! 371:
! 372: Code =
! 373: nop nop ip@ nop br .endif
! 374: subr swap ip! nop ;;
! 375: 0= ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 376: end-code
! 377:
! 378: Code <>
! 379: nop nop ip@ nop br .endif
! 380: subr swap ip! nop ;;
! 381: 0<> ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 382: end-code
! 383:
! 384: \ : (find-samelen) ( u f83name1 -- u f83name2/0 )
! 385: \ BEGIN 2dup cell+ c@ $1F and <> WHILE @ dup 0= UNTIL THEN ;
! 386: Code (find-samelen)
! 387: nop nop ip@ nop br .endif
! 388: nop 0 # 0 # nop ;;
! 389: nop nop pick 0s0 nop ;;
! 390: .begin
! 391: drop drop nop nop ldb 0: s0b 4 # ;;
! 392: nop $1F # nip nop ld 2: s0b 0 # ;;
! 393: drop and 0s0 nop nop ;;
! 394: pick 2s0 sub 0s0 nop nop br 1&2 :0<> .until ;;
! 395: pick 2s1 nop pass nop br 1 ?0= ;;
! 396: drop swap ip! nop ;;
! 397: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 398: .endif
! 399: nip swap ip! nop ;;
! 400: nop ip! ip@ nop set 2: R1 ld 1: R1 N+ ;;
! 401: end-code
! 402:
! 403: \ division a/b
! 404: \ x:=a, y:=b, r:=est; iterate(x:=x*r, y:=y*r, r:=2-y*r);
! 405: \ result: x=a/b; y=1; r=1
! 406:
! 407: \ Label idiv-table
! 408: \ idiv-tab:
! 409: \ .macro .idiv-table [F]
! 410: \ $100 $80 DO 0 $100 I 2* 1+ um/mod long, drop LOOP
! 411: \ .end-macro
! 412: \ .idiv-table
! 413: \ end-code
! 414: \
! 415: \ Code um/mod1 ( u -- 1/u )
! 416: \ ;; b -- -- -- -- -- ;;
! 417: \ ff1 -$1F # nop nop br 0 :0= div0
! 418: \ bfu add 0s0 ip@ nop set 2: R2 ;;
! 419: \ ;; b' -- -- -- -- -- ;;
! 420: \ lob $0FF ## pick 0s0 pick 0s0 0 # -$108 ## ;;
! 421: \ 1 # #, sub #min 1 # ld 0: R2 +s0 #, ;;
! 422: \ cm! and nop cm! br 2 ?0= by2
! 423: \ ;; est -- -- b' -- -- ;;
! 424: \ umul 3s0 pick 0s0 nop umul 0s0 0 # 0 # ;;
! 425: \ mulr<@ nop nop -mulr@ ;;
! 426: \ drop umul 3s0 nop umul 0s0 ;;
! 427: \ mulr<@ cm! nop -mulr@ ;;
! 428: \ umul 3s0 drop pick 1s0 drop ;;
! 429: \ drop mulr<@ ip! nop 0 # ld 1: R1 N+ ;;
! 430: \ pick 1s0 drop nop nop ;;
! 431: \ by2:
! 432: \ div0:
! 433: \ -1 # ip! nop nop 0 # ld 1: R1 N+ ;;
! 434: \ nop nop nop nop ;;
! 435: \ end-code
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>