home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / zen / stackmem.src < prev    next >
Text File  |  1990-01-11  |  5KB  |  249 lines

  1. \*
  2.  *   ZEN 1.10  Stack and Memory operators
  3.  *     C 1990  by Martin Tracy
  4.  *             Last modified  1.1.90
  5.  *\
  6.  
  7. \ Duplicate top stack item
  8. CODE DUP ( w - w w) \ CORE
  9.         push  bx
  10.         NEXT
  11. END-CODE
  12.  
  13. \ Drop top stack item
  14. CODE DROP ( w) \ CORE
  15.         pop   bx
  16.         NEXT
  17. END-CODE
  18.  
  19. \ Swap top two stack items
  20. CODE SWAP ( w w2 - w2 w) \ CORE
  21.         mov   di,sp
  22.         xchg  bx,ss:[di]
  23.         NEXT
  24. END-CODE
  25.  
  26. \ Copy second stack item to top of stack
  27. CODE OVER ( w w2 - w w2 w) \ CORE
  28.         mov   di,sp
  29.         push  bx
  30.         mov   bx,ss:[di]
  31.         NEXT
  32. END-CODE
  33.  
  34. \ Rotate third stack item into top position
  35. CODE ROT ( w w2 w3 - w2 w3 w) \ CORE
  36.         pop   dx
  37.         pop   ax
  38.         push  dx
  39.         push  bx
  40.         mov   bx,ax
  41.         NEXT
  42. END-CODE
  43.  
  44. \ Copy kth item to top of stack
  45. CODE PICK ( w[u]... w[0] u -  w[u]... w[0] w[u]) \ EXT CORE
  46.         shl   bx,1
  47.         add   bx,sp
  48.         mov   bx,ss:[bx]
  49.         NEXT
  50. END-CODE
  51.  
  52. \ Drop second stack item
  53. CODE NIP ( w w2 - w2) \ EXT CORE
  54.         pop   ax
  55.         NEXT
  56. END-CODE
  57.  
  58. \ Copy top stack item under second item
  59. CODE TUCK ( w w2 - w2 w w2) \ EXT CORE
  60.         pop   ax
  61.         push  bx
  62.         push  ax
  63.         NEXT
  64. END-CODE
  65.  
  66. \ Duplicate w if it is non-zero
  67. CODE ?DUP ( w - w w | 0 - 0) \ CORE
  68.         or    bx,bx
  69.         jz    Qd1
  70.         push  bx
  71. Qd1:    NEXT
  72. END-CODE
  73.  
  74. \ Move top stack item to return stack
  75. CODE >R ( w; R: - w) \ CORE
  76.         xchg  bp,sp
  77.         push  bx
  78.         xchg  bp,sp
  79.         pop   bx
  80.         NEXT
  81. END-CODE
  82.  
  83. \ Copy top return stack item to data stack
  84. CODE R@ ( - w; R: w - w) \ CORE
  85.         push  bx
  86.         mov   bx,[bp]
  87.         NEXT
  88. END-CODE
  89.  
  90. \ Move top return stack item to data stack
  91. CODE R> ( - w; R: w) \ CORE
  92.         push  bx
  93.         xchg  bp,sp
  94.         pop   bx
  95.         xchg  bp,sp
  96.         NEXT
  97. END-CODE
  98.  
  99. \ Copy the current (innermost) loop index
  100. CODE I  ( - n) \ CORE
  101.         push  bx
  102.         mov   bx,[bp]
  103.         add   bx,[bp+2]
  104.         NEXT
  105. END-CODE
  106.  
  107. \ Copy the next outermost loop index
  108. CODE J  ( - n) \ CORE
  109.         push  bx
  110.         mov   bx,[bp+4]
  111.         add   bx,[bp+6]
  112.         NEXT
  113. END-CODE
  114.  
  115. \ Move top stack pair to return stack
  116. CODE 2>R ( w w2; R: - w w2) \ CORE
  117.         pop   ax
  118.         xchg  bp,sp
  119.         push  ax
  120.         push  bx
  121.         xchg  bp,sp
  122.         pop   bx
  123.         NEXT
  124. END-CODE
  125.  
  126. \ Move top return stack pair to data stack
  127. CODE 2R> ( - w w2; R: w w2) \ CORE
  128.         push  bx
  129.         xchg  bp,sp
  130.         pop   bx
  131.         pop   ax
  132.         xchg  bp,sp
  133.         push  ax
  134.         NEXT
  135. END-CODE
  136.  
  137. \ Duplicate top stack pair
  138. CODE 2DUP ( w w2 - w w2 w w2) \ CORE
  139.         mov   di,sp
  140.         push  bx
  141.         push  ss:[di]
  142.         NEXT
  143. END-CODE
  144.  
  145. \ Drop top stack pair
  146. CODE 2DROP ( w w2) \ CORE
  147.         pop   bx
  148.         pop   bx
  149.         NEXT
  150. END-CODE
  151.  
  152. \ Swap top two stack pairs
  153. CODE 2SWAP ( w w2 w3 w4 - w3 w4 w w2) \ CORE
  154.         pop   ax
  155.         pop   cx
  156.         pop   dx
  157.         push  ax
  158.         push  bx
  159.         push  dx
  160.         mov   bx,cx
  161.         NEXT
  162. END-CODE
  163.  
  164. \ Copy second stack pair to top of stack
  165. CODE 2OVER ( w w2 w3 w4 - w w2 w3 w4 w w2) \ CORE
  166.         mov   di,sp
  167.         push  bx
  168.         push  ss:[di+4]
  169.         mov   bx,ss:[di+2]
  170.         NEXT
  171. END-CODE
  172.  
  173. \*
  174. \ Copy second stack pair to top of stack
  175. : 2OVER ( w w2 w3 w4 - w w2 w3 w4 w w2) \ CORE
  176.    2>R 2DUP 2R> 2SWAP ;
  177. *\
  178.  
  179. \ Rotate third stack pair into top position
  180. : 2ROT ( w w2 w3 w4 w5 w6 - w3 w4 w5 w6 w w2) \ EXT DOUBLE
  181.    2>R 2SWAP 2R> 2SWAP ;
  182.  
  183. \ Fetch value at addr
  184. CODE @  ( addr - w) \ CORE
  185.         mov   bx,[bx]
  186.         NEXT
  187. END-CODE
  188.  
  189. \ Store w at addr
  190. CODE !  ( w addr) \ CORE
  191.         pop   [bx]
  192.         pop   bx
  193.         NEXT
  194. END-CODE
  195.  
  196. \ Fetch byte value at addr
  197. CODE C@ ( addr - b) \ CORE
  198.         mov   bl,[bx]
  199.         sub   bh,bh
  200.         NEXT
  201. END-CODE
  202.  
  203. \ Store lower byte value at addr
  204. CODE C! ( w addr) \ CORE
  205.         pop   ax
  206.         mov   [bx],al
  207.         pop   bx
  208.         NEXT
  209. END-CODE
  210.  
  211. \ Fetch pair at addr
  212. \ w2 is stored at addr; w is stored in next cell
  213. CODE 2@ ( addr - w w2) \ CORE
  214. TwoF1:  push  [bx+2]
  215.         mov   bx,[bx]
  216.         NEXT
  217. END-CODE
  218.  
  219. CODE D@ ( addr - d) \ DOUBLE
  220.         jmp   TwoF1
  221. END-CODE
  222.  
  223. \ Store pair at addr
  224. \ w2 is stored at addr; w is stored in next cell
  225. CODE 2! ( w w2 addr) \ CORE
  226. TwoS1:  pop   [bx]
  227.         pop   [bx+2]
  228.         pop   bx
  229.         NEXT
  230. END-CODE
  231.  
  232. CODE D! ( d addr) \ DOUBLE
  233.         jmp   TwoS1
  234. END-CODE
  235.  
  236.  
  237. \ Store false at address.
  238. CODE OFF ( addr)
  239.         mov   WORD PTR [bx],0
  240.         pop   bx
  241.         NEXT
  242. END-CODE
  243.  
  244. \ Store true at address.
  245. CODE ON ( addr)
  246.         mov   WORD PTR [bx],TRUTH
  247.         pop   bx
  248.         NEXT
  249. END-CODE