From 27c866f26b6085447d04cfda3973b17aaef73084 Mon Sep 17 00:00:00 2001 From: Carl Vargklint Date: Thu, 18 Jun 2026 23:04:26 +0200 Subject: [PATCH] Added screen timeout and more warnings, increased timescale --- __pycache__/sprites_gen.cpython-313.pyc | Bin 14413 -> 15056 bytes sprites.h | 26 +- sprites_gen.py | 18 +- tama.bin | Bin 9488 -> 10316 bytes tama.c | 213 +- tama.elf | Bin 86052 -> 90572 bytes tama.hex | 1142 ++--- tama.lst | 5174 ++++++++++++----------- tama.map | 791 ++-- 9 files changed, 3973 insertions(+), 3391 deletions(-) diff --git a/__pycache__/sprites_gen.cpython-313.pyc b/__pycache__/sprites_gen.cpython-313.pyc index dc2c9720a1c62acd7e63291e61735c3e2afd18ca..7a67a70035f5465afbd9589e5fc19f718387dc21 100644 GIT binary patch delta 812 zcmY*WO-vI(6n-qi?B<<{JymrA zkA-(#Ge28$74;okJbMZRC=lcZibx~DZkRz7b0!s;#F<=VGHJ|RSv*BFUa5_Gi0AAG zz_h4`X=hb_1=k=p8yr}Wh-~145*G}50W6d(JIDb>5U~-v zAs^&A98t=M<50QO1aOQGN!m*PlB1ouZsDX-QcVz@P3$>raYW?JP0Wly(=|*mvGd1f z*h@A{@Iyd}(**xO!vdBBqyz}BbWFfy0S`C?Y*eh5Y665m+A6@ua_+hYb$a5KHI|;5 zo13;$X}Zi6Kmh4Qrnl;CJ8E?{lD+YGG=sJsYGyp!o4s9dG^`k_$5-iE=azQnw*(dL z9rogMZCy#|Tf=L;hti{#HkJ)3=zIQI=ri^ZE!ixFh$vl76o<eyE_+>)Cm!F8VV6A9*zNUF{>gKdHr4RKd;$!^@Gd`?$ zv-h2T_OVMtSJ{uQK~?|%sLUVjL4E9cG^Xf2GB7+m6u-c7Q8%h)ucIcW%WOXyajx@W z?JhVoP?hUb@a`cdPRar{Xy2SL|i?!{#alsekGXV5; Lt^~51x_IS39s;vl delta 364 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 delta 3219 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 P9(3{xmT&oUEQbCITxRq* diff --git a/tama.c b/tama.c index 3f50256..84e81a9 100644 --- a/tama.c +++ b/tama.c @@ -30,11 +30,17 @@ // ----------------------------------------------------------------- tuning #define FRAME_MS 60 // main loop period -#define TICK_FRAMES 50 // stat update every ~3 s (50 * 60 ms) +#define TICK_FRAMES 250 // stat update every ~15 s (250 * 60 ms) #define ANIM_FRAMES 12 // how long an action reaction is shown +// With the values below an untended pet survives roughly half an hour: +// a need empties in ~20 min, after which health bleeds down over ~10 more. + // ----------------------------------------------------------------- state -enum { SCR_MAIN, SCR_STATS, SCR_DEAD }; +enum { 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 }; typedef struct { int8_t satiety; // 0..100 (fullness) @@ -55,9 +61,26 @@ static uint8_t anim_exp; // expression forced during a reaction static uint8_t anim_timer; // frames remaining for the reaction 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 + +// 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 + +// screen-off-on-inactivity options, in frames (0 = never sleep the display) +static const uint16_t screen_timeout_opts[] = { 250, 500, 1000, 0 }; +static const char *const screen_timeout_names[] = { "15s", "30s", "60s", "Off" }; +#define TIMEOUT_OPT_COUNT 4 +#define SETTINGS_ROWS 3 // screen-off, sound, back + +// display power state +static uint8_t disp_on = 1; +static uint32_t idle_frames = 0; // frames since the last button activity // menu icon order must match sprites.h menu_icons[] / menu_labels[] -enum { ACT_FEED, ACT_PLAY, ACT_SLEEP, ACT_CLEAN, ACT_HEAL, ACT_STATS }; +enum { ACT_FEED, ACT_PLAY, ACT_SLEEP, ACT_CLEAN, ACT_HEAL, ACT_STATS, ACT_SETTINGS }; // ----------------------------------------------------------------- helpers static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } @@ -65,6 +88,7 @@ static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } // 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; if (freq == 0) { Delay_Ms(ms); return; } uint32_t half = 500000u / freq; // half-period in us uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); @@ -96,6 +120,36 @@ static void pet_reset(void) pet.alive = 1; screen = SCR_MAIN; cursor = 0; + for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } +} + +// 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) +{ + if (val < 20) { + if (!crit_flag[idx]) { // urgent: descending triple + beep(1568, 60); beep(1175, 60); beep(880, 90); + crit_flag[idx] = 1; warn_flag[idx] = 1; + } + } else if (val < 50) { + if (!warn_flag[idx]) { // gentle: single chirp + beep(1568, 50); + warn_flag[idx] = 1; + } + crit_flag[idx] = 0; + } else { + warn_flag[idx] = 0; crit_flag[idx] = 0; + } +} + +static void check_notifications(void) +{ + notify(N_FOOD, pet.satiety); + notify(N_FUN, pet.happy); + notify(N_ENGY, pet.energy); + notify(N_WASH, pet.hygiene); } // pick the expression frame to draw this instant @@ -156,6 +210,12 @@ static void do_action(uint8_t act) screen = SCR_STATS; beep(659, 40); break; + + case ACT_SETTINGS: + screen = SCR_SETTINGS; + set_sel = 0; + beep(659, 40); + break; } } @@ -165,35 +225,38 @@ static void game_tick(void) pet.age_min++; if (pet.sleeping) { - pet.energy = clamp100(pet.energy + 10); - // drift down slowly even while asleep + pet.energy = clamp100(pet.energy + 6); + // needs still drift down slowly even while asleep pet.satiety = clamp100(pet.satiety - 1); if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested } else { - pet.satiety = clamp100(pet.satiety - 3); - pet.energy = clamp100(pet.energy - 2); - pet.happy = clamp100(pet.happy - 2); + pet.satiety = clamp100(pet.satiety - 1); + pet.energy = clamp100(pet.energy - 1); + pet.happy = clamp100(pet.happy - 1); } - pet.hygiene = clamp100(pet.hygiene - 1); + // hygiene drifts every other tick + if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); - // random-ish bowel movements (LFSR-free: derive from counters) + // occasional bowel movements (derived from counters, no RNG needed) if (!pet.sleeping && pet.poop < 3 && - ((pet.age_min * 7u + frame) & 0x0F) == 0) + ((pet.age_min * 7u + frame) & 0x1F) == 0) pet.poop++; - // being dirty / full of poop saps happiness - if (pet.poop) pet.happy = clamp100(pet.happy - pet.poop); - if (pet.hygiene < 20) pet.happy = clamp100(pet.happy - 1); + // being dirty / full of poop slowly saps happiness + if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); + if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); // health responds to overall wellbeing int8_t lo = pet.satiety; if (pet.happy < lo) lo = pet.happy; if (pet.energy < lo) lo = pet.energy; if (pet.hygiene < lo) lo = pet.hygiene; - if (lo < 15) pet.health = clamp100(pet.health - 5); + if (lo < 15) pet.health = clamp100(pet.health - 3); else if (lo > 50) pet.health = clamp100(pet.health + 2); + check_notifications(); + if (pet.health <= 0) { pet.alive = 0; screen = SCR_DEAD; @@ -213,12 +276,12 @@ static void draw_center_str(int y, const char *s) static void draw_menu_bar(void) { - // 6 icons across the bottom, selected one boxed + // 7 icons across the bottom (18 px slots), selected one boxed for (uint8_t i = 0; i < ICON_COUNT; i++) { - int x = i * 21 + 3; + int x = i * 18 + 1; ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); if (i == cursor) - ssd1306_drawRect(x - 2, 46, ICON_W + 3, ICON_H + 2, 1); + ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1); } } @@ -292,6 +355,28 @@ static void draw_dead(void) ssd1306_refresh(); } +static void draw_settings(void) +{ + ssd1306_setbuf(0); + draw_center_str(0, "- SETTINGS -"); + 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"); + + for (uint8_t r = 0; r < SETTINGS_ROWS; r++) { + int y = 18 + r * 12; + if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1); + // selected row drawn inverted (color 0 on the lit bar) + ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1); + } + + draw_center_str(56, "L/R move OK use"); + ssd1306_refresh(); +} + // ----------------------------------------------------------------- input typedef struct { uint8_t ok, left, right; } Buttons; @@ -366,48 +451,88 @@ int main(void) uint8_t ok_edge = b.ok && !prev.ok; uint8_t left_edge = b.left && !prev.left; uint8_t right_edge = b.right && !prev.right; + uint8_t any_edge = ok_edge | left_edge | right_edge; prev = b; - switch (screen) { - case SCR_MAIN: - if (left_edge) { - cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; - beep(1047, 25); - } - if (right_edge) { - cursor = (cursor + 1) % ICON_COUNT; - beep(1047, 25); - } - if (ok_edge) do_action(cursor); - draw_main(); - break; + if (any_edge) idle_frames = 0; - case SCR_STATS: - if (ok_edge || left_edge || right_edge) { - screen = SCR_MAIN; - beep(880, 30); + if (!disp_on) { + // screen is asleep: the first press only wakes it (not an action) + if (any_edge) { + ssd1306_cmd(SSD1306_DISPLAYON); + disp_on = 1; } - draw_stats(); - break; + } else { + switch (screen) { + case SCR_MAIN: + if (left_edge) { + cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; + beep(1047, 25); + } + if (right_edge) { + cursor = (cursor + 1) % ICON_COUNT; + beep(1047, 25); + } + if (ok_edge) do_action(cursor); + draw_main(); + break; - case SCR_DEAD: - if (ok_edge) { // start a new pet - pet_reset(); - beep(659, 80); beep(988, 120); + case SCR_STATS: + if (any_edge) { screen = SCR_MAIN; beep(880, 30); } + draw_stats(); + break; + + case SCR_SETTINGS: + if (left_edge) { + set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS; + beep(1047, 25); + } + if (right_edge) { + set_sel = (set_sel + 1) % SETTINGS_ROWS; + beep(1047, 25); + } + if (ok_edge) { + if (set_sel == 0) { // cycle screen-off timeout + timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; + beep(880, 40); + } else if (set_sel == 1) { // toggle sound + sound_on = !sound_on; + beep(988, 60); // only audible if just enabled + } else { // Back + screen = SCR_MAIN; + beep(880, 30); + } + } + draw_settings(); + break; + + case SCR_DEAD: + if (ok_edge) { // start a new pet + pet_reset(); + beep(659, 80); beep(988, 120); + } + draw_dead(); + break; + } + + // sleep the display after the configured idle period + uint16_t timeout = screen_timeout_opts[timeout_idx]; + if (timeout && idle_frames >= timeout) { + ssd1306_cmd(SSD1306_DISPLAYOFF); + disp_on = 0; } - draw_dead(); - break; } if (anim_timer) anim_timer--; - // advance game time independent of which screen is showing + // advance game time independent of screen / display state if (pet.alive && ++tick_acc >= TICK_FRAMES) { tick_acc = 0; game_tick(); } frame++; + idle_frames++; Delay_Ms(FRAME_MS); } } diff --git a/tama.elf b/tama.elf index 8e32faaea6ddf18eb9e6b0f9cbd796de96c74e8c..263b74a6d18c265b1f85fb4adbca8f4bcaff1f2d 100755 GIT binary patch literal 90572 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 + 0: 0eb0006f j 8ea 4: 00000000 .word 0x00000000 - 8: 000008fe .word 0x000008fe - c: 000008b2 .word 0x000008b2 + 8: 000009b0 .word 0x000009b0 + c: 0000095c .word 0x0000095c ... - 30: 000008b2 .word 0x000008b2 + 30: 0000095c .word 0x0000095c 34: 00000000 .word 0x00000000 - 38: 000008b2 .word 0x000008b2 + 38: 0000095c .word 0x0000095c 3c: 00000000 .word 0x00000000 - 40: 000008b2 .word 0x000008b2 - 44: 000008b2 .word 0x000008b2 - 48: 000008b2 .word 0x000008b2 - 4c: 000008b2 .word 0x000008b2 - 50: 000008b2 .word 0x000008b2 - 54: 000008b2 .word 0x000008b2 - 58: 000008b2 .word 0x000008b2 - 5c: 000008b2 .word 0x000008b2 - 60: 000008b2 .word 0x000008b2 - 64: 000008b2 .word 0x000008b2 - 68: 000008b2 .word 0x000008b2 - 6c: 000008b2 .word 0x000008b2 - 70: 000008b2 .word 0x000008b2 - 74: 000008b2 .word 0x000008b2 - 78: 000008b2 .word 0x000008b2 - 7c: 000008b2 .word 0x000008b2 - 80: 000008b2 .word 0x000008b2 - 84: 000008b2 .word 0x000008b2 - 88: 000008b2 .word 0x000008b2 - 8c: 000008b2 .word 0x000008b2 - 90: 000008b2 .word 0x000008b2 - 94: 000008b2 .word 0x000008b2 - 98: 000008b2 .word 0x000008b2 + 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 9c: 0000 unimp ... @@ -411,7 +411,7 @@ void ssd1306_i2c_setup(void) 332: 4047d703 lhu a4,1028(a5) # 40005404 <_eusrstack+0x20004c04> tempreg &= ~I2C_CTLR2_FREQ; 336: 66c1 lui a3,0x10 - 338: fc068693 addi a3,a3,-64 # ffc0 + 338: fc068693 addi a3,a3,-64 # ffc0 33c: 8f75 and a4,a4,a3 tempreg |= (FUNCONF_SYSTEM_CORE_CLOCK/SSD1306_I2C_PRERATE)&I2C_CTLR2_FREQ; 33e: 01876713 ori a4,a4,24 @@ -468,7 +468,7 @@ void ssd1306_drawPixel(uint32_t x, uint32_t y, int color) /* set/clear bit in buffer */ if(color) ssd1306_buffer[addr] |= (1<<(y&7)); - 380: c2818513 addi a0,gp,-984 # 20000024 + 380: c4418513 addi a0,gp,-956 # 20000040 384: 953e add a0,a0,a5 386: 899d andi a1,a1,7 388: 4705 li a4,1 @@ -488,2971 +488,3323 @@ void ssd1306_drawPixel(uint32_t x, uint32_t y, int color) 3a0: 8fed and a5,a5,a1 3a2: bfd5 j 396 -000003a4 : -// ----------------------------------------------------------------- helpers +000003a4 : + +/* + * 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 + 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 + 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 + 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 + col = (~color)&1; + 3e0: 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 + d <<= 1; + 3fa: 4342 lw t1,16(sp) + for(j=0;j<8;j++) + 3fc: 4782 lw a5,0(sp) + 3fe: 4621 li a2,8 + d <<= 1; + 400: 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) + d <<= 1; + 40c: 0ff37313 zext.b t1,t1 + for(j=0;j<8;j++) + 410: fcc792e3 bne a5,a2,3d4 + for(i=0;i<8;i++) + 414: 0705 addi a4,a4,1 + 416: faf715e3 bne a4,a5,3c0 + { + ssd1306_drawchar(x, y, c, color); + x += 8; + 41a: 9432 add s0,s0,a2 + if(x>120) + 41c: 07800793 li a5,120 + 420: f887dae3 bge a5,s0,3b4 + 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 + +00000430 : static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } // short square-wave beep on the passive piezo (blocking, ms-scale only) static void beep(uint16_t freq, uint16_t ms) { - 3a4: 1131 addi sp,sp,-20 - 3a6: c622 sw s0,12(sp) - 3a8: 842e mv s0,a1 + if (!sound_on) return; + 430: c061c783 lbu a5,-1018(gp) # 20000002 + 434: c7ad beqz a5,49e +{ + 436: 1131 addi sp,sp,-20 + 438: c622 sw s0,12(sp) + 43a: 842e mv s0,a1 if (freq == 0) { Delay_Ms(ms); return; } uint32_t half = 500000u / freq; // half-period in us - 3aa: 85aa mv a1,a0 - 3ac: 0007a537 lui a0,0x7a - 3b0: 12050513 addi a0,a0,288 # 7a120 + 43c: 85aa mv a1,a0 + 43e: 0007a537 lui a0,0x7a + 442: 12050513 addi a0,a0,288 # 7a120 { - 3b4: c806 sw ra,16(sp) - 3b6: c426 sw s1,8(sp) + 446: c806 sw ra,16(sp) + 448: c426 sw s1,8(sp) uint32_t half = 500000u / freq; // half-period in us - 3b8: 39c5 jal a8 <__hidden___udivsi3> + 44a: 39b9 jal a8 <__hidden___udivsi3> uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); - 3ba: 00541793 slli a5,s0,0x5 - 3be: 8f81 sub a5,a5,s0 - 3c0: 078a slli a5,a5,0x2 - 3c2: 97a2 add a5,a5,s0 - 3c4: 00151413 slli s0,a0,0x1 + 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 uint32_t half = 500000u / freq; // half-period in us - 3c8: 84aa mv s1,a0 + 45a: 84aa mv s1,a0 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); - 3ca: 85a2 mv a1,s0 - 3cc: 00379513 slli a0,a5,0x3 - 3d0: 39e1 jal a8 <__hidden___udivsi3> + 45c: 85a2 mv a1,s0 + 45e: 00379513 slli a0,a5,0x3 + 462: 3199 jal a8 <__hidden___udivsi3> for (uint32_t i = 0; i < cycles; i++) { funDigitalWrite(BUZZER, FUN_HIGH); Delay_Us(half); - 3d2: 9426 add s0,s0,s1 - 3d4: 00141793 slli a5,s0,0x1 + 464: 9426 add s0,s0,s1 + 466: 00141793 slli a5,s0,0x1 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); - 3d8: 872a mv a4,a0 + 46a: 872a mv a4,a0 Delay_Us(half); - 3da: c03e sw a5,0(sp) + 46c: c03e sw a5,0(sp) for (uint32_t i = 0; i < cycles; i++) { - 3dc: 4401 li s0,0 + 46e: 4401 li s0,0 Delay_Us(half); - 3de: 4502 lw a0,0(sp) + 470: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_HIGH); - 3e0: 400114b7 lui s1,0x40011 - 3e4: c23a sw a4,4(sp) - 3e6: 4691 li a3,4 - 3e8: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00> - 3ec: c894 sw a3,16(s1) + 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) Delay_Us(half); - 3ee: 3d91 jal 242 + 480: 33c9 jal 242 funDigitalWrite(BUZZER, FUN_LOW); Delay_Us(half); - 3f0: 4502 lw a0,0(sp) + 482: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_LOW); - 3f2: 000406b7 lui a3,0x40 - 3f6: c894 sw a3,16(s1) + 484: 000406b7 lui a3,0x40 + 488: c894 sw a3,16(s1) Delay_Us(half); - 3f8: 35a9 jal 242 + 48a: 3b65 jal 242 for (uint32_t i = 0; i < cycles; i++) { - 3fa: 4712 lw a4,4(sp) - 3fc: 0405 addi s0,s0,1 - 3fe: fe8710e3 bne a4,s0,3de + 48c: 4712 lw a4,4(sp) + 48e: 0405 addi s0,s0,1 + 490: fe8710e3 bne a4,s0,470 } } - 402: 40c2 lw ra,16(sp) - 404: 4432 lw s0,12(sp) - 406: 44a2 lw s1,8(sp) - 408: 0151 addi sp,sp,20 - 40a: 8082 ret + 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 -0000040c : +000004a0 : static void led_blink(void) { - 40c: 1161 addi sp,sp,-8 - 40e: c022 sw s0,0(sp) + 4a0: 1161 addi sp,sp,-8 + 4a2: c022 sw s0,0(sp) funDigitalWrite(LED_PIN, FUN_HIGH); - 410: 40011437 lui s0,0x40011 + 4a4: 40011437 lui s0,0x40011 { - 414: c206 sw ra,4(sp) + 4a8: c206 sw ra,4(sp) funDigitalWrite(LED_PIN, FUN_HIGH); - 416: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000> - 41a: 4789 li a5,2 + 4aa: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000> + 4ae: 4789 li a5,2 Delay_Ms(30); - 41c: 0002c537 lui a0,0x2c + 4b0: 0002c537 lui a0,0x2c funDigitalWrite(LED_PIN, FUN_HIGH); - 420: c81c sw a5,16(s0) + 4b4: c81c sw a5,16(s0) Delay_Ms(30); - 422: f2050513 addi a0,a0,-224 # 2bf20 - 426: 3d31 jal 242 + 4b6: f2050513 addi a0,a0,-224 # 2bf20 + 4ba: 3361 jal 242 funDigitalWrite(LED_PIN, FUN_LOW); - 428: 000207b7 lui a5,0x20 + 4bc: 000207b7 lui a5,0x20 } - 42c: 4092 lw ra,4(sp) + 4c0: 4092 lw ra,4(sp) funDigitalWrite(LED_PIN, FUN_LOW); - 42e: c81c sw a5,16(s0) + 4c2: c81c sw a5,16(s0) } - 430: 4402 lw s0,0(sp) - 432: 0121 addi sp,sp,8 - 434: 8082 ret + 4c4: 4402 lw s0,0(sp) + 4c6: 0121 addi sp,sp,8 + 4c8: 8082 ret -00000436 : +000004ca : static void pet_reset(void) { pet.satiety = 80; - 436: 645a5737 lui a4,0x645a5 - 43a: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850> - 43e: c0e1ae23 sw a4,-996(gp) # 20000018 + 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; - 442: c1c18793 addi a5,gp,-996 # 20000018 - 446: 06400713 li a4,100 - 44a: 00e78223 sb a4,4(a5) # 20004 + 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; - 44e: 4705 li a4,1 + 4e2: 4705 li a4,1 pet.age_min = 0; - 450: 00079323 sh zero,6(a5) + 4e4: 00079323 sh zero,6(a5) pet.poop = 0; - 454: 00079423 sh zero,8(a5) + 4e8: 00079423 sh zero,8(a5) pet.alive = 1; - 458: 00e78523 sb a4,10(a5) + 4ec: 00e78523 sb a4,10(a5) screen = SCR_MAIN; - 45c: c0018c23 sb zero,-1000(gp) # 20000014 + 4f0: c2018aa3 sb zero,-971(gp) # 20000031 cursor = 0; - 460: c0018ba3 sb zero,-1001(gp) # 20000013 + 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 } - 464: 8082 ret + 500: 8082 ret -00000466 : +00000502 : + +// 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) + if (val < 20) { + 50a: 474d li a4,19 +{ + 50c: 87aa mv a5,a0 + if (val < 20) { + 50e: c2c18413 addi s0,gp,-980 # 20000028 + 512: 04b74463 blt a4,a1,55a + 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) + 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 + 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) + } + 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 + } else if (val < 50) { + 55a: c3018493 addi s1,gp,-976 # 2000002c + 55e: 03100713 li a4,49 + if (!warn_flag[idx]) { // gentle: single chirp + 562: 94aa add s1,s1,a0 + } else if (val < 50) { + 564: 02b74363 blt a4,a1,58a + if (!warn_flag[idx]) { // gentle: single chirp + 568: 0004c703 lbu a4,0(s1) + 56c: eb19 bnez a4,582 + 56e: c02a sw a0,0(sp) + beep(1568, 50); + 570: 03200593 li a1,50 + 574: 62000513 li a0,1568 + 578: 3d65 jal 430 + warn_flag[idx] = 1; + 57a: 4782 lw a5,0(sp) + 57c: 4705 li a4,1 + 57e: 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) +} + 588: b7e1 j 550 + warn_flag[idx] = 0; crit_flag[idx] = 0; + 58a: 00048023 sb zero,0(s1) + 58e: bfd5 j 582 + +00000590 : + } +} + +// ----------------------------------------------------------------- drawing +static void draw_center_str(int y, const char *s) +{ + 590: 862e mv a2,a1 + int len = 0; + 592: 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 + int x = (SSD1306_W - len * 8) / 2; + 59e: 47c1 li a5,16 + 5a0: 8f99 sub a5,a5,a4 + 5a2: 078a slli a5,a5,0x2 + if (x < 0) x = 0; + 5a4: fff7c713 not a4,a5 + 5a8: 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 + while (s[len]) len++; + 5b4: 0705 addi a4,a4,1 + 5b6: bff9 j 594 + +000005b8 : static Buttons read_buttons(void) { // active-low: pressed reads 0 Buttons b; b.ok = !funDigitalRead(BTN_OK); - 466: 400117b7 lui a5,0x40011 - 46a: 4788 lw a0,8(a5) + 5b8: 400117b7 lui a5,0x40011 + 5bc: 4788 lw a0,8(a5) b.left = !funDigitalRead(BTN_LEFT); - 46c: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00> - 470: 4798 lw a4,8(a5) + 5be: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00> + 5c2: 4798 lw a4,8(a5) b.right = !funDigitalRead(BTN_RIGHT); - 472: 479c lw a5,8(a5) + 5c4: 479c lw a5,8(a5) b.ok = !funDigitalRead(BTN_OK); - 474: fff54513 not a0,a0 + 5c6: fff54513 not a0,a0 b.left = !funDigitalRead(BTN_LEFT); - 478: 8319 srli a4,a4,0x6 - 47a: fff74713 not a4,a4 + 5ca: 8319 srli a4,a4,0x6 + 5cc: fff74713 not a4,a4 b.right = !funDigitalRead(BTN_RIGHT); - 47e: 8395 srli a5,a5,0x5 - 480: fff7c793 not a5,a5 + 5d0: 8395 srli a5,a5,0x5 + 5d2: fff7c793 not a5,a5 return b; - 484: 8b05 andi a4,a4,1 - 486: 8905 andi a0,a0,1 - 488: 0722 slli a4,a4,0x8 - 48a: 8b85 andi a5,a5,1 + 5d6: 8b05 andi a4,a4,1 + 5d8: 8905 andi a0,a0,1 + 5da: 0722 slli a4,a4,0x8 + 5dc: 8b85 andi a5,a5,1 { - 48c: 1171 addi sp,sp,-4 + 5de: 1171 addi sp,sp,-4 return b; - 48e: 07c2 slli a5,a5,0x10 - 490: 8d59 or a0,a0,a4 + 5e0: 07c2 slli a5,a5,0x10 + 5e2: 8d59 or a0,a0,a4 } - 492: 8d5d or a0,a0,a5 - 494: 0111 addi sp,sp,4 - 496: 8082 ret + 5e4: 8d5d or a0,a0,a5 + 5e6: 0111 addi sp,sp,4 + 5e8: 8082 ret -00000498 : -} - -/* - * draw a string to the display - */ -void ssd1306_drawstr(int x, int y, const char *str, uint8_t color) - 498: 1101 addi sp,sp,-32 - 49a: cc22 sw s0,24(sp) - 49c: ca26 sw s1,20(sp) - 49e: ce06 sw ra,28(sp) - 4a0: 842a mv s0,a0 - 4a2: 832e mv t1,a1 - 4a4: 84b2 mv s1,a2 -{ - uint8_t c; - - while((c=*str++)) - 4a6: 0004c283 lbu t0,0(s1) - 4aa: 0485 addi s1,s1,1 - 4ac: 04028d63 beqz t0,506 - 4b0: 4701 li a4,0 - d = fontdata[(chr<<3)+i]; - 4b2: 00329793 slli a5,t0,0x3 - 4b6: 6689 lui a3,0x2 - 4b8: ba068693 addi a3,a3,-1120 # 1ba0 - 4bc: 97ba add a5,a5,a4 - 4be: 97b6 add a5,a5,a3 - 4c0: 0007c683 lbu a3,0(a5) - 4c4: 4781 li a5,0 - ssd1306_drawPixel(x+j, y+i, col); - 4c6: 0076d613 srli a2,a3,0x7 - 4ca: 00e305b3 add a1,t1,a4 - 4ce: 00f40533 add a0,s0,a5 - 4d2: c816 sw t0,16(sp) - 4d4: c636 sw a3,12(sp) - 4d6: c43a sw a4,8(sp) - 4d8: c21a sw t1,4(sp) - 4da: c03e sw a5,0(sp) - 4dc: 3571 jal 368 - d <<= 1; - 4de: 46b2 lw a3,12(sp) - for(j=0;j<8;j++) - 4e0: 4782 lw a5,0(sp) - 4e2: 4621 li a2,8 - d <<= 1; - 4e4: 0686 slli a3,a3,0x1 - for(j=0;j<8;j++) - 4e6: 0785 addi a5,a5,1 - 4e8: 4312 lw t1,4(sp) - 4ea: 4722 lw a4,8(sp) - 4ec: 42c2 lw t0,16(sp) - d <<= 1; - 4ee: 0ff6f693 zext.b a3,a3 - for(j=0;j<8;j++) - 4f2: fcc79ae3 bne a5,a2,4c6 - for(i=0;i<8;i++) - 4f6: 0705 addi a4,a4,1 - 4f8: faf71de3 bne a4,a5,4b2 - { - ssd1306_drawchar(x, y, c, color); - x += 8; - 4fc: 9432 add s0,s0,a2 - if(x>120) - 4fe: 07800793 li a5,120 - 502: fa87d2e3 bge a5,s0,4a6 - break; - } -} - 506: 40f2 lw ra,28(sp) - 508: 4462 lw s0,24(sp) - 50a: 44d2 lw s1,20(sp) - 50c: 6105 addi sp,sp,32 - 50e: 8082 ret - -00000510 : -{ - 510: 862e mv a2,a1 - int len = 0; - 512: 4701 li a4,0 - while (s[len]) len++; - 514: 00e607b3 add a5,a2,a4 - 518: 0007c783 lbu a5,0(a5) - 51c: eb99 bnez a5,532 - int x = (SSD1306_W - len * 8) / 2; - 51e: 47c1 li a5,16 - 520: 8f99 sub a5,a5,a4 - 522: 078a slli a5,a5,0x2 - if (x < 0) x = 0; - 524: fff7c713 not a4,a5 - 528: 877d srai a4,a4,0x1f - ssd1306_drawstr(x, y, s, 1); - 52a: 85aa mv a1,a0 - 52c: 00e7f533 and a0,a5,a4 - 530: b7a5 j 498 - while (s[len]) len++; - 532: 0705 addi a4,a4,1 - 534: b7c5 j 514 - -00000536 : +000005ea : if((x >= SSD1306_W) || (y >= SSD1306_H)) return; - 536: 07f00713 li a4,127 - 53a: 04a76263 bltu a4,a0,57e - 53e: 03f00793 li a5,63 - 542: 02b7ee63 bltu a5,a1,57e -void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) - 546: 1141 addi sp,sp,-16 - if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; - 548: fff60793 addi a5,a2,-1 -void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) - 54c: c422 sw s0,8(sp) - 54e: c606 sw ra,12(sp) - 550: c226 sw s1,4(sp) - if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; - 552: 97aa add a5,a5,a0 - 554: 842a mv s0,a0 - 556: 00f77563 bgeu a4,a5,560 - 55a: 08000613 li a2,128 - 55e: 8e09 sub a2,a2,a0 - 560: 00c404b3 add s1,s0,a2 - 564: 8522 mv a0,s0 - ssd1306_drawPixel(x++, y, color); - 566: 4605 li a2,1 - 568: c02e sw a1,0(sp) - 56a: 0405 addi s0,s0,1 - 56c: 3bf5 jal 368 - while (w--) - 56e: 4582 lw a1,0(sp) - 570: fe849ae3 bne s1,s0,564 -} - 574: 40b2 lw ra,12(sp) - 576: 4422 lw s0,8(sp) - 578: 4492 lw s1,4(sp) - 57a: 0141 addi sp,sp,16 - 57c: 8082 ret - 57e: 8082 ret - -00000580 : - if((x >= SSD1306_W) || (y >= SSD1306_H)) return; - 580: 07f00793 li a5,127 - 584: 02a7cf63 blt a5,a0,5c2 + 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) - 588: 1141 addi sp,sp,-16 - 58a: c422 sw s0,8(sp) - 58c: c606 sw ra,12(sp) - 58e: c226 sw s1,4(sp) + 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; - 590: 00c587b3 add a5,a1,a2 - 594: 04000713 li a4,64 - 598: 842e mv s0,a1 - 59a: 00f75463 bge a4,a5,5a2 - 59e: 40b70633 sub a2,a4,a1 - 5a2: 008604b3 add s1,a2,s0 + 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--) - 5a6: 00941763 bne s0,s1,5b4 + 610: 00941763 bne s0,s1,61e } - 5aa: 40b2 lw ra,12(sp) - 5ac: 4422 lw s0,8(sp) - 5ae: 4492 lw s1,4(sp) - 5b0: 0141 addi sp,sp,16 - 5b2: 8082 ret + 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); - 5b4: 85a2 mv a1,s0 - 5b6: 4605 li a2,1 - 5b8: c02a sw a0,0(sp) - 5ba: 337d jal 368 - 5bc: 4502 lw a0,0(sp) - 5be: 0405 addi s0,s0,1 - 5c0: b7dd j 5a6 - 5c2: 8082 ret + 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 -000005c4 : -void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) - 5c4: 1131 addi sp,sp,-20 - 5c6: c426 sw s1,8(sp) - 5c8: 84b2 mv s1,a2 - ssd1306_drawFastVLine(x, y, h, color); - 5ca: 8636 mv a2,a3 -void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) - 5cc: c806 sw ra,16(sp) - 5ce: c622 sw s0,12(sp) - 5d0: c236 sw a3,4(sp) - 5d2: 842a mv s0,a0 - 5d4: c02e sw a1,0(sp) - ssd1306_drawFastVLine(x, y, h, color); - 5d6: 376d jal 580 - ssd1306_drawFastVLine(x+w-1, y, h, color); - 5d8: 4612 lw a2,4(sp) - 5da: 4582 lw a1,0(sp) - 5dc: fff48513 addi a0,s1,-1 - 5e0: 9522 add a0,a0,s0 - 5e2: 3f79 jal 580 - ssd1306_drawFastHLine(x, y, w, color); - 5e4: 4582 lw a1,0(sp) - 5e6: 8626 mv a2,s1 - 5e8: 8522 mv a0,s0 - 5ea: 37b1 jal 536 - ssd1306_drawFastHLine(x, y+h-1, w, color); - 5ec: 4782 lw a5,0(sp) - 5ee: 8522 mv a0,s0 -} - 5f0: 4432 lw s0,12(sp) - ssd1306_drawFastHLine(x, y+h-1, w, color); - 5f2: fff78593 addi a1,a5,-1 - 5f6: 4792 lw a5,4(sp) -} - 5f8: 40c2 lw ra,16(sp) - ssd1306_drawFastHLine(x, y+h-1, w, color); - 5fa: 8626 mv a2,s1 -} - 5fc: 44a2 lw s1,8(sp) - ssd1306_drawFastHLine(x, y+h-1, w, color); - 5fe: 95be add a1,a1,a5 -} - 600: 0151 addi sp,sp,20 - ssd1306_drawFastHLine(x, y+h-1, w, color); - 602: bf15 j 536 - -00000604 : -{ - 604: 1121 addi sp,sp,-24 - 606: c822 sw s0,16(sp) - 608: c626 sw s1,12(sp) - 60a: 842a mv s0,a0 - 60c: 84b2 mv s1,a2 - ssd1306_drawstr(0, y, label, 1); - 60e: 862e mv a2,a1 - 610: 85aa mv a1,a0 - 612: 4501 li a0,0 -{ - 614: ca06 sw ra,20(sp) - ssd1306_drawstr(0, y, label, 1); - 616: 3549 jal 498 - ssd1306_drawRect(bx, y, bw, 7, 1); - 618: 03000513 li a0,48 - 61c: 469d li a3,7 - 61e: 04c00613 li a2,76 - 622: 85a2 mv a1,s0 - 624: 3745 jal 5c4 - int fill = (val * (bw - 2)) / 100; - 626: 00349513 slli a0,s1,0x3 - 62a: 9526 add a0,a0,s1 - 62c: 050a slli a0,a0,0x2 - 62e: 9526 add a0,a0,s1 - 630: 0506 slli a0,a0,0x1 - if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); - 632: 06300793 li a5,99 - 636: 02a7df63 bge a5,a0,674 - 63a: 00140793 addi a5,s0,1 - int fill = (val * (bw - 2)) / 100; - 63e: 06400593 li a1,100 - if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); - 642: c03e sw a5,0(sp) - int fill = (val * (bw - 2)) / 100; - 644: 3cb1 jal a0 <__divsi3> - 646: 4782 lw a5,0(sp) - 648: 872a mv a4,a0 - 64a: 0419 addi s0,s0,6 - 64c: 03170693 addi a3,a4,49 - m=x; - 650: 03100493 li s1,49 - 654: 8526 mv a0,s1 - ssd1306_drawPixel(m++, n, color); - 656: 85be mv a1,a5 - 658: 4605 li a2,1 - 65a: c436 sw a3,8(sp) - 65c: c23a sw a4,4(sp) - 65e: c03e sw a5,0(sp) - 660: 3321 jal 368 - while(w--) - 662: 46a2 lw a3,8(sp) - ssd1306_drawPixel(m++, n, color); - 664: 0485 addi s1,s1,1 - while(w--) - 666: 4782 lw a5,0(sp) - 668: 4712 lw a4,4(sp) - 66a: fed495e3 bne s1,a3,654 - n++; - 66e: 0785 addi a5,a5,1 - while(h--) - 670: fc879ee3 bne a5,s0,64c -} - 674: 40d2 lw ra,20(sp) - 676: 4442 lw s0,16(sp) - 678: 44b2 lw s1,12(sp) - 67a: 0161 addi sp,sp,24 - 67c: 8082 ret - -0000067e : +0000062e : void ssd1306_drawImage(uint32_t x, uint32_t y, const unsigned char* input, uint32_t width, uint32_t height, uint32_t color_mode) { - 67e: fd810113 addi sp,sp,-40 - 682: 00e587b3 add a5,a1,a4 - 686: d222 sw s0,36(sp) - 688: d026 sw s1,32(sp) - 68a: c82a sw a0,16(sp) - 68c: ca32 sw a2,20(sp) + 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; - 68e: 0036d413 srli s0,a3,0x3 - 692: c63e sw a5,12(sp) - 694: 4381 li t2,0 + 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); - 696: 0075f793 andi a5,a1,7 - 69a: 4705 li a4,1 - 69c: 00f717b3 sll a5,a4,a5 - 6a0: c03e sw a5,0(sp) + 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]; - 6a2: 47d2 lw a5,20(sp) + 652: 47d2 lw a5,20(sp) for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { - 6a4: 4681 li a3,0 + 654: 4681 li a3,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; - 6a6: 979e add a5,a5,t2 - 6a8: cc3e sw a5,24(sp) + 656: 979e add a5,a5,t2 + 658: cc3e sw a5,24(sp) buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); - 6aa: 0035d793 srli a5,a1,0x3 - 6ae: 079e slli a5,a5,0x7 - 6b0: ce3e sw a5,28(sp) + 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]; - 6b2: 47e2 lw a5,24(sp) + 662: 47e2 lw a5,24(sp) x_absolute = x + 8 * byte + pixel; - 6b4: 00369293 slli t0,a3,0x3 + 664: 00369293 slli t0,a3,0x3 for (pixel = 0; pixel < 8; pixel++) { - 6b8: 4701 li a4,0 + 668: 4701 li a4,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; - 6ba: 97b6 add a5,a5,a3 - 6bc: 0007c783 lbu a5,0(a5) - 6c0: c23e sw a5,4(sp) + 66a: 97b6 add a5,a5,a3 + 66c: 0007c783 lbu a5,0(a5) + 670: c23e sw a5,4(sp) x_absolute = x + 8 * byte + pixel; - 6c2: 47c2 lw a5,16(sp) - 6c4: 92be add t0,t0,a5 + 672: 47c2 lw a5,16(sp) + 674: 92be add t0,t0,a5 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); - 6c6: 47f2 lw a5,28(sp) - 6c8: 005784b3 add s1,a5,t0 + 676: 47f2 lw a5,28(sp) + 678: 005784b3 add s1,a5,t0 if (x_absolute >= SSD1306_W) { - 6cc: 00e287b3 add a5,t0,a4 - 6d0: 07f00613 li a2,127 - 6d4: 04f66463 bltu a2,a5,71c + 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) - 6d8: 4512 lw a0,4(sp) - 6da: 08000793 li a5,128 - 6de: 40e7d7b3 sra a5,a5,a4 - 6e2: 8fe9 and a5,a5,a0 + 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); - 6e4: 00e48633 add a2,s1,a4 + 694: 00e48633 add a2,s1,a4 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); - 6e8: c2818513 addi a0,gp,-984 # 20000024 - 6ec: 9532 add a0,a0,a2 - 6ee: 00014303 lbu t1,0(sp) + 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) - 6f2: c43e sw a5,8(sp) + 6a2: c43e sw a5,8(sp) ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); - 6f4: 00054783 lbu a5,0(a0) - 6f8: fff34613 not a2,t1 + 6a4: 00054783 lbu a5,0(a0) + 6a8: fff34613 not a2,t1 for (pixel = 0; pixel < 8; pixel++) { - 6fc: 0705 addi a4,a4,1 + 6ac: 0705 addi a4,a4,1 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); - 6fe: 8e7d and a2,a2,a5 - 700: 47a2 lw a5,8(sp) - 702: 00f037b3 snez a5,a5 - 706: 40f007b3 neg a5,a5 - 70a: 00f37333 and t1,t1,a5 - 70e: 00666633 or a2,a2,t1 - 712: 00c50023 sb a2,0(a0) + 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++) { - 716: 47a1 li a5,8 - 718: faf71ae3 bne a4,a5,6cc + 6c6: 47a1 li a5,8 + 6c8: faf71ae3 bne a4,a5,67c for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { - 71c: 0685 addi a3,a3,1 - 71e: f8d41ae3 bne s0,a3,6b2 + 6cc: 0685 addi a3,a3,1 # 40001 + 6ce: f8d41ae3 bne s0,a3,662 for (uint32_t line = 0; line < height; line++) { - 722: 47b2 lw a5,12(sp) - 724: 0585 addi a1,a1,1 - 726: 93a2 add t2,t2,s0 - 728: 00b78663 beq a5,a1,734 + 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) { - 72c: 04000793 li a5,64 - 730: f6f593e3 bne a1,a5,696 + 6dc: 04000793 li a5,64 + 6e0: f6f593e3 bne a1,a5,646 } - 734: 5412 lw s0,36(sp) - 736: 5482 lw s1,32(sp) - 738: 02810113 addi sp,sp,40 - 73c: 8082 ret + 6e4: 5412 lw s0,36(sp) + 6e6: 5482 lw s1,32(sp) + 6e8: 02810113 addi sp,sp,40 + 6ec: 8082 ret -0000073e : - uint32_t dmd0 = *dmdata0; - 73e: e00007b7 lui a5,0xe0000 - 742: 0f47a783 lw a5,244(a5) # e00000f4 <_eusrstack+0xbffff8f4> +000006ee : +void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) + 6ee: 1141 addi sp,sp,-16 + if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; + 6f0: fff60793 addi a5,a2,-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) + 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 + while (w--) + 70e: 00851763 bne a0,s0,71c } - 746: 8082 ret + 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 + 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 -00000748 <_write.constprop.0>: - if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; - 748: e00007b7 lui a5,0xe0000 - 74c: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> - 750: 4398 lw a4,0(a5) -WEAK int _write(int fd, const char *buf, int size) - 752: 1121 addi sp,sp,-24 - 754: ca06 sw ra,20(sp) - 756: c822 sw s0,16(sp) - 758: c626 sw s1,12(sp) - if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; - 75a: 0c077713 andi a4,a4,192 - 75e: 0c000693 li a3,192 - 762: 00d70b63 beq a4,a3,778 <_write.constprop.0+0x30> - char buffer[4] = { 0 }; - 766: c402 sw zero,8(sp) - 768: 842e mv s0,a1 - if( size == 0 ) - 76a: eddd bnez a1,828 <_write.constprop.0+0xe0> - lastdmd = (*DMDATA0); - 76c: 439c lw a5,0(a5) - if( lastdmd && !(lastdmd&0x80) ) internal_handle_input( (uint32_t*)DMDATA0 ); - 76e: c789 beqz a5,778 <_write.constprop.0+0x30> - 770: 0807f793 andi a5,a5,128 - 774: e391 bnez a5,778 <_write.constprop.0+0x30> - 776: 37e1 jal 73e - if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; - 778: 4401 li s0,0 +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 } - 77a: 40d2 lw ra,20(sp) - 77c: 8522 mv a0,s0 - 77e: 4442 lw s0,16(sp) - 780: 44b2 lw s1,12(sp) - 782: 0161 addi sp,sp,24 - 784: 8082 ret - int tosend = size - place; - 786: 409407b3 sub a5,s0,s1 - if( tosend > 7 ) tosend = 7; - 78a: 471d li a4,7 - 78c: 00f75363 bge a4,a5,792 <_write.constprop.0+0x4a> - 790: 87ba mv a5,a4 - 792: 001006b7 lui a3,0x100 - while( ( lastdmd = (*DMDATA0) ) & 0x80 ) - 796: e0000737 lui a4,0xe0000 - if( tosend > 7 ) tosend = 7; - 79a: 0685 addi a3,a3,1 # 100001 - while( ( lastdmd = (*DMDATA0) ) & 0x80 ) - 79c: 0f470713 addi a4,a4,244 # e00000f4 <_eusrstack+0xbffff8f4> - 7a0: 4310 lw a2,0(a4) - 7a2: 08067593 andi a1,a2,128 - 7a6: e1a5 bnez a1,806 <_write.constprop.0+0xbe> - if( lastdmd ) internal_handle_input( (uint32_t*)DMDATA0 ); - 7a8: c611 beqz a2,7b4 <_write.constprop.0+0x6c> - 7aa: c22a sw a0,4(sp) - 7ac: c03e sw a5,0(sp) - 7ae: 3f41 jal 73e - 7b0: 4512 lw a0,4(sp) - 7b2: 4782 lw a5,0(sp) - 7b4: 0034 addi a3,sp,8 - if( tosend > 7 ) tosend = 7; - 7b6: 470d li a4,3 - 7b8: 85b6 mv a1,a3 - while( t < tosend ) - 7ba: 04f74d63 blt a4,a5,814 <_write.constprop.0+0xcc> - *DMDATA1 = *(uint32_t*)&(buffer[0]); - 7be: 46a2 lw a3,8(sp) - 7c0: e0000737 lui a4,0xe0000 - while( t < tosend && t < 3 ) - 7c4: 460d li a2,3 - *DMDATA1 = *(uint32_t*)&(buffer[0]); - 7c6: 0ed72c23 sw a3,248(a4) # e00000f8 <_eusrstack+0xbffff8f8> - 7ca: 009506b3 add a3,a0,s1 - t = 0; - 7ce: 4701 li a4,0 - buffer[t+1] = buf[t+place]; - 7d0: 0006c283 lbu t0,0(a3) - 7d4: 0705 addi a4,a4,1 - 7d6: 00e58333 add t1,a1,a4 - 7da: 00530023 sb t0,0(t1) - while( t < tosend && t < 3 ) - 7de: 00e78563 beq a5,a4,7e8 <_write.constprop.0+0xa0> - 7e2: 0685 addi a3,a3,1 - 7e4: fec716e3 bne a4,a2,7d0 <_write.constprop.0+0x88> - buffer[0] = 0x80 | (tosend + 4); - 7e8: 00478713 addi a4,a5,4 - 7ec: f8076713 ori a4,a4,-128 - 7f0: 00e10423 sb a4,8(sp) - *DMDATA0 = *(uint32_t*)&(buffer[0]); - 7f4: 46a2 lw a3,8(sp) - 7f6: e0000737 lui a4,0xe0000 - place += tosend; - 7fa: 94be add s1,s1,a5 - *DMDATA0 = *(uint32_t*)&(buffer[0]); - 7fc: 0ed72a23 sw a3,244(a4) # e00000f4 <_eusrstack+0xbffff8f4> - while( place < size ) - 800: f884c3e3 blt s1,s0,786 <_write.constprop.0+0x3e> - 804: bf9d j 77a <_write.constprop.0+0x32> - if( timeout-- == 0 ) - 806: 16fd addi a3,a3,-1 - 808: fec1 bnez a3,7a0 <_write.constprop.0+0x58> - *DMDATA0 |= 0xc0; - 80a: 431c lw a5,0(a4) - 80c: 0c07e793 ori a5,a5,192 - 810: c31c sw a5,0(a4) - return 0; - 812: b79d j 778 <_write.constprop.0+0x30> - buffer[t-3] = buf[t+place]; - 814: 00e48633 add a2,s1,a4 - 818: 962a add a2,a2,a0 - 81a: 00064603 lbu a2,0(a2) - t++; - 81e: 0705 addi a4,a4,1 - 820: 0685 addi a3,a3,1 - buffer[t-3] = buf[t+place]; - 822: fec68fa3 sb a2,-1(a3) - 826: bf51 j 7ba <_write.constprop.0+0x72> - 828: 4481 li s1,0 - 82a: bfd9 j 800 <_write.constprop.0+0xb8> + 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 -0000082c <__puts_uart>: +0000076c : { - 82c: 1161 addi sp,sp,-8 - 82e: c022 sw s0,0(sp) - 830: c206 sw ra,4(sp) - 832: 842e mv s0,a1 - _write( 0, s, len ); - 834: 3f11 jal 748 <_write.constprop.0> + 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 + while(h--) + 7da: fc879ee3 bne a5,s0,7b6 } - 836: 4092 lw ra,4(sp) - 838: 8522 mv a0,s0 - 83a: 4402 lw s0,0(sp) - 83c: 0121 addi sp,sp,8 - 83e: 8082 ret + 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 -00000840 : +000007e8 : + uint32_t dmd0 = *dmdata0; + 7e8: e00007b7 lui a5,0xe0000 + 7ec: 0f47a783 lw a5,244(a5) # e00000f4 <_eusrstack+0xbffff8f4> +} + 7f0: 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>: +{ + 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> +} + 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\ - 840: 20000197 auipc gp,0x20000 - 844: bbc18193 addi gp,gp,-1092 # 200003fc <__global_pointer$> - 848: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack> - 84c: 6509 lui a0,0x2 - 84e: 88050513 addi a0,a0,-1920 # 1880 - 852: 30051073 csrw mstatus,a0 - 856: fffff697 auipc a3,0xfffff - 85a: 7aa68693 addi a3,a3,1962 # 0 - 85e: 0036e693 ori a3,a3,3 - 862: 30569073 csrw mtvec,a3 + 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( - 866: c0c18513 addi a0,gp,-1012 # 20000008 - 86a: 02818593 addi a1,gp,40 # 20000424 <_ebss> - 86e: 4601 li a2,0 - 870: 00b55663 bge a0,a1,87c - 874: c110 sw a2,0(a0) - 876: 0511 addi a0,a0,4 - 878: feb54ee3 blt a0,a1,874 - 87c: 00002517 auipc a0,0x2 - 880: c8c50513 addi a0,a0,-884 # 2508 <_data_lma> - 884: c0418593 addi a1,gp,-1020 # 20000000 - 888: c0c18613 addi a2,gp,-1012 # 20000008 - 88c: 00c58863 beq a1,a2,89c - 890: 4114 lw a3,0(a0) - 892: c194 sw a3,0(a1) - 894: 0511 addi a0,a0,4 - 896: 0591 addi a1,a1,4 - 898: fec59ae3 bne a1,a2,88c + 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; - 89c: e000f7b7 lui a5,0xe000f - 8a0: 4705 li a4,1 - 8a2: c398 sw a4,0(a5) + 946: e000f7b7 lui a5,0xe000f + 94a: 4705 li a4,1 + 94c: c398 sw a4,0(a5) asm volatile( - 8a4: 6785 lui a5,0x1 - 8a6: d9a78793 addi a5,a5,-614 # d9a
- 8aa: 34179073 csrw mepc,a5 - 8ae: 30200073 mret + 94e: 6785 lui a5,0x1 + 950: e6078793 addi a5,a5,-416 # e60
+ 954: 34179073 csrw mepc,a5 + 958: 30200073 mret -000008b2 : +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)); - 8b2: 34102573 csrr a0,mepc + 95c: 34102573 csrr a0,mepc PrintHex( __get_MEPC() ); // "addr2line -e debugprintfdemo.elf 0x000007e6" ---> debugprintfdemo.c:45 - 8b6: 3a0d jal 1e8 + 960: 889ff0ef jal 1e8 __ASM volatile( ADD_ARCH_ZICSR "csrr %0, mstatus": "=r"(result) ); - 8b8: 30002573 csrr a0,mstatus + 964: 30002573 csrr a0,mstatus PrintHex( __get_MSTATUS() ); - 8bc: 3235 jal 1e8 + 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) ); - 8be: 34302573 csrr a0,mtval + 96c: 34302573 csrr a0,mtval PrintHex( __get_MTVAL() ); - 8c2: 321d jal 1e8 + 970: 879ff0ef jal 1e8 __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mcause": "=r"(result)); - 8c4: 34202573 csrr a0,mcause + 974: 34202573 csrr a0,mcause PrintHex( __get_MCAUSE() ); - 8c8: 3205 jal 1e8 + 978: 871ff0ef jal 1e8 while( (*DMDATA0) & 0x80 ); - 8ca: e00007b7 lui a5,0xe0000 - 8ce: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> - 8d2: 4398 lw a4,0(a5) - 8d4: 08077713 andi a4,a4,128 - 8d8: ff6d bnez a4,8d2 + 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; - 8da: 6705 lui a4,0x1 - 8dc: a8570713 addi a4,a4,-1403 # a85 - 8e0: c398 sw a4,0(a5) + 98c: 6705 lui a4,0x1 + 98e: a8570713 addi a4,a4,-1403 # a85 + 992: c398 sw a4,0(a5) while( (*DMDATA0) & 0x80 ); - 8e2: e00007b7 lui a5,0xe0000 - 8e6: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> - 8ea: 4398 lw a4,0(a5) - 8ec: 08077713 andi a4,a4,128 - 8f0: ff6d bnez a4,8ea + 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; - 8f2: aaaab737 lui a4,0xaaaab - 8f6: a8370713 addi a4,a4,-1405 # aaaaaa83 <_eusrstack+0x8aaaa283> - 8fa: c398 sw a4,0(a5) + 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" ); - 8fc: a001 j 8fc + 9ae: a001 j 9ae -000008fe : +000009b0 : RCC->INTR |= RCC_CSSC; // clear the clock security int flag - 8fe: 40021737 lui a4,0x40021 - 902: 471c lw a5,8(a4) - 904: 008006b7 lui a3,0x800 - 908: 8fd5 or a5,a5,a3 - 90a: c71c sw a5,8(a4) + 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) -0000090c : +000009be : for (; *s; s++); - 90c: 87aa mv a5,a0 - 90e: 0007c703 lbu a4,0(a5) - 912: e701 bnez a4,91a + 9be: 87aa mv a5,a0 + 9c0: 0007c703 lbu a4,0(a5) + 9c4: e701 bnez a4,9cc } - 914: 40a78533 sub a0,a5,a0 - 918: 8082 ret + 9c6: 40a78533 sub a0,a5,a0 + 9ca: 8082 ret for (; *s; s++); - 91a: 0785 addi a5,a5,1 - 91c: bfcd j 90e + 9cc: 0785 addi a5,a5,1 + 9ce: bfcd j 9c0 -0000091e : +000009d0 : { - 91e: fa410113 addi sp,sp,-92 - 922: caa2 sw s0,84(sp) - 924: c8a6 sw s1,80(sp) - 926: cc86 sw ra,88(sp) - 928: c02a sw a0,0(sp) - 92a: c22e sw a1,4(sp) - 92c: 8432 mv s0,a2 - 92e: 84b6 mv s1,a3 + 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) { - 930: e509 bnez a0,93a + 9e2: e509 bnez a0,9ec puts = _puts; buf = (void*)0; - 932: 1a800793 li a5,424 - 936: c202 sw zero,4(sp) - 938: c03e sw a5,0(sp) + 9e4: 1a800793 li a5,424 + 9e8: c202 sw zero,4(sp) + 9ea: c03e sw a5,0(sp) int n = 0; - 93a: ca02 sw zero,20(sp) + 9ec: ca02 sw zero,20(sp) while ((ch=*(fmt++))) { - 93c: 00044783 lbu a5,0(s0) - 940: 00140713 addi a4,s0,1 - 944: 00f10fa3 sb a5,31(sp) - 948: eb81 bnez a5,958 + 9ee: 00044783 lbu a5,0(s0) + 9f2: 00140713 addi a4,s0,1 + 9f6: 00f10fa3 sb a5,31(sp) + 9fa: eb81 bnez a5,a0a } - 94a: 40e6 lw ra,88(sp) - 94c: 4456 lw s0,84(sp) - 94e: 4552 lw a0,20(sp) - 950: 44c6 lw s1,80(sp) - 952: 05c10113 addi sp,sp,92 - 956: 8082 ret - 958: c63a sw a4,12(sp) + 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!='%') { - 95a: 02500693 li a3,37 - 95e: 02d78063 beq a5,a3,97e + a0c: 02500693 li a3,37 + a10: 02d78063 beq a5,a3,a30 len = puts(&ch, len, buf); - 962: 4612 lw a2,4(sp) - 964: 4782 lw a5,0(sp) - 966: 4585 li a1,1 - 968: 01f10513 addi a0,sp,31 - 96c: 9782 jalr a5 + 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++))) { - 96e: 4732 lw a4,12(sp) - 970: c426 sw s1,8(sp) - 972: 843a mv s0,a4 + a20: 4732 lw a4,12(sp) + a22: c426 sw s1,8(sp) + a24: 843a mv s0,a4 n = n + len; - 974: 47d2 lw a5,20(sp) - 976: 44a2 lw s1,8(sp) - 978: 97aa add a5,a5,a0 - 97a: ca3e sw a5,20(sp) - 97c: b7c1 j 93c + 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++); - 97e: 00144783 lbu a5,1(s0) + a30: 00144783 lbu a5,1(s0) if (ch == '0') pad_char = '0'; - 982: 03000693 li a3,48 + a34: 03000693 li a3,48 ch=*(fmt++); - 986: 00240713 addi a4,s0,2 - 98a: 00f10fa3 sb a5,31(sp) + a38: 00240713 addi a4,s0,2 + a3c: 00f10fa3 sb a5,31(sp) if (ch == '0') pad_char = '0'; - 98e: c63e sw a5,12(sp) - 990: 08d79363 bne a5,a3,a16 + a40: c63e sw a5,12(sp) + a42: 08d79363 bne a5,a3,ac8 ch=*(fmt++); - 994: 843a mv s0,a4 - 996: 4681 li a3,0 - 998: 4701 li a4,0 + a46: 843a mv s0,a4 + a48: 4681 li a3,0 + a4a: 4701 li a4,0 while (ch >= '0' && ch <= '9') { - 99a: 45a5 li a1,9 - 99c: a819 j 9b2 + a4c: 45a5 li a1,9 + a4e: a819 j a64 pad_to = pad_to * 10 + (ch - '0'); - 99e: 00271793 slli a5,a4,0x2 - 9a2: 97ba add a5,a5,a4 - 9a4: 0786 slli a5,a5,0x1 + a50: 00271793 slli a5,a4,0x2 + a54: 97ba add a5,a5,a4 + a56: 0786 slli a5,a5,0x1 ch=*(fmt++); - 9a6: 0405 addi s0,s0,1 + a58: 0405 addi s0,s0,1 pad_to = pad_to * 10 + (ch - '0'); - 9a8: 00f60733 add a4,a2,a5 + a5a: 00f60733 add a4,a2,a5 ch=*(fmt++); - 9ac: fff44783 lbu a5,-1(s0) - 9b0: 4685 li a3,1 + a5e: fff44783 lbu a5,-1(s0) + a62: 4685 li a3,1 while (ch >= '0' && ch <= '9') { - 9b2: fd078613 addi a2,a5,-48 - 9b6: 0ff67513 zext.b a0,a2 - 9ba: fea5f2e3 bgeu a1,a0,99e - 9be: c299 beqz a3,9c4 - 9c0: 00f10fa3 sb a5,31(sp) + 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)) { - 9c4: c83a sw a4,16(sp) - 9c6: 46e1 li a3,24 - 9c8: 00e6d363 bge a3,a4,9ce - 9cc: c836 sw a3,16(sp) + 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') { - 9ce: 06c00613 li a2,108 + a80: 06c00613 li a2,108 char l = 0; - 9d2: 4681 li a3,0 + a84: 4681 li a3,0 if (ch == 'l') { - 9d4: 00c79863 bne a5,a2,9e4 + a86: 00c79863 bne a5,a2,a96 ch=*(fmt++); - 9d8: 00044783 lbu a5,0(s0) + a8a: 00044783 lbu a5,0(s0) l = 1; - 9dc: 4685 li a3,1 + a8e: 4685 li a3,1 ch=*(fmt++); - 9de: 0405 addi s0,s0,1 - 9e0: 00f10fa3 sb a5,31(sp) + a90: 0405 addi s0,s0,1 + a92: 00f10fa3 sb a5,31(sp) switch (ch) { - 9e4: 01f14603 lbu a2,31(sp) - 9e8: 06400793 li a5,100 - 9ec: 06f60563 beq a2,a5,a56 - 9f0: 02c7e763 bltu a5,a2,a1e - 9f4: 05800793 li a5,88 - 9f8: 0af60263 beq a2,a5,a9c - 9fc: 06300793 li a5,99 - a00: 0cf60063 beq a2,a5,ac0 - a04: d239 beqz a2,94a + 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); - a06: 4612 lw a2,4(sp) - a08: 4782 lw a5,0(sp) - a0a: 4585 li a1,1 - a0c: 01f10513 addi a0,sp,31 - a10: 9782 jalr a5 + 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; - a12: c426 sw s1,8(sp) - a14: b785 j 974 + ac4: c426 sw s1,8(sp) + ac6: b785 j a26 char pad_char = ' '; - a16: 02000693 li a3,32 - a1a: c636 sw a3,12(sp) - a1c: bfa5 j 994 + ac8: 02000693 li a3,32 + acc: c636 sw a3,12(sp) + ace: bfa5 j a46 switch (ch) { - a1e: 07500793 li a5,117 - a22: 02f60a63 beq a2,a5,a56 - a26: 07800793 li a5,120 - a2a: 06f60963 beq a2,a5,a9c - a2e: 07300793 li a5,115 - a32: fcf61ae3 bne a2,a5,a06 + 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*); - a36: 00448793 addi a5,s1,4 - a3a: 4084 lw s1,0(s1) - a3c: cc3a sw a4,24(sp) - a3e: c43e sw a5,8(sp) + 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); - a40: 8526 mv a0,s1 - a42: 35e9 jal 90c + af2: 8526 mv a0,s1 + af4: 35e9 jal 9be if (pad_to > 0) { - a44: 4762 lw a4,24(sp) + af6: 4762 lw a4,24(sp) len = mini_strlen(ptr); - a46: 85aa mv a1,a0 + af8: 85aa mv a1,a0 if (pad_to > 0) { - a48: 08e05963 blez a4,ada + afa: 08e05963 blez a4,b8c len = mini_pad(ptr, len, pad_char, pad_to, bf); - a4c: 46c2 lw a3,16(sp) - a4e: 4632 lw a2,12(sp) - a50: 1838 addi a4,sp,56 - a52: 8526 mv a0,s1 - a54: a025 j a7c + 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); - a56: 00448793 addi a5,s1,4 - a5a: c43e sw a5,8(sp) + b08: 00448793 addi a5,s1,4 + b0c: c43e sw a5,8(sp) if(l) { - a5c: ca85 beqz a3,a8c + b0e: ca85 beqz a3,b3e len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); - a5e: f8b60613 addi a2,a2,-117 - a62: 1018 addi a4,sp,32 - a64: 00163693 seqz a3,a2 - a68: 4088 lw a0,0(s1) - a6a: 4601 li a2,0 - a6c: 45a9 li a1,10 - a6e: fe6ff0ef jal 254 + 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); - a72: 46c2 lw a3,16(sp) - a74: 4632 lw a2,12(sp) - a76: 1838 addi a4,sp,56 - a78: 85aa mv a1,a0 + 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); - a7a: 1008 addi a0,sp,32 - a7c: ea2ff0ef jal 11e + b2c: 1008 addi a0,sp,32 + b2e: df0ff0ef jal 11e len = puts(bf, len, buf); - a80: 4612 lw a2,4(sp) + b32: 4612 lw a2,4(sp) len = mini_pad(bf2, len, pad_char, pad_to, bf); - a82: 85aa mv a1,a0 + b34: 85aa mv a1,a0 len = puts(bf, len, buf); - a84: 1828 addi a0,sp,56 - a86: 4782 lw a5,0(sp) - a88: 9782 jalr a5 + b36: 1828 addi a0,sp,56 + b38: 4782 lw a5,0(sp) + b3a: 9782 jalr a5 break; - a8a: b5ed j 974 + b3c: b5ed j a26 if(ch == 'u') { - a8c: 07500793 li a5,117 - a90: 1018 addi a4,sp,32 - a92: 4685 li a3,1 - a94: fcf60ae3 beq a2,a5,a68 + 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) - a98: 4681 li a3,0 - a9a: b7f9 j a68 + b4a: 4681 li a3,0 + b4c: b7f9 j b1a if(l) { - a9c: 4088 lw a0,0(s1) + b4e: 4088 lw a0,0(s1) len = mini_itoa(va_arg(va, unsigned long), 16, (ch=='X'), 1, bf2); - a9e: fa860613 addi a2,a2,-88 + b50: fa860613 addi a2,a2,-88 len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); - aa2: 00448793 addi a5,s1,4 - aa6: 1018 addi a4,sp,32 - aa8: 4685 li a3,1 - aaa: 00163613 seqz a2,a2 - aae: 45c1 li a1,16 - ab0: c43e sw a5,8(sp) + 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) - ab2: fa2ff0ef jal 254 + b64: ef0ff0ef jal 254 len = mini_pad(bf2, len, pad_char, pad_to, bf); - ab6: 46c2 lw a3,16(sp) - ab8: 4632 lw a2,12(sp) - aba: 85aa mv a1,a0 - abc: 1838 addi a4,sp,56 - abe: bf75 j a7a + 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)); - ac0: 00448793 addi a5,s1,4 - ac4: c43e sw a5,8(sp) - ac6: 409c lw a5,0(s1) + 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); - ac8: 46c2 lw a3,16(sp) - aca: 4632 lw a2,12(sp) + b7a: 46c2 lw a3,16(sp) + b7c: 4632 lw a2,12(sp) ch = (char)(va_arg(va, int)); - acc: 00f10fa3 sb a5,31(sp) + b7e: 00f10fa3 sb a5,31(sp) len = mini_pad(&ch, 1, pad_char, pad_to, bf); - ad0: 1838 addi a4,sp,56 - ad2: 4585 li a1,1 - ad4: 01f10513 addi a0,sp,31 - ad8: b755 j a7c + 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); - ada: 4612 lw a2,4(sp) - adc: 8526 mv a0,s1 - ade: b765 j a86 + b8c: 4612 lw a2,4(sp) + b8e: 8526 mv a0,s1 + b90: b765 j b38 -00000ae0 : +00000b92 : { - ae0: 1111 addi sp,sp,-28 - ae2: c632 sw a2,12(sp) + b92: 1111 addi sp,sp,-28 + b94: c632 sw a2,12(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - ae4: 862a mv a2,a0 - ae6: 6505 lui a0,0x1 + b96: 862a mv a2,a0 + b98: 6505 lui a0,0x1 { - ae8: c42e sw a1,8(sp) - aea: c836 sw a3,16(sp) + b9a: c42e sw a1,8(sp) + b9c: c836 sw a3,16(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - aec: 4581 li a1,0 + b9e: 4581 li a1,0 va_start( args, format ); - aee: 0034 addi a3,sp,8 + ba0: 0034 addi a3,sp,8 int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - af0: 82c50513 addi a0,a0,-2004 # 82c <__puts_uart> + ba2: 8d650513 addi a0,a0,-1834 # 8d6 <__puts_uart> { - af4: c206 sw ra,4(sp) - af6: ca3a sw a4,20(sp) - af8: cc3e sw a5,24(sp) + ba6: c206 sw ra,4(sp) + ba8: ca3a sw a4,20(sp) + baa: cc3e sw a5,24(sp) va_start( args, format ); - afa: c036 sw a3,0(sp) + bac: c036 sw a3,0(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - afc: 350d jal 91e + bae: 350d jal 9d0 } - afe: 4092 lw ra,4(sp) - b00: 0171 addi sp,sp,28 - b02: 8082 ret + bb0: 4092 lw ra,4(sp) + bb2: 0171 addi sp,sp,28 + bb4: 8082 ret -00000b04 : +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]); - b04: 6789 lui a5,0x2 - b06: 050a slli a0,a0,0x2 - b08: b8c78793 addi a5,a5,-1140 # 1b8c - b0c: 97aa add a5,a5,a0 - b0e: 438c lw a1,0(a5) - b10: 6505 lui a0,0x1 + 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) - b12: 1171 addi sp,sp,-4 + bc4: 1171 addi sp,sp,-4 printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); - b14: 68450513 addi a0,a0,1668 # 1684 + bc6: 90c50513 addi a0,a0,-1780 # 190c uint8_t ssd1306_i2c_error(uint8_t err) - b18: c006 sw ra,0(sp) + bca: c006 sw ra,0(sp) printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); - b1a: 37d9 jal ae0 + bcc: 37d9 jal b92 // reset & initialize I2C ssd1306_i2c_setup(); return 1; } - b1c: 4082 lw ra,0(sp) - b1e: 0111 addi sp,sp,4 + bce: 4082 lw ra,0(sp) + bd0: 0111 addi sp,sp,4 ssd1306_i2c_setup(); - b20: ff4ff06f j 314 + bd2: f42ff06f j 314 -00000b24 : +00000bd6 : } #else /* * low-level packet send for blocking polled operation via i2c */ uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) - b24: 1171 addi sp,sp,-4 + bd6: 1171 addi sp,sp,-4 { int32_t timeout; // wait for not busy timeout = TIMEOUT_MAX; - b26: 6761 lui a4,0x18 + bd8: 6761 lui a4,0x18 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); - b28: 400057b7 lui a5,0x40005 + bda: 400057b7 lui a5,0x40005 uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) - b2c: c006 sw ra,0(sp) + bde: c006 sw ra,0(sp) timeout = TIMEOUT_MAX; - b2e: 6a070713 addi a4,a4,1696 # 186a0 + be0: 6a070713 addi a4,a4,1696 # 186a0 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); - b32: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00> - b36: 567d li a2,-1 - b38: 0187d683 lhu a3,24(a5) - b3c: 8a89 andi a3,a3,2 - b3e: c6e1 beqz a3,c06 - b40: 177d addi a4,a4,-1 - b42: fec71be3 bne a4,a2,b38 + 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); - b46: 4501 li a0,0 - b48: a821 j b60 - b4a: 67e1 lui a5,0x18 - b4c: 6a178793 addi a5,a5,1697 # 186a1 + 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--)); - b50: 01475683 lhu a3,20(a4) - b54: 0806f693 andi a3,a3,128 - b58: e699 bnez a3,b66 - b5a: 17fd addi a5,a5,-1 - b5c: fbf5 bnez a5,b50 + 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); - b5e: 450d li a0,3 + c10: 450d li a0,3 return ssd1306_i2c_error(1); - b60: 3755 jal b04 + c12: 3755 jal bb6 return ssd1306_i2c_error(0); - b62: 4505 li a0,1 - b64: a889 j bb6 + c14: 4505 li a0,1 + c16: a889 j c68 // send command I2C1->DATAR = *data++; - b66: 00054783 lbu a5,0(a0) - b6a: 0505 addi a0,a0,1 - b6c: 00f71823 sh a5,16(a4) + c18: 00054783 lbu a5,0(a0) + c1c: 0505 addi a0,a0,1 + c1e: 00f71823 sh a5,16(a4) while(sz--) - b70: fca59de3 bne a1,a0,b4a + c22: fca59de3 bne a1,a0,bfc } // wait for tx complete timeout = TIMEOUT_MAX; - b74: 66e1 lui a3,0x18 + c26: 66e1 lui a3,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - b76: 40005737 lui a4,0x40005 + c28: 40005737 lui a4,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); - b7a: 00070637 lui a2,0x70 + c2c: 00070637 lui a2,0x70 timeout = TIMEOUT_MAX; - b7e: 6a068693 addi a3,a3,1696 # 186a0 + c30: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - b82: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> + c34: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); - b86: 08460613 addi a2,a2,132 # 70084 - b8a: 55fd li a1,-1 + c38: 08460613 addi a2,a2,132 # 70084 + c3c: 55fd li a1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - b8c: 01475503 lhu a0,20(a4) - b90: 01875783 lhu a5,24(a4) - b94: 07c2 slli a5,a5,0x10 - b96: 8fc9 or a5,a5,a0 + 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--)); - b98: 8ff1 and a5,a5,a2 - b9a: 00c78763 beq a5,a2,ba8 - b9e: 16fd addi a3,a3,-1 - ba0: feb696e3 bne a3,a1,b8c + 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); - ba4: 4511 li a0,4 - ba6: bf6d j b60 + c56: 4511 li a0,4 + c58: bf6d j c12 // set STOP condition I2C1->CTLR1 |= I2C_CTLR1_STOP; - ba8: 00075783 lhu a5,0(a4) + c5a: 00075783 lhu a5,0(a4) // we're happy return 0; - bac: 4501 li a0,0 + c5e: 4501 li a0,0 I2C1->CTLR1 |= I2C_CTLR1_STOP; - bae: 2007e793 ori a5,a5,512 - bb2: 00f71023 sh a5,0(a4) + c60: 2007e793 ori a5,a5,512 + c64: 00f71023 sh a5,0(a4) } - bb6: 4082 lw ra,0(sp) - bb8: 0111 addi sp,sp,4 - bba: 8082 ret + c68: 4082 lw ra,0(sp) + c6a: 0111 addi sp,sp,4 + c6c: 8082 ret while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); - bbc: 40005737 lui a4,0x40005 - bc0: 95aa add a1,a1,a0 - bc2: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> - bc6: b76d j b70 + c6e: 40005737 lui a4,0x40005 + c72: 95aa add a1,a1,a0 + c74: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> + c78: b76d j c22 I2C1->DATAR = addr<<1; - bc8: 07800793 li a5,120 - bcc: 00f71823 sh a5,16(a4) + c7a: 07800793 li a5,120 + c7e: 00f71823 sh a5,16(a4) timeout = TIMEOUT_MAX; - bd0: 6661 lui a2,0x18 + c82: 6661 lui a2,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - bd2: 400056b7 lui a3,0x40005 + c84: 400056b7 lui a3,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); - bd6: 00070737 lui a4,0x70 + c88: 00070737 lui a4,0x70 timeout = TIMEOUT_MAX; - bda: 6a060613 addi a2,a2,1696 # 186a0 + c8c: 6a060613 addi a2,a2,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - bde: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00> + c90: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); - be2: 08270713 addi a4,a4,130 # 70082 - be6: 537d li t1,-1 + c94: 08270713 addi a4,a4,130 # 70082 + c98: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - be8: 0146d283 lhu t0,20(a3) - bec: 0186d783 lhu a5,24(a3) - bf0: 07c2 slli a5,a5,0x10 - bf2: 0057e7b3 or a5,a5,t0 + c9a: 0146d283 lhu t0,20(a3) + c9e: 0186d783 lhu a5,24(a3) + ca2: 07c2 slli a5,a5,0x10 + ca4: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); - bf6: 8ff9 and a5,a5,a4 - bf8: fce782e3 beq a5,a4,bbc - bfc: 167d addi a2,a2,-1 - bfe: fe6615e3 bne a2,t1,be8 + 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); - c02: 4509 li a0,2 - c04: bfb1 j b60 + cb4: 4509 li a0,2 + cb6: bfb1 j c12 I2C1->CTLR1 |= I2C_CTLR1_START; - c06: 0007d703 lhu a4,0(a5) + cb8: 0007d703 lhu a4,0(a5) timeout = TIMEOUT_MAX; - c0a: 66e1 lui a3,0x18 + cbc: 66e1 lui a3,0x18 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); - c0c: 00030637 lui a2,0x30 + cbe: 00030637 lui a2,0x30 I2C1->CTLR1 |= I2C_CTLR1_START; - c10: 10076713 ori a4,a4,256 - c14: 00e79023 sh a4,0(a5) + cc2: 10076713 ori a4,a4,256 + cc6: 00e79023 sh a4,0(a5) uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c18: 40005737 lui a4,0x40005 + cca: 40005737 lui a4,0x40005 timeout = TIMEOUT_MAX; - c1c: 6a068693 addi a3,a3,1696 # 186a0 + cce: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c20: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> + cd2: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); - c24: 0605 addi a2,a2,1 # 30001 - c26: 537d li t1,-1 + cd6: 0605 addi a2,a2,1 # 30001 + cd8: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); - c28: 01475283 lhu t0,20(a4) - c2c: 01875783 lhu a5,24(a4) - c30: 07c2 slli a5,a5,0x10 - c32: 0057e7b3 or a5,a5,t0 + cda: 01475283 lhu t0,20(a4) + cde: 01875783 lhu a5,24(a4) + ce2: 07c2 slli a5,a5,0x10 + ce4: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); - c36: 8ff1 and a5,a5,a2 - c38: f8c788e3 beq a5,a2,bc8 - c3c: 16fd addi a3,a3,-1 - c3e: fe6695e3 bne a3,t1,c28 + 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); - c42: 4505 li a0,1 - c44: bf31 j b60 + cf4: 4505 li a0,1 + cf6: bf31 j c12 -00000c46 : +00000cf8 : { - c46: fd810113 addi sp,sp,-40 + cf8: fd810113 addi sp,sp,-40 /* build command or data packets */ if(cmd) { pkt[0] = 0; pkt[1] = *data; - c4a: 00a100a3 sb a0,1(sp) + cfc: 00a100a3 sb a0,1(sp) else { pkt[0] = 0x40; memcpy(&pkt[1], data, sz); } return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); - c4e: 4589 li a1,2 - c50: 850a mv a0,sp - c52: d206 sw ra,36(sp) + d00: 4589 li a1,2 + d02: 850a mv a0,sp + d04: d206 sw ra,36(sp) pkt[0] = 0; - c54: 00010023 sb zero,0(sp) + d06: 00010023 sb zero,0(sp) return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); - c58: 35f1 jal b24 + d0a: 35f1 jal bd6 } - c5a: 5092 lw ra,36(sp) - c5c: 02810113 addi sp,sp,40 - c60: 8082 ret + d0c: 5092 lw ra,36(sp) + d0e: 02810113 addi sp,sp,40 + d12: 8082 ret -00000c62 : +00000d14 : { - c62: 1131 addi sp,sp,-20 - c64: c806 sw ra,16(sp) - c66: c622 sw s0,12(sp) + d14: 1131 addi sp,sp,-20 + d16: c806 sw ra,16(sp) + d18: c622 sw s0,12(sp) b.buffer = buffer; - c68: c02a sw a0,0(sp) + d1a: c02a sw a0,0(sp) b.pbuffer = buffer; - c6a: c22a sw a0,4(sp) + d1c: c22a sw a0,4(sp) b.buffer_len = buffer_len; - c6c: c42e sw a1,8(sp) + d1e: c42e sw a1,8(sp) if(buffer_len == 0) buffer = (void*) 0; - c6e: c19d beqz a1,c94 + d20: c19d beqz a1,d46 int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); - c70: 00a037b3 snez a5,a0 - c74: 40f007b3 neg a5,a5 - c78: 842a mv s0,a0 - c7a: 00f175b3 and a1,sp,a5 - c7e: 1a800513 li a0,424 - c82: 3971 jal 91e + 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) { - c84: c401 beqz s0,c8c + d36: c401 beqz s0,d3e return b.pbuffer - b.buffer; - c86: 4512 lw a0,4(sp) - c88: 4782 lw a5,0(sp) - c8a: 8d1d sub a0,a0,a5 + d38: 4512 lw a0,4(sp) + d3a: 4782 lw a5,0(sp) + d3c: 8d1d sub a0,a0,a5 } - c8c: 40c2 lw ra,16(sp) - c8e: 4432 lw s0,12(sp) - c90: 0151 addi sp,sp,20 - c92: 8082 ret - c94: 4401 li s0,0 - int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); - c96: 4581 li a1,0 - c98: b7dd j c7e - -00000c9a : -{ - c9a: 1131 addi sp,sp,-20 - c9c: c436 sw a3,8(sp) - va_start( args, format ); - c9e: 0034 addi a3,sp,8 -{ - ca0: c206 sw ra,4(sp) - ca2: c63a sw a4,12(sp) - ca4: c83e sw a5,16(sp) - va_start( args, format ); - ca6: c036 sw a3,0(sp) - int ret = mini_vsnprintf( buffer, buffer_len, format, args ); - ca8: 3f6d jal c62 -} - caa: 4092 lw ra,4(sp) - cac: 0151 addi sp,sp,20 - cae: 8082 ret - -00000cb0 : -WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; } - cb0: 962a add a2,a2,a0 - cb2: 87aa mv a5,a0 - cb4: 00c79363 bne a5,a2,cba - cb8: 8082 ret - cba: 00b78023 sb a1,0(a5) - cbe: 0785 addi a5,a5,1 - cc0: bfd5 j cb4 - -00000cc2 : - memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer)); - cc2: 40000613 li a2,1024 - cc6: 4581 li a1,0 - cc8: c2818513 addi a0,gp,-984 # 20000024 - ccc: b7d5 j cb0 - -00000cce : - for (; n; n--) *d++ = *s++; - cce: 4781 li a5,0 - cd0: 00f61363 bne a2,a5,cd6 -} - cd4: 8082 ret - for (; n; n--) *d++ = *s++; - cd6: 00f58733 add a4,a1,a5 - cda: 00074683 lbu a3,0(a4) - cde: 00f50733 add a4,a0,a5 - ce2: 0785 addi a5,a5,1 - ce4: 00d70023 sb a3,0(a4) - ce8: b7e5 j cd0 - -00000cea : -{ - cea: 7179 addi sp,sp,-48 - ssd1306_cmd(SSD1306_COLUMNADDR); - cec: 02100513 li a0,33 -{ - cf0: d606 sw ra,44(sp) - cf2: d422 sw s0,40(sp) - cf4: d226 sw s1,36(sp) - ssd1306_cmd(SSD1306_COLUMNADDR); - cf6: 3f81 jal c46 - ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset) - cf8: 4501 li a0,0 - cfa: 37b1 jal c46 - ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset) - cfc: 07f00513 li a0,127 - d00: 3799 jal c46 - ssd1306_cmd(SSD1306_PAGEADDR); - d02: 02200513 li a0,34 - d06: 3781 jal c46 - ssd1306_cmd(0); // Page start address (0 = reset) - d08: 4501 li a0,0 - d0a: 3f35 jal c46 - ssd1306_cmd(7); // Page end address - d0c: 451d li a0,7 - d0e: c2818413 addi s0,gp,-984 # 20000024 - d12: 3f15 jal c46 - for(i=0;i - return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); - d2c: 02100593 li a1,33 - d30: 850a mv a0,sp - d32: 02040413 addi s0,s0,32 - d36: 33fd jal b24 - d38: fe9410e3 bne s0,s1,d18 -} - d3c: 50b2 lw ra,44(sp) - d3e: 5422 lw s0,40(sp) - d40: 5492 lw s1,36(sp) - d42: 6145 addi sp,sp,48 + 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 -00000d46 : +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 + +00000d62 : +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 + +00000d74 : + 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 + +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 : + for (; n; n--) *d++ = *s++; + d94: 4781 li a5,0 + d96: 00f61363 bne a2,a5,d9c +} + d9a: 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 + +00000db0 : +{ + db0: 7179 addi sp,sp,-48 + ssd1306_cmd(SSD1306_COLUMNADDR); + db2: 02100513 li a0,33 +{ + db6: d606 sw ra,44(sp) + db8: d422 sw s0,40(sp) + dba: d226 sw s1,36(sp) + ssd1306_cmd(SSD1306_COLUMNADDR); + dbc: 3f35 jal cf8 + ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset) + dbe: 4501 li a0,0 + dc0: 3f25 jal cf8 + ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset) + dc2: 07f00513 li a0,127 + dc6: 3f0d jal cf8 + ssd1306_cmd(SSD1306_PAGEADDR); + dc8: 02200513 li a0,34 + dcc: 3735 jal cf8 + ssd1306_cmd(0); // Page start address (0 = reset) + dce: 4501 li a0,0 + dd0: 3725 jal cf8 + ssd1306_cmd(7); // Page end address + dd2: 451d li a0,7 + dd4: c4418413 addi s0,gp,-956 # 20000040 + dd8: 3705 jal cf8 + for(i=0;i + 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 +} + 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 + +00000e0c : //#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 - d46: 400227b7 lui a5,0x40022 - d4a: 4705 li a4,1 - d4c: c398 sw a4,0(a5) + e0c: 400227b7 lui a5,0x40022 + e10: 4705 li a4,1 + e12: 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; - d4e: 400217b7 lui a5,0x40021 + e14: 400217b7 lui a5,0x40021 RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. - d52: 01080737 lui a4,0x1080 + e18: 01080737 lui a4,0x1080 RCC->CFGR0 = BASE_CFGR0; - d56: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> + e1c: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. - d5a: 08170713 addi a4,a4,129 # 1080081 - d5e: c398 sw a4,0(a5) + e20: 08170713 addi a4,a4,129 # 1080081 + e24: 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. - d60: 009f0737 lui a4,0x9f0 - d64: c798 sw a4,8(a5) + e26: 009f0737 lui a4,0x9f0 + e2a: 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 - d66: 4398 lw a4,0(a5) - d68: 00671693 slli a3,a4,0x6 - d6c: fe06dde3 bgez a3,d66 + e2c: 4398 lw a4,0(a5) + e2e: 00671693 slli a3,a4,0x6 + e32: fe06dde3 bgez a3,e2c #if defined(CH32H41x) RCC->PLLCFGR |= RCC_SYSPLL_GATE; #endif uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW - d70: 43d8 lw a4,4(a5) + e36: 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 - d72: 400216b7 lui a3,0x40021 + e38: 400216b7 lui a3,0x40021 uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW - d76: 9b71 andi a4,a4,-4 + e3c: 9b71 andi a4,a4,-4 RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source - d78: 00276713 ori a4,a4,2 - d7c: c3d8 sw a4,4(a5) + e3e: 00276713 ori a4,a4,2 + e42: c3d8 sw a4,4(a5) while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source - d7e: 4721 li a4,8 - d80: 42dc lw a5,4(a3) - d82: 8bb1 andi a5,a5,12 - d84: fee79ee3 bne a5,a4,d80 + 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; - d88: e00007b7 lui a5,0xe0000 - d8c: 0e07ac23 sw zero,248(a5) # e00000f8 <_eusrstack+0xbffff8f8> + e4e: e00007b7 lui a5,0xe0000 + e52: 0e07ac23 sw zero,248(a5) # e00000f8 <_eusrstack+0xbffff8f8> *DMDATA0 = 0x80; - d90: 08000713 li a4,128 - d94: 0ee7aa23 sw a4,244(a5) + e56: 08000713 li a4,128 + e5a: 0ee7aa23 sw a4,244(a5) SetupDebugPrintf(); #endif #if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS CallConstructors(); #endif } - d98: 8082 ret + e5e: 8082 ret -00000d9a
: +00000e60
: } } // ----------------------------------------------------------------- main int main(void) { - d9a: 7139 addi sp,sp,-64 - d9c: de06 sw ra,60(sp) - d9e: dc22 sw s0,56(sp) - da0: da26 sw s1,52(sp) + e60: f9810113 addi sp,sp,-104 + e64: d286 sw ra,100(sp) + e66: d0a2 sw s0,96(sp) + e68: cea6 sw s1,92(sp) SystemInit(); - da2: 3755 jal d46 + e6a: 374d jal e0c funGpioInitAll(); - da4: 400214b7 lui s1,0x40021 - da8: 4c9c lw a5,24(s1) + e6c: 400214b7 lui s1,0x40021 + e70: 4c9c lw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - daa: 40011437 lui s0,0x40011 + e72: 40011437 lui s0,0x40011 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - dae: 76fd lui a3,0xfffff + e76: 76fd lui a3,0xfffff funGpioInitAll(); - db0: 0357e793 ori a5,a5,53 - db4: cc9c sw a5,24(s1) + e78: 0357e793 ori a5,a5,53 + e7c: cc9c sw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - db6: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000> - dba: 4398 lw a4,0(a5) + e7e: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000> + e82: 4398 lw a4,0(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - dbc: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff> + e84: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff> funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); - dc0: f1000637 lui a2,0xf1000 + e88: f1000637 lui a2,0xf1000 funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - dc4: f0f77713 andi a4,a4,-241 - dc8: 01076713 ori a4,a4,16 - dcc: c398 sw a4,0(a5) + e8c: f0f77713 andi a4,a4,-241 + e90: 01076713 ori a4,a4,16 + e94: c398 sw a4,0(a5) funDigitalWrite(LED_PIN, FUN_LOW); - dce: 00020737 lui a4,0x20 - dd2: cb98 sw a4,16(a5) + e96: 00020737 lui a4,0x20 + e9a: cb98 sw a4,16(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - dd4: 40040793 addi a5,s0,1024 - dd8: 4398 lw a4,0(a5) + e9c: 40040793 addi a5,s0,1024 + ea0: 4398 lw a4,0(a5) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); - dda: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff> + ea2: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff> gpio_setup(); Delay_Ms(120); // let the OLED rail settle - ddc: 000b0537 lui a0,0xb0 + ea4: 000b0537 lui a0,0xb0 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); - de0: 8f75 and a4,a4,a3 - de2: 10076713 ori a4,a4,256 - de6: c398 sw a4,0(a5) + ea8: 8f75 and a4,a4,a3 + eaa: 10076713 ori a4,a4,256 + eae: c398 sw a4,0(a5) funDigitalWrite(BUZZER, FUN_LOW); - de8: 00040737 lui a4,0x40 - dec: cb98 sw a4,16(a5) + eb0: 00040737 lui a4,0x40 + eb4: cb98 sw a4,16(a5) funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); - dee: 4018 lw a4,0(s0) + eb6: 4018 lw a4,0(s0) Delay_Ms(120); // let the OLED rail settle - df0: c8050513 addi a0,a0,-896 # afc80 + eb8: c8050513 addi a0,a0,-896 # afc80 funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); - df4: 9b41 andi a4,a4,-16 - df6: 00876713 ori a4,a4,8 - dfa: c018 sw a4,0(s0) + ebc: 9b41 andi a4,a4,-16 + ebe: 00876713 ori a4,a4,8 + ec2: c018 sw a4,0(s0) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); - dfc: 4398 lw a4,0(a5) - dfe: 8f71 and a4,a4,a2 - e00: 08000637 lui a2,0x8000 - e04: 8f51 or a4,a4,a2 - e06: c398 sw a4,0(a5) + 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) funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD); - e08: 4398 lw a4,0(a5) - e0a: ff100637 lui a2,0xff100 - e0e: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff> - e10: 8f71 and a4,a4,a2 - e12: 00800637 lui a2,0x800 - e16: 8f51 or a4,a4,a2 - e18: c398 sw a4,0(a5) + 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) funDigitalWrite(BTN_OK, FUN_HIGH); - e1a: 4705 li a4,1 - e1c: c818 sw a4,16(s0) + ee2: 4705 li a4,1 + ee4: c818 sw a4,16(s0) funDigitalWrite(BTN_LEFT, FUN_HIGH); - e1e: 04000713 li a4,64 - e22: cb98 sw a4,16(a5) + ee6: 04000713 li a4,64 + eea: cb98 sw a4,16(a5) funDigitalWrite(BTN_RIGHT, FUN_HIGH); - e24: 02000713 li a4,32 - e28: cb98 sw a4,16(a5) + eec: 02000713 li a4,32 + ef0: cb98 sw a4,16(a5) Delay_Ms(120); // let the OLED rail settle - e2a: c18ff0ef jal 242 + ef2: b50ff0ef jal 242 * init I2C and GPIO */ uint8_t ssd1306_i2c_init(void) { // Enable GPIOC and I2C RCC->APB1PCENR |= RCC_APB1Periph_I2C1; - e2e: 4cdc lw a5,28(s1) - e30: 00200737 lui a4,0x200 - e34: 8fd9 or a5,a5,a4 - e36: ccdc sw a5,28(s1) + ef6: 4cdc lw a5,28(s1) + ef8: 00200737 lui a4,0x200 + efc: 8fd9 or a5,a5,a4 + efe: 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; - e38: 4c9c lw a5,24(s1) + f00: 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)); - e3a: 777d lui a4,0xfffff - e3c: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> + f02: 777d lui a4,0xfffff + f04: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; - e40: 0117e793 ori a5,a5,17 - e44: cc9c sw a5,24(s1) + f08: 0117e793 ori a5,a5,17 + f0c: cc9c sw a5,24(s1) GPIOC->CFGLR &= ~(0xf<<(4*1)); - e46: 401c lw a5,0(s0) + f0e: 401c lw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); - e48: 6705 lui a4,0x1 - e4a: d0070713 addi a4,a4,-768 # d00 + f10: 6705 lui a4,0x1 + f12: d0070713 addi a4,a4,-768 # d00 GPIOC->CFGLR &= ~(0xf<<(4*1)); - e4e: f0f7f793 andi a5,a5,-241 - e52: c01c sw a5,0(s0) + f16: f0f7f793 andi a5,a5,-241 + f1a: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); - e54: 401c lw a5,0(s0) - e56: 0d07e793 ori a5,a5,208 - e5a: c01c sw a5,0(s0) + f1c: 401c lw a5,0(s0) + f1e: 0d07e793 ori a5,a5,208 + f22: c01c sw a5,0(s0) GPIOC->CFGLR &= ~(0xf<<(4*2)); - e5c: 401c lw a5,0(s0) - e5e: 8ff5 and a5,a5,a3 - e60: c01c sw a5,0(s0) + f24: 401c lw a5,0(s0) + f26: 8ff5 and a5,a5,a3 + f28: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); - e62: 401c lw a5,0(s0) - e64: 8fd9 or a5,a5,a4 - e66: c01c sw a5,0(s0) + f2a: 401c lw a5,0(s0) + f2c: 8fd9 or a5,a5,a4 + f2e: 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; - e68: 6409 lui s0,0x2 + f30: 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(); - e6a: caaff0ef jal 314 - e6e: 3a040413 addi s0,s0,928 # 23a0 + f32: be2ff0ef jal 314 + f36: eb440413 addi s0,s0,-332 # 1eb4 ssd1306_setbuf(0); - e72: 3d81 jal cc2 + f3a: 3d2d jal d74 while(*cmd_list != SSD1306_TERMINATE_CMDS) - e74: 00044503 lbu a0,0(s0) - e78: 0ff00793 li a5,255 - e7c: 00f51463 bne a0,a5,e84 + f3c: 00044503 lbu a0,0(s0) + f40: 0ff00793 li a5,255 + f44: 00f51463 bne a0,a5,f4c { if(ssd1306_cmd(*cmd_list++)) return 1; } ssd1306_refresh(); - e80: 35ad jal cea + f48: 35a5 jal db0 #endif return 0; - e82: a021 j e8a + f4a: a021 j f52 if(ssd1306_cmd(*cmd_list++)) - e84: 0405 addi s0,s0,1 - e86: 33c1 jal c46 - e88: d575 beqz a0,e74 + 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 while (1) { led_blink(); Delay_Ms(700); } } ssd1306_init(); pet_reset(); - e8a: dacff0ef jal 436 + f52: d78ff0ef jal 4ca ssd1306_setbuf(0); - e8e: 3d15 jal cc2 + f56: 3d39 jal d74 draw_center_str(4, "PANAGOTCHI"); - e90: 6585 lui a1,0x1 - e92: 6b858593 addi a1,a1,1720 # 16b8 - e96: 4511 li a0,4 - e98: e78ff0ef jal 510 + 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); - e9c: 02000713 li a4,32 - ea0: 6609 lui a2,0x2 - ea2: 86ba mv a3,a4 - ea4: 3bc60613 addi a2,a2,956 # 23bc - ea8: 45c1 li a1,16 - eaa: 03000513 li a0,48 - eae: fd0ff0ef jal 67e + 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"); - eb2: 6585 lui a1,0x1 - eb4: 6c458593 addi a1,a1,1732 # 16c4 - eb8: 03400513 li a0,52 - ebc: e54ff0ef jal 510 + f7a: 6589 lui a1,0x2 + f7c: 95458593 addi a1,a1,-1708 # 1954 + f80: 03400513 li a0,52 + f84: e0cff0ef jal 590 ssd1306_refresh(); - ec0: 352d jal cea + f88: 3525 jal db0 beep(659, 80); beep(784, 80); beep(988, 120); - ec2: 05000593 li a1,80 - ec6: 29300513 li a0,659 - eca: cdaff0ef jal 3a4 - ece: 05000593 li a1,80 - ed2: 31000513 li a0,784 - ed6: cceff0ef jal 3a4 - eda: 07800593 li a1,120 - ede: 3dc00513 li a0,988 - ee2: cc2ff0ef jal 3a4 - ee6: 0c800413 li s0,200 + 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(); - eea: d7cff0ef jal 466 - eee: 00855713 srli a4,a0,0x8 - ef2: 01055793 srli a5,a0,0x10 - ef6: 02e100a3 sb a4,33(sp) + 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; - efa: 8f49 or a4,a4,a0 + fc2: 8f49 or a4,a4,a0 Buttons b = read_buttons(); - efc: 02f10123 sb a5,34(sp) + fc4: 02f10523 sb a5,42(sp) if (b.ok || b.left || b.right) break; - f00: 8fd9 or a5,a5,a4 + fc8: 8fd9 or a5,a5,a4 Buttons b = read_buttons(); - f02: 02a10023 sb a0,32(sp) + fca: 02a10423 sb a0,40(sp) if (b.ok || b.left || b.right) break; - f06: 0ff7f793 zext.b a5,a5 - f0a: eb81 bnez a5,f1a + fce: 0ff7f793 zext.b a5,a5 + fd2: eb81 bnez a5,fe2 Delay_Ms(20); - f0c: 6575 lui a0,0x1d - f0e: 4c050513 addi a0,a0,1216 # 1d4c0 + fd4: 6575 lui a0,0x1d + fd6: 4c050513 addi a0,a0,1216 # 1d4c0 for (int i = 0; i < 200; i++) { - f12: 147d addi s0,s0,-1 + fda: 147d addi s0,s0,-1 Delay_Ms(20); - f14: b2eff0ef jal 242 + fdc: a66ff0ef jal 242 for (int i = 0; i < 200; i++) { - f18: f869 bnez s0,eea + fe0: f869 bnez s0,fb2 beep(659, 80); beep(784, 80); beep(988, 120); - f1a: 4701 li a4,0 - f1c: 4481 li s1,0 - f1e: 4401 li s0,0 - f20: c03a sw a4,0(sp) + fe2: 4601 li a2,0 + fe4: 4481 li s1,0 + fe6: 4401 li s0,0 + fe8: c832 sw a2,16(sp) splash(); Buttons prev = {0, 0, 0}; while (1) { Buttons b = read_buttons(); - f22: d44ff0ef jal 466 - f26: 01055793 srli a5,a0,0x10 - f2a: 0ff57713 zext.b a4,a0 - f2e: c23a sw a4,4(sp) - f30: 00f10f23 sb a5,30(sp) - f34: 0ff7f793 zext.b a5,a5 - f38: 00855693 srli a3,a0,0x8 - f3c: c63e sw a5,12(sp) + 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) uint8_t ok_edge = b.ok && !prev.ok; - f3e: 4792 lw a5,4(sp) - Buttons b = read_buttons(); - f40: 0ff6f713 zext.b a4,a3 - f44: 00d10ea3 sb a3,29(sp) - f48: c43a sw a4,8(sp) - f4a: 00a10e23 sb a0,28(sp) - uint8_t ok_edge = b.ok && !prev.ok; - f4e: 4702 lw a4,0(sp) - f50: 4681 li a3,0 - f52: c399 beqz a5,f58 - f54: 00143693 seqz a3,s0 + 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; - f58: 4622 lw a2,8(sp) - f5a: 4781 li a5,0 - f5c: c219 beqz a2,f62 - f5e: 0014b793 seqz a5,s1 + 1020: 4722 lw a4,8(sp) + uint8_t ok_edge = b.ok && !prev.ok; + 1022: 00014783 lbu 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; - f62: 45b2 lw a1,12(sp) - f64: 4601 li a2,0 - f66: c199 beqz a1,f6c - f68: 00173613 seqz a2,a4 + 102e: 4532 lw a0,12(sp) + uint8_t left_edge = b.left && !prev.left; + 1030: 0ff6f593 zext.b a1,a3 + uint8_t right_edge = b.right && !prev.right; + 1034: 4701 li a4,0 + 1036: c119 beqz a0,103c + 1038: 00163713 seqz a4,a2 + uint8_t any_edge = ok_edge | left_edge | right_edge; + 103c: 8fcd or a5,a5,a1 + 103e: 8fd9 or a5,a5,a4 prev = b; - switch (screen) { - f6c: c181c583 lbu a1,-1000(gp) # 20000014 - f70: c1c18493 addi s1,gp,-996 # 20000018 - f74: c02e sw a1,0(sp) - f76: 4502 lw a0,0(sp) - f78: 4585 li a1,1 - f7a: 40b50163 beq a0,a1,137c - f7e: 4589 li a1,2 - f80: 4ab50463 beq a0,a1,1428 - f84: 1c051d63 bnez a0,115e - case SCR_MAIN: - if (left_edge) { - f88: c395 beqz a5,fac - cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; - f8a: c171c503 lbu a0,-1001(gp) # 20000013 - f8e: 4599 li a1,6 - f90: ca32 sw a2,20(sp) - f92: 0515 addi a0,a0,5 - f94: c836 sw a3,16(sp) - f96: 962ff0ef jal f8 <__modsi3> - f9a: c0a18ba3 sb a0,-1001(gp) # 20000013 - beep(1047, 25); - f9e: 45e5 li a1,25 - fa0: 41700513 li a0,1047 - fa4: c00ff0ef jal 3a4 - fa8: 4652 lw a2,20(sp) - faa: 46c2 lw a3,16(sp) + if (any_edge) idle_frames = 0; + 1040: c399 beqz a5,1046 + 1042: c201a423 sw zero,-984(gp) # 20000024 + + if (!disp_on) { + 1046: c051c603 lbu a2,-1019(gp) # 20000001 + 104a: e625 bnez a2,10b2 + // screen is asleep: the first press only wakes it (not an action) + if (any_edge) { + 104c: c799 beqz a5,105a + ssd1306_cmd(SSD1306_DISPLAYON); + 104e: 0af00513 li a0,175 + 1052: 315d jal cf8 + disp_on = 1; + 1054: 4785 li a5,1 + 1056: c0f182a3 sb a5,-1019(gp) # 20000001 + ssd1306_cmd(SSD1306_DISPLAYOFF); + disp_on = 0; } - if (right_edge) { - fac: c205 beqz a2,fcc - cursor = (cursor + 1) % ICON_COUNT; - fae: c171c503 lbu a0,-1001(gp) # 20000013 - fb2: 4599 li a1,6 - fb4: c836 sw a3,16(sp) - fb6: 0505 addi a0,a0,1 - fb8: 940ff0ef jal f8 <__modsi3> - fbc: c0a18ba3 sb a0,-1001(gp) # 20000013 - beep(1047, 25); - fc0: 45e5 li a1,25 - fc2: 41700513 li a0,1047 - fc6: bdeff0ef jal 3a4 - fca: 46c2 lw a3,16(sp) - } - if (ok_edge) do_action(cursor); - fcc: c6ad beqz a3,1036 - switch (act) { - fce: c171c783 lbu a5,-1001(gp) # 20000013 - fd2: 4695 li a3,5 - fd4: 06f6e163 bltu a3,a5,1036 - fd8: 6685 lui a3,0x1 - fda: 078a slli a5,a5,0x2 - fdc: 7b468693 addi a3,a3,1972 # 17b4 - fe0: 97b6 add a5,a5,a3 - fe2: 439c lw a5,0(a5) - fe4: 8782 jr a5 - pet.satiety = clamp100(pet.satiety + 30); - fe6: 00048783 lb a5,0(s1) # 40021000 <_eusrstack+0x20020800> -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - fea: 06400713 li a4,100 - pet.satiety = clamp100(pet.satiety + 30); - fee: 07f9 addi a5,a5,30 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - ff0: 1af75a63 bge a4,a5,11a4 - ff4: 87ba mv a5,a4 - ff6: 00f48023 sb a5,0(s1) - pet.hygiene = clamp100(pet.hygiene - 5); - ffa: 00348783 lb a5,3(s1) -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - ffe: 06400713 li a4,100 - pet.hygiene = clamp100(pet.hygiene - 5); - 1002: 17ed addi a5,a5,-5 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1004: 1af75563 bge a4,a5,11ae - 1008: 87ba mv a5,a4 - 100a: 00f481a3 sb a5,3(s1) -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 100e: 4711 li a4,4 - 1010: c0e18623 sb a4,-1012(gp) # 20000008 - beep(880, 60); beep(1175, 80); - 1014: 03c00593 li a1,60 -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 1018: 4731 li a4,12 - beep(880, 60); beep(1175, 80); - 101a: 37000513 li a0,880 -static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } - 101e: c0e18b23 sb a4,-1002(gp) # 20000012 - beep(880, 60); beep(1175, 80); - 1022: b82ff0ef jal 3a4 - 1026: 05000593 li a1,80 - 102a: 49700513 li a0,1175 - beep(988, 60); beep(1319, 60); beep(1568, 90); - 102e: b76ff0ef jal 3a4 - led_blink(); - 1032: bdaff0ef jal 40c - ssd1306_setbuf(0); - 1036: 3171 jal cc2 - draw_center_str(0, menu_labels[cursor]); - 1038: c171c783 lbu a5,-1001(gp) # 20000013 - 103c: 4501 li a0,0 - 103e: c83e sw a5,16(sp) - 1040: 4742 lw a4,16(sp) - 1042: 6789 lui a5,0x2 - 1044: 47078793 addi a5,a5,1136 # 2470 - 1048: 070a slli a4,a4,0x2 - 104a: 97ba add a5,a5,a4 - 104c: 438c lw a1,0(a5) - 104e: cc2ff0ef jal 510 - if (pet.alive && pet.health < 30 && (frame & 8)) - 1052: 00a4c783 lbu a5,10(s1) - 1056: ca3e sw a5,20(sp) - 1058: c38d beqz a5,107a - 105a: 00448703 lb a4,4(s1) - 105e: 47f5 li a5,29 - 1060: 00e7cd63 blt a5,a4,107a - 1064: c101a783 lw a5,-1008(gp) # 2000000c - 1068: 8ba1 andi a5,a5,8 - 106a: cb81 beqz a5,107a - ssd1306_drawstr(0, 0, "!", 1); - 106c: 6605 lui a2,0x1 - 106e: 6d460613 addi a2,a2,1748 # 16d4 - 1072: 4581 li a1,0 - 1074: 4501 li a0,0 - 1076: c22ff0ef jal 498 - beep(pet.sleeping ? 440 : 660, 120); - 107a: 4401 li s0,0 - 107c: 8522 mv a0,s0 - ssd1306_drawPixel(x++, y, color); - 107e: 4605 li a2,1 - 1080: 45a9 li a1,10 - 1082: ae6ff0ef jal 368 - 1086: 0405 addi s0,s0,1 - while (w--) - 1088: 08000793 li a5,128 - 108c: fef418e3 bne s0,a5,107c - if (pet.sleeping) { - 1090: 0094c403 lbu s0,9(s1) - 1094: 24040763 beqz s0,12e2 - ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1); - 1098: 6605 lui a2,0x1 - 109a: 6d860613 addi a2,a2,1752 # 16d8 - 109e: 45b9 li a1,14 - 10a0: 04e00513 li a0,78 - 10a4: bf4ff0ef jal 498 - ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1); - 10a8: 6605 lui a2,0x1 - 10aa: 6dc60613 addi a2,a2,1756 # 16dc - 10ae: 45b1 li a1,12 - 10b0: 05400513 li a0,84 - 10b4: be4ff0ef jal 498 - 10b8: 03000313 li t1,48 - px = 48; py = 16; - 10bc: 42c1 li t0,16 - if (!pet.alive) return EXP_DEAD; - 10be: 4752 lw a4,20(sp) - 10c0: 4799 li a5,6 - 10c2: c719 beqz a4,10d0 - if (anim_timer) return anim_exp; - 10c4: c161c783 lbu a5,-1002(gp) # 20000012 - 10c8: 24078663 beqz a5,1314 - 10cc: c0c1c783 lbu a5,-1012(gp) # 20000008 - ssd1306_drawImage(px, py, pana_frames[current_expression()], - 10d0: 6709 lui a4,0x2 - 10d2: 45470713 addi a4,a4,1108 # 2454 - 10d6: 078a slli a5,a5,0x2 - 10d8: 97ba add a5,a5,a4 - 10da: 4390 lw a2,0(a5) - 10dc: 02000713 li a4,32 - 10e0: 86ba mv a3,a4 - 10e2: 8596 mv a1,t0 - 10e4: 851a mv a0,t1 - 10e6: d98ff0ef jal 67e - 10ea: 4401 li s0,0 - 10ec: 8522 mv a0,s0 - ssd1306_drawPixel(x++, y, color); - 10ee: 4605 li a2,1 - 10f0: 02e00593 li a1,46 - 10f4: a74ff0ef jal 368 - 10f8: 0405 addi s0,s0,1 - while (w--) - 10fa: 08000793 li a5,128 - 10fe: fef417e3 bne s0,a5,10ec - for (uint8_t i = 0; i < pet.poop; i++) - 1102: 0084c783 lbu a5,8(s1) - 1106: 4702 lw a4,0(sp) - 1108: 24f76663 bltu a4,a5,1354 - 110c: 4401 li s0,0 - ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); - 110e: 00241793 slli a5,s0,0x2 - 1112: 00878733 add a4,a5,s0 - 1116: 070a slli a4,a4,0x2 - 1118: 00870333 add t1,a4,s0 - 111c: 6709 lui a4,0x2 - 111e: 43c70713 addi a4,a4,1084 # 243c - 1122: 97ba add a5,a5,a4 - 1124: 4390 lw a2,0(a5) - 1126: 4741 li a4,16 - 1128: 86ba mv a3,a4 - 112a: 00330513 addi a0,t1,3 - 112e: 03000593 li a1,48 - 1132: c01a sw t1,0(sp) - 1134: d4aff0ef jal 67e - if (i == cursor) - 1138: 4742 lw a4,16(sp) - 113a: 0ff47793 zext.b a5,s0 - 113e: 4302 lw t1,0(sp) - 1140: 00f71a63 bne a4,a5,1154 - ssd1306_drawRect(x - 2, 46, ICON_W + 3, ICON_H + 2, 1); - 1144: 46c9 li a3,18 - 1146: 464d li a2,19 - 1148: 02e00593 li a1,46 - 114c: 00130513 addi a0,t1,1 - 1150: c74ff0ef jal 5c4 - for (uint8_t i = 0; i < ICON_COUNT; i++) { - 1154: 0405 addi s0,s0,1 - 1156: 4799 li a5,6 - 1158: faf41be3 bne s0,a5,110e - ssd1306_refresh(); - 115c: 3679 jal cea - } - draw_dead(); - break; } if (anim_timer) anim_timer--; - 115e: c161c783 lbu a5,-1002(gp) # 20000012 - 1162: c781 beqz a5,116a - 1164: 17fd addi a5,a5,-1 - 1166: c0f18b23 sb a5,-1002(gp) # 20000012 + 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 - // advance game time independent of which screen is showing + // advance game time independent of screen / display state if (pet.alive && ++tick_acc >= TICK_FRAMES) { - 116a: 00a4c783 lbu a5,10(s1) - 116e: cf81 beqz a5,1186 - 1170: c141d783 lhu a5,-1004(gp) # 20000010 - 1174: 03100693 li a3,49 - 1178: 0785 addi a5,a5,1 - 117a: 07c2 slli a5,a5,0x10 - 117c: 83c1 srli a5,a5,0x10 - 117e: 30f6e763 bltu a3,a5,148c - 1182: c0f19a23 sh a5,-1004(gp) # 20000010 + 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 tick_acc = 0; game_tick(); } frame++; - 1186: c101a783 lw a5,-1008(gp) # 2000000c + 108a: c201a783 lw a5,-992(gp) # 2000001c + idle_frames++; Delay_Ms(FRAME_MS); - 118a: 00058537 lui a0,0x58 - 118e: e4050513 addi a0,a0,-448 # 57e40 + 108e: 00058537 lui a0,0x58 + 1092: e4050513 addi a0,a0,-448 # 57e40 frame++; - 1192: 0785 addi a5,a5,1 - 1194: c0f1a823 sw a5,-1008(gp) # 2000000c + 1096: 0785 addi a5,a5,1 + 1098: c2f1a023 sw a5,-992(gp) # 2000001c + idle_frames++; + 109c: c281a783 lw a5,-984(gp) # 20000024 + 10a0: 0785 addi a5,a5,1 + 10a2: c2f1a423 sw a5,-984(gp) # 20000024 Delay_Ms(FRAME_MS); - 1198: 8aaff0ef jal 242 + 10a6: 99cff0ef jal 242 prev = b; - 119c: 4732 lw a4,12(sp) - 119e: 44a2 lw s1,8(sp) - 11a0: 4412 lw s0,4(sp) + 10aa: 4632 lw a2,12(sp) + 10ac: 44a2 lw s1,8(sp) + 10ae: 4412 lw s0,4(sp) while (1) { - 11a2: bbbd j f20 + 10b0: bf25 j fe8 + 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 + 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 + beep(1047, 25); + 10dc: 45e5 li a1,25 + 10de: 41700513 li a0,1047 + 10e2: b4eff0ef jal 430 + 10e6: 4742 lw a4,16(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 + 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); } - 11a4: fff7c713 not a4,a5 - 11a8: 877d srai a4,a4,0x1f - 11aa: 8ff9 and a5,a5,a4 - 11ac: b5a9 j ff6 - 11ae: fff7c713 not a4,a5 - 11b2: 877d srai a4,a4,0x1f - 11b4: 8ff9 and a5,a5,a4 - 11b6: bd91 j 100a - if (pet.energy < 15) { beep(220, 120); break; } // too tired - 11b8: 00248703 lb a4,2(s1) - 11bc: 47b9 li a5,14 - 11be: 00e7c963 blt a5,a4,11d0 - 11c2: 07800593 li a1,120 - 11c6: 0dc00513 li a0,220 - beep(659, 40); - 11ca: 9daff0ef jal 3a4 - break; - 11ce: b5a5 j 1036 - pet.happy = clamp100(pet.happy + 25); - 11d0: 00148783 lb a5,1(s1) + 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); } - 11d4: 06400693 li a3,100 - pet.happy = clamp100(pet.happy + 25); - 11d8: 07e5 addi a5,a5,25 + 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); } - 11da: 04f6d563 bge a3,a5,1224 - 11de: 87b6 mv a5,a3 - 11e0: 00f480a3 sb a5,1(s1) - pet.energy = clamp100(pet.energy - 12); - 11e4: ff470793 addi a5,a4,-12 + 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); } - 11e8: 06400713 li a4,100 - 11ec: 00f75363 bge a4,a5,11f2 - 11f0: 87ba mv a5,a4 - 11f2: 00f48123 sb a5,2(s1) + 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; } - 11f6: 4709 li a4,2 - 11f8: c0e18623 sb a4,-1012(gp) # 20000008 - beep(988, 60); beep(1319, 60); beep(1568, 90); - 11fc: 03c00593 li a1,60 + 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; } - 1200: 4731 li a4,12 - beep(988, 60); beep(1319, 60); beep(1568, 90); - 1202: 3dc00513 li a0,988 + 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; } - 1206: c0e18b23 sb a4,-1002(gp) # 20000012 - beep(988, 60); beep(1319, 60); beep(1568, 90); - 120a: 99aff0ef jal 3a4 - 120e: 03c00593 li a1,60 - 1212: 52700513 li a0,1319 - 1216: 98eff0ef jal 3a4 - 121a: 05a00593 li a1,90 - 121e: 62000513 li a0,1568 - 1222: b531 j 102e -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1224: fff7c693 not a3,a5 - 1228: 86fd srai a3,a3,0x1f - 122a: 8ff5 and a5,a5,a3 - 122c: bf55 j 11e0 - pet.sleeping = !pet.sleeping; - 122e: 0094c503 lbu a0,9(s1) - beep(pet.sleeping ? 440 : 660, 120); - 1232: 07800593 li a1,120 - pet.sleeping = !pet.sleeping; - 1236: 00153793 seqz a5,a0 - beep(pet.sleeping ? 440 : 660, 120); - 123a: 00a03533 snez a0,a0 - 123e: 40a00533 neg a0,a0 - 1242: 0dc57513 andi a0,a0,220 - pet.sleeping = !pet.sleeping; - 1246: 00f484a3 sb a5,9(s1) - beep(pet.sleeping ? 440 : 660, 120); - 124a: 1b850513 addi a0,a0,440 - 124e: bfb5 j 11ca - pet.happy = clamp100(pet.happy + 5); - 1250: c1c18693 addi a3,gp,-996 # 20000018 - 1254: 00148783 lb a5,1(s1) - pet.hygiene = 100; - 1258: 06400713 li a4,100 - pet.poop = 0; - 125c: 00048423 sb zero,8(s1) - pet.hygiene = 100; - 1260: 00e481a3 sb a4,3(s1) - pet.happy = clamp100(pet.happy + 5); - 1264: 0795 addi a5,a5,5 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1266: 02f75063 bge a4,a5,1286 - 126a: 87ba mv a5,a4 - beep(1319, 50); beep(1047, 50); - 126c: 03200593 li a1,50 - 1270: 52700513 li a0,1319 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1274: 00f680a3 sb a5,1(a3) - beep(1319, 50); beep(1047, 50); - 1278: 92cff0ef jal 3a4 - 127c: 03200593 li a1,50 - 1280: 41700513 li a0,1047 - 1284: b799 j 11ca -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1286: fff7c713 not a4,a5 - 128a: 877d srai a4,a4,0x1f - 128c: 8ff9 and a5,a5,a4 - 128e: bff9 j 126c - pet.health = clamp100(pet.health + 35); - 1290: 00448783 lb a5,4(s1) -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1294: 06400713 li a4,100 - pet.health = clamp100(pet.health + 35); - 1298: 02378793 addi a5,a5,35 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 129c: 02f75663 bge a4,a5,12c8 - 12a0: 87ba mv a5,a4 + 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); - 12a2: 03c00593 li a1,60 - 12a6: 31000513 li a0,784 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 12aa: 00f48223 sb a5,4(s1) - beep(784, 60); beep(1047, 60); beep(1319, 90); - 12ae: 8f6ff0ef jal 3a4 - 12b2: 03c00593 li a1,60 - 12b6: 41700513 li a0,1047 - 12ba: 8eaff0ef jal 3a4 - 12be: 05a00593 li a1,90 - 12c2: 52700513 li a0,1319 - 12c6: b3a5 j 102e -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 12c8: fff7c713 not a4,a5 - 12cc: 877d srai a4,a4,0x1f - 12ce: 8ff9 and a5,a5,a4 - 12d0: bfc9 j 12a2 - screen = SCR_STATS; - 12d2: 4785 li a5,1 - 12d4: c0f18c23 sb a5,-1000(gp) # 20000014 - beep(659, 40); - 12d8: 02800593 li a1,40 - 12dc: 29300513 li a0,659 - 12e0: b5ed j 11ca - uint32_t t = frame % 80; - 12e2: c101a283 lw t0,-1008(gp) # 2000000c - 12e6: 05000593 li a1,80 - 12ea: 8516 mv a0,t0 - 12ec: cc16 sw t0,24(sp) - 12ee: de7fe0ef jal d4 <__umodsi3> - px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 - 12f2: 02700793 li a5,39 - 12f6: 42e2 lw t0,24(sp) - 12f8: 01e50313 addi t1,a0,30 - 12fc: 00a7f663 bgeu a5,a0,1308 - 1300: 06e00793 li a5,110 - 1304: 40a78333 sub t1,a5,a0 - py = 14 + ((frame % 16) < 8 ? 0 : 1); - 1308: 0082f293 andi t0,t0,8 - 130c: 005032b3 snez t0,t0 - 1310: 02b9 addi t0,t0,14 - 1312: b375 j 10be - if (pet.sleeping) return EXP_SLEEP; - 1314: 4795 li a5,5 - 1316: da041de3 bnez s0,10d0 - if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) - 131a: 00448683 lb a3,4(s1) - 131e: 4775 li a4,29 - return EXP_SAD; - 1320: 478d li a5,3 - if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) - 1322: dad757e3 bge a4,a3,10d0 - 1326: 00148683 lb a3,1(s1) - 132a: 4761 li a4,24 - 132c: dad752e3 bge a4,a3,10d0 - 1330: 00048683 lb a3,0(s1) - 1334: 474d li a4,19 - 1336: d8d75de3 bge a4,a3,10d0 - if ((frame % 50) < 4) return EXP_BLINK; - 133a: c101a503 lw a0,-1008(gp) # 2000000c - 133e: 03200593 li a1,50 - 1342: cc16 sw t0,24(sp) - 1344: ca1a sw t1,20(sp) - 1346: d8ffe0ef jal d4 <__umodsi3> - 134a: 42e2 lw t0,24(sp) - 134c: 4352 lw t1,20(sp) - 134e: 00453793 sltiu a5,a0,4 - 1352: bbbd j 10d0 - ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); - 1354: 4782 lw a5,0(sp) - 1356: 4721 li a4,8 - 1358: 00179513 slli a0,a5,0x1 - 135c: 953e add a0,a0,a5 - 135e: 050a slli a0,a0,0x2 - 1360: 86ba mv a3,a4 - 1362: c0418613 addi a2,gp,-1020 # 20000000 - 1366: 02600593 li a1,38 - 136a: 953a add a0,a0,a4 - 136c: b12ff0ef jal 67e + 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++) - 1370: 4782 lw a5,0(sp) - 1372: 0785 addi a5,a5,1 - 1374: 0ff7f793 zext.b a5,a5 - 1378: c03e sw a5,0(sp) - 137a: b361 j 1102 - if (ok_edge || left_edge || right_edge) { - 137c: 8fd5 or a5,a5,a3 - 137e: 8fd1 or a5,a5,a2 - 1380: cb81 beqz a5,1390 - beep(880, 30); - 1382: 45f9 li a1,30 - 1384: 37000513 li a0,880 - screen = SCR_MAIN; - 1388: c0018c23 sb zero,-1000(gp) # 20000014 - beep(880, 30); - 138c: 818ff0ef jal 3a4 - ssd1306_setbuf(0); - 1390: 933ff0ef jal cc2 - draw_center_str(0, "-- STATUS --"); - 1394: 6585 lui a1,0x1 - 1396: 6e058593 addi a1,a1,1760 # 16e0 - 139a: 4501 li a0,0 - 139c: 974ff0ef jal 510 - draw_bar(10, "FOOD", pet.satiety); - 13a0: 00048603 lb a2,0(s1) - 13a4: 6585 lui a1,0x1 - 13a6: 6f058593 addi a1,a1,1776 # 16f0 - 13aa: 4529 li a0,10 - 13ac: a58ff0ef jal 604 - draw_bar(19, "FUN ", pet.happy); - 13b0: 00148603 lb a2,1(s1) - 13b4: 6585 lui a1,0x1 - 13b6: 6f858593 addi a1,a1,1784 # 16f8 - 13ba: 454d li a0,19 - 13bc: a48ff0ef jal 604 - draw_bar(28, "ENGY", pet.energy); - 13c0: 00248603 lb a2,2(s1) - 13c4: 6585 lui a1,0x1 - 13c6: 70058593 addi a1,a1,1792 # 1700 - 13ca: 4571 li a0,28 - 13cc: a38ff0ef jal 604 - draw_bar(37, "WASH", pet.hygiene); - 13d0: 00348603 lb a2,3(s1) - 13d4: 6585 lui a1,0x1 - 13d6: 70858593 addi a1,a1,1800 # 1708 - 13da: 02500513 li a0,37 - 13de: a26ff0ef jal 604 - draw_bar(46, "HLTH", pet.health); - 13e2: 00448603 lb a2,4(s1) - 13e6: 6585 lui a1,0x1 - 13e8: 71058593 addi a1,a1,1808 # 1710 - 13ec: 02e00513 li a0,46 - 13f0: a14ff0ef jal 604 - snprintf(line, sizeof(line), "Age %u %s", pet.age_min, - 13f4: 0094c783 lbu a5,9(s1) - 13f8: 0064d683 lhu a3,6(s1) - 13fc: c395 beqz a5,1420 - 13fe: 6705 lui a4,0x1 - 1400: 6b470713 addi a4,a4,1716 # 16b4 - 1404: 6605 lui a2,0x1 - 1406: 71860613 addi a2,a2,1816 # 1718 - 140a: 45c5 li a1,17 - 140c: 1008 addi a0,sp,32 - 140e: 88dff0ef jal c9a - ssd1306_drawstr(0, 56, line, 1); - 1412: 1010 addi a2,sp,32 - 1414: 03800593 li a1,56 - 1418: 4501 li a0,0 - 141a: 87eff0ef jal 498 + 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(); - 141e: bb3d j 115c - snprintf(line, sizeof(line), "Age %u %s", pet.age_min, - 1420: 6705 lui a4,0x1 - 1422: 6b070713 addi a4,a4,1712 # 16b0 - 1426: bff9 j 1404 - if (ok_edge) { // start a new pet - 1428: ce99 beqz a3,1446 - pet_reset(); - 142a: 80cff0ef jal 436 - beep(659, 80); beep(988, 120); - 142e: 05000593 li a1,80 - 1432: 29300513 li a0,659 - 1436: f6ffe0ef jal 3a4 - 143a: 07800593 li a1,120 - 143e: 3dc00513 li a0,988 - 1442: f63fe0ef jal 3a4 + 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); - 1446: 87dff0ef jal cc2 - ssd1306_drawImage(48, 8, spr_grave, 32, 32, 0); - 144a: 02000713 li a4,32 - 144e: 6609 lui a2,0x2 - 1450: 86ba mv a3,a4 - 1452: 48860613 addi a2,a2,1160 # 2488 - 1456: 45a1 li a1,8 - 1458: 03000513 li a0,48 - 145c: a22ff0ef jal 67e - draw_center_str(44, "R.I.P."); - 1460: 6585 lui a1,0x1 - 1462: 72458593 addi a1,a1,1828 # 1724 - 1466: 02c00513 li a0,44 - 146a: 8a6ff0ef jal 510 - snprintf(line, sizeof(line), "lived %u min", pet.age_min); - 146e: 0064d683 lhu a3,6(s1) - 1472: 6605 lui a2,0x1 - 1474: 72c60613 addi a2,a2,1836 # 172c - 1478: 45c5 li a1,17 - 147a: 1008 addi a0,sp,32 - 147c: 81fff0ef jal c9a + 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); - 1480: 100c addi a1,sp,32 - 1482: 03400513 li a0,52 - 1486: 88aff0ef jal 510 - 148a: b9c9 j 115c + 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 + 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 + 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 pet.age_min++; - 148c: 0064d303 lhu t1,6(s1) - if (pet.sleeping) { - 1490: 0094c503 lbu a0,9(s1) + 1710: 00645683 lhu a3,6(s0) + pet.satiety = clamp100(pet.satiety - 1); + 1714: 00040783 lb a5,0(s0) tick_acc = 0; - 1494: c0019a23 sh zero,-1004(gp) # 20000010 + 1718: c2019223 sh zero,-988(gp) # 20000020 pet.age_min++; - 1498: 0305 addi t1,t1,1 - 149a: 0342 slli t1,t1,0x10 - 149c: 01035313 srli t1,t1,0x10 - 14a0: 00649323 sh t1,6(s1) + 171c: 0685 addi a3,a3,1 + 171e: 06c2 slli a3,a3,0x10 + 1720: 82c1 srli a3,a3,0x10 + 1722: 00d41323 sh a3,6(s0) pet.satiety = clamp100(pet.satiety - 1); - 14a4: 00048703 lb a4,0(s1) - pet.energy = clamp100(pet.energy + 10); - 14a8: 00248783 lb a5,2(s1) - 14ac: 06400593 li a1,100 + 1726: 17fd addi a5,a5,-1 +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 1728: 06400713 li a4,100 if (pet.sleeping) { - 14b0: 14050163 beqz a0,15f2 - pet.energy = clamp100(pet.energy + 10); - 14b4: 00a78693 addi a3,a5,10 + 172c: 00944603 lbu a2,9(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 14b8: 12d5d363 bge a1,a3,15de - 14bc: 86ae mv a3,a1 - 14be: 06e2 slli a3,a3,0x18 - 14c0: 86e1 srai a3,a3,0x18 - pet.energy = clamp100(pet.energy + 10); - 14c2: 00d48123 sb a3,2(s1) - pet.satiety = clamp100(pet.satiety - 1); - 14c6: 177d addi a4,a4,-1 + 1730: 08f75463 bge a4,a5,17b8 + 1734: 87ba mv a5,a4 + 1736: 07e2 slli a5,a5,0x18 + pet.energy = clamp100(pet.energy + 6); + 1738: 00240703 lb a4,2(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 14c8: 06400613 li a2,100 - 14cc: 10e65e63 bge a2,a4,15e8 - 14d0: 8732 mv a4,a2 - 14d2: 0762 slli a4,a4,0x18 - 14d4: 8761 srai a4,a4,0x18 + 173c: 87e1 srai a5,a5,0x18 + 173e: 06400513 li a0,100 + if (pet.sleeping) { + 1742: c649 beqz a2,17cc + pet.energy = clamp100(pet.energy + 6); + 1744: 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 pet.satiety = clamp100(pet.satiety - 1); - 14d6: 00e48023 sb a4,0(s1) + 174e: 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) if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested - 14da: 05900613 li a2,89 - 14de: 00f65763 bge a2,a5,14ec - 14e2: 000484a3 sb zero,9(s1) - 14e6: 06400693 li a3,100 - 14ea: 4501 li a0,0 - pet.hygiene = clamp100(pet.hygiene - 1); - 14ec: 00348583 lb a1,3(s1) + 1756: 05d00793 li a5,93 + 175a: 00e7d563 bge a5,a4,1764 + 175e: 000404a3 sb zero,9(s0) + 1762: 4601 li a2,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) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 14f0: 06400793 li a5,100 - pet.hygiene = clamp100(pet.hygiene - 1); - 14f4: fff58613 addi a2,a1,-1 + 176e: 06400593 li a1,100 + if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); + 1772: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 14f8: 14c7dc63 bge a5,a2,1650 - 14fc: 863e mv a2,a5 - 14fe: 0662 slli a2,a2,0x18 - 1500: 8661 srai a2,a2,0x18 - pet.hygiene = clamp100(pet.hygiene - 1); - 1502: 00c481a3 sb a2,3(s1) + 1774: 08f5da63 bge a1,a5,1808 + 1778: 87ae mv a5,a1 + 177a: 00f401a3 sb a5,3(s0) if (!pet.sleeping && pet.poop < 3 && - 1506: e115 bnez a0,152a - 1508: 0084c503 lbu a0,8(s1) - 150c: 4789 li a5,2 - 150e: 00a7ee63 bltu a5,a0,152a - ((pet.age_min * 7u + frame) & 0x0F) == 0) - 1512: 00331793 slli a5,t1,0x3 - 1516: 406787b3 sub a5,a5,t1 - 151a: c101a303 lw t1,-1008(gp) # 2000000c - 151e: 979a add a5,a5,t1 - 1520: 8bbd andi a5,a5,15 + 177e: 00844583 lbu a1,8(s0) + 1782: ea41 bnez a2,1812 + 1784: 4789 li a5,2 + 1786: 00b7ed63 bltu a5,a1,17a0 + ((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 if (!pet.sleeping && pet.poop < 3 && - 1522: e781 bnez a5,152a + 1798: efad bnez a5,1812 pet.poop++; - 1524: 0505 addi a0,a0,1 - 1526: 00a48423 sb a0,8(s1) - if (pet.poop) pet.happy = clamp100(pet.happy - pet.poop); - 152a: 0084c503 lbu a0,8(s1) - 152e: c919 beqz a0,1544 - 1530: 00148783 lb a5,1(s1) - 1534: 8f89 sub a5,a5,a0 + 179a: 0585 addi a1,a1,1 + 179c: 00b40423 sb a1,8(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) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1536: 06400513 li a0,100 - 153a: 12f55063 bge a0,a5,165a - 153e: 87aa mv a5,a0 - 1540: 00f480a3 sb a5,1(s1) - if (pet.hygiene < 20) pet.happy = clamp100(pet.happy - 1); - 1544: 47d1 li a5,20 - 1546: 00b7cc63 blt a5,a1,155e - 154a: 00148783 lb a5,1(s1) + 17a6: 06400693 li a3,100 + if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); + 17aa: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 154e: 06400593 li a1,100 - if (pet.hygiene < 20) pet.happy = clamp100(pet.happy - 1); - 1552: 17fd addi a5,a5,-1 + 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 + pet.satiety = clamp100(pet.satiety - 1); + 17cc: 00f40023 sb a5,0(s0) + pet.energy = clamp100(pet.energy - 1); + 17d0: fff70793 addi a5,a4,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1554: 10f5d863 bge a1,a5,1664 - 1558: 87ae mv a5,a1 - 155a: 00f480a3 sb a5,1(s1) + 17d4: 02f55063 bge a0,a5,17f4 + 17d8: 87aa mv a5,a0 + 17da: 00f40123 sb a5,2(s0) + pet.happy = clamp100(pet.happy - 1); + 17de: 00140783 lb a5,1(s0) +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 17e2: 06400713 li a4,100 + pet.happy = clamp100(pet.happy - 1); + 17e6: 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 + if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); + 1812: f5d9 bnez a1,17a0 + 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) +static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } + 1824: 06400713 li a4,100 + if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); + 1828: 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) if (pet.hygiene < lo) lo = pet.hygiene; - 155e: 0014c583 lbu a1,1(s1) - 1562: 87ae mv a5,a1 - 1564: 05e2 slli a1,a1,0x18 - 1566: 85e1 srai a1,a1,0x18 - 1568: 00b65363 bge a2,a1,156e - 156c: 87b2 mv a5,a2 - 156e: 01879613 slli a2,a5,0x18 - 1572: 8661 srai a2,a2,0x18 - 1574: 00c75363 bge a4,a2,157a - 1578: 87ba mv a5,a4 - 157a: 01879713 slli a4,a5,0x18 - 157e: 8761 srai a4,a4,0x18 - 1580: 00e6d363 bge a3,a4,1586 - 1584: 87b6 mv a5,a3 - 1586: 01879713 slli a4,a5,0x18 - 158a: 8761 srai a4,a4,0x18 - if (lo < 15) pet.health = clamp100(pet.health - 5); - 158c: 46b9 li a3,14 - 158e: 00448783 lb a5,4(s1) - 1592: 0ce6ce63 blt a3,a4,166e - 1596: 17ed addi a5,a5,-5 + 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 + 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 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1598: 06400713 li a4,100 - 159c: 0cf75f63 bge a4,a5,167a - 15a0: 87ba mv a5,a4 - 15a2: 00f48223 sb a5,4(s1) + 1872: 06400613 li a2,100 + 1876: 08f65563 bge a2,a5,1900 + 187a: 87b2 mv a5,a2 + 187c: 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 + 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 + 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 + notify(N_WASH, pet.hygiene); + 189e: 85a6 mv a1,s1 + 18a0: 450d li a0,3 + 18a2: c61fe0ef jal 502 if (pet.health <= 0) { - 15a6: 00448783 lb a5,4(s1) - 15aa: bcf04ee3 bgtz a5,1186 + 18a6: 00440783 lb a5,4(s0) + 18aa: fef04063 bgtz a5,108a screen = SCR_DEAD; - 15ae: 4709 li a4,2 + 18ae: 4709 li a4,2 beep(330, 200); beep(247, 200); beep(165, 400); - 15b0: 0c800593 li a1,200 - 15b4: 14a00513 li a0,330 + 18b0: 0c800593 li a1,200 + 18b4: 14a00513 li a0,330 screen = SCR_DEAD; - 15b8: c0e18c23 sb a4,-1000(gp) # 20000014 + 18b8: c2e18aa3 sb a4,-971(gp) # 20000031 pet.alive = 0; - 15bc: 00048523 sb zero,10(s1) + 18bc: 00040523 sb zero,10(s0) beep(330, 200); beep(247, 200); beep(165, 400); - 15c0: de5fe0ef jal 3a4 - 15c4: 0c800593 li a1,200 - 15c8: 0f700513 li a0,247 - 15cc: dd9fe0ef jal 3a4 - 15d0: 19000593 li a1,400 - 15d4: 0a500513 li a0,165 - 15d8: dcdfe0ef jal 3a4 - 15dc: b66d j 1186 + 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 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 15de: fff6c613 not a2,a3 - 15e2: 867d srai a2,a2,0x1f - 15e4: 8ef1 and a3,a3,a2 - 15e6: bde1 j 14be - 15e8: fff74613 not a2,a4 - 15ec: 867d srai a2,a2,0x1f - 15ee: 8f71 and a4,a4,a2 - 15f0: b5cd j 14d2 - pet.satiety = clamp100(pet.satiety - 3); - 15f2: 1775 addi a4,a4,-3 - pet.happy = clamp100(pet.happy - 2); - 15f4: 00148603 lb a2,1(s1) -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 15f8: 02e5dd63 bge a1,a4,1632 - 15fc: 872e mv a4,a1 - 15fe: 0762 slli a4,a4,0x18 - 1600: 8761 srai a4,a4,0x18 - pet.satiety = clamp100(pet.satiety - 3); - 1602: 00e48023 sb a4,0(s1) - pet.energy = clamp100(pet.energy - 2); - 1606: 17f9 addi a5,a5,-2 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 1608: 06400693 li a3,100 - 160c: 02f6d863 bge a3,a5,163c - 1610: 87b6 mv a5,a3 - 1612: 01879693 slli a3,a5,0x18 - 1616: 86e1 srai a3,a3,0x18 - pet.energy = clamp100(pet.energy - 2); - 1618: 00d48123 sb a3,2(s1) - pet.happy = clamp100(pet.happy - 2); - 161c: 1679 addi a2,a2,-2 -static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 161e: 06400793 li a5,100 - 1622: 02c7d263 bge a5,a2,1646 - 1626: 863e mv a2,a5 - 1628: c1c18793 addi a5,gp,-996 # 20000018 - 162c: 00c780a3 sb a2,1(a5) - 1630: bd75 j 14ec - 1632: fff74693 not a3,a4 - 1636: 86fd srai a3,a3,0x1f - 1638: 8f75 and a4,a4,a3 - 163a: b7d1 j 15fe - 163c: fff7c693 not a3,a5 - 1640: 86fd srai a3,a3,0x1f - 1642: 8ff5 and a5,a5,a3 - 1644: b7f9 j 1612 - 1646: fff64793 not a5,a2 - 164a: 87fd srai a5,a5,0x1f - 164c: 8e7d and a2,a2,a5 - 164e: bfe9 j 1628 - 1650: fff64793 not a5,a2 - 1654: 87fd srai a5,a5,0x1f - 1656: 8e7d and a2,a2,a5 - 1658: b55d j 14fe - 165a: fff7c513 not a0,a5 - 165e: 857d srai a0,a0,0x1f - 1660: 8fe9 and a5,a5,a0 - 1662: bdf9 j 1540 - 1664: fff7c593 not a1,a5 - 1668: 85fd srai a1,a1,0x1f - 166a: 8fed and a5,a5,a1 - 166c: b5fd j 155a + 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 else if (lo > 50) pet.health = clamp100(pet.health + 2); - 166e: 03200693 li a3,50 - 1672: f2e6dae3 bge a3,a4,15a6 - 1676: 0789 addi a5,a5,2 - 1678: b705 j 1598 + 18f4: 03200513 li a0,50 + 18f8: f8c554e3 bge a0,a2,1880 + 18fc: 0789 addi a5,a5,2 + 18fe: bf95 j 1872 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } - 167a: fff7c713 not a4,a5 - 167e: 877d srai a4,a4,0x1f - 1680: 8ff9 and a5,a5,a4 - 1682: b705 j 15a2 - 1684: 31647373 .insn 4, 0x31647373 - 1688: 5f363033 .insn 4, 0x5f363033 - 168c: 3269 jal 1016 - 168e: 72655f63 bge a0,t1,1dcc - 1692: 6f72 .insn 2, 0x6f72 - 1694: 2072 .insn 2, 0x2072 - 1696: 202d jal 16c0 - 1698: 6974 .insn 2, 0x6974 - 169a: 656d lui a0,0x1b - 169c: 2074756f jal a0,490a2 - 16a0: 74696177 .insn 4, 0x74696177 - 16a4: 6e69 lui t3,0x1a - 16a6: 6f662067 .insn 4, 0x6f662067 - 16aa: 2072 .insn 2, 0x2072 - 16ac: 7325 lui t1,0xfffe9 - 16ae: 0d0a slli s10,s10,0x2 - 16b0: 0000 unimp - 16b2: 0000 unimp - 16b4: 7a5a .insn 2, 0x7a5a - 16b6: 007a c.slli zero,0x1e - 16b8: 4150 lw a2,4(a0) - 16ba: 414e lw sp,208(sp) - 16bc: 43544f47 .insn 4, 0x43544f47 - 16c0: 4948 lw a0,20(a0) - 16c2: 0000 unimp - 16c4: 7270 .insn 2, 0x7270 - 16c6: 7365 lui t1,0xffff9 - 16c8: 6e612073 .insn 4, 0x6e612073 - 16cc: 2079 jal 175a - 16ce: 0079656b .insn 4, 0x0079656b - 16d2: 0000 unimp - 16d4: 0021 c.nop 8 - 16d6: 0000 unimp - 16d8: 007a c.slli zero,0x1e - 16da: 0000 unimp - 16dc: 005a c.slli zero,0x16 - 16de: 0000 unimp - 16e0: 2d2d jal 1d1a - 16e2: 5320 lw s0,96(a4) - 16e4: 4154 lw a3,4(a0) - 16e6: 5554 lw a3,44(a0) - 16e8: 2d2d2053 .insn 4, 0x2d2d2053 - 16ec: 0000 unimp - 16ee: 0000 unimp - 16f0: 4f46 lw t5,80(sp) - 16f2: 0000444f .insn 4, 0x444f - 16f6: 0000 unimp - 16f8: 5546 lw a0,112(sp) - 16fa: 204e .insn 2, 0x204e - 16fc: 0000 unimp - 16fe: 0000 unimp - 1700: 4e45 li t3,17 - 1702: 00005947 .insn 4, 0x5947 - 1706: 0000 unimp - 1708: 48534157 .insn 4, 0x48534157 - 170c: 0000 unimp - 170e: 0000 unimp - 1710: 4c48 lw a0,28(s0) - 1712: 4854 lw a3,20(s0) - 1714: 0000 unimp - 1716: 0000 unimp - 1718: 6741 lui a4,0x10 - 171a: 2065 jal 17c2 - 171c: 7525 lui a0,0xfffe9 - 171e: 2020 .insn 2, 0x2020 - 1720: 7325 lui t1,0xfffe9 - 1722: 0000 unimp - 1724: 2e52 .insn 2, 0x2e52 - 1726: 2e49 jal 1ab8 - 1728: 2e50 .insn 2, 0x2e50 - 172a: 0000 unimp - 172c: 696c .insn 2, 0x696c - 172e: 6576 .insn 2, 0x6576 - 1730: 2064 .insn 2, 0x2064 - 1732: 7525 lui a0,0xfffe9 - 1734: 6d20 .insn 2, 0x6d20 - 1736: 6e69 lui t3,0x1a - 1738: 0000 unimp - 173a: 0000 unimp - 173c: 6f6e .insn 2, 0x6f6e - 173e: 2074 .insn 2, 0x2074 - 1740: 7562 .insn 2, 0x7562 - 1742: 00007973 .insn 4, 0x7973 - 1746: 0000 unimp - 1748: 616d addi sp,sp,240 - 174a: 72657473 .insn 4, 0x72657473 - 174e: 6d20 .insn 2, 0x6d20 - 1750: 0065646f jal s0,57756 - 1754: 7274 .insn 2, 0x7274 - 1756: 6e61 lui t3,0x18 - 1758: 74696d73 .insn 4, 0x74696d73 - 175c: 6d20 .insn 2, 0x6d20 - 175e: 0065646f jal s0,57764 - 1762: 0000 unimp - 1764: 7874 .insn 2, 0x7874 - 1766: 6520 .insn 2, 0x6520 - 1768: 706d c.lui zero,0xffffb - 176a: 7974 .insn 2, 0x7974 - 176c: 0000 unimp - 176e: 0000 unimp - 1770: 7274 .insn 2, 0x7274 - 1772: 6e61 lui t3,0x18 - 1774: 74696d73 .insn 4, 0x74696d73 - 1778: 6320 .insn 2, 0x6320 - 177a: 6c706d6f jal s10,8640 - 177e: 7465 lui s0,0xffff9 - 1780: 0065 c.nop 25 - 1782: 0000 unimp - 1784: 4546 lw a0,80(sp) - 1786: 4445 li s0,17 - 1788: 0000 unimp - 178a: 0000 unimp - 178c: 4c50 lw a2,28(s0) - 178e: 5941 li s2,-16 - 1790: 0000 unimp - 1792: 0000 unimp - 1794: 45454c53 .insn 4, 0x45454c53 - 1798: 0050 addi a2,sp,4 - 179a: 0000 unimp - 179c: 41454c43 .insn 4, 0x41454c43 - 17a0: 004e c.slli zero,0x13 - 17a2: 0000 unimp - 17a4: 4548 lw a0,12(a0) - 17a6: 4c41 li s8,16 - 17a8: 0000 unimp - 17aa: 0000 unimp - 17ac: 54415453 .insn 4, 0x54415453 - 17b0: 00000053 .insn 4, 0x0053 - 17b4: 0fe6 slli t6,t6,0x19 - 17b6: 0000 unimp - 17b8: 11b8 addi a4,sp,232 - 17ba: 0000 unimp - 17bc: 122e slli tp,tp,0x2b - 17be: 0000 unimp - 17c0: 1250 addi a2,sp,292 - 17c2: 0000 unimp - 17c4: 1290 addi a2,sp,352 - 17c6: 0000 unimp - 17c8: 12d2 slli t0,t0,0x34 + 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 + 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 + 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 + 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 + 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 + 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 + 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 ... -000017cc : - 17cc: 0000 0000 0000 c000 c000 c000 c006 c006 ................ - 17dc: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... +00001ac0 : + 1ac0: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............? + 1ad0: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|.......... -000017ec : - 17ec: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. - 17fc: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ +00001ae0 : + 1ae0: 0000 0000 0000 c000 c000 c000 c006 c006 ................ + 1af0: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... -0000180c : - 180c: 0000 0000 8000 8000 c001 c001 f007 f80d ................ - 181c: f80d f808 fc1d f80d f80f f80f f007 8000 ................ +00001b00 : + 1b00: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. + 1b10: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ -0000182c : - 182c: 0000 0000 0000 0004 000c 001c 0018 001c ................ - 183c: 003c 001c 001e 001f e80f f007 8000 0000 <............... +00001b20 : + 1b20: 0000 0000 8000 8000 c001 c001 f007 f80d ................ + 1b30: f80d f808 fc1d f80d f80f f80f f007 8000 ................ -0000184c : - 184c: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ - 185c: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. +00001b40 : + 1b40: 0000 0000 0000 0004 000c 001c 0018 001c ................ + 1b50: 003c 001c 001e 001f e80f f007 8000 0000 <............... -0000186c : - 186c: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. - 187c: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... +00001b60 : + 1b60: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ + 1b70: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. -0000188c : +00001b80 : + 1b80: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. + 1b90: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... + +00001ba0 : ... - 1894: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 18a4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 18b4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 18c4: ff07 f0ff bb0f f8ee d70f f8f5 ef0f f8fb ................ - 18d4: d70f f8f5 bb1f fcee ff0f f8ff ff0f f8ff ................ - 18e4: ff0f f8ff f00f f807 ff07 f0ff ff07 f0ff ................ - 18f4: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1904: 1f00 00fc 0000 0080 ........ + 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 ........ -0000190c : +00001c20 : ... - 1914: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1924: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1934: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1944: ff07 f0ff ff0f f8ff ff0f f8ff ff0f f8ff ................ - 1954: 010f 78c0 ff1f fcff ff0f f8ff ff0f f87f ...x............ - 1964: fc0f f81f ff0f f87f ff07 f0ff ff07 f0ff ................ - 1974: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1984: 1f00 00fc 0000 0080 ........ + 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 ........ -0000198c : +00001ca0 : ... - 1994: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 19a4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 19b4: ff1f f8ff ff0f f0ff ff03 e0ff ef07 f0fb ................ - 19c4: 8307 f0e0 930f f8e4 110f 78c4 830f f8e0 ...........x.... - 19d4: 830f f8e0 ef1f fcfb ff0f f87f fc0f f81f ................ - 19e4: fc0f f81f f80f f80f fc07 f01f fc07 f01f ................ - 19f4: ff03 e07f ff01 c0ff ff00 80ff 7f00 00ff ................ - 1a04: 1f00 00fc 0000 0080 ........ + 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 ........ -00001a0c : +00001d20 : ... - 1a14: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1a24: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1a34: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1a44: ff07 f0ff ef0f f8fb 830f f8e0 930f f8e4 ................ - 1a54: 110f 78c4 831f fce0 830f f860 ec0f f81b ...x......`..... - 1a64: ff0f f87f fc0f f81f f707 f0f7 fb07 f0ef ................ - 1a74: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1a84: 1f00 00fc 0000 0080 ........ + 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 ........ -00001a8c : +00001da0 : ... - 1a94: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1aa4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1ab4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1ac4: ff07 f0ff ff0f f8ff ef0f f8fb d70f f8f5 ................ - 1ad4: ff0f f8ff ff1f fcff ff0f f8ff f80f f80f ................ - 1ae4: fb0f f8ef f70f f8f7 fc07 f01f ff07 f0ff ................ - 1af4: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1b04: 1f00 00fc 0000 0080 ........ + 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 ........ -00001b0c : +00001e20 : ... - 1b14: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 1b24: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 1b34: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 1b44: ff07 f0ff ff0f f8ff ff0f f8ff 010f 78c0 ...............x - 1b54: ff0f f8ff ff1f fcff ff0f f87f fc0f f81f ................ - 1b64: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................ - 1b74: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 1b84: 1f00 00fc 0000 0080 ........ + 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 ........ -00001b8c : - 1b8c: 173c 0000 1748 0000 1754 0000 1764 0000 <...H...T...d... - 1b9c: 1770 0000 p... +00001ea0 : + 1ea0: 1a14 0000 1a20 0000 1a2c 0000 1a3c 0000 .... ...,...<... + 1eb0: 1a48 0000 H... -00001ba0 : +00001eb4 : + 1eb4: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... + 1ec4: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... + +00001ed0 : ... - 1ba8: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~ - 1bb8: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8.. - 1bc8: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8 - 1bd8: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<........... - 1be8: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 ..>....<~..~<. - 1c38: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{.... - 1c48: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a`<.|.. - 1cc8: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v. - 1cd8: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000... - 1ce8: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.l...... - 2038: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|. - 2048: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v. - 2058: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~.. - 2068: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|. - 2078: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f.. - 2088: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~.......... - 2098: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v. - 20a8: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|. - 20b8: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff. - 20c8: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v........~.. - 20d8: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>. - 20e8: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................ - 20f8: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j.. - 2108: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3.. - 2118: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".". - 2128: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w. - 2138: 1818 1818 1818 1818 1818 1818 18f8 1818 ................ - 2148: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666 - 2158: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........ - 2168: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666 - 2178: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666...... - 2188: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............ - 2198: 0000 0000 18f8 1818 1818 1818 001f 0000 ................ - 21a8: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................ - 21b8: 1818 1818 181f 1818 0000 0000 00ff 0000 ................ - 21c8: 1818 1818 18ff 1818 1818 181f 181f 1818 ................ - 21d8: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?... - 21e8: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666...... - 21f8: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666 - 2208: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666 - 2218: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666.... - 2228: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666 - 2238: 3636 3636 003f 0000 1818 181f 001f 0000 6666?........... - 2248: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666 - 2258: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........ - 2268: 1818 1818 00f8 0000 0000 0000 181f 1818 ................ - 2278: ffff ffff ffff ffff 0000 0000 ffff ffff ................ - 2288: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................ - 2298: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v. - 22a8: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x............... - 22b8: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`... - 22c8: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|. - 22d8: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.ff<...~..~.. - 2308: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0.. - 2318: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|.............. - 2328: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~. - 2338: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~......... - 2348: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~.... - 2358: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8.... - 2368: 0000 1800 0018 0000 0000 1800 0000 0000 ................ - 2378: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666... - 2388: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<.. + 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 ........ + +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 : + ... + 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 ................ ... -000023a0 : - 23a0: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... - 23b0: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... - -000023bc : +00002034 : ... - 23c4: 0001 8000 e00f f007 f01f f80f f01f f80f ................ - 23d4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... - 23e4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ - 23f4: ef07 f0fb 830f f8e0 930f f8e4 110f 78c4 ...............x - 2404: 830f f8e0 831f fce0 ef0f f87b fc0f f81f ..........{..... - 2414: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................ - 2424: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ - 2434: 1f00 00fc 0000 0080 ........ - -0000243c : - 243c: 186c 0000 184c 0000 182c 0000 180c 0000 l...L...,....... - 244c: 17ec 0000 17cc 0000 ........ - -00002454 : - 2454: 23bc 0000 1b0c 0000 1a8c 0000 1a0c 0000 .#.............. - 2464: 198c 0000 190c 0000 188c 0000 ............ - -00002470 : - 2470: 1784 0000 178c 0000 1794 0000 179c 0000 ................ - 2480: 17a4 0000 17ac 0000 ........ - -00002488 : - ... - 2490: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................ - 24a0: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3.. - 24b0: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0.......... - 24c0: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?... - 24d0: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................ - 24e0: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................ + 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|.....<<<<.. ... diff --git a/tama.map b/tama.map index 4941c20..59f7265 100644 --- a/tama.map +++ b/tama.map @@ -1,51 +1,50 @@ Archive member included to satisfy reference by file (symbol) ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) - /tmp/ccuFqAhq.ltrans0.ltrans.o (__divsi3) + /tmp/cczcSDec.ltrans0.ltrans.o (__divsi3) Discarded input sections - .text 0x00000000 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o - .data 0x00000000 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o - .bss 0x00000000 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.vprintf 0x00000000 0x16 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.sprintf 0x00000000 0x26 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.strcpy 0x00000000 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.strncpy 0x00000000 0x1c /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.strcmp 0x00000000 0x1a /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.strncmp 0x00000000 0x2e /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.strchr 0x00000000 0x16 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.strrchr 0x00000000 0x3c /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.memcmp 0x00000000 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.memmove 0x00000000 0x5e /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.memchr 0x00000000 0x1a /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.strnlen 0x00000000 0x2a /tmp/ccuFqAhq.ltrans0.ltrans.o + .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.twoway_strstr - 0x00000000 0x232 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.strstr 0x00000000 0x11c /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x232 /tmp/cczcSDec.ltrans0.ltrans.o + .text.strstr 0x00000000 0x11c /tmp/cczcSDec.ltrans0.ltrans.o .rodata.puts.str1.4 - 0x00000000 0x2 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.puts 0x00000000 0x40 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.setjmp 0x00000000 0x10 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.longjmp 0x00000000 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.putchar 0x00000000 0x68 /tmp/ccuFqAhq.ltrans0.ltrans.o + 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 .rodata.APBAHBPrescTable.lto_priv.0 - 0x00000000 0x10 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x10 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.ADCPrescTable.lto_priv.0 - 0x00000000 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x14 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.APBAHBPrescTable.lto_priv.1 - 0x00000000 0x10 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x10 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.ADCPrescTable.lto_priv.1 - 0x00000000 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o - .comment 0x00000000 0x35 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x14 /tmp/cczcSDec.ltrans0.ltrans.o + .comment 0x00000000 0x35 /tmp/cczcSDec.ltrans0.ltrans.o .note.GNU-stack - 0x00000000 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o - .comment 0x00000000 0x35 /tmp/cc6O5Yfp.debug.temp.o + 0x00000000 0x0 /tmp/cczcSDec.ltrans0.ltrans.o + .comment 0x00000000 0x35 /tmp/ccb2Xekb.debug.temp.o .note.GNU-stack - 0x00000000 0x0 /tmp/cc6O5Yfp.debug.temp.o - .comment 0x00000000 0x35 /tmp/ccQWTvKu.debug.temp.o + 0x00000000 0x0 /tmp/ccb2Xekb.debug.temp.o + .comment 0x00000000 0x35 /tmp/ccR20L1X.debug.temp.o .note.GNU-stack - 0x00000000 0x0 /tmp/ccQWTvKu.debug.temp.o + 0x00000000 0x0 /tmp/ccR20L1X.debug.temp.o .data 0x00000000 0x0 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) .bss 0x00000000 0x0 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) @@ -58,11 +57,11 @@ RAM 0x20000000 0x00000800 xrw Linker script and memory map -LOAD /tmp/ccc3BNuu.o -LOAD /tmp/ccuFqAhq.ltrans0.ltrans.o -LOAD /tmp/cc6O5Yfp.debug.temp.o -LOAD /tmp/ccQWTvKu.debug.temp.o -LOAD /tmp/ccZbRLFZ.o +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 ../ch32v003fun/ch32fun//../misc/libgcc.a LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a @@ -70,14 +69,14 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a 0x00000000 _sinit = . 0x00000000 . = ALIGN (0x4) *(SORT_NONE(.init)) - .init 0x00000000 0x9e /tmp/ccuFqAhq.ltrans0.ltrans.o + .init 0x00000000 0x9e /tmp/cczcSDec.ltrans0.ltrans.o 0x00000000 InterruptVectorDefault 0x00000000 InterruptVector 0x000000a0 . = ALIGN (0x4) *fill* 0x0000009e 0x2 0x000000a0 _einit = . -.text 0x000000a0 0x2468 +.text 0x000000a0 0x2794 0x000000a0 . = ALIGN (0x4) *(.text) .text 0x000000a0 0x7e ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) @@ -88,350 +87,360 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a 0x000000f8 __modsi3 *(.text.*) .text.mini_pad - 0x0000011e 0x8a /tmp/ccuFqAhq.ltrans0.ltrans.o - .text._puts 0x000001a8 0x40 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x0000011e 0x8a /tmp/cczcSDec.ltrans0.ltrans.o + .text._puts 0x000001a8 0x40 /tmp/cczcSDec.ltrans0.ltrans.o .text.PrintHex - 0x000001e8 0x5a /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x000001e8 0x5a /tmp/cczcSDec.ltrans0.ltrans.o .text.DelaySysTick - 0x00000242 0x12 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000242 0x12 /tmp/cczcSDec.ltrans0.ltrans.o .text.mini_itoa.part.0 - 0x00000254 0xc0 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000254 0xc0 /tmp/cczcSDec.ltrans0.ltrans.o .text.ssd1306_i2c_setup - 0x00000314 0x54 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000314 0x54 /tmp/cczcSDec.ltrans0.ltrans.o .text.ssd1306_drawPixel - 0x00000368 0x3c /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.beep 0x000003a4 0x68 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000368 0x3c /tmp/cczcSDec.ltrans0.ltrans.o + .text.ssd1306_drawstr + 0x000003a4 0x8c /tmp/cczcSDec.ltrans0.ltrans.o + .text.beep 0x00000430 0x70 /tmp/cczcSDec.ltrans0.ltrans.o .text.led_blink - 0x0000040c 0x2a /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x000004a0 0x2a /tmp/cczcSDec.ltrans0.ltrans.o .text.pet_reset - 0x00000436 0x30 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.read_buttons - 0x00000466 0x32 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.ssd1306_drawstr.constprop.0 - 0x00000498 0x78 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x000004ca 0x38 /tmp/cczcSDec.ltrans0.ltrans.o + .text.notify 0x00000502 0x8e /tmp/cczcSDec.ltrans0.ltrans.o .text.draw_center_str - 0x00000510 0x26 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.ssd1306_drawFastHLine.constprop.0 - 0x00000536 0x4a /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000590 0x28 /tmp/cczcSDec.ltrans0.ltrans.o + .text.read_buttons + 0x000005b8 0x32 /tmp/cczcSDec.ltrans0.ltrans.o .text.ssd1306_drawFastVLine.constprop.0 - 0x00000580 0x44 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.ssd1306_drawRect.constprop.0 - 0x000005c4 0x40 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.draw_bar - 0x00000604 0x7a /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x000005ea 0x44 /tmp/cczcSDec.ltrans0.ltrans.o .text.ssd1306_drawImage.constprop.0 - 0x0000067e 0xc0 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x0000062e 0xc0 /tmp/cczcSDec.ltrans0.ltrans.o + .text.ssd1306_drawFastHLine.part.0.constprop.0 + 0x000006ee 0x3e /tmp/cczcSDec.ltrans0.ltrans.o + .text.ssd1306_drawRect.constprop.0 + 0x0000072c 0x40 /tmp/cczcSDec.ltrans0.ltrans.o + .text.draw_bar + 0x0000076c 0x7c /tmp/cczcSDec.ltrans0.ltrans.o .text.internal_handle_input.constprop.0 - 0x0000073e 0xa /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x000007e8 0xa /tmp/cczcSDec.ltrans0.ltrans.o .text._write.constprop.0 - 0x00000748 0xe4 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x000007f2 0xe4 /tmp/cczcSDec.ltrans0.ltrans.o .text.__puts_uart - 0x0000082c 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x000008d6 0x14 /tmp/cczcSDec.ltrans0.ltrans.o .text.handle_reset - 0x00000840 0x72 /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x00000840 handle_reset + 0x000008ea 0x72 /tmp/cczcSDec.ltrans0.ltrans.o + 0x000008ea handle_reset .text.vector_handler - 0x000008b2 0x5a /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x000008b2 OPCM_IRQHandler - 0x000008b2 EXTI2_IRQHandler - 0x000008b2 TIM8_TRG_COM_IRQHandler - 0x000008b2 TIM8_CC_IRQHandler - 0x000008b2 USART_WKUP_IRQHandler - 0x000008b2 UART8_IRQHandler - 0x000008b2 SPI4_IRQHandler - 0x000008b2 NFC_IRQHandler - 0x000008b2 DFSDM0_IRQHandler - 0x000008b2 TIM1_CC_IRQHandler - 0x000008b2 HardFault_Handler - 0x000008b2 TIM10_IRQHandler - 0x000008b2 GPIOB_IRQHandler - 0x000008b2 IPC_CH2_Handler - 0x000008b2 USBPD_IRQHandler - 0x000008b2 TIM6_IRQHandler - 0x000008b2 GPIOA_IRQHandler - 0x000008b2 SysTick_Handler - 0x000008b2 CAN3_RX1_IRQHandler - 0x000008b2 I3C_ER_IRQHandler - 0x000008b2 PVD_IRQHandler - 0x000008b2 SDIO_IRQHandler - 0x000008b2 TIM9_BRK_IRQHandler - 0x000008b2 DMA2_Channel8_IRQHandler - 0x000008b2 CAN2_RX1_IRQHandler - 0x000008b2 EXTI3_IRQHandler - 0x000008b2 HSEM_Handler - 0x000008b2 UART1_IRQHandler - 0x000008b2 USBHS_IRQHandler - 0x000008b2 LPTIM2_IRQHandler - 0x000008b2 DMA2_Channel9_IRQHandler - 0x000008b2 TIM10_CC_IRQHandler - 0x000008b2 EXTI25_16_IRQHandler - 0x000008b2 I2C3_ER_IRQHandler - 0x000008b2 USBFS_IRQHandler - 0x000008b2 UART0_IRQHandler - 0x000008b2 USART8_IRQHandler - 0x000008b2 EXTI0_IRQHandler - 0x000008b2 I2C2_EV_IRQHandler - 0x000008b2 TIM10_TRG_COM_IRQHandler - 0x000008b2 LPTIM_IRQHandler - 0x000008b2 CAN1_RX0_IRQHandler - 0x000008b2 CAN3_SCE_IRQHandler - 0x000008b2 CAN2_SCE_IRQHandler - 0x000008b2 ADC1_2_IRQHandler - 0x000008b2 BB_IRQHandler - 0x000008b2 Break_Point_Handler - 0x000008b2 IPC_CH0_Handler - 0x000008b2 TIM2_CC_IRQHandler - 0x000008b2 SPI1_IRQHandler - 0x000008b2 USART5_IRQHandler - 0x000008b2 TAMPER_IRQHandler - 0x000008b2 TMR0_IRQHandler - 0x000008b2 AWU_IRQHandler - 0x000008b2 EXTI7_0_IRQHandler - 0x000008b2 CAN2_RX0_IRQHandler - 0x000008b2 OSCWakeUp_IRQHandler - 0x000008b2 TIM8_UP_IRQHandler - 0x000008b2 Ecall_M_Mode_Handler - 0x000008b2 ECDC_IRQHandler - 0x000008b2 SDMMC_IRQHandler - 0x000008b2 USART7_IRQHandler - 0x000008b2 DMA2_Channel2_IRQHandler - 0x000008b2 DMA1_Channel4_IRQHandler - 0x000008b2 ADC1_IRQHandler - 0x000008b2 TIM2_BRK_IRQHandler - 0x000008b2 USART6_IRQHandler - 0x000008b2 CAN3_RX0_IRQHandler - 0x000008b2 HSADC_IRQHandler - 0x000008b2 TIM9_UP_IRQHandler - 0x000008b2 USART3_IRQHandler - 0x000008b2 RTC_IRQHandler - 0x000008b2 DMA1_Channel7_IRQHandler - 0x000008b2 LED_IRQHandler - 0x000008b2 CAN1_RX1_IRQHandler - 0x000008b2 DVP_IRQHandler - 0x000008b2 UART5_IRQHandler - 0x000008b2 USBSS_IRQHandler - 0x000008b2 SWPMI_IRQHandler - 0x000008b2 USBPDWakeUp_IRQHandler - 0x000008b2 EXTI15_8_IRQHandler - 0x000008b2 TIM4_IRQHandler - 0x000008b2 DMA2_Channel1_IRQHandler - 0x000008b2 SWPMI_WKUP_IRQHandler - 0x000008b2 USBPD_WKUP_IRQHandler - 0x000008b2 I2C1_EV_IRQHandler - 0x000008b2 USBSSWakeup_IRQHandler - 0x000008b2 UART2_IRQHandler - 0x000008b2 USART4_IRQHandler - 0x000008b2 PWMX_IRQHandler - 0x000008b2 DMA1_Channel6_IRQHandler - 0x000008b2 UART4_IRQHandler - 0x000008b2 DMA2_Channel4_IRQHandler - 0x000008b2 TIM3_IRQHandler - 0x000008b2 RCC_IRQHandler - 0x000008b2 TIM1_TRG_COM_IRQHandler - 0x000008b2 DMA1_Channel1_IRQHandler - 0x000008b2 DMA2_Channel7_IRQHandler - 0x000008b2 QSPI1_IRQHandler - 0x000008b2 EXTI15_10_IRQHandler - 0x000008b2 ADC_IRQHandler - 0x000008b2 IPC_CH3_Handler - 0x000008b2 DMA1_Channel8_IRQHandler - 0x000008b2 I3C_EV_IRQHandler - 0x000008b2 TMR2_IRQHandler - 0x000008b2 I3C_WKUP_IRQHandler - 0x000008b2 DefaultIRQHandler - 0x000008b2 TIM12_IRQHandler - 0x000008b2 TIM7_IRQHandler - 0x000008b2 CAN2_TX_IRQHandler - 0x000008b2 TIM5_IRQHandler - 0x000008b2 I2C3_EV_IRQHandler - 0x000008b2 USB_IRQHandler - 0x000008b2 EXTI9_5_IRQHandler - 0x000008b2 PIOC_IRQHandler - 0x000008b2 TIM9_IRQHandler - 0x000008b2 LTDC_IRQHandler - 0x000008b2 SAI_IRQHandler - 0x000008b2 SPI2_IRQHandler - 0x000008b2 OSC32KCal_IRQHandler - 0x000008b2 IPC_CH1_Handler - 0x000008b2 I2C_IRQHandler - 0x000008b2 LPTIM1_WKUP_IRQHandler - 0x000008b2 TIM10_BRK_IRQHandler - 0x000008b2 TIM9_CC_IRQHandler - 0x000008b2 CAN1_TX_IRQHandler - 0x000008b2 DMA2_Channel5_IRQHandler - 0x000008b2 USB2_IRQHandler - 0x000008b2 USBHSWakeUp_IRQHandler - 0x000008b2 DMA1_Channel5_IRQHandler - 0x000008b2 EXTI4_IRQHandler - 0x000008b2 USB_LP_CAN1_RX0_IRQHandler - 0x000008b2 QSPI2_IRQHandler - 0x000008b2 RNG_IRQHandler - 0x000008b2 USB_HP_CAN1_TX_IRQHandler - 0x000008b2 LLE_IRQHandler - 0x000008b2 CMPWakeUp_IRQHandler - 0x000008b2 DMA1_Channel3_IRQHandler - 0x000008b2 FSMC_IRQHandler - 0x000008b2 ETH_IRQHandler - 0x000008b2 TIM1_UP_IRQHandler - 0x000008b2 LPTIMWakeUp_IRQHandler - 0x000008b2 WWDG_IRQHandler - 0x000008b2 USBHSWakeup_IRQHandler - 0x000008b2 DMA2_Channel11_IRQHandler - 0x000008b2 WDOG_BAT_IRQHandler - 0x000008b2 Ecall_U_Mode_Handler - 0x000008b2 I2C4_EV_IRQHandler - 0x000008b2 CAN3_TX_IRQHandler - 0x000008b2 TMR3_IRQHandler - 0x000008b2 DMA2_Channel6_IRQHandler - 0x000008b2 TIM2_IRQHandler - 0x000008b2 SW_Handler - 0x000008b2 TIM1_BRK_IRQHandler - 0x000008b2 GPHA_IRQHandler - 0x000008b2 OPA_IRQHandler - 0x000008b2 DMA2_Channel10_IRQHandler - 0x000008b2 EXTI1_IRQHandler - 0x000008b2 SPI0_IRQHandler - 0x000008b2 USB2_HOST_IRQHandler - 0x000008b2 LPTIM2_WKUP_IRQHandler - 0x000008b2 RTCAlarm_IRQHandler - 0x000008b2 TIM11_IRQHandler - 0x000008b2 TIM10_UP_IRQHandler - 0x000008b2 TIM9_TRG_COM_IRQHandler - 0x000008b2 UART7_IRQHandler - 0x000008b2 USART2_IRQHandler - 0x000008b2 UART6_IRQHandler - 0x000008b2 UHSIF_IRQHandler - 0x000008b2 ETHWakeUp_IRQHandler - 0x000008b2 I2C2_ER_IRQHandler - 0x000008b2 DMA1_Channel2_IRQHandler - 0x000008b2 TIM8_BRK_IRQHandler - 0x000008b2 TIM2_TRG_IRQHandler - 0x000008b2 CAN1_SCE_IRQHandler - 0x000008b2 FLASH_IRQHandler - 0x000008b2 USBFSWakeUp_IRQHandler - 0x000008b2 USART1_IRQHandler - 0x000008b2 OTG_FS_IRQHandler - 0x000008b2 SPI3_IRQHandler - 0x000008b2 USBFS_WakeUp_IRQHandler - 0x000008b2 UART3_IRQHandler - 0x000008b2 I2C1_ER_IRQHandler - 0x000008b2 FMC_IRQHandler - 0x000008b2 USB2_DEVICE_IRQHandler - 0x000008b2 LPTIM1_IRQHandler - 0x000008b2 DFSDM1_IRQHandler - 0x000008b2 TMR1_IRQHandler - 0x000008b2 I2C4_ER_IRQHandler - 0x000008b2 SERDES_IRQHandler - 0x000008b2 USBSS_LINK_IRQHandler - 0x000008b2 USBWakeUp_IRQHandler - 0x000008b2 DMA2_Channel3_IRQHandler - 0x000008fe NMI_Handler - 0x000008fe NMI_RCC_CSS_IRQHandler - .text.strlen 0x0000090c 0x12 /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x0000090c strlen + 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 - 0x0000091e 0x1c2 /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.printf 0x00000ae0 0x24 /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x00000ae0 printf + 0x000009d0 0x1c2 /tmp/cczcSDec.ltrans0.ltrans.o + .text.printf 0x00000b92 0x24 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000b92 printf .text.ssd1306_i2c_error.isra.0 - 0x00000b04 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000bb6 0x20 /tmp/cczcSDec.ltrans0.ltrans.o .text.ssd1306_i2c_send.constprop.0 - 0x00000b24 0x122 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000bd6 0x122 /tmp/cczcSDec.ltrans0.ltrans.o .text.ssd1306_cmd - 0x00000c46 0x1c /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000cf8 0x1c /tmp/cczcSDec.ltrans0.ltrans.o .text.mini_vsnprintf - 0x00000c62 0x38 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000d14 0x38 /tmp/cczcSDec.ltrans0.ltrans.o .text.snprintf - 0x00000c9a 0x16 /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x00000c9a snprintf - .text.memset 0x00000cb0 0x12 /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x00000cb0 memset + 0x00000d4c 0x16 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000d4c snprintf + .text.memset 0x00000d62 0x12 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000d62 memset .text.ssd1306_setbuf.constprop.0 - 0x00000cc2 0xc /tmp/ccuFqAhq.ltrans0.ltrans.o - .text.memcpy 0x00000cce 0x1c /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x00000cce memcpy + 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 .text.ssd1306_refresh - 0x00000cea 0x5c /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000db0 0x5c /tmp/cczcSDec.ltrans0.ltrans.o .text.SystemInit - 0x00000d46 0x54 /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x00000d46 SystemInit + 0x00000e0c 0x54 /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000e0c SystemInit .text.startup.main - 0x00000d9a 0x8ea /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x00000d9a main + 0x00000e60 0xaaa /tmp/cczcSDec.ltrans0.ltrans.o + 0x00000e60 main *(.rodata) *(.rodata*) - *fill* 0x00001684 0x0 + *fill* 0x0000190a 0x2 .rodata.ssd1306_i2c_error.isra.0.str1.4 - 0x00001684 0x12e /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x0000190c 0x198 /tmp/cczcSDec.ltrans0.ltrans.o 0x2d (size before relaxing) .rodata.main.str1.4 - 0x000017b2 0x89 /tmp/ccuFqAhq.ltrans0.ltrans.o - *fill* 0x000017b2 0x2 - .rodata.main 0x000017b4 0x18 /tmp/ccuFqAhq.ltrans0.ltrans.o + 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 - 0x000017cc 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001ae0 0x20 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.icon_heal - 0x000017ec 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001b00 0x20 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.icon_clean - 0x0000180c 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001b20 0x20 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.icon_sleep - 0x0000182c 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001b40 0x20 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.icon_play - 0x0000184c 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001b60 0x20 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.icon_feed - 0x0000186c 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001b80 0x20 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.pana_dead - 0x0000188c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001ba0 0x80 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.pana_sleep - 0x0000190c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001c20 0x80 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.pana_eat - 0x0000198c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001ca0 0x80 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.pana_sad - 0x00001a0c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001d20 0x80 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.pana_happy - 0x00001a8c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001da0 0x80 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.pana_blink - 0x00001b0c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001e20 0x80 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.str1.4 - 0x00001b8c 0x76 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001ea0 0x90 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.errstr - 0x00001b8c 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o - .rodata.fontdata - 0x00001ba0 0x800 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001ea0 0x14 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.ssd1306_init_array - 0x000023a0 0x1a /tmp/ccuFqAhq.ltrans0.ltrans.o - *fill* 0x000023ba 0x2 + 0x00001eb4 0x1a /tmp/cczcSDec.ltrans0.ltrans.o + *fill* 0x00001ece 0x2 .rodata.pana_idle - 0x000023bc 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001ed0 0x80 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.menu_icons - 0x0000243c 0x18 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001f50 0x1c /tmp/cczcSDec.ltrans0.ltrans.o .rodata.pana_frames - 0x00002454 0x1c /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001f6c 0x1c /tmp/cczcSDec.ltrans0.ltrans.o .rodata.menu_labels - 0x00002470 0x18 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001f88 0x1c /tmp/cczcSDec.ltrans0.ltrans.o + .rodata.screen_timeout_names + 0x00001fa4 0x10 /tmp/cczcSDec.ltrans0.ltrans.o .rodata.spr_grave - 0x00002488 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00001fb4 0x80 /tmp/cczcSDec.ltrans0.ltrans.o + .rodata.fontdata + 0x00002034 0x800 /tmp/cczcSDec.ltrans0.ltrans.o *(.gnu.linkonce.t.*) - 0x00002508 . = ALIGN (0x4) + 0x00002834 . = ALIGN (0x4) -.fini 0x00002508 0x0 +.rela.dyn 0x00002834 0x0 + .rela.text.handle_reset + 0x00002834 0x0 /tmp/cczcSDec.ltrans0.ltrans.o + +.fini 0x00002834 0x0 *(SORT_NONE(.fini)) - 0x00002508 . = ALIGN (0x4) + 0x00002834 . = ALIGN (0x4) [!provide] PROVIDE (_etext = .) [!provide] PROVIDE (_eitcm = .) -.preinit_array 0x00002508 0x0 +.preinit_array 0x00002834 0x0 [!provide] PROVIDE (__preinit_array_start = .) *(.preinit_array) [!provide] PROVIDE (__preinit_array_end = .) -.init_array 0x00002508 0x0 - 0x00002508 PROVIDE (__init_array_start = .) +.init_array 0x00002834 0x0 + 0x00002834 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) - 0x00002508 PROVIDE (__init_array_end = .) + 0x00002834 PROVIDE (__init_array_end = .) -.fini_array 0x00002508 0x0 +.fini_array 0x00002834 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) @@ -451,15 +460,15 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a *(SORT_BY_NAME(.dtors.*)) *(.dtors) -.dalign 0x20000000 0x0 load address 0x00002508 +.dalign 0x20000000 0x0 load address 0x00002834 0x20000000 . = ALIGN (0x4) 0x20000000 PROVIDE (_data_vma = .) -.dlalign 0x00002508 0x0 - 0x00002508 . = ALIGN (0x4) - 0x00002508 PROVIDE (_data_lma = .) +.dlalign 0x00002834 0x0 + 0x00002834 . = ALIGN (0x4) + 0x00002834 PROVIDE (_data_lma = .) -.data 0x20000000 0x8 load address 0x00002508 +.data 0x20000000 0x18 load address 0x00002834 0x20000000 . = ALIGN (0x4) 0x200003fc __global_pointer$ = (. + 0x3fc) *(.gnu.linkonce.r.*) @@ -467,47 +476,59 @@ LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a *(.gnu.linkonce.d.*) 0x20000000 . = ALIGN (0x8) *(.sdata .sdata.*) + .sdata.timeout_idx + 0x20000000 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + .sdata.disp_on + 0x20000001 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + .sdata.sound_on + 0x20000002 0x1 /tmp/cczcSDec.ltrans0.ltrans.o *(.sdata2*) *(.gnu.linkonce.s.*) - 0x20000000 . = ALIGN (0x8) + 0x20000008 . = ALIGN (0x8) + *fill* 0x20000003 0x5 *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*) .srodata.spr_poop - 0x20000000 0x8 /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x20000008 . = ALIGN (0x4) - 0x20000008 PROVIDE (_edata = .) + 0x20000008 0x8 /tmp/cczcSDec.ltrans0.ltrans.o + .srodata.screen_timeout_opts + 0x20000010 0x8 /tmp/cczcSDec.ltrans0.ltrans.o + 0x20000018 . = ALIGN (0x4) + 0x20000018 PROVIDE (_edata = .) -.rela.dyn 0x20000008 0x0 load address 0x00002510 - .rela.text.handle_reset - 0x20000008 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o - -.bss 0x20000008 0x41c load address 0x00002510 - 0x20000008 . = ALIGN (0x4) - 0x20000008 PROVIDE (_sbss = .) +.bss 0x20000018 0x428 load address 0x0000284c + 0x20000018 . = ALIGN (0x4) + 0x20000018 PROVIDE (_sbss = .) *(.sbss*) .sbss.anim_exp - 0x20000008 0x1 /tmp/ccuFqAhq.ltrans0.ltrans.o - *fill* 0x20000009 0x3 - .sbss.frame 0x2000000c 0x4 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x20000018 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + *fill* 0x20000019 0x3 + .sbss.frame 0x2000001c 0x4 /tmp/cczcSDec.ltrans0.ltrans.o .sbss.tick_acc - 0x20000010 0x2 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x20000020 0x2 /tmp/cczcSDec.ltrans0.ltrans.o .sbss.anim_timer - 0x20000012 0x1 /tmp/ccuFqAhq.ltrans0.ltrans.o - .sbss.cursor 0x20000013 0x1 /tmp/ccuFqAhq.ltrans0.ltrans.o - .sbss.screen 0x20000014 0x1 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x20000022 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + .sbss.set_sel 0x20000023 0x1 /tmp/cczcSDec.ltrans0.ltrans.o + .sbss.idle_frames + 0x20000024 0x4 /tmp/cczcSDec.ltrans0.ltrans.o + .sbss.crit_flag + 0x20000028 0x4 /tmp/cczcSDec.ltrans0.ltrans.o + .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 *(.gnu.linkonce.sb.*) *(.bss*) - *fill* 0x20000015 0x3 - .bss.pet 0x20000018 0xc /tmp/ccuFqAhq.ltrans0.ltrans.o + *fill* 0x20000032 0x2 + .bss.pet 0x20000034 0xc /tmp/cczcSDec.ltrans0.ltrans.o .bss.ssd1306_buffer - 0x20000024 0x400 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x20000040 0x400 /tmp/cczcSDec.ltrans0.ltrans.o *(.gnu.linkonce.b.*) *(COMMON*) - 0x20000424 . = ALIGN (0x4) - 0x20000424 PROVIDE (_ebss = .) + 0x20000440 . = ALIGN (0x4) + 0x20000440 PROVIDE (_ebss = .) [!provide] PROVIDE (_end = _ebss) [!provide] PROVIDE (end = .) 0x20000800 PROVIDE (_eusrstack = (ORIGIN (RAM) + LENGTH (RAM))) @@ -523,64 +544,64 @@ OUTPUT(tama.elf elf32-littleriscv) .riscv.attributes 0x00000000 0x25 .riscv.attributes - 0x00000000 0x25 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x25 /tmp/cczcSDec.ltrans0.ltrans.o .riscv.attributes 0x00000025 0x1f ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) -.debug_info 0x00000000 0x49c5 - .debug_info 0x00000000 0x25b8 /tmp/ccuFqAhq.ltrans0.ltrans.o - .debug_info 0x000025b8 0x1159 /tmp/cc6O5Yfp.debug.temp.o - 0x000025b8 ch32fun.c.3da016ab - .debug_info 0x00003711 0x1257 /tmp/ccQWTvKu.debug.temp.o - 0x00003711 tama.c.f19bf6d4 - .debug_info 0x00004968 0x5d ../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_abbrev 0x00000000 0x7c5 - .debug_abbrev 0x00000000 0x20c /tmp/ccuFqAhq.ltrans0.ltrans.o - .debug_abbrev 0x0000020c 0x278 /tmp/cc6O5Yfp.debug.temp.o - .debug_abbrev 0x00000484 0x319 /tmp/ccQWTvKu.debug.temp.o - .debug_abbrev 0x0000079d 0x28 ../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_loclists - 0x00000000 0x20c5 + 0x00000000 0x232b .debug_loclists - 0x00000000 0x20c5 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x232b /tmp/cczcSDec.ltrans0.ltrans.o -.debug_aranges 0x00000000 0x200 +.debug_aranges 0x00000000 0x208 .debug_aranges - 0x00000000 0x1e0 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x1e8 /tmp/cczcSDec.ltrans0.ltrans.o .debug_aranges - 0x000001e0 0x20 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) + 0x000001e8 0x20 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) .debug_rnglists - 0x00000000 0x4a6 + 0x00000000 0x4e8 .debug_rnglists - 0x00000000 0x4a6 /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x4e8 /tmp/cczcSDec.ltrans0.ltrans.o -.debug_line 0x00000000 0x4835 - .debug_line 0x00000000 0x45f0 /tmp/ccuFqAhq.ltrans0.ltrans.o - .debug_line 0x000045f0 0x76 /tmp/cc6O5Yfp.debug.temp.o - .debug_line 0x00004666 0x7c /tmp/ccQWTvKu.debug.temp.o - .debug_line 0x000046e2 0x153 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.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_str 0x00000000 0xf6f - .debug_str 0x00000000 0xf6f /tmp/ccuFqAhq.ltrans0.ltrans.o - 0x1c2 (size before relaxing) - .debug_str 0x00000f6f 0x751 /tmp/cc6O5Yfp.debug.temp.o - .debug_str 0x00000f6f 0x994 /tmp/ccQWTvKu.debug.temp.o - .debug_str 0x00000f6f 0xd9 ../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_line_str 0x00000000 0x33f .debug_line_str - 0x00000000 0x33f /tmp/ccuFqAhq.ltrans0.ltrans.o + 0x00000000 0x33f /tmp/cczcSDec.ltrans0.ltrans.o 0x157 (size before relaxing) .debug_line_str - 0x0000033f 0x246 /tmp/cc6O5Yfp.debug.temp.o + 0x0000033f 0x246 /tmp/ccb2Xekb.debug.temp.o .debug_line_str - 0x0000033f 0x1e5 /tmp/ccQWTvKu.debug.temp.o + 0x0000033f 0x1e5 /tmp/ccR20L1X.debug.temp.o .debug_line_str 0x0000033f 0x92 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o) -.debug_frame 0x00000000 0x5b0 - .debug_frame 0x00000000 0x5b0 /tmp/ccuFqAhq.ltrans0.ltrans.o +.debug_frame 0x00000000 0x5dc + .debug_frame 0x00000000 0x5dc /tmp/cczcSDec.ltrans0.ltrans.o