Advertisement
arealloudbird

parentheses

Jan 31st, 2016
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. ;modified POP to store value in R6.
  2. ;read comments
  3. ;
  4.  
  5. .ORIG x3000
  6.  
  7. SPACE .FILL x0020
  8. NEW_LINE .FILL x000A
  9. CHAR_RETURN .FILL x000D
  10. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  11. ;if ( push onto stack if ) pop from stack and check if popped value is (
  12. ;input - R0 holds the input
  13. ;output - R6 set to -1 if unbalanced. else not modified.
  14.  
  15. IS_BALANCED
  16.  
  17. TOP_OF_IN_LOOP
  18. IN
  19.  
  20. AND R1, R1, #0 ; Check if '('
  21. LD R1, NEG_OPEN
  22. ADD R1, R0, R1
  23. BRz PUSH_IT
  24.  
  25. AND R1, R1, #0 ; Check if ')'
  26. LD R1, NEG_CLOSE
  27. ADD R1, R0, R1
  28. BRz POP_IT
  29.  
  30. AND R1, R1, #0 ; Check if whitespace
  31. LD R1, NEG_SPACE
  32. ADD R1, R0, R1
  33. BRz FOUND_SPACE
  34.  
  35. AND R1, R1, #0 ; Check if return carriage
  36. LD R1, NEG_RETURN
  37. ADD R1, R0, R1
  38. BRz FOUND_RETURN
  39.  
  40. FOUND_RETURN
  41. JSR POP ; Check if there's anything left in stack
  42. AND R1, R1, #0 ; if so, unbalanced and exit.
  43. ADD R1, R5, #-1
  44. BRn UNBALANCED
  45.  
  46. ;AND R0, R0, #0
  47. ;LD R0, R
  48. ;OUT
  49. ;AND R0, R0, #0
  50. ;LD R0, B
  51. ;OUT
  52.  
  53. AND R6, R6, #0 ; else, balanced, set R6 to #1 and exit.
  54. ADD R6, R6, #1
  55. BRnzp DONE
  56.  
  57. FOUND_SPACE
  58. ;AND R0, R0, #0 ; Just ignore
  59. ;LD R0, S
  60. ;OUT
  61. BRnzp TOP_OF_IN_LOOP
  62.  
  63. PUSH_IT
  64. JSR PUSH ; if found '(', push it onto stack, and get another char.
  65. AND R1, R1, #0
  66. ADD R1, R5, #-1
  67. BRz ERROR
  68. BRnzp TOP_OF_IN_LOOP
  69.  
  70. POP_IT
  71. JSR POP ; if found ')' pop from stack, if there's nothing left,
  72. AND R2, R2, #0 ; unbalanced and exit
  73. ADD R2, R5, #-1
  74. BRz UNBALANCED
  75. AND R1, R1, #0 ; kind of unecessary, but check if popped char is actually '('
  76. LD R1, NEG_OPEN
  77. ADD R1, R6, R1
  78. BRz BALANCED
  79. BRnp UNBALANCED
  80.  
  81. UNBALANCED
  82. AND R6, R6, #0 ; when unbalanced, set R6 to #-1
  83. ADD R6, R6, #-1
  84. ;AND R0, R0, #0
  85. ;LD R0, U
  86. ;OUT
  87. BRnzp DONE
  88.  
  89. BALANCED
  90. ;AND R0, R0, #0 ; if still balanced, go back to getting chars
  91. ;LD R0, B
  92. ;OUT
  93. BRnzp TOP_OF_IN_LOOP
  94.  
  95. ERROR
  96. LEA R0, ERROR_MESSAGE
  97. PUTS
  98. BRnzp DONE
  99.  
  100. DONE
  101. HALT
  102.  
  103. B .FILL x0042
  104. U .FILL x0055
  105. S .FILL x0053
  106. R .FILL x0052
  107. NEG_OPEN .FILL xFFD8
  108. NEG_CLOSE .FILL xFFD7
  109. NEG_SPACE .FILL xFFE0
  110. NEG_RETURN .FILL xFFF3
  111. ERROR_MESSAGE .STRINGZ "ERROR: Overflow, too many items in stack."
  112.  
  113.  
  114. ;IN:R0, OUT:R5 (0-success, 1-fail/overflow)
  115. ;R3: STACK_END R4: STACK_TOP
  116. ;
  117. PUSH
  118. ST R3, PUSH_SaveR3 ;save R3
  119. ST R4, PUSH_SaveR4 ;save R4
  120. AND R5, R5, #0 ;
  121. LD R3, STACK_END ;
  122. LD R4, STACK_TOP ;
  123. ADD R3, R3, #-1 ;
  124. NOT R3, R3 ;
  125. ADD R3, R3, #1 ;
  126. ADD R3, R3, R4 ;
  127. BRz OVERFLOW ;stack is full
  128. STR R0, R4, #0 ;no overflow, store value in the stack
  129. ADD R4, R4, #-1 ;move top of the stack
  130. ST R4, STACK_TOP ;store top of stack pointer
  131. BRnzp DONE_PUSH ;
  132. OVERFLOW
  133. ADD R5, R5, #1 ;
  134. DONE_PUSH
  135. LD R3, PUSH_SaveR3 ;
  136. LD R4, PUSH_SaveR4 ;
  137. RET
  138.  
  139.  
  140. PUSH_SaveR3 .BLKW #1 ;
  141. PUSH_SaveR4 .BLKW #1 ;
  142.  
  143.  
  144. ;OUT: R6, OUT R5 (0-success, 1-fail/underflow)
  145. ;R3 STACK_START R4 STACK_TOP
  146. ;
  147. POP
  148. ST R3, POP_SaveR3 ;save R3
  149. ST R4, POP_SaveR4 ;save R3
  150. AND R5, R5, #0 ;clear R5
  151. LD R3, STACK_START ;
  152. LD R4, STACK_TOP ;
  153. NOT R3, R3 ;
  154. ADD R3, R3, #1 ;
  155. ADD R3, R3, R4 ;
  156. BRz UNDERFLOW ;
  157. ADD R4, R4, #1 ;
  158. LDR R6, R4, #0 ;
  159. ST R4, STACK_TOP ;
  160. BRnzp DONE_POP ;
  161. UNDERFLOW
  162. ADD R5, R5, #1 ;
  163. DONE_POP
  164. LD R3, POP_SaveR3 ;
  165. LD R4, POP_SaveR4 ;
  166. RET
  167.  
  168.  
  169. POP_SaveR3 .BLKW #1 ;
  170. POP_SaveR4 .BLKW #1 ;
  171. STACK_END .FILL x3FF0 ;
  172. STACK_START .FILL x4000 ;
  173. STACK_TOP .FILL x4000 ;
  174.  
  175. .END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement