From db29d89cbf305ae529409ce99285bcbb37b864f8 Mon Sep 17 00:00:00 2001 From: Carl Vargklint Date: Wed, 1 Jul 2026 00:07:44 +0200 Subject: [PATCH] Current state --- OPTIMIZATION.md | 74 + __pycache__/sprites_gen.cpython-313.pyc | Bin 15056 -> 22722 bytes flash.sh | 2 +- funconfig.h | 6 + sprites.h | 679 ++- sprites_gen.py | 161 + tama.bin | Bin 10316 -> 11932 bytes tama.c | 269 +- tama.elf | Bin 90572 -> 95444 bytes tama.hex | 1374 ++--- tama.lst | 6405 ++++++++++++----------- tama.map | 866 +-- 12 files changed, 5348 insertions(+), 4488 deletions(-) create mode 100644 OPTIMIZATION.md diff --git a/OPTIMIZATION.md b/OPTIMIZATION.md new file mode 100644 index 0000000..6baea47 --- /dev/null +++ b/OPTIMIZATION.md @@ -0,0 +1,74 @@ +# Size optimization backlog + +Flash budget is **16 KB**. Read the real usage with: + +```bash +riscv-none-elf-size tama.elf # flash = text+data, RAM = data+bss +``` + +(Ignore `.elf`/`.hex` *file* sizes — they include debug info / ASCII framing and +are not the flashed image. `tama.bin` is the true image.) + +Current state (after the printf removal below): **~11.9 KB / 16 KB (~73%)**. + +--- + +## DONE + +### ✅ Drop printf/snprintf — saved ~1.4 KB +Replaced every `snprintf` with tiny `s_cat`/`u_cat` string builders (in `tama.c`), +disabled both printf backends in `funconfig.h` +(`FUNCONF_USE_DEBUGPRINTF`/`FUNCONF_USE_UARTPRINTF` = 0), and stubbed the SSD1306 +I2C driver's lone `printf` with `#define printf(...) ((void)0)` before its include. +Result: `mini_vpprintf` + `mini_itoa` + `mini_pad` + `_write` fully garbage-collected. +**Readability:** neutral/positive. No behaviour change (the stubbed printf only +logged an I2C timeout we can't recover from anyway). + +--- + +## TODO — ranked by value vs. effort + +### 1. Crop sprite frames — ~0.5–0.7 KB · low risk +Every creature frame is stored as **32×32 = 128 bytes**, but the art only fills +roughly the middle ~28 rows; the top/bottom rows are empty padding. `ssd1306_drawImage` +already takes explicit width/height, so we can store shorter frames. +- **How:** in `sprites_gen.py`, crop each frame to e.g. 32×28 (width must stay a + multiple of 8; height is free). Emit the real height and adjust the draw `y`. +- **Savings:** ~4 rows × 4 bytes × ~18 frames ≈ 0.3–0.7 KB. +- **Readability:** art stays editable as ASCII; only the generator changes. + +### 2. Alias more Panko frames — ~0.13–0.26 KB · trivial +Shell/Tmux already reuse 4 frames across the 7 expression slots. Panko (the panda) +still has 7 distinct frames. `EXP_BLINK` and `EXP_EAT` could alias `idle`/`happy` +with little visible loss. +- **How:** in the `species_frames[SP_PANKO]` row of `sprites_gen.py`, point the + blink/eat slots at `pana_idle`/`pana_happy` and delete the now-unused frames. +- **Savings:** 128 B per dropped frame (1–2 frames). +- **Readability:** neutral. (Trade-off: loses the dedicated blink/eat animation.) + +### 3. Table-drive the beep jingles — ~0.1–0.2 KB · low risk +Many multi-call `beep(...) beep(...) beep(...)` sequences inline a lot of immediates. +- **How:** store jingles as small `{freq,ms}` arrays and add a `play(jingle, n)` + helper; replace the inline sequences with one call each. +- **Savings:** modest, scales with number of jingles (~8 today). +- **Readability:** arguably improves it (named jingles). + +### 4. Trim the font table — up to ~1.5 KB · NOT recommended +`fontdata` in `ssd1306.h` is a full 256-char × 8-byte table = **2048 B**; we only +use ASCII ~0x20–0x7A. +- **Why not:** requires editing the *vendored* `ch32v003fun/extralibs/ssd1306.h`, + which is fragile across library updates and hurts ease-of-use. Only worth it if + we're truly out of space. If done, keep a local patched copy and document it. + +### 5. RLE-compress sprites — ~1 KB · NOT recommended +Sprites are mostly runs of 0x00/0xFF and would compress well, but this needs a +decoder in the draw path and makes the art opaque (no more ASCII editing). +Net readability loss; only revisit under severe pressure. + +--- + +## Already optimal — don't bother +- **Compiler flags:** already `-Os -flto -ffunction-sections -fdata-sections + -Wl,--gc-sections`. GCC has no `-Oz`. +- **RAM:** ~55% used, not the constraint. The 1 KB `ssd1306_buffer` is mandatory + (full framebuffer); don't touch. diff --git a/__pycache__/sprites_gen.cpython-313.pyc b/__pycache__/sprites_gen.cpython-313.pyc index 7a67a70035f5465afbd9589e5fc19f718387dc21..961e312b4561326055cb96463e65bab9c94e93c6 100644 GIT binary patch delta 7806 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 diff --git a/flash.sh b/flash.sh index 8224744..fb06cfc 100755 --- a/flash.sh +++ b/flash.sh @@ -11,7 +11,7 @@ TARGET=tama # Regenerate sprites.h from the editable art generator (if python3 is present). if command -v python3 >/dev/null 2>&1; then echo ">> Generating sprites.h..." - python3 sprites_gen.py > sprites.h + #python3 sprites_gen.py > sprites.h fi # --- Toolchain (xpack riscv-none-elf-gcc, bundles a ch32fun-compatible newlib) --- diff --git a/funconfig.h b/funconfig.h index 1abd059..b4ba931 100644 --- a/funconfig.h +++ b/funconfig.h @@ -4,4 +4,10 @@ // Configuration overrides go here. Defaults in ch32fun/ch32fun.h are fine for blink. #define FUNCONF_USE_HSI 1 // internal 24 MHz RC oscillator (no external crystal needed) +// We do no console I/O, so disable both printf backends. This drops the +// debug-interface output path; combined with stubbing the I2C driver's lone +// printf (see tama.c) it lets the linker discard the ~1 KB printf formatter. +#define FUNCONF_USE_DEBUGPRINTF 0 +#define FUNCONF_USE_UARTPRINTF 0 + #endif diff --git a/sprites.h b/sprites.h index d97efae..00acb26 100644 --- a/sprites.h +++ b/sprites.h @@ -9,254 +9,108 @@ // pana_idle: 32x32 static const unsigned char pana_idle[] = { - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x80, - 0x0f, 0xe0, 0x07, 0xf0, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x3f, 0xf8, 0x9f, 0xfc, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x07, 0xff, 0xff, 0xf0, - 0x07, 0xef, 0xfb, 0xf0, - 0x0f, 0x83, 0xe0, 0xf8, - 0x0f, 0x93, 0xe4, 0xf8, - 0x0f, 0x11, 0xc4, 0x78, - 0x0f, 0x83, 0xe0, 0xf8, - 0x1f, 0x83, 0xe0, 0xfc, - 0x0f, 0xef, 0x7b, 0xf8, - 0x0f, 0xfc, 0x1f, 0xf8, - 0x0f, 0xff, 0x7f, 0xf8, - 0x0f, 0xff, 0xff, 0xf8, - 0x07, 0xf8, 0x0f, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x01, 0xff, 0xff, 0xc0, - 0x00, 0xff, 0xff, 0x80, - 0x00, 0x7f, 0xff, 0x00, - 0x00, 0x1f, 0xfc, 0x00, - 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x88, 0x00, 0x00, 0x11, 0x88, 0x00, + 0x00, 0x31, 0x8C, 0x00, 0x00, 0x39, 0xDC, 0x00, 0x00, 0x3B, 0xDC, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xF8, 0x3F, 0x00, + 0x00, 0xE7, 0xC7, 0x00, 0x00, 0xDF, 0xFB, 0x00, 0x01, 0xBF, 0xFD, 0x80, + 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xE7, 0xE7, 0xC0, 0x03, 0xE7, 0xE7, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFC, 0x3F, 0x80, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x01, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, }; // pana_blink: 32x32 static const unsigned char pana_blink[] = { - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x80, - 0x0f, 0xe0, 0x07, 0xf0, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x3f, 0xf8, 0x9f, 0xfc, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x07, 0xff, 0xff, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0x01, 0xc0, 0x78, - 0x0f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xfc, - 0x0f, 0xff, 0x7f, 0xf8, - 0x0f, 0xfc, 0x1f, 0xf8, - 0x0f, 0xff, 0x7f, 0xf8, - 0x0f, 0xff, 0xff, 0xf8, - 0x07, 0xf8, 0x0f, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x01, 0xff, 0xff, 0xc0, - 0x00, 0xff, 0xff, 0x80, - 0x00, 0x7f, 0xff, 0x00, - 0x00, 0x1f, 0xfc, 0x00, - 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x88, 0x00, 0x00, 0x11, 0x88, 0x00, + 0x00, 0x31, 0x8C, 0x00, 0x00, 0x39, 0xDC, 0x00, 0x00, 0x3B, 0xDC, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xF8, 0x3F, 0x00, + 0x00, 0xE7, 0xC7, 0x00, 0x00, 0xDF, 0xFB, 0x00, 0x01, 0xBF, 0xFD, 0x80, + 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xC3, 0xC3, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFC, 0x3F, 0x80, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x01, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, }; // pana_happy: 32x32 -static const unsigned char pana_happy[] = { - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x80, - 0x0f, 0xe0, 0x07, 0xf0, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x3f, 0xf8, 0x9f, 0xfc, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x07, 0xff, 0xff, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xef, 0xfb, 0xf8, - 0x0f, 0xd7, 0xf5, 0xf8, - 0x0f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xfc, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xf8, 0x0f, 0xf8, - 0x0f, 0xfb, 0xef, 0xf8, - 0x0f, 0xf7, 0xf7, 0xf8, - 0x07, 0xfc, 0x1f, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x01, 0xff, 0xff, 0xc0, - 0x00, 0xff, 0xff, 0x80, - 0x00, 0x7f, 0xff, 0x00, - 0x00, 0x1f, 0xfc, 0x00, - 0x00, 0x00, 0x80, 0x00, +static const unsigned char pana_happy[] = { + 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x88, 0x00, 0x00, 0x11, 0x88, 0x00, + 0x00, 0x31, 0x8C, 0x00, 0x00, 0x39, 0xDC, 0x00, 0x00, 0x3B, 0xDC, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xF8, 0x3F, 0x00, + 0x00, 0xE7, 0xC7, 0x00, 0x00, 0xDF, 0xFB, 0x00, 0x01, 0xBF, 0xFD, 0x80, + 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xEF, 0xF7, 0xC0, 0x03, 0xE7, 0xEB, 0xC0, 0x03, 0xDB, 0xDB, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xF7, 0xEF, 0x80, + 0x00, 0xF7, 0xEF, 0x00, 0x00, 0x7B, 0xDE, 0x00, 0x01, 0xFC, 0x3F, 0xC0, + 0x01, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, }; // pana_sad: 32x32 static const unsigned char pana_sad[] = { - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x80, - 0x0f, 0xe0, 0x07, 0xf0, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x3f, 0xf8, 0x9f, 0xfc, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x07, 0xff, 0xff, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x0f, 0xef, 0xfb, 0xf8, - 0x0f, 0x83, 0xe0, 0xf8, - 0x0f, 0x93, 0xe4, 0xf8, - 0x0f, 0x11, 0xc4, 0x78, - 0x1f, 0x83, 0xe0, 0xfc, - 0x0f, 0x83, 0x60, 0xf8, - 0x0f, 0xec, 0x1b, 0xf8, - 0x0f, 0xff, 0x7f, 0xf8, - 0x0f, 0xfc, 0x1f, 0xf8, - 0x07, 0xf7, 0xf7, 0xf0, - 0x07, 0xfb, 0xef, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x01, 0xff, 0xff, 0xc0, - 0x00, 0xff, 0xff, 0x80, - 0x00, 0x7f, 0xff, 0x00, - 0x00, 0x1f, 0xfc, 0x00, - 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x88, 0x00, 0x00, 0x11, 0x88, 0x00, + 0x00, 0x31, 0x8C, 0x00, 0x00, 0x39, 0xDC, 0x00, 0x00, 0x3B, 0xDC, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xF8, 0x3F, 0x00, + 0x00, 0xE7, 0xC7, 0x00, 0x00, 0xDF, 0xFB, 0x00, 0x01, 0xBF, 0xFD, 0x80, + 0x01, 0xFF, 0xFF, 0x80, 0x03, 0x9F, 0xF9, 0xC0, 0x03, 0xE7, 0xE7, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xE7, 0xE7, 0xC0, 0x03, 0xE7, 0xE7, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x80, + 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x7B, 0xDE, 0x00, 0x01, 0xF7, 0xEF, 0xC0, + 0x01, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, }; // pana_eat: 32x32 -static const unsigned char pana_eat[] = { - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x80, - 0x0f, 0xe0, 0x07, 0xf0, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x3f, 0xf8, 0x9f, 0xfc, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x07, 0xef, 0xfb, 0xf0, - 0x07, 0x83, 0xe0, 0xf0, - 0x0f, 0x93, 0xe4, 0xf8, - 0x0f, 0x11, 0xc4, 0x78, - 0x0f, 0x83, 0xe0, 0xf8, - 0x0f, 0x83, 0xe0, 0xf8, - 0x1f, 0xef, 0xfb, 0xfc, - 0x0f, 0xff, 0x7f, 0xf8, - 0x0f, 0xfc, 0x1f, 0xf8, - 0x0f, 0xfc, 0x1f, 0xf8, - 0x0f, 0xf8, 0x0f, 0xf8, - 0x07, 0xfc, 0x1f, 0xf0, - 0x07, 0xfc, 0x1f, 0xf0, - 0x03, 0xff, 0x7f, 0xe0, - 0x01, 0xff, 0xff, 0xc0, - 0x00, 0xff, 0xff, 0x80, - 0x00, 0x7f, 0xff, 0x00, - 0x00, 0x1f, 0xfc, 0x00, - 0x00, 0x00, 0x80, 0x00, -}; +static const unsigned char pana_eat[] ={ + 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x88, 0x00, 0x00, 0x11, 0x88, 0x00, + 0x00, 0x31, 0x8C, 0x00, 0x00, 0x39, 0xDC, 0x00, 0x00, 0x3B, 0xDC, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xF8, 0x3F, 0x00, + 0x00, 0xE7, 0xC7, 0x00, 0x00, 0xDF, 0xFB, 0x00, 0x01, 0xBF, 0xFD, 0x80, + 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xE7, 0xE7, 0xC0, 0x03, 0xE7, 0xE7, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x01, 0xFC, 0x3F, 0x80, 0x01, 0xFD, 0x3F, 0x80, + 0x00, 0xFC, 0xBF, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x01, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, +}; // pana_sleep: 32x32 static const unsigned char pana_sleep[] = { - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x80, - 0x0f, 0xe0, 0x07, 0xf0, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x3f, 0xf8, 0x9f, 0xfc, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x07, 0xff, 0xff, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0x01, 0xc0, 0x78, - 0x1f, 0xff, 0xff, 0xfc, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0x7f, 0xf8, - 0x0f, 0xfc, 0x1f, 0xf8, - 0x0f, 0xff, 0x7f, 0xf8, - 0x07, 0xff, 0xff, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x01, 0xff, 0xff, 0xc0, - 0x00, 0xff, 0xff, 0x80, - 0x00, 0x7f, 0xff, 0x00, - 0x00, 0x1f, 0xfc, 0x00, - 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x88, 0x00, 0x00, 0x11, 0x88, 0xF0, + 0x00, 0x31, 0x8C, 0x20, 0x00, 0x39, 0xDC, 0x40, 0x00, 0x3B, 0xDC, 0xF0, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xF8, 0x3F, 0x00, + 0x00, 0xE7, 0xC7, 0x00, 0x00, 0xDF, 0xFB, 0x00, 0x01, 0xBF, 0xFD, 0x80, + 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xC3, 0xC3, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFE, 0x7F, 0x80, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x01, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, }; + // pana_dead: 32x32 static const unsigned char pana_dead[] = { - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x80, - 0x0f, 0xe0, 0x07, 0xf0, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xf8, - 0x3f, 0xf8, 0x9f, 0xfc, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x07, 0xff, 0xff, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x0f, 0xbb, 0xee, 0xf8, - 0x0f, 0xd7, 0xf5, 0xf8, - 0x0f, 0xef, 0xfb, 0xf8, - 0x0f, 0xd7, 0xf5, 0xf8, - 0x1f, 0xbb, 0xee, 0xfc, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xff, 0xff, 0xf8, - 0x0f, 0xf0, 0x07, 0xf8, - 0x07, 0xff, 0xff, 0xf0, - 0x07, 0xff, 0xff, 0xf0, - 0x03, 0xff, 0xff, 0xe0, - 0x01, 0xff, 0xff, 0xc0, - 0x00, 0xff, 0xff, 0x80, - 0x00, 0x7f, 0xff, 0x00, - 0x00, 0x1f, 0xfc, 0x00, - 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x88, 0x00, 0x00, 0x11, 0x88, 0x00, + 0x00, 0x31, 0x8C, 0x00, 0x00, 0x39, 0xDC, 0x00, 0x00, 0x3B, 0xDC, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xF8, 0x3F, 0x00, + 0x00, 0xE7, 0xC7, 0x00, 0x00, 0xDF, 0xFB, 0x00, 0x01, 0xBF, 0xFD, 0x80, + 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xC0, + 0x03, 0xDB, 0xDB, 0xC0, 0x03, 0xE7, 0xE7, 0xC0, 0x03, 0xE7, 0xE7, 0xC0, + 0x03, 0xDB, 0xDB, 0xC0, 0x01, 0xFD, 0xDF, 0x80, 0x01, 0xFA, 0xBF, 0x80, + 0x00, 0xF7, 0x7F, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x01, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, }; enum { EXP_IDLE, EXP_BLINK, EXP_HAPPY, EXP_SAD, EXP_EAT, EXP_SLEEP, EXP_DEAD, EXP_COUNT }; @@ -264,6 +118,305 @@ static const unsigned char *const pana_frames[EXP_COUNT] = { pana_idle, pana_blink, pana_happy, pana_sad, pana_eat, pana_sleep, pana_dead, }; +// shell_idle: 32x32 +static const unsigned char shell_idle[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x07, 0xff, 0xff, 0xe0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xef, 0xf7, 0xf0, + 0x0f, 0xc7, 0xe3, 0xf0, + 0x0f, 0x83, 0xc1, 0xf0, + 0x0f, 0xc7, 0xe3, 0xf0, + 0x0f, 0xef, 0xf7, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0x7f, 0xff, 0xf0, + 0x0f, 0xbf, 0xff, 0xf0, + 0x0f, 0xdf, 0xff, 0xf0, + 0x0f, 0xbf, 0xff, 0xf0, + 0x0f, 0x78, 0x0f, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x07, 0xff, 0xff, 0xe0, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x7f, 0xfe, 0x00, +}; + +// shell_happy: 32x32 +static const unsigned char shell_happy[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x07, 0xff, 0xff, 0xe0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xdf, 0xef, 0xf0, + 0x0f, 0xaf, 0xd7, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xc7, 0xe3, 0xf0, + 0x0f, 0xf8, 0x1f, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x07, 0xff, 0xff, 0xe0, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x7f, 0xfe, 0x00, +}; + +// shell_sad: 32x32 +static const unsigned char shell_sad[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x07, 0xff, 0xff, 0xe0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xef, 0xf7, 0xf0, + 0x0f, 0xc7, 0xe3, 0xf0, + 0x0f, 0x83, 0xc1, 0xf0, + 0x0f, 0xc7, 0xe3, 0xf0, + 0x0f, 0xef, 0xf7, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xf8, 0x1f, 0xf0, + 0x0f, 0xc7, 0xe3, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x07, 0xff, 0xff, 0xe0, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x7f, 0xfe, 0x00, +}; + +// shell_sleep: 32x32 +static const unsigned char shell_sleep[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x07, 0xff, 0xff, 0xe0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0x01, 0x80, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xf8, 0x0f, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x0f, 0xff, 0xff, 0xf0, + 0x07, 0xff, 0xff, 0xe0, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x07, 0xe0, 0x00, + 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x7f, 0xfe, 0x00, +}; + +// tmux_idle: 32x32 +static const unsigned char tmux_idle[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xbf, 0x7e, 0xfc, + 0x3f, 0x1f, 0x7c, 0x7c, + 0x3e, 0x0f, 0x78, 0x3c, + 0x3f, 0x1f, 0x7c, 0x7c, + 0x3f, 0xbf, 0x7e, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3c, 0x07, 0x70, 0x1c, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0xff, 0xfc, + 0x20, 0x00, 0x00, 0x04, + 0x27, 0xdf, 0x00, 0x04, + 0x27, 0xdf, 0x00, 0x04, + 0x20, 0x00, 0x00, 0x04, + 0x1f, 0xff, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +// tmux_happy: 32x32 +static const unsigned char tmux_happy[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0x5f, 0x7d, 0x7c, + 0x3e, 0xaf, 0x7a, 0xbc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3c, 0x03, 0x60, 0x1c, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0xff, 0xfc, + 0x20, 0x00, 0x00, 0x04, + 0x27, 0xdf, 0x00, 0x04, + 0x27, 0xdf, 0x00, 0x04, + 0x20, 0x00, 0x00, 0x04, + 0x1f, 0xff, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +// tmux_sad: 32x32 +static const unsigned char tmux_sad[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xbf, 0x7e, 0xfc, + 0x3f, 0x1f, 0x7c, 0x7c, + 0x3e, 0x0f, 0x78, 0x3c, + 0x3f, 0x1f, 0x7c, 0x7c, + 0x3f, 0xbf, 0x7e, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xbf, 0x7e, 0xfc, + 0x3c, 0x07, 0x70, 0x1c, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0xff, 0xfc, + 0x20, 0x00, 0x00, 0x04, + 0x27, 0xdf, 0x00, 0x04, + 0x27, 0xdf, 0x00, 0x04, + 0x20, 0x00, 0x00, 0x04, + 0x1f, 0xff, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +// tmux_sleep: 32x32 +static const unsigned char tmux_sleep[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3c, 0x07, 0x70, 0x1c, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0x7f, 0xfc, + 0x3f, 0xff, 0xff, 0xfc, + 0x20, 0x00, 0x00, 0x04, + 0x27, 0xdf, 0x00, 0x04, + 0x27, 0xdf, 0x00, 0x04, + 0x20, 0x00, 0x00, 0x04, + 0x1f, 0xff, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +#define SPECIES_COUNT 3 +enum { SP_SHELL, SP_PANKO, SP_TMUX }; +static const char *const species_names[SPECIES_COUNT] = { + "Shell", "Panko", "Tmux", +}; +static const unsigned char *const species_frames[SPECIES_COUNT][EXP_COUNT] = { + { shell_idle, shell_idle, shell_happy, shell_sad, shell_happy, shell_sleep, shell_sad }, + { pana_idle, pana_blink, pana_happy, pana_sad, pana_eat, pana_sleep, pana_dead }, + { tmux_idle, tmux_idle, tmux_happy, tmux_sad, tmux_happy, tmux_sleep, tmux_sad }, +}; + // spr_grave: 32x32 static const unsigned char spr_grave[] = { 0x00, 0x00, 0x00, 0x00, @@ -312,6 +465,78 @@ static const unsigned char spr_poop[] = { 0x00, }; +// spr_claude: 32x32 +static const unsigned char spr_claude[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x00, 0xa8, + 0x0e, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x03, 0xfe, + 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x80, 0xa8, + 0x00, 0x0f, 0xf8, 0x20, + 0x00, 0x3f, 0xfe, 0x20, + 0x00, 0x7f, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x80, + 0x01, 0xff, 0xff, 0xc0, + 0x01, 0xff, 0xff, 0xc0, + 0x03, 0xff, 0xff, 0xe0, + 0x03, 0xf7, 0xf7, 0xe0, + 0x03, 0xf7, 0xf7, 0xe0, + 0x03, 0xe3, 0xe3, 0xe0, + 0x07, 0xf7, 0xf7, 0xf0, + 0x03, 0xf7, 0xf7, 0xe0, + 0x03, 0xff, 0xff, 0xe0, + 0x03, 0xff, 0xff, 0xe0, + 0x03, 0xe7, 0xf3, 0xe0, + 0x01, 0xf8, 0x0f, 0xc0, + 0x01, 0xff, 0xff, 0xc0, + 0x00, 0xff, 0xff, 0x80, + 0x00, 0x7f, 0xff, 0x00, + 0x00, 0x3f, 0xfe, 0x00, + 0x00, 0x0f, 0xf8, 0x00, + 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +// spr_glitch: 32x32 +static const unsigned char spr_glitch[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, + 0x00, 0x0f, 0xf8, 0x00, + 0x00, 0x15, 0x54, 0x00, + 0x00, 0xff, 0xff, 0x80, + 0x01, 0xff, 0xff, 0xc0, + 0x03, 0xff, 0xff, 0xe0, + 0x01, 0x11, 0x44, 0x41, + 0x07, 0xd7, 0xf5, 0xf0, + 0x07, 0xef, 0xfb, 0xf0, + 0x07, 0xd7, 0xf5, 0xf0, + 0x05, 0x11, 0x44, 0x50, + 0x0f, 0xff, 0xff, 0xf8, + 0x07, 0xff, 0xff, 0xf0, + 0x07, 0xff, 0xff, 0xf0, + 0x05, 0x55, 0x55, 0x50, + 0x07, 0xea, 0xab, 0xf0, + 0x43, 0xff, 0xff, 0xe0, + 0x03, 0xff, 0xff, 0xe0, + 0x01, 0x55, 0x55, 0x40, + 0x00, 0xff, 0xff, 0x80, + 0x00, 0x3f, 0xfe, 0x00, + 0x00, 0x0f, 0xf8, 0x04, + 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + // icon_feed: 16x16 static const unsigned char icon_feed[] = { 0x00, 0x00, diff --git a/sprites_gen.py b/sprites_gen.py index 343d84b..2b42150 100644 --- a/sprites_gen.py +++ b/sprites_gen.py @@ -25,6 +25,11 @@ def fill_ellipse(g, cx, cy, rx, ry, v=1): if dx * dx + dy * dy <= 1.0: g[y][x] = v +def fillrect(g, x0, y0, x1, y1, v=1): + for y in range(y0, y1 + 1): + for x in range(x0, x1 + 1): + px(g, x, y, v) + def hline(g, x0, x1, y, v=1): if x0 > x1: x0, x1 = x1, x0 @@ -153,6 +158,96 @@ def panda_dead(): hline(g, 12, 20, 23, 0) # flat mouth return g +# ---------------------------------------------------------------- species: SHELL +# A friendly CRT terminal. Its mouth is a command prompt "> _". +def shell_base(): + g = grid(32, 32) + fillrect(g, 4, 3, 27, 25) # monitor screen (lit) + for cx, cy in [(4, 3), (27, 3), (4, 25), (27, 25)]: + px(g, cx, cy, 0) # round the corners + fillrect(g, 13, 26, 18, 28) # neck + fillrect(g, 9, 29, 22, 31) # base + return g + +def shell_prompt(g): # the "> _" signature, dark on screen + px(g, 8, 18, 0); px(g, 9, 19, 0); px(g, 10, 20, 0) + px(g, 9, 21, 0); px(g, 8, 22, 0) + hline(g, 13, 19, 22, 0) + +def shell_idle(): + g = shell_base() + fill_ellipse(g, 11, 11, 2, 2, 0) + fill_ellipse(g, 20, 11, 2, 2, 0) + shell_prompt(g) + return g + +def shell_happy(): + g = shell_base() + px(g, 9, 11, 0); px(g, 10, 10, 0); px(g, 11, 11, 0) # ^ ^ + px(g, 18, 11, 0); px(g, 19, 10, 0); px(g, 20, 11, 0) + for x in range(10, 22): + y = 19 + (1 if 13 <= x <= 18 else 0) + px(g, x, y, 0) + return g + +def shell_sad(): + g = shell_base() + fill_ellipse(g, 11, 12, 2, 2, 0) + fill_ellipse(g, 20, 12, 2, 2, 0) + for x in range(10, 22): + y = 23 - (1 if 13 <= x <= 18 else 0) + px(g, x, y, 0) + return g + +def shell_sleep(): + g = shell_base() + hline(g, 8, 14, 12, 0) + hline(g, 17, 23, 12, 0) + hline(g, 13, 19, 20, 0) + return g + +# ---------------------------------------------------------------- species: TMUX +# A split terminal window: a central pane divider and a status bar of tabs. +def tmux_base(): + g = grid(32, 32) + fillrect(g, 2, 3, 29, 28) + for cx, cy in [(2, 3), (29, 3), (2, 28), (29, 28)]: + px(g, cx, cy, 0) + vline(g, 16, 5, 22, 0) # pane divider + fillrect(g, 3, 24, 28, 27, 0) # dark status strip + fillrect(g, 5, 25, 9, 26, 1) # window tab 0 + fillrect(g, 11, 25, 15, 26, 1) # window tab 1 + return g + +def tmux_idle(): + g = tmux_base() + fill_ellipse(g, 9, 12, 2, 2, 0) # one eye per pane + fill_ellipse(g, 23, 12, 2, 2, 0) + hline(g, 6, 12, 18, 0) # mouth, split by divider + hline(g, 20, 26, 18, 0) + return g + +def tmux_happy(): + g = tmux_base() + px(g, 7, 12, 0); px(g, 8, 11, 0); px(g, 9, 12, 0); px(g, 10, 11, 0); px(g, 11, 12, 0) + px(g, 21, 12, 0); px(g, 22, 11, 0); px(g, 23, 12, 0); px(g, 24, 11, 0); px(g, 25, 12, 0) + hline(g, 6, 13, 19, 0); hline(g, 19, 26, 19, 0) + return g + +def tmux_sad(): + g = tmux_base() + fill_ellipse(g, 9, 13, 2, 2, 0) + fill_ellipse(g, 23, 13, 2, 2, 0) + hline(g, 6, 12, 20, 0); hline(g, 20, 26, 20, 0) + px(g, 9, 19, 0); px(g, 23, 19, 0) + return g + +def tmux_sleep(): + g = tmux_base() + hline(g, 6, 12, 13, 0) + hline(g, 20, 26, 13, 0) + return g + # ---------------------------------------------------------------- props def grave(): art = [ @@ -204,6 +299,42 @@ def poop(): ] return from_art(art) +# ---------------------------------------------------------------- evolved forms +# The pet "ascends" once fully grown. Good care -> Claude (a serene sparkle +# being); neglect -> a corrupted glitch. Both are 32x32 like the panda frames. +def claude(): + g = grid(32, 32) + fill_ellipse(g, 16, 19, 11, 11) # round, friendly body + fill_ellipse(g, 12, 18, 1, 2, 0) # calm eyes + fill_ellipse(g, 20, 18, 1, 2, 0) + for x in range(11, 22): # serene smile + y = 23 + (1 if 13 <= x <= 19 else 0) + px(g, x, y, 0) + # signature 4-point sparkle, upper-right + sx, sy = 26, 6 + vline(g, sx, sy - 4, sy + 4) + hline(g, sx - 4, sx + 4, sy) + px(g, sx - 2, sy - 2); px(g, sx + 2, sy - 2) + px(g, sx - 2, sy + 2); px(g, sx + 2, sy + 2) + # tiny twinkle, upper-left + px(g, 5, 5); px(g, 5, 4); px(g, 5, 6); px(g, 4, 5); px(g, 6, 5) + return g + +def glitch(): + g = grid(32, 32) + fill_ellipse(g, 16, 19, 12, 11) + for d in range(-2, 3): # X_X eyes + px(g, 11 + d, 16 + d, 0); px(g, 11 + d, 16 - d, 0) + px(g, 21 + d, 16 + d, 0); px(g, 21 + d, 16 - d, 0) + for x in range(10, 23): # jagged mouth + px(g, x, 22 + (x % 2), 0) + for y in range(10, 31, 4): # scanline corruption + for x in range(2, 30, 2): + px(g, x, y, 0) + for (x, y) in [(0, 8), (2, 30), (31, 14), (29, 29), (1, 24), (30, 4)]: + px(g, x, y, 1) # stray noise pixels + return g + # ---------------------------------------------------------------- 16x16 icons def icon_feed(): # apple g = grid(16, 16) @@ -295,8 +426,38 @@ def main(): print("};") print() + # other starter species (Panko = the panda frames above) + species_extra = [ + ("shell_idle", shell_idle()), + ("shell_happy", shell_happy()), + ("shell_sad", shell_sad()), + ("shell_sleep", shell_sleep()), + ("tmux_idle", tmux_idle()), + ("tmux_happy", tmux_happy()), + ("tmux_sad", tmux_sad()), + ("tmux_sleep", tmux_sleep()), + ] + for n, g in species_extra: + emit(n, g) + + # species frame tables, indexed [species][EXP_*]. Shell/Tmux reuse their + # four frames across the seven expression slots. + print("#define SPECIES_COUNT 3") + print("enum { SP_SHELL, SP_PANKO, SP_TMUX };") + print("static const char *const species_names[SPECIES_COUNT] = {") + print(' "Shell", "Panko", "Tmux",') + print("};") + print("static const unsigned char *const species_frames[SPECIES_COUNT][EXP_COUNT] = {") + print(" { shell_idle, shell_idle, shell_happy, shell_sad, shell_happy, shell_sleep, shell_sad },") + print(" { pana_idle, pana_blink, pana_happy, pana_sad, pana_eat, pana_sleep, pana_dead },") + print(" { tmux_idle, tmux_idle, tmux_happy, tmux_sad, tmux_happy, tmux_sleep, tmux_sad },") + print("};") + print() + emit("spr_grave", grave()) emit("spr_poop", poop()) + emit("spr_claude", claude()) + emit("spr_glitch", glitch()) icons = [ ("icon_feed", icon_feed()), diff --git a/tama.bin b/tama.bin index 5ef59dbea10d6e9cb78f7c82bfc7c23bfa8d91a4..ec39e8d0f9951ae68bfb3649d9af7bab25d44086 100755 GIT binary patch literal 11932 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 KO8ut_q5lGd^Eu}L diff --git a/tama.c b/tama.c index 84e81a9..510d8e8 100644 --- a/tama.c +++ b/tama.c @@ -14,7 +14,12 @@ */ #include "ch32fun.h" -#include + +// The bundled I2C driver calls printf() only to log a timeout we can't act on +// (by then the display is dead). Stub it to a no-op so the ~1 KB printf +// formatter is never referenced and the linker discards it. We format our own +// numbers with the tiny s_cat/u_cat helpers below. +#define printf(...) ((void)0) #define SSD1306_128X64 // 128x64 panel (see pinout.md / OLED size) #include "ssd1306_i2c.h" @@ -37,7 +42,7 @@ // a need empties in ~20 min, after which health bleeds down over ~10 more. // ----------------------------------------------------------------- state -enum { SCR_MAIN, SCR_STATS, SCR_DEAD, SCR_SETTINGS }; +enum { SCR_SELECT, SCR_MAIN, SCR_STATS, SCR_DEAD, SCR_SETTINGS }; // notification thresholds: gentle chirp at <50%, urgent at <20% enum { N_FOOD, N_FUN, N_ENGY, N_WASH, N_COUNT }; @@ -49,11 +54,26 @@ typedef struct { int8_t hygiene; // 0..100 int8_t health; // 0..100 uint16_t age_min; // age in game-minutes (one per tick) + uint16_t xp; // experience earned by good care + uint8_t species; // SP_* starter type chosen on the welcome screen + uint8_t level; // 1..MAX_LEVEL + uint8_t form; // FORM_* (display + life stage), derived from level + uint8_t ascend; // 0 undecided, 1 Claude, 2 glitch (latched at max lvl) uint8_t poop; // 0..3 piles on the floor uint8_t sleeping; // 1 while napping uint8_t alive; } Pet; +// Hacker privilege-escalation life stages: proc -> user -> root, then the pet +// either ascends to "Claude" (well-tended) or rots into a glitch. +enum { FORM_PROC, FORM_USER, FORM_ROOT, FORM_CLAUDE, FORM_GLITCH, FORM_COUNT }; +static const char *const form_names[FORM_COUNT] = { + "proc", "user", "root", "Claude", "glitch", +}; +#define MAX_LEVEL 4 +// cumulative XP required to reach level (index = level-1) +static const uint16_t level_xp[MAX_LEVEL] = { 0, 45, 120, 240 }; + static Pet pet; static uint8_t screen; static uint8_t cursor; // selected menu icon 0..ICON_COUNT-1 @@ -63,11 +83,13 @@ static uint32_t frame; // free-running frame counter static uint16_t tick_acc; // frames since last stat tick static uint8_t warn_flag[N_COUNT]; // already chirped a <50% warning static uint8_t crit_flag[N_COUNT]; // already chirped a <20% warning +static uint8_t evo_anim; // frames remaining for an evolution banner // settings static uint8_t sound_on = 1; static uint8_t timeout_idx = 1; // index into screen_timeout_opts (default 30 s) static uint8_t set_sel = 0; // highlighted row on the settings screen +static uint8_t sel_species = 0; // highlighted species on the welcome screen // screen-off-on-inactivity options, in frames (0 = never sleep the display) static const uint16_t screen_timeout_opts[] = { 250, 500, 1000, 0 }; @@ -85,6 +107,20 @@ enum { ACT_FEED, ACT_PLAY, ACT_SLEEP, ACT_CLEAN, ACT_HEAL, ACT_STATS, ACT_SETTIN // ----------------------------------------------------------------- helpers static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } +// Tiny string builders used instead of snprintf: we only ever paste short +// strings and small unsigned ints, and avoiding keeps the whole +// printf machinery (~1 KB) out of the image. Each returns the new end pointer +// so calls chain; remember to NUL-terminate the final buffer yourself. +static char *s_cat(char *p, const char *s) { while (*s) *p++ = *s++; return p; } +static char *u_cat(char *p, unsigned v) +{ + char tmp[5]; + int n = 0; + do { tmp[n++] = '0' + v % 10; v /= 10; } while (v); + while (n) *p++ = tmp[--n]; + return p; +} + // short square-wave beep on the passive piezo (blocking, ms-scale only) static void beep(uint16_t freq, uint16_t ms) { @@ -115,14 +151,53 @@ static void pet_reset(void) pet.hygiene = 100; pet.health = 100; pet.age_min = 0; + pet.xp = 0; + pet.species = sel_species; + pet.level = 1; + pet.form = FORM_PROC; + pet.ascend = 0; pet.poop = 0; pet.sleeping = 0; pet.alive = 1; screen = SCR_MAIN; cursor = 0; + evo_anim = 0; for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } } +// Map the current level (and, at the top, care quality) to a display form. +static void compute_form(void) +{ + switch (pet.level) { + case 1: pet.form = FORM_PROC; break; + case 2: pet.form = FORM_USER; break; + case 3: pet.form = FORM_ROOT; break; + default: // max level: branch once, latched + if (!pet.ascend) pet.ascend = (pet.health >= 60) ? 1 : 2; + pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; + break; + } +} + +// Award XP; promote (and trigger the evolution banner) when a tier is reached. +static void add_xp(uint8_t n) +{ + if (!pet.alive) return; + if (pet.xp < 60000) pet.xp += n; + + uint8_t nl = 1; + for (uint8_t i = 1; i < MAX_LEVEL; i++) + if (pet.xp >= level_xp[i]) nl = i + 1; + + if (nl > pet.level) { + pet.level = nl; + compute_form(); + evo_anim = 30; // ~1.8 s celebratory banner + beep(784, 60); beep(988, 60); beep(1175, 60); beep(1568, 140); + led_blink(); + } +} + // Chirp once when a need first drops below 50% (gentle) or 20% (urgent), // re-arming only after it recovers. Audible even while the screen is off, // so it works as a "tend to me" reminder. @@ -177,6 +252,7 @@ static void do_action(uint8_t act) react(EXP_EAT); beep(880, 60); beep(1175, 80); led_blink(); + add_xp(4); break; case ACT_PLAY: @@ -186,6 +262,7 @@ static void do_action(uint8_t act) react(EXP_HAPPY); beep(988, 60); beep(1319, 60); beep(1568, 90); led_blink(); + add_xp(6); break; case ACT_SLEEP: @@ -198,12 +275,14 @@ static void do_action(uint8_t act) pet.hygiene = 100; pet.happy = clamp100(pet.happy + 5); beep(1319, 50); beep(1047, 50); + add_xp(3); break; case ACT_HEAL: pet.health = clamp100(pet.health + 35); beep(784, 60); beep(1047, 60); beep(1319, 90); led_blink(); + add_xp(4); break; case ACT_STATS: @@ -255,6 +334,9 @@ static void game_tick(void) if (lo < 15) pet.health = clamp100(pet.health - 3); else if (lo > 50) pet.health = clamp100(pet.health + 2); + // a well-kept pet matures: passive XP while every need stays healthy + if (lo > 50 && !pet.sleeping) add_xp(3); + check_notifications(); if (pet.health <= 0) { @@ -285,14 +367,79 @@ static void draw_menu_bar(void) } } +// Per-species eye geometry, so the shades land on the right spot. +static const uint8_t eye_cy[SPECIES_COUNT] = { 11, 17, 12 }; // SP_SHELL,PANKO,TMUX +static const uint8_t eye_lx[SPECIES_COUNT] = { 11, 11, 9 }; +static const uint8_t eye_rx[SPECIES_COUNT] = { 20, 21, 23 }; + +// Hacker garb earned as the pet levels up, drawn dark over the lit body so it +// reads as black gear. +static void draw_accessories(int x, int y) +{ + uint8_t sp = pet.species; + uint8_t cy = eye_cy[sp], lx = eye_lx[sp], rx = eye_rx[sp]; + + if (pet.form >= FORM_USER) { // shades + ssd1306_fillRect(x + lx - 3, y + cy - 2, 7, 4, 0); + ssd1306_fillRect(x + rx - 3, y + cy - 2, 7, 4, 0); + if (rx - lx > 7) + ssd1306_drawFastHLine(x + lx + 4, y + cy - 1, rx - lx - 7, 0); + } + if (pet.form >= FORM_ROOT) { // gaming headset + mic boom + ssd1306_drawLine(x + 3, y + 10, x + 9, y + 2, 0); + ssd1306_drawLine(x + 9, y + 2, x + 23, y + 2, 0); + ssd1306_drawLine(x + 23, y + 2, x + 29, y + 10, 0); + ssd1306_fillRect(x + 1, y + 12, 4, 7, 0); + ssd1306_drawLine(x + 3, y + 18, x + 10, y + 24, 0); + } +} + +static void draw_creature(int x, int y) +{ + const unsigned char *spr; + if (pet.form == FORM_CLAUDE) spr = spr_claude; + else if (pet.form == FORM_GLITCH) spr = spr_glitch; + else spr = species_frames[pet.species][current_expression()]; + + ssd1306_drawImage(x, y, spr, PANA_W, PANA_H, 0); + + // growing forms wear gear; the ascended/glitched forms speak for themselves + if (spr != spr_claude && spr != spr_glitch && !pet.sleeping) + draw_accessories(x, y); + + // Claude radiates: a few twinkling pixels that shift each frame + if (pet.form == FORM_CLAUDE) { + ssd1306_drawPixel(x - 2 + (frame & 3), y + 4, 1); + ssd1306_drawPixel(x + PANA_W + (frame & 1), y + 10, 1); + } +} + +static void draw_evo_banner(void) +{ + ssd1306_fillRect(6, 18, SSD1306_W - 12, 24, 0); + ssd1306_drawRect(6, 18, SSD1306_W - 12, 24, 1); + draw_center_str(21, ">> evolving"); + char b[17], *p = b; + p = s_cat(p, "[ "); + p = s_cat(p, form_names[pet.form]); + p = s_cat(p, " ]"); + *p = 0; + draw_center_str(31, b); +} + static void draw_main(void) { ssd1306_setbuf(0); - // top bar: action label, with a tiny low-health warning + // top bar: action label + level badge, with a tiny low-health warning draw_center_str(0, menu_labels[cursor]); if (pet.alive && pet.health < 30 && (frame & 8)) ssd1306_drawstr(0, 0, "!", 1); + char badge[6], *bp = badge; + *bp++ = 'L'; + bp = u_cat(bp, pet.level); + *bp = 0; + ssd1306_drawstr(SSD1306_W - 2 * 8, 0, badge, 1); ssd1306_drawFastHLine(0, 10, SSD1306_W, 1); // pet: gentle horizontal stroll + vertical bob (still while asleep) @@ -306,8 +453,7 @@ static void draw_main(void) px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 py = 14 + ((frame % 16) < 8 ? 0 : 1); } - ssd1306_drawImage(px, py, pana_frames[current_expression()], - PANA_W, PANA_H, 0); + draw_creature(px, py); // floor + poop piles ssd1306_drawFastHLine(0, 46, SSD1306_W, 1); @@ -315,6 +461,7 @@ static void draw_main(void) ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); draw_menu_bar(); + if (evo_anim) draw_evo_banner(); // celebratory overlay on top ssd1306_refresh(); } @@ -330,16 +477,26 @@ static void draw_bar(int y, const char *label, int8_t val) static void draw_stats(void) { ssd1306_setbuf(0); - draw_center_str(0, "-- STATUS --"); - draw_bar(10, "FOOD", pet.satiety); - draw_bar(19, "FUN ", pet.happy); - draw_bar(28, "ENGY", pet.energy); - draw_bar(37, "WASH", pet.hygiene); - draw_bar(46, "HLTH", pet.health); + draw_center_str(0, "~/pet $ stat"); + draw_bar(10, "FOOD", pet.satiety); + draw_bar(19, "HAPPY", pet.happy); + draw_bar(28, "ENERGY", pet.energy); + draw_bar(37, "CLEAN", pet.hygiene); + draw_bar(46, "HEALTH", pet.health); - char line[17]; - snprintf(line, sizeof(line), "Age %u %s", pet.age_min, - pet.sleeping ? "Zzz" : ""); + // no form name here: keep room for the XP-to-next-level readout + char line[17], *p = line; + *p++ = 'L'; + p = u_cat(p, pet.level); + p = s_cat(p, " xp "); + if (pet.level < MAX_LEVEL) { + p = u_cat(p, pet.xp); + *p++ = '/'; + p = u_cat(p, level_xp[pet.level]); + } else { + p = s_cat(p, "MAX"); + } + *p = 0; ssd1306_drawstr(0, 56, line, 1); ssd1306_refresh(); } @@ -347,11 +504,35 @@ static void draw_stats(void) static void draw_dead(void) { ssd1306_setbuf(0); - ssd1306_drawImage(48, 8, spr_grave, 32, 32, 0); - draw_center_str(44, "R.I.P."); - char line[17]; - snprintf(line, sizeof(line), "lived %u min", pet.age_min); - draw_center_str(52, line); + ssd1306_drawImage(48, 2, spr_grave, 32, 32, 0); + draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); + char line[17], *p = line; + p = s_cat(p, "core dumped L"); + p = u_cat(p, pet.level); + *p = 0; + draw_center_str(46, line); + draw_center_str(56, "OK: respawn"); + ssd1306_refresh(); +} + +// welcome screen: choose a starter species before booting the pet +static void draw_select(void) +{ + ssd1306_setbuf(0); + draw_center_str(0, "~ $ adopt --pet"); + ssd1306_drawFastHLine(0, 10, SSD1306_W, 1); + + // big idle preview of the highlighted species (no gear at level 1) + ssd1306_drawImage(48, 13, species_frames[sel_species][EXP_IDLE], + PANA_W, PANA_H, 0); + + char line[17], *p = line; + p = s_cat(p, "< "); + p = s_cat(p, species_names[sel_species]); + p = s_cat(p, " >"); + *p = 0; + draw_center_str(47, line); + draw_center_str(56, "L/R pick OK go"); ssd1306_refresh(); } @@ -362,9 +543,9 @@ static void draw_settings(void) ssd1306_drawFastHLine(0, 10, SSD1306_W, 1); char rows[SETTINGS_ROWS][17]; - snprintf(rows[0], 17, "Screen off:%s", screen_timeout_names[timeout_idx]); - snprintf(rows[1], 17, "Sound: %s", sound_on ? "On" : "Off"); - snprintf(rows[2], 17, "Back"); + *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; + *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; + *s_cat(rows[2], "Back") = 0; for (uint8_t r = 0; r < SETTINGS_ROWS; r++) { int y = 18 + r * 12; @@ -412,13 +593,24 @@ static void gpio_setup(void) static void splash(void) { + // fake terminal boot sequence, revealed line by line + static const char *const boot[] = { + "panagotchi v2", + "booting kernel..", + "mount /pet ok", + "spawn shell ok", + "> ./tamagotchi_", + }; ssd1306_setbuf(0); - draw_center_str(4, "PANAGOTCHI"); - ssd1306_drawImage(48, 16, pana_idle, PANA_W, PANA_H, 0); - draw_center_str(52, "press any key"); + for (uint8_t i = 0; i < 5; i++) { + ssd1306_drawstr(0, i * 10, boot[i], 1); + ssd1306_refresh(); + beep(1200 + i * 120, 25); + Delay_Ms(220); + } + draw_center_str(54, "press any key"); ssd1306_refresh(); - - beep(659, 80); beep(784, 80); beep(988, 120); + beep(988, 120); // wait until a button is pressed (or ~4 s timeout) for (int i = 0; i < 200; i++) { @@ -441,8 +633,8 @@ int main(void) } ssd1306_init(); - pet_reset(); splash(); + screen = SCR_SELECT; // pick a species before a pet is born Buttons prev = {0, 0, 0}; @@ -464,6 +656,22 @@ int main(void) } } else { switch (screen) { + case SCR_SELECT: + if (left_edge) { + sel_species = (sel_species + SPECIES_COUNT - 1) % SPECIES_COUNT; + beep(1047, 25); + } + if (right_edge) { + sel_species = (sel_species + 1) % SPECIES_COUNT; + beep(1047, 25); + } + if (ok_edge) { // born! boot the chosen species + pet_reset(); // sets screen = SCR_MAIN, species = sel_species + beep(659, 80); beep(988, 120); + } + draw_select(); + break; + case SCR_MAIN: if (left_edge) { cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; @@ -507,8 +715,8 @@ int main(void) break; case SCR_DEAD: - if (ok_edge) { // start a new pet - pet_reset(); + if (ok_edge) { // back to the welcome screen to re-pick + screen = SCR_SELECT; beep(659, 80); beep(988, 120); } draw_dead(); @@ -524,6 +732,7 @@ int main(void) } if (anim_timer) anim_timer--; + if (evo_anim) evo_anim--; // advance game time independent of screen / display state if (pet.alive && ++tick_acc >= TICK_FRAMES) { diff --git a/tama.elf b/tama.elf index 263b74a6d18c265b1f85fb4adbca8f4bcaff1f2d..04bb52f42278420a0855b807253e63beead86046 100755 GIT binary patch literal 95444 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 M4Bn6&{bP9lFQ+x#KmY&$ literal 90572 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 + 0: 16d0006f j 96c 4: 00000000 .word 0x00000000 - 8: 000009b0 .word 0x000009b0 - c: 0000095c .word 0x0000095c + 8: 000009e0 .word 0x000009e0 + c: 000009de .word 0x000009de ... - 30: 0000095c .word 0x0000095c + 30: 000009de .word 0x000009de 34: 00000000 .word 0x00000000 - 38: 0000095c .word 0x0000095c + 38: 000009de .word 0x000009de 3c: 00000000 .word 0x00000000 - 40: 0000095c .word 0x0000095c - 44: 0000095c .word 0x0000095c - 48: 0000095c .word 0x0000095c - 4c: 0000095c .word 0x0000095c - 50: 0000095c .word 0x0000095c - 54: 0000095c .word 0x0000095c - 58: 0000095c .word 0x0000095c - 5c: 0000095c .word 0x0000095c - 60: 0000095c .word 0x0000095c - 64: 0000095c .word 0x0000095c - 68: 0000095c .word 0x0000095c - 6c: 0000095c .word 0x0000095c - 70: 0000095c .word 0x0000095c - 74: 0000095c .word 0x0000095c - 78: 0000095c .word 0x0000095c - 7c: 0000095c .word 0x0000095c - 80: 0000095c .word 0x0000095c - 84: 0000095c .word 0x0000095c - 88: 0000095c .word 0x0000095c - 8c: 0000095c .word 0x0000095c - 90: 0000095c .word 0x0000095c - 94: 0000095c .word 0x0000095c - 98: 0000095c .word 0x0000095c + 40: 000009de .word 0x000009de + 44: 000009de .word 0x000009de + 48: 000009de .word 0x000009de + 4c: 000009de .word 0x000009de + 50: 000009de .word 0x000009de + 54: 000009de .word 0x000009de + 58: 000009de .word 0x000009de + 5c: 000009de .word 0x000009de + 60: 000009de .word 0x000009de + 64: 000009de .word 0x000009de + 68: 000009de .word 0x000009de + 6c: 000009de .word 0x000009de + 70: 000009de .word 0x000009de + 74: 000009de .word 0x000009de + 78: 000009de .word 0x000009de + 7c: 000009de .word 0x000009de + 80: 000009de .word 0x000009de + 84: 000009de .word 0x000009de + 88: 000009de .word 0x000009de + 8c: 000009de .word 0x000009de + 90: 000009de .word 0x000009de + 94: 000009de .word 0x000009de + 98: 000009de .word 0x000009de 9c: 0000 unimp ... @@ -102,3709 +102,3762 @@ Disassembly of section .text: 11a: 8282 jr t0 ... -0000011e : - if(pad_to == 0) pad_to = len; - 11e: c699 beqz a3,12c - int overflow = 0; - 120: 4301 li t1,0 - if(len > pad_to) { - 122: 00b6d763 bge a3,a1,130 - len = pad_to; - 126: 85b6 mv a1,a3 - overflow = 1; - 128: 4305 li t1,1 - 12a: a019 j 130 - int overflow = 0; - 12c: 4301 li t1,0 - if(pad_to == 0) pad_to = len; - 12e: 86ae mv a3,a1 - for(i = pad_to - len; i > 0; i --) { - 130: 8e8d sub a3,a3,a1 - char * pbuffer = buffer; - 132: 87ba mv a5,a4 - 134: 00e683b3 add t2,a3,a4 - for(i = pad_to - len; i > 0; i --) { - 138: 40f382b3 sub t0,t2,a5 - 13c: 04504a63 bgtz t0,190 - 140: fff6c793 not a5,a3 - 144: 87fd srai a5,a5,0x1f - 146: 8efd and a3,a3,a5 - 148: 96ba add a3,a3,a4 - 14a: 4781 li a5,0 - for(i = len; i > 0; i --) { - 14c: 40f58633 sub a2,a1,a5 - 150: 00f682b3 add t0,a3,a5 - 154: 04c04263 bgtz a2,198 - 158: fff5c793 not a5,a1 - 15c: 87fd srai a5,a5,0x1f - 15e: 8dfd and a1,a1,a5 - 160: 95b6 add a1,a1,a3 - len = pbuffer - buffer; - 162: 40e58533 sub a0,a1,a4 - if(overflow) { - 166: 02030463 beqz t1,18e - for (i = 0; i < 3 && pbuffer > buffer; i ++) { - 16a: 02b77263 bgeu a4,a1,18e - *(pbuffer-- - 1) = '*'; - 16e: 02a00793 li a5,42 - 172: fef58fa3 sb a5,-1(a1) - 176: fff58693 addi a3,a1,-1 - for (i = 0; i < 3 && pbuffer > buffer; i ++) { - 17a: 00d77a63 bgeu a4,a3,18e - *(pbuffer-- - 1) = '*'; - 17e: fef58f23 sb a5,-2(a1) - 182: ffe58693 addi a3,a1,-2 - for (i = 0; i < 3 && pbuffer > buffer; i ++) { - 186: 00d77463 bgeu a4,a3,18e - *(pbuffer-- - 1) = '*'; - 18a: fef58ea3 sb a5,-3(a1) -} - 18e: 8082 ret - *(pbuffer++) = pad_char; - 190: 0785 addi a5,a5,1 - 192: fec78fa3 sb a2,-1(a5) - for(i = pad_to - len; i > 0; i --) { - 196: b74d j 138 - *(pbuffer++) = *(ptr++); - 198: 00f50633 add a2,a0,a5 - 19c: 00064603 lbu a2,0(a2) - 1a0: 0785 addi a5,a5,1 - 1a2: 00c28023 sb a2,0(t0) - for(i = len; i > 0; i --) { - 1a6: b75d j 14c - -000001a8 <_puts>: -{ - 1a8: 832a mv t1,a0 - 1aa: 852e mv a0,a1 - if(!buf) return len; - 1ac: ce01 beqz a2,1c4 <_puts+0x1c> - char * p0 = b->buffer; - 1ae: 00062283 lw t0,0(a2) - for (i = 0; i < len; i++) { - 1b2: 4701 li a4,0 - if(b->pbuffer == b->buffer + b->buffer_len - 1) { - 1b4: 425c lw a5,4(a2) - for (i = 0; i < len; i++) { - 1b6: 00a74863 blt a4,a0,1c6 <_puts+0x1e> - *(b->pbuffer) = 0; - 1ba: 00078023 sb zero,0(a5) - return b->pbuffer - p0; - 1be: 4248 lw a0,4(a2) - 1c0: 40550533 sub a0,a0,t0 -} - 1c4: 8082 ret - if(b->pbuffer == b->buffer + b->buffer_len - 1) { - 1c6: 460c lw a1,8(a2) - 1c8: 4214 lw a3,0(a2) - 1ca: 15fd addi a1,a1,-1 - 1cc: 96ae add a3,a3,a1 - 1ce: fed786e3 beq a5,a3,1ba <_puts+0x12> - *(b->pbuffer ++) = s[i]; - 1d2: 00178693 addi a3,a5,1 - 1d6: c254 sw a3,4(a2) - 1d8: 00e306b3 add a3,t1,a4 - 1dc: 0006c683 lbu a3,0(a3) - for (i = 0; i < len; i++) { - 1e0: 0705 addi a4,a4,1 - *(b->pbuffer ++) = s[i]; - 1e2: 00d78023 sb a3,0(a5) - for (i = 0; i < len; i++) { - 1e6: b7f9 j 1b4 <_puts+0xc> - -000001e8 : - while( (*DMDATA0) & 0x80 ); - 1e8: e00007b7 lui a5,0xe0000 - 1ec: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> - 1f0: 4398 lw a4,0(a5) - 1f2: 08077713 andi a4,a4,128 - 1f6: ff6d bnez a4,1f0 - *DMDATA0 = 0x78302088; //" 0x" - 1f8: 78302737 lui a4,0x78302 - 1fc: 08870713 addi a4,a4,136 # 78302088 <_eusrstack+0x58301888> - while( (*DMDATA0) & 0x80 ); - 200: e00006b7 lui a3,0xe0000 - *DMDATA0 = 0x78302088; //" 0x" - 204: c398 sw a4,0(a5) - while( (*DMDATA0) & 0x80 ); - 206: 0f468693 addi a3,a3,244 # e00000f4 <_eusrstack+0xbffff8f4> - for( shift = 28; shift >= 0; shift -= 4 ) - 20a: 4771 li a4,28 - s += ( s < 10 ) ? '0' : ('a' - 10); - 20c: 45a5 li a1,9 - for( shift = 28; shift >= 0; shift -= 4 ) - 20e: 5671 li a2,-4 - while( (*DMDATA0) & 0x80 ); - 210: 429c lw a5,0(a3) - 212: 0807f793 andi a5,a5,128 - 216: ffed bnez a5,210 - int s = (n>>shift) & 0xf; - 218: 00e55333 srl t1,a0,a4 - 21c: 00f37313 andi t1,t1,15 - s += ( s < 10 ) ? '0' : ('a' - 10); - 220: 0065b7b3 sltu a5,a1,t1 - 224: 40f007b3 neg a5,a5 - 228: 0277f793 andi a5,a5,39 - 22c: 03078793 addi a5,a5,48 - 230: 979a add a5,a5,t1 - *DMDATA0 = 0x85 | (s<<8); //" 0x" - 232: 07a2 slli a5,a5,0x8 - 234: 0857e793 ori a5,a5,133 - 238: c29c sw a5,0(a3) - for( shift = 28; shift >= 0; shift -= 4 ) - 23a: 1771 addi a4,a4,-4 - 23c: fcc71ae3 bne a4,a2,210 -} - 240: 8082 ret - -00000242 : +0000011e : #endif void DelaySysTick( uint32_t n ) { #if defined(CH32V003) || defined(CH32V00x) uint32_t targend = SysTick->CNT + n; - 242: e000f737 lui a4,0xe000f - 246: 471c lw a5,8(a4) - 248: 953e add a0,a0,a5 + 11e: e000f737 lui a4,0xe000f + 122: 471c lw a5,8(a4) + 124: 953e add a0,a0,a5 while( ((int32_t)( SysTick->CNT - targend )) < 0 ); - 24a: 471c lw a5,8(a4) - 24c: 8f89 sub a5,a5,a0 - 24e: fe07cee3 bltz a5,24a + 126: 471c lw a5,8(a4) + 128: 8f89 sub a5,a5,a0 + 12a: fe07cee3 bltz a5,126 uint64_t targend = SysTick->CNT - n; while( ((int64_t)( SysTick->CNT - targend )) > 0 ); #else #error DelaySysTick not defined. #endif } - 252: 8082 ret + 12e: 8082 ret -00000254 : -int mini_itoa(long value, unsigned int radix, int uppercase, int unsig, char *buffer) - 254: 1101 addi sp,sp,-32 - 256: ce06 sw ra,28(sp) - 258: cc22 sw s0,24(sp) - 25a: ca26 sw s1,20(sp) - int negative = 0; - 25c: c002 sw zero,0(sp) -int mini_itoa(long value, unsigned int radix, int uppercase, int unsig, char *buffer) - 25e: 832a mv t1,a0 - if (value < 0 && !unsig) { - 260: 00055763 bgez a0,26e - 264: e689 bnez a3,26e - negative = 1; - 266: 4785 li a5,1 - value = -value; - 268: 40a00333 neg t1,a0 - negative = 1; - 26c: c03e sw a5,0(sp) - 26e: 8a05 andi a2,a2,1 - 270: 06100413 li s0,97 - 274: c219 beqz a2,27a - 276: 04100413 li s0,65 - int negative = 0; - 27a: 84ba mv s1,a4 - *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); - 27c: 1459 addi s0,s0,-10 - int digit = value % radix; - 27e: 851a mv a0,t1 - 280: c83a sw a4,16(sp) - 282: c21a sw t1,4(sp) - 284: c62e sw a1,12(sp) - 286: c41a sw t1,8(sp) - 288: 35b1 jal d4 <__umodsi3> - *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); - 28a: 47a5 li a5,9 - 28c: 4322 lw t1,8(sp) - 28e: 45b2 lw a1,12(sp) - 290: 4742 lw a4,16(sp) - 292: 0ff57693 zext.b a3,a0 - 296: 06a7e163 bltu a5,a0,2f8 - 29a: 03068693 addi a3,a3,48 - 29e: 0ff6f693 zext.b a3,a3 - 2a2: 00148793 addi a5,s1,1 - 2a6: 00d48023 sb a3,0(s1) - value /= radix; - 2aa: 851a mv a0,t1 - 2ac: c83a sw a4,16(sp) - *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); - 2ae: c63e sw a5,12(sp) - value /= radix; - 2b0: c42e sw a1,8(sp) - 2b2: 3bdd jal a8 <__hidden___udivsi3> - } while (value > 0); - 2b4: 4692 lw a3,4(sp) - 2b6: 45a2 lw a1,8(sp) - 2b8: 47b2 lw a5,12(sp) - 2ba: 4742 lw a4,16(sp) - value /= radix; - 2bc: 832a mv t1,a0 - } while (value > 0); - 2be: 02b6fb63 bgeu a3,a1,2f4 - if (negative) - 2c2: 4682 lw a3,0(sp) - 2c4: c699 beqz a3,2d2 - *(pbuffer++) = '-'; - 2c6: 02d00693 li a3,45 - 2ca: 00d78023 sb a3,0(a5) - 2ce: 00248793 addi a5,s1,2 - len = (pbuffer - buffer); - 2d2: 40e78533 sub a0,a5,a4 - for (i = 0; i < len / 2; i++) { - 2d6: 01f55693 srli a3,a0,0x1f - 2da: 96aa add a3,a3,a0 - *(pbuffer) = '\0'; - 2dc: 00078023 sb zero,0(a5) - for (i = 0; i < len / 2; i++) { - 2e0: 8685 srai a3,a3,0x1 - 2e2: 4601 li a2,0 - 2e4: 17fd addi a5,a5,-1 - 2e6: 00d64b63 blt a2,a3,2fc -} - 2ea: 40f2 lw ra,28(sp) - 2ec: 4462 lw s0,24(sp) - 2ee: 44d2 lw s1,20(sp) - 2f0: 6105 addi sp,sp,32 - 2f2: 8082 ret - *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); - 2f4: 84be mv s1,a5 - 2f6: b761 j 27e - 2f8: 96a2 add a3,a3,s0 - 2fa: b755 j 29e - char j = buffer[i]; - 2fc: 00c705b3 add a1,a4,a2 - buffer[i] = buffer[len-i-1]; - 300: 0007c283 lbu t0,0(a5) - char j = buffer[i]; - 304: 0005c303 lbu t1,0(a1) - for (i = 0; i < len / 2; i++) { - 308: 0605 addi a2,a2,1 - buffer[i] = buffer[len-i-1]; - 30a: 00558023 sb t0,0(a1) - buffer[len-i-1] = j; - 30e: 00678023 sb t1,0(a5) - for (i = 0; i < len / 2; i++) { - 312: bfc9 j 2e4 - -00000314 : +00000130 : void ssd1306_i2c_setup(void) { uint16_t tempreg; // Reset I2C1 to init all regs RCC->APB1PRSTR |= RCC_APB1Periph_I2C1; - 314: 400217b7 lui a5,0x40021 - 318: 4b98 lw a4,16(a5) - 31a: 002006b7 lui a3,0x200 - 31e: 8f55 or a4,a4,a3 - 320: cb98 sw a4,16(a5) + 130: 400217b7 lui a5,0x40021 + 134: 4b98 lw a4,16(a5) + 136: 002006b7 lui a3,0x200 + 13a: 8f55 or a4,a4,a3 + 13c: cb98 sw a4,16(a5) RCC->APB1PRSTR &= ~RCC_APB1Periph_I2C1; - 322: 4b98 lw a4,16(a5) - 324: ffe006b7 lui a3,0xffe00 - 328: 16fd addi a3,a3,-1 # ffdfffff <_eusrstack+0xdfdff7ff> - 32a: 8f75 and a4,a4,a3 - 32c: cb98 sw a4,16(a5) + 13e: 4b98 lw a4,16(a5) + 140: ffe006b7 lui a3,0xffe00 + 144: 16fd addi a3,a3,-1 # ffdfffff <_eusrstack+0xdfdff7ff> + 146: 8f75 and a4,a4,a3 + 148: cb98 sw a4,16(a5) // set freq tempreg = I2C1->CTLR2; - 32e: 400057b7 lui a5,0x40005 - 332: 4047d703 lhu a4,1028(a5) # 40005404 <_eusrstack+0x20004c04> + 14a: 400057b7 lui a5,0x40005 + 14e: 4047d703 lhu a4,1028(a5) # 40005404 <_eusrstack+0x20004c04> tempreg &= ~I2C_CTLR2_FREQ; - 336: 66c1 lui a3,0x10 - 338: fc068693 addi a3,a3,-64 # ffc0 - 33c: 8f75 and a4,a4,a3 + 152: 66c1 lui a3,0x10 + 154: fc068693 addi a3,a3,-64 # ffc0 + 158: 8f75 and a4,a4,a3 tempreg |= (FUNCONF_SYSTEM_CORE_CLOCK/SSD1306_I2C_PRERATE)&I2C_CTLR2_FREQ; - 33e: 01876713 ori a4,a4,24 + 15a: 01876713 ori a4,a4,24 I2C1->CTLR2 = tempreg; - 342: 40e79223 sh a4,1028(a5) + 15e: 40e79223 sh a4,1028(a5) tempreg = (FUNCONF_SYSTEM_CORE_CLOCK/(25*SSD1306_I2C_CLKRATE))&I2C_CKCFGR_CCR; tempreg |= I2C_CKCFGR_DUTY; #endif tempreg |= I2C_CKCFGR_FS; #endif I2C1->CKCFGR = tempreg; - 346: 7771 lui a4,0xffffc - 348: 0705 addi a4,a4,1 # ffffc001 <_eusrstack+0xdfffb801> - 34a: 40e79e23 sh a4,1052(a5) + 162: 7771 lui a4,0xffffc + 164: 0705 addi a4,a4,1 # ffffc001 <_eusrstack+0xdfffb801> + 166: 40e79e23 sh a4,1052(a5) // initialize the state ssd1306_i2c_irq_state = 0; #endif // Enable I2C I2C1->CTLR1 |= I2C_CTLR1_PE; - 34e: 4007d703 lhu a4,1024(a5) - 352: 00176713 ori a4,a4,1 - 356: 40e79023 sh a4,1024(a5) + 16a: 4007d703 lhu a4,1024(a5) + 16e: 00176713 ori a4,a4,1 + 172: 40e79023 sh a4,1024(a5) // set ACK mode I2C1->CTLR1 |= I2C_CTLR1_ACK; - 35a: 4007d703 lhu a4,1024(a5) - 35e: 40076713 ori a4,a4,1024 - 362: 40e79023 sh a4,1024(a5) + 176: 4007d703 lhu a4,1024(a5) + 17a: 40076713 ori a4,a4,1024 + 17e: 40e79023 sh a4,1024(a5) } - 366: 8082 ret + 182: 8082 ret -00000368 : +00000184 : void ssd1306_drawPixel(uint32_t x, uint32_t y, int color) { uint32_t addr; /* clip */ if(x >= SSD1306_W) - 368: 07f00793 li a5,127 - 36c: 02a7e763 bltu a5,a0,39a + 184: 07f00793 li a5,127 + 188: 02a7e763 bltu a5,a0,1b6 return; if(y >= SSD1306_H) - 370: 03f00793 li a5,63 - 374: 02b7e363 bltu a5,a1,39a + 18c: 03f00793 li a5,63 + 190: 02b7e363 bltu a5,a1,1b6 return; /* compute buffer address */ addr = x + SSD1306_W*(y/8); - 378: 0035d793 srli a5,a1,0x3 - 37c: 079e slli a5,a5,0x7 - 37e: 97aa add a5,a5,a0 + 194: 0035d793 srli a5,a1,0x3 + 198: 079e slli a5,a5,0x7 + 19a: 97aa add a5,a5,a0 /* set/clear bit in buffer */ if(color) ssd1306_buffer[addr] |= (1<<(y&7)); - 380: c4418513 addi a0,gp,-956 # 20000040 - 384: 953e add a0,a0,a5 - 386: 899d andi a1,a1,7 - 388: 4705 li a4,1 - 38a: 00054783 lbu a5,0(a0) - 38e: 00b715b3 sll a1,a4,a1 + 19c: c6818513 addi a0,gp,-920 # 20000064 + 1a0: 953e add a0,a0,a5 + 1a2: 899d andi a1,a1,7 + 1a4: 4705 li a4,1 + 1a6: 00054783 lbu a5,0(a0) + 1aa: 00b715b3 sll a1,a4,a1 if(color) - 392: c609 beqz a2,39c + 1ae: c609 beqz a2,1b8 ssd1306_buffer[addr] |= (1<<(y&7)); - 394: 8fcd or a5,a5,a1 + 1b0: 8fcd or a5,a5,a1 else ssd1306_buffer[addr] &= ~(1<<(y&7)); - 396: 00f50023 sb a5,0(a0) + 1b2: 00f50023 sb a5,0(a0) } - 39a: 8082 ret + 1b6: 8082 ret ssd1306_buffer[addr] &= ~(1<<(y&7)); - 39c: fff5c593 not a1,a1 - 3a0: 8fed and a5,a5,a1 - 3a2: bfd5 j 396 + 1b8: fff5c593 not a1,a1 + 1bc: 8fed and a5,a5,a1 + 1be: bfd5 j 1b2 -000003a4 : +000001c0 : + +/* + * fill a rectangle + */ +void ssd1306_fillRect(uint32_t x, uint32_t y, uint8_t w, uint32_t h, uint32_t color) +{ + 1c0: 1101 addi sp,sp,-32 + 1c2: 8332 mv t1,a2 + 1c4: cc22 sw s0,24(sp) + 1c6: ca26 sw s1,20(sp) + 1c8: ce06 sw ra,28(sp) + 1ca: 84aa mv s1,a0 + 1cc: 863a mv a2,a4 + 1ce: 96ae add a3,a3,a1 + + /* scan vertical */ + while(h--) + { + m=x; + w=iw; + 1d0: 841a mv s0,t1 + /* scan horizontal */ + while(w--) + 1d2: 147d addi s0,s0,-1 + 1d4: 0ff47413 zext.b s0,s0 + 1d8: 0ff00713 li a4,255 + 1dc: 00e41a63 bne s0,a4,1f0 + { + /* invert pixels */ + ssd1306_drawPixel(m++, n, color); + } + n++; + 1e0: 0585 addi a1,a1,1 + while(h--) + 1e2: 02d58663 beq a1,a3,20e + while(w--) + 1e6: fff30413 addi s0,t1,-1 + 1ea: 0ff47413 zext.b s0,s0 + m=x; + 1ee: 8526 mv a0,s1 + ssd1306_drawPixel(m++, n, color); + 1f0: 00150713 addi a4,a0,1 + 1f4: c81a sw t1,16(sp) + 1f6: c636 sw a3,12(sp) + 1f8: c43a sw a4,8(sp) + 1fa: c232 sw a2,4(sp) + 1fc: c02e sw a1,0(sp) + 1fe: 3759 jal 184 + 200: 4722 lw a4,8(sp) + 202: 4342 lw t1,16(sp) + 204: 46b2 lw a3,12(sp) + 206: 4612 lw a2,4(sp) + 208: 4582 lw a1,0(sp) + 20a: 853a mv a0,a4 + 20c: b7d9 j 1d2 + } +} + 20e: 40f2 lw ra,28(sp) + 210: 4462 lw s0,24(sp) + 212: 44d2 lw s1,20(sp) + 214: 6105 addi sp,sp,32 + 216: 8082 ret + +00000218 : /* * draw a string to the display */ void ssd1306_drawstr(int x, int y, const char *str, uint8_t color) { - 3a4: fdc10113 addi sp,sp,-36 - 3a8: ce22 sw s0,28(sp) - 3aa: cc26 sw s1,24(sp) - 3ac: d006 sw ra,32(sp) - 3ae: 842a mv s0,a0 - 3b0: 82ae mv t0,a1 - 3b2: 84b2 mv s1,a2 + 218: fdc10113 addi sp,sp,-36 + 21c: ce22 sw s0,28(sp) + 21e: cc26 sw s1,24(sp) + 220: d006 sw ra,32(sp) + 222: 842a mv s0,a0 + 224: 82ae mv t0,a1 + 226: 84b2 mv s1,a2 uint8_t c; while((c=*str++)) - 3b4: 0004c383 lbu t2,0(s1) - 3b8: 0485 addi s1,s1,1 - 3ba: 06038563 beqz t2,424 - 3be: 4701 li a4,0 + 228: 0004c383 lbu t2,0(s1) + 22c: 0485 addi s1,s1,1 + 22e: 06038563 beqz t2,298 + 232: 4701 li a4,0 d = fontdata[(chr<<3)+i]; - 3c0: 00339793 slli a5,t2,0x3 - 3c4: 6609 lui a2,0x2 - 3c6: 97ba add a5,a5,a4 - 3c8: 03460613 addi a2,a2,52 # 2034 - 3cc: 97b2 add a5,a5,a2 - 3ce: 0007c303 lbu t1,0(a5) - 3d2: 4781 li a5,0 + 234: 00339793 slli a5,t2,0x3 + 238: 6609 lui a2,0x2 + 23a: 97ba add a5,a5,a4 + 23c: 67060613 addi a2,a2,1648 # 2670 + 240: 97b2 add a5,a5,a2 + 242: 0007c303 lbu t1,0(a5) + 246: 4781 li a5,0 if(d&0x80) - 3d4: 01831593 slli a1,t1,0x18 - 3d8: 85e1 srai a1,a1,0x18 - 3da: 8636 mv a2,a3 - 3dc: 0005c463 bltz a1,3e4 + 248: 01831593 slli a1,t1,0x18 + 24c: 85e1 srai a1,a1,0x18 + 24e: 8636 mv a2,a3 + 250: 0005c463 bltz a1,258 col = (~color)&1; - 3e0: 0016c613 xori a2,a3,1 + 254: 0016c613 xori a2,a3,1 ssd1306_drawPixel(x+j, y+i, col); - 3e4: 00e285b3 add a1,t0,a4 - 3e8: 00f40533 add a0,s0,a5 - 3ec: ca36 sw a3,20(sp) - 3ee: c81a sw t1,16(sp) - 3f0: c61e sw t2,12(sp) - 3f2: c43a sw a4,8(sp) - 3f4: c216 sw t0,4(sp) - 3f6: c03e sw a5,0(sp) - 3f8: 3f85 jal 368 + 258: 00e285b3 add a1,t0,a4 + 25c: 00f40533 add a0,s0,a5 + 260: ca36 sw a3,20(sp) + 262: c81a sw t1,16(sp) + 264: c61e sw t2,12(sp) + 266: c43a sw a4,8(sp) + 268: c216 sw t0,4(sp) + 26a: c03e sw a5,0(sp) + 26c: 3f21 jal 184 d <<= 1; - 3fa: 4342 lw t1,16(sp) + 26e: 4342 lw t1,16(sp) for(j=0;j<8;j++) - 3fc: 4782 lw a5,0(sp) - 3fe: 4621 li a2,8 + 270: 4782 lw a5,0(sp) + 272: 4621 li a2,8 d <<= 1; - 400: 0306 slli t1,t1,0x1 + 274: 0306 slli t1,t1,0x1 for(j=0;j<8;j++) - 402: 0785 addi a5,a5,1 - 404: 4292 lw t0,4(sp) - 406: 4722 lw a4,8(sp) - 408: 43b2 lw t2,12(sp) - 40a: 46d2 lw a3,20(sp) + 276: 0785 addi a5,a5,1 + 278: 4292 lw t0,4(sp) + 27a: 4722 lw a4,8(sp) + 27c: 43b2 lw t2,12(sp) + 27e: 46d2 lw a3,20(sp) d <<= 1; - 40c: 0ff37313 zext.b t1,t1 + 280: 0ff37313 zext.b t1,t1 for(j=0;j<8;j++) - 410: fcc792e3 bne a5,a2,3d4 + 284: fcc792e3 bne a5,a2,248 for(i=0;i<8;i++) - 414: 0705 addi a4,a4,1 - 416: faf715e3 bne a4,a5,3c0 + 288: 0705 addi a4,a4,1 + 28a: faf715e3 bne a4,a5,234 { ssd1306_drawchar(x, y, c, color); x += 8; - 41a: 9432 add s0,s0,a2 + 28e: 9432 add s0,s0,a2 if(x>120) - 41c: 07800793 li a5,120 - 420: f887dae3 bge a5,s0,3b4 + 290: 07800793 li a5,120 + 294: f887dae3 bge a5,s0,228 break; } } - 424: 5082 lw ra,32(sp) - 426: 4472 lw s0,28(sp) - 428: 44e2 lw s1,24(sp) - 42a: 02410113 addi sp,sp,36 - 42e: 8082 ret + 298: 5082 lw ra,32(sp) + 29a: 4472 lw s0,28(sp) + 29c: 44e2 lw s1,24(sp) + 29e: 02410113 addi sp,sp,36 + 2a2: 8082 ret -00000430 : -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } +000002a4 : + +// Tiny string builders used instead of snprintf: we only ever paste short +// strings and small unsigned ints, and avoiding keeps the whole +// printf machinery (~1 KB) out of the image. Each returns the new end pointer +// so calls chain; remember to NUL-terminate the final buffer yourself. +static char *s_cat(char *p, const char *s) { while (*s) *p++ = *s++; return p; } + 2a4: 0005c783 lbu a5,0(a1) + 2a8: e391 bnez a5,2ac + 2aa: 8082 ret + 2ac: 0505 addi a0,a0,1 + 2ae: 0585 addi a1,a1,1 + 2b0: fef50fa3 sb a5,-1(a0) + 2b4: bfc5 j 2a4 + +000002b6 : +static char *u_cat(char *p, unsigned v) +{ + 2b6: 1111 addi sp,sp,-28 + 2b8: ca22 sw s0,20(sp) + 2ba: c826 sw s1,16(sp) + 2bc: cc06 sw ra,24(sp) + 2be: 87aa mv a5,a0 + 2c0: 872e mv a4,a1 + 2c2: 0020 addi s0,sp,8 + char tmp[5]; + int n = 0; + 2c4: 4481 li s1,0 + do { tmp[n++] = '0' + v % 10; v /= 10; } while (v); + 2c6: 45a9 li a1,10 + 2c8: 853a mv a0,a4 + 2ca: c23e sw a5,4(sp) + 2cc: c03a sw a4,0(sp) + 2ce: 3519 jal d4 <__umodsi3> + 2d0: 4702 lw a4,0(sp) + 2d2: 03050513 addi a0,a0,48 + 2d6: 00a40023 sb a0,0(s0) + 2da: 45a9 li a1,10 + 2dc: 853a mv a0,a4 + 2de: 33e9 jal a8 <__hidden___udivsi3> + 2e0: 4302 lw t1,0(sp) + 2e2: 46a5 li a3,9 + 2e4: 4792 lw a5,4(sp) + 2e6: 0485 addi s1,s1,1 + 2e8: 872a mv a4,a0 + 2ea: 0405 addi s0,s0,1 + 2ec: 0030 addi a2,sp,8 + 2ee: fc66ece3 bltu a3,t1,2c6 + 2f2: 8726 mv a4,s1 + 2f4: 86be mv a3,a5 + while (n) *p++ = tmp[--n]; + 2f6: 177d addi a4,a4,-1 + 2f8: 00e605b3 add a1,a2,a4 + 2fc: 0005c583 lbu a1,0(a1) + 300: 0685 addi a3,a3,1 + 302: feb68fa3 sb a1,-1(a3) + 306: fb65 bnez a4,2f6 + return p; +} + 308: 40e2 lw ra,24(sp) + 30a: 4452 lw s0,20(sp) + 30c: 00978533 add a0,a5,s1 + 310: 44c2 lw s1,16(sp) + 312: 0171 addi sp,sp,28 + 314: 8082 ret + +00000316 : // short square-wave beep on the passive piezo (blocking, ms-scale only) static void beep(uint16_t freq, uint16_t ms) { if (!sound_on) return; - 430: c061c783 lbu a5,-1018(gp) # 20000002 - 434: c7ad beqz a5,49e + 316: c061c783 lbu a5,-1018(gp) # 20000002 + 31a: c7ad beqz a5,384 { - 436: 1131 addi sp,sp,-20 - 438: c622 sw s0,12(sp) - 43a: 842e mv s0,a1 + 31c: 1131 addi sp,sp,-20 + 31e: c622 sw s0,12(sp) + 320: 842e mv s0,a1 if (freq == 0) { Delay_Ms(ms); return; } uint32_t half = 500000u / freq; // half-period in us - 43c: 85aa mv a1,a0 - 43e: 0007a537 lui a0,0x7a - 442: 12050513 addi a0,a0,288 # 7a120 + 322: 85aa mv a1,a0 + 324: 0007a537 lui a0,0x7a + 328: 12050513 addi a0,a0,288 # 7a120 { - 446: c806 sw ra,16(sp) - 448: c426 sw s1,8(sp) + 32c: c806 sw ra,16(sp) + 32e: c426 sw s1,8(sp) uint32_t half = 500000u / freq; // half-period in us - 44a: 39b9 jal a8 <__hidden___udivsi3> + 330: 3ba5 jal a8 <__hidden___udivsi3> uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); - 44c: 00541793 slli a5,s0,0x5 - 450: 8f81 sub a5,a5,s0 - 452: 078a slli a5,a5,0x2 - 454: 97a2 add a5,a5,s0 - 456: 00151413 slli s0,a0,0x1 + 332: 00541793 slli a5,s0,0x5 + 336: 8f81 sub a5,a5,s0 + 338: 078a slli a5,a5,0x2 + 33a: 97a2 add a5,a5,s0 + 33c: 00151413 slli s0,a0,0x1 uint32_t half = 500000u / freq; // half-period in us - 45a: 84aa mv s1,a0 + 340: 84aa mv s1,a0 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); - 45c: 85a2 mv a1,s0 - 45e: 00379513 slli a0,a5,0x3 - 462: 3199 jal a8 <__hidden___udivsi3> + 342: 85a2 mv a1,s0 + 344: 00379513 slli a0,a5,0x3 + 348: 3385 jal a8 <__hidden___udivsi3> for (uint32_t i = 0; i < cycles; i++) { funDigitalWrite(BUZZER, FUN_HIGH); Delay_Us(half); - 464: 9426 add s0,s0,s1 - 466: 00141793 slli a5,s0,0x1 + 34a: 9426 add s0,s0,s1 + 34c: 00141793 slli a5,s0,0x1 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); - 46a: 872a mv a4,a0 + 350: 872a mv a4,a0 Delay_Us(half); - 46c: c03e sw a5,0(sp) + 352: c03e sw a5,0(sp) for (uint32_t i = 0; i < cycles; i++) { - 46e: 4401 li s0,0 + 354: 4401 li s0,0 Delay_Us(half); - 470: 4502 lw a0,0(sp) + 356: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_HIGH); - 472: 400114b7 lui s1,0x40011 - 476: c23a sw a4,4(sp) - 478: 4691 li a3,4 - 47a: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00> - 47e: c894 sw a3,16(s1) + 358: 400114b7 lui s1,0x40011 + 35c: c23a sw a4,4(sp) + 35e: 4691 li a3,4 + 360: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00> + 364: c894 sw a3,16(s1) Delay_Us(half); - 480: 33c9 jal 242 + 366: 3b65 jal 11e funDigitalWrite(BUZZER, FUN_LOW); Delay_Us(half); - 482: 4502 lw a0,0(sp) + 368: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_LOW); - 484: 000406b7 lui a3,0x40 - 488: c894 sw a3,16(s1) + 36a: 000406b7 lui a3,0x40 + 36e: c894 sw a3,16(s1) Delay_Us(half); - 48a: 3b65 jal 242 + 370: 337d jal 11e for (uint32_t i = 0; i < cycles; i++) { - 48c: 4712 lw a4,4(sp) - 48e: 0405 addi s0,s0,1 - 490: fe8710e3 bne a4,s0,470 + 372: 4712 lw a4,4(sp) + 374: 0405 addi s0,s0,1 + 376: fe8710e3 bne a4,s0,356 } } - 494: 40c2 lw ra,16(sp) - 496: 4432 lw s0,12(sp) - 498: 44a2 lw s1,8(sp) - 49a: 0151 addi sp,sp,20 - 49c: 8082 ret - 49e: 8082 ret + 37a: 40c2 lw ra,16(sp) + 37c: 4432 lw s0,12(sp) + 37e: 44a2 lw s1,8(sp) + 380: 0151 addi sp,sp,20 + 382: 8082 ret + 384: 8082 ret -000004a0 : +00000386 : static void led_blink(void) { - 4a0: 1161 addi sp,sp,-8 - 4a2: c022 sw s0,0(sp) + 386: 1161 addi sp,sp,-8 + 388: c022 sw s0,0(sp) funDigitalWrite(LED_PIN, FUN_HIGH); - 4a4: 40011437 lui s0,0x40011 + 38a: 40011437 lui s0,0x40011 { - 4a8: c206 sw ra,4(sp) + 38e: c206 sw ra,4(sp) funDigitalWrite(LED_PIN, FUN_HIGH); - 4aa: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000> - 4ae: 4789 li a5,2 + 390: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000> + 394: 4789 li a5,2 Delay_Ms(30); - 4b0: 0002c537 lui a0,0x2c + 396: 0002c537 lui a0,0x2c funDigitalWrite(LED_PIN, FUN_HIGH); - 4b4: c81c sw a5,16(s0) + 39a: c81c sw a5,16(s0) Delay_Ms(30); - 4b6: f2050513 addi a0,a0,-224 # 2bf20 - 4ba: 3361 jal 242 + 39c: f2050513 addi a0,a0,-224 # 2bf20 + 3a0: 3bbd jal 11e funDigitalWrite(LED_PIN, FUN_LOW); - 4bc: 000207b7 lui a5,0x20 + 3a2: 000207b7 lui a5,0x20 } - 4c0: 4092 lw ra,4(sp) + 3a6: 4092 lw ra,4(sp) funDigitalWrite(LED_PIN, FUN_LOW); - 4c2: c81c sw a5,16(s0) + 3a8: c81c sw a5,16(s0) } - 4c4: 4402 lw s0,0(sp) - 4c6: 0121 addi sp,sp,8 - 4c8: 8082 ret + 3aa: 4402 lw s0,0(sp) + 3ac: 0121 addi sp,sp,8 + 3ae: 8082 ret -000004ca : +000003b0 : +} -static void pet_reset(void) +// Award XP; promote (and trigger the evolution banner) when a tier is reached. +static void add_xp(uint8_t n) { - pet.satiety = 80; - 4ca: 645a5737 lui a4,0x645a5 - 4ce: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850> - 4d2: c2e1ac23 sw a4,-968(gp) # 20000034 - pet.happy = 80; - pet.energy = 90; - pet.hygiene = 100; - pet.health = 100; - 4d6: c3818793 addi a5,gp,-968 # 20000034 - 4da: 06400713 li a4,100 - 4de: 00e78223 sb a4,4(a5) # 20004 - pet.age_min = 0; - pet.poop = 0; - pet.sleeping = 0; - pet.alive = 1; - 4e2: 4705 li a4,1 - pet.age_min = 0; - 4e4: 00079323 sh zero,6(a5) - pet.poop = 0; - 4e8: 00079423 sh zero,8(a5) - pet.alive = 1; - 4ec: 00e78523 sb a4,10(a5) - screen = SCR_MAIN; - 4f0: c2018aa3 sb zero,-971(gp) # 20000031 - cursor = 0; - 4f4: c2018a23 sb zero,-972(gp) # 20000030 - for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } - 4f8: c201a823 sw zero,-976(gp) # 2000002c - 4fc: c201a623 sw zero,-980(gp) # 20000028 -} - 500: 8082 ret + if (!pet.alive) return; + 3b0: c5418713 addi a4,gp,-940 # 20000050 + 3b4: 01074703 lbu a4,16(a4) + 3b8: c371 beqz a4,47c + 3ba: c5418793 addi a5,gp,-940 # 20000050 + if (pet.xp < 60000) pet.xp += n; + 3be: 0087d683 lhu a3,8(a5) # 20008 + 3c2: 673d lui a4,0xf + 3c4: a5f70713 addi a4,a4,-1441 # ea5f + 3c8: 02d76663 bltu a4,a3,3f4 + 3cc: 9536 add a0,a0,a3 + 3ce: 0542 slli a0,a0,0x10 + 3d0: 8141 srli a0,a0,0x10 + 3d2: 00a79423 sh a0,8(a5) -00000502 : + uint8_t nl = 1; + for (uint8_t i = 1; i < MAX_LEVEL; i++) + if (pet.xp >= level_xp[i]) nl = i + 1; + 3d6: 02c00693 li a3,44 + uint8_t nl = 1; + 3da: 4705 li a4,1 + if (pet.xp >= level_xp[i]) nl = i + 1; + 3dc: 00a6fd63 bgeu a3,a0,3f6 + 3e0: 07700693 li a3,119 + 3e4: 4709 li a4,2 + 3e6: 00a6f863 bgeu a3,a0,3f6 + 3ea: 0ef00693 li a3,239 + 3ee: 470d li a4,3 + 3f0: 00a6f363 bgeu a3,a0,3f6 + 3f4: 4711 li a4,4 + + if (nl > pet.level) { + 3f6: 00b7c683 lbu a3,11(a5) + 3fa: 08e6f163 bgeu a3,a4,47c +{ + 3fe: 1171 addi sp,sp,-4 + 400: c006 sw ra,0(sp) + pet.level = nl; + 402: 00e785a3 sb a4,11(a5) + switch (pet.level) { + 406: 4589 li a1,2 + 408: 4685 li a3,1 + 40a: 02b70663 beq a4,a1,436 + 40e: 460d li a2,3 + 410: 86ae mv a3,a1 + 412: 02c70263 beq a4,a2,436 + 416: 4605 li a2,1 + 418: 4681 li a3,0 + 41a: 00c70e63 beq a4,a2,436 + if (!pet.ascend) pet.ascend = (pet.health >= 60) ? 1 : 2; + 41e: 00d7c703 lbu a4,13(a5) + 422: eb31 bnez a4,476 + 424: 00478683 lb a3,4(a5) + 428: 03b00713 li a4,59 + 42c: 04d74163 blt a4,a3,46e + 430: 00b786a3 sb a1,13(a5) + pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; + 434: 4691 li a3,4 + case 1: pet.form = FORM_PROC; break; + 436: 00d78623 sb a3,12(a5) + compute_form(); + evo_anim = 30; // ~1.8 s celebratory banner + 43a: 4779 li a4,30 + beep(784, 60); beep(988, 60); beep(1175, 60); beep(1568, 140); + 43c: 03c00593 li a1,60 + 440: 31000513 li a0,784 + evo_anim = 30; // ~1.8 s celebratory banner + 444: c4e18823 sb a4,-944(gp) # 2000004c + beep(784, 60); beep(988, 60); beep(1175, 60); beep(1568, 140); + 448: 35f9 jal 316 + 44a: 03c00593 li a1,60 + 44e: 3dc00513 li a0,988 + 452: 35d1 jal 316 + 454: 03c00593 li a1,60 + 458: 49700513 li a0,1175 + 45c: 3d6d jal 316 + 45e: 08c00593 li a1,140 + 462: 62000513 li a0,1568 + 466: 3d45 jal 316 + led_blink(); + } +} + 468: 4082 lw ra,0(sp) + 46a: 0111 addi sp,sp,4 + led_blink(); + 46c: bf29 j 386 + if (!pet.ascend) pet.ascend = (pet.health >= 60) ? 1 : 2; + 46e: 00c786a3 sb a2,13(a5) + pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; + 472: 468d li a3,3 + break; + 474: b7c9 j 436 + pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; + 476: fac71fe3 bne a4,a2,434 + 47a: bfe5 j 472 + 47c: 8082 ret + +0000047e : // Chirp once when a need first drops below 50% (gentle) or 20% (urgent), // re-arming only after it recovers. Audible even while the screen is off, // so it works as a "tend to me" reminder. static void notify(uint8_t idx, int8_t val) { - 502: 1141 addi sp,sp,-16 - 504: c422 sw s0,8(sp) - 506: c606 sw ra,12(sp) - 508: c226 sw s1,4(sp) + 47e: 1141 addi sp,sp,-16 + 480: c422 sw s0,8(sp) + 482: c606 sw ra,12(sp) + 484: c226 sw s1,4(sp) if (val < 20) { - 50a: 474d li a4,19 + 486: 474d li a4,19 { - 50c: 87aa mv a5,a0 + 488: 87aa mv a5,a0 if (val < 20) { - 50e: c2c18413 addi s0,gp,-980 # 20000028 - 512: 04b74463 blt a4,a1,55a + 48a: c4c18413 addi s0,gp,-948 # 20000048 + 48e: 04b74463 blt a4,a1,4d6 if (!crit_flag[idx]) { // urgent: descending triple - 516: 942a add s0,s0,a0 - 518: 00044703 lbu a4,0(s0) - 51c: eb15 bnez a4,550 - 51e: c02a sw a0,0(sp) + 492: 942a add s0,s0,a0 + 494: 00044703 lbu a4,0(s0) + 498: eb15 bnez a4,4cc + 49a: c02a sw a0,0(sp) beep(1568, 60); beep(1175, 60); beep(880, 90); - 520: 03c00593 li a1,60 - 524: 62000513 li a0,1568 - 528: 3721 jal 430 - 52a: 03c00593 li a1,60 - 52e: 49700513 li a0,1175 - 532: 3dfd jal 430 - 534: 05a00593 li a1,90 - 538: 37000513 li a0,880 - 53c: 3dd5 jal 430 + 49c: 03c00593 li a1,60 + 4a0: 62000513 li a0,1568 + 4a4: 3d8d jal 316 + 4a6: 03c00593 li a1,60 + 4aa: 49700513 li a0,1175 + 4ae: 35a5 jal 316 + 4b0: 05a00593 li a1,90 + 4b4: 37000513 li a0,880 + 4b8: 3db9 jal 316 crit_flag[idx] = 1; warn_flag[idx] = 1; - 53e: 4782 lw a5,0(sp) - 540: c3018713 addi a4,gp,-976 # 2000002c - 544: 4685 li a3,1 - 546: 97ba add a5,a5,a4 - 548: 00d40023 sb a3,0(s0) - 54c: 00d78023 sb a3,0(a5) + 4ba: 4782 lw a5,0(sp) + 4bc: c4818713 addi a4,gp,-952 # 20000044 + 4c0: 4685 li a3,1 + 4c2: 97ba add a5,a5,a4 + 4c4: 00d40023 sb a3,0(s0) + 4c8: 00d78023 sb a3,0(a5) } crit_flag[idx] = 0; } else { warn_flag[idx] = 0; crit_flag[idx] = 0; } } - 550: 40b2 lw ra,12(sp) - 552: 4422 lw s0,8(sp) - 554: 4492 lw s1,4(sp) - 556: 0141 addi sp,sp,16 - 558: 8082 ret + 4cc: 40b2 lw ra,12(sp) + 4ce: 4422 lw s0,8(sp) + 4d0: 4492 lw s1,4(sp) + 4d2: 0141 addi sp,sp,16 + 4d4: 8082 ret } else if (val < 50) { - 55a: c3018493 addi s1,gp,-976 # 2000002c - 55e: 03100713 li a4,49 + 4d6: c4818493 addi s1,gp,-952 # 20000044 + 4da: 03100713 li a4,49 if (!warn_flag[idx]) { // gentle: single chirp - 562: 94aa add s1,s1,a0 + 4de: 94aa add s1,s1,a0 } else if (val < 50) { - 564: 02b74363 blt a4,a1,58a + 4e0: 02b74363 blt a4,a1,506 if (!warn_flag[idx]) { // gentle: single chirp - 568: 0004c703 lbu a4,0(s1) - 56c: eb19 bnez a4,582 - 56e: c02a sw a0,0(sp) + 4e4: 0004c703 lbu a4,0(s1) + 4e8: eb19 bnez a4,4fe + 4ea: c02a sw a0,0(sp) beep(1568, 50); - 570: 03200593 li a1,50 - 574: 62000513 li a0,1568 - 578: 3d65 jal 430 + 4ec: 03200593 li a1,50 + 4f0: 62000513 li a0,1568 + 4f4: 350d jal 316 warn_flag[idx] = 1; - 57a: 4782 lw a5,0(sp) - 57c: 4705 li a4,1 - 57e: 00e48023 sb a4,0(s1) + 4f6: 4782 lw a5,0(sp) + 4f8: 4705 li a4,1 + 4fa: 00e48023 sb a4,0(s1) warn_flag[idx] = 0; crit_flag[idx] = 0; - 582: 943e add s0,s0,a5 - 584: 00040023 sb zero,0(s0) + 4fe: 943e add s0,s0,a5 + 500: 00040023 sb zero,0(s0) } - 588: b7e1 j 550 + 504: b7e1 j 4cc warn_flag[idx] = 0; crit_flag[idx] = 0; - 58a: 00048023 sb zero,0(s1) - 58e: bfd5 j 582 + 506: 00048023 sb zero,0(s1) + 50a: bfd5 j 4fe -00000590 : +0000050c : } } // ----------------------------------------------------------------- drawing static void draw_center_str(int y, const char *s) { - 590: 862e mv a2,a1 + 50c: 862e mv a2,a1 int len = 0; - 592: 4701 li a4,0 + 50e: 4701 li a4,0 while (s[len]) len++; - 594: 00e607b3 add a5,a2,a4 - 598: 0007c783 lbu a5,0(a5) - 59c: ef81 bnez a5,5b4 + 510: 00e607b3 add a5,a2,a4 + 514: 0007c783 lbu a5,0(a5) + 518: ef81 bnez a5,530 int x = (SSD1306_W - len * 8) / 2; - 59e: 47c1 li a5,16 - 5a0: 8f99 sub a5,a5,a4 - 5a2: 078a slli a5,a5,0x2 + 51a: 47c1 li a5,16 + 51c: 8f99 sub a5,a5,a4 + 51e: 078a slli a5,a5,0x2 if (x < 0) x = 0; - 5a4: fff7c713 not a4,a5 - 5a8: 877d srai a4,a4,0x1f + 520: fff7c713 not a4,a5 + 524: 877d srai a4,a4,0x1f ssd1306_drawstr(x, y, s, 1); - 5aa: 85aa mv a1,a0 - 5ac: 4685 li a3,1 - 5ae: 00e7f533 and a0,a5,a4 - 5b2: bbcd j 3a4 + 526: 85aa mv a1,a0 + 528: 4685 li a3,1 + 52a: 00e7f533 and a0,a5,a4 + 52e: b1ed j 218 while (s[len]) len++; - 5b4: 0705 addi a4,a4,1 - 5b6: bff9 j 594 + 530: 0705 addi a4,a4,1 + 532: bff9 j 510 -000005b8 : +00000534 : static Buttons read_buttons(void) { // active-low: pressed reads 0 Buttons b; b.ok = !funDigitalRead(BTN_OK); - 5b8: 400117b7 lui a5,0x40011 - 5bc: 4788 lw a0,8(a5) + 534: 400117b7 lui a5,0x40011 + 538: 4788 lw a0,8(a5) b.left = !funDigitalRead(BTN_LEFT); - 5be: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00> - 5c2: 4798 lw a4,8(a5) + 53a: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00> + 53e: 4798 lw a4,8(a5) b.right = !funDigitalRead(BTN_RIGHT); - 5c4: 479c lw a5,8(a5) + 540: 479c lw a5,8(a5) b.ok = !funDigitalRead(BTN_OK); - 5c6: fff54513 not a0,a0 + 542: fff54513 not a0,a0 b.left = !funDigitalRead(BTN_LEFT); - 5ca: 8319 srli a4,a4,0x6 - 5cc: fff74713 not a4,a4 + 546: 8319 srli a4,a4,0x6 + 548: fff74713 not a4,a4 b.right = !funDigitalRead(BTN_RIGHT); - 5d0: 8395 srli a5,a5,0x5 - 5d2: fff7c793 not a5,a5 + 54c: 8395 srli a5,a5,0x5 + 54e: fff7c793 not a5,a5 return b; - 5d6: 8b05 andi a4,a4,1 - 5d8: 8905 andi a0,a0,1 - 5da: 0722 slli a4,a4,0x8 - 5dc: 8b85 andi a5,a5,1 + 552: 8b05 andi a4,a4,1 + 554: 8905 andi a0,a0,1 + 556: 0722 slli a4,a4,0x8 + 558: 8b85 andi a5,a5,1 { - 5de: 1171 addi sp,sp,-4 + 55a: 1171 addi sp,sp,-4 return b; - 5e0: 07c2 slli a5,a5,0x10 - 5e2: 8d59 or a0,a0,a4 + 55c: 07c2 slli a5,a5,0x10 + 55e: 8d59 or a0,a0,a4 } - 5e4: 8d5d or a0,a0,a5 - 5e6: 0111 addi sp,sp,4 - 5e8: 8082 ret + 560: 8d5d or a0,a0,a5 + 562: 0111 addi sp,sp,4 + 564: 8082 ret -000005ea : - if((x >= SSD1306_W) || (y >= SSD1306_H)) return; - 5ea: 07f00793 li a5,127 - 5ee: 02a7cf63 blt a5,a0,62c -void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) - 5f2: 1141 addi sp,sp,-16 - 5f4: c422 sw s0,8(sp) - 5f6: c606 sw ra,12(sp) - 5f8: c226 sw s1,4(sp) - if((y+h-1) >= SSD1306_H) h = SSD1306_H-y; - 5fa: 00c587b3 add a5,a1,a2 - 5fe: 04000713 li a4,64 - 602: 842e mv s0,a1 - 604: 00f75463 bge a4,a5,60c - 608: 40b70633 sub a2,a4,a1 - 60c: 008604b3 add s1,a2,s0 - while(h--) - 610: 00941763 bne s0,s1,61e -} - 614: 40b2 lw ra,12(sp) - 616: 4422 lw s0,8(sp) - 618: 4492 lw s1,4(sp) - 61a: 0141 addi sp,sp,16 - 61c: 8082 ret - ssd1306_drawPixel(x, y++, color); - 61e: 85a2 mv a1,s0 - 620: 4605 li a2,1 - 622: c02a sw a0,0(sp) - 624: 3391 jal 368 - 626: 4502 lw a0,0(sp) - 628: 0405 addi s0,s0,1 - 62a: b7dd j 610 - 62c: 8082 ret - -0000062e : -void ssd1306_drawImage(uint32_t x, uint32_t y, const unsigned char* input, uint32_t width, uint32_t height, uint32_t color_mode) { - 62e: fd810113 addi sp,sp,-40 - 632: 00e587b3 add a5,a1,a4 - 636: d222 sw s0,36(sp) - 638: d026 sw s1,32(sp) - 63a: c82a sw a0,16(sp) - 63c: ca32 sw a2,20(sp) - uint32_t bytes_to_draw = width / 8; - 63e: 0036d413 srli s0,a3,0x3 - 642: c63e sw a5,12(sp) - 644: 4381 li t2,0 - uint32_t v_mask = 1 << (y_absolute & 7); - 646: 0075f793 andi a5,a1,7 - 64a: 4705 li a4,1 - 64c: 00f717b3 sll a5,a4,a5 - 650: c03e sw a5,0(sp) - uint32_t input_byte = input[byte + line * bytes_to_draw]; - 652: 47d2 lw a5,20(sp) - for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { - 654: 4681 li a3,0 - uint32_t input_byte = input[byte + line * bytes_to_draw]; - 656: 979e add a5,a5,t2 - 658: cc3e sw a5,24(sp) - buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); - 65a: 0035d793 srli a5,a1,0x3 - 65e: 079e slli a5,a5,0x7 - 660: ce3e sw a5,28(sp) - uint32_t input_byte = input[byte + line * bytes_to_draw]; - 662: 47e2 lw a5,24(sp) - x_absolute = x + 8 * byte + pixel; - 664: 00369293 slli t0,a3,0x3 - for (pixel = 0; pixel < 8; pixel++) { - 668: 4701 li a4,0 - uint32_t input_byte = input[byte + line * bytes_to_draw]; - 66a: 97b6 add a5,a5,a3 - 66c: 0007c783 lbu a5,0(a5) - 670: c23e sw a5,4(sp) - x_absolute = x + 8 * byte + pixel; - 672: 47c2 lw a5,16(sp) - 674: 92be add t0,t0,a5 - buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); - 676: 47f2 lw a5,28(sp) - 678: 005784b3 add s1,a5,t0 - if (x_absolute >= SSD1306_W) { - 67c: 00e287b3 add a5,t0,a4 - 680: 07f00613 li a2,127 - 684: 04f66463 bltu a2,a5,6cc - uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) - 688: 4512 lw a0,4(sp) - 68a: 08000793 li a5,128 - 68e: 40e7d7b3 sra a5,a5,a4 - 692: 8fe9 and a5,a5,a0 - buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); - 694: 00e48633 add a2,s1,a4 - ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); - 698: c4418513 addi a0,gp,-956 # 20000040 - 69c: 9532 add a0,a0,a2 - 69e: 00014303 lbu t1,0(sp) - uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) - 6a2: c43e sw a5,8(sp) - ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); - 6a4: 00054783 lbu a5,0(a0) - 6a8: fff34613 not a2,t1 - for (pixel = 0; pixel < 8; pixel++) { - 6ac: 0705 addi a4,a4,1 - ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); - 6ae: 8e7d and a2,a2,a5 - 6b0: 47a2 lw a5,8(sp) - 6b2: 00f037b3 snez a5,a5 - 6b6: 40f007b3 neg a5,a5 - 6ba: 00f37333 and t1,t1,a5 - 6be: 00666633 or a2,a2,t1 - 6c2: 00c50023 sb a2,0(a0) - for (pixel = 0; pixel < 8; pixel++) { - 6c6: 47a1 li a5,8 - 6c8: faf71ae3 bne a4,a5,67c - for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { - 6cc: 0685 addi a3,a3,1 # 40001 - 6ce: f8d41ae3 bne s0,a3,662 - for (uint32_t line = 0; line < height; line++) { - 6d2: 47b2 lw a5,12(sp) - 6d4: 0585 addi a1,a1,1 - 6d6: 93a2 add t2,t2,s0 - 6d8: 00b78663 beq a5,a1,6e4 - if (y_absolute >= SSD1306_H) { - 6dc: 04000793 li a5,64 - 6e0: f6f593e3 bne a1,a5,646 -} - 6e4: 5412 lw s0,36(sp) - 6e6: 5482 lw s1,32(sp) - 6e8: 02810113 addi sp,sp,40 - 6ec: 8082 ret - -000006ee : +00000566 : void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) - 6ee: 1141 addi sp,sp,-16 + 566: 87b2 mv a5,a2 + 568: 1131 addi sp,sp,-20 if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; - 6f0: fff60793 addi a5,a2,-1 + 56a: fff78713 addi a4,a5,-1 void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) - 6f4: c606 sw ra,12(sp) - 6f6: c422 sw s0,8(sp) - 6f8: c226 sw s1,4(sp) + 56e: 8636 mv a2,a3 + 570: c806 sw ra,16(sp) + 572: c622 sw s0,12(sp) + 574: c426 sw s1,8(sp) if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; - 6fa: 97aa add a5,a5,a0 - 6fc: 07f00713 li a4,127 - 700: 00f77563 bgeu a4,a5,70a - 704: 08000613 li a2,128 - 708: 8e09 sub a2,a2,a0 - 70a: 00c50433 add s0,a0,a2 + 576: 972a add a4,a4,a0 + 578: 07f00693 li a3,127 + 57c: 00e6f563 bgeu a3,a4,586 + 580: 08000793 li a5,128 + 584: 8f89 sub a5,a5,a0 + 586: 00f50433 add s0,a0,a5 while (w--) - 70e: 00851763 bne a0,s0,71c + 58a: 00851763 bne a0,s0,598 } - 712: 40b2 lw ra,12(sp) - 714: 4422 lw s0,8(sp) - 716: 4492 lw s1,4(sp) - 718: 0141 addi sp,sp,16 - 71a: 8082 ret + 58e: 40c2 lw ra,16(sp) + 590: 4432 lw s0,12(sp) + 592: 44a2 lw s1,8(sp) + 594: 0151 addi sp,sp,20 + 596: 8082 ret ssd1306_drawPixel(x++, y, color); - 71c: 4605 li a2,1 - 71e: 00150493 addi s1,a0,1 - 722: c02e sw a1,0(sp) - 724: 3191 jal 368 - 726: 4582 lw a1,0(sp) - 728: 8526 mv a0,s1 - 72a: b7d5 j 70e + 598: 00150493 addi s1,a0,1 + 59c: c232 sw a2,4(sp) + 59e: c02e sw a1,0(sp) + 5a0: 36d5 jal 184 + 5a2: 4612 lw a2,4(sp) + 5a4: 4582 lw a1,0(sp) + 5a6: 8526 mv a0,s1 + 5a8: b7cd j 58a -0000072c : -void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) - 72c: 1131 addi sp,sp,-20 - 72e: c426 sw s1,8(sp) - 730: 84b2 mv s1,a2 - ssd1306_drawFastVLine(x, y, h, color); - 732: 8636 mv a2,a3 -void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) - 734: c806 sw ra,16(sp) - 736: c622 sw s0,12(sp) - 738: c236 sw a3,4(sp) - 73a: 842a mv s0,a0 - 73c: c02e sw a1,0(sp) - ssd1306_drawFastVLine(x, y, h, color); - 73e: 3575 jal 5ea - ssd1306_drawFastVLine(x+w-1, y, h, color); - 740: 4612 lw a2,4(sp) - 742: 4582 lw a1,0(sp) - 744: fff48513 addi a0,s1,-1 - 748: 9522 add a0,a0,s0 - 74a: 3545 jal 5ea - 74c: 4582 lw a1,0(sp) - 74e: 8626 mv a2,s1 - 750: 8522 mv a0,s0 - 752: 3f71 jal 6ee - ssd1306_drawFastHLine(x, y+h-1, w, color); - 754: 4782 lw a5,0(sp) - 756: 8522 mv a0,s0 +000005aa : +void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) + 5aa: fd810113 addi sp,sp,-40 + steep = (gfx_abs(y1 - y0) > gfx_abs(x1 - x0)); + 5ae: 40b68333 sub t1,a3,a1 +void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) + 5b2: d022 sw s0,32(sp) + 5b4: 8436 mv s0,a3 + return (x<0) ? -x : x; + 5b6: 41f35693 srai a3,t1,0x1f + 5ba: 0066c333 xor t1,a3,t1 + steep = (gfx_abs(y1 - y0) > gfx_abs(x1 - x0)); + 5be: 40a602b3 sub t0,a2,a0 + return (x<0) ? -x : x; + 5c2: 40d30333 sub t1,t1,a3 + 5c6: 41f2d693 srai a3,t0,0x1f + 5ca: 0056c2b3 xor t0,a3,t0 +void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) + 5ce: ce26 sw s1,28(sp) + 5d0: d206 sw ra,36(sp) + return (x<0) ? -x : x; + 5d2: 40d282b3 sub t0,t0,a3 +void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) + 5d6: 84ae mv s1,a1 + 5d8: 87b2 mv a5,a2 + if(steep) + 5da: 0062c763 blt t0,t1,5e8 + 5de: 86a2 mv a3,s0 + 5e0: 84aa mv s1,a0 + 5e2: 8432 mv s0,a2 + 5e4: 87b6 mv a5,a3 + 5e6: 852e mv a0,a1 + if(x0 > x1) + 5e8: 00944863 blt s0,s1,5f8 + 5ec: 86be mv a3,a5 + 5ee: 87aa mv a5,a0 + 5f0: 8536 mv a0,a3 + 5f2: 86a2 mv a3,s0 + 5f4: 8426 mv s0,s1 + 5f6: 84b6 mv s1,a3 + deltay = gfx_abs(y1 - y0); + 5f8: 40f503b3 sub t2,a0,a5 + return (x<0) ? -x : x; + 5fc: 41f3d693 srai a3,t2,0x1f + deltax = x1 - x0; + 600: 40848733 sub a4,s1,s0 + return (x<0) ? -x : x; + 604: 0076c3b3 xor t2,a3,t2 + 608: 40d383b3 sub t2,t2,a3 + error = deltax/2; + 60c: 01f75693 srli a3,a4,0x1f + 610: 96ba add a3,a3,a4 + deltax = x1 - x0; + 612: c23a sw a4,4(sp) + ystep = -1; + 614: 577d li a4,-1 + 616: c03a sw a4,0(sp) + error = deltax/2; + 618: 8685 srai a3,a3,0x1 + if(y0 < y1) + 61a: 00a7d463 bge a5,a0,622 + ystep = 1; + 61e: 4705 li a4,1 + 620: c03a sw a4,0(sp) + for(x=x0;x<=x1;x++) + 622: 0084d863 bge s1,s0,632 } - 758: 4432 lw s0,12(sp) - ssd1306_drawFastHLine(x, y+h-1, w, color); - 75a: fff78593 addi a1,a5,-1 - 75e: 4792 lw a5,4(sp) -} - 760: 40c2 lw ra,16(sp) - 762: 8626 mv a2,s1 - 764: 44a2 lw s1,8(sp) - 766: 95be add a1,a1,a5 - 768: 0151 addi sp,sp,20 - 76a: b751 j 6ee + 626: 5092 lw ra,36(sp) + 628: 5402 lw s0,32(sp) + 62a: 44f2 lw s1,28(sp) + 62c: 02810113 addi sp,sp,40 + 630: 8082 ret + 632: cc36 sw a3,24(sp) + 634: ca1e sw t2,20(sp) + 636: c816 sw t0,16(sp) + 638: c61a sw t1,12(sp) + ssd1306_drawPixel(y, x, color); + 63a: 4601 li a2,0 + if(steep) + 63c: 0262d563 bge t0,t1,666 + ssd1306_drawPixel(y, x, color); + 640: 853e mv a0,a5 + 642: 85a2 mv a1,s0 + 644: c43e sw a5,8(sp) + 646: 3e3d jal 184 + 648: 47a2 lw a5,8(sp) + 64a: 4332 lw t1,12(sp) + 64c: 42c2 lw t0,16(sp) + 64e: 43d2 lw t2,20(sp) + 650: 46e2 lw a3,24(sp) + error = error - deltay; + 652: 407686b3 sub a3,a3,t2 + if(error < 0) + 656: 0006d663 bgez a3,662 + y = y + ystep; + 65a: 4702 lw a4,0(sp) + 65c: 97ba add a5,a5,a4 + error = error + deltax; + 65e: 4712 lw a4,4(sp) + 660: 96ba add a3,a3,a4 + for(x=x0;x<=x1;x++) + 662: 0405 addi s0,s0,1 + 664: bf7d j 622 + ssd1306_drawPixel(x, y, color); + 666: 85be mv a1,a5 + 668: 8522 mv a0,s0 + 66a: c43e sw a5,8(sp) + 66c: 3e21 jal 184 + 66e: 46e2 lw a3,24(sp) + 670: 43d2 lw t2,20(sp) + 672: 42c2 lw t0,16(sp) + 674: 4332 lw t1,12(sp) + 676: 47a2 lw a5,8(sp) + 678: bfe9 j 652 -0000076c : -{ - 76c: 1121 addi sp,sp,-24 - 76e: c822 sw s0,16(sp) - 770: c626 sw s1,12(sp) - 772: 842a mv s0,a0 - 774: 84b2 mv s1,a2 - ssd1306_drawstr(0, y, label, 1); - 776: 4685 li a3,1 - 778: 862e mv a2,a1 - 77a: 85aa mv a1,a0 - 77c: 4501 li a0,0 -{ - 77e: ca06 sw ra,20(sp) - ssd1306_drawstr(0, y, label, 1); - 780: 3115 jal 3a4 - ssd1306_drawRect(bx, y, bw, 7, 1); - 782: 03000513 li a0,48 - 786: 469d li a3,7 - 788: 04c00613 li a2,76 - 78c: 85a2 mv a1,s0 - 78e: 3f79 jal 72c - int fill = (val * (bw - 2)) / 100; - 790: 00349513 slli a0,s1,0x3 - 794: 9526 add a0,a0,s1 - 796: 050a slli a0,a0,0x2 - 798: 9526 add a0,a0,s1 - 79a: 0506 slli a0,a0,0x1 - if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); - 79c: 06300793 li a5,99 - 7a0: 02a7df63 bge a5,a0,7de - 7a4: 00140793 addi a5,s0,1 - int fill = (val * (bw - 2)) / 100; - 7a8: 06400593 li a1,100 - if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); - 7ac: c03e sw a5,0(sp) - int fill = (val * (bw - 2)) / 100; - 7ae: 38cd jal a0 <__divsi3> - 7b0: 4782 lw a5,0(sp) - 7b2: 872a mv a4,a0 - 7b4: 0419 addi s0,s0,6 - 7b6: 03170693 addi a3,a4,49 - m=x; - 7ba: 03100493 li s1,49 - 7be: 8526 mv a0,s1 - ssd1306_drawPixel(m++, n, color); - 7c0: 85be mv a1,a5 - 7c2: 4605 li a2,1 - 7c4: c436 sw a3,8(sp) - 7c6: c23a sw a4,4(sp) - 7c8: c03e sw a5,0(sp) - 7ca: 3e79 jal 368 - while(w--) - 7cc: 46a2 lw a3,8(sp) - ssd1306_drawPixel(m++, n, color); - 7ce: 0485 addi s1,s1,1 - while(w--) - 7d0: 4782 lw a5,0(sp) - 7d2: 4712 lw a4,4(sp) - 7d4: fed495e3 bne s1,a3,7be - n++; - 7d8: 0785 addi a5,a5,1 +0000067a : + if((x >= SSD1306_W) || (y >= SSD1306_H)) return; + 67a: 07f00793 li a5,127 + 67e: 02a7cf63 blt a5,a0,6bc +void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) + 682: 1141 addi sp,sp,-16 + 684: c422 sw s0,8(sp) + 686: c606 sw ra,12(sp) + 688: c226 sw s1,4(sp) + if((y+h-1) >= SSD1306_H) h = SSD1306_H-y; + 68a: 00c587b3 add a5,a1,a2 + 68e: 04000713 li a4,64 + 692: 842e mv s0,a1 + 694: 00f75463 bge a4,a5,69c + 698: 40b70633 sub a2,a4,a1 + 69c: 008604b3 add s1,a2,s0 while(h--) - 7da: fc879ee3 bne a5,s0,7b6 + 6a0: 00941763 bne s0,s1,6ae } - 7de: 40d2 lw ra,20(sp) - 7e0: 4442 lw s0,16(sp) - 7e2: 44b2 lw s1,12(sp) - 7e4: 0161 addi sp,sp,24 - 7e6: 8082 ret + 6a4: 40b2 lw ra,12(sp) + 6a6: 4422 lw s0,8(sp) + 6a8: 4492 lw s1,4(sp) + 6aa: 0141 addi sp,sp,16 + 6ac: 8082 ret + ssd1306_drawPixel(x, y++, color); + 6ae: 85a2 mv a1,s0 + 6b0: 4605 li a2,1 + 6b2: c02a sw a0,0(sp) + 6b4: 3cc1 jal 184 + 6b6: 4502 lw a0,0(sp) + 6b8: 0405 addi s0,s0,1 + 6ba: b7dd j 6a0 + 6bc: 8082 ret -000007e8 : - uint32_t dmd0 = *dmdata0; - 7e8: e00007b7 lui a5,0xe0000 - 7ec: 0f47a783 lw a5,244(a5) # e00000f4 <_eusrstack+0xbffff8f4> +000006be : +void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) + 6be: 1131 addi sp,sp,-20 + 6c0: c426 sw s1,8(sp) + 6c2: 84b2 mv s1,a2 + ssd1306_drawFastVLine(x, y, h, color); + 6c4: 8636 mv a2,a3 +void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) + 6c6: c806 sw ra,16(sp) + 6c8: c236 sw a3,4(sp) + 6ca: c622 sw s0,12(sp) + 6cc: c02e sw a1,0(sp) + 6ce: 842a mv s0,a0 + ssd1306_drawFastVLine(x, y, h, color); + 6d0: 376d jal 67a + ssd1306_drawFastVLine(x+w-1, y, h, color); + 6d2: 4612 lw a2,4(sp) + 6d4: 4582 lw a1,0(sp) + 6d6: fff48513 addi a0,s1,-1 + 6da: 9522 add a0,a0,s0 + 6dc: 3f79 jal 67a + 6de: 4582 lw a1,0(sp) + 6e0: 4685 li a3,1 + 6e2: 8626 mv a2,s1 + 6e4: 8522 mv a0,s0 + 6e6: 3541 jal 566 + ssd1306_drawFastHLine(x, y+h-1, w, color); + 6e8: 4782 lw a5,0(sp) + 6ea: fff78593 addi a1,a5,-1 + 6ee: 4792 lw a5,4(sp) + 6f0: 95be add a1,a1,a5 + if((x >= SSD1306_W) || (y >= SSD1306_H)) return; + 6f2: 03f00793 li a5,63 + 6f6: 00b7ea63 bltu a5,a1,70a + 6fa: 8522 mv a0,s0 } - 7f0: 8082 ret + 6fc: 4432 lw s0,12(sp) + 6fe: 40c2 lw ra,16(sp) + 700: 8626 mv a2,s1 + 702: 44a2 lw s1,8(sp) + 704: 4685 li a3,1 + 706: 0151 addi sp,sp,20 + 708: bdb9 j 566 + 70a: 40c2 lw ra,16(sp) + 70c: 4432 lw s0,12(sp) + 70e: 44a2 lw s1,8(sp) + 710: 0151 addi sp,sp,20 + 712: 8082 ret -000007f2 <_write.constprop.0>: - if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; - 7f2: e00007b7 lui a5,0xe0000 - 7f6: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> - 7fa: 4398 lw a4,0(a5) -WEAK int _write(int fd, const char *buf, int size) - 7fc: 1121 addi sp,sp,-24 - 7fe: ca06 sw ra,20(sp) - 800: c822 sw s0,16(sp) - 802: c626 sw s1,12(sp) - if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; - 804: 0c077713 andi a4,a4,192 - 808: 0c000693 li a3,192 - 80c: 00d70b63 beq a4,a3,822 <_write.constprop.0+0x30> - char buffer[4] = { 0 }; - 810: c402 sw zero,8(sp) - 812: 842e mv s0,a1 - if( size == 0 ) - 814: eddd bnez a1,8d2 <_write.constprop.0+0xe0> - lastdmd = (*DMDATA0); - 816: 439c lw a5,0(a5) - if( lastdmd && !(lastdmd&0x80) ) internal_handle_input( (uint32_t*)DMDATA0 ); - 818: c789 beqz a5,822 <_write.constprop.0+0x30> - 81a: 0807f793 andi a5,a5,128 - 81e: e391 bnez a5,822 <_write.constprop.0+0x30> - 820: 37e1 jal 7e8 - if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; - 822: 4401 li s0,0 -} - 824: 40d2 lw ra,20(sp) - 826: 8522 mv a0,s0 - 828: 4442 lw s0,16(sp) - 82a: 44b2 lw s1,12(sp) - 82c: 0161 addi sp,sp,24 - 82e: 8082 ret - int tosend = size - place; - 830: 409407b3 sub a5,s0,s1 - if( tosend > 7 ) tosend = 7; - 834: 471d li a4,7 - 836: 00f75363 bge a4,a5,83c <_write.constprop.0+0x4a> - 83a: 87ba mv a5,a4 - 83c: 001006b7 lui a3,0x100 - while( ( lastdmd = (*DMDATA0) ) & 0x80 ) - 840: e0000737 lui a4,0xe0000 - if( tosend > 7 ) tosend = 7; - 844: 0685 addi a3,a3,1 # 100001 - while( ( lastdmd = (*DMDATA0) ) & 0x80 ) - 846: 0f470713 addi a4,a4,244 # e00000f4 <_eusrstack+0xbffff8f4> - 84a: 4310 lw a2,0(a4) - 84c: 08067593 andi a1,a2,128 - 850: e1a5 bnez a1,8b0 <_write.constprop.0+0xbe> - if( lastdmd ) internal_handle_input( (uint32_t*)DMDATA0 ); - 852: c611 beqz a2,85e <_write.constprop.0+0x6c> - 854: c22a sw a0,4(sp) - 856: c03e sw a5,0(sp) - 858: 3f41 jal 7e8 - 85a: 4512 lw a0,4(sp) - 85c: 4782 lw a5,0(sp) - 85e: 0034 addi a3,sp,8 - if( tosend > 7 ) tosend = 7; - 860: 470d li a4,3 - 862: 85b6 mv a1,a3 - while( t < tosend ) - 864: 04f74d63 blt a4,a5,8be <_write.constprop.0+0xcc> - *DMDATA1 = *(uint32_t*)&(buffer[0]); - 868: 46a2 lw a3,8(sp) - 86a: e0000737 lui a4,0xe0000 - while( t < tosend && t < 3 ) - 86e: 460d li a2,3 - *DMDATA1 = *(uint32_t*)&(buffer[0]); - 870: 0ed72c23 sw a3,248(a4) # e00000f8 <_eusrstack+0xbffff8f8> - 874: 009506b3 add a3,a0,s1 - t = 0; - 878: 4701 li a4,0 - buffer[t+1] = buf[t+place]; - 87a: 0006c283 lbu t0,0(a3) - 87e: 0705 addi a4,a4,1 - 880: 00e58333 add t1,a1,a4 - 884: 00530023 sb t0,0(t1) - while( t < tosend && t < 3 ) - 888: 00e78563 beq a5,a4,892 <_write.constprop.0+0xa0> - 88c: 0685 addi a3,a3,1 - 88e: fec716e3 bne a4,a2,87a <_write.constprop.0+0x88> - buffer[0] = 0x80 | (tosend + 4); - 892: 00478713 addi a4,a5,4 - 896: f8076713 ori a4,a4,-128 - 89a: 00e10423 sb a4,8(sp) - *DMDATA0 = *(uint32_t*)&(buffer[0]); - 89e: 46a2 lw a3,8(sp) - 8a0: e0000737 lui a4,0xe0000 - place += tosend; - 8a4: 94be add s1,s1,a5 - *DMDATA0 = *(uint32_t*)&(buffer[0]); - 8a6: 0ed72a23 sw a3,244(a4) # e00000f4 <_eusrstack+0xbffff8f4> - while( place < size ) - 8aa: f884c3e3 blt s1,s0,830 <_write.constprop.0+0x3e> - 8ae: bf9d j 824 <_write.constprop.0+0x32> - if( timeout-- == 0 ) - 8b0: 16fd addi a3,a3,-1 - 8b2: fec1 bnez a3,84a <_write.constprop.0+0x58> - *DMDATA0 |= 0xc0; - 8b4: 431c lw a5,0(a4) - 8b6: 0c07e793 ori a5,a5,192 - 8ba: c31c sw a5,0(a4) - return 0; - 8bc: b79d j 822 <_write.constprop.0+0x30> - buffer[t-3] = buf[t+place]; - 8be: 00e48633 add a2,s1,a4 - 8c2: 962a add a2,a2,a0 - 8c4: 00064603 lbu a2,0(a2) - t++; - 8c8: 0705 addi a4,a4,1 - 8ca: 0685 addi a3,a3,1 - buffer[t-3] = buf[t+place]; - 8cc: fec68fa3 sb a2,-1(a3) - 8d0: bf51 j 864 <_write.constprop.0+0x72> - 8d2: 4481 li s1,0 - 8d4: bfd9 j 8aa <_write.constprop.0+0xb8> - -000008d6 <__puts_uart>: +00000714 : { - 8d6: 1161 addi sp,sp,-8 - 8d8: c022 sw s0,0(sp) - 8da: c206 sw ra,4(sp) - 8dc: 842e mv s0,a1 - _write( 0, s, len ); - 8de: 3f11 jal 7f2 <_write.constprop.0> + 714: 1151 addi sp,sp,-12 + 716: c222 sw s0,4(sp) + 718: c026 sw s1,0(sp) + 71a: 842a mv s0,a0 + 71c: 84b2 mv s1,a2 + ssd1306_drawstr(0, y, label, 1); + 71e: 4685 li a3,1 + 720: 862e mv a2,a1 + 722: 85aa mv a1,a0 + 724: 4501 li a0,0 +{ + 726: c406 sw ra,8(sp) + ssd1306_drawstr(0, y, label, 1); + 728: 3cc5 jal 218 + ssd1306_drawRect(bx, y, bw, 7, 1); + 72a: 03000513 li a0,48 + 72e: 469d li a3,7 + 730: 04c00613 li a2,76 + 734: 85a2 mv a1,s0 + 736: 3761 jal 6be + int fill = (val * (bw - 2)) / 100; + 738: 00349513 slli a0,s1,0x3 + 73c: 9526 add a0,a0,s1 + 73e: 050a slli a0,a0,0x2 + 740: 9526 add a0,a0,s1 + 742: 0506 slli a0,a0,0x1 + if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); + 744: 06300793 li a5,99 + 748: 02a7d263 bge a5,a0,76c + int fill = (val * (bw - 2)) / 100; + 74c: 06400593 li a1,100 + 750: 3a81 jal a0 <__divsi3> + if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); + 752: 4705 li a4,1 + 754: 00e405b3 add a1,s0,a4 } - 8e0: 4092 lw ra,4(sp) - 8e2: 8522 mv a0,s0 - 8e4: 4402 lw s0,0(sp) - 8e6: 0121 addi sp,sp,8 - 8e8: 8082 ret - -000008ea : - asm volatile( "\n\ - 8ea: 20000197 auipc gp,0x20000 - 8ee: b1218193 addi gp,gp,-1262 # 200003fc <__global_pointer$> - 8f2: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack> - 8f6: 6509 lui a0,0x2 - 8f8: 88050513 addi a0,a0,-1920 # 1880 - 8fc: 30051073 csrw mstatus,a0 - 900: fffff697 auipc a3,0xfffff - 904: 70068693 addi a3,a3,1792 # 0 - 908: 0036e693 ori a3,a3,3 - 90c: 30569073 csrw mtvec,a3 -asm volatile( - 910: c1c18513 addi a0,gp,-996 # 20000018 - 914: 04418593 addi a1,gp,68 # 20000440 <_ebss> - 918: 4601 li a2,0 - 91a: 00b55663 bge a0,a1,926 - 91e: c110 sw a2,0(a0) - 920: 0511 addi a0,a0,4 - 922: feb54ee3 blt a0,a1,91e - 926: 00002517 auipc a0,0x2 - 92a: f0e50513 addi a0,a0,-242 # 2834 <_data_lma> - 92e: c0418593 addi a1,gp,-1020 # 20000000 - 932: c1c18613 addi a2,gp,-996 # 20000018 - 936: 00c58863 beq a1,a2,946 - 93a: 4114 lw a3,0(a0) - 93c: c194 sw a3,0(a1) - 93e: 0511 addi a0,a0,4 - 940: 0591 addi a1,a1,4 - 942: fec59ae3 bne a1,a2,936 - SysTick->CTLR = 1; - 946: e000f7b7 lui a5,0xe000f - 94a: 4705 li a4,1 - 94c: c398 sw a4,0(a5) -asm volatile( - 94e: 6785 lui a5,0x1 - 950: e6078793 addi a5,a5,-416 # e60
- 954: 34179073 csrw mepc,a5 - 958: 30200073 mret - -0000095c : - -// Return the Machine Exception Program Register (MEPC) -static inline uint32_t __get_MEPC(void) -{ - uint32_t result; - __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mepc" : "=r"(result)); - 95c: 34102573 csrr a0,mepc - PrintHex( __get_MEPC() ); // "addr2line -e debugprintfdemo.elf 0x000007e6" ---> debugprintfdemo.c:45 - 960: 889ff0ef jal 1e8 - __ASM volatile( ADD_ARCH_ZICSR "csrr %0, mstatus": "=r"(result) ); - 964: 30002573 csrr a0,mstatus - PrintHex( __get_MSTATUS() ); - 968: 881ff0ef jal 1e8 - -// Return the Machine Trap Value Register (MTVAL) -static inline uint32_t __get_MTVAL(void) -{ - uint32_t result; - __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mtval" : "=r" (result) ); - 96c: 34302573 csrr a0,mtval - PrintHex( __get_MTVAL() ); - 970: 879ff0ef jal 1e8 - __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mcause": "=r"(result)); - 974: 34202573 csrr a0,mcause - PrintHex( __get_MCAUSE() ); - 978: 871ff0ef jal 1e8 - while( (*DMDATA0) & 0x80 ); - 97c: e00007b7 lui a5,0xe0000 - 980: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> - 984: 4398 lw a4,0(a5) - 986: 08077713 andi a4,a4,128 - 98a: ff6d bnez a4,984 - *DMDATA0 = 0x0a85; - 98c: 6705 lui a4,0x1 - 98e: a8570713 addi a4,a4,-1403 # a85 - 992: c398 sw a4,0(a5) - while( (*DMDATA0) & 0x80 ); - 994: e00007b7 lui a5,0xe0000 - 998: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> - 99c: 4398 lw a4,0(a5) - 99e: 08077713 andi a4,a4,128 - 9a2: ff6d bnez a4,99c - *DMDATA0 = 0xaaaaaa83; - 9a4: aaaab737 lui a4,0xaaaab - 9a8: a8370713 addi a4,a4,-1405 # aaaaaa83 <_eusrstack+0x8aaaa283> - 9ac: c398 sw a4,0(a5) - asm volatile( "1: j 1b" ); - 9ae: a001 j 9ae - -000009b0 : - RCC->INTR |= RCC_CSSC; // clear the clock security int flag - 9b0: 40021737 lui a4,0x40021 - 9b4: 471c lw a5,8(a4) - 9b6: 008006b7 lui a3,0x800 - 9ba: 8fd5 or a5,a5,a3 - 9bc: c71c sw a5,8(a4) - -000009be : - for (; *s; s++); - 9be: 87aa mv a5,a0 - 9c0: 0007c703 lbu a4,0(a5) - 9c4: e701 bnez a4,9cc + 758: 4412 lw s0,4(sp) + 75a: 40a2 lw ra,8(sp) + 75c: 4482 lw s1,0(sp) + if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); + 75e: 0ff57613 zext.b a2,a0 + 762: 4695 li a3,5 + 764: 03100513 li a0,49 } - 9c6: 40a78533 sub a0,a5,a0 - 9ca: 8082 ret - for (; *s; s++); - 9cc: 0785 addi a5,a5,1 - 9ce: bfcd j 9c0 - -000009d0 : -{ - 9d0: fa410113 addi sp,sp,-92 - 9d4: caa2 sw s0,84(sp) - 9d6: c8a6 sw s1,80(sp) - 9d8: cc86 sw ra,88(sp) - 9da: c02a sw a0,0(sp) - 9dc: c22e sw a1,4(sp) - 9de: 8432 mv s0,a2 - 9e0: 84b6 mv s1,a3 - if(puts == (void*)0) { - 9e2: e509 bnez a0,9ec - puts = _puts; buf = (void*)0; - 9e4: 1a800793 li a5,424 - 9e8: c202 sw zero,4(sp) - 9ea: c03e sw a5,0(sp) - int n = 0; - 9ec: ca02 sw zero,20(sp) - while ((ch=*(fmt++))) { - 9ee: 00044783 lbu a5,0(s0) - 9f2: 00140713 addi a4,s0,1 - 9f6: 00f10fa3 sb a5,31(sp) - 9fa: eb81 bnez a5,a0a + 768: 0131 addi sp,sp,12 + if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); + 76a: bc99 j 1c0 } - 9fc: 40e6 lw ra,88(sp) - 9fe: 4456 lw s0,84(sp) - a00: 4552 lw a0,20(sp) - a02: 44c6 lw s1,80(sp) - a04: 05c10113 addi sp,sp,92 - a08: 8082 ret - a0a: c63a sw a4,12(sp) - if (ch!='%') { - a0c: 02500693 li a3,37 - a10: 02d78063 beq a5,a3,a30 - len = puts(&ch, len, buf); - a14: 4612 lw a2,4(sp) - a16: 4782 lw a5,0(sp) - a18: 4585 li a1,1 - a1a: 01f10513 addi a0,sp,31 - a1e: 9782 jalr a5 - while ((ch=*(fmt++))) { - a20: 4732 lw a4,12(sp) - a22: c426 sw s1,8(sp) - a24: 843a mv s0,a4 - n = n + len; - a26: 47d2 lw a5,20(sp) - a28: 44a2 lw s1,8(sp) - a2a: 97aa add a5,a5,a0 - a2c: ca3e sw a5,20(sp) - a2e: b7c1 j 9ee - ch=*(fmt++); - a30: 00144783 lbu a5,1(s0) - if (ch == '0') pad_char = '0'; - a34: 03000693 li a3,48 - ch=*(fmt++); - a38: 00240713 addi a4,s0,2 - a3c: 00f10fa3 sb a5,31(sp) - if (ch == '0') pad_char = '0'; - a40: c63e sw a5,12(sp) - a42: 08d79363 bne a5,a3,ac8 - ch=*(fmt++); - a46: 843a mv s0,a4 - a48: 4681 li a3,0 - a4a: 4701 li a4,0 - while (ch >= '0' && ch <= '9') { - a4c: 45a5 li a1,9 - a4e: a819 j a64 - pad_to = pad_to * 10 + (ch - '0'); - a50: 00271793 slli a5,a4,0x2 - a54: 97ba add a5,a5,a4 - a56: 0786 slli a5,a5,0x1 - ch=*(fmt++); - a58: 0405 addi s0,s0,1 - pad_to = pad_to * 10 + (ch - '0'); - a5a: 00f60733 add a4,a2,a5 - ch=*(fmt++); - a5e: fff44783 lbu a5,-1(s0) - a62: 4685 li a3,1 - while (ch >= '0' && ch <= '9') { - a64: fd078613 addi a2,a5,-48 - a68: 0ff67513 zext.b a0,a2 - a6c: fea5f2e3 bgeu a1,a0,a50 - a70: c299 beqz a3,a76 - a72: 00f10fa3 sb a5,31(sp) - if(pad_to > (signed int) sizeof(bf)) { - a76: c83a sw a4,16(sp) - a78: 46e1 li a3,24 - a7a: 00e6d363 bge a3,a4,a80 - a7e: c836 sw a3,16(sp) - if (ch == 'l') { - a80: 06c00613 li a2,108 - char l = 0; - a84: 4681 li a3,0 - if (ch == 'l') { - a86: 00c79863 bne a5,a2,a96 - ch=*(fmt++); - a8a: 00044783 lbu a5,0(s0) - l = 1; - a8e: 4685 li a3,1 - ch=*(fmt++); - a90: 0405 addi s0,s0,1 - a92: 00f10fa3 sb a5,31(sp) - switch (ch) { - a96: 01f14603 lbu a2,31(sp) - a9a: 06400793 li a5,100 - a9e: 06f60563 beq a2,a5,b08 - aa2: 02c7e763 bltu a5,a2,ad0 - aa6: 05800793 li a5,88 - aaa: 0af60263 beq a2,a5,b4e - aae: 06300793 li a5,99 - ab2: 0cf60063 beq a2,a5,b72 - ab6: d239 beqz a2,9fc - len = puts(&ch, len, buf); - ab8: 4612 lw a2,4(sp) - aba: 4782 lw a5,0(sp) - abc: 4585 li a1,1 - abe: 01f10513 addi a0,sp,31 - ac2: 9782 jalr a5 - break; - ac4: c426 sw s1,8(sp) - ac6: b785 j a26 - char pad_char = ' '; - ac8: 02000693 li a3,32 - acc: c636 sw a3,12(sp) - ace: bfa5 j a46 - switch (ch) { - ad0: 07500793 li a5,117 - ad4: 02f60a63 beq a2,a5,b08 - ad8: 07800793 li a5,120 - adc: 06f60963 beq a2,a5,b4e - ae0: 07300793 li a5,115 - ae4: fcf61ae3 bne a2,a5,ab8 - ptr = va_arg(va, char*); - ae8: 00448793 addi a5,s1,4 - aec: 4084 lw s1,0(s1) - aee: cc3a sw a4,24(sp) - af0: c43e sw a5,8(sp) - len = mini_strlen(ptr); - af2: 8526 mv a0,s1 - af4: 35e9 jal 9be - if (pad_to > 0) { - af6: 4762 lw a4,24(sp) - len = mini_strlen(ptr); - af8: 85aa mv a1,a0 - if (pad_to > 0) { - afa: 08e05963 blez a4,b8c - len = mini_pad(ptr, len, pad_char, pad_to, bf); - afe: 46c2 lw a3,16(sp) - b00: 4632 lw a2,12(sp) - b02: 1838 addi a4,sp,56 - b04: 8526 mv a0,s1 - b06: a025 j b2e - len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); - b08: 00448793 addi a5,s1,4 - b0c: c43e sw a5,8(sp) - if(l) { - b0e: ca85 beqz a3,b3e - len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); - b10: f8b60613 addi a2,a2,-117 - b14: 1018 addi a4,sp,32 - b16: 00163693 seqz a3,a2 - b1a: 4088 lw a0,0(s1) - b1c: 4601 li a2,0 - b1e: 45a9 li a1,10 - b20: f34ff0ef jal 254 - len = mini_pad(bf2, len, pad_char, pad_to, bf); - b24: 46c2 lw a3,16(sp) - b26: 4632 lw a2,12(sp) - b28: 1838 addi a4,sp,56 - b2a: 85aa mv a1,a0 - len = mini_pad(bf2, len, pad_char, pad_to, bf); - b2c: 1008 addi a0,sp,32 - b2e: df0ff0ef jal 11e - len = puts(bf, len, buf); - b32: 4612 lw a2,4(sp) - len = mini_pad(bf2, len, pad_char, pad_to, bf); - b34: 85aa mv a1,a0 - len = puts(bf, len, buf); - b36: 1828 addi a0,sp,56 - b38: 4782 lw a5,0(sp) - b3a: 9782 jalr a5 - break; - b3c: b5ed j a26 - if(ch == 'u') { - b3e: 07500793 li a5,117 - b42: 1018 addi a4,sp,32 - b44: 4685 li a3,1 - b46: fcf60ae3 beq a2,a5,b1a - if (radix > 16) - b4a: 4681 li a3,0 - b4c: b7f9 j b1a - if(l) { - b4e: 4088 lw a0,0(s1) - len = mini_itoa(va_arg(va, unsigned long), 16, (ch=='X'), 1, bf2); - b50: fa860613 addi a2,a2,-88 - len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); - b54: 00448793 addi a5,s1,4 - b58: 1018 addi a4,sp,32 - b5a: 4685 li a3,1 - b5c: 00163613 seqz a2,a2 - b60: 45c1 li a1,16 - b62: c43e sw a5,8(sp) - if (radix > 16) - b64: ef0ff0ef jal 254 - len = mini_pad(bf2, len, pad_char, pad_to, bf); - b68: 46c2 lw a3,16(sp) - b6a: 4632 lw a2,12(sp) - b6c: 85aa mv a1,a0 - b6e: 1838 addi a4,sp,56 - b70: bf75 j b2c - ch = (char)(va_arg(va, int)); - b72: 00448793 addi a5,s1,4 - b76: c43e sw a5,8(sp) - b78: 409c lw a5,0(s1) - len = mini_pad(&ch, 1, pad_char, pad_to, bf); - b7a: 46c2 lw a3,16(sp) - b7c: 4632 lw a2,12(sp) - ch = (char)(va_arg(va, int)); - b7e: 00f10fa3 sb a5,31(sp) - len = mini_pad(&ch, 1, pad_char, pad_to, bf); - b82: 1838 addi a4,sp,56 - b84: 4585 li a1,1 - b86: 01f10513 addi a0,sp,31 - b8a: b755 j b2e - len = puts(ptr, len, buf); - b8c: 4612 lw a2,4(sp) - b8e: 8526 mv a0,s1 - b90: b765 j b38 + 76c: 40a2 lw ra,8(sp) + 76e: 4412 lw s0,4(sp) + 770: 4482 lw s1,0(sp) + 772: 0131 addi sp,sp,12 + 774: 8082 ret -00000b92 : -{ - b92: 1111 addi sp,sp,-28 - b94: c632 sw a2,12(sp) - int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - b96: 862a mv a2,a0 - b98: 6505 lui a0,0x1 -{ - b9a: c42e sw a1,8(sp) - b9c: c836 sw a3,16(sp) - int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - b9e: 4581 li a1,0 - va_start( args, format ); - ba0: 0034 addi a3,sp,8 - int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - ba2: 8d650513 addi a0,a0,-1834 # 8d6 <__puts_uart> -{ - ba6: c206 sw ra,4(sp) - ba8: ca3a sw a4,20(sp) - baa: cc3e sw a5,24(sp) - va_start( args, format ); - bac: c036 sw a3,0(sp) - int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - bae: 350d jal 9d0 +00000776 : +void ssd1306_drawImage(uint32_t x, uint32_t y, const unsigned char* input, uint32_t width, uint32_t height, uint32_t color_mode) { + 776: fd810113 addi sp,sp,-40 + 77a: 00e587b3 add a5,a1,a4 + 77e: d222 sw s0,36(sp) + 780: d026 sw s1,32(sp) + 782: c82a sw a0,16(sp) + 784: ca32 sw a2,20(sp) + uint32_t bytes_to_draw = width / 8; + 786: 0036d413 srli s0,a3,0x3 + 78a: c63e sw a5,12(sp) + 78c: 4381 li t2,0 + if (y_absolute >= SSD1306_H) { + 78e: 03f00793 li a5,63 + 792: 08b7ed63 bltu a5,a1,82c + uint32_t v_mask = 1 << (y_absolute & 7); + 796: 0075f793 andi a5,a1,7 + 79a: 4705 li a4,1 + 79c: 00f717b3 sll a5,a4,a5 + 7a0: c03e sw a5,0(sp) + uint32_t input_byte = input[byte + line * bytes_to_draw]; + 7a2: 47d2 lw a5,20(sp) + for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { + 7a4: 4681 li a3,0 + uint32_t input_byte = input[byte + line * bytes_to_draw]; + 7a6: 979e add a5,a5,t2 + 7a8: cc3e sw a5,24(sp) + buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); + 7aa: 0035d793 srli a5,a1,0x3 + 7ae: 079e slli a5,a5,0x7 + 7b0: ce3e sw a5,28(sp) + uint32_t input_byte = input[byte + line * bytes_to_draw]; + 7b2: 47e2 lw a5,24(sp) + x_absolute = x + 8 * byte + pixel; + 7b4: 00369293 slli t0,a3,0x3 + for (pixel = 0; pixel < 8; pixel++) { + 7b8: 4701 li a4,0 + uint32_t input_byte = input[byte + line * bytes_to_draw]; + 7ba: 97b6 add a5,a5,a3 + 7bc: 0007c783 lbu a5,0(a5) + 7c0: c23e sw a5,4(sp) + x_absolute = x + 8 * byte + pixel; + 7c2: 47c2 lw a5,16(sp) + 7c4: 92be add t0,t0,a5 + buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); + 7c6: 47f2 lw a5,28(sp) + 7c8: 005784b3 add s1,a5,t0 + if (x_absolute >= SSD1306_W) { + 7cc: 00e287b3 add a5,t0,a4 + 7d0: 07f00613 li a2,127 + 7d4: 04f66463 bltu a2,a5,81c + uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) + 7d8: 4512 lw a0,4(sp) + 7da: 08000793 li a5,128 + 7de: 40e7d7b3 sra a5,a5,a4 + 7e2: 8fe9 and a5,a5,a0 + buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); + 7e4: 00e48633 add a2,s1,a4 + ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); + 7e8: c6818513 addi a0,gp,-920 # 20000064 + 7ec: 9532 add a0,a0,a2 + 7ee: 00014303 lbu t1,0(sp) + uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) + 7f2: c43e sw a5,8(sp) + ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); + 7f4: 00054783 lbu a5,0(a0) + 7f8: fff34613 not a2,t1 + for (pixel = 0; pixel < 8; pixel++) { + 7fc: 0705 addi a4,a4,1 + ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); + 7fe: 8e7d and a2,a2,a5 + 800: 47a2 lw a5,8(sp) + 802: 00f037b3 snez a5,a5 + 806: 40f007b3 neg a5,a5 + 80a: 00f37333 and t1,t1,a5 + 80e: 00666633 or a2,a2,t1 + 812: 00c50023 sb a2,0(a0) + for (pixel = 0; pixel < 8; pixel++) { + 816: 47a1 li a5,8 + 818: faf71ae3 bne a4,a5,7cc + for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { + 81c: 0685 addi a3,a3,1 # 40001 + 81e: f8d41ae3 bne s0,a3,7b2 + for (uint32_t line = 0; line < height; line++) { + 822: 47b2 lw a5,12(sp) + 824: 0585 addi a1,a1,1 + 826: 93a2 add t2,t2,s0 + 828: f6b793e3 bne a5,a1,78e } - bb0: 4092 lw ra,4(sp) - bb2: 0171 addi sp,sp,28 - bb4: 8082 ret + 82c: 5412 lw s0,36(sp) + 82e: 5482 lw s1,32(sp) + 830: 02810113 addi sp,sp,40 + 834: 8082 ret -00000bb6 : - * error handler - */ -uint8_t ssd1306_i2c_error(uint8_t err) -{ - // report error - printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); - bb6: 6789 lui a5,0x2 - bb8: 050a slli a0,a0,0x2 - bba: ea078793 addi a5,a5,-352 # 1ea0 - bbe: 97aa add a5,a5,a0 - bc0: 438c lw a1,0(a5) - bc2: 6509 lui a0,0x2 -uint8_t ssd1306_i2c_error(uint8_t err) - bc4: 1171 addi sp,sp,-4 - printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); - bc6: 90c50513 addi a0,a0,-1780 # 190c -uint8_t ssd1306_i2c_error(uint8_t err) - bca: c006 sw ra,0(sp) - printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); - bcc: 37d9 jal b92 - - // reset & initialize I2C - ssd1306_i2c_setup(); - - return 1; -} - bce: 4082 lw ra,0(sp) - bd0: 0111 addi sp,sp,4 - ssd1306_i2c_setup(); - bd2: f42ff06f j 314 - -00000bd6 : -} -#else -/* - * low-level packet send for blocking polled operation via i2c - */ +00000836 : uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) - bd6: 1171 addi sp,sp,-4 { int32_t timeout; // wait for not busy timeout = TIMEOUT_MAX; - bd8: 6761 lui a4,0x18 + 836: 6761 lui a4,0x18 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); - bda: 400057b7 lui a5,0x40005 + 838: 400057b7 lui a5,0x40005 + timeout = TIMEOUT_MAX; + 83c: 6a070713 addi a4,a4,1696 # 186a0 + while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); + 840: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00> + 844: 567d li a2,-1 + 846: 0187d683 lhu a3,24(a5) + 84a: 8a89 andi a3,a3,2 + 84c: c2f9 beqz a3,912 + 84e: 177d addi a4,a4,-1 + 850: fec71be3 bne a4,a2,846 uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) - bde: c006 sw ra,0(sp) - timeout = TIMEOUT_MAX; - be0: 6a070713 addi a4,a4,1696 # 186a0 - while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); - be4: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00> - be8: 567d li a2,-1 - bea: 0187d683 lhu a3,24(a5) - bee: 8a89 andi a3,a3,2 - bf0: c6e1 beqz a3,cb8 - bf2: 177d addi a4,a4,-1 - bf4: fec71be3 bne a4,a2,bea - if(timeout==-1) - return ssd1306_i2c_error(0); - bf8: 4501 li a0,0 - bfa: a821 j c12 - bfc: 67e1 lui a5,0x18 - bfe: 6a178793 addi a5,a5,1697 # 186a1 - // send data one byte at a time - while(sz--) - { - // wait for TX Empty - timeout = TIMEOUT_MAX; - while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); - c02: 01475683 lhu a3,20(a4) - c06: 0806f693 andi a3,a3,128 - c0a: e699 bnez a3,c18 - c0c: 17fd addi a5,a5,-1 - c0e: fbf5 bnez a5,c02 - if(timeout==-1) - return ssd1306_i2c_error(3); - c10: 450d li a0,3 - return ssd1306_i2c_error(1); - c12: 3755 jal bb6 - return ssd1306_i2c_error(0); - c14: 4505 li a0,1 - c16: a889 j c68 - - // send command - I2C1->DATAR = *data++; - c18: 00054783 lbu a5,0(a0) - c1c: 0505 addi a0,a0,1 - c1e: 00f71823 sh a5,16(a4) - while(sz--) - c22: fca59de3 bne a1,a0,bfc - } - - // wait for tx complete - timeout = TIMEOUT_MAX; - c26: 66e1 lui a3,0x18 - uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c28: 40005737 lui a4,0x40005 - while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); - c2c: 00070637 lui a2,0x70 - timeout = TIMEOUT_MAX; - c30: 6a068693 addi a3,a3,1696 # 186a0 - uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c34: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> - while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); - c38: 08460613 addi a2,a2,132 # 70084 - c3c: 55fd li a1,-1 - uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c3e: 01475503 lhu a0,20(a4) - c42: 01875783 lhu a5,24(a4) - c46: 07c2 slli a5,a5,0x10 - c48: 8fc9 or a5,a5,a0 - while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); - c4a: 8ff1 and a5,a5,a2 - c4c: 00c78763 beq a5,a2,c5a - c50: 16fd addi a3,a3,-1 - c52: feb696e3 bne a3,a1,c3e - if(timeout==-1) - return ssd1306_i2c_error(4); - c56: 4511 li a0,4 - c58: bf6d j c12 - + 854: 1171 addi sp,sp,-4 + 856: c006 sw ra,0(sp) + ssd1306_i2c_setup(); + 858: 8d9ff0ef jal 130 // set STOP condition I2C1->CTLR1 |= I2C_CTLR1_STOP; - c5a: 00075783 lhu a5,0(a4) // we're happy return 0; - c5e: 4501 li a0,0 - I2C1->CTLR1 |= I2C_CTLR1_STOP; - c60: 2007e793 ori a5,a5,512 - c64: 00f71023 sh a5,0(a4) } - c68: 4082 lw ra,0(sp) - c6a: 0111 addi sp,sp,4 - c6c: 8082 ret + 85c: 4082 lw ra,0(sp) + return ssd1306_i2c_error(0); + 85e: 4505 li a0,1 +} + 860: 0111 addi sp,sp,4 + 862: 8082 ret + 864: 67e1 lui a5,0x18 + 866: 6a178793 addi a5,a5,1697 # 186a1 while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); - c6e: 40005737 lui a4,0x40005 - c72: 95aa add a1,a1,a0 - c74: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> - c78: b76d j c22 + 86a: 01475683 lhu a3,20(a4) + 86e: 0806f693 andi a3,a3,128 + 872: e681 bnez a3,87a + 874: 17fd addi a5,a5,-1 + 876: fbf5 bnez a5,86a + 878: bff1 j 854 + I2C1->DATAR = *data++; + 87a: 00054783 lbu a5,0(a0) + 87e: 0505 addi a0,a0,1 + 880: 00f71823 sh a5,16(a4) + while(sz--) + 884: feb510e3 bne a0,a1,864 + timeout = TIMEOUT_MAX; + 888: 66e1 lui a3,0x18 + uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); + 88a: 40005737 lui a4,0x40005 + while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); + 88e: 00070637 lui a2,0x70 + timeout = TIMEOUT_MAX; + 892: 6a068693 addi a3,a3,1696 # 186a0 + uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); + 896: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> + while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); + 89a: 08460613 addi a2,a2,132 # 70084 + 89e: 55fd li a1,-1 + uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); + 8a0: 01475503 lhu a0,20(a4) + 8a4: 01875783 lhu a5,24(a4) + 8a8: 07c2 slli a5,a5,0x10 + 8aa: 8fc9 or a5,a5,a0 + while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); + 8ac: 8ff1 and a5,a5,a2 + 8ae: 00c78663 beq a5,a2,8ba + 8b2: 16fd addi a3,a3,-1 + 8b4: feb696e3 bne a3,a1,8a0 + 8b8: bf71 j 854 + I2C1->CTLR1 |= I2C_CTLR1_STOP; + 8ba: 00075783 lhu a5,0(a4) + return 0; + 8be: 4501 li a0,0 + I2C1->CTLR1 |= I2C_CTLR1_STOP; + 8c0: 2007e793 ori a5,a5,512 + 8c4: 00f71023 sh a5,0(a4) +} + 8c8: 8082 ret + while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); + 8ca: 40005737 lui a4,0x40005 + 8ce: 95aa add a1,a1,a0 + 8d0: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> + 8d4: bf45 j 884 I2C1->DATAR = addr<<1; - c7a: 07800793 li a5,120 - c7e: 00f71823 sh a5,16(a4) + 8d6: 07800793 li a5,120 + 8da: 00f71823 sh a5,16(a4) timeout = TIMEOUT_MAX; - c82: 6661 lui a2,0x18 + 8de: 6661 lui a2,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c84: 400056b7 lui a3,0x40005 + 8e0: 400056b7 lui a3,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); - c88: 00070737 lui a4,0x70 + 8e4: 00070737 lui a4,0x70 timeout = TIMEOUT_MAX; - c8c: 6a060613 addi a2,a2,1696 # 186a0 + 8e8: 6a060613 addi a2,a2,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c90: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00> + 8ec: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); - c94: 08270713 addi a4,a4,130 # 70082 - c98: 537d li t1,-1 + 8f0: 08270713 addi a4,a4,130 # 70082 + 8f4: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c9a: 0146d283 lhu t0,20(a3) - c9e: 0186d783 lhu a5,24(a3) - ca2: 07c2 slli a5,a5,0x10 - ca4: 0057e7b3 or a5,a5,t0 + 8f6: 0146d283 lhu t0,20(a3) + 8fa: 0186d783 lhu a5,24(a3) + 8fe: 07c2 slli a5,a5,0x10 + 900: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); - ca8: 8ff9 and a5,a5,a4 - caa: fce782e3 beq a5,a4,c6e - cae: 167d addi a2,a2,-1 - cb0: fe6615e3 bne a2,t1,c9a - return ssd1306_i2c_error(2); - cb4: 4509 li a0,2 - cb6: bfb1 j c12 + 904: 8ff9 and a5,a5,a4 + 906: fce782e3 beq a5,a4,8ca + 90a: 167d addi a2,a2,-1 + 90c: fe6615e3 bne a2,t1,8f6 + 910: b791 j 854 I2C1->CTLR1 |= I2C_CTLR1_START; - cb8: 0007d703 lhu a4,0(a5) + 912: 0007d703 lhu a4,0(a5) timeout = TIMEOUT_MAX; - cbc: 66e1 lui a3,0x18 + 916: 66e1 lui a3,0x18 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); - cbe: 00030637 lui a2,0x30 + 918: 00030637 lui a2,0x30 I2C1->CTLR1 |= I2C_CTLR1_START; - cc2: 10076713 ori a4,a4,256 - cc6: 00e79023 sh a4,0(a5) + 91c: 10076713 ori a4,a4,256 + 920: 00e79023 sh a4,0(a5) uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - cca: 40005737 lui a4,0x40005 + 924: 40005737 lui a4,0x40005 timeout = TIMEOUT_MAX; - cce: 6a068693 addi a3,a3,1696 # 186a0 + 928: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - cd2: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> + 92c: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); - cd6: 0605 addi a2,a2,1 # 30001 - cd8: 537d li t1,-1 + 930: 0605 addi a2,a2,1 # 30001 + 932: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - cda: 01475283 lhu t0,20(a4) - cde: 01875783 lhu a5,24(a4) - ce2: 07c2 slli a5,a5,0x10 - ce4: 0057e7b3 or a5,a5,t0 + 934: 01475283 lhu t0,20(a4) + 938: 01875783 lhu a5,24(a4) + 93c: 07c2 slli a5,a5,0x10 + 93e: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); - ce8: 8ff1 and a5,a5,a2 - cea: f8c788e3 beq a5,a2,c7a - cee: 16fd addi a3,a3,-1 - cf0: fe6695e3 bne a3,t1,cda - return ssd1306_i2c_error(1); - cf4: 4505 li a0,1 - cf6: bf31 j c12 + 942: 8ff1 and a5,a5,a2 + 944: f8c789e3 beq a5,a2,8d6 + 948: 16fd addi a3,a3,-1 + 94a: fe6695e3 bne a3,t1,934 + 94e: b719 j 854 -00000cf8 : +00000950 : { - cf8: fd810113 addi sp,sp,-40 + 950: fd810113 addi sp,sp,-40 /* build command or data packets */ if(cmd) { pkt[0] = 0; pkt[1] = *data; - cfc: 00a100a3 sb a0,1(sp) + 954: 00a100a3 sb a0,1(sp) else { pkt[0] = 0x40; memcpy(&pkt[1], data, sz); } return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); - d00: 4589 li a1,2 - d02: 850a mv a0,sp - d04: d206 sw ra,36(sp) + 958: 4589 li a1,2 + 95a: 850a mv a0,sp + 95c: d206 sw ra,36(sp) pkt[0] = 0; - d06: 00010023 sb zero,0(sp) + 95e: 00010023 sb zero,0(sp) return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); - d0a: 35f1 jal bd6 + 962: 3dd1 jal 836 } - d0c: 5092 lw ra,36(sp) - d0e: 02810113 addi sp,sp,40 - d12: 8082 ret + 964: 5092 lw ra,36(sp) + 966: 02810113 addi sp,sp,40 + 96a: 8082 ret -00000d14 : -{ - d14: 1131 addi sp,sp,-20 - d16: c806 sw ra,16(sp) - d18: c622 sw s0,12(sp) - b.buffer = buffer; - d1a: c02a sw a0,0(sp) - b.pbuffer = buffer; - d1c: c22a sw a0,4(sp) - b.buffer_len = buffer_len; - d1e: c42e sw a1,8(sp) - if(buffer_len == 0) buffer = (void*) 0; - d20: c19d beqz a1,d46 - int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); - d22: 00a037b3 snez a5,a0 - d26: 40f007b3 neg a5,a5 - d2a: 842a mv s0,a0 - d2c: 00f175b3 and a1,sp,a5 - d30: 1a800513 li a0,424 - d34: 3971 jal 9d0 - if(buffer == (void*) 0) { - d36: c401 beqz s0,d3e - return b.pbuffer - b.buffer; - d38: 4512 lw a0,4(sp) - d3a: 4782 lw a5,0(sp) - d3c: 8d1d sub a0,a0,a5 -} - d3e: 40c2 lw ra,16(sp) - d40: 4432 lw s0,12(sp) - d42: 0151 addi sp,sp,20 - d44: 8082 ret - d46: 4401 li s0,0 - int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); - d48: 4581 li a1,0 - d4a: b7dd j d30 +0000096c : + asm volatile( "\n\ + 96c: 20000197 auipc gp,0x20000 + 970: a9018193 addi gp,gp,-1392 # 200003fc <__global_pointer$> + 974: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack> + 978: 6509 lui a0,0x2 + 97a: 88050513 addi a0,a0,-1920 # 1880 + 97e: 30051073 csrw mstatus,a0 + 982: fffff697 auipc a3,0xfffff + 986: 67e68693 addi a3,a3,1662 # 0 + 98a: 0036e693 ori a3,a3,3 + 98e: 30569073 csrw mtvec,a3 +asm volatile( + 992: c3018513 addi a0,gp,-976 # 2000002c + 996: 06818593 addi a1,gp,104 # 20000464 <_ebss> + 99a: 4601 li a2,0 + 99c: 00b55663 bge a0,a1,9a8 + 9a0: c110 sw a2,0(a0) + 9a2: 0511 addi a0,a0,4 + 9a4: feb54ee3 blt a0,a1,9a0 + 9a8: 00002517 auipc a0,0x2 + 9ac: 4c850513 addi a0,a0,1224 # 2e70 <_data_lma> + 9b0: c0418593 addi a1,gp,-1020 # 20000000 + 9b4: c3018613 addi a2,gp,-976 # 2000002c + 9b8: 00c58863 beq a1,a2,9c8 + 9bc: 4114 lw a3,0(a0) + 9be: c194 sw a3,0(a1) + 9c0: 0511 addi a0,a0,4 + 9c2: 0591 addi a1,a1,4 + 9c4: fec59ae3 bne a1,a2,9b8 + SysTick->CTLR = 1; + 9c8: e000f7b7 lui a5,0xe000f + 9cc: 4705 li a4,1 + 9ce: c398 sw a4,0(a5) +asm volatile( + 9d0: 6785 lui a5,0x1 + 9d2: ac878793 addi a5,a5,-1336 # ac8
+ 9d6: 34179073 csrw mepc,a5 + 9da: 30200073 mret -00000d4c : -{ - d4c: 1131 addi sp,sp,-20 - d4e: c436 sw a3,8(sp) - va_start( args, format ); - d50: 0034 addi a3,sp,8 -{ - d52: c206 sw ra,4(sp) - d54: c63a sw a4,12(sp) - d56: c83e sw a5,16(sp) - va_start( args, format ); - d58: c036 sw a3,0(sp) - int ret = mini_vsnprintf( buffer, buffer_len, format, args ); - d5a: 3f6d jal d14 -} - d5c: 4092 lw ra,4(sp) - d5e: 0151 addi sp,sp,20 - d60: 8082 ret +000009de : + asm volatile( "1: j 1b" ); + 9de: a001 j 9de -00000d62 : +000009e0 : + RCC->INTR |= RCC_CSSC; // clear the clock security int flag + 9e0: 40021737 lui a4,0x40021 + 9e4: 471c lw a5,8(a4) + 9e6: 008006b7 lui a3,0x800 + 9ea: 8fd5 or a5,a5,a3 + 9ec: c71c sw a5,8(a4) + +000009ee : WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; } - d62: 962a add a2,a2,a0 - d64: 87aa mv a5,a0 - d66: 00c79363 bne a5,a2,d6c - d6a: 8082 ret - d6c: 00b78023 sb a1,0(a5) - d70: 0785 addi a5,a5,1 - d72: bfd5 j d66 + 9ee: 962a add a2,a2,a0 + 9f0: 87aa mv a5,a0 + 9f2: 00c79363 bne a5,a2,9f8 + 9f6: 8082 ret + 9f8: 00b78023 sb a1,0(a5) + 9fc: 0785 addi a5,a5,1 + 9fe: bfd5 j 9f2 -00000d74 : +00000a00 : memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer)); - d74: 40000613 li a2,1024 - d78: 4581 li a1,0 - d7a: c4418513 addi a0,gp,-956 # 20000040 - d7e: b7d5 j d62 + a00: 40000613 li a2,1024 + a04: 4581 li a1,0 + a06: c6818513 addi a0,gp,-920 # 20000064 + a0a: b7d5 j 9ee -00000d80 : - for (; (*d=*s); s++, d++); - d80: 87aa mv a5,a0 - d82: 0005c703 lbu a4,0(a1) - d86: 00e78023 sb a4,0(a5) - d8a: e311 bnez a4,d8e -} - d8c: 8082 ret - for (; (*d=*s); s++, d++); - d8e: 0585 addi a1,a1,1 - d90: 0785 addi a5,a5,1 - d92: bfc5 j d82 - -00000d94 : +00000a0c : for (; n; n--) *d++ = *s++; - d94: 4781 li a5,0 - d96: 00f61363 bne a2,a5,d9c + a0c: 4781 li a5,0 + a0e: 00f61363 bne a2,a5,a14 } - d9a: 8082 ret + a12: 8082 ret for (; n; n--) *d++ = *s++; - d9c: 00f58733 add a4,a1,a5 - da0: 00074683 lbu a3,0(a4) - da4: 00f50733 add a4,a0,a5 - da8: 0785 addi a5,a5,1 - daa: 00d70023 sb a3,0(a4) - dae: b7e5 j d96 + a14: 00f58733 add a4,a1,a5 + a18: 00074683 lbu a3,0(a4) # 40021000 <_eusrstack+0x20020800> + a1c: 00f50733 add a4,a0,a5 + a20: 0785 addi a5,a5,1 + a22: 00d70023 sb a3,0(a4) + a26: b7e5 j a0e -00000db0 : +00000a28 : { - db0: 7179 addi sp,sp,-48 + a28: 7179 addi sp,sp,-48 ssd1306_cmd(SSD1306_COLUMNADDR); - db2: 02100513 li a0,33 + a2a: 02100513 li a0,33 { - db6: d606 sw ra,44(sp) - db8: d422 sw s0,40(sp) - dba: d226 sw s1,36(sp) + a2e: d606 sw ra,44(sp) + a30: d422 sw s0,40(sp) + a32: d226 sw s1,36(sp) ssd1306_cmd(SSD1306_COLUMNADDR); - dbc: 3f35 jal cf8 + a34: 3f31 jal 950 ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset) - dbe: 4501 li a0,0 - dc0: 3f25 jal cf8 + a36: 4501 li a0,0 + a38: 3f21 jal 950 ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset) - dc2: 07f00513 li a0,127 - dc6: 3f0d jal cf8 + a3a: 07f00513 li a0,127 + a3e: 3f09 jal 950 ssd1306_cmd(SSD1306_PAGEADDR); - dc8: 02200513 li a0,34 - dcc: 3735 jal cf8 + a40: 02200513 li a0,34 + a44: 3731 jal 950 ssd1306_cmd(0); // Page start address (0 = reset) - dce: 4501 li a0,0 - dd0: 3725 jal cf8 + a46: 4501 li a0,0 + a48: 3721 jal 950 ssd1306_cmd(7); // Page end address - dd2: 451d li a0,7 - dd4: c4418413 addi s0,gp,-956 # 20000040 - dd8: 3705 jal cf8 + a4a: 451d li a0,7 + a4c: c6818413 addi s0,gp,-920 # 20000064 + a50: 3701 jal 950 for(i=0;i + a68: 3755 jal a0c return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); - df2: 02100593 li a1,33 - df6: 850a mv a0,sp - df8: 02040413 addi s0,s0,32 - dfc: 3be9 jal bd6 - dfe: fe9410e3 bne s0,s1,dde + a6a: 02100593 li a1,33 + a6e: 850a mv a0,sp + a70: 02040413 addi s0,s0,32 + a74: 33c9 jal 836 + a76: fe9410e3 bne s0,s1,a56 } - e02: 50b2 lw ra,44(sp) - e04: 5422 lw s0,40(sp) - e06: 5492 lw s1,36(sp) - e08: 6145 addi sp,sp,48 - e0a: 8082 ret + a7a: 50b2 lw ra,44(sp) + a7c: 5422 lw s0,40(sp) + a7e: 5492 lw s1,36(sp) + a80: 6145 addi sp,sp,48 + a82: 8082 ret -00000e0c : +00000a84 : //#define BASE_CTLR (((FUNCONF_HSITRIM) << 3) | HSEBYP | RCC_CSS) // disable HSI in HSE modes // Flash latency settings. #if defined(CH32V003) #if FUNCONF_SYSTEM_CORE_CLOCK > 25000000 FLASH->ACTLR = FLASH_ACTLR_LATENCY_1; // +1 Cycle Latency - e0c: 400227b7 lui a5,0x40022 - e10: 4705 li a4,1 - e12: c398 sw a4,0(a5) + a84: 400227b7 lui a5,0x40022 + a88: 4705 li a4,1 + a8a: c398 sw a4,0(a5) #elif defined(FUNCONF_USE_HSI) && FUNCONF_USE_HSI #if defined(CH32V30x) || defined(CH32V20x) || defined(CH32L103) || defined(CH32V10x) EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; #endif #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL RCC->CFGR0 = BASE_CFGR0; - e14: 400217b7 lui a5,0x40021 + a8c: 400217b7 lui a5,0x40021 RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. - e18: 01080737 lui a4,0x1080 + a90: 01080737 lui a4,0x1080 RCC->CFGR0 = BASE_CFGR0; - e1c: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> + a94: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. - e20: 08170713 addi a4,a4,129 # 1080081 - e24: c398 sw a4,0(a5) + a98: 08170713 addi a4,a4,129 # 1080081 + a9c: c398 sw a4,0(a5) FLASH->ACTLR = FLASH_ACTLR_LATENCY_0; #endif #endif #ifndef CH5xx RCC->INTR = 0x009F0000; // Clear PLL, CSSC, HSE, HSI and LSI ready flags. - e26: 009f0737 lui a4,0x9f0 - e2a: c798 sw a4,8(a5) + a9e: 009f0737 lui a4,0x9f0 + aa2: c798 sw a4,8(a5) #endif #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL && !defined(CH5xx) while((RCC->CTLR & RCC_PLLRDY) == 0) {}; // Wait till PLL is ready - e2c: 4398 lw a4,0(a5) - e2e: 00671693 slli a3,a4,0x6 - e32: fe06dde3 bgez a3,e2c + aa4: 4398 lw a4,0(a5) + aa6: 00671693 slli a3,a4,0x6 + aaa: fe06dde3 bgez a3,aa4 #if defined(CH32H41x) RCC->PLLCFGR |= RCC_SYSPLL_GATE; #endif uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW - e36: 43d8 lw a4,4(a5) + aae: 43d8 lw a4,4(a5) RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source - e38: 400216b7 lui a3,0x40021 + ab0: 400216b7 lui a3,0x40021 uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW - e3c: 9b71 andi a4,a4,-4 + ab4: 9b71 andi a4,a4,-4 RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source - e3e: 00276713 ori a4,a4,2 - e42: c3d8 sw a4,4(a5) + ab6: 00276713 ori a4,a4,2 + aba: c3d8 sw a4,4(a5) while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source - e44: 4721 li a4,8 - e46: 42dc lw a5,4(a3) - e48: 8bb1 andi a5,a5,12 - e4a: fee79ee3 bne a5,a4,e46 - *DMDATA1 = 0x00; - e4e: e00007b7 lui a5,0xe0000 - e52: 0e07ac23 sw zero,248(a5) # e00000f8 <_eusrstack+0xbffff8f8> - *DMDATA0 = 0x80; - e56: 08000713 li a4,128 - e5a: 0ee7aa23 sw a4,244(a5) + abc: 4721 li a4,8 + abe: 42dc lw a5,4(a3) + ac0: 8bb1 andi a5,a5,12 + ac2: fee79ee3 bne a5,a4,abe SetupDebugPrintf(); #endif #if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS CallConstructors(); #endif } - e5e: 8082 ret + ac6: 8082 ret -00000e60
: +00000ac8
: } } // ----------------------------------------------------------------- main int main(void) { - e60: f9810113 addi sp,sp,-104 - e64: d286 sw ra,100(sp) - e66: d0a2 sw s0,96(sp) - e68: cea6 sw s1,92(sp) + ac8: f8410113 addi sp,sp,-124 + acc: dc86 sw ra,120(sp) + ace: daa2 sw s0,116(sp) + ad0: d8a6 sw s1,112(sp) SystemInit(); - e6a: 374d jal e0c + ad2: 3f4d jal a84 funGpioInitAll(); - e6c: 400214b7 lui s1,0x40021 - e70: 4c9c lw a5,24(s1) + ad4: 400214b7 lui s1,0x40021 + ad8: 4c9c lw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - e72: 40011437 lui s0,0x40011 + ada: 40011437 lui s0,0x40011 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - e76: 76fd lui a3,0xfffff + ade: 76fd lui a3,0xfffff funGpioInitAll(); - e78: 0357e793 ori a5,a5,53 - e7c: cc9c sw a5,24(s1) + ae0: 0357e793 ori a5,a5,53 + ae4: cc9c sw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - e7e: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000> - e82: 4398 lw a4,0(a5) + ae6: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000> + aea: 4398 lw a4,0(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - e84: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff> + aec: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff> funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); - e88: f1000637 lui a2,0xf1000 + af0: f1000637 lui a2,0xf1000 funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - e8c: f0f77713 andi a4,a4,-241 - e90: 01076713 ori a4,a4,16 - e94: c398 sw a4,0(a5) + af4: f0f77713 andi a4,a4,-241 + af8: 01076713 ori a4,a4,16 + afc: c398 sw a4,0(a5) funDigitalWrite(LED_PIN, FUN_LOW); - e96: 00020737 lui a4,0x20 - e9a: cb98 sw a4,16(a5) + afe: 00020737 lui a4,0x20 + b02: cb98 sw a4,16(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - e9c: 40040793 addi a5,s0,1024 - ea0: 4398 lw a4,0(a5) + b04: 40040793 addi a5,s0,1024 + b08: 4398 lw a4,0(a5) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); - ea2: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff> + b0a: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff> gpio_setup(); Delay_Ms(120); // let the OLED rail settle - ea4: 000b0537 lui a0,0xb0 + b0c: 000b0537 lui a0,0xb0 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - ea8: 8f75 and a4,a4,a3 - eaa: 10076713 ori a4,a4,256 - eae: c398 sw a4,0(a5) + b10: 8f75 and a4,a4,a3 + b12: 10076713 ori a4,a4,256 + b16: c398 sw a4,0(a5) funDigitalWrite(BUZZER, FUN_LOW); - eb0: 00040737 lui a4,0x40 - eb4: cb98 sw a4,16(a5) + b18: 00040737 lui a4,0x40 + b1c: cb98 sw a4,16(a5) funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); - eb6: 4018 lw a4,0(s0) + b1e: 4018 lw a4,0(s0) Delay_Ms(120); // let the OLED rail settle - eb8: c8050513 addi a0,a0,-896 # afc80 + b20: c8050513 addi a0,a0,-896 # afc80 funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); - ebc: 9b41 andi a4,a4,-16 - ebe: 00876713 ori a4,a4,8 - ec2: c018 sw a4,0(s0) + b24: 9b41 andi a4,a4,-16 + b26: 00876713 ori a4,a4,8 + b2a: c018 sw a4,0(s0) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); - ec4: 4398 lw a4,0(a5) - ec6: 8f71 and a4,a4,a2 - ec8: 08000637 lui a2,0x8000 - ecc: 8f51 or a4,a4,a2 - ece: c398 sw a4,0(a5) + b2c: 4398 lw a4,0(a5) + b2e: 8f71 and a4,a4,a2 + b30: 08000637 lui a2,0x8000 + b34: 8f51 or a4,a4,a2 + b36: c398 sw a4,0(a5) funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD); - ed0: 4398 lw a4,0(a5) - ed2: ff100637 lui a2,0xff100 - ed6: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff> - ed8: 8f71 and a4,a4,a2 - eda: 00800637 lui a2,0x800 - ede: 8f51 or a4,a4,a2 - ee0: c398 sw a4,0(a5) + b38: 4398 lw a4,0(a5) + b3a: ff100637 lui a2,0xff100 + b3e: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff> + b40: 8f71 and a4,a4,a2 + b42: 00800637 lui a2,0x800 + b46: 8f51 or a4,a4,a2 + b48: c398 sw a4,0(a5) funDigitalWrite(BTN_OK, FUN_HIGH); - ee2: 4705 li a4,1 - ee4: c818 sw a4,16(s0) + b4a: 4705 li a4,1 + b4c: c818 sw a4,16(s0) funDigitalWrite(BTN_LEFT, FUN_HIGH); - ee6: 04000713 li a4,64 - eea: cb98 sw a4,16(a5) + b4e: 04000713 li a4,64 + b52: cb98 sw a4,16(a5) funDigitalWrite(BTN_RIGHT, FUN_HIGH); - eec: 02000713 li a4,32 - ef0: cb98 sw a4,16(a5) + b54: 02000713 li a4,32 + b58: cb98 sw a4,16(a5) Delay_Ms(120); // let the OLED rail settle - ef2: b50ff0ef jal 242 + b5a: dc4ff0ef jal 11e * init I2C and GPIO */ uint8_t ssd1306_i2c_init(void) { // Enable GPIOC and I2C RCC->APB1PCENR |= RCC_APB1Periph_I2C1; - ef6: 4cdc lw a5,28(s1) - ef8: 00200737 lui a4,0x200 - efc: 8fd9 or a5,a5,a4 - efe: ccdc sw a5,28(s1) + b5e: 4cdc lw a5,28(s1) + b60: 00200737 lui a4,0x200 + b64: 8fd9 or a5,a5,a4 + b66: ccdc sw a5,28(s1) funPinMode( PB6, GPIO_CFGLR_OUT_10Mhz_AF_OD ); funPinMode( PB7, GPIO_CFGLR_OUT_10Mhz_AF_OD ); #endif #else RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; - f00: 4c9c lw a5,24(s1) + b68: 4c9c lw a5,24(s1) // PC1 is SDA, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*1)); GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); // PC2 is SCL, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*2)); - f02: 777d lui a4,0xfffff - f04: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> + b6a: 777d lui a4,0xfffff + b6c: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; - f08: 0117e793 ori a5,a5,17 - f0c: cc9c sw a5,24(s1) + b70: 0117e793 ori a5,a5,17 + b74: cc9c sw a5,24(s1) GPIOC->CFGLR &= ~(0xf<<(4*1)); - f0e: 401c lw a5,0(s0) + b76: 401c lw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); - f10: 6705 lui a4,0x1 - f12: d0070713 addi a4,a4,-768 # d00 + b78: 6705 lui a4,0x1 + b7a: d0070713 addi a4,a4,-768 # d00 GPIOC->CFGLR &= ~(0xf<<(4*1)); - f16: f0f7f793 andi a5,a5,-241 - f1a: c01c sw a5,0(s0) + b7e: f0f7f793 andi a5,a5,-241 + b82: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); - f1c: 401c lw a5,0(s0) - f1e: 0d07e793 ori a5,a5,208 - f22: c01c sw a5,0(s0) + b84: 401c lw a5,0(s0) + b86: 0d07e793 ori a5,a5,208 + b8a: c01c sw a5,0(s0) GPIOC->CFGLR &= ~(0xf<<(4*2)); - f24: 401c lw a5,0(s0) - f26: 8ff5 and a5,a5,a3 - f28: c01c sw a5,0(s0) + b8c: 401c lw a5,0(s0) + b8e: 8ff5 and a5,a5,a3 + b90: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); - f2a: 401c lw a5,0(s0) - f2c: 8fd9 or a5,a5,a4 - f2e: c01c sw a5,0(s0) + b92: 401c lw a5,0(s0) + b94: 8fd9 or a5,a5,a4 + b96: c01c sw a5,0(s0) ssd1306_setbuf(0); // initialize OLED #if !defined(SSD1306_CUSTOM_INIT_ARRAY) || !SSD1306_CUSTOM_INIT_ARRAY uint8_t *cmd_list = (uint8_t *)ssd1306_init_array; - f30: 6409 lui s0,0x2 + b98: 6409 lui s0,0x2 GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4); GPIOC->BSHR = (1<<(16+4)); #endif // load I2C regs ssd1306_i2c_setup(); - f32: be2ff0ef jal 314 - f36: eb440413 addi s0,s0,-332 # 1eb4 + b9a: d96ff0ef jal 130 + b9e: 40440413 addi s0,s0,1028 # 2404 ssd1306_setbuf(0); - f3a: 3d2d jal d74 + ba2: 3db9 jal a00 while(*cmd_list != SSD1306_TERMINATE_CMDS) - f3c: 00044503 lbu a0,0(s0) - f40: 0ff00793 li a5,255 - f44: 00f51463 bne a0,a5,f4c + ba4: 00044503 lbu a0,0(s0) + ba8: 0ff00793 li a5,255 + bac: 00f51463 bne a0,a5,bb4 { if(ssd1306_cmd(*cmd_list++)) return 1; } ssd1306_refresh(); - f48: 35a5 jal db0 + bb0: 3da5 jal a28 #endif return 0; - f4a: a021 j f52 + bb2: a021 j bba if(ssd1306_cmd(*cmd_list++)) - f4c: 0405 addi s0,s0,1 - f4e: 336d jal cf8 - f50: d575 beqz a0,f3c - // no display: fall back to a heartbeat blink so the board still shows life + bb4: 0405 addi s0,s0,1 + bb6: 3b69 jal 950 + bb8: d575 beqz a0,ba4 + ssd1306_setbuf(0); + bba: 6489 lui s1,0x2 + bbc: 3591 jal a00 + for (uint8_t i = 0; i < 5; i++) { + bbe: 42048493 addi s1,s1,1056 # 2420 + ssd1306_setbuf(0); + bc2: 4401 li s0,0 + ssd1306_drawstr(0, i * 10, boot[i], 1); + bc4: 4090 lw a2,0(s1) + bc6: 4685 li a3,1 + bc8: 85a2 mv a1,s0 + bca: 4501 li a0,0 + bcc: e4cff0ef jal 218 + ssd1306_refresh(); + bd0: 3da1 jal a28 + beep(1200 + i * 120, 25); + bd2: 00141513 slli a0,s0,0x1 + bd6: 9522 add a0,a0,s0 + bd8: 050a slli a0,a0,0x2 + bda: 4b050513 addi a0,a0,1200 + bde: 0542 slli a0,a0,0x10 + be0: 8141 srli a0,a0,0x10 + be2: 45e5 li a1,25 + be4: f32ff0ef jal 316 + Delay_Ms(220); + be8: 00142537 lui a0,0x142 + bec: 44050513 addi a0,a0,1088 # 142440 + bf0: d2eff0ef jal 11e + for (uint8_t i = 0; i < 5; i++) { + bf4: 0429 addi s0,s0,10 + bf6: 03200793 li a5,50 + bfa: 0491 addi s1,s1,4 + bfc: fcf414e3 bne s0,a5,bc4 + draw_center_str(54, "press any key"); + c00: 6589 lui a1,0x2 + c02: 9a858593 addi a1,a1,-1624 # 19a8 + c06: 03600513 li a0,54 + c0a: 903ff0ef jal 50c + ssd1306_refresh(); + c0e: 3d29 jal a28 + beep(988, 120); + c10: 07800593 li a1,120 + c14: 3dc00513 li a0,988 + c18: efeff0ef jal 316 + c1c: 0c800413 li s0,200 + Buttons b = read_buttons(); + c20: 915ff0ef jal 534 + c24: 00855713 srli a4,a0,0x8 + c28: 01055793 srli a5,a0,0x10 + c2c: 02e10ea3 sb a4,61(sp) + if (b.ok || b.left || b.right) break; + c30: 8f49 or a4,a4,a0 + Buttons b = read_buttons(); + c32: 02f10f23 sb a5,62(sp) + if (b.ok || b.left || b.right) break; + c36: 8fd9 or a5,a5,a4 + Buttons b = read_buttons(); + c38: 02a10e23 sb a0,60(sp) + if (b.ok || b.left || b.right) break; + c3c: 0ff7f793 zext.b a5,a5 + c40: eb81 bnez a5,c50 + Delay_Ms(20); + c42: 6575 lui a0,0x1d + c44: 4c050513 addi a0,a0,1216 # 1d4c0 + for (int i = 0; i < 200; i++) { + c48: 147d addi s0,s0,-1 + Delay_Ms(20); + c4a: cd4ff0ef jal 11e + for (int i = 0; i < 200; i++) { + c4e: f869 bnez s0,c20 while (1) { led_blink(); Delay_Ms(700); } } ssd1306_init(); - pet_reset(); - f52: d78ff0ef jal 4ca - ssd1306_setbuf(0); - f56: 3d39 jal d74 - draw_center_str(4, "PANAGOTCHI"); - f58: 6589 lui a1,0x2 - f5a: 94858593 addi a1,a1,-1720 # 1948 - f5e: 4511 li a0,4 - f60: e30ff0ef jal 590 - ssd1306_drawImage(48, 16, pana_idle, PANA_W, PANA_H, 0); - f64: 02000713 li a4,32 - f68: 6609 lui a2,0x2 - f6a: 86ba mv a3,a4 - f6c: ed060613 addi a2,a2,-304 # 1ed0 - f70: 45c1 li a1,16 - f72: 03000513 li a0,48 - f76: eb8ff0ef jal 62e - draw_center_str(52, "press any key"); - f7a: 6589 lui a1,0x2 - f7c: 95458593 addi a1,a1,-1708 # 1954 - f80: 03400513 li a0,52 - f84: e0cff0ef jal 590 - ssd1306_refresh(); - f88: 3525 jal db0 - beep(659, 80); beep(784, 80); beep(988, 120); - f8a: 05000593 li a1,80 - f8e: 29300513 li a0,659 - f92: c9eff0ef jal 430 - f96: 05000593 li a1,80 - f9a: 31000513 li a0,784 - f9e: c92ff0ef jal 430 - fa2: 07800593 li a1,120 - fa6: 3dc00513 li a0,988 - faa: c86ff0ef jal 430 - fae: 0c800413 li s0,200 - Buttons b = read_buttons(); - fb2: e06ff0ef jal 5b8 - fb6: 00855713 srli a4,a0,0x8 - fba: 01055793 srli a5,a0,0x10 - fbe: 02e104a3 sb a4,41(sp) - if (b.ok || b.left || b.right) break; - fc2: 8f49 or a4,a4,a0 - Buttons b = read_buttons(); - fc4: 02f10523 sb a5,42(sp) - if (b.ok || b.left || b.right) break; - fc8: 8fd9 or a5,a5,a4 - Buttons b = read_buttons(); - fca: 02a10423 sb a0,40(sp) - if (b.ok || b.left || b.right) break; - fce: 0ff7f793 zext.b a5,a5 - fd2: eb81 bnez a5,fe2 - Delay_Ms(20); - fd4: 6575 lui a0,0x1d - fd6: 4c050513 addi a0,a0,1216 # 1d4c0 - for (int i = 0; i < 200; i++) { - fda: 147d addi s0,s0,-1 - Delay_Ms(20); - fdc: a66ff0ef jal 242 - for (int i = 0; i < 200; i++) { - fe0: f869 bnez s0,fb2 - beep(659, 80); beep(784, 80); beep(988, 120); - fe2: 4601 li a2,0 - fe4: 4481 li s1,0 - fe6: 4401 li s0,0 - fe8: c832 sw a2,16(sp) splash(); + screen = SCR_SELECT; // pick a species before a pet is born + c50: c4018223 sb zero,-956(gp) # 20000040 Buttons prev = {0, 0, 0}; + c54: 4701 li a4,0 + c56: 4481 li s1,0 + c58: 4401 li s0,0 + c5a: c23a sw a4,4(sp) while (1) { Buttons b = read_buttons(); - fea: dceff0ef jal 5b8 - fee: 00855713 srli a4,a0,0x8 - ff2: 01055793 srli a5,a0,0x10 - ff6: 02e102a3 sb a4,37(sp) - ffa: 02f10323 sb a5,38(sp) - ffe: 0ff57693 zext.b a3,a0 - 1002: 0ff77713 zext.b a4,a4 - 1006: 0ff7f793 zext.b a5,a5 - 100a: 02a10223 sb a0,36(sp) - 100e: c236 sw a3,4(sp) - 1010: c43a sw a4,8(sp) - 1012: c63e sw a5,12(sp) + c5c: 8d9ff0ef jal 534 + c60: 01055793 srli a5,a0,0x10 + c64: 0ff57713 zext.b a4,a0 + c68: cc3a sw a4,24(sp) + c6a: 02f10923 sb a5,50(sp) + c6e: 0ff7f793 zext.b a5,a5 + c72: 00855693 srli a3,a0,0x8 + c76: ce3e sw a5,28(sp) uint8_t ok_edge = b.ok && !prev.ok; - 1014: c002 sw zero,0(sp) - 1016: 4642 lw a2,16(sp) - 1018: c681 beqz a3,1020 - 101a: 00143793 seqz a5,s0 - 101e: c03e sw a5,0(sp) - uint8_t left_edge = b.left && !prev.left; - 1020: 4722 lw a4,8(sp) + c78: 47e2 lw a5,24(sp) + Buttons b = read_buttons(); + c7a: 0ff6f713 zext.b a4,a3 + c7e: ca3a sw a4,20(sp) + c80: 02a10823 sb a0,48(sp) + c84: 02d108a3 sb a3,49(sp) uint8_t ok_edge = b.ok && !prev.ok; - 1022: 00014783 lbu a5,0(sp) + c88: c002 sw zero,0(sp) + c8a: 4712 lw a4,4(sp) + c8c: c781 beqz a5,c94 + c8e: 00143793 seqz a5,s0 + c92: c03e sw a5,0(sp) uint8_t left_edge = b.left && !prev.left; - 1026: 4681 li a3,0 - 1028: c319 beqz a4,102e - 102a: 0014b693 seqz a3,s1 - uint8_t right_edge = b.right && !prev.right; - 102e: 4532 lw a0,12(sp) + c94: 46d2 lw a3,20(sp) + uint8_t ok_edge = b.ok && !prev.ok; + c96: 00014783 lbu a5,0(sp) uint8_t left_edge = b.left && !prev.left; - 1030: 0ff6f593 zext.b a1,a3 + c9a: 4581 li a1,0 + c9c: c299 beqz a3,ca2 + c9e: 0014b593 seqz a1,s1 uint8_t right_edge = b.right && !prev.right; - 1034: 4701 li a4,0 - 1036: c119 beqz a0,103c - 1038: 00163713 seqz a4,a2 + ca2: 4572 lw a0,28(sp) + uint8_t left_edge = b.left && !prev.left; + ca4: 0ff5f613 zext.b a2,a1 + uint8_t right_edge = b.right && !prev.right; + ca8: 4681 li a3,0 + caa: c119 beqz a0,cb0 + cac: 00173693 seqz a3,a4 uint8_t any_edge = ok_edge | left_edge | right_edge; - 103c: 8fcd or a5,a5,a1 - 103e: 8fd9 or a5,a5,a4 + cb0: 8fd1 or a5,a5,a2 + cb2: 8fd5 or a5,a5,a3 prev = b; if (any_edge) idle_frames = 0; - 1040: c399 beqz a5,1046 - 1042: c201a423 sw zero,-984(gp) # 20000024 + cb4: c399 beqz a5,cba + cb6: c401a023 sw zero,-960(gp) # 2000003c if (!disp_on) { - 1046: c051c603 lbu a2,-1019(gp) # 20000001 - 104a: e625 bnez a2,10b2 + cba: c051c703 lbu a4,-1019(gp) # 20000001 + cbe: eb35 bnez a4,d32 // screen is asleep: the first press only wakes it (not an action) if (any_edge) { - 104c: c799 beqz a5,105a + cc0: c799 beqz a5,cce ssd1306_cmd(SSD1306_DISPLAYON); - 104e: 0af00513 li a0,175 - 1052: 315d jal cf8 + cc2: 0af00513 li a0,175 + cc6: 3169 jal 950 disp_on = 1; - 1054: 4785 li a5,1 - 1056: c0f182a3 sb a5,-1019(gp) # 20000001 + cc8: 4785 li a5,1 + cca: c0f182a3 sb a5,-1019(gp) # 20000001 ssd1306_cmd(SSD1306_DISPLAYOFF); disp_on = 0; } } if (anim_timer) anim_timer--; - 105a: c261c783 lbu a5,-986(gp) # 20000022 - 105e: c781 beqz a5,1066 - 1060: 17fd addi a5,a5,-1 - 1062: c2f18323 sb a5,-986(gp) # 20000022 + cce: c3a1c783 lbu a5,-966(gp) # 20000036 + cd2: c781 beqz a5,cda + cd4: 17fd addi a5,a5,-1 + cd6: c2f18d23 sb a5,-966(gp) # 20000036 + if (evo_anim) evo_anim--; + cda: c501c783 lbu a5,-944(gp) # 2000004c + cde: c781 beqz a5,ce6 + ce0: 17fd addi a5,a5,-1 + ce2: c4f18823 sb a5,-944(gp) # 2000004c // advance game time independent of screen / display state if (pet.alive && ++tick_acc >= TICK_FRAMES) { - 1066: c3818793 addi a5,gp,-968 # 20000034 - 106a: 00a7c783 lbu a5,10(a5) - 106e: c3818413 addi s0,gp,-968 # 20000034 - 1072: cf81 beqz a5,108a - 1074: c241d783 lhu a5,-988(gp) # 20000020 - 1078: 0f900693 li a3,249 - 107c: 0785 addi a5,a5,1 - 107e: 07c2 slli a5,a5,0x10 - 1080: 83c1 srli a5,a5,0x10 - 1082: 68f6e763 bltu a3,a5,1710 - 1086: c2f19223 sh a5,-988(gp) # 20000020 + ce6: c5418793 addi a5,gp,-940 # 20000050 + cea: 0107c783 lbu a5,16(a5) + cee: c5418413 addi s0,gp,-940 # 20000050 + cf2: cf81 beqz a5,d0a + cf4: c381d783 lhu a5,-968(gp) # 20000034 + cf8: 0f900693 li a3,249 + cfc: 0785 addi a5,a5,1 + cfe: 07c2 slli a5,a5,0x10 + d00: 83c1 srli a5,a5,0x10 + d02: 24f6e7e3 bltu a3,a5,1750 + d06: c2f19c23 sh a5,-968(gp) # 20000034 tick_acc = 0; game_tick(); } frame++; - 108a: c201a783 lw a5,-992(gp) # 2000001c + d0a: c341a783 lw a5,-972(gp) # 20000030 idle_frames++; Delay_Ms(FRAME_MS); - 108e: 00058537 lui a0,0x58 - 1092: e4050513 addi a0,a0,-448 # 57e40 + d0e: 00058537 lui a0,0x58 + d12: e4050513 addi a0,a0,-448 # 57e40 frame++; - 1096: 0785 addi a5,a5,1 - 1098: c2f1a023 sw a5,-992(gp) # 2000001c + d16: 0785 addi a5,a5,1 + d18: c2f1aa23 sw a5,-972(gp) # 20000030 idle_frames++; - 109c: c281a783 lw a5,-984(gp) # 20000024 - 10a0: 0785 addi a5,a5,1 - 10a2: c2f1a423 sw a5,-984(gp) # 20000024 + d1c: c401a783 lw a5,-960(gp) # 2000003c + d20: 0785 addi a5,a5,1 + d22: c4f1a023 sw a5,-960(gp) # 2000003c Delay_Ms(FRAME_MS); - 10a6: 99cff0ef jal 242 + d26: bf8ff0ef jal 11e prev = b; - 10aa: 4632 lw a2,12(sp) - 10ac: 44a2 lw s1,8(sp) - 10ae: 4412 lw s0,4(sp) + d2a: 4772 lw a4,28(sp) + d2c: 44d2 lw s1,20(sp) + d2e: 4462 lw s0,24(sp) while (1) { - 10b0: bf25 j fe8 + d30: b72d j c5a switch (screen) { - 10b2: c351c483 lbu s1,-971(gp) # 20000031 - 10b6: 4609 li a2,2 - 10b8: 5ec48b63 beq s1,a2,16ae - 10bc: 06966263 bltu a2,s1,1120 - 10c0: c3818413 addi s0,gp,-968 # 20000034 - 10c4: 3c049763 bnez s1,1492 + d32: c441c703 lbu a4,-956(gp) # 20000040 + d36: 4611 li a2,4 + d38: 7ee66963 bltu a2,a4,152a + d3c: 6609 lui a2,0x2 + d3e: 070a slli a4,a4,0x2 + d40: b7460613 addi a2,a2,-1164 # 1b74 + d44: 9732 add a4,a4,a2 + d46: 4318 lw a4,0(a4) + d48: 8702 jr a4 if (left_edge) { - 10c8: c285 beqz a3,10e8 - cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; - 10ca: c341c503 lbu a0,-972(gp) # 20000030 - 10ce: 459d li a1,7 - 10d0: c83a sw a4,16(sp) - 10d2: 0519 addi a0,a0,6 - 10d4: 824ff0ef jal f8 <__modsi3> - 10d8: c2a18a23 sb a0,-972(gp) # 20000030 + d4a: c185 beqz a1,d6a + sel_species = (sel_species + SPECIES_COUNT - 1) % SPECIES_COUNT; + d4c: c3d1c503 lbu a0,-963(gp) # 20000039 + d50: 458d li a1,3 + d52: c236 sw a3,4(sp) + d54: 0509 addi a0,a0,2 + d56: ba2ff0ef jal f8 <__modsi3> + d5a: c2a18ea3 sb a0,-963(gp) # 20000039 beep(1047, 25); - 10dc: 45e5 li a1,25 - 10de: 41700513 li a0,1047 - 10e2: b4eff0ef jal 430 - 10e6: 4742 lw a4,16(sp) + d5e: 45e5 li a1,25 + d60: 41700513 li a0,1047 + d64: db2ff0ef jal 316 + d68: 4692 lw a3,4(sp) if (right_edge) { - 10e8: cf11 beqz a4,1104 - cursor = (cursor + 1) % ICON_COUNT; - 10ea: c341c503 lbu a0,-972(gp) # 20000030 - 10ee: 459d li a1,7 - 10f0: 0505 addi a0,a0,1 - 10f2: 806ff0ef jal f8 <__modsi3> - 10f6: c2a18a23 sb a0,-972(gp) # 20000030 + d6a: ce91 beqz a3,d86 + sel_species = (sel_species + 1) % SPECIES_COUNT; + d6c: c3d1c503 lbu a0,-963(gp) # 20000039 + d70: 458d li a1,3 + d72: 0505 addi a0,a0,1 + d74: b84ff0ef jal f8 <__modsi3> + d78: c2a18ea3 sb a0,-963(gp) # 20000039 beep(1047, 25); - 10fa: 45e5 li a1,25 - 10fc: 41700513 li a0,1047 - 1100: b30ff0ef jal 430 - if (ok_edge) do_action(cursor); - 1104: 4782 lw a5,0(sp) - 1106: cfc1 beqz a5,119e - switch (act) { - 1108: c341c783 lbu a5,-972(gp) # 20000030 - 110c: 4719 li a4,6 - 110e: 08f76863 bltu a4,a5,119e - 1112: 6709 lui a4,0x2 - 1114: 078a slli a5,a5,0x2 - 1116: aa470713 addi a4,a4,-1372 # 1aa4 - 111a: 97ba add a5,a5,a4 - 111c: 439c lw a5,0(a5) - 111e: 8782 jr a5 - switch (screen) { - 1120: 478d li a5,3 - 1122: 40f48d63 beq s1,a5,153c - uint16_t timeout = screen_timeout_opts[timeout_idx]; - 1126: c041c703 lbu a4,-1020(gp) # 20000000 - 112a: c1418793 addi a5,gp,-1004 # 20000010 - 112e: 0706 slli a4,a4,0x1 - 1130: 97ba add a5,a5,a4 - 1132: 0007d783 lhu a5,0(a5) - if (timeout && idle_frames >= timeout) { - 1136: f20782e3 beqz a5,105a - 113a: c281a703 lw a4,-984(gp) # 20000024 - 113e: f0f76ee3 bltu a4,a5,105a - ssd1306_cmd(SSD1306_DISPLAYOFF); - 1142: 0ae00513 li a0,174 - 1146: 3e4d jal cf8 - disp_on = 0; - 1148: c00182a3 sb zero,-1019(gp) # 20000001 - 114c: b739 j 105a - pet.satiety = clamp100(pet.satiety + 30); - 114e: 00040783 lb a5,0(s0) -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1152: 06400713 li a4,100 - pet.satiety = clamp100(pet.satiety + 30); - 1156: 07f9 addi a5,a5,30 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1158: 14f75d63 bge a4,a5,12b2 - 115c: 87ba mv a5,a4 - 115e: 00f40023 sb a5,0(s0) - pet.hygiene = clamp100(pet.hygiene - 5); - 1162: 00340783 lb a5,3(s0) -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1166: 06400713 li a4,100 - pet.hygiene = clamp100(pet.hygiene - 5); - 116a: 17ed addi a5,a5,-5 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 116c: 14f75863 bge a4,a5,12bc - 1170: 87ba mv a5,a4 - 1172: 00f401a3 sb a5,3(s0) -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 1176: 4711 li a4,4 - 1178: c0e18e23 sb a4,-996(gp) # 20000018 - beep(880, 60); beep(1175, 80); - 117c: 03c00593 li a1,60 -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 1180: 4731 li a4,12 - beep(880, 60); beep(1175, 80); - 1182: 37000513 li a0,880 -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 1186: c2e18323 sb a4,-986(gp) # 20000022 - beep(880, 60); beep(1175, 80); - 118a: aa6ff0ef jal 430 - 118e: 05000593 li a1,80 - 1192: 49700513 li a0,1175 - beep(784, 60); beep(1047, 60); beep(1319, 90); - 1196: a9aff0ef jal 430 - led_blink(); - 119a: b06ff0ef jal 4a0 - ssd1306_setbuf(0); - 119e: 3ed9 jal d74 - draw_center_str(0, menu_labels[cursor]); - 11a0: c341c783 lbu a5,-972(gp) # 20000030 - 11a4: 4501 li a0,0 - 11a6: c03e sw a5,0(sp) - 11a8: 4702 lw a4,0(sp) - 11aa: 6789 lui a5,0x2 - 11ac: f8878793 addi a5,a5,-120 # 1f88 - 11b0: 070a slli a4,a4,0x2 - 11b2: 97ba add a5,a5,a4 - 11b4: 438c lw a1,0(a5) - 11b6: bdaff0ef jal 590 - if (pet.alive && pet.health < 30 && (frame & 8)) - 11ba: 00a44783 lbu a5,10(s0) - 11be: c83e sw a5,16(sp) - 11c0: c395 beqz a5,11e4 - 11c2: 00440703 lb a4,4(s0) - 11c6: 47f5 li a5,29 - 11c8: 00e7ce63 blt a5,a4,11e4 - 11cc: c201a783 lw a5,-992(gp) # 2000001c - 11d0: 8ba1 andi a5,a5,8 - 11d2: cb89 beqz a5,11e4 - ssd1306_drawstr(0, 0, "!", 1); - 11d4: 6609 lui a2,0x2 - 11d6: 4685 li a3,1 - 11d8: 96460613 addi a2,a2,-1692 # 1964 - 11dc: 4581 li a1,0 - 11de: 4501 li a0,0 - 11e0: 9c4ff0ef jal 3a4 - if((x >= SSD1306_W) || (y >= SSD1306_H)) return; - 11e4: 08000613 li a2,128 - 11e8: 45a9 li a1,10 - 11ea: 4501 li a0,0 - 11ec: d02ff0ef jal 6ee - if (pet.sleeping) { - 11f0: 00944783 lbu a5,9(s0) - 11f4: ca3e sw a5,20(sp) - 11f6: 20078363 beqz a5,13fc - ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1); - 11fa: 6609 lui a2,0x2 - 11fc: 4685 li a3,1 - 11fe: 96860613 addi a2,a2,-1688 # 1968 - 1202: 45b9 li a1,14 - 1204: 04e00513 li a0,78 - 1208: 99cff0ef jal 3a4 - ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1); - 120c: 6609 lui a2,0x2 - 120e: 4685 li a3,1 - 1210: 96c60613 addi a2,a2,-1684 # 196c - 1214: 45b1 li a1,12 - 1216: 05400513 li a0,84 - 121a: 98aff0ef jal 3a4 - 121e: 03000313 li t1,48 - px = 48; py = 16; - 1222: 42c1 li t0,16 - if (!pet.alive) return EXP_DEAD; - 1224: 4742 lw a4,16(sp) - 1226: 4799 li a5,6 - 1228: c719 beqz a4,1236 - if (anim_timer) return anim_exp; - 122a: c261c783 lbu a5,-986(gp) # 20000022 - 122e: 20078063 beqz a5,142e - 1232: c1c1c783 lbu a5,-996(gp) # 20000018 - ssd1306_drawImage(px, py, pana_frames[current_expression()], - 1236: 6709 lui a4,0x2 - 1238: f6c70713 addi a4,a4,-148 # 1f6c - 123c: 078a slli a5,a5,0x2 - 123e: 97ba add a5,a5,a4 - 1240: 4390 lw a2,0(a5) - 1242: 02000713 li a4,32 - 1246: 8596 mv a1,t0 - 1248: 851a mv a0,t1 - 124a: 86ba mv a3,a4 - 124c: be2ff0ef jal 62e - 1250: 08000613 li a2,128 - 1254: 02e00593 li a1,46 - 1258: 4501 li a0,0 - 125a: c94ff0ef jal 6ee - for (uint8_t i = 0; i < pet.poop; i++) - 125e: 00844783 lbu a5,8(s0) - 1262: 20f4e763 bltu s1,a5,1470 - 1266: 4401 li s0,0 - ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); - 1268: 6709 lui a4,0x2 - 126a: f5070713 addi a4,a4,-176 # 1f50 - 126e: 00241793 slli a5,s0,0x2 - 1272: 97ba add a5,a5,a4 - 1274: 00341493 slli s1,s0,0x3 - 1278: 4390 lw a2,0(a5) - 127a: 94a2 add s1,s1,s0 - 127c: 4741 li a4,16 - 127e: 0486 slli s1,s1,0x1 - 1280: 86ba mv a3,a4 - 1282: 03000593 li a1,48 - 1286: 00148513 addi a0,s1,1 # 40021001 <_eusrstack+0x20020801> - 128a: ba4ff0ef jal 62e - if (i == cursor) - 128e: 4702 lw a4,0(sp) - 1290: 0ff47793 zext.b a5,s0 - 1294: 00f71963 bne a4,a5,12a6 - ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1); - 1298: 46c5 li a3,17 - 129a: 8636 mv a2,a3 - 129c: 02f00593 li a1,47 - 12a0: 8526 mv a0,s1 - 12a2: c8aff0ef jal 72c - for (uint8_t i = 0; i < ICON_COUNT; i++) { - 12a6: 0405 addi s0,s0,1 - 12a8: 479d li a5,7 - 12aa: faf41fe3 bne s0,a5,1268 - ssd1306_refresh(); - 12ae: 3609 jal db0 -} - 12b0: bd9d j 1126 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 12b2: fff7c713 not a4,a5 - 12b6: 877d srai a4,a4,0x1f - 12b8: 8ff9 and a5,a5,a4 - 12ba: b555 j 115e - 12bc: fff7c713 not a4,a5 - 12c0: 877d srai a4,a4,0x1f - 12c2: 8ff9 and a5,a5,a4 - 12c4: b57d j 1172 - if (pet.energy < 15) { beep(220, 120); break; } // too tired - 12c6: 00240703 lb a4,2(s0) - 12ca: 47b9 li a5,14 - 12cc: 00e7c963 blt a5,a4,12de - 12d0: 07800593 li a1,120 - 12d4: 0dc00513 li a0,220 - beep(659, 40); - 12d8: 958ff0ef jal 430 - break; - 12dc: b5c9 j 119e - pet.happy = clamp100(pet.happy + 25); - 12de: 00140783 lb a5,1(s0) -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 12e2: 06400693 li a3,100 - pet.happy = clamp100(pet.happy + 25); - 12e6: 07e5 addi a5,a5,25 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 12e8: 04f6d563 bge a3,a5,1332 - 12ec: 87b6 mv a5,a3 - 12ee: 00f400a3 sb a5,1(s0) - pet.energy = clamp100(pet.energy - 12); - 12f2: ff470793 addi a5,a4,-12 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 12f6: 06400713 li a4,100 - 12fa: 00f75363 bge a4,a5,1300 - 12fe: 87ba mv a5,a4 - 1300: 00f40123 sb a5,2(s0) -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 1304: 4709 li a4,2 - 1306: c0e18e23 sb a4,-996(gp) # 20000018 - beep(988, 60); beep(1319, 60); beep(1568, 90); - 130a: 03c00593 li a1,60 -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 130e: 4731 li a4,12 - beep(988, 60); beep(1319, 60); beep(1568, 90); - 1310: 3dc00513 li a0,988 -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 1314: c2e18323 sb a4,-986(gp) # 20000022 - beep(988, 60); beep(1319, 60); beep(1568, 90); - 1318: 918ff0ef jal 430 - 131c: 03c00593 li a1,60 - 1320: 52700513 li a0,1319 - 1324: 90cff0ef jal 430 - 1328: 05a00593 li a1,90 - 132c: 62000513 li a0,1568 - 1330: b59d j 1196 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1332: fff7c693 not a3,a5 - 1336: 86fd srai a3,a3,0x1f - 1338: 8ff5 and a5,a5,a3 - 133a: bf55 j 12ee - pet.sleeping = !pet.sleeping; - 133c: 00944503 lbu a0,9(s0) - beep(pet.sleeping ? 440 : 660, 120); - 1340: 07800593 li a1,120 - pet.sleeping = !pet.sleeping; - 1344: 00153793 seqz a5,a0 - beep(pet.sleeping ? 440 : 660, 120); - 1348: 00a03533 snez a0,a0 - 134c: 40a00533 neg a0,a0 - 1350: 0dc57513 andi a0,a0,220 - pet.sleeping = !pet.sleeping; - 1354: 00f404a3 sb a5,9(s0) - beep(pet.sleeping ? 440 : 660, 120); - 1358: 1b850513 addi a0,a0,440 - 135c: bfb5 j 12d8 - pet.happy = clamp100(pet.happy + 5); - 135e: c3818713 addi a4,gp,-968 # 20000034 - 1362: 00140783 lb a5,1(s0) - pet.hygiene = 100; - 1366: 06400693 li a3,100 - pet.poop = 0; - 136a: 00040423 sb zero,8(s0) - pet.hygiene = 100; - 136e: 00d401a3 sb a3,3(s0) - pet.happy = clamp100(pet.happy + 5); - 1372: 0795 addi a5,a5,5 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1374: 02f6d063 bge a3,a5,1394 - 1378: 87b6 mv a5,a3 - beep(1319, 50); beep(1047, 50); - 137a: 03200593 li a1,50 - 137e: 52700513 li a0,1319 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1382: 00f700a3 sb a5,1(a4) - beep(1319, 50); beep(1047, 50); - 1386: 8aaff0ef jal 430 - 138a: 03200593 li a1,50 - 138e: 41700513 li a0,1047 - 1392: b799 j 12d8 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1394: fff7c693 not a3,a5 - 1398: 86fd srai a3,a3,0x1f - 139a: 8ff5 and a5,a5,a3 - 139c: bff9 j 137a - pet.health = clamp100(pet.health + 35); - 139e: 00440783 lb a5,4(s0) -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 13a2: 06400713 li a4,100 - pet.health = clamp100(pet.health + 35); - 13a6: 02378793 addi a5,a5,35 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 13aa: 02f75663 bge a4,a5,13d6 - 13ae: 87ba mv a5,a4 - beep(784, 60); beep(1047, 60); beep(1319, 90); - 13b0: 03c00593 li a1,60 - 13b4: 31000513 li a0,784 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 13b8: 00f40223 sb a5,4(s0) - beep(784, 60); beep(1047, 60); beep(1319, 90); - 13bc: 874ff0ef jal 430 - 13c0: 03c00593 li a1,60 - 13c4: 41700513 li a0,1047 - 13c8: 868ff0ef jal 430 - 13cc: 05a00593 li a1,90 - 13d0: 52700513 li a0,1319 - 13d4: b3c9 j 1196 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 13d6: fff7c713 not a4,a5 - 13da: 877d srai a4,a4,0x1f - 13dc: 8ff9 and a5,a5,a4 - 13de: bfc9 j 13b0 - screen = SCR_STATS; - 13e0: 4785 li a5,1 - 13e2: c2f18aa3 sb a5,-971(gp) # 20000031 - beep(659, 40); - 13e6: 02800593 li a1,40 - 13ea: 29300513 li a0,659 - 13ee: b5ed j 12d8 - screen = SCR_SETTINGS; - 13f0: 478d li a5,3 - 13f2: c2f18aa3 sb a5,-971(gp) # 20000031 - set_sel = 0; - 13f6: c20183a3 sb zero,-985(gp) # 20000023 - 13fa: b7f5 j 13e6 - uint32_t t = frame % 80; - 13fc: c201a283 lw t0,-992(gp) # 2000001c - 1400: 05000593 li a1,80 - 1404: 8516 mv a0,t0 - 1406: cc16 sw t0,24(sp) - 1408: ccdfe0ef jal d4 <__umodsi3> - px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 - 140c: 02700793 li a5,39 - 1410: 42e2 lw t0,24(sp) - 1412: 01e50313 addi t1,a0,30 - 1416: 00a7f663 bgeu a5,a0,1422 - 141a: 06e00793 li a5,110 - 141e: 40a78333 sub t1,a5,a0 - py = 14 + ((frame % 16) < 8 ? 0 : 1); - 1422: 0082f293 andi t0,t0,8 - 1426: 005032b3 snez t0,t0 - 142a: 02b9 addi t0,t0,14 - 142c: bbe5 j 1224 - if (pet.sleeping) return EXP_SLEEP; - 142e: 4752 lw a4,20(sp) - 1430: 4795 li a5,5 - 1432: e00712e3 bnez a4,1236 - if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) - 1436: 00440683 lb a3,4(s0) - 143a: 4775 li a4,29 - return EXP_SAD; - 143c: 478d li a5,3 - if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) - 143e: ded75ce3 bge a4,a3,1236 - 1442: 00140683 lb a3,1(s0) - 1446: 4761 li a4,24 - 1448: ded757e3 bge a4,a3,1236 - 144c: 00040683 lb a3,0(s0) - 1450: 474d li a4,19 - 1452: ded752e3 bge a4,a3,1236 - if ((frame % 50) < 4) return EXP_BLINK; - 1456: c201a503 lw a0,-992(gp) # 2000001c - 145a: 03200593 li a1,50 - 145e: ca16 sw t0,20(sp) - 1460: c81a sw t1,16(sp) - 1462: c73fe0ef jal d4 <__umodsi3> - 1466: 42d2 lw t0,20(sp) - 1468: 4342 lw t1,16(sp) - 146a: 00453793 sltiu a5,a0,4 - 146e: b3e1 j 1236 - ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); - 1470: 00149513 slli a0,s1,0x1 - 1474: 9526 add a0,a0,s1 - 1476: 4721 li a4,8 - 1478: 050a slli a0,a0,0x2 - 147a: 86ba mv a3,a4 - 147c: c0c18613 addi a2,gp,-1012 # 20000008 - 1480: 02600593 li a1,38 - 1484: 953a add a0,a0,a4 - for (uint8_t i = 0; i < pet.poop; i++) - 1486: 0485 addi s1,s1,1 - ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); - 1488: 9a6ff0ef jal 62e - for (uint8_t i = 0; i < pet.poop; i++) - 148c: 0ff4f493 zext.b s1,s1 - 1490: b3f9 j 125e - if (any_edge) { screen = SCR_MAIN; beep(880, 30); } - 1492: cb81 beqz a5,14a2 - 1494: 45f9 li a1,30 - 1496: 37000513 li a0,880 - 149a: c2018aa3 sb zero,-971(gp) # 20000031 - 149e: f93fe0ef jal 430 - ssd1306_setbuf(0); - 14a2: 8d3ff0ef jal d74 - draw_center_str(0, "-- STATUS --"); - 14a6: 6589 lui a1,0x2 - 14a8: 97058593 addi a1,a1,-1680 # 1970 - 14ac: 4501 li a0,0 - 14ae: 8e2ff0ef jal 590 - draw_bar(10, "FOOD", pet.satiety); - 14b2: 00040603 lb a2,0(s0) - 14b6: 6589 lui a1,0x2 - 14b8: 98058593 addi a1,a1,-1664 # 1980 - 14bc: 4529 li a0,10 - 14be: aaeff0ef jal 76c - draw_bar(19, "FUN ", pet.happy); - 14c2: 00140603 lb a2,1(s0) - 14c6: 6589 lui a1,0x2 - 14c8: 98858593 addi a1,a1,-1656 # 1988 - 14cc: 454d li a0,19 - 14ce: a9eff0ef jal 76c - draw_bar(28, "ENGY", pet.energy); - 14d2: 00240603 lb a2,2(s0) - 14d6: 6589 lui a1,0x2 - 14d8: 99058593 addi a1,a1,-1648 # 1990 - 14dc: 4571 li a0,28 - 14de: a8eff0ef jal 76c - draw_bar(37, "WASH", pet.hygiene); - 14e2: 00340603 lb a2,3(s0) - 14e6: 6589 lui a1,0x2 - 14e8: 99858593 addi a1,a1,-1640 # 1998 - 14ec: 02500513 li a0,37 - 14f0: a7cff0ef jal 76c - draw_bar(46, "HLTH", pet.health); - 14f4: 00440603 lb a2,4(s0) - 14f8: 6589 lui a1,0x2 - 14fa: 9a058593 addi a1,a1,-1632 # 19a0 - 14fe: 02e00513 li a0,46 - 1502: a6aff0ef jal 76c - snprintf(line, sizeof(line), "Age %u %s", pet.age_min, - 1506: 00944783 lbu a5,9(s0) - 150a: 00645683 lhu a3,6(s0) - 150e: c39d beqz a5,1534 - 1510: 6709 lui a4,0x2 - 1512: 93c70713 addi a4,a4,-1732 # 193c - 1516: 6609 lui a2,0x2 - 1518: 9a860613 addi a2,a2,-1624 # 19a8 - 151c: 45c5 li a1,17 - 151e: 1028 addi a0,sp,40 - 1520: 82dff0ef jal d4c - ssd1306_drawstr(0, 56, line, 1); - 1524: 4685 li a3,1 - 1526: 1030 addi a2,sp,40 - 1528: 03800593 li a1,56 - 152c: 4501 li a0,0 - 152e: e77fe0ef jal 3a4 - ssd1306_refresh(); - 1532: bbb5 j 12ae - snprintf(line, sizeof(line), "Age %u %s", pet.age_min, - 1534: 6709 lui a4,0x2 - 1536: 93870713 addi a4,a4,-1736 # 1938 - 153a: bff1 j 1516 - if (left_edge) { - 153c: c285 beqz a3,155c - set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS; - 153e: c271c503 lbu a0,-985(gp) # 20000023 - 1542: 85a6 mv a1,s1 - 1544: c83a sw a4,16(sp) - 1546: 0509 addi a0,a0,2 - 1548: bb1fe0ef jal f8 <__modsi3> - 154c: c2a183a3 sb a0,-985(gp) # 20000023 - beep(1047, 25); - 1550: 45e5 li a1,25 - 1552: 41700513 li a0,1047 - 1556: edbfe0ef jal 430 - 155a: 4742 lw a4,16(sp) - if (right_edge) { - 155c: cf11 beqz a4,1578 - set_sel = (set_sel + 1) % SETTINGS_ROWS; - 155e: c271c503 lbu a0,-985(gp) # 20000023 - 1562: 458d li a1,3 - 1564: 0505 addi a0,a0,1 - 1566: b93fe0ef jal f8 <__modsi3> - 156a: c2a183a3 sb a0,-985(gp) # 20000023 - beep(1047, 25); - 156e: 45e5 li a1,25 - 1570: 41700513 li a0,1047 - 1574: ebdfe0ef jal 430 - if (ok_edge) { - 1578: 4782 lw a5,0(sp) - 157a: cf95 beqz a5,15b6 - if (set_sel == 0) { // cycle screen-off timeout - 157c: c271c783 lbu a5,-985(gp) # 20000023 - 1580: ef81 bnez a5,1598 - timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; - 1582: c041c783 lbu a5,-1020(gp) # 20000000 - beep(880, 40); - 1586: 02800593 li a1,40 - timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; - 158a: 0785 addi a5,a5,1 - 158c: 8b8d andi a5,a5,3 - 158e: c0f18223 sb a5,-1020(gp) # 20000000 - beep(880, 30); - 1592: 37000513 li a0,880 - 1596: a831 j 15b2 - } else if (set_sel == 1) { // toggle sound - 1598: 4705 li a4,1 - 159a: 10e79263 bne a5,a4,169e - sound_on = !sound_on; - 159e: c061c783 lbu a5,-1018(gp) # 20000002 - beep(988, 60); // only audible if just enabled - 15a2: 03c00593 li a1,60 - 15a6: 3dc00513 li a0,988 - sound_on = !sound_on; - 15aa: 0017b793 seqz a5,a5 - 15ae: c0f18323 sb a5,-1018(gp) # 20000002 - beep(880, 30); - 15b2: e7ffe0ef jal 430 - ssd1306_setbuf(0); - 15b6: fbeff0ef jal d74 - draw_center_str(0, "- SETTINGS -"); - 15ba: 6589 lui a1,0x2 - 15bc: 9b458593 addi a1,a1,-1612 # 19b4 - 15c0: 4501 li a0,0 - 15c2: fcffe0ef jal 590 - 15c6: 08000613 li a2,128 - 15ca: 45a9 li a1,10 - 15cc: 4501 li a0,0 - 15ce: 920ff0ef jal 6ee - snprintf(rows[0], 17, "Screen off:%s", screen_timeout_names[timeout_idx]); - 15d2: c041c703 lbu a4,-1020(gp) # 20000000 - 15d6: 6789 lui a5,0x2 - 15d8: fa478793 addi a5,a5,-92 # 1fa4 - 15dc: 070a slli a4,a4,0x2 - 15de: 97ba add a5,a5,a4 - 15e0: 4394 lw a3,0(a5) - 15e2: 6609 lui a2,0x2 - 15e4: 9c460613 addi a2,a2,-1596 # 19c4 - 15e8: 45c5 li a1,17 - 15ea: 1028 addi a0,sp,40 - 15ec: f60ff0ef jal d4c - snprintf(rows[1], 17, "Sound: %s", sound_on ? "On" : "Off"); - 15f0: c061c783 lbu a5,-1018(gp) # 20000002 - 15f4: cbcd beqz a5,16a6 - 15f6: 6689 lui a3,0x2 - 15f8: 94068693 addi a3,a3,-1728 # 1940 - 15fc: 6609 lui a2,0x2 - 15fe: 9d460613 addi a2,a2,-1580 # 19d4 - 1602: 45c5 li a1,17 - 1604: 03910513 addi a0,sp,57 - 1608: f44ff0ef jal d4c - snprintf(rows[2], 17, "Back"); - 160c: 6589 lui a1,0x2 - 160e: 9e058593 addi a1,a1,-1568 # 19e0 - 1612: 04a10513 addi a0,sp,74 - 1616: f6aff0ef jal d80 - 161a: 4401 li s0,0 - 161c: 4481 li s1,0 - int y = 18 + r * 12; - 161e: 01240793 addi a5,s0,18 - 1622: c03e sw a5,0(sp) - if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1); - 1624: c271c683 lbu a3,-985(gp) # 20000023 - 1628: 0ff4f393 zext.b t2,s1 - 162c: 02769e63 bne a3,t2,1668 - 1630: 42a9 li t0,10 - 1632: 01b40593 addi a1,s0,27 - 1636: 405585b3 sub a1,a1,t0 - m=x; - 163a: 4301 li t1,0 - 163c: 851a mv a0,t1 - ssd1306_drawPixel(m++, n, color); - 163e: 4605 li a2,1 - 1640: 0305 addi t1,t1,1 - 1642: d016 sw t0,32(sp) - 1644: ce1e sw t2,28(sp) - 1646: cc36 sw a3,24(sp) - 1648: ca1a sw t1,20(sp) - 164a: c82e sw a1,16(sp) - 164c: d1dfe0ef jal 368 - while(w--) - 1650: 4352 lw t1,20(sp) - 1652: 08000613 li a2,128 - 1656: 45c2 lw a1,16(sp) - 1658: 46e2 lw a3,24(sp) - 165a: 43f2 lw t2,28(sp) - 165c: 5282 lw t0,32(sp) - 165e: fcc31fe3 bne t1,a2,163c - while(h--) - 1662: 12fd addi t0,t0,-1 - 1664: fc0297e3 bnez t0,1632 - ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1); - 1668: 00449613 slli a2,s1,0x4 - 166c: 4582 lw a1,0(sp) - 166e: 407686b3 sub a3,a3,t2 - 1672: 9626 add a2,a2,s1 - 1674: 103c addi a5,sp,40 - 1676: 00d036b3 snez a3,a3 - 167a: 963e add a2,a2,a5 - 167c: 4511 li a0,4 - 167e: d27fe0ef jal 3a4 - for (uint8_t r = 0; r < SETTINGS_ROWS; r++) { - 1682: 0431 addi s0,s0,12 - 1684: 02400693 li a3,36 - 1688: 0485 addi s1,s1,1 - 168a: f8d41ae3 bne s0,a3,161e - draw_center_str(56, "L/R move OK use"); - 168e: 6589 lui a1,0x2 - 1690: 9e858593 addi a1,a1,-1560 # 19e8 - 1694: 03800513 li a0,56 - draw_center_str(52, line); - 1698: ef9fe0ef jal 590 - 169c: b909 j 12ae - screen = SCR_MAIN; - 169e: c2018aa3 sb zero,-971(gp) # 20000031 - beep(880, 30); - 16a2: 45f9 li a1,30 - 16a4: b5fd j 1592 - snprintf(rows[1], 17, "Sound: %s", sound_on ? "On" : "Off"); - 16a6: 6689 lui a3,0x2 - 16a8: 94468693 addi a3,a3,-1724 # 1944 - 16ac: bf81 j 15fc - if (ok_edge) { // start a new pet - 16ae: 4782 lw a5,0(sp) - 16b0: cf99 beqz a5,16ce - pet_reset(); - 16b2: e19fe0ef jal 4ca + d7c: 45e5 li a1,25 + d7e: 41700513 li a0,1047 + d82: d94ff0ef jal 316 + if (ok_edge) { // born! boot the chosen species + d86: 4782 lw a5,0(sp) + d88: c3b5 beqz a5,dec + pet.satiety = 80; + d8a: 645a5737 lui a4,0x645a5 + d8e: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850> + d92: c4e1aa23 sw a4,-940(gp) # 20000050 + pet.health = 100; + d96: c5418793 addi a5,gp,-940 # 20000050 + d9a: 06400713 li a4,100 + d9e: 00e78223 sb a4,4(a5) + pet.species = sel_species; + da2: c3d1c703 lbu a4,-963(gp) # 20000039 + pet.age_min = 0; + da6: 00079323 sh zero,6(a5) + pet.xp = 0; + daa: 00079423 sh zero,8(a5) + pet.species = sel_species; + dae: 00e78523 sb a4,10(a5) + pet.level = 1; + db2: 4705 li a4,1 + db4: 00e785a3 sb a4,11(a5) + pet.form = FORM_PROC; + db8: 0007a623 sw zero,12(a5) + pet.alive = 1; + dbc: 00e78823 sb a4,16(a5) + cursor = 0; + dc0: c2018e23 sb zero,-964(gp) # 20000038 + evo_anim = 0; + dc4: c4018823 sb zero,-944(gp) # 2000004c + for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } + dc8: c401a423 sw zero,-952(gp) # 20000044 beep(659, 80); beep(988, 120); - 16b6: 05000593 li a1,80 - 16ba: 29300513 li a0,659 - 16be: d73fe0ef jal 430 - 16c2: 07800593 li a1,120 - 16c6: 3dc00513 li a0,988 - 16ca: d67fe0ef jal 430 + dcc: 05000593 li a1,80 + dd0: 29300513 li a0,659 + screen = SCR_MAIN; + dd4: c4e18223 sb a4,-956(gp) # 20000040 + for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } + dd8: c401a623 sw zero,-948(gp) # 20000048 + beep(659, 80); beep(988, 120); + ddc: d3aff0ef jal 316 + de0: 07800593 li a1,120 + de4: 3dc00513 li a0,988 + de8: d2eff0ef jal 316 ssd1306_setbuf(0); - 16ce: ea6ff0ef jal d74 - ssd1306_drawImage(48, 8, spr_grave, 32, 32, 0); - 16d2: 02000713 li a4,32 - 16d6: 6609 lui a2,0x2 - 16d8: 86ba mv a3,a4 - 16da: fb460613 addi a2,a2,-76 # 1fb4 - 16de: 45a1 li a1,8 - 16e0: 03000513 li a0,48 - 16e4: f4bfe0ef jal 62e - draw_center_str(44, "R.I.P."); - 16e8: 6589 lui a1,0x2 - 16ea: 9fc58593 addi a1,a1,-1540 # 19fc - 16ee: 02c00513 li a0,44 - 16f2: e9ffe0ef jal 590 - snprintf(line, sizeof(line), "lived %u min", pet.age_min); - 16f6: c3e1d683 lhu a3,-962(gp) # 2000003a - 16fa: 6609 lui a2,0x2 - 16fc: 45c5 li a1,17 - 16fe: a0460613 addi a2,a2,-1532 # 1a04 - 1702: 1028 addi a0,sp,40 - 1704: e48ff0ef jal d4c - draw_center_str(52, line); - 1708: 102c addi a1,sp,40 - 170a: 03400513 li a0,52 - 170e: b769 j 1698 + dec: 3911 jal a00 + draw_center_str(0, "~ $ adopt --pet"); + dee: 6589 lui a1,0x2 + df0: 9b858593 addi a1,a1,-1608 # 19b8 + df4: 4501 li a0,0 + df6: f16ff0ef jal 50c + if((x >= SSD1306_W) || (y >= SSD1306_H)) return; + dfa: 4685 li a3,1 + dfc: 08000613 li a2,128 + e00: 45a9 li a1,10 + e02: 4501 li a0,0 + e04: f62ff0ef jal 566 + ssd1306_drawImage(48, 13, species_frames[sel_species][EXP_IDLE], + e08: c3d1c403 lbu s0,-963(gp) # 20000039 + e0c: 6789 lui a5,0x2 + e0e: 54078793 addi a5,a5,1344 # 2540 + e12: 00341713 slli a4,s0,0x3 + e16: 8f01 sub a4,a4,s0 + e18: 070a slli a4,a4,0x2 + e1a: 97ba add a5,a5,a4 + e1c: 4390 lw a2,0(a5) + e1e: 02000713 li a4,32 + e22: 86ba mv a3,a4 + e24: 45b5 li a1,13 + e26: 03000513 li a0,48 + e2a: 94dff0ef jal 776 + p = s_cat(p, "< "); + e2e: 6589 lui a1,0x2 + e30: 9c858593 addi a1,a1,-1592 # 19c8 + e34: 1868 addi a0,sp,60 + e36: c6eff0ef jal 2a4 + p = s_cat(p, species_names[sel_species]); + e3a: 6789 lui a5,0x2 + e3c: 040a slli s0,s0,0x2 + e3e: 43478793 addi a5,a5,1076 # 2434 + e42: 97a2 add a5,a5,s0 + e44: 438c lw a1,0(a5) + e46: c5eff0ef jal 2a4 + p = s_cat(p, " >"); + e4a: 6589 lui a1,0x2 + e4c: 9cc58593 addi a1,a1,-1588 # 19cc + e50: c54ff0ef jal 2a4 + *p = 0; + e54: 00050023 sb zero,0(a0) + draw_center_str(47, line); + e58: 186c addi a1,sp,60 + e5a: 02f00513 li a0,47 + e5e: eaeff0ef jal 50c + draw_center_str(56, "L/R pick OK go"); + e62: 6589 lui a1,0x2 + e64: 9d058593 addi a1,a1,-1584 # 19d0 + draw_center_str(56, "OK: respawn"); + e68: 03800513 li a0,56 + e6c: a98d j 12de + if (left_edge) { + e6e: c185 beqz a1,e8e + cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; + e70: c3c1c503 lbu a0,-964(gp) # 20000038 + e74: 459d li a1,7 + e76: c236 sw a3,4(sp) + e78: 0519 addi a0,a0,6 + e7a: a7eff0ef jal f8 <__modsi3> + e7e: c2a18e23 sb a0,-964(gp) # 20000038 + beep(1047, 25); + e82: 45e5 li a1,25 + e84: 41700513 li a0,1047 + e88: c8eff0ef jal 316 + e8c: 4692 lw a3,4(sp) + if (right_edge) { + e8e: ce91 beqz a3,eaa + cursor = (cursor + 1) % ICON_COUNT; + e90: c3c1c503 lbu a0,-964(gp) # 20000038 + e94: 459d li a1,7 + e96: 0505 addi a0,a0,1 + e98: a60ff0ef jal f8 <__modsi3> + e9c: c2a18e23 sb a0,-964(gp) # 20000038 + beep(1047, 25); + ea0: 45e5 li a1,25 + ea2: 41700513 li a0,1047 + ea6: c70ff0ef jal 316 + if (ok_edge) do_action(cursor); + eaa: 4782 lw a5,0(sp) + eac: c5418493 addi s1,gp,-940 # 20000050 + eb0: 0e078e63 beqz a5,fac + switch (act) { + eb4: c3c1c783 lbu a5,-964(gp) # 20000038 + eb8: 4699 li a3,6 + eba: 0ef6e963 bltu a3,a5,fac + ebe: 6689 lui a3,0x2 + ec0: 078a slli a5,a5,0x2 + ec2: b8868693 addi a3,a3,-1144 # 1b88 + ec6: 97b6 add a5,a5,a3 + ec8: 439c lw a5,0(a5) + eca: 8782 jr a5 + pet.satiety = clamp100(pet.satiety + 30); + ecc: 00048783 lb a5,0(s1) +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + ed0: 06400713 li a4,100 + pet.satiety = clamp100(pet.satiety + 30); + ed4: 07f9 addi a5,a5,30 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + ed6: 04f75563 bge a4,a5,f20 + eda: 87ba mv a5,a4 + edc: 00f48023 sb a5,0(s1) + pet.hygiene = clamp100(pet.hygiene - 5); + ee0: 00348783 lb a5,3(s1) +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + ee4: 06400713 li a4,100 + pet.hygiene = clamp100(pet.hygiene - 5); + ee8: 17ed addi a5,a5,-5 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + eea: 04f75063 bge a4,a5,f2a + eee: 87ba mv a5,a4 + ef0: 00f481a3 sb a5,3(s1) +static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } + ef4: 4411 li s0,4 + ef6: c2818823 sb s0,-976(gp) # 2000002c + efa: 4731 li a4,12 + beep(880, 60); beep(1175, 80); + efc: 03c00593 li a1,60 + f00: 37000513 li a0,880 +static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } + f04: c2e18d23 sb a4,-966(gp) # 20000036 + beep(880, 60); beep(1175, 80); + f08: c0eff0ef jal 316 + f0c: 05000593 li a1,80 + f10: 49700513 li a0,1175 + beep(784, 60); beep(1047, 60); beep(1319, 90); + f14: c02ff0ef jal 316 + led_blink(); + f18: c6eff0ef jal 386 + add_xp(4); + f1c: 4511 li a0,4 + f1e: a069 j fa8 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + f20: fff7c713 not a4,a5 + f24: 877d srai a4,a4,0x1f + f26: 8ff9 and a5,a5,a4 + f28: bf55 j edc + f2a: fff7c713 not a4,a5 + f2e: 877d srai a4,a4,0x1f + f30: 8ff9 and a5,a5,a4 + f32: bf7d j ef0 + if (pet.energy < 15) { beep(220, 120); break; } // too tired + f34: 00248703 lb a4,2(s1) + f38: 47b9 li a5,14 + f3a: 00e7c963 blt a5,a4,f4c + f3e: 07800593 li a1,120 + f42: 0dc00513 li a0,220 + beep(659, 40); + f46: bd0ff0ef jal 316 + break; + f4a: a08d j fac + pet.happy = clamp100(pet.happy + 25); + f4c: 00148783 lb a5,1(s1) +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + f50: 06400693 li a3,100 + pet.happy = clamp100(pet.happy + 25); + f54: 07e5 addi a5,a5,25 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + f56: 38f6d763 bge a3,a5,12e4 + f5a: 87b6 mv a5,a3 + f5c: 00f480a3 sb a5,1(s1) + pet.energy = clamp100(pet.energy - 12); + f60: ff470793 addi a5,a4,-12 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + f64: 06400713 li a4,100 + f68: 00f75363 bge a4,a5,f6e + f6c: 87ba mv a5,a4 + f6e: 00f48123 sb a5,2(s1) +static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } + f72: 4709 li a4,2 + f74: c2e18823 sb a4,-976(gp) # 2000002c + beep(988, 60); beep(1319, 60); beep(1568, 90); + f78: 03c00593 li a1,60 +static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } + f7c: 4731 li a4,12 + beep(988, 60); beep(1319, 60); beep(1568, 90); + f7e: 3dc00513 li a0,988 +static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } + f82: c2e18d23 sb a4,-966(gp) # 20000036 + beep(988, 60); beep(1319, 60); beep(1568, 90); + f86: b90ff0ef jal 316 + f8a: 03c00593 li a1,60 + f8e: 52700513 li a0,1319 + f92: b84ff0ef jal 316 + f96: 62000513 li a0,1568 + f9a: 05a00593 li a1,90 + f9e: b78ff0ef jal 316 + led_blink(); + fa2: be4ff0ef jal 386 + add_xp(6); + fa6: 4519 li a0,6 + add_xp(4); + fa8: c08ff0ef jal 3b0 + ssd1306_setbuf(0); + fac: a55ff0ef jal a00 + draw_center_str(0, menu_labels[cursor]); + fb0: c3c1c783 lbu a5,-964(gp) # 20000038 + fb4: 4501 li a0,0 + fb6: d03e sw a5,32(sp) + fb8: 5702 lw a4,32(sp) + fba: 6789 lui a5,0x2 + fbc: 5c478793 addi a5,a5,1476 # 25c4 + fc0: 070a slli a4,a4,0x2 + fc2: 97ba add a5,a5,a4 + fc4: 438c lw a1,0(a5) + fc6: d46ff0ef jal 50c + if (pet.alive && pet.health < 30 && (frame & 8)) + fca: 0104c783 lbu a5,16(s1) + fce: c83e sw a5,16(sp) + fd0: c395 beqz a5,ff4 + fd2: 00448703 lb a4,4(s1) + fd6: 47f5 li a5,29 + fd8: 00e7ce63 blt a5,a4,ff4 + fdc: c341a783 lw a5,-972(gp) # 20000030 + fe0: 8ba1 andi a5,a5,8 + fe2: cb89 beqz a5,ff4 + ssd1306_drawstr(0, 0, "!", 1); + fe4: 6609 lui a2,0x2 + fe6: 4685 li a3,1 + fe8: 9e060613 addi a2,a2,-1568 # 19e0 + fec: 4581 li a1,0 + fee: 4501 li a0,0 + ff0: a28ff0ef jal 218 + bp = u_cat(bp, pet.level); + ff4: 00b4c583 lbu a1,11(s1) + *bp++ = 'L'; + ff8: 04c00793 li a5,76 + bp = u_cat(bp, pet.level); + ffc: 03510513 addi a0,sp,53 + *bp++ = 'L'; + 1000: 02f10a23 sb a5,52(sp) + bp = u_cat(bp, pet.level); + 1004: ab2ff0ef jal 2b6 + *bp = 0; + 1008: 00050023 sb zero,0(a0) + ssd1306_drawstr(SSD1306_W - 2 * 8, 0, badge, 1); + 100c: 4685 li a3,1 + 100e: 1850 addi a2,sp,52 + 1010: 4581 li a1,0 + 1012: 07000513 li a0,112 + 1016: a02ff0ef jal 218 + 101a: 4685 li a3,1 + 101c: 08000613 li a2,128 + 1020: 45a9 li a1,10 + 1022: 4501 li a0,0 + 1024: d42ff0ef jal 566 + if (pet.sleeping) { + 1028: 00f4c403 lbu s0,15(s1) + 102c: 38040463 beqz s0,13b4 + ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1); + 1030: 6609 lui a2,0x2 + 1032: 4685 li a3,1 + 1034: 9e460613 addi a2,a2,-1564 # 19e4 + 1038: 45b9 li a1,14 + 103a: 04e00513 li a0,78 + 103e: 9daff0ef jal 218 + ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1); + 1042: 6609 lui a2,0x2 + 1044: 4685 li a3,1 + 1046: 9e860613 addi a2,a2,-1560 # 19e8 + 104a: 45b1 li a1,12 + 104c: 05400513 li a0,84 + 1050: 9c8ff0ef jal 218 + 1054: 03000793 li a5,48 + 1058: c43e sw a5,8(sp) + px = 48; py = 16; + 105a: 47c1 li a5,16 + 105c: c03e sw a5,0(sp) + 105e: 03000793 li a5,48 + 1062: c23e sw a5,4(sp) + if (pet.form == FORM_CLAUDE) spr = spr_claude; + 1064: 00c4c783 lbu a5,12(s1) + 1068: 6609 lui a2,0x2 + 106a: 4c060613 addi a2,a2,1216 # 24c0 + 106e: c63e sw a5,12(sp) + 1070: 4732 lw a4,12(sp) + 1072: 478d li a5,3 + 1074: 02f70b63 beq a4,a5,10aa + else if (pet.form == FORM_GLITCH) spr = spr_glitch; + 1078: 46b2 lw a3,12(sp) + 107a: 4711 li a4,4 + 107c: 3ae68663 beq a3,a4,1428 + if (!pet.alive) return EXP_DEAD; + 1080: 4742 lw a4,16(sp) + else spr = species_frames[pet.species][current_expression()]; + 1082: 00a4c683 lbu a3,10(s1) + if (!pet.alive) return EXP_DEAD; + 1086: 4519 li a0,6 + 1088: c719 beqz a4,1096 + if (anim_timer) return anim_exp; + 108a: c3a1c703 lbu a4,-966(gp) # 20000036 + 108e: 34070f63 beqz a4,13ec + 1092: c301c503 lbu a0,-976(gp) # 2000002c + else spr = species_frames[pet.species][current_expression()]; + 1096: 00369793 slli a5,a3,0x3 + 109a: 8f95 sub a5,a5,a3 + 109c: 6709 lui a4,0x2 + 109e: 97aa add a5,a5,a0 + 10a0: 078a slli a5,a5,0x2 + 10a2: 54070713 addi a4,a4,1344 # 2540 + 10a6: 97ba add a5,a5,a4 + 10a8: 4390 lw a2,0(a5) + ssd1306_drawImage(x, y, spr, PANA_W, PANA_H, 0); + 10aa: 4582 lw a1,0(sp) + 10ac: 4522 lw a0,8(sp) + 10ae: 02000713 li a4,32 + 10b2: 86ba mv a3,a4 + 10b4: c832 sw a2,16(sp) + 10b6: ec0ff0ef jal 776 + if (spr != spr_claude && spr != spr_glitch && !pet.sleeping) + 10ba: 4642 lw a2,16(sp) + 10bc: 6789 lui a5,0x2 + 10be: 4c078793 addi a5,a5,1216 # 24c0 + 10c2: 10f60f63 beq a2,a5,11e0 + 10c6: 6789 lui a5,0x2 + 10c8: 44078793 addi a5,a5,1088 # 2440 + 10cc: 10f60a63 beq a2,a5,11e0 + 10d0: 10041863 bnez s0,11e0 + if (pet.form >= FORM_USER) { // shades + 10d4: 47b2 lw a5,12(sp) + 10d6: 14078263 beqz a5,121a + uint8_t cy = eye_cy[sp], lx = eye_lx[sp], rx = eye_rx[sp]; + 10da: 00a4c703 lbu a4,10(s1) + 10de: c0c18793 addi a5,gp,-1012 # 20000008 + 10e2: 97ba add a5,a5,a4 + 10e4: 0007c403 lbu s0,0(a5) + 10e8: c1418693 addi a3,gp,-1004 # 20000010 + 10ec: c1018793 addi a5,gp,-1008 # 2000000c + 10f0: 97ba add a5,a5,a4 + 10f2: 9736 add a4,a4,a3 + ssd1306_fillRect(x + lx - 3, y + cy - 2, 7, 4, 0); + 10f4: 0007c303 lbu t1,0(a5) + 10f8: 00074703 lbu a4,0(a4) + 10fc: 4682 lw a3,0(sp) + 10fe: 4792 lw a5,4(sp) + 1100: 461d li a2,7 + 1102: 00d702b3 add t0,a4,a3 + 1106: 979a add a5,a5,t1 + 1108: ffe28593 addi a1,t0,-2 + 110c: ffd78513 addi a0,a5,-3 + 1110: 4701 li a4,0 + 1112: 4691 li a3,4 + 1114: d61a sw t1,44(sp) + 1116: d416 sw t0,40(sp) + 1118: d22e sw a1,36(sp) + 111a: c83e sw a5,16(sp) + 111c: 8a4ff0ef jal 1c0 + ssd1306_fillRect(x + rx - 3, y + cy - 2, 7, 4, 0); + 1120: 4792 lw a5,4(sp) + 1122: 5592 lw a1,36(sp) + 1124: 4701 li a4,0 + 1126: 00878533 add a0,a5,s0 + 112a: 461d li a2,7 + 112c: 4691 li a3,4 + 112e: 1575 addi a0,a0,-3 + 1130: 890ff0ef jal 1c0 + if (rx - lx > 7) + 1134: 5332 lw t1,44(sp) + 1136: 471d li a4,7 + 1138: 47c2 lw a5,16(sp) + 113a: 40640633 sub a2,s0,t1 + 113e: 52a2 lw t0,40(sp) + 1140: 02c75263 bge a4,a2,1164 + ssd1306_drawFastHLine(x + lx + 4, y + cy - 1, rx - lx - 7, 0); + 1144: 00478513 addi a0,a5,4 + 1148: 07f00793 li a5,127 + 114c: 00a7cc63 blt a5,a0,1164 + 1150: fff28593 addi a1,t0,-1 + 1154: 03f00793 li a5,63 + 1158: 00b7c663 blt a5,a1,1164 + 115c: 4681 li a3,0 + 115e: 1665 addi a2,a2,-7 + 1160: c06ff0ef jal 566 + if (pet.form >= FORM_ROOT) { // gaming headset + mic boom + 1164: 4732 lw a4,12(sp) + 1166: 4785 li a5,1 + 1168: 0af70963 beq a4,a5,121a + ssd1306_drawLine(x + 3, y + 10, x + 9, y + 2, 0); + 116c: 4792 lw a5,4(sp) + 116e: 078d addi a5,a5,3 + 1170: d23e sw a5,36(sp) + 1172: 4782 lw a5,0(sp) + 1174: 5512 lw a0,36(sp) + 1176: 00a78413 addi s0,a5,10 + 117a: 4792 lw a5,4(sp) + 117c: 85a2 mv a1,s0 + 117e: 07a5 addi a5,a5,9 + 1180: d43e sw a5,40(sp) + 1182: 4782 lw a5,0(sp) + 1184: 5622 lw a2,40(sp) + 1186: 0789 addi a5,a5,2 + 1188: 86be mv a3,a5 + 118a: c83e sw a5,16(sp) + 118c: c1eff0ef jal 5aa + ssd1306_drawLine(x + 9, y + 2, x + 23, y + 2, 0); + 1190: 4792 lw a5,4(sp) + 1192: 46c2 lw a3,16(sp) + 1194: 5522 lw a0,40(sp) + 1196: 07dd addi a5,a5,23 + 1198: 863e mv a2,a5 + 119a: 85b6 mv a1,a3 + 119c: d63e sw a5,44(sp) + 119e: c0cff0ef jal 5aa + ssd1306_drawLine(x + 23, y + 2, x + 29, y + 10, 0); + 11a2: 4792 lw a5,4(sp) + 11a4: 45c2 lw a1,16(sp) + 11a6: 5532 lw a0,44(sp) + 11a8: 01d78613 addi a2,a5,29 + 11ac: 86a2 mv a3,s0 + 11ae: bfcff0ef jal 5aa + ssd1306_fillRect(x + 1, y + 12, 4, 7, 0); + 11b2: 4782 lw a5,0(sp) + 11b4: 469d li a3,7 + 11b6: 4611 li a2,4 + 11b8: 00c78593 addi a1,a5,12 + 11bc: 4792 lw a5,4(sp) + 11be: 4701 li a4,0 + 11c0: 00178513 addi a0,a5,1 + 11c4: ffdfe0ef jal 1c0 + ssd1306_drawLine(x + 3, y + 18, x + 10, y + 24, 0); + 11c8: 4782 lw a5,0(sp) + 11ca: 5512 lw a0,36(sp) + 11cc: 01878693 addi a3,a5,24 + 11d0: 4792 lw a5,4(sp) + 11d2: 00a78613 addi a2,a5,10 + 11d6: 4782 lw a5,0(sp) + 11d8: 01278593 addi a1,a5,18 + 11dc: bceff0ef jal 5aa + if (pet.form == FORM_CLAUDE) { + 11e0: 4732 lw a4,12(sp) + 11e2: 478d li a5,3 + 11e4: 02f71b63 bne a4,a5,121a + ssd1306_drawPixel(x - 2 + (frame & 3), y + 4, 1); + 11e8: c341a403 lw s0,-972(gp) # 20000030 + 11ec: 4782 lw a5,0(sp) + 11ee: 4605 li a2,1 + 11f0: 00347513 andi a0,s0,3 + 11f4: 00478593 addi a1,a5,4 + 11f8: 47a2 lw a5,8(sp) + 11fa: 1579 addi a0,a0,-2 + 11fc: 953e add a0,a0,a5 + 11fe: f87fe0ef jal 184 + ssd1306_drawPixel(x + PANA_W + (frame & 1), y + 10, 1); + 1202: 4782 lw a5,0(sp) + 1204: 00147513 andi a0,s0,1 + 1208: 02050513 addi a0,a0,32 + 120c: 00a78593 addi a1,a5,10 + 1210: 47a2 lw a5,8(sp) + 1212: 4605 li a2,1 + 1214: 953e add a0,a0,a5 + 1216: f6ffe0ef jal 184 + 121a: 4685 li a3,1 + 121c: 08000613 li a2,128 + 1220: 02e00593 li a1,46 + 1224: 4501 li a0,0 + 1226: b40ff0ef jal 566 + for (uint8_t i = 0; i < pet.poop; i++) + 122a: 4401 li s0,0 + 122c: 00e4c783 lbu a5,14(s1) + 1230: 20f46063 bltu s0,a5,1430 + 1234: 4401 li s0,0 + ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); + 1236: 6709 lui a4,0x2 + 1238: 59470713 addi a4,a4,1428 # 2594 + 123c: 00241793 slli a5,s0,0x2 + 1240: 97ba add a5,a5,a4 + 1242: 00341493 slli s1,s0,0x3 + 1246: 4390 lw a2,0(a5) + 1248: 94a2 add s1,s1,s0 + 124a: 4741 li a4,16 + 124c: 0486 slli s1,s1,0x1 + 124e: 86ba mv a3,a4 + 1250: 03000593 li a1,48 + 1254: 00148513 addi a0,s1,1 + 1258: d1eff0ef jal 776 + if (i == cursor) + 125c: 5702 lw a4,32(sp) + 125e: 0ff47793 zext.b a5,s0 + 1262: 00f71963 bne a4,a5,1274 + ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1); + 1266: 46c5 li a3,17 + 1268: 8636 mv a2,a3 + 126a: 02f00593 li a1,47 + 126e: 8526 mv a0,s1 + 1270: c4eff0ef jal 6be + for (uint8_t i = 0; i < ICON_COUNT; i++) { + 1274: 0405 addi s0,s0,1 + 1276: 479d li a5,7 + 1278: faf41fe3 bne s0,a5,1236 + if (evo_anim) draw_evo_banner(); // celebratory overlay on top + 127c: c501c783 lbu a5,-944(gp) # 2000004c + 1280: 2a078363 beqz a5,1526 + ssd1306_fillRect(6, 18, SSD1306_W - 12, 24, 0); + 1284: 4701 li a4,0 + 1286: 46e1 li a3,24 + 1288: 07400613 li a2,116 + 128c: 45c9 li a1,18 + 128e: 4519 li a0,6 + 1290: f31fe0ef jal 1c0 + ssd1306_drawRect(6, 18, SSD1306_W - 12, 24, 1); + 1294: 46e1 li a3,24 + 1296: 07400613 li a2,116 + 129a: 45c9 li a1,18 + 129c: 4519 li a0,6 + 129e: c20ff0ef jal 6be + draw_center_str(21, ">> evolving"); + 12a2: 6589 lui a1,0x2 + 12a4: 9ec58593 addi a1,a1,-1556 # 19ec + 12a8: 4555 li a0,21 + 12aa: a62ff0ef jal 50c + p = s_cat(p, "[ "); + 12ae: 6589 lui a1,0x2 + 12b0: 9f858593 addi a1,a1,-1544 # 19f8 + 12b4: 1868 addi a0,sp,60 + 12b6: feffe0ef jal 2a4 + p = s_cat(p, form_names[pet.form]); + 12ba: 47b2 lw a5,12(sp) + 12bc: 6709 lui a4,0x2 + 12be: 5b070713 addi a4,a4,1456 # 25b0 + 12c2: 078a slli a5,a5,0x2 + 12c4: 97ba add a5,a5,a4 + 12c6: 438c lw a1,0(a5) + 12c8: fddfe0ef jal 2a4 + p = s_cat(p, " ]"); + 12cc: 6589 lui a1,0x2 + 12ce: 9fc58593 addi a1,a1,-1540 # 19fc + 12d2: fd3fe0ef jal 2a4 + *p = 0; + 12d6: 00050023 sb zero,0(a0) + draw_center_str(31, b); + 12da: 186c addi a1,sp,60 + 12dc: 457d li a0,31 + draw_center_str(56, "OK: respawn"); + 12de: a2eff0ef jal 50c + 12e2: a491 j 1526 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 12e4: fff7c693 not a3,a5 + 12e8: 86fd srai a3,a3,0x1f + 12ea: 8ff5 and a5,a5,a3 + 12ec: b985 j f5c + pet.sleeping = !pet.sleeping; + 12ee: 00f4c503 lbu a0,15(s1) + beep(pet.sleeping ? 440 : 660, 120); + 12f2: 07800593 li a1,120 + pet.sleeping = !pet.sleeping; + 12f6: 00153793 seqz a5,a0 + beep(pet.sleeping ? 440 : 660, 120); + 12fa: 00a03533 snez a0,a0 + 12fe: 40a00533 neg a0,a0 + 1302: 0dc57513 andi a0,a0,220 + pet.sleeping = !pet.sleeping; + 1306: 00f487a3 sb a5,15(s1) + beep(pet.sleeping ? 440 : 660, 120); + 130a: 1b850513 addi a0,a0,440 + 130e: b925 j f46 + pet.happy = clamp100(pet.happy + 5); + 1310: 00148783 lb a5,1(s1) + pet.hygiene = 100; + 1314: 06400693 li a3,100 + pet.poop = 0; + 1318: 00048723 sb zero,14(s1) + pet.hygiene = 100; + 131c: 00d481a3 sb a3,3(s1) + pet.happy = clamp100(pet.happy + 5); + 1320: 0795 addi a5,a5,5 + 1322: c5418713 addi a4,gp,-940 # 20000050 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 1326: 02f6d363 bge a3,a5,134c + 132a: 87b6 mv a5,a3 + beep(1319, 50); beep(1047, 50); + 132c: 03200593 li a1,50 + 1330: 52700513 li a0,1319 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 1334: 00f700a3 sb a5,1(a4) + beep(1319, 50); beep(1047, 50); + 1338: fdffe0ef jal 316 + 133c: 41700513 li a0,1047 + 1340: 03200593 li a1,50 + 1344: fd3fe0ef jal 316 + add_xp(3); + 1348: 450d li a0,3 + 134a: b9b9 j fa8 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 134c: fff7c693 not a3,a5 + 1350: 86fd srai a3,a3,0x1f + 1352: 8ff5 and a5,a5,a3 + 1354: bfe1 j 132c + pet.health = clamp100(pet.health + 35); + 1356: 00448783 lb a5,4(s1) +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 135a: 06400713 li a4,100 + pet.health = clamp100(pet.health + 35); + 135e: 02378793 addi a5,a5,35 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 1362: 02f75663 bge a4,a5,138e + 1366: 87ba mv a5,a4 + beep(784, 60); beep(1047, 60); beep(1319, 90); + 1368: 03c00593 li a1,60 + 136c: 31000513 li a0,784 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 1370: 00f48223 sb a5,4(s1) + beep(784, 60); beep(1047, 60); beep(1319, 90); + 1374: fa3fe0ef jal 316 + 1378: 03c00593 li a1,60 + 137c: 41700513 li a0,1047 + 1380: f97fe0ef jal 316 + 1384: 05a00593 li a1,90 + 1388: 52700513 li a0,1319 + 138c: b661 j f14 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 138e: fff7c713 not a4,a5 + 1392: 877d srai a4,a4,0x1f + 1394: 8ff9 and a5,a5,a4 + 1396: bfc9 j 1368 + screen = SCR_STATS; + 1398: 4789 li a5,2 + 139a: c4f18223 sb a5,-956(gp) # 20000040 + beep(659, 40); + 139e: 02800593 li a1,40 + 13a2: 29300513 li a0,659 + 13a6: b645 j f46 + screen = SCR_SETTINGS; + 13a8: 4791 li a5,4 + 13aa: c4f18223 sb a5,-956(gp) # 20000040 + set_sel = 0; + 13ae: c2018da3 sb zero,-965(gp) # 20000037 + 13b2: b7f5 j 139e + uint32_t t = frame % 80; + 13b4: c341a783 lw a5,-972(gp) # 20000030 + 13b8: 05000593 li a1,80 + 13bc: 853e mv a0,a5 + 13be: c03e sw a5,0(sp) + 13c0: d15fe0ef jal d4 <__umodsi3> + px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 + 13c4: 02700713 li a4,39 + 13c8: 4782 lw a5,0(sp) + 13ca: 00a76d63 bltu a4,a0,13e4 + 13ce: 01e50713 addi a4,a0,30 + 13d2: c43a sw a4,8(sp) + 13d4: 4722 lw a4,8(sp) + py = 14 + ((frame % 16) < 8 ? 0 : 1); + 13d6: 8ba1 andi a5,a5,8 + 13d8: 00f037b3 snez a5,a5 + 13dc: 07b9 addi a5,a5,14 + 13de: c23a sw a4,4(sp) + 13e0: c03e sw a5,0(sp) + 13e2: b149 j 1064 + px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 + 13e4: 06e00713 li a4,110 + 13e8: 8f09 sub a4,a4,a0 + 13ea: b7e5 j 13d2 + if (pet.sleeping) return EXP_SLEEP; + 13ec: 4515 li a0,5 + 13ee: ca0414e3 bnez s0,1096 + if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) + 13f2: 00448603 lb a2,4(s1) + 13f6: 4775 li a4,29 + return EXP_SAD; + 13f8: 853e mv a0,a5 + if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) + 13fa: c8c75ee3 bge a4,a2,1096 + 13fe: 00148603 lb a2,1(s1) + 1402: 4761 li a4,24 + 1404: c8c759e3 bge a4,a2,1096 + 1408: 00048603 lb a2,0(s1) + 140c: 474d li a4,19 + 140e: c8c754e3 bge a4,a2,1096 + if ((frame % 50) < 4) return EXP_BLINK; + 1412: c341a503 lw a0,-972(gp) # 20000030 + 1416: 03200593 li a1,50 + 141a: c836 sw a3,16(sp) + 141c: cb9fe0ef jal d4 <__umodsi3> + 1420: 46c2 lw a3,16(sp) + 1422: 00453513 sltiu a0,a0,4 + 1426: b985 j 1096 + else if (pet.form == FORM_GLITCH) spr = spr_glitch; + 1428: 6609 lui a2,0x2 + 142a: 44060613 addi a2,a2,1088 # 2440 + 142e: b9b5 j 10aa + ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); + 1430: 00141513 slli a0,s0,0x1 + 1434: 9522 add a0,a0,s0 + 1436: 4721 li a4,8 + 1438: 050a slli a0,a0,0x2 + 143a: 86ba mv a3,a4 + 143c: c1818613 addi a2,gp,-1000 # 20000014 + 1440: 02600593 li a1,38 + 1444: 953a add a0,a0,a4 + for (uint8_t i = 0; i < pet.poop; i++) + 1446: 0405 addi s0,s0,1 + ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); + 1448: b2eff0ef jal 776 + for (uint8_t i = 0; i < pet.poop; i++) + 144c: 0ff47413 zext.b s0,s0 + 1450: bbf1 j 122c + if (any_edge) { screen = SCR_MAIN; beep(880, 30); } + 1452: cb89 beqz a5,1464 + 1454: 4785 li a5,1 + 1456: 45f9 li a1,30 + 1458: 37000513 li a0,880 + 145c: c4f18223 sb a5,-956(gp) # 20000040 + 1460: eb7fe0ef jal 316 + ssd1306_setbuf(0); + 1464: d9cff0ef jal a00 + draw_center_str(0, "~/pet $ stat"); + 1468: 6589 lui a1,0x2 + 146a: a0058593 addi a1,a1,-1536 # 1a00 + 146e: 4501 li a0,0 + draw_bar(10, "FOOD", pet.satiety); + 1470: c5418413 addi s0,gp,-940 # 20000050 + draw_center_str(0, "~/pet $ stat"); + 1474: 898ff0ef jal 50c + draw_bar(10, "FOOD", pet.satiety); + 1478: 00040603 lb a2,0(s0) + 147c: 6589 lui a1,0x2 + 147e: a1058593 addi a1,a1,-1520 # 1a10 + 1482: 4529 li a0,10 + 1484: a90ff0ef jal 714 + draw_bar(19, "HAPPY", pet.happy); + 1488: 00140603 lb a2,1(s0) + 148c: 6589 lui a1,0x2 + 148e: a1858593 addi a1,a1,-1512 # 1a18 + 1492: 454d li a0,19 + 1494: a80ff0ef jal 714 + draw_bar(28, "ENERGY", pet.energy); + 1498: 00240603 lb a2,2(s0) + 149c: 6589 lui a1,0x2 + 149e: a2058593 addi a1,a1,-1504 # 1a20 + 14a2: 4571 li a0,28 + 14a4: a70ff0ef jal 714 + draw_bar(37, "CLEAN", pet.hygiene); + 14a8: 00340603 lb a2,3(s0) + 14ac: 6589 lui a1,0x2 + 14ae: a2858593 addi a1,a1,-1496 # 1a28 + 14b2: 02500513 li a0,37 + 14b6: a5eff0ef jal 714 + draw_bar(46, "HEALTH", pet.health); + 14ba: 00440603 lb a2,4(s0) + 14be: 6589 lui a1,0x2 + 14c0: a3058593 addi a1,a1,-1488 # 1a30 + 14c4: 02e00513 li a0,46 + 14c8: a4cff0ef jal 714 + p = u_cat(p, pet.level); + 14cc: 00b44483 lbu s1,11(s0) + *p++ = 'L'; + 14d0: 04c00793 li a5,76 + p = u_cat(p, pet.level); + 14d4: 03d10513 addi a0,sp,61 + 14d8: 85a6 mv a1,s1 + *p++ = 'L'; + 14da: 02f10e23 sb a5,60(sp) + p = u_cat(p, pet.level); + 14de: dd9fe0ef jal 2b6 + p = s_cat(p, " xp "); + 14e2: 6589 lui a1,0x2 + 14e4: a3858593 addi a1,a1,-1480 # 1a38 + 14e8: dbdfe0ef jal 2a4 + if (pet.level < MAX_LEVEL) { + 14ec: 478d li a5,3 + 14ee: 0697e463 bltu a5,s1,1556 + p = u_cat(p, pet.xp); + 14f2: 00845583 lhu a1,8(s0) + p = u_cat(p, level_xp[pet.level]); + 14f6: 0486 slli s1,s1,0x1 + p = u_cat(p, pet.xp); + 14f8: dbffe0ef jal 2b6 + *p++ = '/'; + 14fc: 02f00793 li a5,47 + 1500: 00f50023 sb a5,0(a0) + p = u_cat(p, level_xp[pet.level]); + 1504: c2818793 addi a5,gp,-984 # 20000024 + 1508: 94be add s1,s1,a5 + 150a: 0004d583 lhu a1,0(s1) + 150e: 0505 addi a0,a0,1 + 1510: da7fe0ef jal 2b6 + *p = 0; + 1514: 00050023 sb zero,0(a0) + ssd1306_drawstr(0, 56, line, 1); + 1518: 4685 li a3,1 + 151a: 1870 addi a2,sp,60 + 151c: 03800593 li a1,56 + 1520: 4501 li a0,0 + 1522: cf7fe0ef jal 218 + ssd1306_refresh(); + 1526: d02ff0ef jal a28 + uint16_t timeout = screen_timeout_opts[timeout_idx]; + 152a: c041c703 lbu a4,-1020(gp) # 20000000 + 152e: c2018793 addi a5,gp,-992 # 2000001c + 1532: 0706 slli a4,a4,0x1 + 1534: 97ba add a5,a5,a4 + 1536: 0007d783 lhu a5,0(a5) + if (timeout && idle_frames >= timeout) { + 153a: f8078a63 beqz a5,cce + 153e: c401a703 lw a4,-960(gp) # 2000003c + 1542: f8f76663 bltu a4,a5,cce + ssd1306_cmd(SSD1306_DISPLAYOFF); + 1546: 0ae00513 li a0,174 + 154a: c06ff0ef jal 950 + disp_on = 0; + 154e: c00182a3 sb zero,-1019(gp) # 20000001 + 1552: f7cff06f j cce + p = s_cat(p, "MAX"); + 1556: 6589 lui a1,0x2 + 1558: a4058593 addi a1,a1,-1472 # 1a40 + 155c: d49fe0ef jal 2a4 + 1560: bf55 j 1514 + if (left_edge) { + 1562: c185 beqz a1,1582 + set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS; + 1564: c3b1c503 lbu a0,-965(gp) # 20000037 + 1568: 458d li a1,3 + 156a: c236 sw a3,4(sp) + 156c: 0509 addi a0,a0,2 + 156e: b8bfe0ef jal f8 <__modsi3> + 1572: c2a18da3 sb a0,-965(gp) # 20000037 + beep(1047, 25); + 1576: 45e5 li a1,25 + 1578: 41700513 li a0,1047 + 157c: d9bfe0ef jal 316 + 1580: 4692 lw a3,4(sp) + if (right_edge) { + 1582: ce91 beqz a3,159e + set_sel = (set_sel + 1) % SETTINGS_ROWS; + 1584: c3b1c503 lbu a0,-965(gp) # 20000037 + 1588: 458d li a1,3 + 158a: 0505 addi a0,a0,1 + 158c: b6dfe0ef jal f8 <__modsi3> + 1590: c2a18da3 sb a0,-965(gp) # 20000037 + beep(1047, 25); + 1594: 45e5 li a1,25 + 1596: 41700513 li a0,1047 + 159a: d7dfe0ef jal 316 + if (ok_edge) { + 159e: 4782 lw a5,0(sp) + 15a0: cf95 beqz a5,15dc + if (set_sel == 0) { // cycle screen-off timeout + 15a2: c3b1c703 lbu a4,-965(gp) # 20000037 + 15a6: ef01 bnez a4,15be + timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; + 15a8: c041c783 lbu a5,-1020(gp) # 20000000 + beep(880, 40); + 15ac: 02800593 li a1,40 + timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; + 15b0: 0785 addi a5,a5,1 + 15b2: 8b8d andi a5,a5,3 + 15b4: c0f18223 sb a5,-1020(gp) # 20000000 + beep(880, 30); + 15b8: 37000513 li a0,880 + 15bc: a831 j 15d8 + } else if (set_sel == 1) { // toggle sound + 15be: 4785 li a5,1 + 15c0: 0ef71963 bne a4,a5,16b2 + sound_on = !sound_on; + 15c4: c061c783 lbu a5,-1018(gp) # 20000002 + beep(988, 60); // only audible if just enabled + 15c8: 03c00593 li a1,60 + 15cc: 3dc00513 li a0,988 + sound_on = !sound_on; + 15d0: 0017b793 seqz a5,a5 + 15d4: c0f18323 sb a5,-1018(gp) # 20000002 + beep(880, 30); + 15d8: d3ffe0ef jal 316 + ssd1306_setbuf(0); + 15dc: c24ff0ef jal a00 + draw_center_str(0, "- SETTINGS -"); + 15e0: 6589 lui a1,0x2 + 15e2: a4458593 addi a1,a1,-1468 # 1a44 + 15e6: 4501 li a0,0 + 15e8: f25fe0ef jal 50c + 15ec: 4685 li a3,1 + 15ee: 08000613 li a2,128 + 15f2: 45a9 li a1,10 + 15f4: 4501 li a0,0 + 15f6: f71fe0ef jal 566 + *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; + 15fa: 6589 lui a1,0x2 + 15fc: a5458593 addi a1,a1,-1452 # 1a54 + 1600: 1868 addi a0,sp,60 + 1602: ca3fe0ef jal 2a4 + 1606: c041c703 lbu a4,-1020(gp) # 20000000 + 160a: 6789 lui a5,0x2 + 160c: 5e078793 addi a5,a5,1504 # 25e0 + 1610: 070a slli a4,a4,0x2 + 1612: 97ba add a5,a5,a4 + 1614: 438c lw a1,0(a5) + 1616: c8ffe0ef jal 2a4 + *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; + 161a: 6589 lui a1,0x2 + *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; + 161c: 00050023 sb zero,0(a0) + *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; + 1620: a6058593 addi a1,a1,-1440 # 1a60 + 1624: 04d10513 addi a0,sp,77 + 1628: c7dfe0ef jal 2a4 + 162c: c061c783 lbu a5,-1018(gp) # 20000002 + 1630: c7c9 beqz a5,16ba + 1632: 6589 lui a1,0x2 + 1634: 97c58593 addi a1,a1,-1668 # 197c + 1638: c6dfe0ef jal 2a4 + *s_cat(rows[2], "Back") = 0; + 163c: 6589 lui a1,0x2 + *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; + 163e: 00050023 sb zero,0(a0) + *s_cat(rows[2], "Back") = 0; + 1642: a6858593 addi a1,a1,-1432 # 1a68 + 1646: 05e10513 addi a0,sp,94 + 164a: c5bfe0ef jal 2a4 + 164e: 00050023 sb zero,0(a0) + 1652: 44c5 li s1,17 + 1654: 4401 li s0,0 + int y = 18 + r * 12; + 1656: 00148793 addi a5,s1,1 + 165a: c03e sw a5,0(sp) + if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1); + 165c: c3b1c303 lbu t1,-965(gp) # 20000037 + 1660: 0ff47293 zext.b t0,s0 + 1664: 00531e63 bne t1,t0,1680 + 1668: 4705 li a4,1 + 166a: 46a9 li a3,10 + 166c: 08000613 li a2,128 + 1670: 85a6 mv a1,s1 + 1672: 4501 li a0,0 + 1674: c216 sw t0,4(sp) + 1676: c01a sw t1,0(sp) + 1678: b49fe0ef jal 1c0 + 167c: 4292 lw t0,4(sp) + 167e: 4302 lw t1,0(sp) + ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1); + 1680: 00441613 slli a2,s0,0x4 + 1684: 405306b3 sub a3,t1,t0 + 1688: 9622 add a2,a2,s0 + 168a: 187c addi a5,sp,60 + 168c: 00148593 addi a1,s1,1 + 1690: 00d036b3 snez a3,a3 + 1694: 963e add a2,a2,a5 + 1696: 4511 li a0,4 + 1698: b81fe0ef jal 218 + for (uint8_t r = 0; r < SETTINGS_ROWS; r++) { + 169c: 04b1 addi s1,s1,12 + 169e: 03500713 li a4,53 + 16a2: 0405 addi s0,s0,1 + 16a4: fae499e3 bne s1,a4,1656 + draw_center_str(56, "L/R move OK use"); + 16a8: 6589 lui a1,0x2 + 16aa: a7058593 addi a1,a1,-1424 # 1a70 + 16ae: fbaff06f j e68 + screen = SCR_MAIN; + 16b2: c4f18223 sb a5,-956(gp) # 20000040 + beep(880, 30); + 16b6: 45f9 li a1,30 + 16b8: b701 j 15b8 + *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; + 16ba: 6589 lui a1,0x2 + 16bc: 98458593 addi a1,a1,-1660 # 1984 + 16c0: bfa5 j 1638 + if (ok_edge) { // back to the welcome screen to re-pick + 16c2: 4782 lw a5,0(sp) + 16c4: cf99 beqz a5,16e2 + beep(659, 80); beep(988, 120); + 16c6: 05000593 li a1,80 + 16ca: 29300513 li a0,659 + screen = SCR_SELECT; + 16ce: c4018223 sb zero,-956(gp) # 20000040 + beep(659, 80); beep(988, 120); + 16d2: c45fe0ef jal 316 + 16d6: 07800593 li a1,120 + 16da: 3dc00513 li a0,988 + 16de: c39fe0ef jal 316 + ssd1306_setbuf(0); + 16e2: b1eff0ef jal a00 + ssd1306_drawImage(48, 2, spr_grave, 32, 32, 0); + 16e6: 02000713 li a4,32 + 16ea: 6609 lui a2,0x2 + 16ec: 86ba mv a3,a4 + 16ee: 5f060613 addi a2,a2,1520 # 25f0 + 16f2: 4589 li a1,2 + 16f4: 03000513 li a0,48 + 16f8: 87eff0ef jal 776 + draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); + 16fc: c5418713 addi a4,gp,-940 # 20000050 + 1700: 00d74683 lbu a3,13(a4) + 1704: 4709 li a4,2 + 1706: c5418413 addi s0,gp,-940 # 20000050 + 170a: 02e69f63 bne a3,a4,1748 + 170e: 6589 lui a1,0x2 + 1710: 98858593 addi a1,a1,-1656 # 1988 + 1714: 02400513 li a0,36 + 1718: df5fe0ef jal 50c + p = s_cat(p, "core dumped L"); + 171c: 6589 lui a1,0x2 + 171e: a8458593 addi a1,a1,-1404 # 1a84 + 1722: 1868 addi a0,sp,60 + 1724: b81fe0ef jal 2a4 + p = u_cat(p, pet.level); + 1728: 00b44583 lbu a1,11(s0) + 172c: b8bfe0ef jal 2b6 + *p = 0; + 1730: 00050023 sb zero,0(a0) + draw_center_str(46, line); + 1734: 186c addi a1,sp,60 + 1736: 02e00513 li a0,46 + 173a: dd3fe0ef jal 50c + draw_center_str(56, "OK: respawn"); + 173e: 6589 lui a1,0x2 + 1740: a9458593 addi a1,a1,-1388 # 1a94 + 1744: f24ff06f j e68 + draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); + 1748: 6589 lui a1,0x2 + 174a: 99858593 addi a1,a1,-1640 # 1998 + 174e: b7d9 j 1714 pet.age_min++; - 1710: 00645683 lhu a3,6(s0) + 1750: 00645603 lhu a2,6(s0) pet.satiety = clamp100(pet.satiety - 1); - 1714: 00040783 lb a5,0(s0) + 1754: 00040783 lb a5,0(s0) tick_acc = 0; - 1718: c2019223 sh zero,-988(gp) # 20000020 + 1758: c2019c23 sh zero,-968(gp) # 20000034 pet.age_min++; - 171c: 0685 addi a3,a3,1 - 171e: 06c2 slli a3,a3,0x10 - 1720: 82c1 srli a3,a3,0x10 - 1722: 00d41323 sh a3,6(s0) + 175c: 0605 addi a2,a2,1 + 175e: 0642 slli a2,a2,0x10 + 1760: 8241 srli a2,a2,0x10 + 1762: 00c41323 sh a2,6(s0) pet.satiety = clamp100(pet.satiety - 1); - 1726: 17fd addi a5,a5,-1 + 1766: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1728: 06400713 li a4,100 + 1768: 06400713 li a4,100 if (pet.sleeping) { - 172c: 00944603 lbu a2,9(s0) + 176c: 00f44683 lbu a3,15(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1730: 08f75463 bge a4,a5,17b8 - 1734: 87ba mv a5,a4 - 1736: 07e2 slli a5,a5,0x18 + 1770: 08f75463 bge a4,a5,17f8 + 1774: 87ba mv a5,a4 + 1776: 07e2 slli a5,a5,0x18 pet.energy = clamp100(pet.energy + 6); - 1738: 00240703 lb a4,2(s0) + 1778: 00240703 lb a4,2(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 173c: 87e1 srai a5,a5,0x18 - 173e: 06400513 li a0,100 + 177c: 87e1 srai a5,a5,0x18 + 177e: 06400513 li a0,100 if (pet.sleeping) { - 1742: c649 beqz a2,17cc + 1782: c6c9 beqz a3,180c pet.energy = clamp100(pet.energy + 6); - 1744: 00670593 addi a1,a4,6 + 1784: 00670593 addi a1,a4,6 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1748: 06b55d63 bge a0,a1,17c2 - 174c: 85aa mv a1,a0 + 1788: 06b55d63 bge a0,a1,1802 + 178c: 85aa mv a1,a0 pet.satiety = clamp100(pet.satiety - 1); - 174e: 00f40023 sb a5,0(s0) + 178e: 00f40023 sb a5,0(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1752: 00b40123 sb a1,2(s0) + 1792: 00b40123 sb a1,2(s0) if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested - 1756: 05d00793 li a5,93 - 175a: 00e7d563 bge a5,a4,1764 - 175e: 000404a3 sb zero,9(s0) - 1762: 4601 li a2,0 + 1796: 05d00793 li a5,93 + 179a: 00e7d563 bge a5,a4,17a4 + 179e: 000407a3 sb zero,15(s0) + 17a2: 4681 li a3,0 if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); - 1764: 0016f713 andi a4,a3,1 - 1768: cb19 beqz a4,177e - 176a: 00340783 lb a5,3(s0) + 17a4: 00167713 andi a4,a2,1 + 17a8: cb19 beqz a4,17be + 17aa: 00340783 lb a5,3(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 176e: 06400593 li a1,100 + 17ae: 06400593 li a1,100 if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); - 1772: 17fd addi a5,a5,-1 + 17b2: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1774: 08f5da63 bge a1,a5,1808 - 1778: 87ae mv a5,a1 - 177a: 00f401a3 sb a5,3(s0) + 17b4: 08f5da63 bge a1,a5,1848 + 17b8: 87ae mv a5,a1 + 17ba: 00f401a3 sb a5,3(s0) if (!pet.sleeping && pet.poop < 3 && - 177e: 00844583 lbu a1,8(s0) - 1782: ea41 bnez a2,1812 - 1784: 4789 li a5,2 - 1786: 00b7ed63 bltu a5,a1,17a0 + 17be: 00e44583 lbu a1,14(s0) + 17c2: eac1 bnez a3,1852 + 17c4: 4789 li a5,2 + 17c6: 00b7ed63 bltu a5,a1,17e0 ((pet.age_min * 7u + frame) & 0x1F) == 0) - 178a: 00369793 slli a5,a3,0x3 - 178e: 8f95 sub a5,a5,a3 - 1790: c201a683 lw a3,-992(gp) # 2000001c - 1794: 97b6 add a5,a5,a3 - 1796: 8bfd andi a5,a5,31 + 17ca: 00361793 slli a5,a2,0x3 + 17ce: 8f91 sub a5,a5,a2 + 17d0: c341a603 lw a2,-972(gp) # 20000030 + 17d4: 97b2 add a5,a5,a2 + 17d6: 8bfd andi a5,a5,31 if (!pet.sleeping && pet.poop < 3 && - 1798: efad bnez a5,1812 + 17d8: efad bnez a5,1852 pet.poop++; - 179a: 0585 addi a1,a1,1 - 179c: 00b40423 sb a1,8(s0) + 17da: 0585 addi a1,a1,1 + 17dc: 00b40723 sb a1,14(s0) if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); - 17a0: cb35 beqz a4,1814 - 17a2: 00140783 lb a5,1(s0) + 17e0: cb35 beqz a4,1854 + 17e2: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 17a6: 06400693 li a3,100 + 17e6: 06400613 li a2,100 if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); - 17aa: 17fd addi a5,a5,-1 + 17ea: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 17ac: 12f6da63 bge a3,a5,18e0 - 17b0: 87b6 mv a5,a3 - 17b2: 00f400a3 sb a5,1(s0) - 17b6: a8b9 j 1814 - 17b8: fff7c713 not a4,a5 - 17bc: 877d srai a4,a4,0x1f - 17be: 8ff9 and a5,a5,a4 - 17c0: bf9d j 1736 - 17c2: fff5c513 not a0,a1 - 17c6: 857d srai a0,a0,0x1f - 17c8: 8de9 and a1,a1,a0 - 17ca: b751 j 174e + 17ec: 14f65363 bge a2,a5,1932 + 17f0: 87b2 mv a5,a2 + 17f2: 00f400a3 sb a5,1(s0) + 17f6: a8b9 j 1854 + 17f8: fff7c713 not a4,a5 + 17fc: 877d srai a4,a4,0x1f + 17fe: 8ff9 and a5,a5,a4 + 1800: bf9d j 1776 + 1802: fff5c513 not a0,a1 + 1806: 857d srai a0,a0,0x1f + 1808: 8de9 and a1,a1,a0 + 180a: b751 j 178e pet.satiety = clamp100(pet.satiety - 1); - 17cc: 00f40023 sb a5,0(s0) + 180c: 00f40023 sb a5,0(s0) pet.energy = clamp100(pet.energy - 1); - 17d0: fff70793 addi a5,a4,-1 + 1810: fff70793 addi a5,a4,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 17d4: 02f55063 bge a0,a5,17f4 - 17d8: 87aa mv a5,a0 - 17da: 00f40123 sb a5,2(s0) + 1814: 02f55063 bge a0,a5,1834 + 1818: 87aa mv a5,a0 + 181a: 00f40123 sb a5,2(s0) pet.happy = clamp100(pet.happy - 1); - 17de: 00140783 lb a5,1(s0) + 181e: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 17e2: 06400713 li a4,100 + 1822: 06400713 li a4,100 pet.happy = clamp100(pet.happy - 1); - 17e6: 17fd addi a5,a5,-1 + 1826: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 17e8: 00f75b63 bge a4,a5,17fe - 17ec: 87ba mv a5,a4 - 17ee: 00f400a3 sb a5,1(s0) - 17f2: bf8d j 1764 - 17f4: fff7c713 not a4,a5 - 17f8: 877d srai a4,a4,0x1f - 17fa: 8ff9 and a5,a5,a4 - 17fc: bff9 j 17da - 17fe: fff7c713 not a4,a5 - 1802: 877d srai a4,a4,0x1f - 1804: 8ff9 and a5,a5,a4 - 1806: b7e5 j 17ee - 1808: fff7c593 not a1,a5 - 180c: 85fd srai a1,a1,0x1f - 180e: 8fed and a5,a5,a1 - 1810: b7ad j 177a + 1828: 00f75b63 bge a4,a5,183e + 182c: 87ba mv a5,a4 + 182e: 00f400a3 sb a5,1(s0) + 1832: bf8d j 17a4 + 1834: fff7c713 not a4,a5 + 1838: 877d srai a4,a4,0x1f + 183a: 8ff9 and a5,a5,a4 + 183c: bff9 j 181a + 183e: fff7c713 not a4,a5 + 1842: 877d srai a4,a4,0x1f + 1844: 8ff9 and a5,a5,a4 + 1846: b7e5 j 182e + 1848: fff7c593 not a1,a5 + 184c: 85fd srai a1,a1,0x1f + 184e: 8fed and a5,a5,a1 + 1850: b7ad j 17ba if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); - 1812: f5d9 bnez a1,17a0 + 1852: f5d9 bnez a1,17e0 if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); - 1814: 00340483 lb s1,3(s0) - 1818: 47cd li a5,19 - 181a: 0097cd63 blt a5,s1,1834 - 181e: cb19 beqz a4,1834 - 1820: 00140783 lb a5,1(s0) + 1854: 00340603 lb a2,3(s0) + 1858: 47cd li a5,19 + 185a: 00c7cd63 blt a5,a2,1874 + 185e: cb19 beqz a4,1874 + 1860: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1824: 06400713 li a4,100 + 1864: 06400713 li a4,100 if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); - 1828: 17fd addi a5,a5,-1 + 1868: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 182a: 0cf75063 bge a4,a5,18ea - 182e: 87ba mv a5,a4 - 1830: 00f400a3 sb a5,1(s0) - int8_t lo = pet.satiety; - 1834: 00040583 lb a1,0(s0) - if (pet.happy < lo) lo = pet.happy; - 1838: 00140683 lb a3,1(s0) - if (pet.energy < lo) lo = pet.energy; - 183c: 00240703 lb a4,2(s0) + 186a: 0cf75963 bge a4,a5,193c + 186e: 87ba mv a5,a4 + 1870: 00f400a3 sb a5,1(s0) if (pet.hygiene < lo) lo = pet.hygiene; - 1840: 87a6 mv a5,s1 - 1842: 0095d363 bge a1,s1,1848 - 1846: 87ae mv a5,a1 - 1848: 01879613 slli a2,a5,0x18 - 184c: 8661 srai a2,a2,0x18 - 184e: 00c6d363 bge a3,a2,1854 - 1852: 87b6 mv a5,a3 - 1854: 01879613 slli a2,a5,0x18 - 1858: 8661 srai a2,a2,0x18 - 185a: 00c75363 bge a4,a2,1860 - 185e: 87ba mv a5,a4 - 1860: 01879613 slli a2,a5,0x18 - 1864: 8661 srai a2,a2,0x18 + 1874: 00044703 lbu a4,0(s0) + 1878: 87ba mv a5,a4 + 187a: 0762 slli a4,a4,0x18 + 187c: 8761 srai a4,a4,0x18 + 187e: 00e65363 bge a2,a4,1884 + 1882: 87b2 mv a5,a2 + 1884: 00144703 lbu a4,1(s0) + 1888: 01879593 slli a1,a5,0x18 + 188c: 85e1 srai a1,a1,0x18 + 188e: 01871613 slli a2,a4,0x18 + 1892: 8661 srai a2,a2,0x18 + 1894: 00b65363 bge a2,a1,189a + 1898: 87ba mv a5,a4 + 189a: 00244703 lbu a4,2(s0) + 189e: 01879593 slli a1,a5,0x18 + 18a2: 85e1 srai a1,a1,0x18 + 18a4: 01871613 slli a2,a4,0x18 + 18a8: 8661 srai a2,a2,0x18 + 18aa: 00b65363 bge a2,a1,18b0 + 18ae: 87ba mv a5,a4 + 18b0: 01879713 slli a4,a5,0x18 + 18b4: 8761 srai a4,a4,0x18 if (lo < 15) pet.health = clamp100(pet.health - 3); - 1866: 4539 li a0,14 - 1868: 00440783 lb a5,4(s0) - 186c: 08c54463 blt a0,a2,18f4 - 1870: 17f5 addi a5,a5,-3 + 18b6: 4639 li a2,14 + 18b8: 00440783 lb a5,4(s0) + 18bc: 08e64a63 blt a2,a4,1950 + 18c0: 17f5 addi a5,a5,-3 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1872: 06400613 li a2,100 - 1876: 08f65563 bge a2,a5,1900 - 187a: 87b2 mv a5,a2 - 187c: 00f40223 sb a5,4(s0) + 18c2: 06400713 li a4,100 + 18c6: 08f75063 bge a4,a5,1946 + 18ca: 87ba mv a5,a4 + 18cc: 00f40223 sb a5,4(s0) notify(N_FOOD, pet.satiety); - 1880: 4501 li a0,0 - 1882: c83a sw a4,16(sp) - 1884: c036 sw a3,0(sp) - 1886: c7dfe0ef jal 502 + 18d0: 00040583 lb a1,0(s0) + 18d4: 4501 li a0,0 + 18d6: ba9fe0ef jal 47e notify(N_FUN, pet.happy); - 188a: 4682 lw a3,0(sp) - 188c: 4505 li a0,1 - 188e: 85b6 mv a1,a3 - 1890: c73fe0ef jal 502 + 18da: 00140583 lb a1,1(s0) + 18de: 4505 li a0,1 + 18e0: b9ffe0ef jal 47e notify(N_ENGY, pet.energy); - 1894: 4742 lw a4,16(sp) - 1896: 4509 li a0,2 - 1898: 85ba mv a1,a4 - 189a: c69fe0ef jal 502 + 18e4: 00240583 lb a1,2(s0) + 18e8: 4509 li a0,2 + 18ea: b95fe0ef jal 47e notify(N_WASH, pet.hygiene); - 189e: 85a6 mv a1,s1 - 18a0: 450d li a0,3 - 18a2: c61fe0ef jal 502 + 18ee: 00340583 lb a1,3(s0) + 18f2: 450d li a0,3 + 18f4: b8bfe0ef jal 47e if (pet.health <= 0) { - 18a6: 00440783 lb a5,4(s0) - 18aa: fef04063 bgtz a5,108a + 18f8: 00440783 lb a5,4(s0) + 18fc: c0f04763 bgtz a5,d0a screen = SCR_DEAD; - 18ae: 4709 li a4,2 + 1900: 470d li a4,3 beep(330, 200); beep(247, 200); beep(165, 400); - 18b0: 0c800593 li a1,200 - 18b4: 14a00513 li a0,330 + 1902: 0c800593 li a1,200 + 1906: 14a00513 li a0,330 screen = SCR_DEAD; - 18b8: c2e18aa3 sb a4,-971(gp) # 20000031 + 190a: c4e18223 sb a4,-956(gp) # 20000040 pet.alive = 0; - 18bc: 00040523 sb zero,10(s0) + 190e: 00040823 sb zero,16(s0) beep(330, 200); beep(247, 200); beep(165, 400); - 18c0: b71fe0ef jal 430 - 18c4: 0c800593 li a1,200 - 18c8: 0f700513 li a0,247 - 18cc: b65fe0ef jal 430 - 18d0: 19000593 li a1,400 - 18d4: 0a500513 li a0,165 - 18d8: b59fe0ef jal 430 - 18dc: faeff06f j 108a + 1912: a05fe0ef jal 316 + 1916: 0c800593 li a1,200 + 191a: 0f700513 li a0,247 + 191e: 9f9fe0ef jal 316 + 1922: 19000593 li a1,400 + 1926: 0a500513 li a0,165 + 192a: 9edfe0ef jal 316 + 192e: bdcff06f j d0a static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 18e0: fff7c693 not a3,a5 - 18e4: 86fd srai a3,a3,0x1f - 18e6: 8ff5 and a5,a5,a3 - 18e8: b5e9 j 17b2 - 18ea: fff7c713 not a4,a5 - 18ee: 877d srai a4,a4,0x1f - 18f0: 8ff9 and a5,a5,a4 - 18f2: bf3d j 1830 + 1932: fff7c613 not a2,a5 + 1936: 867d srai a2,a2,0x1f + 1938: 8ff1 and a5,a5,a2 + 193a: bd65 j 17f2 + 193c: fff7c713 not a4,a5 + 1940: 877d srai a4,a4,0x1f + 1942: 8ff9 and a5,a5,a4 + 1944: b735 j 1870 + 1946: fff7c713 not a4,a5 + 194a: 877d srai a4,a4,0x1f + 194c: 8ff9 and a5,a5,a4 + 194e: bfbd j 18cc else if (lo > 50) pet.health = clamp100(pet.health + 2); - 18f4: 03200513 li a0,50 - 18f8: f8c554e3 bge a0,a2,1880 - 18fc: 0789 addi a5,a5,2 - 18fe: bf95 j 1872 + 1950: 03200613 li a2,50 + 1954: f6e65ee3 bge a2,a4,18d0 + 1958: 0789 addi a5,a5,2 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1900: fff7c613 not a2,a5 - 1904: 867d srai a2,a2,0x1f - 1906: 8ff1 and a5,a5,a2 - 1908: bf95 j 187c - 190a: 0000 unimp - 190c: 31647373 .insn 4, 0x31647373 - 1910: 5f363033 .insn 4, 0x5f363033 - 1914: 3269 jal 129e - 1916: 72655f63 bge a0,t1,2054 - 191a: 6f72 .insn 2, 0x6f72 - 191c: 2072 .insn 2, 0x2072 - 191e: 202d jal 1948 - 1920: 6974 .insn 2, 0x6974 - 1922: 656d lui a0,0x1b - 1924: 2074756f jal a0,4932a - 1928: 74696177 .insn 4, 0x74696177 - 192c: 6e69 lui t3,0x1a - 192e: 6f662067 .insn 4, 0x6f662067 - 1932: 2072 .insn 2, 0x2072 - 1934: 7325 lui t1,0xfffe9 - 1936: 0d0a slli s10,s10,0x2 - 1938: 0000 unimp - 193a: 0000 unimp - 193c: 7a5a .insn 2, 0x7a5a - 193e: 007a c.slli zero,0x1e - 1940: 00006e4f .insn 4, 0x6e4f - 1944: 0066664f .insn 4, 0x0066664f - 1948: 4150 lw a2,4(a0) - 194a: 414e lw sp,208(sp) - 194c: 43544f47 .insn 4, 0x43544f47 - 1950: 4948 lw a0,20(a0) - 1952: 0000 unimp - 1954: 7270 .insn 2, 0x7270 - 1956: 7365 lui t1,0xffff9 - 1958: 6e612073 .insn 4, 0x6e612073 - 195c: 2079 jal 19ea - 195e: 0079656b .insn 4, 0x0079656b - 1962: 0000 unimp - 1964: 0021 c.nop 8 - 1966: 0000 unimp - 1968: 007a c.slli zero,0x1e - 196a: 0000 unimp - 196c: 005a c.slli zero,0x16 - 196e: 0000 unimp - 1970: 2d2d jal 1faa - 1972: 5320 lw s0,96(a4) - 1974: 4154 lw a3,4(a0) - 1976: 5554 lw a3,44(a0) - 1978: 2d2d2053 .insn 4, 0x2d2d2053 - 197c: 0000 unimp - 197e: 0000 unimp - 1980: 4f46 lw t5,80(sp) - 1982: 0000444f .insn 4, 0x444f - 1986: 0000 unimp - 1988: 5546 lw a0,112(sp) - 198a: 204e .insn 2, 0x204e - 198c: 0000 unimp - 198e: 0000 unimp - 1990: 4e45 li t3,17 - 1992: 00005947 .insn 4, 0x5947 - 1996: 0000 unimp - 1998: 48534157 .insn 4, 0x48534157 - 199c: 0000 unimp - 199e: 0000 unimp - 19a0: 4c48 lw a0,28(s0) - 19a2: 4854 lw a3,20(s0) - 19a4: 0000 unimp + 195a: 06400713 li a4,100 + 195e: 00f75a63 bge a4,a5,1972 + 1962: 87ba mv a5,a4 + 1964: 00f40223 sb a5,4(s0) + if (lo > 50 && !pet.sleeping) add_xp(3); + 1968: f6a5 bnez a3,18d0 + 196a: 450d li a0,3 + 196c: a45fe0ef jal 3b0 + 1970: b785 j 18d0 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 1972: fff7c713 not a4,a5 + 1976: 877d srai a4,a4,0x1f + 1978: 8ff9 and a5,a5,a4 + 197a: b7ed j 1964 + 197c: 00006e4f .insn 4, 0x6e4f + 1980: 0000 unimp + 1982: 0000 unimp + 1984: 0066664f .insn 4, 0x0066664f + 1988: 2a2a .insn 2, 0x2a2a + 198a: 4320 lw s0,64(a4) + 198c: 5552524f .insn 4, 0x5552524f + 1990: 5450 lw a2,44(s0) + 1992: 4445 li s0,17 + 1994: 2a20 .insn 2, 0x2a20 + 1996: 002a c.slli zero,0xa + 1998: 46474553 .insn 4, 0x46474553 + 199c: 5541 li a0,-16 + 199e: 544c lw a1,44(s0) + 19a0: 2820 .insn 2, 0x2820 + 19a2: 3131 jal 15ae + 19a4: 0029 c.nop 10 19a6: 0000 unimp - 19a8: 6741 lui a4,0x10 - 19aa: 2065 jal 1a52 - 19ac: 7525 lui a0,0xfffe9 - 19ae: 2020 .insn 2, 0x2020 - 19b0: 7325 lui t1,0xfffe9 - 19b2: 0000 unimp - 19b4: 202d jal 19de - 19b6: 54544553 .insn 4, 0x54544553 - 19ba: 4e49 li t3,18 - 19bc: 2d205347 .insn 4, 0x2d205347 - 19c0: 0000 unimp - 19c2: 0000 unimp - 19c4: 65726353 .insn 4, 0x65726353 - 19c8: 6e65 lui t3,0x19 - 19ca: 6f20 .insn 2, 0x6f20 - 19cc: 6666 .insn 2, 0x6666 - 19ce: 253a .insn 2, 0x253a - 19d0: 00000073 ecall - 19d4: 6e756f53 .insn 4, 0x6e756f53 - 19d8: 3a64 .insn 2, 0x3a64 - 19da: 2520 .insn 2, 0x2520 - 19dc: 00000073 ecall - 19e0: 6142 .insn 2, 0x6142 - 19e2: 00006b63 bltu zero,zero,19f8 + 19a8: 7270 .insn 2, 0x7270 + 19aa: 7365 lui t1,0xffff9 + 19ac: 6e612073 .insn 4, 0x6e612073 + 19b0: 2079 jal 1a3e + 19b2: 0079656b .insn 4, 0x0079656b + 19b6: 0000 unimp + 19b8: 207e .insn 2, 0x207e + 19ba: 2024 .insn 2, 0x2024 + 19bc: 6461 lui s0,0x18 + 19be: 2074706f j 493c4 + 19c2: 2d2d jal 1ffc + 19c4: 6570 .insn 2, 0x6570 + 19c6: 0074 addi a3,sp,12 + 19c8: 203c .insn 2, 0x203c + 19ca: 0000 unimp + 19cc: 3e20 .insn 2, 0x3e20 + 19ce: 0000 unimp + 19d0: 2f4c .insn 2, 0x2f4c + 19d2: 2052 .insn 2, 0x2052 + 19d4: 6970 .insn 2, 0x6970 + 19d6: 20206b63 bltu zero,sp,1bec + 19da: 67204b4f .insn 4, 0x67204b4f + 19de: 0021006f j 119e0 + 19e2: 0000 unimp + 19e4: 007a c.slli zero,0x1e 19e6: 0000 unimp - 19e8: 2f4c .insn 2, 0x2f4c - 19ea: 2052 .insn 2, 0x2052 - 19ec: 6f6d lui t5,0x1b - 19ee: 6576 .insn 2, 0x6576 - 19f0: 2020 .insn 2, 0x2020 - 19f2: 75204b4f .insn 4, 0x75204b4f - 19f6: 00006573 .insn 4, 0x6573 + 19e8: 005a c.slli zero,0x16 + 19ea: 0000 unimp + 19ec: 3e3e .insn 2, 0x3e3e + 19ee: 6520 .insn 2, 0x6520 + 19f0: 6f76 .insn 2, 0x6f76 + 19f2: 766c .insn 2, 0x766c + 19f4: 6e69 lui t3,0x1a + 19f6: 205b0067 jr 517(s6) 19fa: 0000 unimp - 19fc: 2e52 .insn 2, 0x2e52 - 19fe: 2e49 jal 1d90 - 1a00: 2e50 .insn 2, 0x2e50 - 1a02: 0000 unimp - 1a04: 696c .insn 2, 0x696c - 1a06: 6576 .insn 2, 0x6576 - 1a08: 2064 .insn 2, 0x2064 - 1a0a: 7525 lui a0,0xfffe9 - 1a0c: 6d20 .insn 2, 0x6d20 - 1a0e: 6e69 lui t3,0x1a - 1a10: 0000 unimp - 1a12: 0000 unimp - 1a14: 6f6e .insn 2, 0x6f6e - 1a16: 2074 .insn 2, 0x2074 - 1a18: 7562 .insn 2, 0x7562 - 1a1a: 00007973 .insn 4, 0x7973 + 19fc: 5d20 lw s0,120(a0) + 19fe: 0000 unimp + 1a00: 2f7e .insn 2, 0x2f7e + 1a02: 6570 .insn 2, 0x6570 + 1a04: 2074 .insn 2, 0x2074 + 1a06: 2024 .insn 2, 0x2024 + 1a08: 74617473 .insn 4, 0x74617473 + 1a0c: 0000 unimp + 1a0e: 0000 unimp + 1a10: 4f46 lw t5,80(sp) + 1a12: 0000444f .insn 4, 0x444f + 1a16: 0000 unimp + 1a18: 4148 lw a0,4(a0) + 1a1a: 5050 lw a2,36(s0) + 1a1c: 0059 c.nop 22 1a1e: 0000 unimp - 1a20: 616d addi sp,sp,240 - 1a22: 72657473 .insn 4, 0x72657473 - 1a26: 6d20 .insn 2, 0x6d20 - 1a28: 0065646f jal s0,57a2e - 1a2c: 7274 .insn 2, 0x7274 - 1a2e: 6e61 lui t3,0x18 - 1a30: 74696d73 .insn 4, 0x74696d73 - 1a34: 6d20 .insn 2, 0x6d20 - 1a36: 0065646f jal s0,57a3c - 1a3a: 0000 unimp - 1a3c: 7874 .insn 2, 0x7874 - 1a3e: 6520 .insn 2, 0x6520 - 1a40: 706d c.lui zero,0xffffb - 1a42: 7974 .insn 2, 0x7974 - 1a44: 0000 unimp - 1a46: 0000 unimp - 1a48: 7274 .insn 2, 0x7274 - 1a4a: 6e61 lui t3,0x18 - 1a4c: 74696d73 .insn 4, 0x74696d73 - 1a50: 6320 .insn 2, 0x6320 - 1a52: 6c706d6f jal s10,8918 - 1a56: 7465 lui s0,0xffff9 - 1a58: 0065 c.nop 25 - 1a5a: 0000 unimp - 1a5c: 4546 lw a0,80(sp) - 1a5e: 4445 li s0,17 - 1a60: 0000 unimp - 1a62: 0000 unimp - 1a64: 4c50 lw a2,28(s0) - 1a66: 5941 li s2,-16 - 1a68: 0000 unimp - 1a6a: 0000 unimp - 1a6c: 45454c53 .insn 4, 0x45454c53 - 1a70: 0050 addi a2,sp,4 - 1a72: 0000 unimp - 1a74: 41454c43 .insn 4, 0x41454c43 - 1a78: 004e c.slli zero,0x13 - 1a7a: 0000 unimp - 1a7c: 4548 lw a0,12(a0) - 1a7e: 4c41 li s8,16 - 1a80: 0000 unimp + 1a20: 4e45 li t3,17 + 1a22: 5245 li tp,-15 + 1a24: 00005947 .insn 4, 0x5947 + 1a28: 41454c43 .insn 4, 0x41454c43 + 1a2c: 004e c.slli zero,0x13 + 1a2e: 0000 unimp + 1a30: 4548 lw a0,12(a0) + 1a32: 4c41 li s8,16 + 1a34: 4854 lw a3,20(s0) + 1a36: 0000 unimp + 1a38: 2020 .insn 2, 0x2020 + 1a3a: 7078 .insn 2, 0x7078 + 1a3c: 0020 addi s0,sp,8 + 1a3e: 0000 unimp + 1a40: 414d li sp,19 + 1a42: 0058 addi a4,sp,4 + 1a44: 202d jal 1a6e + 1a46: 54544553 .insn 4, 0x54544553 + 1a4a: 4e49 li t3,18 + 1a4c: 2d205347 .insn 4, 0x2d205347 + 1a50: 0000 unimp + 1a52: 0000 unimp + 1a54: 65726353 .insn 4, 0x65726353 + 1a58: 6e65 lui t3,0x19 + 1a5a: 6f20 .insn 2, 0x6f20 + 1a5c: 6666 .insn 2, 0x6666 + 1a5e: 003a c.slli zero,0xe + 1a60: 6e756f53 .insn 4, 0x6e756f53 + 1a64: 3a64 .insn 2, 0x3a64 + 1a66: 0020 addi s0,sp,8 + 1a68: 6142 .insn 2, 0x6142 + 1a6a: 00006b63 bltu zero,zero,1a80 + 1a6e: 0000 unimp + 1a70: 2f4c .insn 2, 0x2f4c + 1a72: 2052 .insn 2, 0x2052 + 1a74: 6f6d lui t5,0x1b + 1a76: 6576 .insn 2, 0x6576 + 1a78: 2020 .insn 2, 0x2020 + 1a7a: 75204b4f .insn 4, 0x75204b4f + 1a7e: 00006573 .insn 4, 0x6573 1a82: 0000 unimp - 1a84: 54415453 .insn 4, 0x54415453 - 1a88: 00000053 .insn 4, 0x0053 - 1a8c: 54544553 .insn 4, 0x54544553 - 1a90: 4e49 li t3,18 - 1a92: 00005347 .insn 4, 0x5347 - 1a96: 0000 unimp - 1a98: 3531 jal 18a4 - 1a9a: 30330073 .insn 4, 0x30330073 - 1a9e: 30360073 .insn 4, 0x30360073 - 1aa2: 114e0073 .insn 4, 0x114e0073 - 1aa6: 0000 unimp - 1aa8: 12c6 slli t0,t0,0x31 - 1aaa: 0000 unimp - 1aac: 133c addi a5,sp,424 + 1a84: 65726f63 bltu tp,s7,20e2 + 1a88: 6420 .insn 2, 0x6420 + 1a8a: 6d75 lui s10,0x1d + 1a8c: 6570 .insn 2, 0x6570 + 1a8e: 2064 .insn 2, 0x2064 + 1a90: 004c addi a1,sp,4 + 1a92: 0000 unimp + 1a94: 203a4b4f .insn 4, 0x203a4b4f + 1a98: 6572 .insn 2, 0x6572 + 1a9a: 77617073 .insn 4, 0x77617073 + 1a9e: 006e c.slli zero,0x1b + 1aa0: 6170 .insn 2, 0x6170 + 1aa2: 616e .insn 2, 0x616e + 1aa4: 63746f67 .insn 4, 0x63746f67 + 1aa8: 6968 .insn 2, 0x6968 + 1aaa: 7620 .insn 2, 0x7620 + 1aac: 0032 c.slli zero,0xc 1aae: 0000 unimp - 1ab0: 135e slli t1,t1,0x37 - 1ab2: 0000 unimp - 1ab4: 139e slli t2,t2,0x27 - 1ab6: 0000 unimp - 1ab8: 13e0 addi s0,sp,492 - 1aba: 0000 unimp - 1abc: 13f0 addi a2,sp,492 + 1ab0: 6f62 .insn 2, 0x6f62 + 1ab2: 6e69746f jal s0,99198 + 1ab6: 656b2067 .insn 4, 0x656b2067 + 1aba: 6e72 .insn 2, 0x6e72 + 1abc: 6c65 lui s8,0x19 + 1abe: 2e2e .insn 2, 0x2e2e + 1ac0: 0000 unimp + 1ac2: 0000 unimp + 1ac4: 6f6d lui t5,0x1b + 1ac6: 6e75 lui t3,0x1d + 1ac8: 2074 .insn 2, 0x2074 + 1aca: 7465702f .insn 4, 0x7465702f + 1ace: 2020 .insn 2, 0x2020 + 1ad0: 00006b6f jal s6,7ad0 + 1ad4: 77617073 .insn 4, 0x77617073 + 1ad8: 206e .insn 2, 0x206e + 1ada: 6c656873 .insn 4, 0x6c656873 + 1ade: 206c .insn 2, 0x206c + 1ae0: 6f20 .insn 2, 0x6f20 + 1ae2: 203e006b .insn 4, 0x203e006b + 1ae6: 2f2e .insn 2, 0x2f2e + 1ae8: 6174 .insn 2, 0x6174 + 1aea: 616d addi sp,sp,240 + 1aec: 63746f67 .insn 4, 0x63746f67 + 1af0: 6968 .insn 2, 0x6968 + 1af2: 005f 6853 6c65 .insn 6, 0x6c656853005f + 1af8: 006c addi a1,sp,12 + 1afa: 0000 unimp + 1afc: 6150 .insn 2, 0x6150 + 1afe: 6b6e .insn 2, 0x6b6e + 1b00: 0000006f j 1b00 + 1b04: 6d54 .insn 2, 0x6d54 + 1b06: 7875 lui a6,0xffffd + 1b08: 0000 unimp + 1b0a: 0000 unimp + 1b0c: 7270 .insn 2, 0x7270 + 1b0e: 0000636f jal t1,7b0e + 1b12: 0000 unimp + 1b14: 7375 lui t1,0xffffd + 1b16: 7265 lui tp,0xffff9 + 1b18: 0000 unimp + 1b1a: 0000 unimp + 1b1c: 6f72 .insn 2, 0x6f72 + 1b1e: 0000746f jal s0,8b1e + 1b22: 0000 unimp + 1b24: 75616c43 .insn 4, 0x75616c43 + 1b28: 6564 .insn 2, 0x6564 + 1b2a: 0000 unimp + 1b2c: 74696c67 .insn 4, 0x74696c67 + 1b30: 00006863 bltu zero,zero,1b40 + 1b34: 4546 lw a0,80(sp) + 1b36: 4445 li s0,17 + 1b38: 0000 unimp + 1b3a: 0000 unimp + 1b3c: 4c50 lw a2,28(s0) + 1b3e: 5941 li s2,-16 + 1b40: 0000 unimp + 1b42: 0000 unimp + 1b44: 45454c53 .insn 4, 0x45454c53 + 1b48: 0050 addi a2,sp,4 + 1b4a: 0000 unimp + 1b4c: 4548 lw a0,12(a0) + 1b4e: 4c41 li s8,16 + 1b50: 0000 unimp + 1b52: 0000 unimp + 1b54: 54415453 .insn 4, 0x54415453 + 1b58: 00000053 .insn 4, 0x0053 + 1b5c: 54544553 .insn 4, 0x54544553 + 1b60: 4e49 li t3,18 + 1b62: 00005347 .insn 4, 0x5347 + 1b66: 0000 unimp + 1b68: 3531 jal 1974 + 1b6a: 30330073 .insn 4, 0x30330073 + 1b6e: 30360073 .insn 4, 0x30360073 + 1b72: 0d4a0073 .insn 4, 0x0d4a0073 + 1b76: 0000 unimp + 1b78: 0e6e slli t3,t3,0x1b + 1b7a: 0000 unimp + 1b7c: 1452 slli s0,s0,0x34 + 1b7e: 0000 unimp + 1b80: 16c2 slli a3,a3,0x30 + 1b82: 0000 unimp + 1b84: 1562 slli a0,a0,0x38 + 1b86: 0000 unimp + 1b88: 0ecc addi a1,sp,852 + 1b8a: 0000 unimp + 1b8c: 0f34 addi a3,sp,920 + 1b8e: 0000 unimp + 1b90: 12ee slli t0,t0,0x3b + 1b92: 0000 unimp + 1b94: 1310 addi a2,sp,416 + 1b96: 0000 unimp + 1b98: 1356 slli t1,t1,0x35 + 1b9a: 0000 unimp + 1b9c: 1398 addi a4,sp,480 + 1b9e: 0000 unimp + 1ba0: 13a8 addi a0,sp,488 ... -00001ac0 : - 1ac0: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............? - 1ad0: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|.......... - -00001ae0 : - 1ae0: 0000 0000 0000 c000 c000 c000 c006 c006 ................ - 1af0: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... - -00001b00 : - 1b00: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. - 1b10: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ - -00001b20 : - 1b20: 0000 0000 8000 8000 c001 c001 f007 f80d ................ - 1b30: f80d f808 fc1d f80d f80f f80f f007 8000 ................ - -00001b40 : - 1b40: 0000 0000 0000 0004 000c 001c 0018 001c ................ - 1b50: 003c 001c 001e 001f e80f f007 8000 0000 <............... - -00001b60 : - 1b60: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ - 1b70: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. - -00001b80 : - 1b80: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. - 1b90: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... - -00001ba0 : +00001ba4 : ... - 1ba8: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1bb8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1bc8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1bd8: ff07 f0ff bb0f f8ee d70f f8f5 ef0f f8fb ................ - 1be8: d70f f8f5 bb1f fcee ff0f f8ff ff0f f8ff ................ - 1bf8: ff0f f8ff f00f f807 ff07 f0ff ff07 f0ff ................ - 1c08: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1c18: 1f00 00fc 0000 0080 ........ + 1bb0: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... + 1bc0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... + 1bd0: ff3f fc7f ff3f fc7f 073c 1c70 ff3f fc7f ?...?...<.p.?... + 1be0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... + 1bf0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... + 1c00: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'... + 1c10: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ............... + 1c20: 0000 0000 .... -00001c20 : +00001c24 : ... - 1c28: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1c38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1c48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1c58: ff07 f0ff ff0f f8ff ff0f f8ff ff0f f8ff ................ - 1c68: 010f 78c0 ff1f fcff ff0f f8ff ff0f f87f ...x............ - 1c78: fc0f f81f ff0f f87f ff07 f0ff ff07 f0ff ................ - 1c88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1c98: 1f00 00fc 0000 0080 ........ + 1c30: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... + 1c40: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... + 1c50: bf3f fc7e 1f3f 7c7c 0f3e 3c78 1f3f 7c7c ?.~.?.||>.x: +00001ca4 : ... - 1ca8: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1cb8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1cc8: ff1f f8ff ff0f f0ff ff03 e0ff ef07 f0fb ................ - 1cd8: 8307 f0e0 930f f8e4 110f 78c4 830f f8e0 ...........x.... - 1ce8: 830f f8e0 ef1f fcfb ff0f f87f fc0f f81f ................ - 1cf8: fc0f f81f f80f f80f fc07 f01f fc07 f01f ................ - 1d08: ff03 e07f ff01 c0ff ff00 80ff 7f00 00ff ................ - 1d18: 1f00 00fc 0000 0080 ........ + 1cb0: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... + 1cc0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... + 1cd0: 5f3f 7c7d af3e bc7a ff3f fc7f ff3f fc7f ?_}|>.z.?...?... + 1ce0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... + 1cf0: 033c 1c60 ff3f fc7f ff3f fc7f ff3f fc7f <.`.?...?...?... + 1d00: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'... + 1d10: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ............... + 1d20: 0000 0000 .... -00001d20 : +00001d24 : ... - 1d28: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1d38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1d48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1d58: ff07 f0ff ef0f f8fb 830f f8e0 930f f8e4 ................ - 1d68: 110f 78c4 831f fce0 830f f860 ec0f f81b ...x......`..... - 1d78: ff0f f87f fc0f f81f f707 f0f7 fb07 f0ef ................ - 1d88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1d98: 1f00 00fc 0000 0080 ........ + 1d30: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... + 1d40: ff3f fc7f ff3f fc7f ff3f fc7f bf3f fc7e ?...?...?...?.~. + 1d50: 1f3f 7c7c 0f3e 3c78 1f3f 7c7c bf3f fc7e ?.||>.x: +00001da4 : + 1da4: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. + 1db4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... + 1dc4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. + 1dd4: ff01 80ff ff03 c0ff ff03 c0ff db03 c0db ................ + 1de4: e703 c0e7 e703 c0e7 db03 c0db fd01 80df ................ + 1df4: fa01 80bf f700 007f 7f00 00fe ff01 c0ff ................ + 1e04: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ + 1e14: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ + +00001e24 : + 1e24: 0000 0080 1000 0088 1100 f088 3100 208c .............1. + 1e34: 3900 40dc 3b00 f0dc 7f00 00fe 7f00 00fe .9.@.;.......... + 1e44: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. + 1e54: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................ + 1e64: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................ + 1e74: fe01 807f ff00 00ff 7f00 00fe ff01 c0ff ................ + 1e84: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ + 1e94: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ + +00001ea4 : + 1ea4: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. + 1eb4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... + 1ec4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. + 1ed4: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................ + 1ee4: e703 c0e7 ff03 c0ff ff03 c0ff fc01 803f ..............?. + 1ef4: fd01 803f fc00 00bf 7c00 003e ff01 c0ff ..?......|>..... + 1f04: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ + 1f14: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ + +00001f24 : + 1f24: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. + 1f34: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... + 1f44: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. + 1f54: ff01 80ff 9f03 c0f9 e703 c0e7 ff03 c0ff ................ + 1f64: e703 c0e7 e703 c0e7 ff03 c0ff ff01 80ff ................ + 1f74: ff01 80ff fc00 003f 7b00 00de f701 c0ef ......?..{...... + 1f84: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ + 1f94: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ + +00001fa4 : + 1fa4: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. + 1fb4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... + 1fc4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. + 1fd4: ff01 80ff ff03 c0ff ff03 c0ff ef03 c0f7 ................ + 1fe4: e703 c0eb db03 c0db ff03 c0ff ff01 80ff ................ + 1ff4: f701 80ef f700 00ef 7b00 00de fc01 c03f .........{....?. + 2004: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ + 2014: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ + +00002024 : + 2024: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. + 2034: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... + 2044: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. + 2054: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................ + 2064: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................ + 2074: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?............. + 2084: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ + 2094: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ + +000020a4 : + 20a4: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. + 20b4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... + 20c4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. + 20d4: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................ + 20e4: e703 c0e7 ff03 c0ff ff03 c0ff ff01 80ff ................ + 20f4: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?............. + 2104: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ + 2114: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ + +00002124 : ... - 1da8: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1db8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1dc8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1dd8: ff07 f0ff ff0f f8ff ef0f f8fb d70f f8f5 ................ - 1de8: ff0f f8ff ff1f fcff ff0f f8ff f80f f80f ................ - 1df8: fb0f f8ef f70f f8f7 fc07 f01f ff07 f0ff ................ - 1e08: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1e18: 1f00 00fc 0000 0080 ........ + 2130: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ + 2140: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ + 2150: ff0f f0ff 010f f080 ff0f f0ff ff0f f0ff ................ + 2160: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ + 2170: ff0f f0ff f80f f00f ff0f f0ff ff0f f0ff ................ + 2180: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ + 2190: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ + 21a0: 7f00 00fe .... -00001e20 : +000021a4 : ... - 1e28: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1e38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1e48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1e58: ff07 f0ff ff0f f8ff ff0f f8ff 010f 78c0 ...............x - 1e68: ff0f f8ff ff1f fcff ff0f f87f fc0f f81f ................ - 1e78: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................ - 1e88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1e98: 1f00 00fc 0000 0080 ........ + 21b0: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ + 21c0: ff0f f0ff ff0f f0ff ff0f f0ff ef0f f0f7 ................ + 21d0: c70f f0e3 830f f0c1 c70f f0e3 ef0f f0f7 ................ + 21e0: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ + 21f0: ff0f f0ff ff0f f0ff ff0f f0ff f80f f01f ................ + 2200: c70f f0e3 ff0f f0ff ff07 e0ff 0700 00e0 ................ + 2210: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ + 2220: 7f00 00fe .... -00001ea0 : - 1ea0: 1a14 0000 1a20 0000 1a2c 0000 1a3c 0000 .... ...,...<... - 1eb0: 1a48 0000 H... - -00001eb4 : - 1eb4: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... - 1ec4: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... - -00001ed0 : +00002224 : ... - 1ed8: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1ee8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1ef8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1f08: ef07 f0fb 830f f8e0 930f f8e4 110f 78c4 ...............x - 1f18: 830f f8e0 831f fce0 ef0f f87b fc0f f81f ..........{..... - 1f28: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................ - 1f38: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1f48: 1f00 00fc 0000 0080 ........ + 2230: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ + 2240: ff0f f0ff ff0f f0ff ff0f f0ff df0f f0ef ................ + 2250: af0f f0d7 ff0f f0ff ff0f f0ff ff0f f0ff ................ + 2260: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ + 2270: c70f f0e3 f80f f01f ff0f f0ff ff0f f0ff ................ + 2280: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ + 2290: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ + 22a0: 7f00 00fe .... -00001f50 : - 1f50: 1b80 0000 1b60 0000 1b40 0000 1b20 0000 ....`...@... ... - 1f60: 1b00 0000 1ae0 0000 1ac0 0000 ............ - -00001f6c : - 1f6c: 1ed0 0000 1e20 0000 1da0 0000 1d20 0000 .... ....... ... - 1f7c: 1ca0 0000 1c20 0000 1ba0 0000 .... ....... - -00001f88 : - 1f88: 1a5c 0000 1a64 0000 1a6c 0000 1a74 0000 \...d...l...t... - 1f98: 1a7c 0000 1a84 0000 1a8c 0000 |........... - -00001fa4 : - 1fa4: 1a98 0000 1a9c 0000 1aa0 0000 1944 0000 ............D... - -00001fb4 : +000022a4 : ... - 1fbc: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................ - 1fcc: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3.. - 1fdc: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0.......... - 1fec: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?... - 1ffc: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................ - 200c: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................ + 22b0: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ + 22c0: ff0f f0ff ff0f f0ff ef0f f0f7 c70f f0e3 ................ + 22d0: 830f f0c1 c70f f0e3 ef0f f0f7 ff0f f0ff ................ + 22e0: ff0f f0ff ff0f f0ff ff0f f0ff 7f0f f0ff ................ + 22f0: bf0f f0ff df0f f0ff bf0f f0ff 780f f00f .............x.. + 2300: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ + 2310: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ + 2320: 7f00 00fe .... + +00002324 : + 2324: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............? + 2334: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|.......... + +00002344 : + 2344: 0000 0000 0000 c000 c000 c000 c006 c006 ................ + 2354: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... + +00002364 : + 2364: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. + 2374: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ + +00002384 : + 2384: 0000 0000 8000 8000 c001 c001 f007 f80d ................ + 2394: f80d f808 fc1d f80d f80f f80f f007 8000 ................ + +000023a4 : + 23a4: 0000 0000 0000 0004 000c 001c 0018 001c ................ + 23b4: 003c 001c 001e 001f e80f f007 8000 0000 <............... + +000023c4 : + 23c4: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ + 23d4: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. + +000023e4 : + 23e4: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. + 23f4: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... + +00002404 : + 2404: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... + 2414: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... + +00002420 : + 2420: 1aa0 0000 1ab0 0000 1ac4 0000 1ad4 0000 ................ + 2430: 1ae4 0000 .... + +00002434 : + 2434: 1af4 0000 1afc 0000 1b04 0000 ............ + +00002440 : + ... + 2450: 0000 0200 0000 0000 0000 0000 0000 0000 ................ + 2460: 0080 0080 0f00 00f8 1500 0054 ff00 80ff ..........T..... + 2470: ff01 c0ff ff03 e0ff 1101 4144 d707 f0f5 ..........DA.... + 2480: ef07 f0fb d707 f0f5 1105 5044 ff0f f8ff ..........DP.... + 2490: ff07 f0ff ff07 f0ff 5505 5055 ea07 f0ab .........UUP.... + 24a0: ff43 e0ff ff03 e0ff 5501 4055 ff00 80ff C........UU@.... + 24b0: 3f00 00fe 0f00 04f8 0020 0000 0000 0000 .?...... ....... + +000024c0 : + ... + 24c8: 0000 2000 0000 2000 0004 a800 000e 2000 ... ... ....... + 24d8: 0004 fe03 0000 2000 0000 a880 0f00 20f8 ....... ....... + 24e8: 3f00 20fe 7f00 00ff ff00 80ff ff01 c0ff .?. ............ + 24f8: ff01 c0ff ff03 e0ff f703 e0f7 f703 e0f7 ................ + 2508: e303 e0e3 f707 f0f7 f703 e0f7 ff03 e0ff ................ + 2518: ff03 e0ff e703 e0f3 f801 c00f ff01 c0ff ................ + 2528: ff00 80ff 7f00 00ff 3f00 00fe 0f00 00f8 .........?...... + 2538: 0000 0080 0000 0000 ........ + +00002540 : + 2540: 22a4 0000 22a4 0000 2224 0000 21a4 0000 ."..."..$"...!.. + 2550: 2224 0000 2124 0000 21a4 0000 20a4 0000 $"..$!...!... .. + 2560: 2024 0000 1fa4 0000 1f24 0000 1ea4 0000 $ ......$....... + 2570: 1e24 0000 1da4 0000 1d24 0000 1d24 0000 $.......$...$... + 2580: 1ca4 0000 1c24 0000 1ca4 0000 1ba4 0000 ....$........... + 2590: 1c24 0000 $... + +00002594 : + 2594: 23e4 0000 23c4 0000 23a4 0000 2384 0000 .#...#...#...#.. + 25a4: 2364 0000 2344 0000 2324 0000 d#..D#..$#.. + +000025b0 : + 25b0: 1b0c 0000 1b14 0000 1b1c 0000 1b24 0000 ............$... + 25c0: 1b2c 0000 ,... + +000025c4 : + 25c4: 1b34 0000 1b3c 0000 1b44 0000 1a28 0000 4...<...D...(... + 25d4: 1b4c 0000 1b54 0000 1b5c 0000 L...T...\... + +000025e0 : + 25e0: 1b68 0000 1b6c 0000 1b70 0000 1984 0000 h...l...p....... + +000025f0 : + ... + 25f8: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................ + 2608: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3.. + 2618: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0.......... + 2628: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?... + 2638: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................ + 2648: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................ ... -00002034 : +00002670 : ... - 203c: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~ - 204c: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8.. - 205c: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8 - 206c: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<........... - 207c: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 ..>....<~..~<. - 20cc: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{.... - 20dc: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a`<.|.. - 215c: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v. - 216c: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000... - 217c: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.l...... - 24cc: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|. - 24dc: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v. - 24ec: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~.. - 24fc: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|. - 250c: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f.. - 251c: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~.......... - 252c: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v. - 253c: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|. - 254c: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff. - 255c: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v........~.. - 256c: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>. - 257c: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................ - 258c: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j.. - 259c: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3.. - 25ac: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".". - 25bc: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w. - 25cc: 1818 1818 1818 1818 1818 1818 18f8 1818 ................ - 25dc: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666 - 25ec: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........ - 25fc: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666 - 260c: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666...... - 261c: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............ - 262c: 0000 0000 18f8 1818 1818 1818 001f 0000 ................ - 263c: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................ - 264c: 1818 1818 181f 1818 0000 0000 00ff 0000 ................ - 265c: 1818 1818 18ff 1818 1818 181f 181f 1818 ................ - 266c: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?... - 267c: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666...... - 268c: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666 - 269c: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666 - 26ac: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666.... - 26bc: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666 - 26cc: 3636 3636 003f 0000 1818 181f 001f 0000 6666?........... - 26dc: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666 - 26ec: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........ - 26fc: 1818 1818 00f8 0000 0000 0000 181f 1818 ................ - 270c: ffff ffff ffff ffff 0000 0000 ffff ffff ................ - 271c: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................ - 272c: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v. - 273c: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x............... - 274c: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`... - 275c: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|. - 276c: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.ff<...~..~.. - 279c: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0.. - 27ac: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|.............. - 27bc: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~. - 27cc: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~......... - 27dc: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~.... - 27ec: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8.... - 27fc: 0000 1800 0018 0000 0000 1800 0000 0000 ................ - 280c: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666... - 281c: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<.. + 2678: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~ + 2688: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8.. + 2698: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8 + 26a8: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<........... + 26b8: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 ..>....<~..~<. + 2708: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{.... + 2718: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a`<.|.. + 2798: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v. + 27a8: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000... + 27b8: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.l...... + 2b08: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|. + 2b18: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v. + 2b28: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~.. + 2b38: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|. + 2b48: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f.. + 2b58: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~.......... + 2b68: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v. + 2b78: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|. + 2b88: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff. + 2b98: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v........~.. + 2ba8: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>. + 2bb8: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................ + 2bc8: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j.. + 2bd8: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3.. + 2be8: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".". + 2bf8: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w. + 2c08: 1818 1818 1818 1818 1818 1818 18f8 1818 ................ + 2c18: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666 + 2c28: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........ + 2c38: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666 + 2c48: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666...... + 2c58: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............ + 2c68: 0000 0000 18f8 1818 1818 1818 001f 0000 ................ + 2c78: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................ + 2c88: 1818 1818 181f 1818 0000 0000 00ff 0000 ................ + 2c98: 1818 1818 18ff 1818 1818 181f 181f 1818 ................ + 2ca8: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?... + 2cb8: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666...... + 2cc8: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666 + 2cd8: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666 + 2ce8: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666.... + 2cf8: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666 + 2d08: 3636 3636 003f 0000 1818 181f 001f 0000 6666?........... + 2d18: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666 + 2d28: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........ + 2d38: 1818 1818 00f8 0000 0000 0000 181f 1818 ................ + 2d48: ffff ffff ffff ffff 0000 0000 ffff ffff ................ + 2d58: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................ + 2d68: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v. + 2d78: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x............... + 2d88: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`... + 2d98: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|. + 2da8: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.ff<...~..~.. + 2dd8: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0.. + 2de8: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|.............. + 2df8: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~. + 2e08: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~......... + 2e18: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~.... + 2e28: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8.... + 2e38: 0000 1800 0018 0000 0000 1800 0000 0000 ................ + 2e48: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666... + 2e58: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<.. ... diff --git a/tama.map b/tama.map index 59f7265..4066c3a 100644 --- a/tama.map +++ b/tama.map @@ -1,50 +1,65 @@ Archive member included to satisfy reference by file (symbol) ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) - /tmp/cczcSDec.ltrans0.ltrans.o (__divsi3) + /tmp/ccVfyVtG.ltrans0.ltrans.o (__divsi3) Discarded input sections - .text 0x00000000 0x0 /tmp/cczcSDec.ltrans0.ltrans.o - .data 0x00000000 0x0 /tmp/cczcSDec.ltrans0.ltrans.o - .bss 0x00000000 0x0 /tmp/cczcSDec.ltrans0.ltrans.o - .text.vprintf 0x00000000 0x16 /tmp/cczcSDec.ltrans0.ltrans.o - .text.sprintf 0x00000000 0x26 /tmp/cczcSDec.ltrans0.ltrans.o - .text.strncpy 0x00000000 0x1c /tmp/cczcSDec.ltrans0.ltrans.o - .text.strcmp 0x00000000 0x1a /tmp/cczcSDec.ltrans0.ltrans.o - .text.strncmp 0x00000000 0x2e /tmp/cczcSDec.ltrans0.ltrans.o - .text.strchr 0x00000000 0x16 /tmp/cczcSDec.ltrans0.ltrans.o - .text.strrchr 0x00000000 0x3c /tmp/cczcSDec.ltrans0.ltrans.o - .text.memcmp 0x00000000 0x20 /tmp/cczcSDec.ltrans0.ltrans.o - .text.memmove 0x00000000 0x5e /tmp/cczcSDec.ltrans0.ltrans.o - .text.memchr 0x00000000 0x1a /tmp/cczcSDec.ltrans0.ltrans.o - .text.strnlen 0x00000000 0x2a /tmp/cczcSDec.ltrans0.ltrans.o + .text 0x00000000 0x0 /tmp/ccVfyVtG.ltrans0.ltrans.o + .data 0x00000000 0x0 /tmp/ccVfyVtG.ltrans0.ltrans.o + .bss 0x00000000 0x0 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.mini_pad + 0x00000000 0x8a /tmp/ccVfyVtG.ltrans0.ltrans.o + .text._puts 0x00000000 0x40 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.mini_itoa.part.0 + 0x00000000 0xcc /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.__puts_uart + 0x00000000 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strlen 0x00000000 0x12 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.mini_vpprintf + 0x00000000 0x1d8 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.printf 0x00000000 0x2c /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.vprintf 0x00000000 0x16 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.mini_vsnprintf + 0x00000000 0x42 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.snprintf + 0x00000000 0x1c /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.sprintf 0x00000000 0x26 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strcpy 0x00000000 0x14 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strncpy 0x00000000 0x1c /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strcmp 0x00000000 0x1a /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strncmp 0x00000000 0x2e /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strchr 0x00000000 0x16 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strrchr 0x00000000 0x3c /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.memcmp 0x00000000 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.memmove 0x00000000 0x5e /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.memchr 0x00000000 0x1a /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strnlen 0x00000000 0x2a /tmp/ccVfyVtG.ltrans0.ltrans.o .text.twoway_strstr - 0x00000000 0x232 /tmp/cczcSDec.ltrans0.ltrans.o - .text.strstr 0x00000000 0x11c /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x232 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.strstr 0x00000000 0x11c /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.puts.str1.4 - 0x00000000 0x2 /tmp/cczcSDec.ltrans0.ltrans.o - .text.puts 0x00000000 0x40 /tmp/cczcSDec.ltrans0.ltrans.o - .text.setjmp 0x00000000 0x10 /tmp/cczcSDec.ltrans0.ltrans.o - .text.longjmp 0x00000000 0x14 /tmp/cczcSDec.ltrans0.ltrans.o - .text.putchar 0x00000000 0x68 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x2 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.puts 0x00000000 0x40 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.setjmp 0x00000000 0x10 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.longjmp 0x00000000 0x14 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.APBAHBPrescTable.lto_priv.0 - 0x00000000 0x10 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x10 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.ADCPrescTable.lto_priv.0 - 0x00000000 0x14 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x14 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.APBAHBPrescTable.lto_priv.1 - 0x00000000 0x10 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x10 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.ADCPrescTable.lto_priv.1 - 0x00000000 0x14 /tmp/cczcSDec.ltrans0.ltrans.o - .comment 0x00000000 0x35 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x14 /tmp/ccVfyVtG.ltrans0.ltrans.o + .comment 0x00000000 0x35 /tmp/ccVfyVtG.ltrans0.ltrans.o .note.GNU-stack - 0x00000000 0x0 /tmp/cczcSDec.ltrans0.ltrans.o - .comment 0x00000000 0x35 /tmp/ccb2Xekb.debug.temp.o + 0x00000000 0x0 /tmp/ccVfyVtG.ltrans0.ltrans.o + .comment 0x00000000 0x35 /tmp/ccZG4jMj.debug.temp.o .note.GNU-stack - 0x00000000 0x0 /tmp/ccb2Xekb.debug.temp.o - .comment 0x00000000 0x35 /tmp/ccR20L1X.debug.temp.o + 0x00000000 0x0 /tmp/ccZG4jMj.debug.temp.o + .comment 0x00000000 0x35 /tmp/ccYBrTfR.debug.temp.o .note.GNU-stack - 0x00000000 0x0 /tmp/ccR20L1X.debug.temp.o + 0x00000000 0x0 /tmp/ccYBrTfR.debug.temp.o .data 0x00000000 0x0 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) .bss 0x00000000 0x0 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) @@ -57,11 +72,11 @@ RAM 0x20000000 0x00000800 xrw Linker script and memory map -LOAD /tmp/ccShKeGc.o -LOAD /tmp/cczcSDec.ltrans0.ltrans.o -LOAD /tmp/ccb2Xekb.debug.temp.o -LOAD /tmp/ccR20L1X.debug.temp.o -LOAD /tmp/ccx6Ta0R.o +LOAD /tmp/ccEdiVvO.o +LOAD /tmp/ccVfyVtG.ltrans0.ltrans.o +LOAD /tmp/ccZG4jMj.debug.temp.o +LOAD /tmp/ccYBrTfR.debug.temp.o +LOAD /tmp/ccR7SLfL.o LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a @@ -69,14 +84,14 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a 0x00000000 _sinit = . 0x00000000 . = ALIGN (0x4) *(SORT_NONE(.init)) - .init 0x00000000 0x9e /tmp/cczcSDec.ltrans0.ltrans.o + .init 0x00000000 0x9e /tmp/ccVfyVtG.ltrans0.ltrans.o 0x00000000 InterruptVectorDefault 0x00000000 InterruptVector 0x000000a0 . = ALIGN (0x4) *fill* 0x0000009e 0x2 0x000000a0 _einit = . -.text 0x000000a0 0x2794 +.text 0x000000a0 0x2dd0 0x000000a0 . = ALIGN (0x4) *(.text) .text 0x000000a0 0x7e ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) @@ -86,361 +101,360 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a 0x000000d4 __umodsi3 0x000000f8 __modsi3 *(.text.*) - .text.mini_pad - 0x0000011e 0x8a /tmp/cczcSDec.ltrans0.ltrans.o - .text._puts 0x000001a8 0x40 /tmp/cczcSDec.ltrans0.ltrans.o - .text.PrintHex - 0x000001e8 0x5a /tmp/cczcSDec.ltrans0.ltrans.o .text.DelaySysTick - 0x00000242 0x12 /tmp/cczcSDec.ltrans0.ltrans.o - .text.mini_itoa.part.0 - 0x00000254 0xc0 /tmp/cczcSDec.ltrans0.ltrans.o + 0x0000011e 0x12 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.ssd1306_i2c_setup - 0x00000314 0x54 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000130 0x54 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.ssd1306_drawPixel - 0x00000368 0x3c /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000184 0x3c /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.ssd1306_fillRect + 0x000001c0 0x58 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.ssd1306_drawstr - 0x000003a4 0x8c /tmp/cczcSDec.ltrans0.ltrans.o - .text.beep 0x00000430 0x70 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000218 0x8c /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.s_cat 0x000002a4 0x12 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.u_cat 0x000002b6 0x60 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.beep 0x00000316 0x70 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.led_blink - 0x000004a0 0x2a /tmp/cczcSDec.ltrans0.ltrans.o - .text.pet_reset - 0x000004ca 0x38 /tmp/cczcSDec.ltrans0.ltrans.o - .text.notify 0x00000502 0x8e /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000386 0x2a /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.add_xp 0x000003b0 0xce /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.notify 0x0000047e 0x8e /tmp/ccVfyVtG.ltrans0.ltrans.o .text.draw_center_str - 0x00000590 0x28 /tmp/cczcSDec.ltrans0.ltrans.o + 0x0000050c 0x28 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.read_buttons - 0x000005b8 0x32 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000534 0x32 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.ssd1306_drawFastHLine.part.0 + 0x00000566 0x44 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.ssd1306_drawLine.constprop.0 + 0x000005aa 0xd0 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.ssd1306_drawFastVLine.constprop.0 - 0x000005ea 0x44 /tmp/cczcSDec.ltrans0.ltrans.o - .text.ssd1306_drawImage.constprop.0 - 0x0000062e 0xc0 /tmp/cczcSDec.ltrans0.ltrans.o - .text.ssd1306_drawFastHLine.part.0.constprop.0 - 0x000006ee 0x3e /tmp/cczcSDec.ltrans0.ltrans.o + 0x0000067a 0x44 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.ssd1306_drawRect.constprop.0 - 0x0000072c 0x40 /tmp/cczcSDec.ltrans0.ltrans.o + 0x000006be 0x56 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.draw_bar - 0x0000076c 0x7c /tmp/cczcSDec.ltrans0.ltrans.o - .text.internal_handle_input.constprop.0 - 0x000007e8 0xa /tmp/cczcSDec.ltrans0.ltrans.o - .text._write.constprop.0 - 0x000007f2 0xe4 /tmp/cczcSDec.ltrans0.ltrans.o - .text.__puts_uart - 0x000008d6 0x14 /tmp/cczcSDec.ltrans0.ltrans.o - .text.handle_reset - 0x000008ea 0x72 /tmp/cczcSDec.ltrans0.ltrans.o - 0x000008ea handle_reset - .text.vector_handler - 0x0000095c 0x62 /tmp/cczcSDec.ltrans0.ltrans.o - 0x0000095c OPCM_IRQHandler - 0x0000095c EXTI2_IRQHandler - 0x0000095c TIM8_TRG_COM_IRQHandler - 0x0000095c TIM8_CC_IRQHandler - 0x0000095c USART_WKUP_IRQHandler - 0x0000095c UART8_IRQHandler - 0x0000095c SPI4_IRQHandler - 0x0000095c NFC_IRQHandler - 0x0000095c DFSDM0_IRQHandler - 0x0000095c TIM1_CC_IRQHandler - 0x0000095c HardFault_Handler - 0x0000095c TIM10_IRQHandler - 0x0000095c GPIOB_IRQHandler - 0x0000095c IPC_CH2_Handler - 0x0000095c USBPD_IRQHandler - 0x0000095c TIM6_IRQHandler - 0x0000095c GPIOA_IRQHandler - 0x0000095c SysTick_Handler - 0x0000095c CAN3_RX1_IRQHandler - 0x0000095c I3C_ER_IRQHandler - 0x0000095c PVD_IRQHandler - 0x0000095c SDIO_IRQHandler - 0x0000095c TIM9_BRK_IRQHandler - 0x0000095c DMA2_Channel8_IRQHandler - 0x0000095c CAN2_RX1_IRQHandler - 0x0000095c EXTI3_IRQHandler - 0x0000095c HSEM_Handler - 0x0000095c UART1_IRQHandler - 0x0000095c USBHS_IRQHandler - 0x0000095c LPTIM2_IRQHandler - 0x0000095c DMA2_Channel9_IRQHandler - 0x0000095c TIM10_CC_IRQHandler - 0x0000095c EXTI25_16_IRQHandler - 0x0000095c I2C3_ER_IRQHandler - 0x0000095c USBFS_IRQHandler - 0x0000095c UART0_IRQHandler - 0x0000095c USART8_IRQHandler - 0x0000095c EXTI0_IRQHandler - 0x0000095c I2C2_EV_IRQHandler - 0x0000095c TIM10_TRG_COM_IRQHandler - 0x0000095c LPTIM_IRQHandler - 0x0000095c CAN1_RX0_IRQHandler - 0x0000095c CAN3_SCE_IRQHandler - 0x0000095c CAN2_SCE_IRQHandler - 0x0000095c ADC1_2_IRQHandler - 0x0000095c BB_IRQHandler - 0x0000095c Break_Point_Handler - 0x0000095c IPC_CH0_Handler - 0x0000095c TIM2_CC_IRQHandler - 0x0000095c SPI1_IRQHandler - 0x0000095c USART5_IRQHandler - 0x0000095c TAMPER_IRQHandler - 0x0000095c TMR0_IRQHandler - 0x0000095c AWU_IRQHandler - 0x0000095c EXTI7_0_IRQHandler - 0x0000095c CAN2_RX0_IRQHandler - 0x0000095c OSCWakeUp_IRQHandler - 0x0000095c TIM8_UP_IRQHandler - 0x0000095c Ecall_M_Mode_Handler - 0x0000095c ECDC_IRQHandler - 0x0000095c SDMMC_IRQHandler - 0x0000095c USART7_IRQHandler - 0x0000095c DMA2_Channel2_IRQHandler - 0x0000095c DMA1_Channel4_IRQHandler - 0x0000095c ADC1_IRQHandler - 0x0000095c TIM2_BRK_IRQHandler - 0x0000095c USART6_IRQHandler - 0x0000095c CAN3_RX0_IRQHandler - 0x0000095c HSADC_IRQHandler - 0x0000095c TIM9_UP_IRQHandler - 0x0000095c USART3_IRQHandler - 0x0000095c RTC_IRQHandler - 0x0000095c DMA1_Channel7_IRQHandler - 0x0000095c LED_IRQHandler - 0x0000095c CAN1_RX1_IRQHandler - 0x0000095c DVP_IRQHandler - 0x0000095c UART5_IRQHandler - 0x0000095c USBSS_IRQHandler - 0x0000095c SWPMI_IRQHandler - 0x0000095c USBPDWakeUp_IRQHandler - 0x0000095c EXTI15_8_IRQHandler - 0x0000095c TIM4_IRQHandler - 0x0000095c DMA2_Channel1_IRQHandler - 0x0000095c SWPMI_WKUP_IRQHandler - 0x0000095c USBPD_WKUP_IRQHandler - 0x0000095c I2C1_EV_IRQHandler - 0x0000095c USBSSWakeup_IRQHandler - 0x0000095c UART2_IRQHandler - 0x0000095c USART4_IRQHandler - 0x0000095c PWMX_IRQHandler - 0x0000095c DMA1_Channel6_IRQHandler - 0x0000095c UART4_IRQHandler - 0x0000095c DMA2_Channel4_IRQHandler - 0x0000095c TIM3_IRQHandler - 0x0000095c RCC_IRQHandler - 0x0000095c TIM1_TRG_COM_IRQHandler - 0x0000095c DMA1_Channel1_IRQHandler - 0x0000095c DMA2_Channel7_IRQHandler - 0x0000095c QSPI1_IRQHandler - 0x0000095c EXTI15_10_IRQHandler - 0x0000095c ADC_IRQHandler - 0x0000095c IPC_CH3_Handler - 0x0000095c DMA1_Channel8_IRQHandler - 0x0000095c I3C_EV_IRQHandler - 0x0000095c TMR2_IRQHandler - 0x0000095c I3C_WKUP_IRQHandler - 0x0000095c DefaultIRQHandler - 0x0000095c TIM12_IRQHandler - 0x0000095c TIM7_IRQHandler - 0x0000095c CAN2_TX_IRQHandler - 0x0000095c TIM5_IRQHandler - 0x0000095c I2C3_EV_IRQHandler - 0x0000095c USB_IRQHandler - 0x0000095c EXTI9_5_IRQHandler - 0x0000095c PIOC_IRQHandler - 0x0000095c TIM9_IRQHandler - 0x0000095c LTDC_IRQHandler - 0x0000095c SAI_IRQHandler - 0x0000095c SPI2_IRQHandler - 0x0000095c OSC32KCal_IRQHandler - 0x0000095c IPC_CH1_Handler - 0x0000095c I2C_IRQHandler - 0x0000095c LPTIM1_WKUP_IRQHandler - 0x0000095c TIM10_BRK_IRQHandler - 0x0000095c TIM9_CC_IRQHandler - 0x0000095c CAN1_TX_IRQHandler - 0x0000095c DMA2_Channel5_IRQHandler - 0x0000095c USB2_IRQHandler - 0x0000095c USBHSWakeUp_IRQHandler - 0x0000095c DMA1_Channel5_IRQHandler - 0x0000095c EXTI4_IRQHandler - 0x0000095c USB_LP_CAN1_RX0_IRQHandler - 0x0000095c QSPI2_IRQHandler - 0x0000095c RNG_IRQHandler - 0x0000095c USB_HP_CAN1_TX_IRQHandler - 0x0000095c LLE_IRQHandler - 0x0000095c CMPWakeUp_IRQHandler - 0x0000095c DMA1_Channel3_IRQHandler - 0x0000095c FSMC_IRQHandler - 0x0000095c ETH_IRQHandler - 0x0000095c TIM1_UP_IRQHandler - 0x0000095c LPTIMWakeUp_IRQHandler - 0x0000095c WWDG_IRQHandler - 0x0000095c USBHSWakeup_IRQHandler - 0x0000095c DMA2_Channel11_IRQHandler - 0x0000095c WDOG_BAT_IRQHandler - 0x0000095c Ecall_U_Mode_Handler - 0x0000095c I2C4_EV_IRQHandler - 0x0000095c CAN3_TX_IRQHandler - 0x0000095c TMR3_IRQHandler - 0x0000095c DMA2_Channel6_IRQHandler - 0x0000095c TIM2_IRQHandler - 0x0000095c SW_Handler - 0x0000095c TIM1_BRK_IRQHandler - 0x0000095c GPHA_IRQHandler - 0x0000095c OPA_IRQHandler - 0x0000095c DMA2_Channel10_IRQHandler - 0x0000095c EXTI1_IRQHandler - 0x0000095c SPI0_IRQHandler - 0x0000095c USB2_HOST_IRQHandler - 0x0000095c LPTIM2_WKUP_IRQHandler - 0x0000095c RTCAlarm_IRQHandler - 0x0000095c TIM11_IRQHandler - 0x0000095c TIM10_UP_IRQHandler - 0x0000095c TIM9_TRG_COM_IRQHandler - 0x0000095c UART7_IRQHandler - 0x0000095c USART2_IRQHandler - 0x0000095c UART6_IRQHandler - 0x0000095c UHSIF_IRQHandler - 0x0000095c ETHWakeUp_IRQHandler - 0x0000095c I2C2_ER_IRQHandler - 0x0000095c DMA1_Channel2_IRQHandler - 0x0000095c TIM8_BRK_IRQHandler - 0x0000095c TIM2_TRG_IRQHandler - 0x0000095c CAN1_SCE_IRQHandler - 0x0000095c FLASH_IRQHandler - 0x0000095c USBFSWakeUp_IRQHandler - 0x0000095c USART1_IRQHandler - 0x0000095c OTG_FS_IRQHandler - 0x0000095c SPI3_IRQHandler - 0x0000095c USBFS_WakeUp_IRQHandler - 0x0000095c UART3_IRQHandler - 0x0000095c I2C1_ER_IRQHandler - 0x0000095c FMC_IRQHandler - 0x0000095c USB2_DEVICE_IRQHandler - 0x0000095c LPTIM1_IRQHandler - 0x0000095c DFSDM1_IRQHandler - 0x0000095c TMR1_IRQHandler - 0x0000095c I2C4_ER_IRQHandler - 0x0000095c SERDES_IRQHandler - 0x0000095c USBSS_LINK_IRQHandler - 0x0000095c USBWakeUp_IRQHandler - 0x0000095c DMA2_Channel3_IRQHandler - 0x000009b0 NMI_Handler - 0x000009b0 NMI_RCC_CSS_IRQHandler - .text.strlen 0x000009be 0x12 /tmp/cczcSDec.ltrans0.ltrans.o - 0x000009be strlen - .text.mini_vpprintf - 0x000009d0 0x1c2 /tmp/cczcSDec.ltrans0.ltrans.o - .text.printf 0x00000b92 0x24 /tmp/cczcSDec.ltrans0.ltrans.o - 0x00000b92 printf - .text.ssd1306_i2c_error.isra.0 - 0x00000bb6 0x20 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000714 0x62 /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.ssd1306_drawImage.constprop.0 + 0x00000776 0xc0 /tmp/ccVfyVtG.ltrans0.ltrans.o .text.ssd1306_i2c_send.constprop.0 - 0x00000bd6 0x122 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000836 0x11a /tmp/ccVfyVtG.ltrans0.ltrans.o .text.ssd1306_cmd - 0x00000cf8 0x1c /tmp/cczcSDec.ltrans0.ltrans.o - .text.mini_vsnprintf - 0x00000d14 0x38 /tmp/cczcSDec.ltrans0.ltrans.o - .text.snprintf - 0x00000d4c 0x16 /tmp/cczcSDec.ltrans0.ltrans.o - 0x00000d4c snprintf - .text.memset 0x00000d62 0x12 /tmp/cczcSDec.ltrans0.ltrans.o - 0x00000d62 memset + 0x00000950 0x1c /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.handle_reset + 0x0000096c 0x72 /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x0000096c handle_reset + .text.vector_handler + 0x000009de 0x10 /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x000009de OPCM_IRQHandler + 0x000009de EXTI2_IRQHandler + 0x000009de TIM8_TRG_COM_IRQHandler + 0x000009de TIM8_CC_IRQHandler + 0x000009de USART_WKUP_IRQHandler + 0x000009de UART8_IRQHandler + 0x000009de SPI4_IRQHandler + 0x000009de NFC_IRQHandler + 0x000009de DFSDM0_IRQHandler + 0x000009de TIM1_CC_IRQHandler + 0x000009de HardFault_Handler + 0x000009de TIM10_IRQHandler + 0x000009de GPIOB_IRQHandler + 0x000009de IPC_CH2_Handler + 0x000009de USBPD_IRQHandler + 0x000009de TIM6_IRQHandler + 0x000009de GPIOA_IRQHandler + 0x000009de SysTick_Handler + 0x000009de CAN3_RX1_IRQHandler + 0x000009de I3C_ER_IRQHandler + 0x000009de PVD_IRQHandler + 0x000009de SDIO_IRQHandler + 0x000009de TIM9_BRK_IRQHandler + 0x000009de DMA2_Channel8_IRQHandler + 0x000009de CAN2_RX1_IRQHandler + 0x000009de EXTI3_IRQHandler + 0x000009de HSEM_Handler + 0x000009de UART1_IRQHandler + 0x000009de USBHS_IRQHandler + 0x000009de LPTIM2_IRQHandler + 0x000009de DMA2_Channel9_IRQHandler + 0x000009de TIM10_CC_IRQHandler + 0x000009de EXTI25_16_IRQHandler + 0x000009de I2C3_ER_IRQHandler + 0x000009de USBFS_IRQHandler + 0x000009de UART0_IRQHandler + 0x000009de USART8_IRQHandler + 0x000009de EXTI0_IRQHandler + 0x000009de I2C2_EV_IRQHandler + 0x000009de TIM10_TRG_COM_IRQHandler + 0x000009de LPTIM_IRQHandler + 0x000009de CAN1_RX0_IRQHandler + 0x000009de CAN3_SCE_IRQHandler + 0x000009de CAN2_SCE_IRQHandler + 0x000009de ADC1_2_IRQHandler + 0x000009de BB_IRQHandler + 0x000009de Break_Point_Handler + 0x000009de IPC_CH0_Handler + 0x000009de TIM2_CC_IRQHandler + 0x000009de SPI1_IRQHandler + 0x000009de USART5_IRQHandler + 0x000009de TAMPER_IRQHandler + 0x000009de TMR0_IRQHandler + 0x000009de AWU_IRQHandler + 0x000009de EXTI7_0_IRQHandler + 0x000009de CAN2_RX0_IRQHandler + 0x000009de OSCWakeUp_IRQHandler + 0x000009de TIM8_UP_IRQHandler + 0x000009de Ecall_M_Mode_Handler + 0x000009de ECDC_IRQHandler + 0x000009de SDMMC_IRQHandler + 0x000009de USART7_IRQHandler + 0x000009de DMA2_Channel2_IRQHandler + 0x000009de DMA1_Channel4_IRQHandler + 0x000009de ADC1_IRQHandler + 0x000009de TIM2_BRK_IRQHandler + 0x000009de USART6_IRQHandler + 0x000009de CAN3_RX0_IRQHandler + 0x000009de HSADC_IRQHandler + 0x000009de TIM9_UP_IRQHandler + 0x000009de USART3_IRQHandler + 0x000009de RTC_IRQHandler + 0x000009de DMA1_Channel7_IRQHandler + 0x000009de LED_IRQHandler + 0x000009de CAN1_RX1_IRQHandler + 0x000009de DVP_IRQHandler + 0x000009de UART5_IRQHandler + 0x000009de USBSS_IRQHandler + 0x000009de SWPMI_IRQHandler + 0x000009de USBPDWakeUp_IRQHandler + 0x000009de EXTI15_8_IRQHandler + 0x000009de TIM4_IRQHandler + 0x000009de DMA2_Channel1_IRQHandler + 0x000009de SWPMI_WKUP_IRQHandler + 0x000009de USBPD_WKUP_IRQHandler + 0x000009de I2C1_EV_IRQHandler + 0x000009de USBSSWakeup_IRQHandler + 0x000009de UART2_IRQHandler + 0x000009de USART4_IRQHandler + 0x000009de PWMX_IRQHandler + 0x000009de DMA1_Channel6_IRQHandler + 0x000009de UART4_IRQHandler + 0x000009de DMA2_Channel4_IRQHandler + 0x000009de TIM3_IRQHandler + 0x000009de RCC_IRQHandler + 0x000009de TIM1_TRG_COM_IRQHandler + 0x000009de DMA1_Channel1_IRQHandler + 0x000009de DMA2_Channel7_IRQHandler + 0x000009de QSPI1_IRQHandler + 0x000009de EXTI15_10_IRQHandler + 0x000009de ADC_IRQHandler + 0x000009de IPC_CH3_Handler + 0x000009de DMA1_Channel8_IRQHandler + 0x000009de I3C_EV_IRQHandler + 0x000009de TMR2_IRQHandler + 0x000009de I3C_WKUP_IRQHandler + 0x000009de DefaultIRQHandler + 0x000009de TIM12_IRQHandler + 0x000009de TIM7_IRQHandler + 0x000009de CAN2_TX_IRQHandler + 0x000009de TIM5_IRQHandler + 0x000009de I2C3_EV_IRQHandler + 0x000009de USB_IRQHandler + 0x000009de EXTI9_5_IRQHandler + 0x000009de PIOC_IRQHandler + 0x000009de TIM9_IRQHandler + 0x000009de LTDC_IRQHandler + 0x000009de SAI_IRQHandler + 0x000009de SPI2_IRQHandler + 0x000009de OSC32KCal_IRQHandler + 0x000009de IPC_CH1_Handler + 0x000009de I2C_IRQHandler + 0x000009de LPTIM1_WKUP_IRQHandler + 0x000009de TIM10_BRK_IRQHandler + 0x000009de TIM9_CC_IRQHandler + 0x000009de CAN1_TX_IRQHandler + 0x000009de DMA2_Channel5_IRQHandler + 0x000009de USB2_IRQHandler + 0x000009de USBHSWakeUp_IRQHandler + 0x000009de DMA1_Channel5_IRQHandler + 0x000009de EXTI4_IRQHandler + 0x000009de USB_LP_CAN1_RX0_IRQHandler + 0x000009de QSPI2_IRQHandler + 0x000009de RNG_IRQHandler + 0x000009de USB_HP_CAN1_TX_IRQHandler + 0x000009de LLE_IRQHandler + 0x000009de CMPWakeUp_IRQHandler + 0x000009de DMA1_Channel3_IRQHandler + 0x000009de FSMC_IRQHandler + 0x000009de ETH_IRQHandler + 0x000009de TIM1_UP_IRQHandler + 0x000009de LPTIMWakeUp_IRQHandler + 0x000009de WWDG_IRQHandler + 0x000009de USBHSWakeup_IRQHandler + 0x000009de DMA2_Channel11_IRQHandler + 0x000009de WDOG_BAT_IRQHandler + 0x000009de Ecall_U_Mode_Handler + 0x000009de I2C4_EV_IRQHandler + 0x000009de CAN3_TX_IRQHandler + 0x000009de TMR3_IRQHandler + 0x000009de DMA2_Channel6_IRQHandler + 0x000009de TIM2_IRQHandler + 0x000009de SW_Handler + 0x000009de TIM1_BRK_IRQHandler + 0x000009de GPHA_IRQHandler + 0x000009de OPA_IRQHandler + 0x000009de DMA2_Channel10_IRQHandler + 0x000009de EXTI1_IRQHandler + 0x000009de SPI0_IRQHandler + 0x000009de USB2_HOST_IRQHandler + 0x000009de LPTIM2_WKUP_IRQHandler + 0x000009de RTCAlarm_IRQHandler + 0x000009de TIM11_IRQHandler + 0x000009de TIM10_UP_IRQHandler + 0x000009de TIM9_TRG_COM_IRQHandler + 0x000009de UART7_IRQHandler + 0x000009de USART2_IRQHandler + 0x000009de UART6_IRQHandler + 0x000009de UHSIF_IRQHandler + 0x000009de ETHWakeUp_IRQHandler + 0x000009de I2C2_ER_IRQHandler + 0x000009de DMA1_Channel2_IRQHandler + 0x000009de TIM8_BRK_IRQHandler + 0x000009de TIM2_TRG_IRQHandler + 0x000009de CAN1_SCE_IRQHandler + 0x000009de FLASH_IRQHandler + 0x000009de USBFSWakeUp_IRQHandler + 0x000009de USART1_IRQHandler + 0x000009de OTG_FS_IRQHandler + 0x000009de SPI3_IRQHandler + 0x000009de USBFS_WakeUp_IRQHandler + 0x000009de UART3_IRQHandler + 0x000009de I2C1_ER_IRQHandler + 0x000009de FMC_IRQHandler + 0x000009de USB2_DEVICE_IRQHandler + 0x000009de LPTIM1_IRQHandler + 0x000009de DFSDM1_IRQHandler + 0x000009de TMR1_IRQHandler + 0x000009de I2C4_ER_IRQHandler + 0x000009de SERDES_IRQHandler + 0x000009de USBSS_LINK_IRQHandler + 0x000009de USBWakeUp_IRQHandler + 0x000009de DMA2_Channel3_IRQHandler + 0x000009e0 NMI_Handler + 0x000009e0 NMI_RCC_CSS_IRQHandler + .text.memset 0x000009ee 0x12 /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x000009ee memset .text.ssd1306_setbuf.constprop.0 - 0x00000d74 0xc /tmp/cczcSDec.ltrans0.ltrans.o - .text.strcpy 0x00000d80 0x14 /tmp/cczcSDec.ltrans0.ltrans.o - 0x00000d80 strcpy - .text.memcpy 0x00000d94 0x1c /tmp/cczcSDec.ltrans0.ltrans.o - 0x00000d94 memcpy + 0x00000a00 0xc /tmp/ccVfyVtG.ltrans0.ltrans.o + .text.memcpy 0x00000a0c 0x1c /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x00000a0c memcpy .text.ssd1306_refresh - 0x00000db0 0x5c /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000a28 0x5c /tmp/ccVfyVtG.ltrans0.ltrans.o .text.SystemInit - 0x00000e0c 0x54 /tmp/cczcSDec.ltrans0.ltrans.o - 0x00000e0c SystemInit + 0x00000a84 0x44 /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x00000a84 SystemInit .text.startup.main - 0x00000e60 0xaaa /tmp/cczcSDec.ltrans0.ltrans.o - 0x00000e60 main + 0x00000ac8 0xeb4 /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x00000ac8 main *(.rodata) *(.rodata*) - *fill* 0x0000190a 0x2 - .rodata.ssd1306_i2c_error.isra.0.str1.4 - 0x0000190c 0x198 /tmp/cczcSDec.ltrans0.ltrans.o - 0x2d (size before relaxing) + *fill* 0x0000197c 0x0 .rodata.main.str1.4 - 0x00001aa4 0xd9 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.main 0x00001aa4 0x1c /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.icon_settings - 0x00001ac0 0x20 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.icon_stats - 0x00001ae0 0x20 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.icon_heal - 0x00001b00 0x20 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.icon_clean - 0x00001b20 0x20 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.icon_sleep - 0x00001b40 0x20 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.icon_play - 0x00001b60 0x20 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.icon_feed - 0x00001b80 0x20 /tmp/cczcSDec.ltrans0.ltrans.o + 0x0000197c 0x1f8 /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x120 (size before relaxing) + .rodata.main 0x00001b74 0x30 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.tmux_sleep + 0x00001ba4 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.tmux_sad + 0x00001c24 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.tmux_happy + 0x00001ca4 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.tmux_idle + 0x00001d24 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.pana_dead - 0x00001ba0 0x80 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00001da4 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.pana_sleep - 0x00001c20 0x80 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00001e24 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.pana_eat - 0x00001ca0 0x80 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00001ea4 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.pana_sad - 0x00001d20 0x80 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00001f24 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.pana_happy - 0x00001da0 0x80 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00001fa4 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.pana_blink - 0x00001e20 0x80 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.str1.4 - 0x00001ea0 0x90 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.errstr - 0x00001ea0 0x14 /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.ssd1306_init_array - 0x00001eb4 0x1a /tmp/cczcSDec.ltrans0.ltrans.o - *fill* 0x00001ece 0x2 + 0x00002024 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.pana_idle - 0x00001ed0 0x80 /tmp/cczcSDec.ltrans0.ltrans.o + 0x000020a4 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.shell_sleep + 0x00002124 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.shell_sad + 0x000021a4 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.shell_happy + 0x00002224 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.shell_idle + 0x000022a4 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.icon_settings + 0x00002324 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.icon_stats + 0x00002344 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.icon_heal + 0x00002364 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.icon_clean + 0x00002384 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.icon_sleep + 0x000023a4 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.icon_play + 0x000023c4 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.icon_feed + 0x000023e4 0x20 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.ssd1306_init_array + 0x00002404 0x1a /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.str1.4 + 0x0000241e 0xd4 /tmp/ccVfyVtG.ltrans0.ltrans.o + *fill* 0x0000241e 0x2 + .rodata.boot.0 + 0x00002420 0x14 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.species_names + 0x00002434 0xc /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.spr_glitch + 0x00002440 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.spr_claude + 0x000024c0 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.species_frames + 0x00002540 0x54 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.menu_icons - 0x00001f50 0x1c /tmp/cczcSDec.ltrans0.ltrans.o - .rodata.pana_frames - 0x00001f6c 0x1c /tmp/cczcSDec.ltrans0.ltrans.o + 0x00002594 0x1c /tmp/ccVfyVtG.ltrans0.ltrans.o + .rodata.form_names + 0x000025b0 0x14 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.menu_labels - 0x00001f88 0x1c /tmp/cczcSDec.ltrans0.ltrans.o + 0x000025c4 0x1c /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.screen_timeout_names - 0x00001fa4 0x10 /tmp/cczcSDec.ltrans0.ltrans.o + 0x000025e0 0x10 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.spr_grave - 0x00001fb4 0x80 /tmp/cczcSDec.ltrans0.ltrans.o + 0x000025f0 0x80 /tmp/ccVfyVtG.ltrans0.ltrans.o .rodata.fontdata - 0x00002034 0x800 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00002670 0x800 /tmp/ccVfyVtG.ltrans0.ltrans.o *(.gnu.linkonce.t.*) - 0x00002834 . = ALIGN (0x4) + 0x00002e70 . = ALIGN (0x4) -.rela.dyn 0x00002834 0x0 +.rela.dyn 0x00002e70 0x0 .rela.text.handle_reset - 0x00002834 0x0 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00002e70 0x0 /tmp/ccVfyVtG.ltrans0.ltrans.o -.fini 0x00002834 0x0 +.fini 0x00002e70 0x0 *(SORT_NONE(.fini)) - 0x00002834 . = ALIGN (0x4) + 0x00002e70 . = ALIGN (0x4) [!provide] PROVIDE (_etext = .) [!provide] PROVIDE (_eitcm = .) -.preinit_array 0x00002834 0x0 +.preinit_array 0x00002e70 0x0 [!provide] PROVIDE (__preinit_array_start = .) *(.preinit_array) [!provide] PROVIDE (__preinit_array_end = .) -.init_array 0x00002834 0x0 - 0x00002834 PROVIDE (__init_array_start = .) +.init_array 0x00002e70 0x0 + [!provide] PROVIDE (__init_array_start = .) *(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)) *(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors) - 0x00002834 PROVIDE (__init_array_end = .) + [!provide] PROVIDE (__init_array_end = .) -.fini_array 0x00002834 0x0 +.fini_array 0x00002e70 0x0 [!provide] PROVIDE (__fini_array_start = .) *(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)) *(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors) @@ -460,15 +474,15 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a *(SORT_BY_NAME(.dtors.*)) *(.dtors) -.dalign 0x20000000 0x0 load address 0x00002834 +.dalign 0x20000000 0x0 load address 0x00002e70 0x20000000 . = ALIGN (0x4) 0x20000000 PROVIDE (_data_vma = .) -.dlalign 0x00002834 0x0 - 0x00002834 . = ALIGN (0x4) - 0x00002834 PROVIDE (_data_lma = .) +.dlalign 0x00002e70 0x0 + 0x00002e70 . = ALIGN (0x4) + 0x00002e70 PROVIDE (_data_lma = .) -.data 0x20000000 0x18 load address 0x00002834 +.data 0x20000000 0x2c load address 0x00002e70 0x20000000 . = ALIGN (0x4) 0x200003fc __global_pointer$ = (. + 0x3fc) *(.gnu.linkonce.r.*) @@ -477,11 +491,11 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a 0x20000000 . = ALIGN (0x8) *(.sdata .sdata.*) .sdata.timeout_idx - 0x20000000 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000000 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o .sdata.disp_on - 0x20000001 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000001 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o .sdata.sound_on - 0x20000002 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000002 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o *(.sdata2*) *(.gnu.linkonce.s.*) 0x20000008 . = ALIGN (0x8) @@ -491,44 +505,62 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*) + .srodata.eye_rx + 0x20000008 0x3 /tmp/ccVfyVtG.ltrans0.ltrans.o + *fill* 0x2000000b 0x1 + .srodata.eye_lx + 0x2000000c 0x3 /tmp/ccVfyVtG.ltrans0.ltrans.o + *fill* 0x2000000f 0x1 + .srodata.eye_cy + 0x20000010 0x3 /tmp/ccVfyVtG.ltrans0.ltrans.o + *fill* 0x20000013 0x1 .srodata.spr_poop - 0x20000008 0x8 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000014 0x8 /tmp/ccVfyVtG.ltrans0.ltrans.o .srodata.screen_timeout_opts - 0x20000010 0x8 /tmp/cczcSDec.ltrans0.ltrans.o - 0x20000018 . = ALIGN (0x4) - 0x20000018 PROVIDE (_edata = .) + 0x2000001c 0x8 /tmp/ccVfyVtG.ltrans0.ltrans.o + .srodata.level_xp + 0x20000024 0x8 /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x2000002c . = ALIGN (0x4) + 0x2000002c PROVIDE (_edata = .) -.bss 0x20000018 0x428 load address 0x0000284c - 0x20000018 . = ALIGN (0x4) - 0x20000018 PROVIDE (_sbss = .) +.bss 0x2000002c 0x438 load address 0x00002e9c + 0x2000002c . = ALIGN (0x4) + 0x2000002c PROVIDE (_sbss = .) *(.sbss*) .sbss.anim_exp - 0x20000018 0x1 /tmp/cczcSDec.ltrans0.ltrans.o - *fill* 0x20000019 0x3 - .sbss.frame 0x2000001c 0x4 /tmp/cczcSDec.ltrans0.ltrans.o + 0x2000002c 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o + *fill* 0x2000002d 0x3 + .sbss.frame 0x20000030 0x4 /tmp/ccVfyVtG.ltrans0.ltrans.o .sbss.tick_acc - 0x20000020 0x2 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000034 0x2 /tmp/ccVfyVtG.ltrans0.ltrans.o .sbss.anim_timer - 0x20000022 0x1 /tmp/cczcSDec.ltrans0.ltrans.o - .sbss.set_sel 0x20000023 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000036 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o + .sbss.set_sel 0x20000037 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o + .sbss.cursor 0x20000038 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o + .sbss.sel_species + 0x20000039 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o + *fill* 0x2000003a 0x2 .sbss.idle_frames - 0x20000024 0x4 /tmp/cczcSDec.ltrans0.ltrans.o - .sbss.crit_flag - 0x20000028 0x4 /tmp/cczcSDec.ltrans0.ltrans.o + 0x2000003c 0x4 /tmp/ccVfyVtG.ltrans0.ltrans.o + .sbss.screen 0x20000040 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o + *fill* 0x20000041 0x3 .sbss.warn_flag - 0x2000002c 0x4 /tmp/cczcSDec.ltrans0.ltrans.o - .sbss.cursor 0x20000030 0x1 /tmp/cczcSDec.ltrans0.ltrans.o - .sbss.screen 0x20000031 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000044 0x4 /tmp/ccVfyVtG.ltrans0.ltrans.o + .sbss.crit_flag + 0x20000048 0x4 /tmp/ccVfyVtG.ltrans0.ltrans.o + .sbss.evo_anim + 0x2000004c 0x1 /tmp/ccVfyVtG.ltrans0.ltrans.o *(.gnu.linkonce.sb.*) *(.bss*) - *fill* 0x20000032 0x2 - .bss.pet 0x20000034 0xc /tmp/cczcSDec.ltrans0.ltrans.o + *fill* 0x2000004d 0x3 + .bss.pet 0x20000050 0x12 /tmp/ccVfyVtG.ltrans0.ltrans.o + *fill* 0x20000062 0x2 .bss.ssd1306_buffer - 0x20000040 0x400 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000064 0x400 /tmp/ccVfyVtG.ltrans0.ltrans.o *(.gnu.linkonce.b.*) *(COMMON*) - 0x20000440 . = ALIGN (0x4) - 0x20000440 PROVIDE (_ebss = .) + 0x20000464 . = ALIGN (0x4) + 0x20000464 PROVIDE (_ebss = .) [!provide] PROVIDE (_end = _ebss) [!provide] PROVIDE (end = .) 0x20000800 PROVIDE (_eusrstack = (ORIGIN (RAM) + LENGTH (RAM))) @@ -544,64 +576,64 @@ OUTPUT(tama.elf elf32-littleriscv) .riscv.attributes 0x00000000 0x25 .riscv.attributes - 0x00000000 0x25 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x25 /tmp/ccVfyVtG.ltrans0.ltrans.o .riscv.attributes 0x00000025 0x1f ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) -.debug_info 0x00000000 0x4ec9 - .debug_info 0x00000000 0x2938 /tmp/cczcSDec.ltrans0.ltrans.o - .debug_info 0x00002938 0x1159 /tmp/ccb2Xekb.debug.temp.o - 0x00002938 ch32fun.c.3da016ab - .debug_info 0x00003a91 0x13db /tmp/ccR20L1X.debug.temp.o - 0x00003a91 tama.c.67bb5960 - .debug_info 0x00004e6c 0x5d ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) +.debug_info 0x00000000 0x56db + .debug_info 0x00000000 0x3076 /tmp/ccVfyVtG.ltrans0.ltrans.o + .debug_info 0x00003076 0xeee /tmp/ccZG4jMj.debug.temp.o + 0x00003076 ch32fun.c.c0bc4b2f + .debug_info 0x00003f64 0x171a /tmp/ccYBrTfR.debug.temp.o + 0x00003f64 tama.c.96f78ea9 + .debug_info 0x0000567e 0x5d ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) -.debug_abbrev 0x00000000 0x7c2 - .debug_abbrev 0x00000000 0x209 /tmp/cczcSDec.ltrans0.ltrans.o - .debug_abbrev 0x00000209 0x278 /tmp/ccb2Xekb.debug.temp.o - .debug_abbrev 0x00000481 0x319 /tmp/ccR20L1X.debug.temp.o - .debug_abbrev 0x0000079a 0x28 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) +.debug_abbrev 0x00000000 0x78b + .debug_abbrev 0x00000000 0x206 /tmp/ccVfyVtG.ltrans0.ltrans.o + .debug_abbrev 0x00000206 0x24d /tmp/ccZG4jMj.debug.temp.o + .debug_abbrev 0x00000453 0x310 /tmp/ccYBrTfR.debug.temp.o + .debug_abbrev 0x00000763 0x28 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) .debug_loclists - 0x00000000 0x232b + 0x00000000 0x25e6 .debug_loclists - 0x00000000 0x232b /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x25e6 /tmp/ccVfyVtG.ltrans0.ltrans.o -.debug_aranges 0x00000000 0x208 +.debug_aranges 0x00000000 0x200 .debug_aranges - 0x00000000 0x1e8 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x1e0 /tmp/ccVfyVtG.ltrans0.ltrans.o .debug_aranges - 0x000001e8 0x20 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) + 0x000001e0 0x20 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) .debug_rnglists - 0x00000000 0x4e8 + 0x00000000 0x550 .debug_rnglists - 0x00000000 0x4e8 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000000 0x550 /tmp/ccVfyVtG.ltrans0.ltrans.o -.debug_line 0x00000000 0x4f23 - .debug_line 0x00000000 0x4cde /tmp/cczcSDec.ltrans0.ltrans.o - .debug_line 0x00004cde 0x76 /tmp/ccb2Xekb.debug.temp.o - .debug_line 0x00004d54 0x7c /tmp/ccR20L1X.debug.temp.o - .debug_line 0x00004dd0 0x153 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) +.debug_line 0x00000000 0x562b + .debug_line 0x00000000 0x53eb /tmp/ccVfyVtG.ltrans0.ltrans.o + .debug_line 0x000053eb 0x76 /tmp/ccZG4jMj.debug.temp.o + .debug_line 0x00005461 0x77 /tmp/ccYBrTfR.debug.temp.o + .debug_line 0x000054d8 0x153 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) -.debug_str 0x00000000 0x1069 - .debug_str 0x00000000 0x1069 /tmp/cczcSDec.ltrans0.ltrans.o - 0x1da (size before relaxing) - .debug_str 0x00001069 0x751 /tmp/ccb2Xekb.debug.temp.o - .debug_str 0x00001069 0xa84 /tmp/ccR20L1X.debug.temp.o - .debug_str 0x00001069 0xd9 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) +.debug_str 0x00000000 0x10c7 + .debug_str 0x00000000 0x10c7 /tmp/ccVfyVtG.ltrans0.ltrans.o + 0x1c2 (size before relaxing) + .debug_str 0x000010c7 0x60f /tmp/ccZG4jMj.debug.temp.o + .debug_str 0x000010c7 0xc07 /tmp/ccYBrTfR.debug.temp.o + .debug_str 0x000010c7 0xd9 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) .debug_line_str 0x00000000 0x33f .debug_line_str - 0x00000000 0x33f /tmp/cczcSDec.ltrans0.ltrans.o - 0x157 (size before relaxing) + 0x00000000 0x33f /tmp/ccVfyVtG.ltrans0.ltrans.o + 0xd9 (size before relaxing) .debug_line_str - 0x0000033f 0x246 /tmp/ccb2Xekb.debug.temp.o + 0x0000033f 0x246 /tmp/ccZG4jMj.debug.temp.o .debug_line_str - 0x0000033f 0x1e5 /tmp/ccR20L1X.debug.temp.o + 0x0000033f 0x1dd /tmp/ccYBrTfR.debug.temp.o .debug_line_str 0x0000033f 0x92 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) -.debug_frame 0x00000000 0x5dc - .debug_frame 0x00000000 0x5dc /tmp/cczcSDec.ltrans0.ltrans.o +.debug_frame 0x00000000 0x600 + .debug_frame 0x00000000 0x600 /tmp/ccVfyVtG.ltrans0.ltrans.o