From 436b5d8c70d12ade24eaad252f0e96ffad969ffe Mon Sep 17 00:00:00 2001 From: Test_User Date: Sun, 11 Jun 2023 04:07:41 -0400 Subject: Progress on assembler to be committed, and a bit of change to its syntax --- assembler/hasm.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++++--- assembler/syntax.txt | 6 +++++- assembler/test.asm | 9 ++++++++ 3 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 assembler/test.asm diff --git a/assembler/hasm.py b/assembler/hasm.py index 2eb5fc7..1cb924b 100755 --- a/assembler/hasm.py +++ b/assembler/hasm.py @@ -1,8 +1,11 @@ #!/usr/bin/env python3 +# Usage of Exception() is to give an easy traceback, not to actually be used as an exception + +import math +import glob import os import sys -import glob datadir = os.path.abspath(os.path.dirname(__file__)+"/../cpu") @@ -39,5 +42,55 @@ for ins in instructions: info["params"] = int(num) -print(instructions) -print(num_instructions) +print("Opcodes:", instructions) +print("Opcode count:", num_instructions) +instruction_bit_size = math.ceil(math.log2(num_instructions)) +print("Bits per opcode:", instruction_bit_size) + +argc = len(sys.argv) +print("Number of args given:", argc) + +if argc < 2 or argc > 3: + raise Exception("Too few arguments given! Syntax: "+sys.argv[0]+" []") + +if argc >= 3: + output = open(sys.argv[2], "wb") +else: + output = open("/dev/stdout", "wb") # not going to fiddle with using fd 1 from python + +print("Using output file", output) + +try: + inputf = open(sys.argv[1], "r") +except Exception: + print("Unable to open file `"+sys.argv[1]+"'! Exiting...") + os._exit(1) + +input = inputf.read() +inputf.close() + +print(input) + +# first pass: evaluate instructions, calculate sizes, validate syntax +linenum = 0 +in_queue = False +last_queue_opcode = None +for line in input.split('\n'): + linenum+=1 + line = line.strip() + + if line == "" or line[0] == ";": + continue + + i=0 + while i < len(line): + if line[i] == " " or line[i] == " ": + break + elif line[i] == "'" or line[i] == "\"" or line == "`": + raise Exception("Invalid instruction at line "+str(linenum)+": "+line) + i+=1 + + print(line[0:i]) + +# second pass: calculate label addresses +# third pass: evaluate parameter values, create binary output diff --git a/assembler/syntax.txt b/assembler/syntax.txt index a3bfc9a..fb1af1a 100644 --- a/assembler/syntax.txt +++ b/assembler/syntax.txt @@ -2,6 +2,8 @@ TODO: possibly simplify this to make it less of a pain to write Leading and trailing whitespace is ignored Comments start with ; and must not be inside "", '', or `` +Comments must be preceeded by a space or tab if not at the start of the line + \ is used for escaping; only applies to ", ', `, and itself when outside of quotations Data-at-address is indicated by [value], where value is anything valid to be used as an indirect reference @@ -20,7 +22,9 @@ Instruction queues are surrounded by { and }: { and } must be on their own in the line (aside for whitespace and comments) -Labels are any combination of non-whitespace from the start of the line to a ':', and not followed by any non-comment non-whitespace +If an instruction is specified without { and }, it is considered to be an instruction queue of only that instruction + +Labels are any combination of non-whitespace non-quotation from the start of the line to a ':', and not followed by any non-comment non-whitespace Labels must not be declared inside instruction queues If a label includes { or }, it must start with {, then a number, then }, to be used as its default size; all other uses of these characters are invalid diff --git a/assembler/test.asm b/assembler/test.asm new file mode 100644 index 0000000..3ff5e25 --- /dev/null +++ b/assembler/test.asm @@ -0,0 +1,9 @@ +start: +{ ; comment after the queue specification + subtract r0, end:, start: ; here's a nice comment + decrement r1 +} +end: + ; another comment + +blahblahblah invalid opcode -- cgit v1.2.3