Advertisement
Guest User

Untitled

a guest
Jul 25th, 2016
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.00 KB | None | 0 0
  1. (* Scott Anderson
  2. COP4020 - Homework 4
  3. July 25, 2016 *)
  4.  
  5.  
  6. let increment_by_one v =
  7. v := !v + 1
  8. ;;
  9.  
  10. let subtract_by_one v =
  11. v := !v - 1
  12. ;;
  13.  
  14. (* Defines max styles of instruction stack*)
  15. let max_stack_height = ref 100;;
  16.  
  17. (* Initializes a Stack Reference of size max_stack_height to value 0*)
  18. let stack = Array.make !max_stack_height 0;;
  19.  
  20. (* Initializes a Memory Stack Reference of size max_stack_height to value 0*)
  21. let mem = Array.make !max_stack_height 0;;
  22.  
  23. (* Initializes a Strack Register to the value 0*)
  24. let sr = ref 0;;
  25.  
  26. (* Initializes a Memory Register to the value 0*)
  27. let mr = ref 0;;
  28.  
  29. (* Loads argument to current top of stack*)
  30. let load v =
  31. Array.set stack !sr v
  32. ;;
  33.  
  34. (* Increments Stack Register by one and loads argument to new top of stack*)
  35. let cur l =
  36. increment_by_one sr;
  37. Array.set stack !sr l
  38. ;;
  39.  
  40. (* Increments Stack Register by one and loads argument to new top of stack*)
  41. let quote v =
  42. increment_by_one sr;
  43. Array.set stack !sr v
  44. ;;
  45.  
  46. (* Simulates a PUSH on the stack and load arguent [sr] to [sr+1].
  47. When complete icrements stack by one. *)
  48. let dupl () =
  49. let ele = stack.(!sr) in
  50. Array.set stack (!sr + 1) ele;
  51. increment_by_one sr
  52. ;;
  53.  
  54. (* Simulates a SWAP on the stack and loads [sr] into [sr+1] into temporary variables.
  55. Loads value of [sr] temporay value into [sr+1]
  56. Loads value of [sr+1] temporay value into [sr+] *)
  57. let swap () =
  58. let temp1 = stack.(!sr - 1) in
  59. let temp2 = stack.(!sr) in
  60. Array.set stack !sr temp1;
  61. Array.set stack (!sr - 1) temp2
  62. ;;
  63.  
  64. (* Simulates a ROTATION of the top three elements of the stack.
  65. Loads values [sr], [sr-1], and [sr-2] into temporary variables
  66. Loads value of [sr-1] temporay value into [sr]
  67. Loads value of [sr-2] temporay value into [sr-1]
  68. Loads value of [sr] temporay value into [sr-2] *)
  69. let rot () =
  70. let temp1 = stack.(!sr) in
  71. let temp2 = stack.(!sr - 1) in
  72. let temp3 = stack.(!sr - 2) in
  73. Array.set stack !sr temp2;
  74. Array.set stack (!sr - 1) temp3;
  75. Array.set stack (!sr - 2) temp1
  76. ;;
  77.  
  78. (* Simulates a reverse of the ROTATION function
  79. Loads values [sr], [sr-1], and [sr-2] into temporary variables
  80. Loads value of [sr-2] temporay value into [sr]
  81. Loads value of [sr] temporay value into [sr-1]
  82. Loads value of [sr-1] temporay value into [sr-2] *)
  83. let irot () =
  84. let temp1 = stack.(!sr) in
  85. let temp2 = stack.(!sr - 1) in
  86. let temp3 = stack.(!sr - 2) in
  87. Array.set stack !sr temp3;
  88. Array.set stack (!sr - 1) temp1;
  89. Array.set stack (!sr - 2) temp2
  90. ;;
  91.  
  92. (* Simulates an ADDITION of the top two stack elements.
  93. Loads value of [sr] and [sr-1] into temporary variables.
  94. Sums [sr] and [sr-1] values into a temporary variable.
  95. Stores sum into [sr-1] in the stack.
  96. Reduces the stack pointer. *)
  97. let plus () =
  98. let temp1 = stack.(!sr) in
  99. let temp2 = stack.(!sr - 1) in
  100. let sum = temp1 + temp2 in
  101. Array.set stack (!sr - 1) sum;
  102. subtract_by_one sr
  103. ;;
  104. (* Simulates an Multiplication of the top two stack elements.
  105. Loads value of [sr] and [sr-1] into temporary variables.
  106. Multiplies [sr] and [sr-1] values into a temporary variable.
  107. Stores multipliedvalue into [sr-1] in the stack.
  108. Reduces the stack pointer. *)
  109. let mult () =
  110. let temp1 = stack.(!sr) in
  111. let temp2 = stack.(!sr - 1) in
  112. let product = temp1 * temp2 in
  113. Array.set stack (!sr - 1) product;
  114. subtract_by_one sr
  115. ;;
  116.  
  117. (* Load the value stored in the memory stack at address stored in stack[sr]
  118. Load stored value into stack[sr] *)
  119. let fst () =
  120. let ele = stack.(!sr) in
  121. let memEle = mem.(ele) in
  122. Array.set stack !sr memEle
  123. ;;
  124.  
  125. (* Load the value stored in the memory stack at address stored in stack[sr+1]
  126. Load stored value into stack[sr] *)
  127. let snd () =
  128. let ele = stack.(!sr) in
  129. let memEle = mem.(ele + 1) in
  130. Array.set stack !sr memEle
  131. ;;
  132.  
  133. (* Load the value stored at stack[sr] into the memory stack at address stored in
  134. Stack [sr-1] *)
  135. let setfst () =
  136. let idx = stack.(!sr - 1) in
  137. Array.set mem idx stack.(!sr);
  138. subtract_by_one sr
  139. ;;
  140.  
  141. (* Load the value stored in stack[sr] into the memory stack at the address stored
  142. in stack[sr-1] + 1.
  143. Decrement the stack register. *)
  144. let setsnd () =
  145. let idx = (stack.(!sr - 1) + 1) in
  146. Array.set mem idx stack.(!sr);
  147. subtract_by_one sr
  148. ;;
  149.  
  150. (* Loads stack[sr] into MEM[mr]
  151. Loads stack[sr-1] into MEM[mr+1]
  152. Loads mr into stack[sr-1]
  153. Increment mr by two
  154. Decrement sr by one *)
  155. let cons () =
  156. Array.set mem !mr stack.(!sr);
  157. let ele = stack.(!sr - 1) in
  158. Array.set mem (!mr + 1) ele;
  159. Array.set stack (!sr - 1) !mr;
  160. increment_by_one mr;
  161. increment_by_one mr;
  162. subtract_by_one sr
  163. ;;
  164.  
  165. let split () =
  166. let ele = mem.(stack.(!sr)) in
  167. Array.set stack (!sr + 1) ele;
  168. let ele2 = mem.(stack.(!sr) + 1) in
  169. Array.set stack !sr ele2;
  170. subtract_by_one sr
  171. ;;
  172.  
  173. let branch a1 a2 =
  174. Array.set stack (!sr) (if stack.(!sr) == 1 then a1 else a2)
  175. ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement