Updated scripts and added i2c upload

This commit is contained in:
2020-12-30 03:25:26 +01:00
parent f22f74e3da
commit e10c541075
7 changed files with 91 additions and 48 deletions

Binary file not shown.

View File

@@ -4,9 +4,11 @@ import math
pageSize = 128
sectorsPerTrack = 256
blockSize = 16384
pagesPerBlock = 128
maxDirs = 128
dirBlocks = 1
def addBootloader(name):
loader = open(name, 'rb')
b = loader.read()
@@ -38,14 +40,14 @@ def initDirs():
out.write(bytearray(([0xe5] + [0x00] * 31) * maxDirs))
fileCounter = 0
allocationCounter = 1
def addFile(filename, n, t):
global fileCounter
global allocationCounter
if fileCounter > maxDirs:
raise RuntimeError("Max dir entries has been reached")
fileCounter += 1
if len(n) > 8:
raise RuntimeError("Filename cannot be longer than 8")
@@ -55,6 +57,13 @@ def addFile(filename, n, t):
f = open(filename, 'rb')
b = f.read()
total_records = math.ceil(len(b)/pageSize)
records = (total_records - 1) % pagesPerBlock + 1
extends = math.ceil(total_records/pagesPerBlock)
if extends >= 8:
RuntimeError("File is to big to be stored in one entry, multple entries are not implemented")
seekBlock(0)
out.seek(32*fileCounter, 1)
@@ -69,23 +78,32 @@ def addFile(filename, n, t):
out.write(t.upper().encode("ascii"))
out.write((" " * (3-len(t))).encode("ascii"))
# Write extend (assume no extend for now)
out.write(bytearray(2))
# Write extend
# @todo This is actually wrong, as the order is EX S1 S2 with S1 being unused, however we never deal with files that big
out.write((extends-1).to_bytes(1, byteorder='little'))
# Reserved byte
out.write(bytearray(1))
out.write(bytearray(2))
# Number of records (Again assuming no extends <128)
out.write(math.ceil(len(b)/128).to_bytes(1, byteorder='little'))
# Number of records
out.write(records.to_bytes(1, byteorder='little'))
allocationCounterOld = allocationCounter
# We are assuming one block per file for now, so we can use fileCounter
out.write(fileCounter.to_bytes(2, byteorder='little'))
for i in range(extends):
out.write(allocationCounter.to_bytes(2, byteorder='little'))
allocationCounter += 1
seekBlock(fileCounter)
seekBlock(allocationCounterOld)
out.write(b)
fileCounter += 1
def main():
# @todo We need to make this configurable using the command line so we can create disk images per project
# @todo Load the config from a file that we specify instead of hardcoding everything
# We can probably keep the os part hardcoded as that is not something we really need to change between different projects
global out
out = open('../tools/disk.img', 'wb')
@@ -96,7 +114,9 @@ def main():
addFile("../cpm/.build/MONITOR.COM", "MONITOR", "COM")
addFile("../cpm/bin/STAT.COM", "STAT", "COM")
addFile("../xed/.build/XED.COM", "XED", "COM")
addFile("../cpm/bin/MBASIC.COM", "MBASIC", "COM")
addFile("../cpm/bin/s.com", "S", "COM")
# addFile("../xed/.build/XED.COM", "XED", "COM")
if __name__ == "__main__":
main()

View File

@@ -26,11 +26,10 @@ def upload_rom(filename):
# ser = serial.Serial("COM3", timeout=1, write_timeout=1)
ser = serial.Serial("/dev/ttyUSB0", timeout=1, write_timeout=1, baudrate=115200)
if ser.is_open:
# Clear out any existing input
ser.write(b'\n')
time.sleep(0.002)
# Send the upload command
print("Init")
ser.write(b'#')
time.sleep(0.002)
ser.write(b'u')
@@ -38,17 +37,65 @@ def upload_rom(filename):
ser.write(b'\n')
time.sleep(0.002)
print("Target")
ser.write([0x01])
time.sleep(0.02)
print("Length")
size = os.path.getsize(filename)
ser.write([size & 0xFF])
time.sleep(0.002)
ser.write([(size >> 8) & 0xFF])
ser.write([size & 0xFF, (size >> 8) & 0xFF])
time.sleep(0.02)
print("Data")
with open(filename, "rb") as f:
ser.write(f.read(size))
while ser.out_waiting > 0:
pass
print("Done")
ser.close()
else:
print("Failed to open serial port")
def upload_i2c(filename):
# ser = serial.Serial("COM3", timeout=1, write_timeout=1)
ser = serial.Serial("/dev/ttyUSB0", timeout=1, write_timeout=1, baudrate=115200)
if ser.is_open:
ser.write(b'\n')
time.sleep(0.002)
print("Init")
ser.write(b'#')
time.sleep(0.002)
ser.write(b'u')
time.sleep(0.002)
ser.write(b'\n')
time.sleep(0.002)
print("Target")
ser.write([0x02])
time.sleep(0.02)
print("Address")
ser.write([0x29])
time.sleep(0.02)
print("Length")
size = os.path.getsize(filename)
ser.write([size & 0xFF, (size >> 8) & 0xFF])
time.sleep(0.02)
print("Data")
with open(filename, "rb") as f:
for i in progressbar(range(size), "Upload: ", 40):
byte = f.read(1)
ser.write(byte)
time.sleep(0.002)
ser.write(f.read(size))
while ser.out_waiting > 0:
pass
print("Done")
ser.close()
@@ -110,6 +157,7 @@ def main():
parser.add_argument("--bload", dest="bload", action="store_const", const=True, default=False, help="Upload binary to bload")
parser.add_argument("--mojo", dest="mojo", action="store_const", const=True, default=False, help="Upload binary to mojo")
parser.add_argument("--sd", dest="sd", action="store_const", const=True, default=False, help="Upload binary to sd card")
parser.add_argument("--i2c", dest="i2c", action="store_const", const=True, default=False, help="Upload binary to twiboot")
args = parser.parse_args()
@@ -121,6 +169,8 @@ def main():
upload_mojo(args.filename)
elif (args.sd):
upload_sd(args.filename)
elif (args.i2c):
upload_i2c(args.filename)
else:
print("You needs to specify a target")