import sys import win32api import win32con import win32gui coordinates = { 'shift': (62, 251), 'alpha': (97, 251), 'menu': (226, 251), 'up': (161, 249), 'down': (161, 287), 'left': (131, 268), 'right': (192, 268), 'optn': (64, 297), '^2': (103, 297), '^3': (220, 297), '^': (259, 297), 'calc': (64, 330), 'y': (103, 330), '=': (142, 330), 'x': (181, 330), 'log': (220, 330), 'ln': (259, 330), 'simp': (64, 363), 'rem': (103, 363), 'frac': (142, 363), 'sin': (181, 363), 'cos': (220, 363), 'tan': (259, 363), 'sto': (64, 396), 'deg': (103, 396), '(': (142, 396), ')': (181, 396), 'sd': (220, 396), 'm+': (259, 396), '7': (69, 435), '8': (115, 435), '9': (162, 435), 'del': (209, 435), 'ac': (255, 435), '4': (69, 475), '5': (115, 475), '6': (162, 475), '*': (209, 475), '/': (255, 475), '1': (69, 515), '2': (115, 515), '3': (162, 515), '+': (209, 515), '-': (255, 515), '0': (69, 555), ',': (115, 555), '10^': (162, 555), 'ans': (209, 555), 'exe': (255, 555) } commands = { '22': ['shift', '10^'], '2C': ['shift', '3'], '2D': ['10^'], '2E': [','], '30': ['0'], '31': ['1'], '32': ['2'], '33': ['3'], '34': ['4'], '35': ['5'], '36': ['6'], '37': ['7'], '38': ['8'], '39': ['9'], '40': ['alpha', 'm+'], '42': ['alpha', 'simp'], '43': ['alpha', 'rem'], '44': ['alpha', 'frac'], '45': ['alpha', 'sin'], '46': ['alpha', 'cos'], '47': ['alpha', 'tan'], '48': ['x'], '49': ['y'], '4C': ['optn', '1'], '60': ['('], '68': ['shift', 'frac'], '69': ['shift', '0'], '72': ['shift', 'ln'], '73': ['shift', 'log'], '74': ['shift', '^2'], '75': ['ln'], '76': ['shift', '^3'], '77': ['sin'], '78': ['cos'], '79': ['tan'], '7A': ['shift', 'sin'], '7B': ['shift', 'cos'], '7C': ['shift', 'tan'], '7D': ['log'], '83': ['shift', '*'], '84': ['shift', '/'], '87': ['alpha', ','], '88': ['shift', 'calc'], '89': ['shift', 'y'], '8A': ['alpha', '0'], 'A5': ['='], 'A6': ['+'], 'A7': ['-'], 'A8': ['*'], 'A9': ['/'], 'C0': ['shift', 'simp'], 'C8': ['frac'], 'C9': ['^'], 'CA': ['shift', '^'], 'D0': [')'], 'D4': ['shift', '('], 'D5': ['^2'], 'D6': ['^3'], 'D7': ['shift', 'ans'], 'D8': ['shift', ')'], 'DC': ['deg'], 'F905': ['optn', '1'], 'F906': ['optn', '2'], 'F907': ['optn', '3'], 'F908': ['optn', '4'], 'F909': ['optn', 'down', '1'], 'F90A': ['optn', 'down', '2'], 'F90B': ['optn', 'down', '3'], 'F90C': ['optn', 'down', '4'], 'F90D': ['optn', 'down', 'down', '1'], 'F90E': ['optn', 'down', 'down', '2'], 'F90F': ['optn', 'down', 'down', '3'], 'F910': ['optn', 'down', 'down', '4'], 'F911': ['optn', 'up', 'up', '1'], 'F912': ['down'], 'F913': ['optn', 'up', 'up', '2'], 'F914': ['down'], 'F915': ['optn', 'up', 'up', '3'], 'F916': ['down'], 'F917': ['optn', 'up', 'up', '4'], 'F918': ['down'], 'F919': ['down'], 'FB01': ['optn', '4'], 'FB02': ['optn', '3'], 'FB03': ['optn', '2'], 'FB04': ['optn', '6'], 'FB05': ['optn', '5'], 'FD18': ['shift', ','] } variables = { '40': ['right', '7'], '42': ['right', '1'], '43': ['right', '2'], '44': ['right', '3'], '45': ['right', '4'], '46': ['right', '5'], '47': ['right', '6'] } init = ['ac', 'ac', 'shift', '9', '3', 'exe', 'ac', 'menu', '8', 'shift', 'menu', 'down', '4', '1', '4'] windows = [] def callback(hwnd, windows): text = win32gui.GetWindowText(hwnd) if text.startswith('fx-92+'): windows.append(hwnd) def process(hwnd, sequence): for element in sequence: p = win32gui.GetWindowRect(hwnd) w = p[2] - p[0] - 8 h = p[3] - p[1] - 76 p = coordinates[element] tmp = win32api.MAKELONG(p[0] * w // 322, 30 + p[1] * h // 625) win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, tmp) win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, tmp) win32api.Sleep(100) if len(sys.argv) != 2: print('Usage: python.exe fx92-programmer.py input_file') sys.exit(1) win32gui.EnumWindows(callback, windows) if len(windows) == 0: print('Cannot find fx-92+ emulator window') sys.exit(1) hwnd = windows[0] try: f = open(sys.argv[1], 'r') except IOError: print('Cannot open %s' % sys.argv[1]) sys.exit(1) program = f.read().strip().upper() f.close() offset = program.find('+E-') if offset >= 0: program = program[offset + 3:] process(hwnd, init) code = '' counter = 0 mode = 0 for element in program: code += element counter += 1 script = code.startswith('F') if (script and counter != 4) or (not script and counter != 2): continue elif code == 'F908': mode = 4 sequence = commands.get(code) elif code == 'F90B': mode = 3 sequence = commands.get(code) elif code == 'F90C': mode = 2 sequence = commands.get(code) elif code == 'F90D' or code == 'F90F': mode = 1 sequence = commands.get(code) elif code == '00' and mode == 4: mode = 0 sequence = ['exe'] elif code == '00' and mode == 3: mode = 2 sequence = ['exe'] elif code == '00' and mode == 2: mode = 0 sequence = ['exe'] elif code == '00' and mode == 1: mode = 0 sequence = None elif code == '00' and mode == 0: sequence = ['exe', 'exe'] elif mode == 2: sequence = variables.get(code) else: sequence = commands.get(code) if sequence is not None: process(hwnd, sequence) code = '' counter = 0