# Unit tests harness
# Read suite name from stdin, then run that suite

.org 0
# Provide program starting address to linker
.global read
.global streq

# .extern fmt_decimal

/* newlib system calls */
.set SYSEXIT,  93
.set SYSREAD, 63
.set SYSWRITE, 64

.section .rodata

inputs:
    .word 0, 1, 2, 3, 9, 10, 100, 0x80000000
inputs_end:

.section .bss

buf: .skip 11
inbuf: .skip 80

.text

_start2:
    la a0, inbuf
    li a1, 80
    jal read

    mv a2, a0           # move bytes read to a2
    li t0, SYSWRITE     # "write" syscall
    li a0, 1            # 1 = standard output (stdout)
    la a1, inbuf        # load address of buffer
    ecall               # invoke syscall to print the string

    li t0, SYSEXIT      # "exit" syscall
    la a0, 0            # Use 0 return code
    ecall               # invoke syscall to terminate the program


# Read from stdin
#    arguments:
#       a0: address of buffer to read into
#       a1: number of bytes to read
#    return:
#       a0: count of bytes read, or error if < 0

read:
    li t0, SYSREAD      # "read" syscall
    mv a2, a1           # bytes to read
    mv a1, a0           # buffer address
    li a0, 0            # 0 = standard input (stdin)
    ecall               # invoke syscall
    ret


# Determine if two strings are equal
#    arguments:
#       a0: address of first string
#       a1: length of first string
#       a2: address of second string
#       a3: length of second string
#    return:
#       a0: 1 if equal, 0 otherwise
streq:
    bne a1, a2, 2f      # If the lengths are not the same then the strings are different
1:
    beqz a1, 3f         # If the remaining length is zero, string are the same
    lbu a4, 0(a0)       # load byte from string 1
    lbu a5, 0(a2)       # load byte from string 2
    bne a4, a5, 2f      # return false if bytes are not equal
    addi a1, a1, -1     # decrement a1
    addi a0, a0, 1      # go to next byte of string 1
    addi a2, a2, 1      # go to next byte of string 2
    j 1b                # loop
2:
    li a0, 0            # 0 = false
    ret
3:
    li a0, 1            # 1 = true
    ret