Beispiel #1
0
def write_pop_virtual(segment, location):
    add_line('@' + location)
    add_line('D=A')
    primitive_ml.point_to_segment(segment)
    primitive_ml.write_c_command('D', 'M+D')
    primitive_ml.point_to_segment(segment, True)
    primitive_ml.write_c_command('M', 'D')
    primitive_ml.read_stack_to('D')
    primitive_ml.point_to_segment(segment, True)
    primitive_ml.write_c_command('A', 'M')
    primitive_ml.write_c_command('M', 'D')
Beispiel #2
0
def write_push_virtual(segment, location):
    primitive_ml.write_const_to(location, 'D')
    primitive_ml.point_to_segment(segment)
    primitive_ml.write_c_command('D', 'M+D')
    primitive_ml.point_to_segment(segment, True)
    primitive_ml.write_c_command('A', 'D')
    primitive_ml.write_c_command('D', 'M')
    primitive_ml.write_to_stack('D')
Beispiel #3
0
def write_pop_pointer(location):
    primitive_ml.read_stack_to('D')
    primitive_ml.point_to_pointer(int(location))
    primitive_ml.write_c_command('M', 'D')
Beispiel #4
0
def write_push_static(location):
    global file_name
    primitive_ml.point_static(file_name, location)
    primitive_ml.write_c_command('D', 'M')
    primitive_ml.write_to_stack('D')
Beispiel #5
0
def write_push_pointer(location):
    primitive_ml.point_to_pointer(int(location))
    primitive_ml.write_c_command('D', 'M')
    primitive_ml.write_to_stack('D')
Beispiel #6
0
def read_symbol_to_stack(symbol):
    primitive_ml.add_line('@' + symbol)
    primitive_ml.write_c_command('D', 'M')
    primitive_ml.write_to_stack('D')
Beispiel #7
0
def write_pop_static(location):
    primitive_ml.read_stack_to('D')
    global file_name
    primitive_ml.point_static(file_name, location)
    primitive_ml.write_c_command('M', 'D')
Beispiel #8
0
def write_call(name, var_count):
    # push return-address (using label below)
    global return_counter
    return_label = 'return.' + str(return_counter)
    primitive_ml.add_line('@' + return_label)
    primitive_ml.write_c_command('D', 'A')
    primitive_ml.write_to_stack('D')
    # push lcl
    read_symbol_to_stack('LCL')
    read_symbol_to_stack('ARG')
    read_symbol_to_stack('THIS')
    read_symbol_to_stack('THAT')
    # reposition arg
    primitive_ml.add_line('@SP')
    primitive_ml.write_c_command('D', 'M')
    primitive_ml.add_line('@ARG')
    primitive_ml.write_c_command('M', 'D')
    primitive_ml.add_line('@5')
    primitive_ml.write_c_command('D', 'A')
    primitive_ml.add_line('@ARG')
    primitive_ml.write_c_command('M', 'M-D')
    primitive_ml.add_line('@' + str(var_count))
    primitive_ml.write_c_command('D', 'A')
    primitive_ml.add_line('@ARG')
    primitive_ml.write_c_command('M', 'M-D')

    # reposition lcl

    primitive_ml.add_line('@SP')
    primitive_ml.write_c_command('D', 'M')
    primitive_ml.add_line('@LCL')
    primitive_ml.write_c_command('M', 'D')
    # goto function
    primitive_ml.unconditional_jump(name)
    # declare return label
    primitive_ml.add_symbol_link(return_label)
    return_counter += 1
    return
Beispiel #9
0
def decrement_d():
    primitive_ml.write_c_command('D', 'D-1')
Beispiel #10
0
def d_to_m():
    primitive_ml.write_c_command('M', 'D')
Beispiel #11
0
def frame_descrese_to_d():
    primitive_ml.add_line('@FRAME')
    primitive_ml.add_line('M=M-1')
    primitive_ml.add_line('A=M')
    primitive_ml.write_c_command('D', 'M')
Beispiel #12
0
def frame():
    primitive_ml.add_line('@LCL')
    primitive_ml.write_c_command('D', 'M')
    primitive_ml.add_line('@FRAME')
    d_to_m()
    primitive_ml.add_line('D=M')