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 7a67a70..961e312 100644 Binary files a/__pycache__/sprites_gen.cpython-313.pyc and b/__pycache__/sprites_gen.cpython-313.pyc differ 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 5ef59db..ec39e8d 100755 Binary files a/tama.bin and b/tama.bin differ 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 263b74a..04bb52f 100755 Binary files a/tama.elf and b/tama.elf differ diff --git a/tama.hex b/tama.hex index db9fddf..473d3ed 100644 --- a/tama.hex +++ b/tama.hex @@ -1,13 +1,13 @@ -:100000006F00B00E00000000B00900005C090000A5 +:100000006F00D01600000000E0090000DE090000CB :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 -:100030005C090000000000005C09000000000000F6 -:100040005C0900005C0900005C0900005C0900001C -:100050005C0900005C0900005C0900005C0900000C -:100060005C0900005C0900005C0900005C090000FC -:100070005C0900005C0900005C0900005C090000EC -:100080005C0900005C0900005C0900005C090000DC -:100090005C0900005C0900005C0900000000000031 +:10003000DE09000000000000DE09000000000000F2 +:10004000DE090000DE090000DE090000DE09000014 +:10005000DE090000DE090000DE090000DE09000004 +:10006000DE090000DE090000DE090000DE090000F4 +:10007000DE090000DE090000DE090000DE090000E4 +:10008000DE090000DE090000DE090000DE090000D4 +:10009000DE090000DE090000DE09000000000000AB :1000A000634E050263C305042E86AA857D5515C2DD :1000B00085466378B6006356C00006068606E36C84 :1000C000B6FE014563E4C500918D558D858205829C @@ -15,633 +15,733 @@ :1000E0006347B000B305B040C1B7B305B0408682E6 :1000F000653F3305A0408282868263C7050063495D :1001000005005D372E858282B305B040E35B05FEB6 -:100110003305A040513F3305B0408282000099C6AC -:10012000014363D7B600B685054319A00143AE86E7 -:100130008D8EBA87B383E600B382F340634A5004DE -:1001400093C7F6FFFD87FD8EBA9681473386F5404B -:10015000B382F6006342C00493C7F5FFFD87FD8DAF -:10016000B6953385E540630403026372B7029307D3 -:10017000A002A38FF5FE9386F5FF637AD700238F45 -:10018000F5FE9386E5FF6374D700A38EF5FE8280AB -:100190008507A38FC7FE4DB73306F500034606005B -:1001A00085072380C2005DB72A832E8501CE832276 -:1001B000060001475C426348A700238007004842CD -:1001C0003305554082800C461442FD15AE96E386F9 -:1001D000D7FE9386170054C2B306E30083C6060019 -:1001E00005072380D700F9B7B70700E09387470FCB -:1001F0009843137707086DFF372730781307870870 -:10020000B70600E098C39386460F7147A54571561F -:100210009C4293F70708EDFF3353E5001373F30097 -:10022000B3B76500B307F04093F7770293870703EE -:100230009A97A20793E757089CC27117E31AC7FC65 -:10024000828037F700E01C473E951C47898FE3CE3C -:1002500007FE8280011106CE22CC26CA02C02A8364 -:100260006357050089E685473303A0403EC0058AF1 -:100270001304100619C213041004BA8459141A8501 -:100280003AC81AC22EC61AC4B135A5472243B24590 -:1002900042479376F50F63E1A7069386060393F62C -:1002A000F60F938714002380D4001A853AC83EC6FF -:1002B0002EC4DD3B9246A245B24742472A8363FBE8 -:1002C000B602824699C69306D0022380D700938750 -:1002D00024003385E7409356F501AA962380070052 -:1002E00085860146FD17634BD600F2406244D24436 -:1002F00005618280BE8461B7A29655B7B305C70079 -:1003000083C2070003C30500050623805500238030 -:100310006700C9BFB7170240984BB7062000558F3A -:1003200098CB984BB706E0FFFD16758F98CBB75763 -:10033000004003D74740C166938606FC758F13675C -:1003400087012392E74071770507239EE74003D793 -:100350000740136717002390E74003D70740136750 -:1003600007402390E74082809307F00763E7A702E6 -:100370009307F00363E3B70293D735009E07AA976C -:10038000138541C43E959D89054783470500B315F4 -:10039000B70009C6CD8F2300F500828093C5F5FF15 -:1003A000ED8FD5BF1301C1FD22CE26CC06D02A8405 -:1003B000AE82B28483C304008504638503060147CB -:1003C000939733000966BA9713064603B29703C39F -:1003D0000700814793158301E185368663C40500D4 -:1003E00013C61600B385E2003305F40036CA1AC8F6 -:1003F0001EC63AC416C23EC0853F424382472146CC -:100400000603850792422247B243D2461373F30F85 -:10041000E392C7FC0507E315F7FA329493078007C8 -:10042000E3DA87F882507244E24413014102828089 -:1004300083C761C0ADC7311122C62E84AA8537A5F6 -:1004400007001305051206C826C4B93993175400CE -:10045000818F8A07A29713141500AA84A285139589 -:10046000370099312694931714002A873EC001441F -:100470000245B71401403AC291469384044094C89F -:10048000C9330245B706040094C8653B124705040A -:10049000E31087FEC2403244A24451018280828030 -:1004A000611122C03714014006C213040480894739 -:1004B00037C502001CC8130505F26133B7070200F7 -:1004C00092401CC802442101828037575A641307A6 -:1004D000070523ACE1C2938781C31307400623823B -:1004E000E700054723930700239407002385E700CF -:1004F000A38A01C2238A01C223A801C223A601C282 -:100500008280411122C406C626C24D47AA871384A1 -:10051000C1C26344B7042A940347040015EB2AC000 -:100520009305C0031305006221379305C00313052B -:100530007049FD3D9305A00513050037D53D824761 -:10054000138701C38546BA972300D4002380D700C0 -:10055000B2402244924441018280938401C3130734 -:100560001003AA946343B70203C7040019EB2AC01F -:100570009305200313050062653D824705472380EC -:10058000E4003E9423000400E1B723800400D5BFBB -:100590002E860147B307E60083C7070081EFC147F6 -:1005A000998F8A0713C7F7FF7D87AA85854633F59C -:1005B000E700CDBB0507F9BFB71701408847938710 -:1005C000074098479C471345F5FF19831347F7FFEA -:1005D000958393C7F7FF058B05892207858B7111DA -:1005E000C207598D5D8D110182809307F00763CF9B -:1005F000A702411122C406C626C2B387C50013074D -:1006000000042E846354F7003306B740B304860019 -:1006100063179400B2402244924441018280A28533 -:1006200005462AC0913302450504DDB782801301D7 -:1006300081FDB387E50022D226D02AC832CA13D45E -:1006400036003EC6814393F775000547B317F700A0 -:100650003EC0D24781469E973ECC93D735009E0739 -:100660003ECEE247939236000147B69783C7070014 -:100670003EC2C247BE92F247B3845700B387E2003E -:100680001306F0076364F604124593070008B3D716 -:10069000E740E98F3386E400138541C43295034374 -:1006A00001003EC4834705001346F3FF05077D8E16 -:1006B000A247B337F000B307F0403373F30033665B -:1006C00066002300C500A147E31AF7FA8506E31A7E -:1006D000D4F8B2478505A2936386B7009307000458 -:1006E000E393F5F612548254130181028280411182 -:1006F0009307F6FF06C622C426C2AA971307F0077F -:100700006375F70013060008098E3304C5006317EC -:100710008500B24022449244410182800546930400 -:1007200015002EC0913182452685D5B7311126C4DA -:10073000B284368606C822C636C22A842EC07535D3 -:10074000124682451385F4FF22954535824526865B -:100750002285713F8247228532449385F7FF924775 -:10076000C2402686A244BE95510151B7211122C82C -:1007700026C62A84B28485462E86AA85014506CAE5 -:100780001531130500039D461306C004A285793F69 -:100790001395340026950A0526950605930730061D -:1007A00063DFA70293071400930540063EC0CD38CF -:1007B00082472A871904930617039304100326859A -:1007C000BE85054636C43AC23EC0793EA24685047F -:1007D00082471247E395D4FE8507E39E87FCD2400B -:1007E0004244B24461018280B70700E083A7470F0B -:1007F0008280B70700E09387470F9843211106CA0C -:1008000022C826C61377070C9306000C630BD7008B -:1008100002C42E84DDED9C4389C793F7070891E35A -:10082000E1370144D24022854244B24461018280D2 -:10083000B30794401D476353F700BA87B70610000B -:10084000370700E085061307470F10439375060826 -:10085000A5E111C62AC23EC0413F1245824734007D -:100860000D47B685634DF704A246370700E00D46F5 -:10087000232CD70EB3069500014783C20600050757 -:100880003383E500230053006385E7008506E31604 -:10089000C7FE13874700136707F82304E100A24649 -:1008A000370700E0BE94232AD70EE3C384F89DBF28 -:1008B000FD16C1FE1C4393E7070C1CC39DB733868E -:1008C000E4002A960346060005078506A38FC6FEA8 -:1008D00051BF8144D9BF611122C006C22E84113F8D -:1008E0009240228502442101828097010020938159 -:1008F00021B1138141400965130505887310053046 -:1009000097F6FFFF9386067093E636007390563095 -:100910001385C1C19385410401466356B50010C1DA -:100920001105E34EB5FE172500001305E5F093858C -:1009300041C01386C1C16388C500144194C111052B -:100940009105E39AC5FEB7F700E0054798C38567B0 -:10095000938707E6739017347300203073251034A3 -:10096000EFF09F8873250030EFF01F887325303437 -:10097000EFF09F8773252034EFF01F87B70700E063 -:100980009387470F9843137707086DFF0567130791 -:1009900057A898C3B70700E09387470F984313778A -:1009A00007086DFF37B7AAAA130737A898C301A095 -:1009B000371702401C47B7068000D58F1CC7AA878F -:1009C00003C7070001E73385A74082808507CDBFB5 -:1009D000130141FAA2CAA6C886CC2AC02EC232840C -:1009E000B68409E59307801A02C23EC002CA834753 -:1009F000040013071400A30FF10081EBE6405644F6 -:100A00005245C6441301C10582803AC6930650027E -:100A10006380D7021246824785451305F10182970C -:100A2000324726C43A84D247A244AA973ECAC1B7E5 -:100A3000834714009306000313072400A30FF1005B -:100A40003EC66393D7083A8481460147A54519A855 -:100A500093172700BA97860705043307F6008347E4 -:100A6000F4FF8546138607FD1375F60FE3F2A5FE26 -:100A700099C2A30FF1003AC8E14663D3E60036C835 -:100A80001306C00681466398C70083470400854665 -:100A90000504A30FF1000346F10193074006630527 -:100AA000F60663E7C702930780056302F60A930719 -:100AB00030066300F60C39D212468247854513058D -:100AC000F101829726C485B79306000236C6A5BFFA -:100AD00093075007630AF602930780076309F60637 -:100AE00093073007E31AF6FC9387440084403ACC1E -:100AF0003EC42685E9356247AA856359E008C246A7 -:100B000032463818268525A0938744003EC485CAFE -:100B10001306B6F818109336160088400146A9450A -:100B2000EFF04FF3C24632463818AA850810EFF0AE -:100B30000FDF1246AA85281882478297EDB59307E2 -:100B4000500718108546E30AF6FC8146F9B788403D -:100B5000130686FA9387440018108546133616004C -:100B6000C1453EC4EFF00FEFC2463246AA853818A1 -:100B700075BF938744003EC49C40C2463246A30FD3 -:100B8000F100381885451305F10155B71246268541 -:100B900065B7111132C62A8605652EC436C881454F -:100BA00034001305658D06C23ACA3ECC36C00D35F9 -:100BB00092407101828089670A05938707EAAA97A4 -:100BC0008C43096571111305C59006C0D937824061 -:100BD00011016FF02FF471116167B757004006C023 -:100BE0001307076A938707407D5683D68701898A52 -:100BF000E1C67D17E31BC7FE014521A8E167938786 -:100C0000176A8356470193F6060899E6FD17F5FB28 -:100C10000D455537054589A8834705000505231867 -:100C2000F700E39DA5FCE166375700403706070053 -:100C30009386066A1307074013064608FD550355B9 -:100C4000470183578701C207C98FF18F6387C700A8 -:100C5000FD16E396B6FE11456DBF835707000145AB -:100C600093E707202310F700824011018280375755 -:100C70000040AA95130707406DB793078007231814 -:100C8000F7006166B7560040370707001306066A8B -:100C900093860640130727087D5383D2460183D7E6 -:100CA0008601C207B3E75700F98FE382E7FC7D16A0 -:100CB000E31566FE0945B1BF03D70700E1663706B5 -:100CC0000300136707102390E7003757004093860F -:100CD000066A1307074005067D5383524701835771 -:100CE0008701C207B3E75700F18FE388C7F8FD1605 -:100CF000E39566FE054531BF130181FDA300A10008 -:100D000089450A8506D223000100F135925013016E -:100D100081028280311106C822C62AC02AC22EC48E -:100D20009DC1B337A000B307F0402A84B375F1002A -:100D30001305801A713901C4124582471D8DC240C6 -:100D400032445101828001448145DDB7311136C4FE -:100D5000340006C23AC63EC836C06D3F92405101CB -:100D600082802A96AA876393C70082802380B70077 -:100D70008507D5BF130600408145138541C4D5B70B -:100D8000AA8703C705002380E70011E38280850559 -:100D90008507C5BF81476313F60082803387F5005E -:100DA000834607003307F50085072300D700E5B722 -:100DB00079711305100206D622D426D2353F01459B -:100DC000253F1305F0070D3F130520023537014578 -:100DD00025371D45138441C4053793040440930708 -:100DE0000004A28513060002130511002300F10080 -:100DF0005537930510020A8513040402E93BE310FA -:100E000094FEB2502254925445618280B72702402A -:100E1000054798C3B71702403707080123A2070008 -:100E20001307170898C337079F0098C7984393166E -:100E30006700E3DD06FED843B7160240719B1367D7 -:100E40002700D8C32147DC42B18BE39EE7FEB707FA -:100E500000E023AC070E1307000823AAE70E8280E8 -:100E6000130181F986D2A2D0A6CE4D37B714024025 -:100E70009C4C37140140FD7693E757039CCC9307B5 -:100E8000048098439386F60F370600F11377F7F046 -:100E90001367070198C33707020098CB93070440F4 -:100EA00098437D1637050B00758F1367071098C39D -:100EB0003707040098CB1840130505C8419B1367FA -:100EC000870018C09843718F37060008518F98C368 -:100ED0009843370610FF7D16718F37068000518FBB -:100EE00098C3054718C81307000498CB13070002DE -:100EF00098CBEFF00FB5DC4C37072000D98FDCCC56 -:100F00009C4C7D779306F70F93E717019CCC1C4010 -:100F10000567130707D093F7F7F01CC01C4093E751 -:100F2000070D1CC01C40F58F1CC01C40D98F1CC075 -:100F30000964EFF02FBE130444EB2D3D034504007C -:100F40009307F00F6314F500A53521A005046D3358 -:100F500075D5EFF08FD7393D896593858594114517 -:100F6000EFF00FE3130700020966BA86130606EDD9 -:100F7000C14513050003EFF08FEB89659385459517 -:100F800013054003EFF0CFE0253593050005130569 -:100F90003029EFF0EFC99305000513050031EFF09C -:100FA0002FC9930580071305C03DEFF06FC81304E8 -:100FB000800CEFF06FE01357850093570501A304F1 -:100FC000E102498F2305F102D98F2304A10293F78F -:100FD000F70F81EB75651305054C7D14EFF06FA6D7 -:100FE00069F801468144014432C8EFF0EFDC135741 -:100FF000850093570501A302E1022303F1029376D2 -:10100000F50F1377F70F93F7F70F2302A10236C2FC -:101010003AC43EC602C0424681C6933714003EC061 -:10102000224783470100814619C393B61400324515 -:1010300093F5F60F014719C113371600CD8FD98FDD -:1010400099C323A401C203C651C025E699C713055D -:10105000F00A5D318547A382F1C083C761C281C7B1 -:10106000FD172383F1C2938781C383C7A70013842D -:1010700081C381CF83D741C29306900F8507C207F2 -:10108000C18363E7F6682392F1C283A701C2378563 -:101090000500130505E4850723A0F1C283A781C2DB -:1010A000850723A4F1C2EFF0CF993246A24412443F -:1010B00025BF83C451C30946638BC45E6362960631 -:1010C000138481C36397043C85C203C541C39D4516 -:1010D0003AC81905EFF04F82238AA1C2E5451305EE -:1010E0007041EFF0EFB4424711CF03C541C39D45B6 -:1010F0000505EFF06F80238AA1C2E5451305704115 -:10110000EFF00FB38247C1CF83C741C3194763686C -:10111000F70809678A07130747AABA979C4382878B -:101120008D47638DF44003C741C0938741C10607D3 -:10113000BA9783D70700E38207F203A781C2E36E61 -:10114000F7F01305E00A4D3EA38201C039B78307CB -:10115000040013074006F907635DF714BA872300FC -:10116000F4008307340013074006ED176358F714A3 -:10117000BA87A301F4001147238EE1C09305C00391 -:101180003147130500372383E1C2EFF06FAA9305BF -:10119000000513057049EFF0AFA9EFF06FB0D93E2D -:1011A00083C741C301453EC002478967938787F8DB -:1011B0000A07BA978C43EFF0AFBD8347A4003EC83F -:1011C00095C303074400F54763CEE70083A701C238 -:1011D000A18B89CB09668546130646968145014554 -:1011E000EFF04F9C13060008A9450145EFF02FD002 -:1011F000834794003ECA6383072009668546130629 -:101200008696B9451305E004EFF0CF990966854647 -:101210001306C696B14513054005EFF0AF981303CA -:101220000003C1424247994719C783C761C263801F -:10123000072083C7C1C109671307C7F68A07BA9792 -:1012400090431307000296851A85BA86EFF02FBEE9 -:10125000130600089305E0020145EFF04FC98347EC -:10126000840063E7F42001440967130707F5931727 -:101270002400BA97931434009043A2944147860403 -:10128000BA869305000313851400EFF04FBA0247A6 -:101290009377F40F6319F700C54636869305F0027D -:1012A0002685EFF0AFC805049D47E31FF4FA093621 -:1012B0009DBD13C7F7FF7D87F98F55B513C7F7FF9E -:1012C0007D87F98F7DB503072400B94763C9E7001F -:1012D000930580071305C00DEFF08F95C9B58307FF -:1012E000140093064006E50763D5F604B687A3000D -:1012F000F400930747FF130740066353F700BA87CC -:101300002301F4000947238EE1C09305C003314750 -:101310001305C03D2383E1C2EFF08F919305C00315 -:1013200013057052EFF0CF909305A00513050062EE -:101330009DB593C6F7FFFD86F58F55BF0345940015 -:1013400093058007933715003335A0003305A0407F -:101350001375C50DA304F4001305851BB5BF1387D2 -:1013600081C3830714009306400623040400A301ED -:10137000D400950763D0F602B687930520031305C2 -:101380007052A300F700EFF0AF8A93052003130516 -:10139000704199B793C6F7FFFD86F58FF9BF8307B4 -:1013A000440013074006938737026356F702BA8753 -:1013B0009305C003130500312302F400EFF04F87BB -:1013C0009305C00313057041EFF08F869305A005C8 -:1013D00013057052C9B313C7F7FF7D87F98FC9BFD3 -:1013E0008547A38AF1C29305800213053029EDB524 -:1013F0008D47A38AF1C2A38301C2F5B783A201C2BC -:1014000093050005168516CCEFE0DFCC930770023C -:10141000E2421303E50163F6A7009307E006338376 -:10142000A74093F28200B3325000B902E5BB5247A5 -:101430009547E31207E08306440075478D47E35C58 -:10144000D7DE830614006147E357D7DE8306040026 -:101450004D47E352D7DE03A501C29305200316CA08 -:101460001AC8EFE03FC7D242424393374500E1B389 -:1014700013951400269521470A05BA861386C1C024 -:10148000930560023A958504EFF06F9A93F4F40F98 -:10149000F9B381CBF94513050037A38A01C2EFE008 -:1014A0003FF9EFF03F8D8965938505970145EFF092 -:1014B0002F8E030604008965938505982945EFF072 -:1014C000EFAA030614008965938585984D45EFF0D2 -:1014D000EFA9030624008965938505997145EFF00E -:1014E000EFA803063400896593858599130550029A -:1014F000EFF0CFA70306440089659385059A13058D -:10150000E002EFF0AFA683479400835664009DC3CA -:1015100009671307C79309661306869AC5452810FD -:10152000EFF0DF8285463010930580030145EFE040 -:101530007FE7B5BB096713078793F1BF85C203C572 -:1015400071C2A6853AC80905EFE01FBBA383A1C2FB -:10155000E54513057041EFE0BFED424711CF03C5EC -:1015600071C28D450505EFE03FB9A383A1C2E545F2 -:1015700013057041EFE0DFEB824795CF83C771C25F -:1015800081EF83C741C09305800285078D8B23823D -:10159000F1C01305003731A805476392E71083C7F0 -:1015A00061C09305C0031305C03D93B717002383A3 -:1015B000F1C0EFE0FFE7EFF0EFFB89659385459B16 -:1015C0000145EFE0FFFC13060008A9450145EFF0D7 -:1015D0000F9203C741C08967938747FA0A07BA97F2 -:1015E000944309661306469CC5452810EFF00FF694 -:1015F00083C761C0CDCB89669386069409661306BE -:10160000469DC54513059103EFF04FF48965938519 -:10161000059E1305A104EFF0AFF601448144930742 -:1016200024013EC083C671C293F3F40F639E760219 -:10163000A9429305B401B385554001431A85054677 -:10164000050316D01ECE36CC1ACA2EC8EFE0DFD165 -:10165000524313060008C245E246F2438252E31F9A -:10166000C3FCFD12E39702FC139644008245B38647 -:10167000764026963C10B336D0003E961145EFE0FA -:101680007FD23104930640028504E31AD4F88965B9 -:101690009385859E13058003EFE09FEF09B9A38A28 -:1016A00001C2F945FDB589669386469481BF82479C -:1016B00099CFEFE09FE19305000513053029EFE096 -:1016C0003FD7930580071305C03DEFE07FD6EFF0CD -:1016D0006FEA130700020966BA86130646FBA145A6 -:1016E00013050003EFE0BFF489659385C59F1305DB -:1016F000C002EFE0FFE983D6E1C30966C5451306E2 -:1017000046A02810EFF08FE42C101305400369B7B2 -:101710008356640083070400239201C28506C20633 -:10172000C1822313D400FD1713074006034694001B -:101730006354F708BA87E20703072400E18713051B -:10174000400649C693056700635DB506AA85230078 -:10175000F4002301B4009307D00563D5E700A30488 -:101760000400014613F7160019CB830734009305D4 -:101770004006FD1763DAF508AE87A301F400834540 -:10178000840041EA894763EDB70093973600958F4F -:1017900083A601C2B697FD8BADEF85052304B40087 -:1017A00035CB8307140093064006FD1763DAF61263 -:1017B000B687A300F400B9A813C7F7FF7D87F98F98 -:1017C0009DBF13C5F5FF7D85E98D51B72300F4005A -:1017D0009307F7FF6350F502AA872301F4008307FC -:1017E000140013074006FD17635BF700BA87A300D8 -:1017F000F4008DBF13C7F7FF7D87F98FF9BF13C7BB -:10180000F7FF7D87F98FE5B793C5F7FFFD85ED8F6E -:10181000ADB7D9F583043400CD4763CD970019CB1C -:101820008307140013074006FD176350F70CBA87AF -:10183000A300F400830504008306140003072400BA -:10184000A68763D39500AE8713968701618663D31D -:10185000C600B6871396870161866353C700BA87AF -:101860001396870161863945830744006344C508A0 -:10187000F517130640066355F608B2872302F400F5 -:1018800001453AC836C0EFE0DFC782460545B68558 -:10189000EFE03FC742470945BA85EFE09FC6A685FE -:1018A0000D45EFE01FC6830744006340F0FE094783 -:1018B0009305800C1305A014A38AE1C2230504003C -:1018C000EFE01FB79305800C1305700FEFE05FB6D4 -:1018D000930500191305500AEFE09FB56FF0EFFA7A -:1018E00093C6F7FFFD86F58FE9B513C7F7FF7D8730 -:1018F000F98F3DBF13052003E354C5F8890795BF51 -:1019000013C6F7FF7D86F18F95BF000073736431B6 -:101910003330365F6932635F6572726F72202D20DB -:1019200074696D656F75742077616974696E67207D -:10193000666F722025730A0D000000005A7A7A0043 -:101940004F6E00004F66660050414E41474F544372 -:1019500048490000707265737320616E79206B6571 -:1019600079000000210000007A0000005A00000009 -:101970002D2D20535441545553202D2D000000008F -:10198000464F4F440000000046554E200000000026 -:10199000454E4759000000005741534800000000E1 -:1019A000484C544800000000416765202575202000 -:1019B000257300002D2053455454494E4753202D84 -:1019C0000000000053637265656E206F66663A25FD -:1019D00073000000536F756E643A20257300000099 -:1019E0004261636B000000004C2F52206D6F7665E2 -:1019F00020204F4B2075736500000000522E492EA9 -:101A0000502E00006C69766564202575206D696E26 -:101A1000000000006E6F7420627573790000000092 -:101A20006D6173746572206D6F6465007472616EB0 -:101A3000736D6974206D6F646500000074782065B3 -:101A40006D707479000000007472616E736D69745A -:101A500020636F6D706C65746500000046454544F9 -:101A600000000000504C415900000000534C454517 -:101A700050000000434C45414E0000004845414C99 -:101A80000000000053544154530000005345545487 -:101A9000494E475300000000313573003330730066 -:101AA000363073004E110000C61200003C130000D7 -:101AB0005E1300009E130000E0130000F01300000E -:101AC00003C003C003C007F00FF81FFCFF7FFE3FF9 -:101AD000FC1FFE3F1F7C1FFC0FF807F003C003C074 -:101AE00000000000000000C000C000C006C006C02A -:101AF00006D806D836D836D836D836D800000000F2 -:101B00000000008007F00FF81C3C3C3E300E300E09 -:101B1000700F300E3C3E3C3E1FFC0FF807F000807B -:101B2000000000000080008001C001C007F00DF837 -:101B30000DF808F81DFC0DF80FF80FF807F00080FD -:101B400000000000000004000C001C0018001C0035 -:101B50003C001C001E001F000FE807F00080000082 -:101B600000000000077000001F7C3F7E3F7E3F7E2C -:101B700000003F7E3F7E3F7E1F7C0000077000001C -:101B80000000000000A001900FE01BF03BF831F8CE -:101B90003BF87BFC3FF83FF83FF81FF00FE00100F7 -:101BA0000000000000000000010000800FE007F0CE -:101BB0001FF00FF81FF00FF81FF00FF83FF89FFC11 -:101BC0001FFFFFF81FFFFFF81FFFFFF80FFFFFF0D9 -:101BD00003FFFFE007FFFFF007FFFFF00FBBEEF88A -:101BE0000FD7F5F80FEFFBF80FD7F5F81FBBEEFC9A -:101BF0000FFFFFF80FFFFFF80FFFFFF80FF007F8D8 -:101C000007FFFFF007FFFFF003FFFFE001FFFFC04A -:101C100000FFFF80007FFF00001FFC00000080002D -:101C20000000000000000000010000800FE007F04D -:101C30001FF00FF81FF00FF81FF00FF83FF89FFC90 -:101C40001FFFFFF81FFFFFF81FFFFFF80FFFFFF058 -:101C500003FFFFE007FFFFF007FFFFF00FFFFFF8B4 -:101C60000FFFFFF80FFFFFF80F01C0781FFFFFFC09 -:101C70000FFFFFF80FFF7FF80FFC1FF80FFF7FF833 -:101C800007FFFFF007FFFFF003FFFFE001FFFFC0CA -:101C900000FFFF80007FFF00001FFC0000008000AD -:101CA0000000000000000000010000800FE007F0CD -:101CB0001FF00FF81FF00FF81FF00FF83FF89FFC10 -:101CC0001FFFFFF81FFFFFF81FFFFFF80FFFFFF0D8 -:101CD00003FFFFE007EFFBF00783E0F00F93E4F86A -:101CE0000F11C4780F83E0F80F83E0F81FEFFBFCBF -:101CF0000FFF7FF80FFC1FF80FFC1FF80FF80FF80D -:101D000007FC1FF007FC1FF003FF7FE001FFFFC08F -:101D100000FFFF80007FFF00001FFC00000080002C -:101D20000000000000000000010000800FE007F04C -:101D30001FF00FF81FF00FF81FF00FF83FF89FFC8F -:101D40001FFFFFF81FFFFFF81FFFFFF80FFFFFF057 -:101D500003FFFFE007FFFFF007FFFFF00FEFFBF8C7 -:101D60000F83E0F80F93E4F80F11C4781F83E0FCB1 -:101D70000F8360F80FEC1BF80FFF7FF80FFC1FF8C4 -:101D800007F7F7F007FBEFF003FFFFE001FFFFC0ED -:101D900000FFFF80007FFF00001FFC0000008000AC -:101DA0000000000000000000010000800FE007F0CC -:101DB0001FF00FF81FF00FF81FF00FF83FF89FFC0F -:101DC0001FFFFFF81FFFFFF81FFFFFF80FFFFFF0D7 -:101DD00003FFFFE007FFFFF007FFFFF00FFFFFF833 -:101DE0000FEFFBF80FD7F5F80FFFFFF81FFFFFFC11 -:101DF0000FFFFFF80FF80FF80FFBEFF80FF7F7F8EA -:101E000007FC1FF007FFFFF003FFFFE001FFFFC02B -:101E100000FFFF80007FFF00001FFC00000080002B -:101E20000000000000000000010000800FE007F04B -:101E30001FF00FF81FF00FF81FF00FF83FF89FFC8E -:101E40001FFFFFF81FFFFFF81FFFFFF80FFFFFF056 -:101E500003FFFFE007FFFFF007FFFFF00FFFFFF8B2 -:101E60000FFFFFF80F01C0780FFFFFF81FFFFFFC07 -:101E70000FFF7FF80FFC1FF80FFF7FF80FFFFFF831 -:101E800007F80FF007FFFFF003FFFFE001FFFFC0BF -:101E900000FFFF80007FFF00001FFC0000008000AB -:101EA000141A0000201A00002C1A00003C1A00002E -:101EB000481A0000AED580A83FD300408D14200002 -:101EC000A1C8DA12818FD9F1DB40A4A6AFFF0000D0 -:101ED0000000000000000000010000800FE007F09B -:101EE0001FF00FF81FF00FF81FF00FF83FF89FFCDE -:101EF0001FFFFFF81FFFFFF81FFFFFF80FFFFFF0A6 -:101F000003FFFFE007FFFFF007EFFBF00F83E0F8B0 -:101F10000F93E4F80F11C4780F83E0F81F83E0FCFF -:101F20000FEF7BF80FFC1FF80FFF7FF80FFFFFF894 -:101F300007F80FF007FFFFF003FFFFE001FFFFC00E -:101F400000FFFF80007FFF00001FFC0000008000FA -:101F5000801B0000601B0000401B0000201B0000D5 -:101F6000001B0000E01A0000C01A0000D01E000094 -:101F7000201E0000A01D0000201D0000A01C00006D -:101F8000201C0000A01B00005C1A0000641A000066 -:101F90006C1A0000741A00007C1A0000841A0000F9 -:101FA0008C1A0000981A00009C1A0000A01A000069 -:101FB00044190000000000000000000000FFFC00C9 -:101FC00003FFFF0007FFFF80061FE180063031801E -:101FD00006303180063FC30006330300063183001C -:101FE0000630C30006000600060F060007FFFF804C -:101FF0000FFFFFC01FFFFFE03FFFFFF07FFFFFF875 -:10200000FFFFFFFCFFFFFFFC00F0F00003FFF0000C -:102010000FFFFC00000000000000000000000000B6 -:1020200000000000000000000000000000000000B0 -:102030000000000000000000000000007E81A5817B -:10204000BD99817E7EFFDBFFC3E7FF7E6CFEFEFE57 -:102050007C38100010387CFE7C381000387C38FE4C -:10206000FED6103810387CFEFE7C10380000183C7C -:102070003C180000FFFFE7C3C3E7FFFF003C6642D8 -:1020800042663C00FFC399BDBD99C3FF0F070F7D9A -:10209000CCCCCC783C6666663C187E183F333F302B -:1020A0003070F0E07F637F636367E6C018DB3CE776 -:1020B000E73CDB1880E0F8FEF8E08000020E3EFE10 -:1020C0003E0E0200183C7E18187E3C186666666656 -:1020D000660066007FDBDB7B1B1B1B003E613C66F2 -:1020E000663C867C000000007E7E7E00183C7E18E8 -:1020F0007E3C18FF183C7E1818181800181818187D -:102100007E3C180000180CFE0C180000003060FE29 -:10211000603000000000C0C0C0FE0000002466FF68 -:102120006624000000183C7EFFFF000000FFFF7ED9 -:102130003C1800000000000000000000183C3C18A3 -:102140001800180066662400000000006C6CFE6C2D -:10215000FE6C6C00183E603C067C180000C6CC1873 -:102160003066C600386C3876DCCC76001818300043 -:10217000000000000C18303030180C0030180C0C27 -:102180000C18300000663CFF3C6600000018187E0A -:102190001818000000000000001818300000007E31 -:1021A000000000000000000000181800060C1830A5 -:1021B00060C08000386CC6D6C66C38001838181855 -:1021C00018187E007CC6061C3066FE007CC6063CE5 -:1021D00006C67C001C3C6CCCFE0C1E00FEC0C0FC85 -:1021E00006C67C003860C0FCC6C67C00FEC60C1863 -:1021F000303030007CC6C67CC6C67C007CC6C67E3D -:10220000060C7800001818000018180000181800B4 -:1022100000181830060C1830180C060000007E005C -:10222000007E00006030180C183060007CC60C186E -:10223000180018007CC6DEDEDEC07800386CC6FEF2 -:10224000C6C6C600FC66667C6666FC003C66C0C00E -:10225000C0663C00F86C6666666CF800FE626878E2 -:102260006862FE00FE6268786860F0003C66C0C08C -:10227000CE663A00C6C6C6FEC6C6C6003C181818CA -:1022800018183C001E0C0C0CCCCC7800E6666C7860 -:102290006C66E600F06060606266FE00C6EEFEFE00 -:1022A000D6C6C600C6E6F6DECEC6C6007CC6C6C624 -:1022B000C6C67C00FC66667C6060F0007CC6C6C654 -:1022C000C6CE7C0EFC66667C6C66E6003C6630180A -:1022D0000C663C007E7E5A1818183C00C6C6C6C65E -:1022E000C6C67C00C6C6C6C6C66C3800C6C6C6D63C -:1022F000D6FE6C00C6C66C386CC6C6006666663C08 -:1023000018183C00FEC68C183266FE003C30303097 -:1023100030303C00C06030180C0602003C0C0C0C45 -:102320000C0C3C0010386CC60000000000000000DF -:10233000000000FF30180C00000000000000780CC6 -:102340007CCC7600E0607C666666DC0000007CC6C3 -:10235000C0C67C001C0C7CCCCCCC760000007CC6BB -:10236000FEC07C003C6660F86060F000000076CC47 -:10237000CC7C0CF8E0606C766666E60018003818D5 -:1023800018183C00060006060666663CE060666CAF -:10239000786CE6003818181818183C000000ECFE9D -:1023A000D6D6D6000000DC666666660000007CC6F5 -:1023B000C6C67C000000DC66667C60F0000076CC5F -:1023C000CC7C0C1E0000DC766060F00000007EC05B -:1023D0007C06FC003030FC3030361C000000CCCCD9 -:1023E000CCCC76000000C6C6C66C38000000C6D64D -:1023F000D6FE6C000000C66C386CC6000000C6C675 -:10240000C67E06FC00007E4C18327E000E18187046 -:1024100018180E0018181818181818007018180E28 -:102420001818700076DC0000000000000010386C06 -:10243000C6C6FE007CC6C0C0C67C0C78CC00CCCC26 -:10244000CCCC76000C187CC6FEC07C007C82780C5C -:102450007CCC7600C600780C7CCC76003018780CEA -:102460007CCC76003030780C7CCC760000007EC0CE -:10247000C07E0C387C827CC6FEC07C00C6007CC658 -:10248000FEC07C0030187CC6FEC07C006600381898 -:1024900018183C007C82381818183C003018003896 -:1024A00018183C00C6386CC6FEC6C600386C7CC620 -:1024B000FEC6C6001830FEC0F8C0FE0000007E1840 -:1024C0007ED87E003E6CCCFECCCCCE007C827CC61E -:1024D000C6C67C00C6007CC6C6C67C0030187CC65A -:1024E000C6C67C00788400CCCCCC76006030CCCCE6 -:1024F000CCCC7600C600C6C6C67E06FCC6386CC606 -:10250000C66C3800C600C6C6C6C67C0018187EC099 -:10251000C07E1818386C64F06066FC0066663C7E0D -:10252000187E1818F8CCCCFAC6CFC6C70E1B183CBC -:1025300018D870001830780C7CCC76000C18003855 -:1025400018183C000C187CC6C6C67C001830CCCCD1 -:10255000CCCC760076DC00DC6666660076DC00E6D5 -:10256000F6DECE003C6C6C3E007E0000386C6C38B1 -:10257000007C00001800181830633E00000000FEC8 -:10258000C0C00000000000FE0606000063E66C7E8E -:102590003366CC0F63E66C7A366ADF0618001818CB -:1025A0003C3C1800003366CC6633000000CC663338 -:1025B00066CC0000228822882288228855AA55AA43 -:1025C00055AA55AA77DD77DD77DD77DD181818185D -:1025D0001818181818181818F81818181818F818BB -:1025E000F818181836363636F6363636000000003B -:1025F000FE3636360000F818F81818183636F60683 -:10260000F636363636363636363636360000FE067E -:10261000F63636363636F606FE00000036363636E4 -:10262000FE0000001818F818F80000000000000074 -:10263000F8181818181818181F000000181818187B -:10264000FF00000000000000FF18181818181818E4 -:102650001F18181800000000FF00000018181818B4 -:10266000FF18181818181F181F181818363636367D -:1026700037363636363637303F00000000003F3000 -:10268000373636363636F700FF0000000000FF0010 -:10269000F736363636363730373636360000FF00F6 -:1026A000FF0000003636F700F73636361818FF0000 -:1026B000FF00000036363636FF0000000000FF0045 -:1026C000FF18181800000000FF363636363636364A -:1026D0003F00000018181F181F00000000001F18FE -:1026E0001F181818000000003F36363636363636CA -:1026F000FF3636361818FF18FF181818181818184B -:10270000F8000000000000001F181818FFFFFFFF6E -:10271000FFFFFFFF00000000FFFFFFFFF0F0F0F001 -:10272000F0F0F0F00F0F0F0F0F0F0F0FFFFFFFFF75 -:1027300000000000000076DCC8DC760078CCCCD845 -:10274000CCC6CC00FEC6C0C0C0C0C0000000FE6C3D -:102750006C6C6C00FEC6603060C6FE0000007ED867 -:10276000D8D870000000666666667CC00076DC180B -:10277000181818007E183C66663C187E386CC6FE39 -:10278000C66C3800386CC6C66C6CEE000E180C3E79 -:1027900066663C0000007EDBDB7E0000060C7EDB14 -:1027A000DB7E60C01E30607E60301E00007CC6C6CE -:1027B000C6C6C60000FE00FE00FE000018187E1807 -:1027C00018007E0030180C1830007E000C183018ED -:1027D0000C007E000E1B1B18181818181818181853 -:1027E00018D8D8700018007E001800000076DC00B1 -:1027F00076DC0000386C6C38000000000000001827 -:102800001800000000000018000000000F0C0C0C65 -:10281000EC6C3C1C6C36363636000000780C1830F8 -:102820007C00000000003C3C3C3C0000000000003C -:0428300000000000A4 -:10283400010101000000000000183C6C7EFFFF0055 -:08284400FA00F401E8030000B2 +:100110003305A040513F3305B0408282000037F7DD +:1001200000E01C473E951C47898FE3CE07FE828086 +:10013000B7170240984BB7062000558F98CB984BC5 +:10014000B706E0FFFD16758F98CBB757004003D771 +:100150004740C166938606FC758F1367870123921B +:10016000E74071770507239EE74003D707401367F1 +:1001700017002390E74003D70740136707402390F9 +:10018000E74082809307F00763E7A7029307F00335 +:1001900063E3B70293D735009E07AA97138581C6FC +:1001A0003E959D89054783470500B315B70009C6ED +:1001B000CD8F2300F500828093C5F5FFED8FD5BF6D +:1001C0000111328322CC26CA06CEAA843A86AE9684 +:1001D0001A847D141374F40F1307F00F631AE400EC +:1001E00085056386D5021304F3FF1374F40F268587 +:1001F000130715001AC836C63AC432C22EC0593782 +:1002000022474243B246124682453A85D9B7F24068 +:100210006244D244056182801301C1FD22CE26CC06 +:1002200006D02A84AE82B28483C304008504638529 +:1002300003060147939733000966BA9713060667CA +:10024000B29703C30700814793158301E185368682 +:1002500063C4050013C61600B385E2003305F4003D +:1002600036CA1AC81EC63AC416C23EC0213F42430F +:10027000824721460603850792422247B243D2466F +:100280001373F30FE392C7FC0507E315F7FA3294F3 +:1002900093078007E3DA87F882507244E24413013F +:1002A0004102828083C7050091E3828005058505B0 +:1002B000A30FF5FEC5BF111122CA26C806CCAA8716 +:1002C0002E8720008144A9453A853EC23AC019359F +:1002D0000247130505032300A400A9453A85E93325 +:1002E0000243A546924785042A8705043000E3ECC3 +:1002F00066FC2687BE867D17B305E60083C505002C +:100300008506A38FB6FE65FBE24052443385970015 +:10031000C2447101828083C761C0ADC7311122C65A +:100320002E84AA8537A507001305051206C826C422 +:10033000A53B93175400818F8A07A29713141500C9 +:10034000AA84A28513953700853326949317140049 +:100350002A873EC001440245B71401403AC2914683 +:100360009384044094C8653B0245B706040094C8D2 +:100370007D3312470504E31087FEC2403244A24495 +:10038000510182808280611122C03714014006C26F +:1003900013040480894737C502001CC8130505F201 +:1003A000BD3BB707020092401CC802442101828075 +:1003B000138741C50347070171C3938741C583D69E +:1003C00087003D671307F7A56366D7023695420598 +:1003D00041812394A7009306C002054763FDA60050 +:1003E00093067007094763F8A6009306F00E0D47C1 +:1003F00063F3A600114783C6B70063F1E6087111E5 +:1004000006C0A385E700894585466306B7020D4609 +:10041000AE866302C70205468146630EC70003C766 +:10042000D70031EB838647001307B0036341D7043D +:10043000A386B70091462386D70079479305C0036A +:10044000130500312388E1C4F9359305C003130572 +:10045000C03DD1359305C003130570496D3D93052B +:10046000C00813050062453D8240110129BFA386E3 +:10047000C7008D46C9B7E31FC7FAE5BF82804111A7 +:1004800022C406C626C24D47AA871384C1C463444A +:10049000B7042A940347040015EB2AC09305C00350 +:1004A000130500628D3D9305C00313057049A53502 +:1004B0009305A00513050037B93D8247138781C412 +:1004C0008546BA972300D4002380D700B240224447 +:1004D000924441018280938481C413071003AA943B +:1004E0006343B70203C7040019EB2AC09305200336 +:1004F000130500620D35824705472380E4003E94D2 +:1005000023000400E1B723800400D5BF2E860147F5 +:10051000B307E60083C7070081EFC147998F8A07B9 +:1005200013C7F7FF7D87AA85854633F5E700EDB150 +:100530000507F9BFB71701408847938707409847D9 +:100540009C471345F5FF19831347F7FF958393C71E +:10055000F7FF058B05892207858B7111C207598D1D +:100560005D8D11018280B28731111387F7FF3686C6 +:1005700006C822C626C42A979306F00763F5E6004C +:1005800093070008898F3304F50063178500C24084 +:100590003244A244510182809304150032C22EC01D +:1005A000D536124682452685CDB7130181FD3383AA +:1005B000B64022D036849356F34133C36600B3026B +:1005C000A6403303D34093D6F241B3C2560026CEA1 +:1005D00006D2B382D240AE84B28763C76200A286DD +:1005E000AA843284B6872E8563489400BE86AA8783 +:1005F0003685A2862684B684B303F54093D6F341AC +:1006000033878440B3C37600B383D3409356F70156 +:10061000BA963AC27D573AC0858663D4A70005478B +:100620003AC063D8840092500254F244130181020C +:10063000828036CC1ECA16C81AC6014663D562022D +:100640003E85A2853EC43D3EA2473243C242D243CC +:10065000E246B386764063D606000247BA97124751 +:10066000BA9605047DBFBE8522853EC4213EE24682 +:10067000D243C2423243A247E9BF9307F00763CF98 +:10068000A702411122C406C626C2B387C5001307BC +:1006900000042E846354F7003306B740B304860089 +:1006A00063179400B2402244924441018280A285A3 +:1006B00005462AC0C13C02450504DDB782803111E0 +:1006C00026C4B284368606C836C222C62EC02A8404 +:1006D0006D37124682451385F4FF2295793F824596 +:1006E000854626862285413582479385F7FF9247C6 +:1006F000BE959307F00363EAB70022853244C240F7 +:100700002686A24485465101B9BDC2403244A24466 +:1007100051018280511122C226C02A84B2848546AA +:100720002E86AA85014506C4C53C130500039D46D7 +:100730001306C004A28561371395340026950A0577 +:10074000269506059307300663D2A7029305400657 +:10075000813A0547B305E4001244A240824413766F +:10076000F50F954613051003310199BCA2401244C0 +:10077000824431018280130181FDB387E50022D2DA +:1007800026D02AC832CA13D436003EC68143930706 +:10079000F00363EDB70893F775000547B317F7004B +:1007A0003EC0D24781469E973ECC93D735009E07E8 +:1007B0003ECEE247939236000147B69783C70700C3 +:1007C0003EC2C247BE92F247B3845700B387E200ED +:1007D0001306F0076364F604124593070008B3D7C5 +:1007E000E740E98F3386E400138581C632950343E1 +:1007F00001003EC4834705001346F3FF05077D8EC5 +:10080000A247B337F000B307F0403373F300336609 +:1008100066002300C500A147E31AF7FA8506E31A2C +:10082000D4F8B2478505A293E393B7F612548254E5 +:100830001301810282806167B75700401307076A7E +:10084000938707407D5683D68701898AF9C27D1731 +:10085000E31BC7FE711106C0EFF09F8D8240054576 +:1008600011018280E1679387176A8356470193F6E7 +:10087000060881E6FD17F5FBF1BF83470500050576 +:100880002318F700E310B5FEE1663757004037063E +:1008900007009386066A1307074013064608FD55AE +:1008A0000355470183578701C207C98FF18F6386BC +:1008B000C700FD16E396B6FE71BF835707000145DA +:1008C00093E707202310F700828037570040AA954E +:1008D0001307074045BF930780072318F700616699 +:1008E000B7560040370707001306066A938606408E +:1008F000130727087D5383D2460183D78601C20799 +:10090000B3E75700F98FE382E7FC7D16E31566FE37 +:1009100091B703D70700E166370603001367071096 +:100920002390E700375700409386066A1307074075 +:1009300005067D538352470183578701C207B3E7FA +:100940005700F18FE389C7F8FD16E39566FE19B7E6 +:10095000130181FDA300A10089450A8506D2230069 +:100960000100D13D92501301810282809701002045 +:10097000938101A91381414009651305058873100E +:10098000053097F6FFFF9386E66793E6360073908F +:100990005630138501C39385810601466356B50021 +:1009A00010C11105E34EB5FE172500001305854C57 +:1009B000938541C0138601C36388C500144194C167 +:1009C00011059105E39AC5FEB7F700E0054798C306 +:1009D0008567938787AC739017347300203001A02C +:1009E000371702401C47B7068000D58F1CC72A96D0 +:1009F000AA876393C70082802380B7008507D5BF8D +:100A0000130600408145138581C6D5B7814763131E +:100A1000F60082803387F500834607003307F50030 +:100A200085072300D700E5B779711305100206D6B4 +:100A300022D426D2313F0145213F1305F007093F5B +:100A4000130520023137014521371D45138481C626 +:100A500001379304044093070004A28513060002A3 +:100A6000130511002300F1005537930510020A8584 +:100A700013040402C933E31094FEB250225492547A +:100A800045618280B7270240054798C3B7170240E7 +:100A90003707080123A207001307170898C3370771 +:100AA0009F0098C7984393166700E3DD06FED8437E +:100AB000B7160240719B13672700D8C32147DC4259 +:100AC000B18BE39EE7FE8280130141F886DCA2DA57 +:100AD000A6D84D3FB71402409C4C37140140FD7618 +:100AE00093E757039CCC9307048098439386F60FB3 +:100AF000370600F11377F7F01367070198C337073C +:100B0000020098CB9307044098437D1637050B00ED +:100B1000758F1367071098C33707040098CB1840E8 +:100B2000130505C8419B1367870018C09843718F50 +:100B300037060008518F98C39843370610FF7D167B +:100B4000718F37068000518F98C3054718C8130767 +:100B5000000498CB1307000298CBEFF04FDCDC4C7D +:100B600037072000D98FDCCC9C4C7D779306F70F9C +:100B700093E717019CCC1C400567130707D093F738 +:100B8000F7F01CC01C4093E7070D1CC01C40F58FFC +:100B90001CC01C40D98F1CC00964EFF06FD913042E +:100BA0004440B93D034504009307F00F6314F5007A +:100BB000A53D21A00504693B75D5896491359384D1 +:100BC0000442014490408546A2850145EFF0CFE400 +:100BD000A13D1315140022950A051305054B420586 +:100BE0004181E545EFF02FF3372514001305054447 +:100BF000EFF0EFD22904930720039104E314F4FCEF +:100C000089659385859A13056003EFF03F90293D30 +:100C1000930580071305C03DEFF0EFEF1304800C40 +:100C2000EFF05F911357850093570501A30EE10282 +:100C3000498F230FF102D98F230EA10293F7F70FEB +:100C400081EB75651305054C7D14EFF04FCD69F808 +:100C5000238201C40147814401443AC2EFF09F8DD1 +:100C6000935705011377F50F3ACC2309F10293F757 +:100C7000F70F935685003ECEE24713F7F60F3ACAB8 +:100C80002308A102A308D10202C0124781C79337EB +:100C900014003EC0D24683470100814599C293B5F6 +:100CA0001400724513F6F50F814619C193361700EB +:100CB000D18FD58F99C323A001C403C751C035EB91 +:100CC00099C71305F00A69318547A382F1C083C72C +:100CD000A1C381C7FD17238DF1C283C701C581C799 +:100CE000FD172388F1C4938741C583C70701138487 +:100CF00041C581CF83D781C39306900F8507C20773 +:100D0000C183E3E7F624239CF1C283A741C337855F +:100D10000500130505E4850723AAF1C283A701C4D2 +:100D2000850723A0F1C4EFF08FBF7247D24462441D +:100D30002DB703C741C411466369E67E09660A07F9 +:100D4000130646B732971843028785C103C5D1C33E +:100D50008D4536C20905EFF02FBAA38EA1C2E54535 +:100D600013057041EFF02FDB924691CE03C5D1C33E +:100D70008D450505EFF04FB8A38EA1C2E5451305DB +:100D80007041EFF04FD98247B5C337575A64130704 +:100D9000070523AAE1C4938741C5130740062382B0 +:100DA000E70003C7D1C323930700239407002385DB +:100DB000E7000547A385E70023A607002388E7008F +:100DC000238E01C2238801C423A401C49305000516 +:100DD000130530292382E1C423A601C4EFF0AFD369 +:100DE000930580071305C03DEFF0EFD211398965F7 +:100DF0009385859B0145EFF06FF18546130600084A +:100E0000A9450145EFF02FF603C4D1C38967938745 +:100E1000075413173400018F0A07BA97904313073A +:100E20000002BA86B54513050003EFF0DF9489652B +:100E30009385859C6818EFF0EFC689670A0493874D +:100E40004743A2978C43EFF0EFC589659385C59C16 +:100E5000EFF04FC5230005006C181305F002EFF00A +:100E6000EFEA89659385059D130580038DA985C1EA +:100E700003C5C1C39D4536C21905EFF0EFA7238E08 +:100E8000A1C2E54513057041EFF0EFC8924691CE3F +:100E900003C5C1C39D450505EFF00FA6238EA1C272 +:100EA000E54513057041EFF00FC78247938441C5B4 +:100EB000638E070E83C7C1C3994663E9F60E896640 +:100EC0008A07938686B8B6979C43828783870400F7 +:100ED00013074006F9076355F704BA872380F40027 +:100EE0008387340013074006ED176350F704BA8771 +:100EF000A381F4001144238881C231479305C003C4 +:100F000013050037238DE1C2EFF0EFC09305000514 +:100F100013057049EFF02FC0EFF0EFC6114569A03F +:100F200013C7F7FF7D87F98F55BF13C7F7FF7D877D +:100F3000F98F7DBF03872400B94763C9E700930594 +:100F400080071305C00DEFF00FBD8DA0838714003F +:100F500093064006E50763D7F638B687A380F4000A +:100F6000930747FF130740066353F700BA872381AF +:100F7000F40009472388E1C29305C00331471305F4 +:100F8000C03D238DE1C2EFF00FB99305C0031305F7 +:100F90007052EFF04FB8130500629305A005EFF013 +:100FA0008FB7EFF04FBE1945EFF08FC0EFF05FA5A0 +:100FB00083C7C1C301453ED0025789679387475C09 +:100FC0000A07BA978C43EFF06FD483C704013EC879 +:100FD00095C303874400F54763CEE70083A741C369 +:100FE000A18B89CB096685461306069E814501457E +:100FF000EFF08FA283C5B4009307C004130551031B +:10100000230AF102EFF02FAB2300050085465018AC +:10101000814513050007EFF02FA085461306000851 +:10102000A9450145EFF02FD403C4F400630404384C +:10103000096685461306469EB9451305E004EFF0A0 +:10104000AF9D096685461306869EB145130540058A +:10105000EFF08F9C930700033EC4C1473EC0930747 +:1010600000033EC283C7C40009661306064C3EC691 +:1010700032478D47630BF702B24611476386E63A63 +:10108000424783C6A400194519C703C7A1C3630F0C +:10109000073403C501C393973600958F0967AA9754 +:1010A0008A0713070754BA979043824522451307CE +:1010B0000002BA8632C8EFF00FEC42468967938788 +:1010C000074C630FF610896793870744630AF6108D +:1010D00063180410B2476382071403C7A400938700 +:1010E000C1C0BA9703C40700938641C1938701C169 +:1010F000BA97369703C30700034707008246924713 +:101100001D46B302D7009A979385E2FF1385D7FF58 +:10111000014791461AD616D42ED23EC8EFF04F8A18 +:10112000924792550147338587001D4691467515B4 +:10113000EFF00F8932531D47C24733066440A25275 +:101140006352C702138547009307F00763CCA700DB +:101150009385F2FF9307F00363C6B70081466516D7 +:10116000EFF06FC0324785476309F70A92478D0752 +:101170003ED2824712551384A7009247A285A50745 +:101180003ED4824722568907BE863EC8EFF0EFC1A3 +:101190009247C2462255DD073E86B6853ED6EFF021 +:1011A000CFC09247C24532551386D701A286EFF0D1 +:1011B000CFBF82479D4611469385C700924701479E +:1011C00013851700EFE0DFFF8247125593868701F2 +:1011D00092471386A700824793852701EFF0EFBC63 +:1011E00032478D47631BF70203A441C3824705467C +:1011F0001375340093854700A24779153E95EFE0BB +:101200007FF8824713751400130505029385A70024 +:10121000A24705463E95EFE0FFF685461306000817 +:101220009305E0020145EFF00FB4014483C7E400E9 +:101230006360F4200144096713074759931724009A +:10124000BA97931434009043A29441478604BA8617 +:101250009305000313851400EFF0EFD10257937745 +:10126000F40F6319F700C54636869305F00226850C +:10127000EFF0EFC405049D47E31FF4FA83C701C5EF +:101280006383072A0147E14613064007C94519450C +:10129000EFE01FF3E14613064007C9451945EFF09B +:1012A0000FC289659385C59E5545EFF02FA68965C8 +:1012B0009385859F6818EFE0FFFEB2470967130723 +:1012C000075B8A07BA978C43EFE0DFFD896593855A +:1012D000C59FEFE03FFD230005006C187D45EFF052 +:1012E000EFA291A493C6F7FFFD86F58F85B903C5DC +:1012F000F40093058007933715003335A0003305BC +:10130000A0401375C50DA387F4001305851B25B9EF +:10131000838714009306400623870400A381D4002A +:101320009507138741C563D3F602B687930520035B +:1013300013057052A300F700EFE0FFFD13057041A5 +:1013400093052003EFE03FFD0D45B9B993C6F7FFC4 +:10135000FD86F58FE1BF838744001307400693871E +:1013600037026356F702BA879305C00313050031AD +:101370002382F400EFE03FFA9305C00313057041A8 +:10138000EFE07FF99305A0051305705261B613C70E +:10139000F7FF7D87F98FC9BF89472382F1C4930581 +:1013A00080021305302945B691472382F1C4A38DED +:1013B00001C2F5B783A741C3930500053E853EC032 +:1013C000EFE05FD1130770028247636DA700130738 +:1013D000E5013AC42247A18BB337F000B9073AC2FE +:1013E0003EC049B11307E006098FE5B71545E31480 +:1013F00004CA0386440075473E85E35EC7C803867A +:1014000014006147E359C7C8038604004D47E354FD +:10141000C7C803A541C39305200336C8EFE09FCB9F +:10142000C2461335450085B9096613060644B5B9A9 +:1014300013151400229521470A05BA86138681C127 +:10144000930560023A950504EFF0EFB21374F40FC0 +:10145000F1BB89CB8547F945130500372382F1C4D9 +:10146000EFE07FEBEFF0CFD98965938505A00145CB +:10147000138441C5EFF08F890306040089659385C5 +:1014800005A12945EFF00FA903061400896593858E +:1014900085A14D45EFF00FA80306240089659385CB +:1014A00005A27145EFF00FA7030634008965938507 +:1014B00085A213055002EFF0EFA5030644008965ED +:1014C000938505A31305E002EFF0CFA48344B40095 +:1014D0009307C0041305D103A685230EF102EFE0A4 +:1014E0009FDD8965938585A3EFE0DFDB8D4763E4AE +:1014F0009706835584008604EFE0FFDB9307F00234 +:101500002300F500938781C2BE9483D504000505AE +:10151000EFE07FDA2300050085467018930580030D +:101520000145EFE07FCFEFF02FD003C741C0938795 +:1015300001C20607BA9783D70700638A07F803A793 +:1015400001C46366F7F81305E00AEFF06FC0A382E9 +:1015500001C06FF0CFF78965938505A4EFE09FD4B4 +:1015600055BF85C103C5B1C38D4536C20905EFE03E +:10157000BFB8A38DA1C2E54513057041EFE0BFD907 +:10158000924691CE03C5B1C38D450505EFE0DFB6A8 +:10159000A38DA1C2E54513057041EFE0DFD7824777 +:1015A00095CF03C7B1C301EF83C741C09305800244 +:1015B00085078D8B2382F1C01305003731A885473D +:1015C0006319F70E83C761C09305C0031305C03DBF +:1015D00093B717002383F1C0EFE0FFD3EFF04FC2C2 +:1015E0008965938545A40145EFE05FF285461306C2 +:1015F0000008A9450145EFE01FF78965938545A5DA +:101600006818EFE03FCA03C741C089679387075E48 +:101610000A07BA978C43EFE0FFC8896523000500ED +:10162000938505A61305D104EFE0DFC783C761C02A +:10163000C9C789659385C597EFE0DFC68965230033 +:101640000500938585A61305E105EFE0BFC52300DE +:101650000500C5440144938714003EC003C3B1C3D1 +:101660009372F40F631E53000547A9461306000842 +:10167000A685014516C21AC0EFE09FB4924202430C +:1016800013164400B306534022967C189385140029 +:10169000B336D0003E961145EFE01FB8B1041307F2 +:1016A00050030504E399E4FA8965938505A76FF073 +:1016B000AFFB2382F1C4F94501B78965938545984D +:1016C000A5BF824799CF93050005130530292382D2 +:1016D00001C4EFE05FC4930580071305C03DEFE050 +:1016E0009FC3EFF0EFB1130700020966BA86130635 +:1016F000065F894513050003EFF0EF87138741C5A7 +:101700008346D7000947138441C5639FE602896574 +:101710009385859813054002EFE05FDF8965938527 +:1017200045A86818EFE01FB88345B400EFE0BFB8E4 +:10173000230005006C181305E002EFE03FDD89652A +:10174000938545A96FF04FF2896593858599D9B73F +:101750000356640083070400239C01C20506420669 +:1017600041822313C400FD17130740068346F4008B +:101770006354F708BA87E20703072400E1871305DB +:101780004006C9C693056700635DB506AA852300B8 +:10179000F4002301B4009307D00563D5E700A30745 +:1017A000040081461377160019CB83073400930594 +:1017B0004006FD1763DAF508AE87A301F400834500 +:1017C000E400C1EA894763EDB70093173600918FB3 +:1017D00003A641C3B297FD8BADEF85052307B40087 +:1017E00035CB8307140013064006FD176353F61428 +:1017F000B287A300F400B9A813C7F7FF7D87F98F5C +:101800009DBF13C5F5FF7D85E98D51B72300F40019 +:101810009307F7FF6350F502AA872301F4008307BB +:10182000140013074006FD17635BF700BA87A30097 +:10183000F4008DBF13C7F7FF7D87F98FF9BF13C77A +:10184000F7FF7D87F98FE5B793C5F7FFFD85ED8F2E +:10185000ADB7D9F503063400CD4763CDC70019CB2A +:101860008307140013074006FD176359F70CBA8766 +:10187000A300F40003470400BA876207618763533B +:10188000E600B2870347140093958701E18513169C +:10189000870161866353B600BA8703472400939596 +:1018A0008701E1851316870161866353B600BA8705 +:1018B000139787016187394683074400634AE60826 +:1018C000F517130740066350F708BA872302F400A0 +:1018D000830504000145EFE09FBA83051400054528 +:1018E000EFE0FFB9830524000945EFE05FB9830508 +:1018F00034000D45EFE0BFB8830744006347F0C0F4 +:101900000D479305800C1305A0142382E1C423081E +:101910000400EFE05FA09305800C1305700FEFE06B +:101920009F9F930500191305500AEFE0DF9E6FF0AB +:10193000CFBD13C6F7FF7D86F18F65BD13C7F7FFD7 +:101940007D87F98F35B713C7F7FF7D87F98FBDBF47 +:1019500013062003E35EE6F6890713074006635A81 +:10196000F700BA872302F400A5F60D45EFE05FA467 +:1019700085B713C7F7FF7D87F98FEDB74F6E00006E +:10198000000000004F6666002A2A20434F5252553D +:1019900050544544202A2A005345474641554C544B +:1019A0002028313129000000707265737320616E48 +:1019B00079206B65790000007E20242061646F70BF +:1019C00074202D2D706574003C200000203E000026 +:1019D0004C2F52207069636B20204F4B20676F00A3 +:1019E000210000007A0000005A0000003E3E206501 +:1019F000766F6C76696E67005B200000205D0000EA +:101A00007E2F7065742024207374617400000000C0 +:101A1000464F4F440000000048415050590000001C +:101A2000454E455247590000434C45414E00000089 +:101A30004845414C544800002020787020000000A8 +:101A40004D4158002D2053455454494E4753202DA5 +:101A50000000000053637265656E206F66663A0091 +:101A6000536F756E643A20004261636B00000000A2 +:101A70004C2F52206D6F766520204F4B207573657B +:101A800000000000636F72652064756D70656420EE +:101A90004C0000004F4B3A207265737061776E0006 +:101AA00070616E61676F7463686920763200000050 +:101AB000626F6F74696E67206B65726E656C2E2E37 +:101AC000000000006D6F756E74202F70657420200B +:101AD0006F6B0000737061776E207368656C6C20AB +:101AE000206F6B003E202E2F74616D61676F7463F1 +:101AF00068695F005368656C6C00000050616E6B34 +:101B00006F000000546D75780000000070726F6304 +:101B1000000000007573657200000000726F6F7442 +:101B200000000000436C617564650000676C6974B7 +:101B3000636800004645454400000000504C415990 +:101B400000000000534C4545500000004845414C02 +:101B500000000000535441545300000053455454B6 +:101B6000494E475300000000313573003330730095 +:101B7000363073004A0D00006E0E00005214000053 +:101B8000C216000062150000CC0E0000340F0000E9 +:101B9000EE1200001013000056130000981300000E +:101BA000A81300000000000000000000000000007A +:101BB0001FFFFFF83FFFFFFC3FFF7FFC3FFF7FFC65 +:101BC0003FFF7FFC3FFF7FFC3FFF7FFC3FFF7FFC31 +:101BD0003FFF7FFC3FFF7FFC3C07701C3FFF7FFC0B +:101BE0003FFF7FFC3FFF7FFC3FFF7FFC3FFF7FFC11 +:101BF0003FFF7FFC3FFF7FFC3FFF7FFC3FFF7FFC01 +:101C00003FFFFFFC2000000427DF000427DF000463 +:101C1000200000041FFFFFF800000000000000008B +:101C200000000000000000000000000000000000B4 +:101C30001FFFFFF83FFFFFFC3FFF7FFC3FFF7FFCE4 +:101C40003FFF7FFC3FFF7FFC3FFF7FFC3FFF7FFCB0 +:101C50003FBF7EFC3F1F7C7C3E0F783C3F1F7C7C5F +:101C60003FBF7EFC3FFF7FFC3FFF7FFC3FFF7FFCD1 +:101C70003FBF7EFC3C07701C3FFF7FFC3FFF7FFCAB +:101C80003FFFFFFC2000000427DF000427DF0004E3 +:101C9000200000041FFFFFF800000000000000000B +:101CA0000000000000000000000000000000000034 +:101CB0001FFFFFF83FFFFFFC3FFF7FFC3FFF7FFC64 +:101CC0003FFF7FFC3FFF7FFC3FFF7FFC3FFF7FFC30 +:101CD0003F5F7D7C3EAF7ABC3FFF7FFC3FFF7FFCD8 +:101CE0003FFF7FFC3FFF7FFC3FFF7FFC3FFF7FFC10 +:101CF0003C03601C3FFF7FFC3FFF7FFC3FFF7FFCFE +:101D00003FFFFFFC2000000427DF000427DF000462 +:101D1000200000041FFFFFF800000000000000008A +:101D200000000000000000000000000000000000B3 +:101D30001FFFFFF83FFFFFFC3FFF7FFC3FFF7FFCE3 +:101D40003FFF7FFC3FFF7FFC3FFF7FFC3FBF7EFCF0 +:101D50003F1F7C7C3E0F783C3F1F7C7C3FBF7EFC5E +:101D60003FFF7FFC3FFF7FFC3FFF7FFC3C07701C79 +:101D70003FFF7FFC3FFF7FFC3FFF7FFC3FFF7FFC7F +:101D80003FFFFFFC2000000427DF000427DF0004E2 +:101D9000200000041FFFFFF800000000000000000A +:101DA0000000000000008000001088000011880082 +:101DB00000318C000039DC00003BDC00007FFE00BD +:101DC000007FFE0000F83F0000E7C70000DFFB00D7 +:101DD00001BFFD8001FFFF8003FFFFC003FFFFC0C5 +:101DE00003DBDBC003E7E7C003E7E7C003DBDBC0DF +:101DF00001FDDF8001FABF8000F77F00007FFE0059 +:101E000001FFFFC001FFFFC003FFFFE003FFFFE092 +:101E100003FFFFE007FFFFF007FFFFF00FFFFFF8F2 +:101E20000FFFFFF80000800000108800001188F00C +:101E300000318C200039DC40003BDCF0007FFE00EC +:101E4000007FFE0000F83F0000E7C70000DFFB0056 +:101E500001BFFD8001FFFF8003FFFFC003FFFFC044 +:101E600003FFFFC003C3C3C003FFFFC003FFFFC0E6 +:101E700001FFFF8001FE7F8000FFFF00007FFE006A +:101E800001FFFFC001FFFFC003FFFFE003FFFFE012 +:101E900003FFFFE007FFFFF007FFFFF00FFFFFF872 +:101EA0000FFFFFF80000800000108800001188007C +:101EB00000318C000039DC00003BDC00007FFE00BC +:101EC000007FFE0000F83F0000E7C70000DFFB00D6 +:101ED00001BFFD8001FFFF8003FFFFC003FFFFC0C4 +:101EE00003E7E7C003E7E7C003FFFFC003FFFFC04E +:101EF00001FC3F8001FD3F8000FCBF00007C3E00F4 +:101F000001FFFFC001FFFFC003FFFFE003FFFFE091 +:101F100003FFFFE007FFFFF007FFFFF00FFFFFF8F1 +:101F20000FFFFFF8000080000010880000118800FB +:101F300000318C000039DC00003BDC00007FFE003B +:101F4000007FFE0000F83F0000E7C70000DFFB0055 +:101F500001BFFD8001FFFF80039FF9C003E7E7C0D9 +:101F600003FFFFC003E7E7C003E7E7C003FFFFC0CD +:101F700001FFFF8001FFFF8000FC3F00007BDE00CF +:101F800001F7EFC001FFFFC003FFFFE003FFFFE029 +:101F900003FFFFE007FFFFF007FFFFF00FFFFFF871 +:101FA0000FFFFFF80000800000108800001188007B +:101FB00000318C000039DC00003BDC00007FFE00BB +:101FC000007FFE0000F83F0000E7C70000DFFB00D5 +:101FD00001BFFD8001FFFF8003FFFFC003FFFFC0C3 +:101FE00003EFF7C003E7EBC003DBDBC003FFFFC079 +:101FF00001FFFF8001F7EF8000F7EF00007BDE00BC +:1020000001FC3FC001FFFFC003FFFFE003FFFFE053 +:1020100003FFFFE007FFFFF007FFFFF00FFFFFF8F0 +:102020000FFFFFF8000080000010880000118800FA +:1020300000318C000039DC00003BDC00007FFE003A +:10204000007FFE0000F83F0000E7C70000DFFB0054 +:1020500001BFFD8001FFFF8003FFFFC003FFFFC042 +:1020600003FFFFC003C3C3C003FFFFC003FFFFC0E4 +:1020700001FFFF8001FC3F8000FFFF00007FFE00AA +:1020800001FFFFC001FFFFC003FFFFE003FFFFE010 +:1020900003FFFFE007FFFFF007FFFFF00FFFFFF870 +:1020A0000FFFFFF80000800000108800001188007A +:1020B00000318C000039DC00003BDC00007FFE00BA +:1020C000007FFE0000F83F0000E7C70000DFFB00D4 +:1020D00001BFFD8001FFFF8003FFFFC003FFFFC0C2 +:1020E00003E7E7C003E7E7C003FFFFC003FFFFC04C +:1020F00001FFFF8001FC3F8000FFFF00007FFE002A +:1021000001FFFFC001FFFFC003FFFFE003FFFFE08F +:1021100003FFFFE007FFFFF007FFFFF00FFFFFF8EF +:102120000FFFFFF8000000000000000000000000AA +:1021300007FFFFE00FFFFFF00FFFFFF00FFFFFF0C3 +:102140000FFFFFF00FFFFFF00FFFFFF00FFFFFF09B +:102150000FFFFFF00F0180F00FFFFFF00FFFFFF008 +:102160000FFFFFF00FFFFFF00FFFFFF00FFFFFF07B +:102170000FFFFFF00FF80FF00FFFFFF00FFFFFF062 +:102180000FFFFFF00FFFFFF007FFFFE00007E00089 +:102190000007E0000007E000007FFE00007FFE0077 +:1021A000007FFE00000000000000000000000000B2 +:1021B00007FFFFE00FFFFFF00FFFFFF00FFFFFF043 +:1021C0000FFFFFF00FFFFFF00FFFFFF00FEFF7F033 +:1021D0000FC7E3F00F83C1F00FC7E3F00FEFF7F085 +:1021E0000FFFFFF00FFFFFF00FFFFFF00FFFFFF0FB +:1021F0000FFFFFF00FFFFFF00FFFFFF00FF81FF0D2 +:102200000FC7E3F00FFFFFF007FFFFE00007E0005C +:102210000007E0000007E000007FFE00007FFE00F6 +:10222000007FFE0000000000000000000000000031 +:1022300007FFFFE00FFFFFF00FFFFFF00FFFFFF0C2 +:102240000FFFFFF00FFFFFF00FFFFFF00FDFEFF0CA +:102250000FAFD7F00FFFFFF00FFFFFF00FFFFFF002 +:102260000FFFFFF00FFFFFF00FFFFFF00FFFFFF07A +:102270000FC7E3F00FF81FF00FFFFFF00FFFFFF0A5 +:102280000FFFFFF00FFFFFF007FFFFE00007E00088 +:102290000007E0000007E000007FFE00007FFE0076 +:1022A000007FFE00000000000000000000000000B1 +:1022B00007FFFFE00FFFFFF00FFFFFF00FFFFFF042 +:1022C0000FFFFFF00FFFFFF00FEFF7F00FC7E3F086 +:1022D0000F83C1F00FC7E3F00FEFF7F00FFFFFF030 +:1022E0000FFFFFF00FFFFFF00FFFFFF00F7FFFF07A +:1022F0000FBFFFF00FDFFFF00FBFFFF00F780FF001 +:102300000FFFFFF00FFFFFF007FFFFE00007E00007 +:102310000007E0000007E000007FFE00007FFE00F5 +:10232000007FFE0003C003C003C007F00FF81FFCCE +:10233000FF7FFE3FFC1FFE3F1F7C1FFC0FF807F0D6 +:1023400003C003C000000000000000C000C000C0C7 +:1023500006C006C006D806D836D836D836D836D8FD +:10236000000000000000008007F00FF81C3C3C3E1D +:10237000300E300E700F300E3C3E3C3E1FFC0FF80E +:1023800007F00080000000000080008001C001C054 +:1023900007F00DF80DF808F81DFC0DF80FF80FF810 +:1023A00007F0008000000000000004000C001C008A +:1023B00018001C003C001C001E001F000FE807F066 +:1023C0000080000000000000077000001F7C3F7EBE +:1023D0003F7E3F7E00003F7E3F7E3F7E1F7C0000B1 +:1023E000077000000000000000A001900FE01BF04B +:1023F0003BF831F83BF87BFC3FF83FF83FF81FF023 +:102400000FE00100AED580A83FD300408D1420001E +:10241000A1C8DA12818FD9F1DB40A4A6AFFF00007A +:10242000A01A0000B01A0000C41A0000D41A00005C +:10243000E41A0000F41A0000FC1A0000041B00005B +:10244000000000000000000000000000000000008C +:10245000000000020000000000000000000000007A +:1024600080008000000FF8000015540000FFFF807E +:1024700001FFFFC003FFFFE00111444107D7F5F062 +:1024800007EFFBF007D7F5F0051144500FFFFFF8F9 +:1024900007FFFFF007FFFFF00555555007EAABF0C7 +:1024A00043FFFFE003FFFFE00155554000FFFF80C1 +:1024B000003FFE00000FF8042000000000000000B4 +:1024C00000000000000000000000002000000020CC +:1024D000040000A80E000020040003FE00000020FD +:1024E000000080A8000FF820003FFE20007FFF00C2 +:1024F00000FFFF8001FFFFC001FFFFC003FFFFE0FF +:1025000003F7F7E003F7F7E003E3E3E007F7F7F09B +:1025100003F7F7E003FFFFE003FFFFE003E7F3E06B +:1025200001F80FC001FFFFC000FFFF80007FFF0028 +:10253000003FFE00000FF8000000800000000000D7 +:10254000A4220000A422000024220000A4210000F4 +:102550002422000024210000A4210000A420000067 +:1025600024200000A41F0000241F0000A41E00005F +:10257000241E0000A41D0000241D0000241D0000D6 +:10258000A41C0000241C0000A41C0000A41B0000CC +:10259000241C0000E4230000C4230000A423000046 +:1025A000842300006423000044230000242300004F +:1025B0000C1B0000141B00001C1B0000241B00004F +:1025C0002C1B0000341B00003C1B0000441B0000BF +:1025D000281A00004C1B0000541B00005C1B00006C +:1025E000681B00006C1B0000701B000084190000B9 +:1025F000000000000000000000FFFC0003FFFF00DF +:1026000007FFFF80061FE1800630318006303180F1 +:10261000063FC30006330300063183000630C300C3 +:1026200006000600060F060007FFFF800FFFFFC031 +:102630001FFFFFE03FFFFFF07FFFFFF8FFFFFFFC02 +:10264000FFFFFFFC00F0F00003FFF0000FFFFC00B5 +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:1026700000000000000000007E81A581BD99817EE0 +:102680007EFFDBFFC3E7FF7E6CFEFEFE7C381000A2 +:1026900010387CFE7C381000387C38FEFED61038AE +:1026A00010387CFEFE7C10380000183C3C180000FE +:1026B000FFFFE7C3C3E7FFFF003C664242663C0002 +:1026C000FFC399BDBD99C3FF0F070F7DCCCCCC785C +:1026D0003C6666663C187E183F333F303070F0E051 +:1026E0007F637F636367E6C018DB3CE7E73CDB188A +:1026F00080E0F8FEF8E08000020E3EFE3E0E020092 +:10270000183C7E18187E3C18666666666600660091 +:102710007FDBDB7B1B1B1B003E613C66663C867CD3 +:10272000000000007E7E7E00183C7E187E3C18FF74 +:10273000183C7E1818181800181818187E3C180035 +:1027400000180CFE0C180000003060FE6030000025 +:102750000000C0C0C0FE0000002466FF6624000028 +:1027600000183C7EFFFF000000FFFF7E3C180000C9 +:102770000000000000000000183C3C181800180081 +:1027800066662400000000006C6CFE6CFE6C6C0041 +:10279000183E603C067C180000C6CC183066C600A7 +:1027A000386C3876DCCC7600181830000000000059 +:1027B0000C18303030180C0030180C0C0C1830008D +:1027C00000663CFF3C6600000018187E18180000E8 +:1027D00000000000001818300000007E000000001B +:1027E0000000000000181800060C183060C08000BF +:1027F000386CC6D6C66C38001838181818187E0001 +:102800007CC6061C3066FE007CC6063C06C67C0004 +:102810001C3C6CCCFE0C1E00FEC0C0FC06C67C003E +:102820003860C0FCC6C67C00FEC60C1830303000D4 +:102830007CC6C67CC6C67C007CC6C67E060C7800FC +:102840000018180000181800001818000018183098 +:10285000060C1830180C060000007E00007E0000F8 +:102860006030180C183060007CC60C181800180076 +:102870007CC6DEDEDEC07800386CC6FEC6C6C6008A +:10288000FC66667C6666FC003C66C0C0C0663C00B8 +:10289000F86C6666666CF800FE6268786862FE0036 +:1028A000FE6268786860F0003C66C0C0CE663A00A0 +:1028B000C6C6C6FEC6C6C6003C18181818183C0086 +:1028C0001E0C0C0CCCCC7800E6666C786C66E600CE +:1028D000F06060606266FE00C6EEFEFED6C6C60010 +:1028E000C6E6F6DECEC6C6007CC6C6C6C6C67C0038 +:1028F000FC66667C6060F0007CC6C6C6C6CE7C0EF8 +:10290000FC66667C6C66E6003C6630180C663C0033 +:102910007E7E5A1818183C00C6C6C6C6C6C67C00BD +:10292000C6C6C6C6C66C3800C6C6C6D6D6FE6C00BD +:10293000C6C66C386CC6C6006666663C18183C0095 +:10294000FEC68C183266FE003C30303030303C0021 +:10295000C06030180C0602003C0C0C0C0C0C3C0047 +:1029600010386CC60000000000000000000000FFEE +:1029700030180C00000000000000780C7CCC7600C1 +:10298000E0607C666666DC0000007CC6C0C67C0039 +:102990001C0C7CCCCCCC760000007CC6FEC07C003D +:1029A0003C6660F86060F000000076CCCC7C0CF8EF +:1029B000E0606C766666E6001800381818183C006F +:1029C000060006060666663CE060666C786CE6000B +:1029D0003818181818183C000000ECFED6D6D6009F +:1029E0000000DC666666660000007CC6C6C67C0029 +:1029F0000000DC66667C60F0000076CCCC7C0C1EAF +:102A00000000DC766060F00000007EC07C06FC0008 +:102A10003030FC3030361C000000CCCCCCCC760002 +:102A20000000C6C6C66C38000000C6D6D6FE6C00D4 +:102A30000000C66C386CC6000000C6C6C67E06FC28 +:102A400000007E4C18327E000E18187018180E0008 +:102A500018181818181818007018180E1818700080 +:102A600076DC0000000000000010386CC6C6FE00D6 +:102A70007CC6C0C0C67C0C78CC00CCCCCCCC76005C +:102A80000C187CC6FEC07C007C82780C7CCC760066 +:102A9000C600780C7CCC76003018780C7CCC7600A4 +:102AA0003030780C7CCC760000007EC0C07E0C38C4 +:102AB0007C827CC6FEC07C00C6007CC6FEC07C005A +:102AC00030187CC6FEC07C006600381818183C0020 +:102AD0007C82381818183C003018003818183C0050 +:102AE000C6386CC6FEC6C600386C7CC6FEC6C600BC +:102AF0001830FEC0F8C0FE0000007E187ED87E00B0 +:102B00003E6CCCFECCCCCE007C827CC6C6C67C00A3 +:102B1000C6007CC6C6C67C0030187CC6C6C67C0013 +:102B2000788400CCCCCC76006030CCCCCCCC760099 +:102B3000C600C6C6C67E06FCC6386CC6C66C380063 +:102B4000C600C6C6C6C67C0018187EC0C07E18184F +:102B5000386C64F06066FC0066663C7E187E18186F +:102B6000F8CCCCFAC6CFC6C70E1B183C18D87000DC +:102B70001830780C7CCC76000C18003818183C0003 +:102B80000C187CC6C6C67C001830CCCCCCCC7600E9 +:102B900076DC00DC6666660076DC00E6F6DECE00FB +:102BA0003C6C6C3E007E0000386C6C38007C000091 +:102BB0001800181830633E00000000FEC0C000007E +:102BC000000000FE0606000063E66C7E3366CC0F54 +:102BD00063E66C7A366ADF06180018183C3C180069 +:102BE000003366CC6633000000CC663366CC000050 +:102BF000228822882288228855AA55AA55AA55AA31 +:102C000077DD77DD77DD77DD1818181818181818B4 +:102C100018181818F81818181818F818F818181894 +:102C200036363636F636363600000000FE36363694 +:102C30000000F818F81818183636F606F636363644 +:102C400036363636363636360000FE06F636363638 +:102C50003636F606FE00000036363636FE00000038 +:102C60001818F818F800000000000000F8181818EC +:102C7000181818181F00000018181818FF00000076 +:102C800000000000FF181818181818181F18181836 +:102C900000000000FF00000018181818FF1818188E +:102CA00018181F181F1818183636363637363636A5 +:102CB000363637303F00000000003F3037363636BA +:102CC0003636F700FF0000000000FF00F73636360A +:102CD00036363730373636360000FF00FF0000004A +:102CE0003636F700F73636361818FF00FF000000BA +:102CF00036363636FF0000000000FF00FF181818B7 +:102D000000000000FF363636363636363F0000000B +:102D100018181F181F00000000001F181F1818188F +:102D2000000000003F36363636363636FF36363649 +:102D30001818FF18FF18181818181818F8000000AD +:102D4000000000001F181818FFFFFFFFFFFFFFFF24 +:102D500000000000FFFFFFFFF0F0F0F0F0F0F0F0F7 +:102D60000F0F0F0F0F0F0F0FFFFFFFFF00000000EF +:102D7000000076DCC8DC760078CCCCD8CCC6CC00A1 +:102D8000FEC6C0C0C0C0C0000000FE6C6C6C6C0011 +:102D9000FEC6603060C6FE0000007ED8D8D8700045 +:102DA0000000666666667CC00076DC18181818009D +:102DB0007E183C66663C187E386CC6FEC66C3800D1 +:102DC000386CC6C66C6CEE000E180C3E66663C0095 +:102DD00000007EDBDB7E0000060C7EDBDB7E60C05D +:102DE0001E30607E60301E00007CC6C6C6C6C600AF +:102DF00000FE00FE00FE000018187E1818007E007D +:102E000030180C1830007E000C1830180C007E00B2 +:102E10000E1B1B18181818181818181818D8D8705E +:102E20000018007E001800000076DC0076DC000050 +:102E3000386C6C380000000000000018180000001A +:102E400000000018000000000F0C0C0CEC6C3C1C87 +:102E50006C36363636000000780C18307C000000E6 +:102E600000003C3C3C3C0000000000000000000072 +:102E70000101010000000000141517000B0B0900F0 +:102E80000B110C0000183C6C7EFFFF00FA00F401EF +:0C2E9000E803000000002D007800F000B6 :00000001FF diff --git a/tama.lst b/tama.lst index 4c81ce2..bd67310 100644 --- a/tama.lst +++ b/tama.lst @@ -11,38 +11,38 @@ Disassembly of section .init: { #if !defined(FUNCONF_TINYVECTOR) || !FUNCONF_TINYVECTOR asm volatile( DEFAULT_INTERRUPT_VECTOR_CONTENTS ); - 0: 0eb0006f j 8ea + 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