dreamcast/client.py
2023-11-30 10:02:49 +08:00

75 lines
1.5 KiB
Python

import serial
import struct
import sys
import time
dest = 0xac02_0000
ret = []
def sync(ser, b):
l = []
for i, c in enumerate(b):
if i % 32 == 0:
print(i, end=' ')
sys.stdout.flush()
ser.write(bytes([c]))
ser.flush()
ser.flushInput()
ser.flushOutput()
time.sleep(0.01)
while ser.in_waiting > 0:
res = ser.read(ser.in_waiting)
for c in res:
l.append(c)
time.sleep(0.01)
time.sleep(1)
res = ser.read(ser.in_waiting)
for c in res:
l.append(c)
return bytes(l)
def do(ser, b):
ser.read(ser.in_waiting)
ser.flush()
ser.flushInput()
ser.flushOutput()
ret = sync(ser, b'DATA')
print(ret)
size = len(b)
args = struct.pack("<II", size, dest)
print("dargs", args)
ret = sync(ser, args)
print(ret)
ret = sync(ser, b)
print(ret[-5:])
if ret[:-5] != b:
print("ret != b; dumped to asdf.bin")
with open('asdf.bin', 'wb') as f:
f.write(ret[:-5])
ret = sync(ser, b'JUMP')
args = struct.pack("<I", dest)
ser.write(args)
print()
console(ser)
def console(ser):
while True:
b = ser.read(1)
if b:
sys.stderr.buffer.write(b)
sys.stderr.flush()
with open(sys.argv[1], 'rb') as f:
b = f.read()
with serial.Serial('/dev/ttyUSB0', 120192, timeout=1) as ser:
#console(ser)
do(ser, b)