Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ( Žá­®¢­ë¥ ­¨§ª®ã஢­¥¢ë¥ á«®¢  "ä®àâ-¯à®æ¥áá®à "
  2.   Copyright [C] 1992-1999 A.Cherezov ac@forth.org
  3.   à¥®¡à §®¢ ­¨¥ ¨§ 16-à §à來®£® ¢ 32-à §àï¤­ë© ª®¤ - 1995-96££
  4.   ¥¢¨§¨ï - ᥭâï¡àì 1999
  5. )
  6.  
  7. ( ¥ «¨§ æ¨ï ¤«ï ¯®¤¯à®£à ¬¬­®£® è¨â®£® ª®¤ .
  8.   ESP - 㪠§ â¥«ì á⥪  ¢®§¢à â®¢
  9.   EBP - 㪠§ â¥«ì á⥪  ¤ ­­ëå
  10.   EDI - á®åà ­ï¥¬ë© à¥£¨áâà [㪠§ â¥«ì ¤ ­­ëå ¯®â®ª  ¢ SPF]
  11. )
  12.  
  13. HEX
  14.  
  15. \ ================================================================
  16. \ ‘⥪®¢ë¥ ¬ ­¨¯ã«ï樨
  17.  
  18. ?HS
  19.  
  20. Code DUP ;( x -- x x ) \ 94
  21. ; à®¤ã¡«¨à®¢ âì x.
  22.      LEA EBP, [EBP-4]
  23.      mov [ebp],eax
  24.      RET
  25. EndCode
  26.  
  27.  
  28. \ ' DUP TO 'DUP_V
  29.  
  30. Code ?DUP ;( x -- 0 | x x ) \ 94
  31. ; à®¤ã¡«¨à®¢ âì x, ¥á«¨ ­¥ ­®«ì.
  32.      OR  EAX, EAX
  33.      JNZ { ' DUP }
  34.     RET
  35. EndCode
  36.  
  37. Code 2DUP ;( x1 x2 -- x1 x2 x1 x2 ) \ 94
  38. ; à®¤ã¡«¨à®¢ âì ¯ àã ï祥ª x1 x2.
  39.     MOV EDX, [EBP]
  40.     MOV [EBP-4], EAX
  41.     MOV [EBP-8], EDX
  42.     LEA EBP, [EBP-8]
  43.     RET
  44. EndCode
  45.  
  46. Code DROP ;( x -- ) \ 94
  47. ; “¡à âì x á® á⥪ .
  48.     mov eax,[ebp]
  49.     LEA EBP, [EBP+4]
  50.     RET
  51. EndCode
  52.  
  53. \ ' DROP TO 'DROP_V
  54.  
  55. Code MAX ;( n1 n2 -- n3 ) \ 94
  56. ; n3 - ¡®«ì襥 ¨§ n1 ¨ n2.
  57.     CMP EAX, [EBP]
  58.     JL  { ' DROP }
  59.      LEA EBP, [EBP+4]
  60.      RET
  61. EndCode
  62.  
  63. Code MIN ;( n1 n2 -- n3 ) \ 94
  64.  ; n3 - ¬¥­ì襥 ¨§ n1 ¨ n2.
  65.      CMP EAX, [EBP]
  66.      JG  { ' DROP }
  67.     LEA EBP, [EBP+4]
  68.     RET
  69. EndCode
  70.  
  71. Code UMAX       ;( u1 u2 -- n3 ) \ RETurn the lesser of unsigned u1 and
  72.                                ; unsigned u2
  73.     CMP  EAX, [EBP]
  74.     JB { ' DROP }
  75.      LEA EBP, [EBP+4]
  76.      RET
  77. EndCode
  78.  
  79. Code UMIN       ;( u1 u2 -- n3 ) \ RETurn the lesser of unsigned u1 and
  80.                                 ; unsigned u2
  81.      CMP EAX, [EBP]
  82.      JA { ' DROP }
  83.     LEA EBP, [EBP+4]
  84.     RET
  85. EndCode
  86.  
  87. Code 2DROP ;( x1 x2 -- ) \ 94
  88. ; “¡à âì á® á⥪  ¯ àã ï祥ª x1 x2.
  89.     MOV     EAX , [EBP+4]
  90.     ADD     EBP , 8
  91.     RET
  92. EndCode
  93.  
  94. Code SWAP ;( x1 x2 -- x2 x1 ) \ 94
  95. ; ¯®¬¥­ïâì ¬¥áâ ¬¨ ¤¢  ¢¥àå­¨å í«¥¬¥­â  á⥪ 
  96. ;     XCHG EAX  { EBP }
  97.     MOV   EDX, [EBP]
  98.     MOV   [EBP],  EAX
  99.     MOV   EAX, EDX
  100.     RET
  101. EndCode
  102.  
  103. Code 2SWAP ;( x1 x2 x3 x4 -- x3 x4 x1 x2 ) \ 94
  104. ; ®¬¥­ïâì ¬¥áâ ¬¨ ¤¢¥ ¢¥àå­¨¥ ¯ àë ï祥ª.
  105.     MOV ECX, [EBP]
  106.     MOV EBX, [EBP+4]
  107.     MOV EDX, [EBP+8]
  108.     MOV [EBP+8], ECX
  109.     MOV [EBP+4], EAX
  110.     MOV [EBP], EDX
  111.     MOV EAX, EBX
  112.     RET
  113. EndCode
  114.  
  115. Code OVER ;( x1 x2 -- x1 x2 x1 ) \ 94
  116. ; ®«®¦¨âì ª®¯¨î x1 ­  ¢¥à設ã á⥪ .
  117.     LEA EBP, [EBP-4]
  118.     MOV  [EBP],  EAX
  119.     MOV  EAX, [EBP+4]
  120.     RET
  121. EndCode
  122.  
  123. Code 2OVER ;( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) \ 94
  124. ; Š®¯¨à®¢ âì ¯ àã ï祥ª x1 x2 ­  ¢¥à設ã á⥪ .
  125.     MOV EDX, [EBP+8]
  126.     MOV [EBP-4], EAX
  127.     MOV [EBP-8], EDX
  128.     MOV EAX, [EBP+4]
  129.     LEA EBP, [EBP-8]
  130.     RET
  131. EndCode
  132.  
  133. Code NIP ;( x1 x2 -- x2 ) \ 94 CORE EXT
  134. ; “¡à âì ¯¥à¢ë© í«¥¬¥­â ¯®¤ ¢¥à設®© á⥪ .
  135.     ADD EBP,  4
  136.     RET
  137. EndCode
  138.  
  139. Code ROT ;( x1 x2 x3 -- x2 x3 x1 ) \ 94
  140. ; à®ªàãâ¨âì âਠ¢¥àå­¨å í«¥¬¥­â  á⥪ .
  141. ;     XCHG EAX     [EBP]
  142. ;     XCHG EAX   4  [EBP]
  143.     MOV  EDX, [EBP]
  144.     MOV  [EBP], EAX
  145.     MOV  EAX, [EBP+4]
  146.     MOV  [EBP+4], EDX
  147.     RET
  148. EndCode
  149.  
  150.  
  151. Code -ROT ;( x1 x2 x3 -- x3 x1 x2 ) ; !!!!!
  152. ; Ž¡à â­®¥ ROT
  153.     MOV  EDX, [EBP+4]
  154.     MOV  [EBP+4], EAX
  155.     MOV  EAX, [EBP]
  156.     MOV  [EBP], EDX
  157.     RET
  158. EndCode
  159.  
  160. Code PICK      ;( ... +n -- ... w ) \ Copy the nth stack item to tos.
  161.      MOV    EAX, [EBP + EAX*4 ]
  162.      RET
  163. EndCode
  164.  
  165. Code ROLL ;( xu xu-1 ... x0 u -- xu-1 ... x0 xu ) \ 94 CORE EXT
  166. ; “¡à âì u. ®¢¥à­ãâì u+1 í«¥¬¥­â ­  ¢¥à設¥ á⥪ .
  167. ; ¥®¯à¥¤¥«¥­­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ ¯¥à¥¤ ¢ë¯®«­¥­¨¥¬ ROLL
  168. ; ­  á⥪¥ ¬¥­ìè¥ ç¥¬ u+2 í«¥¬¥­â®¢.
  169.     OR EAX, EAX
  170.     JZ SHORT LL1
  171.     MOV ECX, EAX
  172.     LEA EAX, [EAX*4]
  173.     MOV EDX, EBP
  174.     ADD EDX, EAX
  175.     MOV EBX, [EDX]
  176. LL2: LEA EDX, [EDX-4]
  177.     MOV EAX, [EDX]
  178.     MOV [EDX+4], EAX
  179.     DEC ECX
  180.     JNZ SHORT LL2
  181.     MOV EAX, EBX
  182.     JMP SHORT LL3
  183. LL1: MOV EAX, [EBP]
  184. LL3: LEA EBP, [EBP+4]
  185.     RET
  186. EndCode
  187.  
  188. Code TUCK ;( x1 x2 -- x2 x1 x2 ) \ 94
  189.     LEA EBP, [EBP-4]
  190.     MOV  EDX, [EBP+4]
  191.     MOV  [EBP],  EDX
  192.     MOV  [EBP+4],  EAX
  193.     RET
  194. EndCode
  195.  
  196. \ ================================================================
  197. \ ‘⥪ ¢®§¢à â®¢
  198.  
  199. Code 2>R   ; 94 CORE EXT
  200. ; ˆ­â¥à¯à¥â æ¨ï: ᥬ ­â¨ª  ­¥®¯à¥¤¥«¥­ .
  201. ; ‚믮«­¥­¨¥: ;( x1 x2 -- ) ;( R: -- x1 x2 )
  202. ; ¥à¥­¥á⨠¯ àã ï祥ª x1 x2 ­  á⥪ ¢®§¢à â®¢. ‘¥¬ ­â¨ç¥áª¨
  203. ; íª¢¨¢ «¥­â­® SWAP >R >R.
  204.     POP   EBX
  205.     PUSH  DWORD PTR [EBP]
  206.     PUSH  EAX
  207.     LEA   EBP, [EBP+8]
  208.     MOV   EAX, [EBP-4]
  209.     JMP   EBX
  210. EndCode
  211.  
  212. Code 2R>  ; 94 CORE EXT
  213. ; ˆ­â¥à¯à¥â æ¨ï: ᥬ ­â¨ª  ­¥®¯à¥¤¥«¥­ .
  214. ; ‚믮«­¥­¨¥: ;( -- x1 x2 ) ;( R: x1 x2 -- )
  215. ; ¥à¥­¥á⨠¯ àã ï祥ª x1 x2 á® á⥪  ¢®§¢à â®¢. ‘¥¬ ­â¨ç¥áª¨
  216. ; íª¢¨¢ «¥­â­® R> R> SWAP.  \ !!!!
  217.     LEA EBP, [EBP-8]
  218.     POP EBX
  219.     MOV [EBP+4], EAX
  220.     POP EAX
  221.     POP DWORD PTR [EBP]
  222.     PUSH EBX
  223.     RET
  224. EndCode
  225.  
  226. Code R@    ; 94
  227. ; ˆá¯®«­¥­¨¥: ;( -- x ) ;( R: x -- x )
  228. ; ˆ­â¥à¯à¥â æ¨ï: ᥬ ­â¨ª  ¢ ०¨¬¥ ¨­â¥à¯à¥â æ¨¨ ­¥®¯à¥¤¥«¥­ .
  229.     LEA EBP, [EBP-4]
  230.     MOV [EBP], EAX
  231.     MOV EAX, [ESP + 4 ]
  232.     RET
  233. EndCode
  234.  
  235. Code 2R@  ; 94 CORE EXT
  236. ; ˆ­â¥à¯à¥â æ¨ï: ᥬ ­â¨ª  ­¥®¯à¥¤¥«¥­ .
  237. ; ‚믮«­¥­¨¥: ;( -- x1 x2 ) ;( R: x1 x2 -- x1 x2 )
  238. ; Š®¯¨à®¢ âì ¯ àã ï祥ª x1 x2 á® á⥪  ¢®§¢à â®¢. ‘¥¬ ­â¨ç¥áª¨
  239. ; íª¢¨¢ «¥­â­® R> R> 2DUP >R >R SWAP.
  240.     LEA EBP, [EBP-8]
  241.     MOV [EBP+4], EAX
  242.     MOV EAX, [ESP + { 2 CELLS } ]
  243.     MOV DWORD PTR [EBP],  EAX
  244.     MOV  EAX, [ESP + 4 ]
  245.     RET
  246. EndCode
  247.  
  248. \ ================================================================
  249. \ Ž¯¥à æ¨¨ á ¯ ¬ïâìî
  250.  
  251. Code @ ;( a-addr -- x ) \ 94
  252. ; x - §­ ç¥­¨¥ ¯®  ¤à¥áã a-addr.
  253.     MOV EAX, [EAX ]
  254.     RET
  255. EndCode
  256.  
  257. Code ! ;( x a-addr -- ) \ 94
  258. ; ‡ ¯¨á âì x ¯®  ¤à¥áã a-addr.
  259.     MOV EDX, [EBP]
  260.     MOV DWORD PTR [EAX ],  EDX
  261.     MOV EAX , [EBP+4]
  262.     ADD EBP , 8
  263.     RET
  264. EndCode
  265.  
  266. Code C@ ;( c-addr -- char ) \ 94
  267. ; ®«ãç¨âì ᨬ¢®« ¯®  ¤à¥áã c-addr. ¥§­ ç é¨¥ áâ à訥 ¡¨âë ï祩ª¨ ­ã«¥¢ë¥.
  268.     MOVZX EAX, BYTE PTR [EAX ]
  269.     RET
  270. EndCode
  271.  
  272. Code C! ;( char c-addr -- ) \ 94
  273. ; ‡ ¯¨á âì char ¯®  ¤à¥áã a-addr.
  274.     MOV EDX, [EBP]
  275.     MOV BYTE PTR [EAX ],  DL
  276.     MOV EAX , [EBP+4]
  277.     ADD EBP , 8
  278.     RET
  279. EndCode
  280.  
  281. Code W@ ;( c-addr -- word )
  282. ; ®«ãç¨âì word ¯®  ¤à¥áã c-addr. ¥§­ ç é¨¥ áâ à訥 ¡¨âë ï祩ª¨ ­ã«¥¢ë¥.
  283.     MOVZX   EAX, WORD PTR [EAX ]
  284.     RET
  285. EndCode
  286.  
  287. Code W! ;( word c-addr -- )
  288. ; ‡ ¯¨á âì word ¯®  ¤à¥áã a-addr.
  289.     MOV EDX, [EBP]
  290.     MOV WORD PTR [EAX ],  DX
  291.     MOV   EAX , [EBP+4]
  292.     ADD   EBP , 8
  293.     RET
  294. EndCode
  295.  
  296. Code 2@ ;( a-addr -- x1 x2 ) \ 94
  297. ; ®«ãç¨âì ¯ àã ï祥ª x1 x2, § ¯¨á ­­ãî ¯®  ¤à¥áã a-addr.
  298. ; x2 ¯®  ¤à¥áã a-addr, x1 ¢ á«¥¤ãî饩 ï祩ª¥.
  299. ;  ¢­®á¨«ì­® DUP CELL+ @ SWAP @
  300.     MOV EDX, [EAX + 4 ]
  301.     LEA EBP, [EBP-4]
  302.     MOV DWORD PTR [EBP],  EDX
  303.     MOV EAX,    DWORD PTR [EAX ]
  304.     RET
  305. EndCode
  306.  
  307. Code 2! ;( x1 x2 a-addr -- ) \ 94
  308. ; ‡ ¯¨á âì ¯ àã ï祥ª x1 x2 ¯®  ¤à¥áã a-addr,
  309. ; x2 ¯®  ¤à¥áã a-addr, x1 ¢ á«¥¤ãîéãî ï祩ªã.
  310. ;  ¢­®á¨«ì­® SWAP OVER ! CELL+ !
  311.     MOV EDX, [EBP]
  312.     MOV [EAX], EDX
  313.     MOV EDX, [EBP+4]
  314.     MOV [EAX+4], EDX
  315.     LEA EBP, [EBP+0CH]
  316.     MOV EAX, [EBP-4]
  317.     RET
  318. EndCode
  319.  
  320. Code D@ ;( a-addr -- x1 x2 )
  321. ; 2@ SWAP
  322.     MOV EDX, [EAX]
  323.     LEA EBP, [EBP-4]
  324.     MOV DWORD PTR [EBP],  EDX
  325.     MOV EAX,    DWORD PTR [EAX+4]
  326.     RET
  327. EndCode
  328.  
  329. Code D! ;( x1 x2 a-addr -- )
  330. ; >R SWAP R> 2!
  331.         MOV EDX, [EBP]
  332.         MOV [EAX+4], EDX
  333.         MOV EDX, [EBP+4]
  334.         MOV [EAX], EDX
  335.         LEA EBP, [EBP+0CH]
  336.         MOV EAX, [EBP-4]
  337.         RET
  338. EndCode
  339.  
  340.  
  341. Code EBX@ ;( -- EBX )
  342.         LEA EBP, [EBP-4]
  343.         mov [ebp],eax
  344.         MOV EAX,EBX
  345.         RET
  346. EndCode
  347.  
  348. \ ================================================================
  349. \ ‚ëç¨á«¥­¨ï
  350.  
  351. Code 1+ ;( n1|u1 -- n2|u2 ) \ 94
  352. ; à¨¡ ¢¨âì 1 ª n1|u1 ¨ ¯®«ãç¨âì á㬬ã u2|n2.
  353.     LEA EAX, [EAX+1]
  354.     RET
  355. EndCode
  356.  
  357. Code 1- ;( n1|u1 -- n2|u2 ) \ 94
  358. ; ‚ëç¥áâì 1 ¨§ n1|u1 ¨ ¯®«ãç¨âì à §­®áâì n2|u2.
  359.     LEA EAX, [EAX-1]
  360.     RET
  361. EndCode
  362.  
  363. Code 2+ ;( W -> W+2 )
  364.     LEA EAX, [EAX+2]
  365.     RET
  366. EndCode
  367.  
  368. Code 2- ;( W -> W-2 )
  369.     LEA EAX, [EAX-2]
  370.     RET
  371. EndCode
  372.  
  373. Code 2* ;( x1 -- x2 ) \ 94
  374. ; x2 - १ã«ìâ â ᤢ¨£  x1 ­  ®¤¨­ ¡¨â ¢«¥¢®, á § ¯®«­¥­¨¥¬
  375. ; ­ ¨¬¥­¥¥ §­ ç¨¬®£® ¡¨â  ­ã«¥¬.
  376. ;  SHL EAX
  377. ;  LEA EAX, [EAX+EAX]
  378.  LEA EAX, [EAX*2]
  379.  RET
  380. EndCode
  381.  
  382. Code CELL+ ;( a-addr1 -- a-addr2 ) \ 94
  383. ; ‚ëç¥áâì à §¬¥à ï祩ª¨ ª a-addr1 ¨ ¯®«ãç¨âì a-addr2.
  384.     LEA EAX, [EAX+4]
  385.     RET
  386. EndCode
  387.  
  388. Code CELL- ;( a-addr1 -- a-addr2 ) \ 94
  389. ; ‚ëç¥áâì à §¬¥à ï祩ª¨ ª a-addr1 ¨ ¯®«ãç¨âì a-addr2.
  390.     LEA EAX, [EAX-4]
  391.     RET
  392. EndCode
  393.  
  394. Code CELLS ;( n1 -- n2 ) \ 94
  395. ; n2 - à §¬¥à n1 ï祥ª.
  396.  LEA     EAX,  DWORD PTR [EAX *4 ]
  397.  RET
  398. EndCode
  399.  
  400.  
  401. Code + ;( n1|u1 n2|u2 -- n3|u3 ) \ 94
  402. ; ‘«®¦¨âì n1|u1 ¨ n2|u2 ¨ ¯®«ãç¨âì á㬬ã n3|u3.
  403.     ADD EAX,  DWORD PTR [EBP]
  404.     LEA EBP, [EBP+4]
  405.     RET
  406. EndCode
  407.  
  408. Code D+ ;( d1|ud1 d2|ud2 -- d3|ud3 ) \ 94 DOUBLE
  409. ; ‘«®¦¨âì d1|ud1 ¨ d2|ud2 ¨ ¤ âì á㬬ã d3|ud3.
  410.       MOV EDX,    DWORD PTR [EBP]
  411.       ADD DWORD PTR [EBP + { 2 CELLS } ],  EDX
  412.       ADC EAX, DWORD PTR [EBP +4 ]
  413.       LEA EBP, [EBP+8]
  414.       RET
  415. EndCode
  416.  
  417. Code D- ;( d1 d2 -- d3 ) \ 94 DOUBLE
  418. ; perform a double subtract (64bit)
  419.       MOV EDX,   DWORD PTR [EBP]
  420.       SUB DWORD PTR [EBP + { 2 CELLS } ],  EDX
  421.       SBB [EBP+4], EAX
  422.       MOV EAX, DWORD PTR [EBP +4 ]
  423.       LEA EBP, [EBP+8]
  424.       RET
  425. EndCode
  426.              
  427. Code - ;( n1|u1 n2|u2 -- n3|u3 ) \ 94
  428. ; ‚ëç¥áâì n2|u2 ¨§ n1|u1 ¨ ¯®«ãç¨âì à §­®áâì n3|u3.
  429.     NEG EAX
  430.     ADD EAX, [EBP]
  431.     LEA EBP, [EBP+4]
  432.     RET
  433. EndCode
  434.  
  435. Code 1+! ;( A -> )
  436.     INC   DWORD PTR [EAX ]
  437.     MOV   EAX, [EBP]
  438.     LEA EBP, [EBP+4]
  439.     RET
  440. EndCode
  441.  
  442. Code 0! ;( A -> )
  443.     MOV   DWORD PTR [EAX ], 0
  444.     MOV   EAX, [EBP]
  445.     LEA EBP, [EBP+4]
  446.     RET
  447. EndCode
  448.  
  449. Code COUNT ;( c-addr1 -- c-addr2 u ) \ 94
  450. ; ®«ãç¨âì áâபã ᨬ¢®«®¢ ¨§ áâப¨ á® áç¥â稪®¬ c-addr1.
  451. ; c-addr2 -  ¤à¥á ¯¥à¢®£® ᨬ¢®«  §  c-addr1.
  452. ; u - ᮤ¥à¦¨¬®¥ ¡ ©â  c-addr1, ïî饥áï ¤«¨­®© áâப¨ ᨬ¢®«®¢,
  453. ; ­ ç¨­ î饩áï á  ¤à¥á  c-addr2.
  454.     LEA EBP, [EBP-4]
  455.     LEA  EDX,   DWORD PTR [EAX +1 ]
  456.     MOV  DWORD PTR [EBP],    EDX
  457.     MOVZX EAX,  BYTE PTR [EAX ]
  458.     RET
  459. EndCode
  460.  
  461. Code * ;( n1|u1 n2|u2 -- n3|u3 ) \ 94
  462. ; ¥à¥¬­®¦¨âì n1|u1 ¨ n2|u2 ¨ ¯®«ãç¨âì ¯à®¨§¢¥¤¥­¨¥ n3|u3.
  463.     IMUL DWORD PTR [EBP]
  464.     LEA EBP, [EBP+4]
  465.     RET
  466. EndCode
  467.  
  468. Code AND ;( x1 x2 -- x3 ) \ 94
  469. ; x3 - ¯®¡¨â®¢®¥ "ˆ" x1 ¨ x2.
  470.     AND EAX, [EBP]
  471.     LEA EBP, [EBP+4]
  472.     RET
  473. EndCode
  474.  
  475. Code OR ;( x1 x2 -- x3 ) \ 94
  476. ; x3 - ¯®¡¨â®¢®¥ "ˆ‹ˆ" x1 ¨ x2.
  477.     OR EAX, [EBP]
  478.     LEA EBP, [EBP+4]
  479.     RET
  480. EndCode
  481.  
  482. Code XOR ;( x1 x2 -- x3 ) \ 94
  483. ; x3 - ¯®¡¨â®¢®¥ "¨áª«îç î饥 ˆ‹ˆ" x1 ¨ x2.
  484.     XOR EAX, [EBP]
  485.     LEA EBP, [EBP+4]
  486.     RET
  487. EndCode
  488.  
  489. Code INVERT ;( x1 -- x2 ) \ 94
  490. ; ˆ­¢¥àâ¨à®¢ âì ¢á¥ ¡¨âë x1 ¨ ¯®«ãç¨âì «®£¨ç¥áªãî ¨­¢¥àá¨î x2.
  491.     NOT EAX
  492.     RET
  493. EndCode
  494.  
  495. Code NEGATE ;( n1 -- n2 ) \ 94
  496. ; n2 -  à¨ä¬¥â¨ç¥áª ï ¨­¢¥àá¨ï n1.
  497.     NEG EAX
  498.     RET
  499. EndCode
  500.  
  501. Code ABS ;( n -- u ) \ 94
  502. ; u -  ¡á®«îâ­ ï ¢¥«¨ç¨­  n.
  503.     TEST  EAX, EAX
  504.     JS  { ' NEGATE }
  505.      RET
  506. EndCode
  507.  
  508. Code DNEGATE ;( d1 -- d2 ) \ 94 DOUBLE
  509. ; d2 १ã«ìâ â ¢ëç¨â ­¨ï d1 ¨§ ­ã«ï.
  510.      MOV  EDX, [EBP]
  511.      NEG  EAX
  512.      NEG  EDX
  513.      SBB  EAX,   0
  514.      MOV  DWORD PTR [EBP],  EDX
  515.      RET
  516. EndCode
  517.  
  518. Code NOOP ;( -> )
  519.      RET
  520. EndCode
  521.  
  522. Code S>D ;( n -- d ) \ 94
  523. ; à¥®¡à §®¢ âì ç¨á«® n ¢ ¤¢®©­®¥ ç¨á«® d á ⥬ ¦¥ ç¨á«®¢ë¬ §­ ç¥­¨¥¬.
  524.      LEA EBP, [EBP-4]
  525.      MOV  [EBP], EAX
  526.      CDQ
  527.      MOV  EAX, EDX
  528.      RET
  529. EndCode
  530.  
  531. Code D>S ;( d -- n ) \ 94 DOUBLE
  532. ; n - íª¢¨¢ «¥­â d.
  533. ; ˆáª«îç¨â¥«ì­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ d ­ å®¤¨âáï ¢­¥ ¤¨ ¯ §®­ 
  534. ; §­ ª®¢ëå ®¤¨­ à­ëå ç¨á¥«.
  535.      MOV     EAX, [EBP]
  536.      ADD     EBP, 4
  537.      RET
  538. EndCode
  539.  
  540. Code U>D ;( U -> D ) \ à áè¨à¨âì ç¨á«® ¤® ¤¢®©­®© â®ç­®á⨠­ã«¥¬
  541.      LEA EBP, [EBP-4]
  542.      MOV  [EBP], EAX
  543.      XOR  EAX, EAX
  544.      RET
  545. EndCode
  546.  
  547. Code C>S ;( c -- n )  \ à áè¨à¨âì CHAR
  548.      MOVSX  EAX, AL
  549.      RET
  550. EndCode
  551.  
  552. Code UM* ;( u1 u2 -- ud ) \ 94
  553. ; ud - ¯à®¨§¢¥¤¥­¨¥ u1 ¨ u2. ‚ᥠ§­ ç¥­¨ï ¨  à¨ä¬¥â¨ª  ¡¥§§­ ª®¢ë¥.
  554.        MUL  DWORD PTR [EBP]
  555.        MOV  [EBP], EAX
  556.        MOV  EAX, EDX
  557.        RET
  558. EndCode
  559.  
  560. Code / ;( n1 n2 -- n3 ) \ 94
  561. ; „¥«¨âì n1 ­  n2, ¯®«ãç¨âì ç áâ­®¥ n3.
  562. ; ˆáª«îç¨â¥«ì­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ n2 à ¢¥­ ­ã«î.
  563. ; …᫨ n1 ¨ n2 à §«¨ç îâáï ¯® §­ ªã - ¢®§¢à é ¥¬ë© १ã«ìâ â § ¢¨á¨â ®â
  564. ; ॠ«¨§ æ¨¨.
  565.      MOV  ECX,  EAX
  566.      MOV  EAX, [EBP]
  567.      CDQ
  568.      IDIV ECX
  569.      LEA EBP, [EBP+4]
  570.      RET
  571. EndCode
  572.  
  573. Code U/ ;( W1, W2 -> W3 ) \ ¡¥§§­ ª®¢®¥ ¤¥«¥­¨¥ W1 ­  W2
  574.      MOV ECX, EAX
  575.      MOV EAX, [EBP]
  576.      XOR EDX, EDX
  577.      LEA EBP, [EBP+4]
  578.      DIV ECX
  579.      RET
  580. EndCode
  581.  
  582. Code +! ;( n|u a-addr -- ) \ 94     \ !!!!!
  583. ; à¨¡ ¢¨âì n|u ª ®¤¨­ à­®¬ã ç¨á«ã ¯®  ¤à¥áã a-addr.
  584.      MOV EDX, [EBP]
  585.      ADD DWORD PTR [EAX ],  EDX
  586.      MOV EAX, [EBP+4]
  587.      LEA EBP, [EBP+8]
  588.      RET
  589. EndCode
  590.  
  591. Code MOD ;( n1 n2 -- n3 ) \ 94
  592. ; „¥«¨âì n1 ­  n2, ¯®«ãç¨âì ®áâ â®ª n3.
  593. ; ˆáª«îç¨â¥«ì­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ n2 à ¢¥­ ­ã«î.
  594. ; …᫨ n1 ¨ n2 à §«¨ç îâáï ¯® §­ ªã - ¢®§¢à é ¥¬ë© १ã«ìâ â § ¢¨á¨â ®â
  595. ; ॠ«¨§ æ¨¨.
  596.      MOV  ECX,  EAX
  597.      MOV  EAX, [EBP]
  598.      LEA EBP, [EBP+4]
  599.      CDQ
  600.      IDIV ECX
  601.      MOV  EAX, EDX
  602.      RET
  603. EndCode
  604.  
  605. Code /MOD ;( n1 n2 -- n3 n4 ) \ 94
  606. ; „¥«¨âì n1 ­  n2, ¤ âì ®áâ â®ª n3 ¨ ç áâ­®¥ n4.
  607. ; ¥®¤­®§­ ç­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ n2 ­ã«ì.
  608.        MOV ECX, EAX
  609.        MOV EAX, [EBP]
  610.        CDQ
  611.        IDIV ECX
  612.        MOV [EBP], EDX
  613.        RET
  614. EndCode
  615.  
  616. Code UMOD ;( W1, W2 -> W3 ) \ ®áâ â®ª ®â ¤¥«¥­¨ï W1 ­  W2
  617.      MOV ECX,  EAX
  618.      XOR EDX, EDX
  619.      MOV EAX, [EBP]
  620.      LEA EBP, [EBP+4]
  621.      DIV ECX
  622.      MOV EAX, EDX
  623.      RET
  624. EndCode
  625.  
  626. Code UM/MOD ;( ud u1 -- u2 u3 ) \ 94
  627. ; „¥«¨âì ud ­  u1, ¯®«ãç¨âì ç áâ­®¥ u3 ¨ ®áâ â®ª u2.
  628. ; ‚ᥠ§­ ç¥­¨ï ¨  à¨ä¬¥â¨ª  ¡¥§§­ ª®¢ë¥.
  629. ; ˆáª«îç¨â¥«ì­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ u1 ­®«ì ¨«¨ ç áâ­®¥
  630. ; ­ å®¤¨âáï ¢­¥ ¤¨ ¯ §®­  ®¤¨­ à­ëå ¡¥§§­ ª®¢ëå ç¨á¥«.
  631.        MOV ECX, EAX
  632.        MOV EDX, [EBP]
  633.        MOV EAX, [EBP+4]
  634.        DIV ECX
  635.        LEA EBP, [EBP+4]
  636.        MOV [EBP], EDX
  637.  
  638.        RET
  639. EndCode
  640.  
  641. Code 2/ ;( x1 -- x2 ) \ 94
  642. ; x2 - १ã«ìâ â ᤢ¨£  x1 ­  ®¤¨­ ¡¨â ¢¯à ¢® ¡¥§ ¨§¬¥­¥­¨ï áâ à襣® ¡¨â .
  643.      SAR   EAX,1
  644.      RET
  645. EndCode
  646.  
  647. Code */MOD ;( n1 n2 n3 -- n4 n5 ) \ 94
  648. ; “¬­®¦¨âì n1 ­  n2, ¯®«ãç¨âì ¯à®¬¥¦ãâ®ç­ë© ¤¢®©­®© १ã«ìâ â d.
  649. ;  §¤¥«¨âì d ­  n3, ¯®«ãç¨âì ®áâ â®ª n4 ¨ ç áâ­®¥ n5.
  650.      MOV     EBX, EAX
  651.      MOV     EAX, [EBP]
  652.      MOV     ECX, [EBP+4]
  653.      IMUL    ECX
  654.      IDIV    EBX
  655.      MOV  [EBP+4], EDX
  656.      LEA EBP, [EBP+4]
  657.      RET
  658. EndCode
  659.  
  660. Code M* ;( n1 n2 -- d ) \ 94
  661. ; d - §­ ª®¢ë© १ã«ìâ â 㬭®¦¥­¨ï n1 ­  n2.
  662.      IMUL DWORD PTR [EBP]
  663.      MOV  [EBP], EAX
  664.      MOV  EAX,  EDX
  665.      RET
  666. EndCode
  667.  
  668. Code LSHIFT ;( x1 u -- x2 ) ; 94
  669. ; ‘¤¢¨­ãâì x1 ­  u ¡¨â ¢«¥¢®. ®¬¥áâ¨âì ­ã«¨ ¢ ­ ¨¬¥­¥¥ §­ ç¨¬ë¥ ¡¨âë,
  670. ; ®á¢®¡®¦¤ ¥¬ë¥ ¯à¨ ᤢ¨£¥.
  671. ; ¥®¤­®§­ ç­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ u ¡®«ìè¥ ¨«¨ à ¢­®
  672. ; ç¨á«ã ¡¨â ¢ ï祩ª¥.
  673.      MOV ECX, EAX
  674.      MOV EAX, [EBP]
  675.      SHL EAX, CL
  676.      LEA EBP, [EBP+4]
  677.      RET
  678. EndCode
  679.  
  680. Code RSHIFT ;( x1 u -- x2 ) \ 94
  681. ; ‘¤¢¨­ãâì x1 ­  u ¡¨â ¢¯à ¢®. ®¬¥áâ¨âì ­ã«¨ ¢ ­ ¨¡®«¥¥ §­ ç¨¬ë¥ ¡¨âë,
  682. ; ®á¢®¡®¦¤ ¥¬ë¥ ¯à¨ ᤢ¨£¥.
  683. ; ¥®¤­®§­ ç­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ u ¡®«ìè¥ ¨«¨ à ¢­®
  684. ; ç¨á«ã ¡¨â ¢ ï祩ª¥.
  685.      MOV ECX, EAX
  686.      MOV EAX, [EBP]
  687.      SHR EAX, CL
  688.      LEA EBP, [EBP+4]
  689.      RET
  690. EndCode
  691.  
  692. Code SM/REM ;( d1 n1 -- n2 n3 ) \ 94
  693. ;  §¤¥«¨âì d1 ­  n1, ¯®«ãç¨âì ᨬ¬¥âà¨ç­®¥ ç áâ­®¥ n3 ¨ ®áâ â®ª n2.
  694. ; ‚室­ë¥ ¨ ¢ë室­ë¥  à£ã¬¥­âë §­ ª®¢ë¥.
  695. ; ¥®¤­®§­ ç­ ï á¨âã æ¨ï ¢®§­¨ª ¥â, ¥á«¨ n1 ­®«ì, ¨«¨ ç áâ­®¥ ¢­¥
  696. ; ¤¨ ¯ §®­  ®¤¨­ à­ëå §­ ª®¢ëå ç¨á¥«.
  697.      MOV EBX, EAX
  698.      MOV EDX, [EBP]
  699.      MOV EAX, [EBP+4]
  700.      IDIV EBX
  701.      LEA EBP, [EBP+4]
  702.      MOV [EBP], EDX
  703.      RET
  704. EndCode
  705.  
  706. Code FM/MOD ;( d1 n1 -- n2 n3 ) \ 94
  707. ; Ðàçäåëèòü d1 íà n1, ïîëó÷èòü ÷àñòíîå n3 è îñòàòîê n2.
  708. ; Âõîäíûå è âûõîäíûå àðãóìåíòû çíàêîâûå.
  709. ; Íåîäíîçíà÷íàÿ ñèòóàöèÿ âîçíèêàåò, åñëè n1 íîëü, èëè ÷àñòíîå âíå
  710. ; äèàïàçîíà îäèíàðíûõ çíàêîâûõ ÷èñåë.
  711.         MOV ECX, EAX
  712.         MOV EDX, [EBP]
  713.         MOV EBX, EDX
  714.         MOV EAX, [EBP+4]
  715.         IDIV ECX
  716.         TEST EDX, EDX            ; Îñòàòîê-òî åñòü?
  717.         JZ  SHORT @@1
  718.         XOR EBX, ECX             ; À àðãóìåíòû ðàçíîãî çíàêà?
  719.         JNS SHORT @@1
  720.         DEC EAX
  721.         ADD EDX, ECX
  722. @@1:    LEA EBP, [EBP+4]
  723.         MOV [EBP], EDX
  724.         RET
  725. EndCode
  726.  
  727. \ ================================================================
  728. \ ‘à ¢­¥­¨ï
  729.  
  730. Code = ;( x1 x2 -- flag ) \ 94
  731. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  x1 ¯®¡¨â­® à ¢¥­ x2.
  732.      XOR  EAX, [EBP]
  733.      SUB  EAX, 1
  734.      SBB  EAX, EAX
  735.      LEA EBP, [EBP+4]
  736.      RET
  737. EndCode
  738.  
  739. Code <> ;( x1 x2 -- flag ) \ 94 CORE EXT
  740. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  x1 ­¥ à ¢¥­ x2.
  741.      XOR  EAX, [EBP]
  742.      NEG  EAX
  743.      SBB  EAX,  EAX
  744.      LEA EBP, [EBP+4]
  745.      RET
  746. EndCode
  747.  
  748. Code < ;( n1 n2 -- flag ) \ 94
  749. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  n1 ¬¥­ìè¥ n2.
  750.        CMP  [EBP], EAX
  751.        SETGE AL
  752.        AND  EAX, 01
  753.        DEC  EAX
  754.        LEA EBP, [EBP+4]
  755.        RET
  756. EndCode
  757.  
  758. Code > ;( n1 n2 -- flag ) \ 94
  759. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  n1 ¡®«ìè¥ n2.
  760.        CMP  EAX, [EBP]
  761.        SETGE AL
  762.        AND  EAX, 01
  763.        DEC  EAX
  764.        LEA EBP, [EBP+4]
  765.        RET
  766. EndCode
  767.  
  768. Code WITHIN     ;( n1 low high -- f1 ) \ f1=true if ((n1 >= low) & (n1 < high))
  769.       MOV  EBX, [EBP+4]
  770.       SUB  EAX, [EBP]
  771.       SUB  EBX, [EBP]
  772.       SUB  EBX, EAX
  773.       SBB  EAX, EAX
  774.       ADD  EBP, 8
  775.       RET
  776. EndCode
  777.  
  778. Code D< ;( d1 d2 -- flag ) \ DOUBLE
  779. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  d1 ¬¥­ìè¥ d2.
  780.      MOV EBX, [EBP]
  781.      CMP DWORD PTR [EBP +8 ], EBX
  782.      SBB DWORD PTR [EBP +4 ], EAX
  783.      MOV EAX,  0
  784.      SIF <
  785.        DEC EAX
  786.      STHEN
  787.      ADD EBP,   0CH
  788.      RET
  789. EndCode
  790.  
  791. Code D> ;( d1 d2 -- flag ) \ DOUBLE
  792. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  d1 ¡®«ìè¥ d2.
  793.     MOV EBX, [EBP]
  794.     CMP EBX, [EBP+8]
  795.     SBB EAX, [EBP+4]
  796.     SAR EAX,   1FH
  797.     ADD EBP,   0CH
  798.     RET
  799. EndCode
  800.  
  801. Code U< ;( u1 u2 -- flag ) \ 94
  802. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  u1 ¬¥­ìè¥ u2.
  803.     CMP  [EBP], EAX
  804.     SBB  EAX, EAX
  805.     ADD  EBP,  04
  806.     RET
  807. EndCode
  808.  
  809. Code U> ;( u1 u2 -- flag ) \ 94
  810. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  u1 ¡®«ìè¥ u2.
  811.     CMP  EAX, [EBP]
  812.     SBB  EAX, EAX
  813.     ADD  EBP,   04
  814.     RET
  815. EndCode
  816.  
  817. Code 0< ;( n -- flag ) \ 94
  818. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  n ¬¥­ìè¥ ­ã«ï.
  819.     SAR EAX,   1F
  820.     RET
  821. EndCode
  822.  
  823. Code 0= ;( x -- flag ) \ 94
  824. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  x à ¢­® ­ã«î.
  825.      SUB  EAX, 1
  826.      SBB  EAX, EAX
  827.      RET
  828. EndCode
  829.  
  830. Code 0<> ;( x -- flag ) \ 94 CORE EXT
  831. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  x ­¥ à ¢­® ­ã«î.
  832.      NEG  EAX
  833.      SBB  EAX, EAX
  834.      RET
  835. EndCode
  836.  
  837. Code D0= ;( xd -- flag ) \ 94 DOUBLE
  838. ; flag "¨á⨭ " ⮣¤  ¨ ⮫쪮 ⮣¤ , ª®£¤  xd à ¢¥­ ­ã«î.
  839.      OR   EAX, [EBP]
  840.      SUB  EAX, 1
  841.      SBB  EAX, EAX
  842.      LEA EBP, [EBP+4]
  843.      RET
  844. EndCode
  845.  
  846. Code D= ;( xd1 xd2 -- flag ) \ 94 DOUBLE
  847. ; flag is true if and only if xd1 is bit-for-bit the same as xd2
  848.      MOV  EDX,[EBP]
  849.      XOR  EAX,[EBP+4]
  850.      XOR  EDX,[EBP+8]
  851.       OR  EAX,EDX
  852.      SUB  EAX,1
  853.      SBB  EAX,EAX
  854.      LEA  EBP,[EBP+0CH]
  855.      RET
  856. EndCode
  857.  
  858. Code D2* ;( xd1 -- xd2 ) \ 94 DOUBLE
  859. ; xd2 is the result of shifting xd1 one bit toward the most-significant
  860. ; bit, filling the vacated least-significant bit with zero    
  861.      SHL DWORD PTR [EBP],  1
  862.      RCL  EAX,   1
  863.      RET
  864. EndCode
  865.  
  866. Code D2/ ;( xd1 -- xd2 ) \ 94 DOUBLE
  867. ; xd2 is the result of shifting xd1 one bit toward the least-significant bit,
  868. ; leaving the most-significant bit unchanged
  869.      SAR  EAX,  1
  870.      RCR DWORD PTR [EBP], 1
  871.      RET
  872. EndCode
  873.  
  874. \ ================================================================
  875. \ ‘âப¨
  876.  
  877. Code -TRAILING ;( c-addr u1 -- c-addr u2 ) \ 94 STRING
  878. ; …᫨ u1 ¡®«ìè¥ ­ã«ï, u2 à ¢­® u1, 㬥­ì襭­®¬ã ­  ª®«¨ç¥á⢮ ¯à®¡¥«®¢ ¢ ª®­æ¥
  879. ; ᨬ¢®«ì­®© áâப¨, § ¤ ­­®© c-addr ¨ u1. …᫨ u1 ­®«ì ¨«¨ ¢áï áâப  á®á⮨â
  880. ; ¨§ ¯à®¡¥«®¢, u2 ­®«ì.
  881.      PUSH EDI
  882.      MOV  ECX, EAX
  883.      SIF C0<>
  884.        MOV EDI, DWORD PTR [EBP]
  885.        ADD EDI, ECX
  886.        DEC EDI
  887.        MOV AL,  20H
  888.        STD
  889.        REPZ SCASB
  890.        SIF 0<>
  891.           INC ECX
  892.        STHEN
  893.        CLD
  894.        MOV  EAX, ECX
  895.      STHEN
  896.      POP EDI
  897.      RET
  898. EndCode
  899.  
  900. Code COMPARE ;( c-addr1 u1 c-addr2 u2 -- n ) \ 94 STRING !!!!!
  901. ; ‘à ¢­¨âì áâபã, § ¤ ­­ãî c-addr1 u1, á® áâப®©, § ¤ ­­®© c-addr2 u2.
  902. ; ‘âப¨ áà ¢­¨¢ îâáï, ­ ç¨­ ï á § ¤ ­­ëå  ¤à¥á®¢, ᨬ¢®« §  ᨬ¢®«®¬, ¤® ¤«¨­ë
  903. ; ­ ¨¡®«¥¥ ª®à®âª®© ¨§ áâப ¨«¨ ¤® ­ å®¦¤¥­¨ï à §«¨ç¨©. …᫨ ¤¢¥ áâப¨
  904. ; ¨¤¥­â¨ç­ë, n ­®«ì. …᫨ ¤¢¥ áâப¨ ¨¤¥­â¨ç­ë ¤® ¤«¨­ë ­ ¨¡®«¥¥ ª®à®âª®© ¨§
  905. ; áâப, â® n ¬¨­ãá ¥¤¨­¨æ  (-1), ¥á«¨ u1 ¬¥­ìè¥ u2, ¨­ ç¥ ¥¤¨­¨æ  (1).
  906. ; …᫨ ¤¢¥ áâப¨ ­¥ ¨¤¥­â¨ç­ë ¤® ¤«¨­ë ­ ¨¡®«¥¥ ª®à®âª®© ¨§ áâப, â® n ¬¨­ãá
  907. ; ¥¤¨­¨æ  (-1), ¥á«¨ ¯¥à¢ë© ­¥á®¢¯ ¤ î騩 ᨬ¢®« áâப¨, § ¤ ­­®© c-addr1 u1
  908. ; ¨¬¥¥â ¬¥­ì襥 ç¨á«®¢®¥ §­ ç¥­¨¥, 祬 ᮮ⢥âáâ¢ãî騩 ᨬ¢®« ¢ áâப¥,
  909. ; § ¤ ­­®© c-addr2 u2, ¨ ¥¤¨­¨æ  ¢ ¯à®â¨¢­®¬ á«ãç ¥.
  910.    PUSH EDI
  911.    MOV  ECX, EAX
  912.    SUB  EAX, EAX
  913.    CMP  ECX, [EBP +4 ]
  914.    SIF 0<>
  915.       SIF U<
  916.          INC   EAX
  917.       SELSE
  918.          DEC EAX
  919.          MOV ECX, [EBP +4 ]
  920.       STHEN
  921.    STHEN
  922.    MOV ESI, [EBP + { 2 CELLS } ]
  923.    MOV EDI, [EBP]
  924.    REPE CMPSB
  925.    SIF 0<>
  926.       SIF U>=
  927.          MOV EAX,  1
  928.       SELSE
  929.          MOV EAX, -1
  930.       STHEN
  931.    STHEN
  932.    LEA  EBP, [EBP + { 3 CELLS } ]
  933.    POP EDI          
  934.    RET
  935. EndCode
  936.  
  937. Code SEARCH ;( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag ) \ 94 STRING
  938. ; à®¨§¢¥á⨠¯®¨áª ¢ áâப¥, § ¤ ­­®© c-addr1 u1, áâப¨, § ¤ ­­®© c-addr2 u2.
  939. ; …᫨ ä« £ "¨á⨭ ", ᮢ¯ ¤¥­¨¥ ­ ©¤¥­® ¯®  ¤à¥áã c-addr3 á ®á⠢訬¨áï u3
  940. ; ᨬ¢®« ¬¨. …᫨ ä« £ "«®¦ì", ᮢ¯ ¤¥­¨ï ­¥ ­ ©¤¥­®, ¨ c-addr3 ¥áâì c-addr1,
  941. ; ¨ u3 ¥áâì u1.        \ !!!!!
  942.       LEA EBP, [EBP-4]
  943.       MOV  [EBP], EAX
  944.       PUSH EDI
  945.       CLD
  946.       MOV EBX, DWORD PTR [EBP]
  947.       OR  EBX, EBX
  948.       SIF 0<>
  949.         MOV EDX, DWORD PTR [EBP + { 2 CELLS } ]
  950.         MOV EDI, DWORD PTR [EBP + { 3 CELLS } ]
  951.         ADD EDX, EDI
  952.         SBEGIN
  953.            MOV ESI, DWORD PTR [EBP +4 ]
  954.            LODSB
  955.            MOV ECX, EDX
  956.            SUB ECX, EDI
  957.            JECXZ LLD
  958.            REPNZ
  959.            SCASB
  960.            JNE SHORT LLD   ; ¢® ¢á¥© áâப¥ ­¥â ¯¥à¢®£® ᨬ¢®«  ¨áª®¬®© áâப¨
  961.            CMP EBX,   1
  962.            JZ SHORT LLC   ; ¨áª®¬ ï áâப  ¨¬¥«  ¤«¨­ã 1 ¨ ­ ©¤¥­ 
  963.            MOV ECX, EBX
  964.            DEC ECX
  965.            MOV EAX, EDX
  966.            SUB EAX, EDI
  967.            CMP EAX, ECX
  968.            JC SHORT LLD   ; ®áâ â®ª áâப¨ ª®à®ç¥ ¨áª®¬®© áâப¨
  969.            PUSH EDI
  970.            REPZ CMPSB
  971.            POP EDI
  972.         SUNTIL 0=
  973. LLC:    DEC EDI       ; ­ è«¨ ¯®«­®¥ ᮢ¯ ¤¥­¨¥
  974.         SUB EDX, EDI
  975.         MOV  DWORD PTR [EBP + { 3 CELLS } ], EDI
  976.         MOV  DWORD PTR [EBP + { 2 CELLS } ], EDX
  977.       STHEN
  978.       MOV EAX,   -1
  979.       JMP SHORT LLA
  980. LLD:  XOR EAX, EAX
  981. LLA:  LEA EBP, [EBP+4]
  982.       MOV [EBP], EAX
  983.       POP EDI
  984.       MOV EAX, [EBP]
  985.       LEA EBP, [EBP+4]
  986.       RET
  987. EndCode
  988.  
  989. Code CMOVE ;( c-addr1 c-addr2 u -- ) \ 94 STRING
  990. ; …᫨ u ¡®«ìè¥ ­ã«ï, ª®¯¨à®¢ âì u ¯®á«¥¤®¢ â¥«ì­ëå ᨬ¢®«®¢ ¨§ ¯à®áâà ­á⢠
  991. ; ¤ ­­ëå ­ ç¨­ ï á  ¤à¥á  c-addr1 ¢ c-addr2, ᨬ¢®« §  ᨬ¢®«®¬, ­ ç¨­ ï á
  992. ; ¬« ¤è¨å  ¤à¥á®¢ ª áâ à訬.
  993.      MOV  EDX, EDI
  994.      MOV  ECX, EAX
  995.      MOV  EDI, DWORD PTR [EBP]
  996.      MOV  ESI, DWORD PTR [EBP +4 ]
  997.      CLD
  998.      REPZ   MOVSB
  999.      LEA EBP, [EBP+0CH]
  1000.      MOV EAX, [EBP-4]
  1001.      MOV EDI, EDX
  1002.      RET
  1003. EndCode
  1004.  
  1005. : QCMOVE CMOVE ;
  1006.  
  1007. Code CMOVE> ;( c-addr1 c-addr2 u -- ) \ 94 STRING
  1008. ; …᫨ u ¡®«ìè¥ ­ã«ï, ª®¯¨à®¢ âì u ¯®á«¥¤®¢ â¥«ì­ëå ᨬ¢®«®¢ ¨§ ¯à®áâà ­á⢠
  1009. ; ¤ ­­ëå ­ ç¨­ ï á  ¤à¥á  c-addr1 ¢ c-addr2, ᨬ¢®« §  ᨬ¢®«®¬, ­ ç¨­ ï á®
  1010. ; áâ àè¨å  ¤à¥á®¢ ª ¬« ¤è¨¬.
  1011.  
  1012.        MOV EDX, EDI
  1013.        MOV ECX, EAX
  1014.        MOV EDI, [EBP]
  1015.        MOV ESI, [EBP+4]
  1016.        STD
  1017.        ADD EDI, ECX
  1018.        DEC EDI
  1019.        ADD ESI, ECX
  1020.        DEC ESI
  1021.        REP MOVSB
  1022.        MOV EDI, EDX
  1023.        LEA EBP, [EBP+0CH]
  1024.        MOV EAX, [EBP-4]
  1025.      RET
  1026. EndCode
  1027.  
  1028. Code FILL ;( c-addr u char -- ) \ 94  \ !!!!!
  1029. ; …᫨ u ¡®«ìè¥ ­ã«ï, § á« âì char ¢ u ¡ ©â®¢ ¯®  ¤à¥áã c-addr.
  1030.    MOV EDX, EDI
  1031.    MOV ECX, [EBP]
  1032.    MOV EDI, [EBP+4]
  1033.    CLD
  1034.    REP STOSB
  1035.    MOV EDI, EDX
  1036.    LEA EBP, [EBP+0CH]
  1037.    MOV EAX, [EBP-4]
  1038.    RET
  1039. EndCode
  1040.  
  1041. Code ZCOUNT ;( c-addr -- c-addr u )
  1042.      LEA EBP, [EBP-4]
  1043.      MOV  [EBP], EAX
  1044.      XOR  EBX, EBX
  1045.      SBEGIN
  1046.        MOV  BL, BYTE PTR [EAX ]
  1047.        INC  EAX
  1048.        OR   BL,  BL
  1049.      SUNTIL 0=
  1050.      DEC  EAX
  1051.      SUB  EAX, [EBP]
  1052.      RET
  1053. EndCode
  1054.  
  1055. \ ================================================================
  1056. \ “ª § â¥«¨ á⥪®¢
  1057.  
  1058. Code SP! ;( A -> )
  1059.      LEA EBP, [EAX+4]
  1060.      MOV EAX, [EBP-4]
  1061.      RET
  1062. EndCode
  1063.  
  1064. Code RP! ;( A -> )
  1065.      POP EBX
  1066.      MOV ESP, EAX
  1067.      MOV EAX, [EBP]
  1068.      LEA EBP, [EBP+4]
  1069.      JMP EBX
  1070. EndCode
  1071.  
  1072. Code SP@ ;( -> A )
  1073.      LEA EBP, [EBP-4]
  1074.      MOV [EBP], EAX
  1075.      MOV EAX, EBP
  1076.      RET
  1077. EndCode
  1078.  
  1079. Code RP@ ;( -- RP )
  1080.      LEA EBP, [EBP-4]
  1081.      MOV  [EBP], EAX
  1082.      LEA  EAX, [ESP + 4 ]
  1083.      RET
  1084. EndCode
  1085.  
  1086.  
  1087. \ ================================================================
  1088. \ ¥£¨áâà ¯®â®ª  (§ ¤ ç¨ ¢­ãâਠä®àâ )
  1089.  
  1090. Code TlsIndex! ;( x -- ) \ 㪠§ â¥«ì «®ª «ì­®£® ¯ã«  ¯®â®ª 
  1091.      MOV  EDI, EAX
  1092.      MOV  EAX, [EBP]
  1093.      LEA EBP, [EBP+4]
  1094.      RET
  1095. EndCode
  1096.  
  1097. Code TlsIndex@ ;( -- x )
  1098.      LEA EBP, [EBP-4]
  1099.      MOV [EBP], EAX
  1100.      MOV  EAX, EDI
  1101.      RET
  1102. EndCode
  1103.  
  1104. \ ================================================================
  1105. \ –¨ª«ë
  1106.  
  1107. Code C-J
  1108.         LEA EBP, [EBP-4]
  1109.         MOV  [EBP], EAX
  1110.         MOV EAX, DWORD PTR [ESP + { 3 CELLS } ]
  1111.         SUB EAX, DWORD PTR [ESP + { 4 CELLS } ]
  1112.         RET
  1113. EndCode
  1114.  
  1115. ( inline'ë ¤«ï ª®¬¯¨«ï樨 横«®¢ )
  1116.  
  1117. Code C-DO
  1118.      LEA  EBP, [EBP+8]
  1119.      MOV  EDX, 80000000H
  1120.      SUB  EDX, [EBP-8]
  1121.      LEA  EBX, [EAX+EDX]
  1122.      MOV  EAX, [EBP-4]
  1123.      MOV  EDX, EDX  ; FOR OPT
  1124. ;      PUSH EDX
  1125. ;      PUSH EBX
  1126.      RET
  1127. EndCode
  1128.  
  1129. Code C-?DO
  1130.      CMP  EAX, [EBP-8]
  1131.      SIF  0=
  1132.        MOV  EAX, [EBP-4]
  1133.        JMP  EBX
  1134.      STHEN
  1135.      PUSH EBX
  1136.      MOV     EBX , 80000000
  1137.      SUB  EBX, [EBP-8]
  1138.      PUSH EBX  ; 80000000h-to
  1139.      ADD  EBX, EAX
  1140.      PUSH EBX  ; 80000000H-to+from
  1141.      MOV  EAX, [EBP-4]
  1142.      RET
  1143. EndCode
  1144.  
  1145. Code ADD[ESP],EAX
  1146.  ADD [ESP] , EAX
  1147. RET
  1148. EndCode
  1149.  
  1150. Code C-I
  1151.   LEA EBP, [EBP-4]
  1152.   MOV  [EBP], EAX
  1153.   MOV  EAX, DWORD PTR [ESP]
  1154.   SUB  EAX, [ESP+4]
  1155.   RET
  1156. EndCode
  1157.  
  1158. Code C->R
  1159.     PUSH EAX
  1160.     MOV  EAX, [EBP]
  1161.     LEA  EBP, [EBP+4]
  1162.     RET
  1163. EndCode
  1164.  
  1165. Code C-R>
  1166.     LEA  EBP, [EBP-4]
  1167.     MOV  [EBP], EAX
  1168.     POP EAX
  1169.     RET
  1170. EndCode
  1171.  
  1172. Code C-RDROP
  1173.     ADD  ESP, 4
  1174.     RET
  1175. EndCode
  1176.  
  1177. Code C-2RDROP
  1178.     ADD  ESP, 8
  1179.     RET
  1180. EndCode
  1181.  
  1182. Code C-3RDROP
  1183.     ADD  ESP, 0CH
  1184.     RET
  1185. EndCode
  1186.  
  1187. TRUE [IF]
  1188. Code C-EXECUTE ;( i*x xt -- j*x ) \ 94
  1189. ; “¡à âì xt á® á⥪  ¨ ¢ë¯®«­¨âì § ¤ ­­ãî ¨¬ ᥬ ­â¨ªã.
  1190. ; „à㣨¥ ¨§¬¥­¥­¨ï ­  á⥪¥ ®¯à¥¤¥«ïîâáï á«®¢®¬, ª®â®à®¥ ¢ë¯®«­ï¥âáï.
  1191.     MOV  EDX, EAX
  1192.     MOV  EAX, [EBP]
  1193.     LEA  EBP, [EBP+4]
  1194.     CALL EDX
  1195.     RET
  1196. EndCode
  1197. [THEN]
  1198.  
  1199. Code EXECUTE ;( i*x xt -- j*x ) \ 94
  1200. ; “¡à âì xt á® á⥪  ¨ ¢ë¯®«­¨âì § ¤ ­­ãî ¨¬ ᥬ ­â¨ªã.
  1201. ; „à㣨¥ ¨§¬¥­¥­¨ï ­  á⥪¥ ®¯à¥¤¥«ïîâáï á«®¢®¬, ª®â®à®¥ ¢ë¯®«­ï¥âáï.
  1202.     MOV EBX, EAX
  1203.     MOV EAX, [EBP]
  1204.     LEA EBP, [EBP+4]
  1205.     JMP EBX
  1206. EndCode
  1207.  
  1208. Code @EXECUTE ;( i*x xt -- j*x )
  1209.     MOV EBX, EAX
  1210.     MOV EAX, [EBP]
  1211.     LEA EBP, [EBP+4]
  1212.     JMP [EBX]
  1213. EndCode
  1214.  
  1215. \ ================================================================
  1216. \ ®¤¤¥à¦ª  LOCALS
  1217.  
  1218. Code DRMOVE ;( x1 ... xn n*4 -- )
  1219. ; ¯¥à¥­¥á⨠n ç¨á¥« á® á⥪  ¤ ­­ëå ­  á⥪ ¢®§¢à â®¢
  1220.     POP  EDX ;  ¤à¥á ¢®§¢à â 
  1221.     MOV  ESI, EAX
  1222. LL1:
  1223.     PUSH DWORD PTR [EBP+ESI-4]
  1224.     SUB  ESI, 4
  1225.     JNZ  SHORT LL1
  1226.     ADD  EBP, EAX
  1227.     MOV  EAX, [EBP]
  1228.     LEA  EBP, [EBP+4]
  1229.     JMP  EDX
  1230. EndCode
  1231.  
  1232. Code NR> ;( R: x1 ... xn n -- D: x1 ... xn n )
  1233. ; ¥à¥­¥á⨠n ç¨á¥« á® á⥪  ¢®§¢à â®¢ ­  á⥪ ¤ ­­ëå
  1234. ; …᫨ n=0 ¢®§¢à â¨âì 0
  1235.     POP  EDX ;  ¤à¥á ¢®§¢à â 
  1236.     LEA  EBP, [EBP-4]
  1237.     MOV  [EBP], EAX
  1238.     POP  EAX
  1239.     OR   EAX, EAX
  1240.     JNZ  @@2
  1241.     JMP  EDX
  1242.  
  1243. @@2: LEA  EAX, [EAX*4]
  1244.     MOV  ESI, EAX
  1245. @@1:
  1246.     MOV  EBX, EBP
  1247.     SUB  EBX, ESI
  1248.     POP  DWORD PTR [EBX]
  1249.     SUB  ESI,  4
  1250.     JNZ  SHORT @@1
  1251.     SUB  EBP, EAX
  1252.     SAR  EAX,  2
  1253.     JMP  EDX
  1254. EndCode
  1255.  
  1256. Code N>R ;( D: x1 ... xn n -- R: x1 ... xn n )
  1257. ; ¯¥à¥­¥á⨠n ç¨á¥« á® á⥪  ¤ ­­ëå ­  á⥪ ¢®§¢à â®¢
  1258.     LEA  EBP, [EBP-4]
  1259.     MOV  [EBP], EAX
  1260.     LEA EAX, [EAX*4+4]
  1261.  
  1262.     POP  EDX ;  ¤à¥á ¢®§¢à â 
  1263.     MOV  ESI, EAX
  1264. @@1:
  1265.     PUSH DWORD PTR [EBP+ESI-4]
  1266.     SUB  ESI,  4
  1267.     JNZ  SHORT @@1
  1268.     ADD  EBP, EAX
  1269.     MOV  EAX, [EBP]
  1270.     LEA  EBP, [EBP+4]
  1271.     JMP  EDX
  1272. EndCode
  1273.  
  1274. Code NRCOPY ;( D: i*x i -- D: i*x i R: i*x i )
  1275. ; ᪮¯¨à®¢ âì n ç¨á¥« á® á⥪  ¤ ­­ëå ­  á⥪ ¢®§¢à â®¢
  1276.     MOV  ECX, EAX
  1277.     LEA  ECX, [ECX*4]
  1278.  
  1279.     POP  EDX ;  ¤à¥á ¢®§¢à â 
  1280.     JECXZ @@2
  1281.     MOV  ESI, ECX
  1282. @@1:
  1283.     PUSH DWORD PTR [ESI+EBP-4]
  1284.     SUB  ESI,  4
  1285.     JNZ  SHORT @@1
  1286. @@2:
  1287.     PUSH EAX
  1288.     JMP  EDX
  1289. EndCode
  1290.  
  1291. Code RP+@ ;( offs -- x )
  1292. ; ¢§ïâì ç¨á«® ᮠᬥ饭¨¥¬ offs ¡ ©â ®â ¢¥à設ë á⥪  ¢®§¢à â®¢ (0 RP+@ == RP@)
  1293.     MOV EAX, [EAX+ESP+4]
  1294.     RET
  1295. EndCode
  1296.    
  1297. Code RP+ ;( offs -- addr )
  1298. ; ¢§ïâì  ¤à¥á ᮠᬥ饭¨¥¬ offs ¡ ©â ®â ¢¥à設ë á⥪  ¢®§¢à â®¢
  1299.         LEA EAX, [EAX+ESP+4]
  1300.         RET
  1301. EndCode
  1302.  
  1303. Code RP+! ;( x offs -- )
  1304. ; § ¯¨á âì ç¨á«® x ¯® ᬥ饭¨î offs ¡ ©â ®â ¢¥à設ë á⥪  ¢®§¢à â®¢
  1305.         MOV  EBX, [EBP]
  1306.         MOV  [EAX+ESP+4], EBX
  1307.         LEA  EBP, [EBP+8]
  1308.         MOV  EAX, [EBP-4]
  1309.         RET
  1310. EndCode
  1311.  
  1312. Code RALLOT ;( n -- addr )
  1313. ; § à¥§¥à¢¨à®¢ âì n ï祥ª ­  á⥪¥ ¢®§¢à â®¢,
  1314. ; ᤥ« ¥¬ á ¨­¨æ¨ «¨§ æ¨¥© (  â® ¥á«¨ ¡®«ìè¥ 8Š ¢ë¤¥«¨¬, exception ¬®¦¥â)
  1315.     POP  EDX
  1316.     MOV  ECX, EAX
  1317.     XOR  EAX, EAX
  1318. @@1: PUSH EAX
  1319.     DEC  ECX
  1320.     JNZ  SHORT @@1
  1321.     MOV  EAX, ESP
  1322.     JMP  EDX
  1323. EndCode
  1324.  
  1325. Code (RALLOT) ;( n -- )
  1326. ; § à¥§¥à¢¨à®¢ âì n ï祥ª ­  á⥪¥ ¢®§¢à â®¢
  1327.     POP  EDX
  1328.     MOV  ECX, EAX
  1329.     XOR  EAX, EAX
  1330. @@1: PUSH EAX
  1331.     DEC  ECX
  1332.     JNZ  SHORT @@1
  1333.     MOV  EAX, [EBP]
  1334.     LEA  EBP, [EBP+4]
  1335.     JMP  EDX
  1336. EndCode
  1337.  
  1338. Code RFREE ;( n -- )
  1339. ; ¢¥à­ãâì n ï祥ª á⥪  ¢®§¢à â®¢
  1340.     POP  EDX
  1341.     LEA  ESP, [ESP+EAX*4]
  1342.     MOV EAX, [EBP]
  1343.     LEA EBP, [EBP+4]
  1344.     JMP  EDX
  1345. EndCode
  1346.  
  1347. Code (LocalsExit) ;( -- )
  1348. ; ¢¥à­ãâì ¯ ¬ïâì ¢ á⥪ ¢®¢à â®¢, ç¨á«® ¡ ©â «¥¦¨â ­  á⥪¥
  1349.     POP  EBX
  1350.     ADD  ESP, EBX
  1351.     RET
  1352. EndCode
  1353.  
  1354. Code TIMER@ ;( -- tlo thi ) \ ’®«ìª® ¤«ï Intel Pentium ¨ ¢ëè¥!!!
  1355. ; ‚®§¢à â¨âì §­ ç¥­¨¥ â ©¬¥à  ¯à®æ¥áá®à  ª ª ud
  1356.   MOV [EBP-4], EAX
  1357.   RDTSC
  1358.   MOV [EBP-8], EDX
  1359.   LEA EBP,  [EBP-8]
  1360.   XCHG EAX, [EBP]
  1361.   RET
  1362. EndCode
  1363.  
  1364. \ „«ï ®áâ «ì­ëå ¯à®æ¥áá®à®¢ à áª®¬¬¥­â¨àã©â¥:
  1365. \ : TIMER@ 0 GetTickCount ;
  1366.  
  1367. Code TRAP-CODE ;( D: j*x u R: i*x i -- i*x u )
  1368. ; ‚ᯮ¬®£ â¥«ì­®¥ á«®¢® ¤«ï ¢®ááâ ­®¢«¥­¨ï §­ ç¥­¨©, á®åà ­¥­­ëå
  1369. ; ¯¥à¥¤ CATCH ­  á⥪¥ ¢®§¢à â®¢
  1370.     POP  EDX
  1371.     POP  ESI
  1372.     OR   ESI, ESI
  1373.     JZ   @@2
  1374.     LEA  ESI, [ESI*4]
  1375.     MOV  ECX, ESI
  1376. @@1: MOV  EBX, [ESI+ESP-4]
  1377.     MOV  [ESI+EBP-4], EBX
  1378.     SUB  ESI, 4
  1379.     JNZ  SHORT @@1
  1380.     ADD  ESP, ECX
  1381. @@2: JMP  EDX
  1382. EndCode
  1383.  
  1384. DECIMAL
  1385.