summaryrefslogtreecommitdiff
path: root/assembly/guessnum
diff options
context:
space:
mode:
Diffstat (limited to 'assembly/guessnum')
-rw-r--r--assembly/guessnum/Makefile24
-rw-r--r--assembly/guessnum/guessnum.S119
-rwxr-xr-xassembly/guessnum/guessnum.elfbin0 -> 5960 bytes
-rw-r--r--assembly/guessnum/guessnum.hex25
-rw-r--r--assembly/guessnum/guessnum.obin0 -> 2384 bytes
l---------assembly/guessnum/rvcontroller.ld1
6 files changed, 169 insertions, 0 deletions
diff --git a/assembly/guessnum/Makefile b/assembly/guessnum/Makefile
new file mode 100644
index 0000000..98b8d65
--- /dev/null
+++ b/assembly/guessnum/Makefile
@@ -0,0 +1,24 @@
+MARCH ?= rv32imacbzicntr_zicond_zicsr_zifencei_zihintpause_zilsd_zclsd_zabha_zacas_zbkb_zbkx_zcb_zcmp_zcmt
+
+.PHONY: all dump load clean
+
+all: guessnum.hex
+
+guessnum.o: guessnum.S
+ riscv32-none-elf-as -I../rvcontroller-libraries -march=${MARCH} -o guessnum.o guessnum.S
+
+guessnum.elf: guessnum.o
+ riscv32-none-elf-ld -T rvcontroller.ld --no-warn-rwx-segments -o guessnum.elf guessnum.o
+
+dump: guessnum.elf
+ riscv32-none-elf-objdump -d guessnum.elf
+
+guessnum.hex: guessnum.elf
+ riscv32-none-elf-objcopy -O ihex guessnum.elf guessnum.hex
+
+load: guessnum.hex
+ bash -c "wl-copy < guessnum.hex"
+
+clean:
+ rm -f guessnum.bin guessnum.elf guessnum.o
+
diff --git a/assembly/guessnum/guessnum.S b/assembly/guessnum/guessnum.S
new file mode 100644
index 0000000..8d5b2fb
--- /dev/null
+++ b/assembly/guessnum/guessnum.S
@@ -0,0 +1,119 @@
+restart:
+rdtime t3 # Get the time the program was started at
+
+li a7,11 # Print character
+li a0,0xa # \n
+ecall
+li t0,0 # Number of guesses
+
+# Get a random number for the player to guess
+li a7,128 # Get random integer
+li a0,1 # Lower bound = 1
+li a1,99 # Upper bound = 99
+ecall
+mv t1,a0 # Put the result in t1 where it's expected
+
+loop:
+# Increment number of guesses
+addi t0,t0,1
+
+# Prompt player to enter their guess
+li a7,4 # Write string
+la a0,prompt # 'Enter your guess' prompt address
+ecall
+
+# Read the player's guess
+li a7,5 # Read integer
+ecall
+mv t2,a0 # Store it in t2
+
+# Print it back out
+li a7,1 # Write integer
+ecall
+li a7,11 # Write character
+li a0,0xa # \n
+ecall
+
+# Too low?
+blt t2,t1,toolow
+
+# Too high?
+blt t1,t2,toohigh
+
+# Otherwise it must be right
+j correct
+
+toolow:
+# Show too low message
+li a7,4 # Write string
+la a0,toolowmsg
+ecall
+j loop # Go back for the next guess
+
+toohigh:
+# Show too high message
+li a7,4 # Write string
+la a0,toohighmsg
+ecall
+j loop # Go back for the next guess
+
+correct:
+# Show congratulations message
+li a7,4 # Write string
+la a0,correctmsg
+ecall
+
+# Show number of guesses
+mv a0,t0 # Get the number of guesses
+li a7,1 # Write integer
+ecall
+
+# Add proper suffix depending on whether it should be plural or not
+li a7,4 # Write string
+la a0,guessesmsg # "guess"
+ecall
+li t2,1
+beq t0,t2,playagain # Leave it singular if it was 1
+la a0,guessespluralize # "es"
+ecall
+
+playagain:
+li a7,11 # Write character
+li a0,0xa # \n
+ecall
+# Show the number of seconds the player took
+rdtime t4 # Get the current time
+sub a0,t4,t3 # Subtract the start time
+li a7,1 # Write integer
+ecall
+li a7,4 # Write string
+la a0,seconds
+ecall
+
+li a7,11 # Print character
+li a0,0xa # \n
+ecall
+
+# Ask the user if they want to play again
+li a7,4 # Write string
+la a0,playagainmsg
+ecall
+li a7,12 # Read character
+ecall
+li a7,11 # Write character
+ecall
+li t0,0x6e # n
+bne a0,t0,restart
+
+li a7,10 # Exit program
+ecall
+
+
+prompt: .asciz "Enter your guess:\n> "
+toolowmsg: .asciz "Too low! Try again\n"
+toohighmsg: .asciz "Too high! Try again\n"
+correctmsg: .asciz "Correct!\nYou got it in:\n"
+guessesmsg: .asciz " guess"
+guessespluralize: .asciz "es"
+seconds: .asciz " seconds"
+playagainmsg: .asciz "Play again? [Y/n]"
diff --git a/assembly/guessnum/guessnum.elf b/assembly/guessnum/guessnum.elf
new file mode 100755
index 0000000..e130c53
--- /dev/null
+++ b/assembly/guessnum/guessnum.elf
Binary files differ
diff --git a/assembly/guessnum/guessnum.hex b/assembly/guessnum/guessnum.hex
new file mode 100644
index 0000000..d15f60d
--- /dev/null
+++ b/assembly/guessnum/guessnum.hex
@@ -0,0 +1,25 @@
+:10000000732E10C0AD48294573000000814293084B
+:100010000008054593053006730000002A83850219
+:100020009148170500001305650D73000000954801
+:1000300073000000AA83854873000000AD4829457D
+:100040007300000063C56300634B73000DA091480B
+:10005000170500001305D50B73000000C9B79148C0
+:10006000170500001305150C730000004DBF9148E3
+:10007000170500001305650C730000001685854800
+:10008000730000009148170500001305950C7300DC
+:100090000000854363887200170500001305E50B17
+:1000A00073000000AD48294573000000F32E10C016
+:1000B0003385CE4185487300000091481705000044
+:1000C0001305D50973000000AD48294573000000F1
+:1000D0009148170500001305050973000000B14899
+:1000E00073000000AD48730000009302E006E319BE
+:1000F00055F0A94873000000456E74657220796F51
+:1001000075722067756573733A0A3E2000546F6FED
+:10011000206C6F77212054727920616761696E0AC3
+:1001200000546F6F206869676821205472792061DC
+:100130006761696E0A00436F7272656374210A59C0
+:100140006F7520676F7420697420696E3A0A002009
+:10015000677565737300657300207365636F6E6404
+:100160007300506C617920616761696E3F205B5953
+:040170002F6E5D0091
+:00000001FF
diff --git a/assembly/guessnum/guessnum.o b/assembly/guessnum/guessnum.o
new file mode 100644
index 0000000..18672aa
--- /dev/null
+++ b/assembly/guessnum/guessnum.o
Binary files differ
diff --git a/assembly/guessnum/rvcontroller.ld b/assembly/guessnum/rvcontroller.ld
new file mode 120000
index 0000000..bc01402
--- /dev/null
+++ b/assembly/guessnum/rvcontroller.ld
@@ -0,0 +1 @@
+../../rvcontroller.ld \ No newline at end of file