summaryrefslogtreecommitdiff
path: root/assembly/guessnum-random
diff options
context:
space:
mode:
authorcheapie <cheapiephp@gmail.com>2026-05-30 08:58:29 -0500
committercheapie <cheapiephp@gmail.com>2026-05-30 08:58:29 -0500
commitd609dcb35dafebeafced9c40d92ddd5da630aa54 (patch)
treebe5b1083f2f12173dbe936306e46a11cff4d62ea /assembly/guessnum-random
parent28be6fac111899c930c8072cd42bcbd7be6f5d40 (diff)
downloadrvcontroller-d609dcb35dafebeafced9c40d92ddd5da630aa54.tar
rvcontroller-d609dcb35dafebeafced9c40d92ddd5da630aa54.tar.gz
rvcontroller-d609dcb35dafebeafced9c40d92ddd5da630aa54.tar.bz2
rvcontroller-d609dcb35dafebeafced9c40d92ddd5da630aa54.tar.xz
rvcontroller-d609dcb35dafebeafced9c40d92ddd5da630aa54.zip
Organize files better and include binaries for assembly samples
Diffstat (limited to 'assembly/guessnum-random')
-rw-r--r--assembly/guessnum-random/Makefile24
-rw-r--r--assembly/guessnum-random/guessnum-random.S126
-rwxr-xr-xassembly/guessnum-random/guessnum-random.elfbin0 -> 5984 bytes
-rw-r--r--assembly/guessnum-random/guessnum-random.hex26
-rw-r--r--assembly/guessnum-random/guessnum-random.obin0 -> 2400 bytes
l---------assembly/guessnum-random/rvcontroller.ld1
6 files changed, 177 insertions, 0 deletions
diff --git a/assembly/guessnum-random/Makefile b/assembly/guessnum-random/Makefile
new file mode 100644
index 0000000..62eda18
--- /dev/null
+++ b/assembly/guessnum-random/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-random.hex
+
+guessnum-random.o: guessnum-random.S
+ riscv32-none-elf-as -I../rvcontroller-libraries -march=${MARCH} -o guessnum-random.o guessnum-random.S
+
+guessnum-random.elf: guessnum-random.o
+ riscv32-none-elf-ld -T rvcontroller.ld --no-warn-rwx-segments -o guessnum-random.elf guessnum-random.o
+
+dump: guessnum-random.elf
+ riscv32-none-elf-objdump -d guessnum-random.elf
+
+guessnum-random.hex: guessnum-random.elf
+ riscv32-none-elf-objcopy -O ihex guessnum-random.elf guessnum-random.hex
+
+load: guessnum-random.hex
+ bash -c "wl-copy < guessnum-random.hex"
+
+clean:
+ rm -f guessnum-random.bin guessnum-random.elf guessnum-random.o
+
diff --git a/assembly/guessnum-random/guessnum-random.S b/assembly/guessnum-random/guessnum-random.S
new file mode 100644
index 0000000..0f890cd
--- /dev/null
+++ b/assembly/guessnum-random/guessnum-random.S
@@ -0,0 +1,126 @@
+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
+
+# Replace it with a random number
+li a0,0 # Lower bound = 0
+li a1,100 # Upper bound = 100
+li a7,128 # Get random integer
+ecall
+mv t2,a0
+
+# 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-random/guessnum-random.elf b/assembly/guessnum-random/guessnum-random.elf
new file mode 100755
index 0000000..7b75725
--- /dev/null
+++ b/assembly/guessnum-random/guessnum-random.elf
Binary files differ
diff --git a/assembly/guessnum-random/guessnum-random.hex b/assembly/guessnum-random/guessnum-random.hex
new file mode 100644
index 0000000..7d535d9
--- /dev/null
+++ b/assembly/guessnum-random/guessnum-random.hex
@@ -0,0 +1,26 @@
+:10000000732E10C0AD48294573000000814293084B
+:100010000008054593053006730000002A83850219
+:100020009148170500001305650E73000000954800
+:1000300073000000AA83854873000000AD4829457D
+:100040007300000001459305400693080008730003
+:100050000000AA8363C56300634B73000DA0914841
+:10006000170500001305D50B730000004DBF914824
+:10007000170500001305150C730000004DB79148DB
+:10008000170500001305650C7300000016858548F0
+:10009000730000009148170500001305950C7300CC
+:1000A0000000854363887200170500001305E50B07
+:1000B00073000000AD48294573000000F32E10C006
+:1000C0003385CE4185487300000091481705000034
+:1000D0001305D50973000000AD48294573000000E1
+:1000E0009148170500001305050973000000B14889
+:1000F00073000000AD48730000009302E006E311B6
+:1001000055F0A94873000000456E74657220796F40
+:1001100075722067756573733A0A3E2000546F6FDD
+:10012000206C6F77212054727920616761696E0AB3
+:1001300000546F6F206869676821205472792061CC
+:100140006761696E0A00436F7272656374210A59B0
+:100150006F7520676F7420697420696E3A0A0020F9
+:10016000677565737300657300207365636F6E64F4
+:100170007300506C617920616761696E3F205B5943
+:040180002F6E5D0081
+:00000001FF
diff --git a/assembly/guessnum-random/guessnum-random.o b/assembly/guessnum-random/guessnum-random.o
new file mode 100644
index 0000000..757d611
--- /dev/null
+++ b/assembly/guessnum-random/guessnum-random.o
Binary files differ
diff --git a/assembly/guessnum-random/rvcontroller.ld b/assembly/guessnum-random/rvcontroller.ld
new file mode 120000
index 0000000..bc01402
--- /dev/null
+++ b/assembly/guessnum-random/rvcontroller.ld
@@ -0,0 +1 @@
+../../rvcontroller.ld \ No newline at end of file