fx92-programmer/fx92-programmer.py

259 lines
5.8 KiB
Python

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