From e10c5410754ece4daf0fa838a2097a87e03e6c8c Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Wed, 30 Dec 2020 03:25:26 +0100 Subject: [PATCH] Updated scripts and added i2c upload --- convert-font.py | 27 ---------- font.png | Bin 9449 -> 0 bytes out.img | Bin 0 -> 102400 bytes scripts/__pycache__/mojo.cpython-39.pyc | Bin 0 -> 5347 bytes scripts/create_disk.py | 42 +++++++++++---- scripts/upload.py | 68 ++++++++++++++++++++---- source.sh | 2 +- 7 files changed, 91 insertions(+), 48 deletions(-) delete mode 100755 convert-font.py delete mode 100644 font.png create mode 100644 out.img create mode 100644 scripts/__pycache__/mojo.cpython-39.pyc diff --git a/convert-font.py b/convert-font.py deleted file mode 100755 index 743b504..0000000 --- a/convert-font.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/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/font.png b/font.png deleted file mode 100644 index cf40afa67a2e6d0cd3483a29ae25e329f4db693c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9449 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 diff --git a/out.img b/out.img new file mode 100644 index 0000000000000000000000000000000000000000..472339bb30a1f0bcba7e6e62118e623a7561a1b8 GIT binary patch literal 102400 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 p(GW=0*kz1FM0e*g?WJ+_LGGUsx{T=v&5Iq0@ literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/mojo.cpython-39.pyc b/scripts/__pycache__/mojo.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..330d2e56ae743ea5796e136233cdabe0fd26a45d GIT binary patch literal 5347 zcmb_gOK%*<5uTozoqceZq9}@@_44RJNo#ADv?M#Wlh~0$QW0X&f~5GdvauO%56Pis zXVyKvlsOrm$EBW7@k~aMsk^!di=IEsJS!^0J7yZRt((v9@j`#!6v>iK?^`?IG4c7B@@$60Jr&F3T$w^bhgN{0e{h zk+E*l3Neko(&DdB-;o`ypODu3TA)vB=&5e7XccuWuZO9|C~Wh<<9#}iLa+E7^$6-e z!1k-kmxGB(yodU3zrcZQ@mD#jdaERX-y!_Q@H_kvYp^p5aB3U6&~oV-+W$tHYuGQZ z&BwDhu~qEVOU-H9i)`QPxIyG{yB}~@*mBvmuituW^|IXwduzg5T9)>u>6b3sHyw$- z2lm_NuZN=R1o4D2v*5`{3fJk{e&~>a)k}4j4skc?2(Kr-Fu03$Nw^>NJ>l}SJWyzr zuidzN=kD#kTHGcIkqm_!pZ#yF*G*BxVM$GRFH_6uko$tp5X_6X&}ay!n;KLM zDYNZPi1Fs)(>JnV?ZM=1HHR?p*T{Wn)C-~tL!w3l6qH_C|z*|Q$7;>N{B1AXwhpsILm zmRk0r??lTs6x7N=lEkm#4s*qGtTYRnCPQMdTzcd4%B|-|mG% z+KXYfIZ4pIHjX|A=YmYV{wq8ov&Rlt~44w5iXJOw6smdliM-c=GY64 zupcbb{>wI>7c4aegDFq@HL}APC~W7V^tvwAAwD)A?sF2S$PSz?&eImD#iO@`+j9i$ zP~22}>f>n%I~QDpZ1}2J>UZ5h-lC>Rk2{>VyM5WmE?#T9A9wtIHXcgbdc2{aCUvMZhM@@1Hj=17anz#trCl{xd!>&7p z$W7f6;fmXl(Nz5E^pp%kKbp#Ji%4yQW^WDY%<+Pw(2M?tLSv?0WmRS}J^OxdSp%9l zPps0OHq-xUjXuRG{~tKd8mUs!ORU5yhR(*B#fI64F#&HY;L$gu(D#FB5HF)d6Z6_S ziK2ttJouQP=n_&{dj&*-ynP=Vo3b}({k|q9xK5coVTm?|Y_qN_TAv`=kjUzr2BC;V zAJdL#ypR~Gwxq_3nZ`Kyl+To``4|~b<%ZI{ppdKm9_zJxPuQ6!%#KSR+7~AIs%vecei|O$Inn zlzLJ`h)U8(0BFmhR`!l(z5zN^ zo?)@HQX=rktB>^c3i+5+_S=N!9BkC?>qNoE@W5{EK70`i;2j{I+?h3jt1o1kqB^5} zc{l_Ok&Q?r$%-6GhPXk1Dk&XP5NU&b)RWdq6*C+mnIQA5_zcg!hGz$r zXJ5mM(Sc_Nm1p0BcW9qy=7t`9ix^T#F&tA?b$}%s(uYYJ{O#2)^Kn?$#Z00~NE{iA zF^(~G@mugF_KiXMh~s)$)>ek$p^7hmZbDnHCAFlaEPkpiehTfQxkc(Bi(i0u>}iV$ zRvY^dF;)6sDgCb?dwkm?^pO6y;GNi~Z*CaTH8tOpPesuX=kh3mg6{L%_7GWP!w}cN zv-jFlm%^#}R2K{1Q8K%&u7~)Qo0Nh99Rd4zhHu=C=dQZD;E#hesO|*YQ&8ph)tm9p zl^*wyAOS6qihCiXI-w9q2L9S9K+OBd`F#QKhvcuaK1Rs}lm~P1tN+8`b8lU}^DCwQ zPCWmg^)K%6Tq)Z$pBxNfLe8Re#REt1Xp8Ra)bc$keHX}}ys#$SPyh(4@!rmZ<#g@` z;RE00O8^Fu7rTUT24Jyizl-aWAi{tZ|5W+8=m3f+1iZ__vkc7SQO)jQR#BtR#D|rY zWhb&1TsO!Nnakso`;2EuZLktb`A$5H+z#|dev!Q5{yDxd=ZQ$#*Dz1}0SvD?KE_^h zrJ6uyiDuY@qym6EbR)Im0KF1fJ=XwE2dblRHMafRN3)8M${P;ttyrj02lu(AYY_I zH@cMNl+W~dhU@BCpiZ^grzX*d7? literal 0 HcmV?d00001 diff --git a/scripts/create_disk.py b/scripts/create_disk.py index 024c513..d2f7a70 100755 --- a/scripts/create_disk.py +++ b/scripts/create_disk.py @@ -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() diff --git a/scripts/upload.py b/scripts/upload.py index fb1f1f4..6898986 100755 --- a/scripts/upload.py +++ b/scripts/upload.py @@ -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") diff --git a/source.sh b/source.sh index 1c21fd1..49414cf 100644 --- a/source.sh +++ b/source.sh @@ -1,4 +1,4 @@ # This order makes it so we can use deactive to also deactive the other additions to the path sudo chown tim:tim /dev/sdb source $(dirname $(readlink -f $0))/env/bin/activate -PATH=$(dirname $(readlink -f $0))/arm-none-eabi/bin:$(dirname $(readlink -f $0))/microblazeel-xilinx-elf/bin:$(dirname $(readlink -f $0))/bin:/opt/Xilinx/14.7/ISE_DS/EDK/bin/lin64:$PATH +PATH=$(dirname $(readlink -f $0))/arm-none-eabi/bin:$(dirname $(readlink -f $0))/microblazeel-xilinx-elf/bin:$(dirname $(readlink -f $0))/bin:/opt/Xilinx/14.7/ISE_DS/EDK/bin/lin64:/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64:$PATH