6502-hacking/6502-loader.py

98 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import asyncio
import serial_asyncio
import sys
import time
import threading
parser = argparse.ArgumentParser()
parser.add_argument("input", help="input filename")
parser.add_argument("--port", help="serial port to interface with")
parser.add_argument("--start",
help="auto start the clock",
const=True,
type=bool, nargs='?', default=False
)
args = parser.parse_args()
try:
in_file = open(args.input, "rb")
except IOError:
print("Could not open file")
in_file.close()
sys.exit(2)
class SerialHandler(asyncio.Protocol):
def connection_made(self, transport):
print('connection made')
self.transport = transport
self.buf = bytes()
self.init_done = False
# clear any incoming data
transport.serial.flushInput()
transport.serial.write(b'1')
time.sleep(.1)
transport.serial.write(b'5')
time.sleep(.1)
transport.serial.write(b'6')
time.sleep(.1)
content = in_file.read()
length = len(content)
written = 0
print("file size " + str(length))
transport.serial.write(b'l')
while (length - written > 0):
written += transport.serial.write(content[length - (length - written):])
print("wrote {} bytes of rom".format(written))
if args.start:
transport.serial.write(b'4')
time.sleep(.1)
transport.serial.write(b'0')
def connection_lost(self, exc):
pass
def data_received(self, data):
self.buf += data
if b'\r\n' in self.buf:
lines = self.buf.split(b'\r\n')
self.buf = lines[-1]
for line in lines[:-1]:
s = line.decode('utf-8')
print(s)
loop = asyncio.get_event_loop()
try:
handler = SerialHandler
coro = serial_asyncio.create_serial_connection(loop, handler, args.port, baudrate=115200)
loop.run_until_complete(coro)
except Exception as E:
print(E)
print('failed to open serial port')
except Exception as E:
print(E)
print('failed to open port')
port.close()
sys.exit(1)
loop.run_forever()