From 26d9836d4e47526ebd4199781d24bb39f4f2ddf6 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Sat, 19 Sep 2020 23:46:16 +0200 Subject: [PATCH] Moved scripts from all over the place into tools --- .gitignore | 5 ++- convert-font.py | 27 +++++++++++++ create_img.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ font.png | Bin 0 -> 9449 bytes setup.sh | 24 +++--------- upload.py | 96 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 234 insertions(+), 19 deletions(-) create mode 100755 convert-font.py create mode 100755 create_img.py create mode 100644 font.png create mode 100755 upload.py diff --git a/.gitignore b/.gitignore index 9f08d29..fe4cbb9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ -dfu-util arm-none-eabi-gcc +disk.img +env +sdcc-code +zasm diff --git a/convert-font.py b/convert-font.py new file mode 100755 index 0000000..743b504 --- /dev/null +++ b/convert-font.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +import imageio +import math + +asci = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~" +font = "font.png" + +im = imageio.imread(font) + +for c in asci: + + base_x = (ord(c) % 16) * 16 + base_y = math.floor(ord(c)/16) * 16 + + n = 0 + for y in range(16): + n = n << 16 + k = 0 + for x in range(16): + d = im[base_y + y][base_x + x][0] + k = k << 1 + if d == 255: + k = k + 1 + + n = n + k + + print("assign char_data[{:2}] = 256'h{:064x}; // {}".format(ord(c)-32, n, c)) diff --git a/create_img.py b/create_img.py new file mode 100755 index 0000000..1a4d3a2 --- /dev/null +++ b/create_img.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +import math + +pageSize = 128 +sectorsPerTrack = 256 +blockSize = 16384 +maxDirs = 128 +dirBlocks = 1 + +# @todo Currently the tool assumes your are running in a subfolder from z80 + +out = open('../tools/disk.img', 'wb') + +def addBootloader(name): + loader = open(name, 'rb') + b = loader.read() + + if len(b) > pageSize: + raise RuntimeError("Bootloader binary cannot be larger than one page") + + out.seek(0) + out.write(b) + +def addOS(cpmName, biosName): + cpm = open(cpmName, 'rb') + bios = open(biosName, 'rb') + + b = cpm.read() + out.seek(pageSize) + out.write(b) + + b = bios.read() + out.seek(pageSize + 0x1600) + out.write(b) + +def seekBlock(i): + # Blocks start at track 1, sector 0 + out.seek(pageSize*sectorsPerTrack + i*blockSize) + +def initDirs(): + seekBlock(0) + out.write(bytearray(([0xe5] + [0x00] * 31) * maxDirs)) + +fileCounter = 0 +def addFile(filename, n, t): + global fileCounter + + 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") + + if len(t) > 3: + raise RuntimeError("Filetype cannot be longer than 3") + + f = open(filename, 'rb') + b = f.read() + + seekBlock(0) + out.seek(32*fileCounter, 1) + + # Write user (assume 0 for now) + out.write(bytearray(1)) + + # Write the name + out.write(n.upper().encode("ascii")) + out.write((" " * (8-len(n))).encode("ascii")) + + # Write the type + out.write(t.upper().encode("ascii")) + out.write((" " * (3-len(t))).encode("ascii")) + + # Write extend (assume no extend for now) + out.write(bytearray(2)) + + # Reserved byte + out.write(bytearray(1)) + + # Number of records (Again assuming no extends <128) + out.write(math.ceil(len(b)/128).to_bytes(1, byteorder='little')) + + # We are assuming one block per file for now, so we can use fileCounter + out.write(fileCounter.to_bytes(2, byteorder='little')) + + seekBlock(fileCounter) + out.write(b) + + +addBootloader('../cpm/.build/loader.bin') +addOS('../cpm/.build/cpm22.bin', '../cpm/.build/bios.bin') + +initDirs() + +addFile("../cpm/.build/MONITOR.COM", "MONITOR", "COM") +addFile("../cpm/bin/STAT.COM", "STAT", "COM") +addFile("../qe/.build/test.com", "test", "COM") +addFile("../qe/.build/qe.com", "qe", "COM") +addFile("../xed/.build/xed.com", "xed", "COM") diff --git a/font.png b/font.png new file mode 100644 index 0000000000000000000000000000000000000000..cf40afa67a2e6d0cd3483a29ae25e329f4db693c GIT binary patch literal 9449 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 literal 0 HcmV?d00001 diff --git a/setup.sh b/setup.sh index f062105..049b2e8 100755 --- a/setup.sh +++ b/setup.sh @@ -1,25 +1,13 @@ #!/bin/bash -command -v make >/dev/null 2>&1 || echo >&2 "Please install make" -command -v zasm >/dev/null 2>&1 || echo >&2 "Please install zasm" -command -v grep >/dev/null 2>&1 || echo >&2 "Please install grep" -command -v wget >/dev/null 2>&1 || echo >&2 "Please install wget" -command -v unzip >/dev/null 2>&1 || echo >&2 "Please install unzip" -command -v tar >/dev/null 2>&1 || echo >&2 "Please install tar" - -# @todo Check if pyserial is installed -# @todo Check if a serial terminal is installed -if [ "$(uname -r | sed -n 's/.*\( *Microsoft *\).*/\1/p')" == "Microsoft" ]; then - wget http://dfu-util.sourceforge.net/releases/dfu-util-0.9-win64.zip -O dfu-util.zip - unzip dfu-util.zip - mv dfu-util-0.9-win64 dfu-util - rm dfu-util.zip - # todo Check python3 -else - command -v python3 >/dev/null 2>&1 || echo >&2 "Please install python3" -fi +# @todo Check if all the required programs are installed wget https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v9.2.1-1.1/xpack-arm-none-eabi-gcc-9.2.1-1.1-linux-x64.tar.gz -O arm-none-eabi-gcc.tar.gz tar xvf arm-none-eabi-gcc.tar.gz mv xpack-arm-none-eabi-gcc-9.2.1-1.1 arm-none-eabi-gcc rm arm-none-eabi-gcc.tar.gz +svn checkout svn://svn.code.sf.net/p/sdcc/code/trunk sdcc-code + +python -m venv env +source env/bin/activate +pip install pyserial imageio diff --git a/upload.py b/upload.py new file mode 100755 index 0000000..e2041da --- /dev/null +++ b/upload.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +import serial +import os +import sys +import time +import argparse + +def progressbar(it, prefix="", size=60, file=sys.stdout): + count = len(it) + def show(j): + x = int(size*j/count) + file.write("%s[%s%s] %i/%i\r" % (prefix, "#"*x, "."*(size-x), j, count)) + file.flush() + show(0) + for i, item in enumerate(it): + yield item + show(i+1) + file.write("\n") + file.flush() + +def rom_upload(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 + ser.write(b'#') + time.sleep(0.002) + ser.write(b'u') + time.sleep(0.002) + ser.write(b'\n') + time.sleep(0.002) + + size = os.path.getsize(filename) + ser.write([size & 0xFF]) + time.sleep(0.002) + ser.write([(size >> 8) & 0xFF]) + time.sleep(0.002) + + 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.close() + + else: + print("Failed to open serial port") + +def serial_upload(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: + size = os.path.getsize(filename) + + with open(filename, "rb") as f: + for i in progressbar(range(size), "Upload: ", 40): + byte = f.read(1) + ser.write(byte) + + if byte == b'#': + time.sleep(0.002) + ser.write(b'#') + time.sleep(0.002) + ser.write(b'\n') + + time.sleep(0.002) + + ser.close() + + else: + print("Failed to open serial port") + +def main(): + parser = argparse.ArgumentParser(description="Upload binaries to the z80 computer.") + parser.add_argument("filename", help="file to upload") + parser.add_argument("--rom", dest="rom", action="store_const", const=True, default=False, help="Upload binary to rom") + parser.add_argument("--serial", dest="serial", action="store_const", const=True, default=False, help="Upload binary over serial") + + args = parser.parse_args() + + if (args.rom): + rom_upload(args.filename) + elif (args.serial): + serial_upload(args.filename) + else: + print("You needs to specify a target") + + + +if "__main__": + main()