Advertisement
Guest User

Untitled

a guest
Feb 1st, 2021
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.50 KB | None | 0 0
  1. Tcl" append_word 0" \ jump
  2. Tcl" append_word 0" \ cursor_x
  3. Tcl" append_word 0" \ cursor_y
  4. Tcl" append_word 0" \ first_line
  5.  
  6. : 2DUP OVER OVER ;
  7. : 2DROP DROP DROP ;
  8. : ROT >R SWAP R> SWAP ;
  9. : -ROT ROT ROT ;
  10. : 2SWAP ROT >R ROT R> ;
  11.  
  12. \ =================================================================
  13. \ Сравнение.
  14. \ =================================================================
  15. : 0= 0 = ;
  16. : 0< 0 < ;
  17. : <> = NOT ;
  18.  
  19. \ =================================================================
  20. \ Арифметические и логические операции.
  21. \ =================================================================
  22. : NEGATE NOT 1 + ;
  23. : - NEGATE + ;
  24. : 1+ 1 + ;
  25. : ABS DUP 0< IF NEGATE THEN ;
  26.  
  27. : XOR
  28. 2DUP NOT AND
  29. -ROT SWAP NOT
  30. AND OR
  31. ;
  32.  
  33. : MIN
  34. 2DUP < IF DROP EXIT THEN
  35. NIP
  36. ;
  37.  
  38. : MAX
  39. 2DUP < IF NIP EXIT THEN
  40. DROP
  41. ;
  42.  
  43. : UMUL
  44. 0
  45. BEGIN
  46. OVER
  47. WHILE
  48. OVER 1 AND
  49. IF
  50. ROT SWAP
  51. OVER +
  52. ROT SWAP
  53. THEN
  54. ROT 1<<
  55. ROT 1>>
  56. ROT
  57. REPEAT
  58. NIP NIP
  59. ;
  60.  
  61. : *
  62. 2DUP 0< SWAP 0< XOR
  63. ROT ABS ROT ABS UMUL
  64. SWAP IF NEGATE THEN
  65. ;
  66.  
  67. \ n1 n2 -- n3 n4
  68. \ n1 - делимое, n2 - делитель, n3 - остаток, n4 - частное.
  69. : U/MOD
  70. DUP 0= IF 2DROP 0 0 EXIT THEN
  71. 1
  72. BEGIN
  73. -ROT DUP 0x8000 AND 0=
  74. WHILE
  75. 1<< ROT 1<<
  76. REPEAT
  77. ROT 0 SWAP
  78. BEGIN
  79. DUP
  80. WHILE
  81. 2SWAP
  82. 2DUP U< NOT IF
  83. SWAP OVER -
  84. SWAP 2SWAP SWAP OVER +
  85. SWAP 2SWAP
  86. THEN
  87. 1>> 2SWAP 1>>
  88. REPEAT
  89. DROP NIP
  90. ;
  91.  
  92. : /
  93. 2DUP 0< SWAP 0< XOR
  94. ROT ABS ROT ABS U/MOD
  95. NIP SWAP IF NEGATE THEN
  96. ;
  97.  
  98. : C@
  99. DUP 1 AND IF
  100. A@ swap_bytes 0xFF AND EXIT
  101. THEN
  102. A@ 0xFF AND
  103. ;
  104.  
  105. : C!
  106. DUP 1 AND IF
  107. DUP A@ 0xFF AND
  108. ROT 0xFF AND swap_bytes
  109. OR SWAP A! EXIT
  110. THEN
  111. DUP A@ 0xFF00 AND
  112. ROT 0xFF AND
  113. OR SWAP A!
  114. ;
  115.  
  116. : @
  117. DUP 1 AND IF
  118. DUP 1+ A@
  119. 0xFF AND swap_bytes SWAP
  120. A@ swap_bytes 0xFF AND OR
  121. ELSE
  122. A@
  123. THEN
  124. ;
  125.  
  126. : !
  127. DUP 1 AND IF
  128. 2DUP C! 1+
  129. SWAP swap_bytes SWAP C!
  130. ELSE
  131. A!
  132. THEN
  133. ;
  134.  
  135. : +!
  136. SWAP OVER @
  137. + SWAP !
  138. ;
  139.  
  140. : -!
  141. SWAP OVER @
  142. - SWAP !
  143. ;
  144.  
  145. \ =================================================================
  146. \ Системные переменные.
  147. \ =================================================================
  148. : BASE 0 Tcl" append_word 10" ; IMMEDIATE
  149. : HERE 0 0 ; IMMEDIATE
  150. : STATE 0 Tcl" append_word 0" ; IMMEDIATE
  151. : LAST 0 0 ; IMMEDIATE
  152.  
  153. \ =================================================================
  154. \ Операции со строками.
  155. \ =================================================================
  156.  
  157. : STRCMP
  158. BEGIN
  159. 2DUP C@ SWAP C@ =
  160. WHILE
  161. DUP C@ 0= IF 2DROP 0xFFFF EXIT THEN
  162. 1+ SWAP 1+
  163. REPEAT
  164. 2DROP 0
  165. ;
  166.  
  167. Tcl" for {set i 0} {$i < 10} {incr i} {append_word 10}"
  168. Tcl" set uitoa_buf [here]"
  169. Tcl" append_word 0"
  170. : UITOA
  171. Tcl" compile_literal $uitoa_buf"
  172. SWAP
  173. BEGIN
  174. Tcl" compile_literal [expr {$dict(BASE) + 2}]"
  175. A@ U/MOD -ROT
  176. DUP 10 U< NOT IF 7 + THEN 48 +
  177. OVER C! 1- SWAP
  178. DUP 0=
  179. UNTIL
  180. DROP 1+
  181. ;
  182.  
  183. : ITOA
  184. DUP 0< IF
  185. NEGATE UITOA 1- DUP 45 SWAP C! ;
  186. THEN
  187. UITOA
  188. ;
  189.  
  190. \ Преобразование кода одного символа в число.
  191. \ Если код не соответствует никакому числу, то вернет -1.
  192. : (UATOI)
  193. DUP DUP 2DUP
  194. 48 U< NOT SWAP 58 U< AND
  195. -ROT \ n f n n
  196. 65 U< NOT SWAP 71 U< AND
  197. OR IF
  198. 48 -
  199. DUP 10 U< NOT IF 7 - THEN
  200. DUP Tcl" compile_literal [expr {$dict(BASE) + 2}]"
  201. A@ U< IF EXIT THEN
  202. THEN
  203. DROP -1
  204. ;
  205.  
  206. : UATOI
  207. 0 \ addr n1
  208. BEGIN
  209. OVER C@ (UATOI) DUP \ addr n1 n n
  210. -1 <> \ addr n1 n f
  211. WHILE \ addr n1 n
  212. \ (.") Tcl" compile_string {test1: }" 2DUP . . CR CR
  213. SWAP \ addr n n1
  214. Tcl" compile_literal [expr {$dict(BASE) + 2}]"
  215. A@
  216. \ (.") Tcl" compile_string {test2: }" 2DUP . . CR CR
  217. UMUL
  218. + \ addr n1
  219. SWAP 1+ SWAP
  220. REPEAT \ addr n1 n
  221. DROP NIP
  222. ;
  223.  
  224. : ATOI
  225. DUP C@ 0x2D = IF
  226. 1+ UATOI NEGATE EXIT
  227. THEN
  228. UATOI
  229. ;
  230.  
  231. : ISUNUM C@ (UATOI) -1 = NOT ;
  232. : ISNUM DUP C@ 0x2D = IF 1+ THEN ISUNUM ;
  233.  
  234. \ Вычисление длины строки (без терминирующего нулевого байта).
  235. : STRLEN
  236. 0
  237. BEGIN
  238. SWAP DUP C@
  239. WHILE
  240. 1+ SWAP 1+
  241. REPEAT
  242. DROP
  243. ;
  244.  
  245. \ =================================================================
  246. \ Ввод/вывод.
  247. \ =================================================================
  248. : AT-XY
  249. DUP 4 A! 0x6604 A!
  250. DUP 2 A! 0x6602 A!
  251. ;
  252.  
  253. : SCROLL
  254. 6 A@ 1 +
  255. DUP 75 = IF
  256. DROP 0
  257. THEN
  258. DUP 0x6600 A!
  259. DUP 6 A!
  260. \ Определение номера нижней строки.
  261. DUP IF
  262. 1-
  263. ELSE
  264. DROP 74
  265. THEN
  266. \ В стеке - номер нижней строки.
  267. \ 128 * 0x4000 +
  268. swap_bytes 1>> 0x3F80 AND
  269. 0x3FFF +
  270. \ Заполнение нижней строки пробелами.
  271. 100 BEGIN
  272. OVER OVER +
  273. 0x20 SWAP A!
  274. 1- DUP 0 =
  275. UNTIL
  276. DROP DROP
  277. ;
  278.  
  279. : CR
  280. 4 A@ 74 = IF
  281. 0 74 AT-XY SCROLL EXIT
  282. THEN
  283. 0 4 A@ 1+ AT-XY
  284. ;
  285.  
  286. : EMIT
  287. 4 A@ 6 A@ +
  288. 74 OVER < IF -75 + THEN \ если 4 + 6 > 74, то отнять 75.
  289. swap_bytes 1>> \ 7 <<
  290. 0x3F80 AND
  291. 2 A@
  292. + 0x4000 + A!
  293. \ Если 2 = 99, то вызвать cr.
  294. 2 A@
  295. 99 = IF CR EXIT THEN
  296. 2 A@ 1+ 4 A@ AT-XY
  297. ;
  298.  
  299. : SPACE 0x20 EMIT ;
  300.  
  301. : BS
  302. 2 A@ \ cursor_x
  303. DUP IF
  304. 1-
  305. 4 A@ \ cursor_x
  306. OVER OVER AT-XY SPACE AT-XY
  307. ELSE
  308. DROP
  309. THEN
  310. ;
  311.  
  312. : TYPE
  313. BEGIN
  314. DUP C@ DUP
  315. WHILE
  316. EMIT 1+
  317. REPEAT
  318. 2DROP
  319. ;
  320.  
  321. \ 0x7000 - Указатель начала очереди. Чтение и запись.
  322. \ 0x7002 - Указатель конца очереди. Только чтение.
  323. \ 0x7004 - Значение клавиши в начале очереди. Только чтение.
  324. : KEY
  325. BEGIN
  326. 0x7000 A@ 0x7002 A@ OVER =
  327. WHILE
  328. DROP
  329. REPEAT
  330. 1+ 0x7000 A!
  331. 0x7004 A@
  332. ;
  333.  
  334. : KEY?
  335. 0x7000 A@ 0x7002 A@ = NOT
  336. ;
  337.  
  338. : ACCEPT
  339. OVER + 1- OVER
  340. BEGIN
  341. KEY
  342. DUP 0x0D = IF
  343. \ Была нажата клавиша Enter.
  344. DROP 0 SWAP C!
  345. DROP EXIT
  346. THEN
  347. DUP 0x08 = IF
  348. \ Была нажата клавиша backspace.
  349. DROP ROT
  350. 2DUP = IF
  351. -ROT
  352. ELSE
  353. -ROT 1- BS
  354. THEN
  355. ELSE
  356. -ROT 2DUP = IF
  357. ROT DROP
  358. ELSE
  359. ROT DUP EMIT
  360. OVER C! 1+
  361. THEN
  362. THEN
  363. AGAIN
  364. ;
  365.  
  366. : (.")
  367. Tcl" set print [here]"
  368. R>
  369. BEGIN
  370. DUP C@ DUP
  371. WHILE
  372. EMIT 1+
  373. REPEAT
  374. DROP 1+
  375. DUP 1 AND
  376. IF 1+ THEN
  377. >R
  378. ;
  379.  
  380. : . ITOA TYPE SPACE ;
  381. : U. UITOA TYPE SPACE ;
  382.  
  383. Tcl" set dots_depth [here]; append_word 0; set dots_buf [here]; for {set i 0} {$i <= 32} {incr i} {append_word 0}"
  384. : .S
  385. \ Запись первоначального размера стека.
  386. DEPTH Tcl" compile_literal $dots_depth" A!
  387. \ Перенос всего из стека в буфер.
  388. BEGIN
  389. DEPTH
  390. WHILE
  391. DEPTH 1<<
  392. Tcl" compile_literal $dots_buf"
  393. + A!
  394. REPEAT
  395. \ Перенос из буфера в стек.
  396. BEGIN
  397. DEPTH Tcl" compile_literal $dots_depth" A@
  398. = NOT
  399. WHILE
  400. Tcl" compile_literal $dots_buf"
  401. DEPTH 1<< + A@ DUP .
  402. REPEAT
  403. ;
  404.  
  405. : 0SP
  406. BEGIN
  407. DEPTH
  408. WHILE
  409. DROP
  410. REPEAT
  411. ;
  412.  
  413. \ =================================================================
  414. \ =================================================================
  415. : FREE
  416. 0x4000
  417. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  418. A@ -
  419. ;
  420.  
  421. : ALLOT
  422. DUP FREE U< IF
  423. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  424. A@ +
  425. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  426. A!
  427. ELSE
  428. (.") Tcl" compile_string {Out of memory}"
  429. Tcl" set allot_abort [here]"
  430. BEGIN AGAIN
  431. THEN
  432. ;
  433.  
  434. : A,
  435. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  436. A@ A!
  437. 2 ALLOT
  438. ;
  439.  
  440. : C,
  441. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  442. A@ C!
  443. 1 ALLOT
  444. ;
  445.  
  446. : S,
  447. BEGIN \ addr
  448. DUP C@ DUP \ addr c c
  449. WHILE
  450. C, 1+
  451. REPEAT
  452. C, DROP
  453. ;
  454.  
  455. : LITERAL
  456. DUP 0< IF
  457. NOT 0x8000 OR A,
  458. 0x6600 A,
  459. ELSE
  460. 0x8000 OR A,
  461. THEN
  462. ; IMMEDIATE
  463.  
  464. : DOVAR
  465. R>
  466. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  467. A@ IF LITERAL THEN
  468. ;
  469.  
  470. Tcl" replace_word $dict(BASE) [expr {($dict(DOVAR) >> 1) | 0x4000}]"
  471. Tcl" replace_word $dict(HERE) [expr {($dict(DOVAR) >> 1) | 0x4000}]"
  472. Tcl" replace_word $dict(STATE) [expr {($dict(DOVAR) >> 1) | 0x4000}]"
  473. Tcl" replace_word $dict(LAST) [expr {($dict(DOVAR) >> 1) | 0x4000}]"
  474.  
  475. : DOCON
  476. R> A@
  477. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  478. A@ IF LITERAL THEN
  479. ;
  480.  
  481. : DOISTR
  482. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  483. A@ IF
  484. R> A@ A,
  485. THEN
  486. ;
  487.  
  488. : A! A! ;
  489. : A@ DOISTR A@ ; IMMEDIATE
  490. : + DOISTR + ; IMMEDIATE
  491. : 1- DOISTR 1- ; IMMEDIATE
  492. : AND DOISTR AND ; IMMEDIATE
  493. : OR DOISTR OR ; IMMEDIATE
  494. : DUP DOISTR DUP ; IMMEDIATE
  495. : DROP DOISTR DROP ; IMMEDIATE
  496. : OVER DOISTR OVER ; IMMEDIATE
  497. : SWAP DOISTR SWAP ; IMMEDIATE
  498. : NIP DOISTR NIP ; IMMEDIATE
  499. : NOT DOISTR NOT ; IMMEDIATE
  500. : 1>> DOISTR 1>> ; IMMEDIATE
  501. : 1<< DOISTR 1<< ; IMMEDIATE
  502. : U< DOISTR U< ; IMMEDIATE
  503. : < DOISTR < ; IMMEDIATE
  504. : >R DOISTR >R ; IMMEDIATE
  505. : R> DOISTR R> ; IMMEDIATE
  506. : DEPTH DOISTR DEPTH ; IMMEDIATE
  507. : = DOISTR = ; IMMEDIATE
  508.  
  509. \ =================================================================
  510. \ =================================================================
  511. : >NAME
  512. 6 -
  513. BEGIN
  514. DUP C@
  515. WHILE
  516. 1-
  517. REPEAT
  518. 1+
  519. ;
  520.  
  521. : WORDS
  522. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  523. A@
  524. BEGIN
  525. DUP >NAME TYPE SPACE
  526. 2 - A@ DUP
  527. WHILE REPEAT
  528. DROP
  529. ;
  530.  
  531. : EXECUTE >R ;
  532.  
  533. : TIB DOVAR
  534. Tcl" for {set i 0} {$i < 75} {incr i} {append_word 0}"
  535. ; IMMEDIATE
  536.  
  537. : TIBPTR DOVAR 0 ; IMMEDIATE
  538.  
  539. : TRUE DOCON Tcl" append_word 0xFFFF" ; IMMEDIATE
  540. : FALSE DOCON Tcl" append_word 0" ; IMMEDIATE
  541.  
  542. : DECIMAL
  543. 10
  544. Tcl" compile_literal [expr {$dict(BASE) + 2}]"
  545. A!
  546. ;
  547.  
  548. : HEX
  549. 16
  550. Tcl" compile_literal [expr {$dict(BASE) + 2}]"
  551. A!
  552. ;
  553.  
  554. \ =================================================================
  555. \ Интерпретатор.
  556. \ =================================================================
  557. \ Так как в этом форте используются нуль-терминированные строки,
  558. \ то нет смысла пытаться придерживатся какого-нибудь стандарта в реализации интерпретатора.
  559. \ TIB ( -- addr ) возвращает адрес входного буфера.
  560. \ TIBPTR ( -- addr ) переменная, указывающая на интерпертируемую строку.
  561. \ WORD ( <char> -- addr ) выделяет (ограничивает нулем) слово ограниченное разделителем <char> из строки, на которую указывает TIBPTR.
  562. \ Оставляет адрес нуль-терминированной строки. В TIBPTR сохраняется адрес оставшейся строки.
  563. \ INTERPRET ( addr -- ?? ) Сохраняет addr в TIBPTR, а потом...
  564.  
  565. : FIND
  566. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  567. A@
  568. BEGIN
  569. 2DUP >NAME STRCMP IF
  570. DUP 3 -
  571. C@ 2 <> IF
  572. NIP DUP 3 - C@ EXIT
  573. THEN
  574. THEN
  575. 2 - A@ DUP 0=
  576. UNTIL
  577. 2DROP 0 0
  578. ;
  579.  
  580. : [
  581. 0
  582. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  583. A!
  584. ; IMMEDIATE
  585.  
  586. : ]
  587. 1
  588. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  589. A!
  590. ; IMMEDIATE
  591.  
  592. : HIDE
  593. 2
  594. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  595. A@ 3 - C!
  596. ;
  597.  
  598. : UNHIDE
  599. 0
  600. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  601. A@ 3 - C!
  602. ;
  603.  
  604. : IMMEDIATE
  605. 1
  606. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  607. A@ 3 - C!
  608. ;
  609.  
  610. : WORD
  611. Tcl" compile_literal [expr {$dict(TIBPTR) + 2}]"
  612. A@
  613. BEGIN
  614. OVER OVER C@ =
  615. OVER C@ AND
  616. WHILE
  617. 1+
  618. REPEAT
  619. SWAP OVER
  620. BEGIN
  621. OVER OVER C@ DUP
  622. ROT <> AND
  623. WHILE
  624. 1+
  625. REPEAT
  626. NIP DUP C@ IF
  627. DUP 0 SWAP C! 1+
  628. THEN
  629. Tcl" compile_literal [expr {$dict(TIBPTR) + 2}]"
  630. A!
  631. ;
  632.  
  633. : HEADER
  634. 0x20 WORD DUP STRLEN
  635. 1 AND 0= IF
  636. 0 C,
  637. THEN
  638. 0 C, S, 0 C,
  639. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  640. A@ A,
  641. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  642. A@
  643. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  644. A!
  645. ;
  646.  
  647. : : HEADER HIDE ] ;
  648. : ; 0x700C A, UNHIDE [ ; IMMEDIATE
  649.  
  650. : INTERPRET
  651. Tcl" compile_literal [expr {$dict(TIBPTR) + 2}]"
  652. A!
  653. BEGIN
  654. 0x20 WORD \ str
  655. DUP C@ 0= IF DROP EXIT THEN
  656. DUP FIND \ str w-addr p
  657. OVER IF
  658. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  659. A@ IF
  660. \ Режим компиляции.
  661. IF
  662. NIP EXECUTE
  663. ELSE
  664. NIP 1>> 0x4000 OR A,
  665. THEN
  666. ELSE
  667. \ Режим интерпретации.
  668. DROP NIP EXECUTE
  669. THEN
  670. ELSE \ str w-addr p
  671. \ Такого слова в словаре нет.
  672. 2DROP DUP ISNUM IF \ str
  673. ATOI
  674. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  675. A@ IF
  676. LITERAL
  677. THEN
  678. ELSE \ str
  679. (.") Tcl" compile_string {Unknown token: }"
  680. TYPE CR
  681. Tcl" set interpret_abort [here]"
  682. BEGIN AGAIN
  683. THEN
  684. THEN
  685. AGAIN
  686. ;
  687.  
  688. : QUIT
  689. 0
  690. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  691. A!
  692. BEGIN
  693. CR
  694. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  695. A@ IF
  696. (.") Tcl" compile_string {compile: }"
  697. ELSE
  698. (.") Tcl" compile_string {> }"
  699. THEN
  700. Tcl" compile_literal [expr {$dict(TIB) + 2}]"
  701. 150 ACCEPT SPACE INTERPRET
  702. AGAIN
  703. ;
  704.  
  705. : ABORT 0SP QUIT ;
  706. Tcl" replace_word $interpret_abort [expr {($dict(ABORT) >> 1) | 0x4000}]"
  707. Tcl" replace_word $allot_abort [expr {($dict(ABORT) >> 1) | 0x4000}]"
  708.  
  709. : COLD
  710. Tcl" replace_word 0 [expr {[here] >> 1 }]"
  711. CR (.") Tcl" compile_string {NedoForth v0.1d Initialized}"
  712. CR FREE . (.") Tcl" compile_string {bytes free.}" CR
  713. QUIT
  714. ;
  715.  
  716. : VARIABLE
  717. HEADER Tcl" compile_literal $dict(DOVAR)" 1>> 0x4000 OR
  718. A, 0 A, IMMEDIATE
  719. ;
  720.  
  721. : CONSTANT
  722. HEADER Tcl" compile_literal [expr {($dict(DOCON) >> 1) | 0x4000}]"
  723. A, A, IMMEDIATE
  724. ;
  725.  
  726. : '
  727. 0x20 WORD
  728. DUP FIND DROP
  729. DUP IF
  730. NIP
  731. ELSE
  732. DROP
  733. (.") Tcl" compile_string {Unknown token: }"
  734. TYPE CR ABORT
  735. THEN
  736. ;
  737.  
  738. : POSTPONE
  739. DUP IF
  740. 1>> 0x4000 OR A,
  741. THEN
  742. ; IMMEDIATE
  743.  
  744. : BEGIN
  745. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  746. A@ 1>>
  747. ; IMMEDIATE
  748.  
  749. : AGAIN A, ; IMMEDIATE
  750.  
  751. : UNTIL 0x2000 OR A, ; IMMEDIATE
  752.  
  753. : WHILE
  754. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  755. A@ 0 A,
  756. ; IMMEDIATE
  757.  
  758. : REPEAT
  759. SWAP A,
  760. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  761. A@ 1>> 0x2000 OR SWAP A!
  762. ; IMMEDIATE
  763.  
  764. : DO
  765. 24903 A,
  766. 24903 A,
  767. Tcl" compile_literal [expr {$dict(HERE) + 2}]" A@
  768. ; IMMEDIATE
  769.  
  770. : (loop)
  771. R> R> R>
  772. 1+
  773. 2DUP = IF
  774. DROP DROP 2 + >R
  775. ELSE
  776. >R >R A@ >R
  777. THEN
  778. ;
  779.  
  780. : LOOP
  781. Tcl" compile_literal [expr {(($dict(\(loop\)) >> 1) | 0x4000)}]"
  782. A, A,
  783. ; IMMEDIATE
  784.  
  785. : I
  786. R> R> R@ SWAP
  787. >R SWAP >R
  788. ;
  789.  
  790. : J
  791. R> R> R> R> R@
  792. SWAP >R SWAP >R SWAP >R SWAP >R
  793. ;
  794.  
  795. : (TIMES)
  796. >R >R
  797. BEGIN
  798. R> DUP
  799. WHILE
  800. 1- R> DUP
  801. -ROT >R >R
  802. EXECUTE
  803. REPEAT
  804. R> 2DROP
  805. ;
  806.  
  807. : TIMES
  808. Tcl" compile_literal [expr {$dict(STATE) + 2}]"
  809. A@ IF
  810. ' LITERAL
  811. Tcl" compile_literal $dict(\(TIMES\))"
  812. 1>> 0x4000 OR A,
  813. ELSE
  814. '
  815. Tcl" append_word [expr {$dict(\(TIMES\)) >> 1}]"
  816. THEN
  817. ; IMMEDIATE
  818.  
  819. : IF
  820. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  821. A@
  822. 8192 A,
  823. ; IMMEDIATE
  824.  
  825. : THEN
  826. DUP A@
  827. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  828. A@
  829. 1>> OR SWAP A!
  830. ; IMMEDIATE
  831.  
  832. : ELSE
  833. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  834. A@
  835. SWAP 0 A,
  836. Tcl" compile_word THEN"
  837. ; IMMEDIATE
  838.  
  839. : ."
  840. Tcl" compile_literal [expr {($print >> 1) | 0x4000}]"
  841. A,
  842. 0x22 WORD S,
  843. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  844. A@ 1 AND IF 0 C, THEN
  845. ; IMMEDIATE
  846.  
  847. : CREATE
  848. HEADER
  849. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  850. A@ 4 +
  851. 0x8000 OR A,
  852. 0x700C A,
  853. ;
  854.  
  855. : (dodoes)
  856. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  857. A@ 2 +
  858. R> 1>>
  859. SWAP A!
  860. ;
  861.  
  862. : DOES>
  863. Tcl" compile_literal [expr {($dict(\(dodoes\)) >> 1) | 0x4000}]"
  864. A,
  865. ; IMMEDIATE
  866.  
  867. : CELL DOCON Tcl" compile_word 2" ; IMMEDIATE
  868. : CELLS DOISTR 1<< ; IMMEDIATE
  869.  
  870. : FORGET
  871. ' DUP 1- 1- A@
  872. Tcl" compile_literal [expr {$dict(LAST) + 2}]"
  873. A! >NAME 1- 1 NOT AND
  874. Tcl" compile_literal [expr {$dict(HERE) + 2}]"
  875. A!
  876. ;
  877.  
  878. \ =================================================================
  879. \ Для майнкрафта.
  880. \ =================================================================
  881. : TICK 1 28680 A! ;
  882.  
  883. : TICKS
  884. BEGIN
  885. TICK DUP
  886. WHILE
  887. 1-
  888. REPEAT
  889. DROP
  890. ;
  891.  
  892. : NBP! 28690 A! ;
  893.  
  894. : IOXADDR DOVAR Tcl" append_word 1" ; IMMEDIATE
  895.  
  896. : IOX!
  897. Tcl" compile_literal [expr {$dict(IOXADDR) + 2}]"
  898. A@ NBP!
  899. 29954 A!
  900. ;
  901.  
  902. : IOX@
  903. Tcl" compile_literal [expr {$dict(IOXADDR) + 2}]"
  904. A@ NBP!
  905. 29952 A@
  906. ;
  907.  
  908. : IOXSET
  909. Tcl" compile_literal [expr {$dict(IOXADDR) + 2}]"
  910. A@ NBP!
  911. 29954 A@ OR
  912. 29954 A!
  913. ;
  914.  
  915. : IOXRST
  916. Tcl" compile_literal [expr {$dict(IOXADDR) + 2}]"
  917. A@ NBP!
  918. NOT
  919. 29954 A@ AND
  920. 29954 A!
  921. ;
  922.  
  923. : UTIME@
  924. 28682 A@
  925. 28684 A@
  926. ;
  927.  
  928. Tcl" replace_word [expr {$dict(LAST) + 2}] $last_word"
  929. Tcl" replace_word [expr {$dict(HERE) + 2}] [here]"
  930.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement