diff --git a/README.md b/README.md new file mode 100644 index 0000000..67ccd48 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Pong RISCV +A (very) simple 32-bit RISCV processor with a loaded Pong game to show it off +![Video of processor in function](pong_riscv.gif) + +This has been done for the exam "Architettura dei Calcolatori" at UniMoRe. + +### Notes +Even if the GIF is slowed down the circuit isn't optimized, and it seems to run + at ~100Hz on my computer. + +To create the code to load in the logisim ROM you can use the script `compile_program.sh`, you need to have +[RARS](https://github.com/TheThirdOne/rars) installed for it to work. diff --git a/compile_program.sh b/compile_program.sh new file mode 100755 index 0000000..f6d3477 --- /dev/null +++ b/compile_program.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +if (( $# < 2 )); then + echo "Usage ./compile.sh " + exit 1 +fi + +tmp=".tmpcompilefile_plsdontuseme.hex" + +rars a dump .text HexText "$tmp" "$1" + +echo "v2.0 raw" > "$2" +cat "$tmp" >> "$2" + +rm "$tmp" + diff --git a/imgcvt.py b/imgcvt.py new file mode 100644 index 0000000..5fedc45 --- /dev/null +++ b/imgcvt.py @@ -0,0 +1,43 @@ + + +import PIL +from PIL import Image +from bitstring import BitString + +# CLI +import climax + + +def bitlist_parse(bits): + res = BitString(bits) + for x in bits: + res <<= 1 + res += bits[x] + return res + + + +def print_img(path): + image = Image.open("logo.png") + + data = image.getdata() + + pixels = data.pixel_access() + binimg = [BitString([pixels[x, y][0] == 0 for x in range(32)]) for y in range(32)] + + for index, row in enumerate(binimg): + if row.all(False): + print('\tsw\tzero,{}(x3)'.format(index * 4)) + else: + print('\tli\tt0,0x{}'.format(row.hex)) + print('\tsw\tt0,{}(x3)'.format(index * 4)) + + +@climax.command() +@climax.argument('path', type=str, help='Path to the image file') +def main(path): + print_img(path) + + +if __name__ == '__main__': + main() diff --git a/logisim_riscv.circ b/logisim_riscv.circ new file mode 100644 index 0000000..3735bfc --- /dev/null +++ b/logisim_riscv.circ @@ -0,0 +1,6510 @@ + + +This file is intended to be loaded by Logisim (http://www.cburch.com/logisim/). + + + + + + + + + + + + + + + + + + + addr/data: 8 8 +0 + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Clk + An + Bn + A + B + WData + Wen + Wn + Reg + Reset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Instr + Type + Imm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rs1 + Rs2 + Rd + F3 + F7 + Type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Branch + RegWrite + AluSrc + MemToReg + MemRead + MemWrite + Instr + Type + F3 + F7 + AluOp + BranchReg + !Link + AluNB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ALU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nB + Cout + Cin + + A + B + + Z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ALU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Brn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Clk + Rst + Mem + Screen + Controller + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Addr + WData + RData + HoldClk + Map + Rst Clk + Width + En + Read + Write + Mem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPU + Clk + Rst + Map + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + addr/data: 16 32 +40001b7 228000ef f00413 f00493 b00913 b00993 100a13 100a93 +20000ef 68000ef ffdff06f 6f 50663 fff50513 ff9ff06f 8067 +2000293 fff28293 313 929663 800003b7 83d333 300393 41228e33 +7e7663 40000e37 1c30333 41328e33 7e7463 230313 229393 3383b3 +63a023 fc0290e3 8067 1001c283 32f313 6030263 ffe30313 2034863 +4098c63 fff98993 299313 330333 32383 238393 732023 c32e03 +ffee0e13 1c32623 300006f fe398313 2030463 198993 299313 330333 +ffc32383 ffe38393 fe732e23 832e03 2e0e13 1c32423 22d313 6030663 +ffe30313 2034a63 6090063 fff90913 291313 330333 32383 400002b7 +5383b3 732023 c32e03 405e0e33 1c32623 340006f fe390313 2030663 +190913 291313 330333 ffc32383 400002b7 405383b3 fe732e23 832e03 +5e0e33 1c32423 14402b3 1548333 2000393 35863 313 100a93 +100006f 734663 1f00313 fff00a93 2d863 293 100a13 500006f +72c863 1f00293 fff00a13 400006f 100393 729e63 412303b3 300e13 +3c3f663 128293 100a13 200006f 1e00393 729c63 413303b3 300e13 +1c3f663 fff28293 fff00a13 249e13 3e0e33 e2e83 80000f37 8f5fb3 +1feceb3 1de2023 231e13 3e0e33 e2e83 5f5fb3 1feceb3 1de2023 +28413 30493 8067 1a023 576742b7 a8028293 51a223 755432b7 +a8028293 51a423 575632b7 38028293 51a623 555432b7 90028293 51a823 +556742b7 b0028293 51aa23 1ac23 1ae23 777772b7 28293 251a023 +554422b7 28293 251a223 657722b7 28293 251a423 551122b7 28293 +251a623 577772b7 28293 251a823 201aa23 477752b7 bb828293 251ac23 +455472b7 8a828293 251ae23 457672b7 92828293 451a023 456462b7 a2828293 +451a223 775752b7 bb828293 451a423 401a623 54b802b7 1f028293 451a823 +569002b7 2e828293 451aa23 569002b7 5f428293 451ac23 559012b7 f1e28293 +451ae23 74b812b7 a0a28293 651a023 12b7 a0a28293 651a223 577712b7 +ffe28293 651a423 755402b7 6ac28293 651a623 556602b7 4a428293 651a823 +555402b7 20828293 651aa23 575702b7 1f028293 651ac23 601ae23 8067 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mapper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..5ba99cc Binary files /dev/null and b/logo.png differ diff --git a/pong_riscv.gif b/pong_riscv.gif new file mode 100644 index 0000000..159377f Binary files /dev/null and b/pong_riscv.gif differ diff --git a/riscv_pong.asm b/riscv_pong.asm new file mode 100644 index 0000000..74a7ad8 --- /dev/null +++ b/riscv_pong.asm @@ -0,0 +1,313 @@ + +.globl main + +# x3 will ALWAYS contain the base address of +# the display memory +# heap begins at 0x1000 (I hope I won't override it) +# ball position can stay in s0, s1 (x, y) +# s2 will contain the left paddle and s3 will contian the right one +# s4, s5 will contain the ball's velocity + + +main: + + lui x3, 0x4000 + jal print_logo + + addi s0, zero, 15 + addi s1, zero, 15 + addi s2, zero, 11 + addi s3, zero, 11 + addi s4, zero, 1 + addi s5, zero, 1 + + jal redraw_all + +loop: + jal redraw_update + jal x0, loop + + + +end: jal x0, end + + +wait: + beq a0, zero, wait_end + addi a0, a0, -1 + b wait + +wait_end: + ret + + # ----------------- REDRAW ALL ----------------- + +redraw_all: + # t0 is the row we're drawing + addi t0, zero, 32 + + +l1: + # Decrement + addi t0, t0, -1 + + # And this is the result + addi t1, zero, 0 + + # Draw ball + bne t0, s1, after_ball + lui t2, 0x80000 + srl t1, t2, s0 + +after_ball: + + # Paddle size + 1 + addi t2, zero, 3 + # Draw left paddle + sub t3, t0, s2 + bgeu t3, t2, after_lpaddle + lui t3, 0x40000 + add t1, t1, t3 +after_lpaddle: + sub t3, t0, s3 + bgeu t3, t2, after_rpaddle + addi t1, t1, 2 + +after_rpaddle: + slli t2, t0, 2 + add t2, t2, x3 + sw t1, 0(t2) + bne t0, zero, l1 + + ret + + # ----------------- UPDATE ----------------- + + # Right paddle +redraw_update: + lbu t0, 0x100(x3) + + andi t1, t0, 0x3 + beq t1, zero, after_rpaddle1 + + addi t1, t1, -2 + + blt t1, zero, L1 + # < 0 => UP + beq s3, zero, after_rpaddle1 # Can't go any higher + addi s3, s3, -1 + slli t1, s3, 2 + + add t1, t1, x3 # t1 = address of first paddle row + lw t2, 0(t1) + addi t2, t2, 2 # Add paddle pixel + sw t2, 0(t1) + lw t3, 12(t1) + addi t3, t3, -2 # Remove paddle pixel + sw t3, 12(t1) + b after_rpaddle1 +L1: + # > 0 => DOWN + addi t1, s3, -29 # Last pixel is in position 32 - 3 = 29 + beq t1, zero, after_rpaddle1 + addi s3, s3, 1 + slli t1, s3, 2 + add t1, t1, x3 # t1 = address of first paddle row + lw t2, -4(t1) + addi t2, t2, -2 # Add paddle pixel + sw t2, -4(t1) + lw t3, 8(t1) + addi t3, t3, 2 # Remove paddle pixel + sw t3, 8(t1) + + +after_rpaddle1: + + # Left paddle + + srli t1, t0, 2 + beq t1, zero, after_lpaddle1 + + addi t1, t1, -2 + + blt t1, zero, L2 + # < 0 => UP + beq s2, zero, after_lpaddle1 # Can't go any higher + addi s2, s2, -1 + slli t1, s2, 2 + + add t1, t1, x3 # t1 = address of first paddle row + lw t2, 0(t1) + lui t0, 0x40000 + add t2, t2, t0 # Add paddle pixel + sw t2, 0(t1) + lw t3, 12(t1) + sub t3, t3, t0 # Remove paddle pixel + sw t3, 12(t1) + b after_lpaddle1 +L2: + # > 0 => DOWN + addi t1, s2, -29 # Last pixel is in position 32 - 3 = 29 + beq t1, zero, after_lpaddle1 + addi s2, s2, 1 + slli t1, s2, 2 + add t1, t1, x3 # t1 = address of first paddle row + lw t2, -4(t1) + lui t0, 0x40000 + sub t2, t2, t0 # Add paddle pixel + sw t2, -4(t1) + lw t3, 8(t1) + add t3, t3, t0 # Remove paddle pixel + sw t3, 8(t1) + +after_lpaddle1: + + # TBall + + add t0, s0, s4 + add t1, s1, s5 + addi t2, zero, 32 + + bge t1, zero, not_over + addi t1, zero, 0 + addi s5, zero, 1 + b after_y_checks +not_over: + blt t1, t2, after_y_checks + addi t1, zero, 31 + addi s5, zero, -1 + +after_y_checks: + + # Now x checks + bge t0, zero, not_left + addi t0, zero, 0 + addi s4, zero, 1 + b after_paddle_checks +not_left: + blt t0, t2, after_x_checks + addi t0, zero, 31 + addi s4, zero, -1 + b after_paddle_checks + +after_x_checks: + + # Now paddle checks (OMG this will be soo slow) + addi t2, zero, 1 + bne t0, t2, not_lpaddle + sub t2, t1, s2 + addi t3, zero, 3 # Paddle size + bgeu t2, t3, after_paddle_checks + addi t0, t0, 1 + addi s4, zero, 1 + b after_paddle_checks + +not_lpaddle: + + addi t2, zero, 30 + bne t0, t2, after_paddle_checks + sub t2, t1, s3 + addi t3, zero, 3 # Paddle size + bgeu t2, t3, after_paddle_checks + addi t0, t0, -1 + addi s4, zero, -1 + +after_paddle_checks: + + # Ok now delete old pixel, add new pixel + slli t3, s1, 2 + add t3, t3, x3 + lw t4, 0(t3) + lui t5, 0x80000 + srl t6, t5, s0 + xor t4, t4, t6 + sw t4, 0(t3) + + slli t3, t1, 2 + add t3, t3, x3 + lw t4, 0(t3) + srl t6, t5, t0 + xor t4, t4, t6 + sw t4, 0(t3) + + addi s0, t0, 0 + addi s1, t1, 0 + + ret + + # ----------------- PRINT LOGO ----------------- + +print_logo: + # Why haven't I implemented .data? + + sw zero,0(x3) + li t0,0x57673a80 + sw t0,4(x3) + li t0,0x75542a80 + sw t0,8(x3) + li t0,0x57563380 + sw t0,12(x3) + li t0,0x55542900 + sw t0,16(x3) + li t0,0x55673b00 + sw t0,20(x3) + sw zero,24(x3) + sw zero,28(x3) + li t0,0x77777000 + sw t0,32(x3) + li t0,0x55442000 + sw t0,36(x3) + li t0,0x65772000 + sw t0,40(x3) + li t0,0x55112000 + sw t0,44(x3) + li t0,0x57777000 + sw t0,48(x3) + sw zero,52(x3) + li t0,0x47774bb8 + sw t0,56(x3) + li t0,0x455468a8 + sw t0,60(x3) + li t0,0x45766928 + sw t0,64(x3) + li t0,0x45645a28 + sw t0,68(x3) + li t0,0x77574bb8 + sw t0,72(x3) + sw zero,76(x3) + li t0,0x54b801f0 + sw t0,80(x3) + li t0,0x569002e8 + sw t0,84(x3) + li t0,0x569005f4 + sw t0,88(x3) + li t0,0x55900f1e + sw t0,92(x3) + li t0,0x74b80a0a + sw t0,96(x3) + li t0,0x00000a0a + sw t0,100(x3) + li t0,0x57770ffe + sw t0,104(x3) + li t0,0x755406ac + sw t0,108(x3) + li t0,0x556604a4 + sw t0,112(x3) + li t0,0x55540208 + sw t0,116(x3) + li t0,0x575701f0 + sw t0,120(x3) + sw zero,124(x3) + + ret + + + + + + + + + + +