# Encode string "Items on stack: " (0) push 0 push 16 set push 1 push 73 set push 2 push 116 set push 3 push 101 set push 4 push 109 set push 5 push 115 set push 6 push 32 set push 7 push 111 set push 8 push 110 set push 9 push 32 set push 10 push 115 set push 11 push 116 set push 12 push 97 set push 13 push 99 set push 14 push 107 set push 15 push 58 set push 16 push 32 set # Encode string '' (17) # HEAP[17] already equals 0. # Encode string 'Number to add to stack: ' (18) push 18 push 24 set push 19 push 78 set push 20 push 117 set push 21 push 109 set push 22 push 98 set push 23 push 101 set push 24 push 114 set push 25 push 32 set push 26 push 116 set push 27 push 111 set push 28 push 32 set push 29 push 97 set push 30 push 100 set push 31 push 100 set push 32 push 32 set push 33 push 116 set push 34 push 111 set push 35 push 32 set push 36 push 115 set push 37 push 116 set push 38 push 97 set push 39 push 99 set push 40 push 107 set push 41 push 58 set push 42 push 32 set # Encode string 'Do want to add a number? ' (43) push 43 push 25 set push 44 push 68 set push 45 push 111 set push 46 push 32 set push 47 push 119 set push 48 push 97 set push 49 push 110 set push 50 push 116 set push 51 push 32 set push 52 push 116 set push 53 push 111 set push 54 push 32 set push 55 push 97 set push 56 push 100 set push 57 push 100 set push 58 push 32 set push 59 push 97 set push 60 push 32 set push 61 push 110 set push 62 push 117 set push 63 push 109 set push 64 push 98 set push 65 push 101 set push 66 push 114 set push 67 push 63 set push 68 push 32 set # Encode string 'yn' (69) push 69 push 2 set push 70 push 121 set push 71 push 110 set # Encode string '\b' (72) push 72 push 1 set push 73 push 8 set # Encode string ' ' (74) push 74 push 1 set push 75 push 32 set # Encode string 'MENU\n====\n+ = Add\n- = Sub\n* = Mul\n # / = Div\n% = Mod\nT = Top\nD = Dump\nQ = Quit\nChoice? ' (76) push 76 push 84 set push 77 push 77 set push 78 push 69 set push 79 push 78 set push 80 push 85 set push 81 push 10 set push 82 push 61 set push 83 push 61 set push 84 push 61 set push 85 push 61 set push 86 push 10 set push 87 push 43 set push 88 push 32 set push 89 push 61 set push 90 push 32 set push 91 push 65 set push 92 push 100 set push 93 push 100 set push 94 push 10 set push 95 push 45 set push 96 push 32 set push 97 push 61 set push 98 push 32 set push 99 push 83 set push 100 push 117 set push 101 push 98 set push 102 push 10 set push 103 push 42 set push 104 push 32 set push 105 push 61 set push 106 push 32 set push 107 push 77 set push 108 push 117 set push 109 push 108 set push 110 push 10 set push 111 push 47 set push 112 push 32 set push 113 push 61 set push 114 push 32 set push 115 push 68 set push 116 push 105 set push 117 push 118 set push 118 push 10 set push 119 push 37 set push 120 push 32 set push 121 push 61 set push 122 push 32 set push 123 push 77 set push 124 push 111 set push 125 push 100 set push 126 push 10 set push 127 push 84 set push 128 push 32 set push 129 push 61 set push 130 push 32 set push 131 push 84 set push 132 push 111 set push 133 push 112 set push 134 push 10 set push 135 push 68 set push 136 push 32 set push 137 push 61 set push 138 push 32 set push 139 push 68 set push 140 push 117 set push 141 push 109 set push 142 push 112 set push 143 push 10 set push 144 push 81 set push 145 push 32 set push 146 push 61 set push 147 push 32 set push 148 push 81 set push 149 push 117 set push 150 push 105 set push 151 push 116 set push 152 push 10 set push 153 push 67 set push 154 push 104 set push 155 push 111 set push 156 push 105 set push 157 push 99 set push 158 push 101 set push 159 push 63 set push 160 push 32 set # Encode string '+-*/%tdq' (161) push 161 push 8 set push 162 push 43 set push 163 push 45 set push 164 push 42 set push 165 push 47 set push 166 push 37 set push 167 push 116 set push 168 push 100 set push 169 push 113 set # Encode string 'Top: ' (170) push 170 push 5 set push 171 push 84 set push 172 push 111 set push 173 push 112 set push 174 push 58 set push 175 push 32 set # Encode string 'Stack[' (176) push 176 push 6 set push 177 push 83 set push 178 push 116 set push 179 push 97 set push 180 push 99 set push 181 push 107 set push 182 push 91 set # Encode string '] = ' (183) push 183 push 4 set push 184 push 93 set push 185 push 32 set push 186 push 61 set push 187 push 32 set # Encode string 'Error: ' (188) push 188 push 7 set push 189 push 69 set push 190 push 114 set push 191 push 114 set push 192 push 111 set push 193 push 114 set push 194 push 58 set push 195 push 32 set # Encode string 'DIV' (196) push 196 push 3 set push 197 push 68 set push 198 push 73 set push 199 push 86 set # Encode string ' is illegal.' (200) push 200 push 12 set push 201 push 32 set push 202 push 105 set push 203 push 115 set push 204 push 32 set push 205 push 105 set push 206 push 108 set push 207 push 108 set push 208 push 101 set push 209 push 103 set push 210 push 97 set push 211 push 108 set push 212 push 46 set # Encode string 'MOD' (213) push 213 push 3 set push 214 push 77 set push 215 push 79 set push 216 push 68 set # This is the main program loop. # Stack starts at HEAP[217] part "MAIN" push 217 call "STACK_SIZE" push 217 call "GET_INPUT" goto "MAIN" # def get_number(stack): # print('Number to add to stack: ') # number = int(input()) # append(stack, number) part "GET_NUMBER" push 18 call "PRINT" push -1 copy iint get call "APPEND" back # def append(stack, number): # ptr = arg[0] # val = get(ptr) # val += 1 # set(prt, val) # # # a = stack # b = stack # b = get(stack) # ptr = a + b # set(ptr, number) # del stack_ptr part "APPEND" # Increase stack size by one copy 1 get push 1 add copy 2 swap set # Store number in the open spot. copy 1 copy 2 get add swap set away back # def in_array(array, key): # if len(array) <= 0: # return 0 # offset = 1 # while offset - len(array) >= 0: # ptr = array.ptr + offset # if array[ptr] == key: # return 1 # offset += 1 # return 0 part "IN_ARRAY" # Line 1-2 copy 1 get less "__IA_RET_1" copy 1 get zero "__IA_RET_1" # Line 3 push 1 # Line 4 part "__IA_LOOP" copy copy 3 get swap sub less "__IA_RET_2" # Line 5 copy 2 copy 1 add # Line 6 get copy 2 sub zero "__IA_RET_3" # Line 8 push 1 add goto "__IA_LOOP" # Line 9 part "__IA_RET_3" away push 1 away 2 back part "__IA_RET_2" away part "__IA_RET_1" push 0 away 2 back # def get_key_press(array): # while True: # key = getch() # found = in_array(array, key) # if found: # return key # if key == '\b': # putch(' ') # else: # putch('\b') # putch(' ') # putch('\b') part "GET_KEY_PRESS" # Line 2 push -1 copy ichr get # Line 3 copy 1 copy 1 call "IN_ARRAY" # Line 4 zero "__GKP_FIX" # Line 5 away 1 back part "__GKP_FIX" # Line 6 push 8 sub zero "__GKP_PRINT_SPACE" # Line 8-11 push 72 call "PRINT" push 74 call "PRINT" push 72 call "PRINT" goto "GET_KEY_PRESS" part "__GKP_PRINT_SPACE" # Line 7 push 74 call "PRINT" goto "GET_KEY_PRESS" # def get_mode(): # print('Do want to add a number? ') # key = get_key_press('yn') # print() # if key == 'y': # return 1 # return 0 part "GET_MODE" push 43 call "PRINT" push 69 call "GET_KEY_PRESS" push 17 call "PRINT_LINE" push 121 sub zero "__GM_RETURN" push 0 back part "__GM_RETURN" push 1 back # def add_array(array): # array.len -= 1 # end_ptr = array.ptr + array.len # last1 = array[end_ptr + 1] # last2 = array[end_ptr] # end, array = last1 + last2, array # array[array.ptr + array.len] = end part "ADD_ARRAY" # Line 1 copy copy get push 1 sub set # Line 2 copy copy get add # Line 3 copy push 1 add get # Line 4 swap get # Line 5 add swap # Line 6 copy get add swap set back # def sub_array(array): # array.len -= 1 # end_ptr = array.ptr + array.len # last1 = array[end_ptr + 1] # last2 = array[end_ptr] # end, array = last2 - last1, array # array[array.ptr + array.len] = end part "SUB_ARRAY" # Line 1 copy copy get push 1 sub set # Line 2 copy copy get add # Line 3 copy push 1 add get # Line 4 swap get # Line 5 swap sub swap # Line 6 copy get add swap set back # def mul_array(array): # array.len -= 1 # end_ptr = array.ptr + array.len # last1 = array[end_ptr + 1] # last2 = array[end_ptr] # end, array = last1 * last2, array # array[array.ptr + array.len] = end part "MUL_ARRAY" # Line 1 copy copy get push 1 sub set # Line 2 copy copy get add # Line 3 copy push 1 add get # Line 4 swap get # Line 5 mul swap # Line 6 copy get add swap set back # def show_last(array): # print('Top: ') # ptr = len(array) + array.ptr # print(*ptr) # print() part "SHOW_LAST" # Line 1 push 170 call "PRINT" # Line 2 copy get add # Line 3 get oint # Line 4 push 17 call "PRINT_LINE" back # def dump_array(array): # if len(array) <= 0: # return # offset = 1 # while len(array) - offset >= 0: # ptr = array.ptr + offset # sys.stdout.write('Stack[') # sys.stdout.write(str(offset)) # sys.stdout.write('] = ') # sys.stdout.write(array[ptr]) # print() # offset += 1 part "DUMP_ARRAY" # Line 1-2 copy get less "__DA_RET_1" copy get zero "__DA_RET_1" # Line 3 push 1 # Line 4 part "__DA_LOOP" copy copy 2 get swap sub less "__DA_RET_2" # Line 5 copy 1 copy 1 add # Line 6 push 176 call "PRINT" # Line 7 copy 1 oint # Line 8 push 183 call "PRINT" # Line 9 get oint # Line 10 push 17 call "PRINT_LINE" # Line 11 push 1 add goto "__DA_LOOP" part "__DA_RET_2" away part "__DA_RET_1" away back # def div_array(array): # last = array[-1] # if last == 0: # sys.stdout.write('Error: ') # sys.stdout.write('DIV') # sys.stdout.write_line(' is illegal.') # return # array.len -= 1 # end_ptr = array.ptr + array.len # last1 = array[end_ptr + 1] # last2 = array[end_ptr] # end, array = last2 / last1, array # array[array.ptr + array.len] = end part "DIV_ARRAY" # Line 1 copy copy get add get # Line 2 zero "__DA_ZERO" goto "__DA_OKAY" part "__DA_ZERO" # Line 3-5 push 188 call "PRINT" push 196 call "PRINT" push 200 call "PRINT_LINE" # Line 6 away back part "__DA_OKAY" # Line 7 copy copy get push 1 sub set # Line 8 copy copy get add # Line 9 copy push 1 add get # Line 10 swap get # Line 11 swap div swap # Line 12 copy get add swap set back # def mod_array(array): # last = array[-1] # if last == 0: # sys.stdout.write('Error: ') # sys.stdout.write('MOD') # sys.stdout.write_line(' is illegal.') # return # array.len -= 1 # end_ptr = array.ptr + array.len # last1 = array[end_ptr + 1] # last2 = array[end_ptr] # end, array = last2 % last1, array # array[array.ptr + array.len] = end part "MOD_ARRAY" # Line 1 copy copy get add get # Line 2 zero "__MA_ZERO" goto "__MA_OKAY" part "__MA_ZERO" # Line 3-5 push 188 call "PRINT" push 213 call "PRINT" push 200 call "PRINT_LINE" # Line 6 away back part "__MA_OKAY" # Line 7 copy copy get push 1 sub set # Line 8 copy copy get add # Line 9 copy push 1 add get # Line 10 swap get # Line 11 swap mod swap # Line 12 copy get add swap set back # def do_action(stack): # print(MENU) # key = get_key_press('+-*/%tdq') # print() # if key == '+': # add_array(array) # elif key == '-': # sub_array(array) # elif key == '*': # mul_array(array) # elif key == '/': # div_array(array) # elif key == '%': # mod_array(array) # elif key == 't': # show_last(array) # elif key == 'd': # dump_array(array) # else: # sys.exit() part "DO_ACTION" push 76 call "PRINT" push 161 call "GET_KEY_PRESS" push 17 call "PRINT_LINE" copy push 43 sub zero "__DA_ADD" copy push 45 sub zero "__DA_SUB" copy push 42 sub zero "__DA_MUL" copy push 47 sub zero "__DA_DIV" copy push 37 sub zero "__DA_MOD" copy push 116 sub zero "__DA_TOP" push 100 sub zero "__DA_DUMP" # Here are several function calls. exit part "__DA_DUMP" call "DUMP_ARRAY" back part "__DA_TOP" away call "SHOW_LAST" back part "__DA_MOD" away call "MOD_ARRAY" back part "__DA_DIV" away call "DIV_ARRAY" back part "__DA_MUL" away call "MUL_ARRAY" back part "__DA_SUB" away call "SUB_ARRAY" back part "__DA_ADD" away call "ADD_ARRAY" back # def get_input(stack): # if len(stack) < 2: # get_number(stack) # else: # if get_mode() == 0: # do_action(stack) # else: # get_number(stack) part "GET_INPUT" copy get push 2 sub less "__GI_IF_1" call "GET_MODE" zero "__GI_IF_2" part "__GI_IF_1" call "GET_NUMBER" back part "__GI_IF_2" call "DO_ACTION" back # Prints out size of a stack. # push addr # call "STACK_SIZE" part "STACK_SIZE" push 0 call "PRINT" get oint push 17 call "PRINT_LINE" back # Prints a string with newline. # push addr # call "PRINT_LINE" part "PRINT_LINE" call "PRINT" push 10 ochr back # def print(array): # if len(array) <= 0: # return # offset = 1 # while len(array) - offset >= 0: # ptr = array.ptr + offset # putch(array[ptr]) # offset += 1 part "PRINT" # Line 1-2 copy get less "__PRINT_RET_1" copy get zero "__PRINT_RET_1" # Line 3 push 1 # Line 4 part "__PRINT_LOOP" copy copy 2 get swap sub less "__PRINT_RET_2" # Line 5 copy 1 copy 1 add # Line 6 get ochr # Line 7 push 1 add goto "__PRINT_LOOP" part "__PRINT_RET_2" away part "__PRINT_RET_1" away back