2023-06-27 14:18:37 +03:00
|
|
|
import bitutilities as bu
|
2023-06-26 00:24:47 +03:00
|
|
|
|
2023-07-30 17:15:19 +03:00
|
|
|
operation = ""
|
|
|
|
method = ""
|
|
|
|
|
|
|
|
user_input = []
|
|
|
|
|
|
|
|
|
|
|
|
def process_command(symbol):
|
|
|
|
global operation, method
|
|
|
|
|
|
|
|
if symbol.lower() in "asmdq":
|
|
|
|
operation = symbol
|
|
|
|
elif operation == "m" and symbol in "1234":
|
|
|
|
method = symbol
|
|
|
|
elif operation == "d" and symbol in "12":
|
|
|
|
method = symbol
|
|
|
|
elif symbol in " ;:":
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
print(f"Error: unexpected instruction '{symbol}', skipping")
|
|
|
|
|
2023-09-27 23:02:49 +03:00
|
|
|
|
2023-07-30 17:15:19 +03:00
|
|
|
def perform_operation(first_register: bu.BasicRegister, second_register: bu.BasicRegister):
|
|
|
|
global operation, method
|
|
|
|
|
|
|
|
match operation:
|
|
|
|
case "a":
|
|
|
|
result, carry = bu.binary_sum_with_carry(first_register, second_register)
|
|
|
|
print(f"\nSum: {result}\nCarry: {int(carry)}")
|
|
|
|
operation, method = "", ""
|
|
|
|
case "s":
|
|
|
|
result, carry = bu.binary_subtraction_second_complement(first_register, second_register)
|
|
|
|
print(f"\nSubtraction: {result}\nCarry: {int(carry)}")
|
|
|
|
operation, method = "", ""
|
|
|
|
case "m":
|
|
|
|
match method:
|
|
|
|
case "1":
|
|
|
|
result, data_table = bu.binary_multiplication_method_1(first_register, second_register)
|
|
|
|
print(f"\nMultiplication (method 1):\n{bu.format_device_state_table(data_table)}\nResult: {result}")
|
|
|
|
operation, method = "", ""
|
|
|
|
case "2":
|
|
|
|
result, data_table = bu.binary_multiplication_method_2(first_register, second_register)
|
|
|
|
print(f"\nMultiplication (method 2):\n{bu.format_device_state_table(data_table)}\nResult: {result}")
|
|
|
|
operation, method = "", ""
|
|
|
|
case "3":
|
|
|
|
result, data_table = bu.binary_multiplication_method_3(first_register, second_register)
|
|
|
|
print(f"\nMultiplication (method 3):\n{bu.format_device_state_table(data_table)}\nResult: {result}")
|
|
|
|
operation, method = "", ""
|
|
|
|
case "4":
|
|
|
|
result, data_table = bu.binary_multiplication_method_4(first_register, second_register)
|
|
|
|
print(f"\nMultiplication (method 4):\n{bu.format_device_state_table(data_table)}\nResult: {result}")
|
|
|
|
operation, method = "", ""
|
|
|
|
case _:
|
|
|
|
pass
|
|
|
|
case "d":
|
|
|
|
match method:
|
|
|
|
case "1":
|
|
|
|
result, data_table = bu.binary_division_method_1(first_register, second_register)
|
|
|
|
print(f"\nDivision (method 1):\n{bu.format_device_state_table(data_table)}\nResult: {result}")
|
|
|
|
operation, method = "", ""
|
|
|
|
case "2":
|
|
|
|
result, data_table = bu.binary_division_method_2(first_register, second_register)
|
|
|
|
print(f"\nDivision (method 2):\n{bu.format_device_state_table(data_table)}\nResult: {result}")
|
|
|
|
operation, method = "", ""
|
|
|
|
case _:
|
|
|
|
pass
|
|
|
|
case "q":
|
|
|
|
exit(0)
|
|
|
|
|
|
|
|
case _:
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2023-09-27 23:02:49 +03:00
|
|
|
def get_prompt_text(operation: any, method: any) -> str:
|
|
|
|
response = "({} {})"
|
2023-07-30 17:15:19 +03:00
|
|
|
|
2023-09-27 23:02:49 +03:00
|
|
|
if operation:
|
|
|
|
response += " {}"
|
|
|
|
if operation and method:
|
|
|
|
response += "/{}"
|
|
|
|
|
|
|
|
return response
|
2023-07-30 17:15:19 +03:00
|
|
|
|
2023-06-26 00:24:47 +03:00
|
|
|
|
2023-06-27 16:40:09 +03:00
|
|
|
def input_handler(first_register: bu.BasicRegister, second_register: bu.BasicRegister):
|
2023-07-30 17:15:19 +03:00
|
|
|
global user_input, operation
|
2023-06-27 16:40:09 +03:00
|
|
|
first_register, second_register = bu.align_registers(first_register, second_register)
|
2023-06-26 00:24:47 +03:00
|
|
|
|
2023-06-27 14:18:37 +03:00
|
|
|
print()
|
2023-06-27 16:40:09 +03:00
|
|
|
print(first_register)
|
|
|
|
print(second_register)
|
|
|
|
|
|
|
|
while True:
|
2023-09-27 23:02:49 +03:00
|
|
|
prompt_text: str = get_prompt_text(operation, method).format(first_register, second_register, operation, method)
|
2023-06-27 16:40:09 +03:00
|
|
|
print()
|
2023-07-30 17:15:19 +03:00
|
|
|
if operation == "":
|
2023-09-27 23:02:49 +03:00
|
|
|
raw_user_input = input("Choose the operation:\n[a]ddition, [s]ubtraction, [m]ultiplication, [d]ivision, "
|
|
|
|
"[q]uit\n" + prompt_text + " > ")
|
2023-07-30 17:15:19 +03:00
|
|
|
elif operation == "m":
|
2023-09-27 23:02:49 +03:00
|
|
|
raw_user_input = input("Choose method to use (1-4):\n" + prompt_text + " > ")
|
2023-07-30 17:15:19 +03:00
|
|
|
elif operation == "d":
|
2023-09-27 23:02:49 +03:00
|
|
|
raw_user_input = input("Choose method to use (1-2):\n" + prompt_text + " > ")
|
2023-07-30 17:15:19 +03:00
|
|
|
|
|
|
|
user_input = list(raw_user_input)
|
|
|
|
|
|
|
|
for symbol in user_input:
|
|
|
|
process_command(symbol)
|
|
|
|
perform_operation(first_register, second_register)
|
2023-06-26 00:24:47 +03:00
|
|
|
|
2023-06-26 21:05:45 +03:00
|
|
|
|
2023-06-27 16:40:09 +03:00
|
|
|
if __name__ == '__main__':
|
2023-08-01 16:10:25 +03:00
|
|
|
reg1: bu.BasicRegister = bu.BasicRegister(bu.get_memory("first operand"))
|
|
|
|
reg2: bu.BasicRegister = bu.BasicRegister(bu.get_memory("second operand"))
|
2023-06-27 15:53:20 +03:00
|
|
|
|
2023-07-30 17:15:19 +03:00
|
|
|
input_handler(reg1, reg2)
|