summaryrefslogtreecommitdiff
path: root/c/drawercalc
diff options
context:
space:
mode:
Diffstat (limited to 'c/drawercalc')
-rw-r--r--c/drawercalc/Makefile20
-rw-r--r--c/drawercalc/drawercalc.c129
-rwxr-xr-xc/drawercalc/drawercalc.elfbin0 -> 7028 bytes
-rw-r--r--c/drawercalc/drawercalc.hex56
-rw-r--r--c/drawercalc/drawercalc.obin0 -> 5512 bytes
-rw-r--r--c/drawercalc/rvcontroller.ld45
6 files changed, 250 insertions, 0 deletions
diff --git a/c/drawercalc/Makefile b/c/drawercalc/Makefile
new file mode 100644
index 0000000..52f47d1
--- /dev/null
+++ b/c/drawercalc/Makefile
@@ -0,0 +1,20 @@
+all: drawercalc.hex
+
+drawercalc.o: drawercalc.c
+ clang -target riscv32-none-elf -I../rvcontroller-libraries -march=rv32imacb_zicntr_zicond_zicsr_zifencei_zihintpause_zilsd_zclsd_zabha_zacas_zbkb_zbkx_zcb_zcmp_zcmt -ffreestanding -O3 -c -o drawercalc.o drawercalc.c
+
+drawercalc.elf: ../rvcontroller-libraries/rvcontroller-init.o ../rvcontroller-libraries/rvcontroller-ecalls.o drawercalc.o
+ riscv32-none-elf-ld -T rvcontroller.ld --no-warn-rwx-segments -o drawercalc.elf ../rvcontroller-libraries/rvcontroller-init.o drawercalc.o ../rvcontroller-libraries/rvcontroller-ecalls.o
+
+dump: drawercalc.elf
+ riscv32-none-elf-objdump -d drawercalc.elf
+
+drawercalc.hex: drawercalc.elf
+ riscv32-none-elf-objcopy -O ihex drawercalc.elf drawercalc.hex
+
+load: drawercalc.hex
+ bash -c "wl-copy < drawercalc.hex"
+
+clean:
+ rm -f drawercalc.bin drawercalc.elf drawercalc.o init.o
+
diff --git a/c/drawercalc/drawercalc.c b/c/drawercalc/drawercalc.c
new file mode 100644
index 0000000..1d2de03
--- /dev/null
+++ b/c/drawercalc/drawercalc.c
@@ -0,0 +1,129 @@
+/* Drawer Capacity Calculator for RVController
+ * A product of Advanced Mesecons Devices, a Cheapie Systems company
+ * This is free and unencumbered software released into the public domain.
+ * See http://unlicense.org/ for more information */
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "rvcontroller-ecalls.h"
+
+#define BASE_SLOTS 32
+#define STACK_MAX 99
+#define STEEL_UPGRADE_MULT 1
+#define GOLD_UPGRADE_MULT 2
+#define OBSIDIAN_UPGRADE_MULT 3
+#define DIAMOND_UPGRADE_MULT 7
+#define MITHRIL_UPGRADE_MULT 12
+
+bool checkUpgradeCount(int32_t count,int32_t maxcount) {
+ return (count >= 0 && count <= maxcount);
+}
+
+void main(void) {
+ while (true) {
+ int32_t capacity = BASE_SLOTS * STACK_MAX;
+ uint8_t upgrades_used = 0;
+ printstr("\n\n\nSettings:\n");
+ printstr("Base Stack Count: ");
+ printint(BASE_SLOTS);
+ printstr("\nMax Stack Size: ");
+ printint(STACK_MAX);
+ printchar('\n');
+
+ int32_t upgcount = 0;
+ while (true) {
+ printstr("\nSteel Upgrades?\n[0-5] > ");
+ upgcount = readint();
+ printint(upgcount);
+ printchar('\n');
+ if (checkUpgradeCount(upgcount,5)) {
+ break;
+ } else {
+ printstr("Invalid entry");
+ }
+ }
+ upgrades_used += upgcount;
+ capacity += BASE_SLOTS * STACK_MAX * STEEL_UPGRADE_MULT * upgcount;
+
+ if (upgrades_used < 5) {
+ while (true) {
+ printstr("\nGold Upgrades?\n[0-");
+ printint(5-upgrades_used);
+ printstr("] > ");
+ upgcount = readint();
+ printint(upgcount);
+ printchar('\n');
+ if (checkUpgradeCount(upgcount,5-upgrades_used)) {
+ break;
+ } else {
+ printstr("Invalid entry");
+ }
+ }
+ upgrades_used += upgcount;
+ capacity += BASE_SLOTS * STACK_MAX * GOLD_UPGRADE_MULT * upgcount;
+ }
+
+ if (upgrades_used < 5) {
+ while (true) {
+ printstr("\nObsidian Upgrades?\n[0-");
+ printint(5-upgrades_used);
+ printstr("] > ");
+ upgcount = readint();
+ printint(upgcount);
+ printchar('\n');
+ if (checkUpgradeCount(upgcount,5-upgrades_used)) {
+ break;
+ } else {
+ printstr("Invalid entry");
+ }
+ }
+ upgrades_used += upgcount;
+ capacity += BASE_SLOTS * STACK_MAX * OBSIDIAN_UPGRADE_MULT * upgcount;
+ }
+
+ if (upgrades_used < 5) {
+ while (true) {
+ printstr("\nDiamond Upgrades?\n[0-");
+ printint(5-upgrades_used);
+ printstr("] > ");
+ upgcount = readint();
+ printint(upgcount);
+ printchar('\n');
+ if (checkUpgradeCount(upgcount,5-upgrades_used)) {
+ break;
+ } else {
+ printstr("Invalid entry");
+ }
+ }
+ upgrades_used += upgcount;
+ capacity += BASE_SLOTS * STACK_MAX * DIAMOND_UPGRADE_MULT * upgcount;
+ }
+
+ if (upgrades_used < 5) {
+ while (true) {
+ printstr("\nMithril Upgrades?\n[0-");
+ printint(5-upgrades_used);
+ printstr("] > ");
+ upgcount = readint();
+ printint(upgcount);
+ printchar('\n');
+ if (checkUpgradeCount(upgcount,5-upgrades_used)) {
+ break;
+ } else {
+ printstr("Invalid entry");
+ }
+ }
+ upgrades_used += upgcount;
+ capacity += BASE_SLOTS * STACK_MAX * MITHRIL_UPGRADE_MULT * upgcount;
+ }
+
+ printstr("\n1 slot: ");
+ printint(capacity);
+ printstr("\n2 slots: ");
+ printint(capacity/2);
+ printstr("\n4 slots: ");
+ printint(capacity/4);
+ printstr("\nPress 0 to run again\n");
+ upgcount = readint();
+ }
+}
diff --git a/c/drawercalc/drawercalc.elf b/c/drawercalc/drawercalc.elf
new file mode 100755
index 0000000..be34b55
--- /dev/null
+++ b/c/drawercalc/drawercalc.elf
Binary files differ
diff --git a/c/drawercalc/drawercalc.hex b/c/drawercalc/drawercalc.hex
new file mode 100644
index 0000000..b66fc63
--- /dev/null
+++ b/c/drawercalc/drawercalc.hex
@@ -0,0 +1,56 @@
+:10000000370101002928A948730000008280135697
+:10001000F50133A5A500518D1345150082804EB81A
+:100020000111A2E4CAE052FC5AF862F46AF00565D4
+:100030001309C0279304A0281304D029930BF02A96
+:10004000194B9549930C702D130D402C130C902CCB
+:100050008965930DB02E1566A566130505C62ACED3
+:100060001385058C2ACC138505522ACA1305066A06
+:100070002AC8138506482AC63DA83245419D2A9ABA
+:100080005A899304A0281304D029194B130510335F
+:100090009D225285A92A1305B033B12A13551A009F
+:1000A000B92213056034812A13552A0089221305C9
+:1000B00010359122692A4A853D2A26852D2A130565
+:1000C000000235222285052A130530060D22294516
+:1000D0003D225E850D22A52AAA8A112A29450522DC
+:1000E00063ED6A016285012A5E8531228D22AA8A2A
+:1000F000FD2829452922E3E759FF7245338AAA02E0
+:100100002A9AE3853AF96685FD20338B59415A8551
+:10011000F9286A85CD20252AAA84D1282945C52019
+:1001200063779B006285C1286685F120CDB7A69ACA
+:100130006245459D2A9A1145E36555F54A8B6E85C2
+:100140005D28B384594126855D206A856D20012292
+:100150002A847128294565201309303063F184020F
+:10016000628551286E854128268551206A85612047
+:10017000F9282A84AD2829455920E3E384FEA29A70
+:100180005245419D2A9A1145E36C55EF4A85A520B9
+:10019000B38459412685A1286A85B1284D282A842F
+:1001A000B9202945A92863F784006285A9204A85DA
+:1001B0009920CDB7A29A4245419D2A9A1145E36103
+:1001C00055ED1309A0314A853D20B3845941268558
+:1001D00039286A850D20A5282A841128294505205B
+:1001E000E3FD84E8628501284A853120CDB7854842
+:1001F0007300000082809148730000008280AD4847
+:100200007300000082809308100873000000828051
+:1002100093085008730000008280930870087300F0
+:1002200000008280732510C08280732500C0828008
+:10023000930860087300000082800589F322008023
+:1002400093920248B3E2A2007390028082809548A4
+:100250007300000082809308000873000000828011
+:10026000A1487300000082809308300873000000EA
+:100270008280930840087300000082800A0A0A53B3
+:10028000657474696E67733A0A004261736520533E
+:100290007461636B20436F756E743A20000A4D6180
+:1002A0007820537461636B2053697A653A20000AA1
+:1002B000537465656C2055706772616465733F0A9D
+:1002C0005B302D355D203E2000496E76616C69649F
+:1002D00020656E747279000A476F6C6420557067F0
+:1002E00072616465733F0A5B302D000A4F62736967
+:1002F0006469616E2055706772616465733F0A5B63
+:10030000302D000A4469616D6F6E6420557067720C
+:10031000616465733F0A5B302D000A4D6974687231
+:10032000696C2055706772616465733F0A5B302D9C
+:10033000000A3120736C6F743A20000A3220736C0B
+:100340006F74733A20000A3420736C6F74733A2010
+:10035000000A5072657373203020746F2072756EBE
+:0803600020616761696E0A006B
+:00000001FF
diff --git a/c/drawercalc/drawercalc.o b/c/drawercalc/drawercalc.o
new file mode 100644
index 0000000..fac534a
--- /dev/null
+++ b/c/drawercalc/drawercalc.o
Binary files differ
diff --git a/c/drawercalc/rvcontroller.ld b/c/drawercalc/rvcontroller.ld
new file mode 100644
index 0000000..985892b
--- /dev/null
+++ b/c/drawercalc/rvcontroller.ld
@@ -0,0 +1,45 @@
+/* Thanks https://github.com/darklife/darkriscv */
+ __heap_size = 0x200; /* required amount of heap */
+ __stack_size = 0x800; /* required amount of stack */
+ ENTRY(_start);
+ MEMORY
+ {
+ RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 0x10000
+ }
+ SECTIONS
+ {
+ .text :
+ {
+ *(.text.startup)
+ *(.text)
+ *(.text)
+ *(.rodata*)
+ } > RAM
+ .data :
+ {
+ *(.sbss)
+ *(.data)
+ *(.bss)
+ *(.rela*)
+ *(COMMON)
+ } > RAM
+
+ .heap :
+ {
+ . = ALIGN(4);
+ PROVIDE ( end = . );
+ _sheap = .;
+ . = . + __heap_size;
+ . = ALIGN(4);
+ _eheap = .;
+ } >RAM
+
+ .stack :
+ {
+ . = ALIGN(4);
+ _estack = .;
+ . = . + __stack_size;
+ . = ALIGN(4);
+ _sstack = .;
+ } >RAM
+ }