Annotation of gforth/arch/4stack/asm.fs, revision 1.1
1.1 ! pazsan 1: \ four stack assembler 19jan94py
! 2:
! 3: Vocabulary asm4stack
! 4: Vocabulary asmdefs
! 5:
! 6: asm4stack also asmdefs also definitions Forth
! 7:
! 8: ' asm4stack Alias [A] immediate
! 9: ' Forth Alias [F] immediate
! 10: : :A asm4stack definitions Forth ;
! 11: : :D asmdefs definitions Forth ;
! 12:
! 13: \ assembly area setup 24apr94py
! 14:
! 15: Defer '2@
! 16: Defer '2!
! 17: Defer 'c!
! 18: Defer '!
! 19: Defer 'SF!
! 20: Defer 'F!
! 21: Defer 4here
! 22: Defer 4allot
! 23:
! 24: \ frame format:
! 25: \ { target addr, target length, host addr, framelink }
! 26:
! 27: : 4there 4here ;
! 28:
! 29: : op, 4there '2! 2 cells 4allot ;
! 30: : op! '2! ;
! 31: : op@ '2@ ;
! 32: : caddr ; immediate
! 33: : waddr ; immediate
! 34: : laddr ; immediate
! 35: [THEN]
! 36:
! 37: \ instruction generation 24apr94py
! 38:
! 39: 2Variable ibuf 0. ibuf 2!
! 40: Variable instfield 0 instfield !
! 41: Variable condfield 0 condfield !
! 42: Variable lastmove 0 lastmove !
! 43:
! 44: Create instmasks $003FFFFF.FFFFFFFF , ,
! 45: $FFC00FFF.FFFFFFFF , ,
! 46: $FFFFF003.FFFFFFFF , ,
! 47: $FFFFFFFC.00FFFFFF , ,
! 48: $FFFFFFFF.FF003FFF , ,
! 49: $FFFFFFFF.FFFFC00F , ,
! 50:
! 51: : instshift ( 10bit -- 64bit )
! 52: 1 5 instfield @ - &10 * 4 + $20 /mod >r
! 53: lshift um* r> IF swap THEN ;
! 54:
! 55: : 2and ( d1 d2 -- d ) rot and -rot and swap ;
! 56: : 2or ( d1 d2 -- d ) rot or -rot or swap ;
! 57:
! 58: : !inst ( 10bit -- ) instshift
! 59: instfield @ 2* cells instmasks + 2@ ibuf 2@ 2and 2or ibuf 2!
! 60: 1 instfield +! ;
! 61:
! 62: : finish ( -- ) ibuf 2@ op,
! 63: 0 0 ibuf 2! instfield off condfield off lastmove off ;
! 64: : finish? instfield @ IF finish THEN ;
! 65: :A
! 66: : ;; ( -- ) finish? postpone \ ;
! 67: : .org ( n -- ) 4here - 4allot ;
! 68: :D
! 69:
! 70: \ checks for instruction slots 19jan94py
! 71:
! 72: : alu? ( -- flag ) instfield @ 0 4 within ;
! 73: : move? ( -- flag ) instfield @ 4 6 within
! 74: ibuf cell+ @ 3 and 1 <> and ;
! 75: : call? ( -- flag ) instfield @ 4 < ;
! 76: : br? ( -- flag ) instfield @ 5 < ;
! 77:
! 78: : ?finish ( -- ) instfield @ 6 = IF finish THEN ;
! 79:
! 80: \ automatic feed of instructions 19jan94py
! 81:
! 82: Variable lastalu
! 83: Variable lastalufield
! 84:
! 85: : !alu ( 10bit -- )
! 86: alu? 0= IF finish THEN
! 87: dup lastalu !
! 88: instfield @ lastalufield !
! 89: !inst ;
! 90:
! 91: : !data ( 10bit -- ) alu? IF 4 instfield ! THEN
! 92: move? 0= IF finish 4 instfield ! THEN
! 93: instfield @ lastmove ! !inst ;
! 94:
! 95: : !br ( 10bit likelyhood -- addr )
! 96: br? 0= abort" No Data in Branch!"
! 97: alu? IF 4 instfield ! THEN >r !inst
! 98: ibuf 2@ 2 r> 3 and 2* 2* + 0 2or ibuf 2! 4here ;
! 99: :A
! 100: : do ( -- addr ) 0 0 !br finish ;
! 101: : br ( -- addr ) $200 1 !br ;
! 102:
! 103: : br,0 ( -- addr ) $200 0 !br ;
! 104: : br,1 ( -- addr ) $200 1 !br ;
! 105:
! 106: : call ( -- addr ) call? 0= IF finish THEN
! 107: 6 instfield ! ibuf 2@ $0.00000003 2or ibuf 2! 4here ;
! 108: : jmp ( -- addr ) call? 0= IF finish THEN
! 109: 6 instfield ! ibuf 2@ $1.00000003 2or ibuf 2! 4here ;
! 110:
! 111: : calla ( -- addr ) call? 0= IF finish THEN
! 112: 6 instfield ! ibuf 2@ $2.00000003 2or ibuf 2! 4here ;
! 113: : jmpa ( -- addr ) call? 0= IF finish THEN
! 114: 6 instfield ! ibuf 2@ $3.00000003 2or ibuf 2! 4here ;
! 115: :D
! 116:
! 117: \ branch conditions 20mar94py
! 118:
! 119: Create and/or-tab
! 120: $08 c, $04 c, $02 c, $01 c,
! 121: $1C c, $1A c, $19 c, $16 c, $15 c, $13 c,
! 122: $1E c, $1D c, $1B c, $17 c,
! 123: $1F c,
! 124: $0C c, $0A c, $09 c, $06 c, $05 c, $03 c,
! 125: $0E c, $0D c, $0B c, $07 c,
! 126: $0F c,
! 127:
! 128: : >and/or ( n -- stacks ) and/or-tab + c@ ;
! 129:
! 130: : constants 0 ?DO constant LOOP ;
! 131:
! 132: :A
! 133: hex
! 134: 9 8 7 6 5 4 6 constants 0&1 0&2 0&3 1&2 1&3 2&3
! 135: D C B A 4 constants 0&1&2 0&1&3 0&2&3 1&2&3
! 136: E constant 0&1&2&3
! 137:
! 138: 14 13 12 11 10 F 6 constants 0|1 0|2 0|3 1|2 1|3 2|3
! 139: 18 17 16 15 4 constants 0|1|2 0|1|3 0|2|3 1|2|3
! 140: 19 constant 0|1|2|3
! 141: decimal
! 142: :D
! 143:
! 144: \ branch conditions 20mar94py
! 145:
! 146: Create condmasks $FF07FFFF ,
! 147: $FFF83FFF ,
! 148: $FFFFC1FF ,
! 149: $FFFFFE0F ,
! 150:
! 151: : !cond ( n -- ) condfield @ 3 > abort" too much conds!"
! 152: $1F and 3 condfield @ - 5 * 4 + lshift
! 153: ibuf cell+ @ condmasks condfield @ cells + @ and or
! 154: ibuf cell+ ! 1 condfield +!
! 155: condfield @ 2/ 4 + instfield ! ;
! 156:
! 157: \ branch conditions 20mar94py
! 158:
! 159: : brcond ( n flag -- ) swap >and/or !cond !cond ;
! 160:
! 161: : cond: ( n -- ) Create ,
! 162: DOES> ( n/ -- ) @ ibuf cell+ @ 3 and
! 163: dup 2 = IF drop condfield @ dup 0=
! 164: IF drop brcond EXIT THEN
! 165: ELSE dup 0=
! 166: IF 1 ibuf cell+ +!
! 167: ELSE 1 <> THEN THEN
! 168: abort" Misplaced condition" !cond ;
! 169:
! 170: : conds: ( end start -- ) DO I cond: LOOP ;
! 171:
! 172: :A
! 173: $08 $00 conds: :t :0= :0< :ov :u< :u> :< :>
! 174: $10 $08 conds: :f :0<> :0>= :no :u>= :u<= :>= :<=
! 175: $18 $10 conds: ?t ?0= ?0< ?ov ?u< ?u> ?< ?>
! 176: $20 $18 conds: ?f ?0<> ?0>= ?no ?u>= ?u<= ?>= ?<=
! 177: :D
! 178:
! 179: \ loop/branch resolve 19mar94py
! 180:
! 181: : resolve! ( dist addr -- )
! 182: >r r@ op@ drop 3 and
! 183: dup 2 = IF drop $3FF8 and 0 ELSE
! 184: dup 3 = IF drop -8 and 0
! 185: r@ op@ nip 2 and IF swap r@ 8 + + swap THEN
! 186: ELSE true abort" No Jump!" THEN THEN
! 187: r@ op@ 2or r> op! ;
! 188:
! 189: :A
! 190: : .loop ( addr -- ) finish? dup >r 4here swap - 8 -
! 191: dup $2000 u>= abort" LOOP out of range!" r> resolve! ;
! 192: : .endif ( addr -- ) finish? dup >r 4here swap - 8 -
! 193: dup $1000 -$1000 within abort" BR out of range!"
! 194: r> resolve! ;
! 195:
! 196: : .begin ( -- addr ) finish? 4here ;
! 197: : .until ( addr1 addr2 -- ) finish? dup >r - 8 -
! 198: dup $1000 -$1000 within abort" BR out of range! "
! 199: r> resolve! ;
! 200:
! 201: : +IP ( addr1 rel -- ) finish? 8 * swap resolve! ;
! 202: : >IP ( addr1 addr -- ) finish? over 8 + - swap resolve! ;
! 203: :D
! 204:
! 205: \ labels 23may94py
! 206:
! 207: Vocabulary symbols
! 208: : symbols[ symbols definitions ;
! 209: : symbols] forth definitions ;
! 210:
! 211: Create makesym" ," label: " here $40 allot AConstant symname
! 212:
! 213: : sym-lookup? ( addr len -- xt/0 )
! 214: [ ' symbols >body ] ALiteral search-wordlist
! 215: 0= IF 0 THEN ;
! 216: : >sym" ( addr len -- ) symname swap move ;
! 217: : sym, ( addr len -- addr ) drop ;
! 218: \ symframe cell+ 2@ + swap ( --> addr target len )
! 219: \ 2dup aligned dup cell+ symframe cell+ +!
! 220: \ 2dup + >r cell+ erase move r> ( --> addr ) ;
! 221: : symbol, ( addr len -- xt ) dup >r
! 222: 2dup >sym" sym,
! 223: also asmdefs makesym" count r> + evaluate previous ;
! 224: : label: ( addr -- xt )
! 225: symbols[ Create symbols] 0 A, , lastxt
! 226: DOES> ( addr -- ) dup cell+ @ @ dup
! 227: IF nip >IP EXIT THEN
! 228: drop dup @ here rot ! A, , ;
! 229: : reveal: ( addr xt -- ) >body 2dup cell+ @ !
! 230: BEGIN @ dup WHILE
! 231: 2dup cell+ @ swap >IP REPEAT 2drop ;
! 232: :A
! 233: : .globl ( -- ) 0 bl word count symbol, ;
! 234: :D
! 235:
! 236: : is-label? ( addr u -- flag ) drop c@ '@ >= ;
! 237: : ?label ( addr u -- )
! 238: 2dup is-label?
! 239: IF 2dup 1- + c@ ': = dup >r +
! 240: 2dup sym-lookup? dup 0=
! 241: IF drop symbol, ELSE nip nip THEN
! 242: r@ IF finish? 4here over reveal: THEN
! 243: r> 0= IF execute ELSE drop THEN EXIT
! 244: THEN
! 245: defers interpreter-notfound ;
! 246:
! 247: \ >call 09sep94py
! 248:
! 249: : >call call? 0= IF finish THEN 3 instfield ! ;
! 250:
! 251: \ simple instructions 19jan94py
! 252:
! 253: : alu: ( 10bit -- ) Create , DOES> @ !alu ;
! 254:
! 255: : readword ( -- )
! 256: BEGIN >in @ bl word count dup 0=
! 257: WHILE refill 2drop 2drop REPEAT 2drop >in ! ;
! 258:
! 259: : alus: ( start end step -- ) -rot swap
! 260: ?DO readword I alu:
! 261: \ s" --" compare
! 262: \ IF >in ! I alu: ELSE drop THEN
! 263: dup +LOOP drop ;
! 264:
! 265: :A
! 266: %0000001001 %0110001001 %100000
! 267: alus: or add addc mul
! 268: and sub subc umul
! 269: xor subr subcr pass
! 270:
! 271: \ s1p is default
! 272:
! 273: \ mul@ 19jan94py
! 274:
! 275: %0110100000 %0110110000 1
! 276: alus: mul@ mul<@ mulr@ mulr<@
! 277: -mul@ -mul<@ -mulr@ -mulr<@
! 278: mul@+ mul<@+ mulr@+ mulr<@+
! 279: -mul@+ -mul<@+ -mulr@+ -mulr<@+
! 280:
! 281: \ flag generation 19jan94py
! 282:
! 283: %0110110000 %0111000000 1
! 284: alus: t 0= 0< ov u< u> < >
! 285: f 0<> 0>= no u>= u<= >= <=
! 286:
! 287: \ T4 19jan94py
! 288:
! 289: %0111000000 %0111100000 1
! 290: alus: asr lsr ror rorc asl lsl rol rolc
! 291: ff1 popc lob loh extb exth hib hih
! 292: sp@ loops@ loope@ ip@ sr@ cm@ index@ flatch@
! 293: sp! loops! loope! ip! sr! cm! index! flatch!
! 294:
! 295: \ T5, floating point: 19jan94py
! 296:
! 297: %0111100000 %0111110000 1
! 298: alus: fadd fsub fmul fnmul
! 299: faddadd faddsub fmuladd fmulsub
! 300: fi2f fni2f fadd@ fmul@
! 301: fs2d fd2s fxtract fiscale
! 302:
! 303: \ %0111110000 %0111110100 1
! 304: \ alus: ext extu mak clr
! 305:
! 306: %0111110000 %0111110010 1 alus: bfu bfs
! 307: %0111110100 %0111110110 1 alus: cc@ cc!
! 308:
! 309: %0111111000 %1000000000 1
! 310: alus: px1 px2 px4 px8
! 311: pp1 pp2 pp4 pp8
! 312: :D
! 313:
! 314: \ Stack effects 19jan94py
! 315:
! 316: : >curstack ( 5bit -- 5bit ) lastalufield @ 2* 2* xor ;
! 317:
! 318: : >stack ( alu -- ) lastalufield @
! 319: dup 1+ instfield @ <> ABORT" Spurious stack address!"
! 320: instfield ! !alu ;
! 321:
! 322: \ pick and pin 21jan94py
! 323:
! 324: : pin, ( 5bit -- ) dup %10000 and
! 325: IF >curstack dup %11 and swap %01100 and
! 326: ELSE dup %11 and %100 + swap %10000 %01100 within
! 327: THEN ABORT" Only current stack!"
! 328: %0110000000 or >stack ;
! 329:
! 330: : pick, ( 5bit -- )
! 331: dup %00000 %00100 within ABORT" No constant"
! 332: %0110000000 or >stack ;
! 333:
! 334: :A
! 335: %0110000000 alu: pin
! 336:
! 337: : pick ( -- )
! 338: alu? 0= IF finish THEN
! 339: instfield @ lastalufield ! %0110010000 >curstack !alu ;
! 340: :D
! 341:
! 342: \ Stack addresses 21jan94py
! 343:
! 344: : !stack ( 5bit -- )
! 345: lastalu @ %0110000000 = IF pin, EXIT THEN
! 346: lastalu @ %0110010000 >curstack = IF pick, EXIT THEN
! 347: lastalu @ %11111 and %01001 <> ABORT" Only one address!"
! 348: lastalu @ %1111100000 and or
! 349: dup %0110000000 u>= ABORT" no ALU instruction!" >stack ;
! 350:
! 351: : stack: ( 5bit -- ) Create , DOES> @ !stack ;
! 352:
! 353: : stacks: ( n -- )
! 354: 0 ?DO readword I stack: LOOP ;
! 355:
! 356: :A
! 357: $20 stacks: #0 #-1 #$7FFFFFFF #$80000000
! 358: c0 c1 c2 c3
! 359: s0p s1p s2p s3p
! 360: s4 s5 s6 s7
! 361: 0s0 0s1 0s2 0s3
! 362: 1s0 1s1 1s2 1s3
! 363: 2s0 2s1 2s2 2s3
! 364: 3s0 3s1 3s2 3s3
! 365: :D
! 366:
! 367: \ relativ to current stack 21jan94py
! 368:
! 369: : curstack: ( 5bit -- )
! 370: Create , DOES> @ >curstack !stack ;
! 371:
! 372: :A
! 373: %10000 curstack: s0
! 374: %10001 curstack: s1
! 375: %10010 curstack: s2
! 376: %10011 curstack: s3
! 377:
! 378: \ Abbrevations 21jan94py
! 379:
! 380: ' #$7FFFFFFF Alias #max
! 381: ' #$80000000 Alias #min
! 382:
! 383: \ FP abbrevations 21jan94py
! 384:
! 385: [A]
! 386: : fabs and #max ;
! 387: : fneg xor #min ;
! 388: : f2* add c3 ;
! 389: : f2/ sub c3 ;
! 390:
! 391: \ ALU abbrevations 21jan94py
! 392:
! 393: : nop or #0 ;
! 394: : not xor #-1 ;
! 395: : neg subr #0 ;
! 396: : inc sub #-1 ;
! 397: : dec add #-1 ;
! 398:
! 399: \ Stack abbrevations 21jan94py
! 400:
! 401: : dup pick s0 ;
! 402: : over pick s1 ;
! 403: : swap pick s1p ;
! 404: : rot pick s2p ;
! 405: : drop pin s0 ;
! 406: : nip pin s1 ;
! 407:
! 408: \ ret 19mar94py
! 409:
! 410: : ret ( -- ) >call ip! ;
! 411:
! 412: [F]
! 413: :D
! 414:
! 415: \ Literals 21mar94py
! 416:
! 417: : !a/d ( 10bit -- ) ?finish
! 418: alu? IF $200 or !alu ELSE !data THEN ;
! 419: Create lits 0. 2, 0. 2, 0. 2, 0. 2, 0. 2, 0. 2,
! 420:
! 421: :A
! 422: : # ( 8bit -- ) dup $80 -$80 within abort" out of range"
! 423: $FF and !a/d ;
! 424: : #< ( 8bit -- ) dup $100 0 within abort" out of range"
! 425: $100 or !a/d ;
! 426:
! 427: : ## ( 32bit -- ) ?finish 3
! 428: BEGIN over $FF800000 and dup $FF800000 = swap 0= or WHILE
! 429: 1- swap 8 lshift swap dup 0= UNTIL THEN
! 430: swap $100 um* dup $80 and negate or >r
! 431: swap lits instfield @ 2* cells + 2! r> [A] # [F] ;
! 432:
! 433: : #, ( -- ) ?finish lits instfield @ 2* cells + dup 2@ dup 0>
! 434: IF over 0= alu? and
! 435: IF dup 3 = IF hib 2drop 0 0 rot 2! EXIT THEN
! 436: dup 2 = IF hih 2drop 0 0 rot 2! EXIT THEN THEN
! 437: 1- >r $100 um* #< r> rot 2!
! 438: ELSE 2drop drop alu? IF nop ELSE 0 # THEN THEN ;
! 439: :D
! 440:
! 441: : >ip.b ( -- )
! 442: bl word count sym-lookup? dup 0= abort" No symbol!"
! 443: >body cell+ @ @ 4here 2 cells + - ;
! 444: :A
! 445: : .ip.b# ( -- ) >ip.b [A] # [F] ;
! 446: : .ip.h# ( -- ) >ip.b 2/ [A] # [F] ;
! 447: : .ip.w# ( -- ) >ip.b 2/ 2/ [A] # [F] ;
! 448: : .ip.2# ( -- ) >ip.b 2/ 2/ 2/ [A] # [F] ;
! 449: : .ip.4# ( -- ) >ip.b 2/ 2/ 2/ 1+ 2/ [A] # [F] ;
! 450: ' .ip.2# alias .ip.d#
! 451: ' .ip.2# alias .ip.f#
! 452: ' .ip.4# alias .ip.q#
! 453: ' .ip.4# alias .ip.2f#
! 454: :D
! 455: Variable procstart
! 456: : >p.b ( -- )
! 457: bl word count sym-lookup? dup 0= abort" No symbol!"
! 458: >body cell+ @ @ procstart @ - ;
! 459: :A
! 460: : .proc finish? 4here procstart ! ;
! 461: : .p ( -- n ) >p.b ;
! 462: : .p.b# ( -- ) >p.b [A] # [F] ;
! 463: : .p.h# ( -- ) >p.b 2/ [A] # [F] ;
! 464: : .p.w# ( -- ) >p.b 2/ 2/ [A] # [F] ;
! 465: : .p.2# ( -- ) >p.b 2/ 2/ 2/ [A] # [F] ;
! 466: : .p.4# ( -- ) >p.b 2/ 2/ 2/ 2/ [A] # [F] ;
! 467: ' .p.2# alias .p.d#
! 468: ' .p.2# alias .p.f#
! 469: ' .p.4# alias .p.q#
! 470: ' .p.4# alias .p.2f#
! 471: : .p.b## ( -- ) >p.b [A] ## [F] ;
! 472: : .p.h## ( -- ) >p.b 2/ [A] ## [F] ;
! 473: : .p.w## ( -- ) >p.b 2/ 2/ [A] ## [F] ;
! 474: : .p.2## ( -- ) >p.b 2/ 2/ 2/ [A] ## [F] ;
! 475: : .p.4## ( -- ) >p.b 2/ 2/ 2/ 2/ [A] ## [F] ;
! 476: ' .p.2## alias .p.d##
! 477: ' .p.2## alias .p.f##
! 478: ' .p.4## alias .p.q##
! 479: ' .p.4## alias .p.2f##
! 480: :D
! 481:
! 482: \ data instructions 20mar94py
! 483:
! 484: : cu ( -- n ) instfield @ 1- 1 and IF 4 ELSE 8 THEN ;
! 485: : move: ( n -- ) Create ,
! 486: DOES> @ !data cu ibuf cell+ tuck @ or swap ! ;
! 487: : moves: -rot ?DO I move: dup +LOOP drop ;
! 488:
! 489: :A
! 490: %0010000000 %0000000000 %100000 moves: ldb ldh ld ld2
! 491: %1010000000 %1000000000 %100000 moves: stb sth st st2
! 492:
! 493: ' ld2 Alias ldf
! 494: ' ld2 Alias ldq
! 495: ' st2 Alias stf
! 496: ' st2 Alias stq
! 497: :D
! 498:
! 499: \ data instructions 22mar94py
! 500:
! 501: : ua: ( n -- ) Create , DOES> @ !data ;
! 502: : uas: ( e s i -- ) -rot ?DO i ua: dup +LOOP drop ;
! 503:
! 504: :A
! 505: %1000010000 %1000000000 %100 uas: R0= R1= R2= R3=
! 506: %1001000000 ua: get
! 507: %1001010000 ua: set
! 508: %1001100000 ua: getd
! 509: %1001110000 ua: setd
! 510:
! 511: %1010010000 %1010000000 %100 uas: ccheck cclr cstore cflush
! 512: %1010100000 %1010010100 %100 uas: cload calloc cxlock
! 513:
! 514: %1010011000 %1010010000 %100 uas: mccheck mdcheck
! 515: %1010011100 %1010011000 %001 uas: mcget mcset mchif mclof
! 516: %1010100000 %1010011100 %001 uas: mdget mdset mdhif mdlof
! 517:
! 518: %1011100000 %1011000000 %100 uas: inb inh in ind outb outh out outd
! 519: %1011000011 %1011000001 %1 uas: inq ins
! 520:
! 521: %1011100100 %1011100000 %1 uas: =c0 =c1 =c2 =c3
! 522:
! 523: %1011101000 ua: geta
! 524: %1011111000 ua: seta
! 525: %1011101100 ua: getdrn
! 526: %1011111100 ua: setdrn
! 527: %1111101100 ua: getdmf
! 528: %1111111100 ua: setdmf
! 529:
! 530: %1011100100 ua: getc
! 531: %1011110100 ua: setc
! 532: %1011100101 ua: stop
! 533: %1011110101 ua: restart
! 534: %1011100110 ua: stop1
! 535: %1011110110 ua: restart1
! 536: %1011100111 ua: halt
! 537:
! 538: :D
! 539:
! 540: \ data instructions 20mar94py
! 541:
! 542: : |inst ( 10bit n -- )
! 543: dup 0= abort" Only after moves!"
! 544: instfield @ >r instfield !
! 545: instshift ibuf 2@ 2or ibuf 2! r> instfield ! ;
! 546: : mode: Create , DOES> @ lastmove @ |inst ;
! 547:
! 548: : modes: DO I mode: 4 +LOOP ;
! 549: : regs: DO I mode: LOOP ;
! 550:
! 551: :A
! 552: $10 $04 modes: +N N+ +N+
! 553: $20 $14 modes: +s0 s0+ +s0+
! 554:
! 555: $10 $00 regs: R0 R1 R2 R3 N0 N1 N2 N3 L0 L1 L2 L3 F0 F1 F2 F3
! 556: $14 $10 regs: ip s0b ip+s0 s0l
! 557: :D
! 558:
! 559: \ data instructions 22mar94py
! 560:
! 561: : ua-only true abort" Only for update!" ;
! 562: : umode: >in @ >r name sfind r> >in ! Create
! 563: 0= IF ['] ua-only THEN swap , ,
! 564: DOES> dup @ lastmove @ 1 and IF 4 ELSE 8 THEN
! 565: ibuf cell+ @ and IF drop cell+ @ execute EXIT THEN
! 566: lastmove @ |inst drop ;
! 567:
! 568: :A
! 569: %0100000000 umode: +N
! 570: %0000010000 umode: +s0
! 571: %0000100000 umode: -N
! 572: %0000110000 umode: -s0
! 573: :D
! 574:
! 575: \ data instructions 20mar94py
! 576:
! 577: : stevnop: ( n -- ) Create ,
! 578: DOES> @ lastmove @ 4 <> abort" Only even stacks!" 4 |inst ;
! 579: : stoddop: ( n -- ) Create ,
! 580: DOES> @ lastmove @ 5 <> abort" Only odd stacks!" 5 |inst ;
! 581:
! 582: : stevnops: ( end start disp -- ) -rot
! 583: DO I stevnop: dup +LOOP drop ;
! 584: : stoddops: ( end start disp -- ) -rot
! 585: DO I stoddop: dup +LOOP drop ;
! 586:
! 587: :A
! 588: %1000000000 %0000000000 %0010000000 stevnops: 0: 0&2: 2: 2&0:
! 589: %1000000000 %0000000000 %0010000000 stoddops: 1: 1&3: 3: 3&1:
! 590: :D
! 591:
! 592: \ data definition instructions 24apr94py
! 593:
! 594: Defer normal-mode
! 595: Defer char-mode
! 596:
! 597: : number-mode ( n dest char -- n' dest' )
! 598: \ ." Number: " dup emit cr
! 599: dup toupper digit?
! 600: IF nip rot base @ * + dup $10000 >=
! 601: IF normal-mode $100 THEN swap EXIT THEN
! 602: >r tuck caddr 'c! 1+ $100 swap r> normal-mode ;
! 603:
! 604: : esc-mode ( dest char -- dest' )
! 605: \ ." Escape: " dup emit cr
! 606: dup 'n = IF drop #lf normal-mode EXIT THEN
! 607: dup 't = IF drop #tab normal-mode EXIT THEN
! 608: dup 'x = IF drop hex ['] number-mode IS char-mode EXIT THEN
! 609: dup '0 '8 within
! 610: IF 8 base ! ['] number-mode IS char-mode char-mode EXIT THEN
! 611: $100 + normal-mode ;
! 612:
! 613: : (normal-mode) ( dest char -- dest' )
! 614: \ ." Char : " dup emit cr
! 615: dup '\ = IF drop ['] esc-mode IS char-mode EXIT THEN
! 616: over caddr 'c! 1+ ['] normal-mode IS char-mode ;
! 617: ' (normal-mode) IS normal-mode
! 618:
! 619: : \move ( addr len dest -- dest+n )
! 620: base @ >r ['] normal-mode IS char-mode
! 621: $100 swap 2swap bounds ?DO I c@ char-mode LOOP
! 622: over $FF and 0> IF tuck caddr 'c! 1+ ELSE nip THEN
! 623: r> base ! ;
! 624:
! 625: : byte, 4there caddr 'c! 1 4allot ;
! 626: : short, $100 /mod 4there waddr 'c!
! 627: 4there waddr 1+ 'c! 2 4allot ;
! 628: : int, 4there laddr '! 1 cells 4allot ;
! 629: : long, 4there laddr '! 1 cells 4allot ;
! 630: : quad, op, ;
! 631: \ : float, 4there laddr 'SF! 1 cells 4allot ;
! 632: \ : double, 4there 'F! 1 floats 4allot ;
! 633:
! 634: : ascii, 4there \move 4there - 4allot ;
! 635:
! 636: :A
! 637: : .align ( "n[,m]" -- ) 0 0 name >number
! 638: dup IF over c@ ', =
! 639: IF 1 /string parser 0 0 THEN THEN
! 640: 2drop 1 rot lshift 4here over 1- >r - r> and
! 641: 0 ?DO dup 4there caddr 'c! 1 4allot LOOP drop ;
! 642:
! 643: : .( ') parse also Forth evaluate previous ;
! 644:
! 645: : .byte name parser byte, ;
! 646: : .short name parser short, ;
! 647: : .int name parser int, ;
! 648: : .long name parser long, ;
! 649: : .quad name s>number dpl @ 0= abort" Not a number" quad, ;
! 650: \ : .float name >float 0= abort" Not a FP number" float, ;
! 651: \ : .double name >float 0= abort" Not a FP number" double, ;
! 652:
! 653: : .ascii '" parse 2drop
! 654: source >in @ /string over swap
! 655: BEGIN '" scan over 1- c@ '\ = over 0<> and WHILE
! 656: 1 /string REPEAT >r
! 657: over - dup r> IF 1+ THEN >in +! ascii, ;
! 658:
! 659: : .macro finish? also asmdefs also asm4stack definitions
! 660: : ;
! 661: : .end-macro postpone ; previous previous ; immediate restrict
! 662:
! 663: : .include include ;
! 664:
! 665: : .times{ ( n -- input n )
! 666: dup >r 1 > IF save-input THEN r> ;
! 667: : .}times ( input n -- input n-1 / 1 / )
! 668: 1- dup 0>
! 669: IF >r restore-input throw r@ 1 >
! 670: IF save-input THEN r>
! 671: THEN ;
! 672: :D
! 673:
! 674: \ save assembler output 25apr94py
! 675:
! 676: : (fdump ( handle link -- ) 2dup >r swap
! 677: 3 cells + @ dup IF recurse ELSE 2drop THEN
! 678: r@ cell+ @ 0= IF rdrop drop EXIT THEN
! 679: \ cr ." Writing " r@ @ . ." len " r@ cell+ @ .
! 680: r@ cell+ @ 7 + -8 and r@ cell+ !
! 681: r@ 2 cells 2 pick write-file throw
! 682: r@ cell+ cell+ @ dup 7 and 2 = IF 2drop rdrop EXIT THEN
! 683: r> cell+ @ rot write-file throw ;
! 684:
! 685: Create 4magic ," 4stack00"
! 686:
! 687: \ end of assembler
! 688:
! 689: Variable old-notfound
! 690:
! 691: :A
! 692: : F' ' ;
! 693:
! 694: also Forth definitions
! 695:
! 696: : (code)
! 697: also asm4stack also
! 698: s" F' 2@ F' 2! F' c! F' ! F' here F' allot" evaluate
! 699: IS 4allot IS 4here IS '! IS 'c! IS '2! IS '2@
! 700: What's interpreter-notfound old-notfound !
! 701: ['] ?label IS interpreter-notfound ;
! 702: : label (code) 4here label: drop asm4stack depth ;
! 703: : (end-code) previous previous old-notfound @ IS interpreter-notfound ;
! 704:
! 705: previous previous previous Forth
! 706:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>