// sum_of_given_numbers.iml (c) 1997 - 2000 Kari Laitinen // This program is similar to "sum_of_constants.iml". // The difference is that this program reads values for // the variables "first_number" and "second_number" from keyboard. // The user of the program may enter only single-digit numbers. // The calculated sum is printed with subroutine // "print_register_a_in_decimal_form". beginning_of_main_program: call_subroutine read_and_echo_a_character subtract_value_from_register_a '0' set_memory_pointer first_number store_register_a_to_memory set_memory_pointer plus_sign_text call_subroutine display_text call_subroutine read_and_echo_a_character subtract_value_from_register_a '0' set_memory_pointer second_number store_register_a_to_memory // Now the two numbers have been read from keyboard. // We can calculate their sum. set_memory_pointer first_number load_register_a_from_memory set_memory_pointer second_number load_register_b_from_memory add_register_b_to_a set_memory_pointer sum_of_numbers store_register_a_to_memory set_memory_pointer equal_sign_text call_subroutine display_text set_memory_pointer sum_of_numbers load_register_a_from_memory call_subroutine print_register_a_in_decimal_form end_of_main_program: stop_processing first_number: DATA 1 second_number: DATA 1 sum_of_numbers: DATA 1 plus_sign_text: STRING " + " equal_sign_text: STRING " = " read_and_echo_a_character: jump_if_input_not_ready read_and_echo_a_character input_byte_to_register_a output_byte_from_register_a return_to_calling_program display_text: load_register_a_from_memory jump_if_register_a_zero end_of_display_text output_byte_from_register_a increment_memory_pointer jump_to_address display_text end_of_display_text: return_to_calling_program print_register_a_in_decimal_form: // First we zero all the data-areas used by this subroutine. load_register_b_with_value 0 set_memory_pointer hundreds_in_byte store_register_b_to_memory set_memory_pointer tens_in_byte store_register_b_to_memory set_memory_pointer ones_in_byte store_register_b_to_memory find_hundreds_in_byte: load_register_b_with_value 100 jump_if_register_a_smaller_than_b find_tens_in_byte subtract_register_b_from_a set_memory_pointer hundreds_in_byte load_register_b_from_memory increment_register_b store_register_b_to_memory jump_to_address find_hundreds_in_byte find_tens_in_byte: load_register_b_with_value 10 jump_if_register_a_smaller_than_b find_ones_in_byte subtract_register_b_from_a set_memory_pointer tens_in_byte load_register_b_from_memory increment_register_b store_register_b_to_memory jump_to_address find_tens_in_byte find_ones_in_byte: set_memory_pointer ones_in_byte store_register_a_to_memory print_hundreds_tens_and_ones: set_memory_pointer hundreds_in_byte load_register_a_from_memory add_value_to_register_a '0' output_byte_from_register_a set_memory_pointer tens_in_byte load_register_a_from_memory add_value_to_register_a '0' output_byte_from_register_a set_memory_pointer ones_in_byte load_register_a_from_memory add_value_to_register_a '0' output_byte_from_register_a end_of_print_register_a_in_decimal_form: return_to_calling_program // The following are the "local data" of subroutine // print_register_a_in_decimal_form. This data is local because // only this subroutine uses them. hundreds_in_byte: DATA 1 tens_in_byte: DATA 1 ones_in_byte: DATA 1