?DEF STANDARD IF FORGET STANDARD THEN : STANDARD ; : EDITOR ; : FORGET FLUSH FORGET ; BASE @ DECIMAL 1 LOAD 2 LOAD 3 LOAD 4 LOAD 5 LOAD 6 LOAD 7 LOAD 8 LOAD 9 LOAD BASE ! ;S ;S ( DEFERRED INSTRUCTION SET) CODE )! 0 S @)+ MOV, 0 ) S)+ MOV, NEXT, CODE )@ 0 S @)+ MOV, S-) 0 ) MOV, NEXT, CODE )+! 0 S)+ MOV, 1 0 ) MOV, 1 )+ S)+ MOV, 0 ) 1 MOV, NEXT, CODE )+@ 0 S)+ MOV, 1 0 ) MOV, S-) 1 )+ MOV, 0 ) 1 MOV, NEXT, CODE -)! 0 S)+ MOV, 1 0 ) MOV, 1 -) S)+ MOV, 0 ) 1 MOV, NEXT, CODE -)@ 0 S)+ MOV, 1 0 ) MOV, S-) 1 -) MOV, 0 ) 1 MOV, NEXT, ;S ( STRING OPERATIONS 1) 35 CONSTANT ^SIZE ( WORDS, INCL LENGTH) ^SIZE 1- 2* CONSTANT ^CSIZE ( CHARACTERS) -1 INTEGER ^SP 8 CONSTANT ^SPMAX ( MAX # OF STRINGS) ^SPMAX ^SIZE * ARRAY ^STACK ( STRING STACK) ( : SPA ^SIZE 2* * ^STACK + ; ( CNVT STACK PTR VAL TO ADDRESS) CODE SPA S -) ^SIZE # MOV, S ) ASL, >: * :> S ) ^STACK # ADD, NEXT, CODE ^SP@ S-) ^SP @# MOV, NEXT, : ^SP@SPA ^SP@ SPA ; : ^MOVE ^SIZE 2* BMOVE ; : ^-SP@SPA ^SP@ 1- SPA ; : SPO? ^SP@ 1+ ^SPMAX >= IF ABORT THEN ; ( ABORT ON REQ. OFLO) : SPU? ^SP@ 0 < IF -1 ^SP ! ABORT THEN ; ( ABORT ON REQ. UFLO) 0 INTEGER .P1 0 INTEGER .P2 ;S ( STRINGS 2) : ^SWAP ^-SP@SPA .P1 ! ^SP@SPA .P2 ! ^SIZE 0 DO .P1 )@ .P2 )@ .P1 )+! .P2 )+! LOOP ; : ^DROP SPU? ^SP 1-! ; : ^LEN ^SP@SPA B@ ; : ^-LEN ^-SP@SPA B@ ; : ^@ SPO? ^SP 1+! ^SP@SPA ^MOVE ; : ^DUP SPO? ^SP@SPA ^SP@ 1+ SPA ^LEN 1+ BMOVE ^SP 1+! ; : ^OVER SPO? ^-SP@SPA ^SP@ 1+ SPA ^-LEN 1+ BMOVE ^SP 1+! ; : ^! ^SP@SPA SWAP ^LEN 1+ BMOVE ^DROP ; : ^TYPE SPU? ^SP@SPA 1+ ^LEN TYPE ^DROP ; : ^C! ^SP@SPA + B! ; : ^C@ ^SP@SPA + B@ ; : ^LEN! 0 MAX 0 ^C! ; : ^-C@ ^-SP@SPA + B@ ; : ^NULL SPO? ^SP 1+! 0 ^LEN! ; CODE ^RTN S-) IC MOV, 0 \ IC ) MOV, 0 -256 # BIC, 0 2 # ADD, 0 1 # BIC, IC 0 ADD, % ^@ EXEC, NEXT, ;S ( STRINGS 3) : ^STR DELIM ! STATE @ IF % ^RTN , WORD HERE B@ 2+ -2 AND DP+! ELSE ^NULL WORD HERE ^SP@SPA HERE B@ 1+ BMOVE THEN ; : " IMMEDIATE 34 ^STR ; : (( IMMEDIATE 41 ^STR ; : ^CAT SPU? ^-LEN ^CSIZE SWAP - ^LEN MIN DUP 0 > IF DUP >R ^-SP@SPA DUP B@ 1+ + ^SP@SPA 1+ SWAP R> BMOVE ^DROP ^LEN + ^LEN! ELSE DROP ^DROP THEN ; : ^PAD ^SWAP ^LEN - DUP 0 > IF 0 DO ^OVER ^CAT LOOP ^SWAP ^DROP ELSE DROP ^SWAP ^DROP THEN ; : ^CLR -1 ^SP ! ; : ^SUBSTR OVER - 1+ OVER ^LEN 1+ SWAP - MIN DUP >R ^LEN! ^SP@SPA + ^SP@SPA 1+ R> BMOVE ; : ^LINE! SPU? " " 64 ^PAD LINE ^SP@SPA 1+ SWAP 64 BMOVE UPDATE ^DROP ; ;S ( STRINGS 4) : ^STRING ENTER ^LEN HERE ^! 2+ -2 AND DP+! ;CODE S-) IC MOV, % ^@ EXEC, SEMI, (( ) ^STRING BLANK : =STRING ^SP@SPA .P1 ! ^-SP@SPA .P2 ! 1 ^LEN 1+ 0 DO .P1 @ I + B@ .P2 @ I + B@ - IF DROP 0 TERM THEN LOOP ^DROP ^DROP ; : -SPACES 1 ^LEN DO I ^C@ 32 = I ^LEN= 0= IF TERM THEN -1 +LOOP ; : ^LINE SPO? ^SP 1+! LINE ^SP@SPA 1+ 64 ^CSIZE MIN DUP >R BMOVE R> ^LEN! -SPACES ; ;S ( STRINGS 5) : ^SUBSTR! SWAP 1- 1 SWAP ^OVER ^SUBSTR ^SWAP ^CAT ^SWAP 1+ ^CSIZE ^SUBSTR ^CAT ; : ^. CONVERT ^@ ^TYPE ; 0 INTEGER .MTCH : ^INDEX ^-LEN ^LEN - 2+ 1 DO I .MTCH ! ^LEN 1+ 1 DO I ^C@ I J + 1- ^-C@ - IF .MTCH 0SET TERM THEN LOOP .MTCH @ IF TERM THEN LOOP ^DROP ^DROP .MTCH @ ; ;S : ^INDEX ^LEN 1- 0 ^-LEN ^LEN - 2+ 1 DO ^OVER OVER I + I SWAP ^SUBSTR ^OVER =STRING IF DROP I TERM THEN LOOP SWAP DROP ^DROP ^DROP ; ( XED 1) ^CLR 12 INTEGER ERS 1 INTEGER L# : LL DUP L# ! ; : ERASE ERS 1 TYPE ; : H LL ^LINE ; : T LL ^LINE -SPACES " " ^SWAP ^CAT ^TYPE ; : R LL ^LINE! UPDATE ; : D LL DUP 16 < IF 16 SWAP DO I 1+ LINE DUP 64 - 32 MOVE LOOP ELSE DROP THEN BLANK 16 ^LINE! UPDATE ; : II LL DUP 15 DO I LINE DUP 64 + 32 MOVE -1 +LOOP 1+ R ; : HT LL ^LINE ^DUP -SPACES " " ^SWAP ^CAT ^TYPE ; : HR DUP H ^SWAP ^LINE! UPDATE ; : HD DUP DUP H 16 < IF 16 SWAP DO I 1+ LINE DUP 64 - 32 MOVE LOOP ELSE DROP THEN BLANK 16 ^LINE! UPDATE ; : HI 16 H LL DUP 15 DO I LINE DUP 64 + 32 MOVE -1 +LOOP 1+ R ; ;S ( XED 2) OCTAL CODE GCHR 1 JSW P MOV, JSW P 50100 # BIS, S -) CLR, 104340 , CC IF, S ) INC, THEN, JSW P 1 MOV, NEXT, DECIMAL : HOLD 1+ SWAP DO I ^LINE LOOP ; : UNHOLD DO I ^LINE! -1 +LOOP UPDATE ; : +B BLK 1+! ; : -B BLK 1-! ; : FND 0 17 L# @ DO DROP I L# ! I ^LINE ^OVER ^INDEX DUP IF TERM THEN LOOP DUP 0= IF " FAILED " ^TYPE THEN ^DROP ; : F BEGIN ^DUP FND DUP DUP 0= IF BLK ? CR BLK 1+! 1 L# ! THEN GCHR IF L# 0SET DROP 1 THEN END ^DROP ; : FT F IF BLK ? SPACE L# @ DUP . CR T THEN ; : L1 1 L# ! ; : LIST L1 LIST (( L# =1) ^TYPE ; : L? L# ? ; : LT L? L# @ CR T ; : BT BLK @ DUP . CR LIST ; ;S ( XED 3) : FR ^SWAP ^LEN FND DUP IF L# @ ^LINE SWAP OVER + 1- ^SWAP ^SUBSTR! L# @ ^LINE! UPDATE ELSE DROP THEN ; : FD ^NULL FR ; : FI ^SWAP ^LEN FND DUP IF L# @ ^LINE SWAP + DUP 1- ^SWAP ^SUBSTR! L# @ ^LINE! UPDATE ELSE DROP THEN ; : I II ; ;S