summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob McDonnell <jacob@jacobmcdonnell.com>2024-05-10 14:37:32 -0400
committerJacob McDonnell <jacob@jacobmcdonnell.com>2024-05-10 14:37:32 -0400
commit532f8276fb76f9dd0bbdfefc2bf970fb42858a7d (patch)
tree6bf2890b49aae06f87280ec97068b3962cf3d0d4
parent3240bc6540044d283b09a61d7d48ed562a51ae9b (diff)
More Robust REGEX parsing
-rwxr-xr-xqdmabin0 -> 2427020 bytes
-rwxr-xr-xqdma.go45
-rwxr-xr-xtests/test.asm (renamed from test.asm)0
-rwxr-xr-xtests/test.bin (renamed from test.bin)bin32 -> 32 bytes
-rwxr-xr-xtests/test2.asm (renamed from test2.asm)0
-rw-r--r--tests/test3.asm6
-rw-r--r--tests/test3.bin0
7 files changed, 44 insertions, 7 deletions
diff --git a/qdma b/qdma
new file mode 100755
index 0000000..29ddd33
--- /dev/null
+++ b/qdma
Binary files differ
diff --git a/qdma.go b/qdma.go
index 37e83a1..a968397 100755
--- a/qdma.go
+++ b/qdma.go
@@ -3,8 +3,8 @@ package main
import (
"bufio"
"encoding/binary"
- "log"
"os"
+ "regexp"
"strconv"
"strings"
)
@@ -85,7 +85,10 @@ func Encode(instruction string) uint32 {
if instruction == "syscall" {
return 12
}
- inst := strings.Fields(strings.ReplaceAll(instruction, ",", ""))
+ inst, err := parse(instruction)
+ if err != nil {
+ panic(err)
+ }
if Instructions[inst[0]].isRtype {
ret = (RegNums[inst[2]] << 21) | (RegNums[inst[3]] << 16) |
(RegNums[inst[1]] << 11) | Instructions[inst[0]].opcode
@@ -93,7 +96,7 @@ func Encode(instruction string) uint32 {
var imm int32
i, err := strconv.Atoi(inst[3])
if err != nil {
- log.Fatal(err)
+ panic(err)
}
imm = int32(i)
ret = (Instructions[inst[0]].opcode << 26) | (RegNums[inst[2]] << 21) |
@@ -105,13 +108,13 @@ func Encode(instruction string) uint32 {
func Assemble(path string) {
file, err := os.Open(path)
if err != nil {
- log.Fatal(err)
+ panic(err)
}
defer file.Close()
out, err := os.Create(strings.ReplaceAll(path, ".asm", ".bin"))
if err != nil {
- log.Fatal(err)
+ panic(err)
}
defer out.Close()
@@ -123,14 +126,42 @@ func Assemble(path string) {
binary.BigEndian.PutUint32(bs, Encode(s))
_, err := out.Write(bs)
if err != nil {
- log.Fatal(err)
+ panic(err)
}
}
}
if err := scanner.Err(); err != nil {
- log.Fatal(err)
+ panic(err)
+ }
+}
+
+func parse(s string) ([]string, error) {
+ /* regex to match 00($t0)
+ offset, err := regexp.Compile("[0-9]+\\((.*)+\\)")
+ if err != nil {
+ panic(err)
+ }*/
+
+ edgeWs, err := regexp.Compile("(^\\s+|\\s+$)+")
+ if err != nil {
+ return nil, err
}
+
+ whiteSpace, err := regexp.Compile("\\s+")
+ if err != nil {
+ return nil, err
+ }
+
+ repeatComma, err := regexp.Compile(",{2,}")
+ if err != nil {
+ return nil, err
+ }
+
+ s = edgeWs.ReplaceAllString(s, "")
+ s = whiteSpace.ReplaceAllString(s, ",")
+ s = repeatComma.ReplaceAllString(s, ",")
+ return strings.Split(s, ","), nil
}
func main() {
diff --git a/test.asm b/tests/test.asm
index fbb450b..fbb450b 100755
--- a/test.asm
+++ b/tests/test.asm
diff --git a/test.bin b/tests/test.bin
index 2cf7b8d..2cf7b8d 100755
--- a/test.bin
+++ b/tests/test.bin
Binary files differ
diff --git a/test2.asm b/tests/test2.asm
index e22cd5e..e22cd5e 100755
--- a/test2.asm
+++ b/tests/test2.asm
diff --git a/tests/test3.asm b/tests/test3.asm
new file mode 100644
index 0000000..cf5b1a8
--- /dev/null
+++ b/tests/test3.asm
@@ -0,0 +1,6 @@
+addiu $sp,$sp,-40
+sw $31,36($sp)
+sw $fp,32($sp)
+sw $16,28($sp)
+move $fp,$sp
+sw $4,40($fp)
diff --git a/tests/test3.bin b/tests/test3.bin
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/test3.bin