fx92-programmer/fx92-programmer.py

256 lines
5.7 KiB
Python

import sys
import win32api
import win32con
import win32gui
coordinates = {
'shift': (60, 280),
'alpha': (95, 280),
'menu': (225, 280),
'up': (160, 280),
'down': (160, 320),
'left': (125, 300),
'right': (195, 300),
'optn': (60, 330),
'^2': (100, 330),
'^3': (220, 330),
'^': (260, 330),
'calc': (60, 362),
'y': (100, 362),
'=': (140, 362),
'x': (180, 362),
'log': (220, 362),
'ln': (260, 362),
'simp': (60, 394),
'rem': (100, 394),
'frac': (140, 394),
'sin': (180, 394),
'cos': (220, 394),
'tan': (260, 394),
'sto': (60, 426),
'deg': (100, 426),
'(': (140, 426),
')': (180, 426),
'sd': (220, 426),
'm+': (260, 426),
'7': (70, 465),
'8': (115, 465),
'9': (160, 465),
'del': (205, 465),
'ac': (250, 465),
'4': (70, 505),
'5': (115, 505),
'6': (160, 505),
'*': (205, 505),
'/': (250, 505),
'1': (70, 545),
'2': (115, 545),
'3': (160, 545),
'+': (205, 545),
'-': (250, 545),
'0': (70, 585),
',': (115, 585),
'10^': (160, 585),
'ans': (205, 585),
'exe': (250, 585)
}
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 = coordinates[element]
tmp = win32api.MAKELONG(p[0], p[1])
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