259 lines
5.8 KiB
Python
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
|