diff --git a/__pycache__/sprites_gen.cpython-313.pyc b/__pycache__/sprites_gen.cpython-313.pyc index dc2c972..7a67a70 100644 Binary files a/__pycache__/sprites_gen.cpython-313.pyc and b/__pycache__/sprites_gen.cpython-313.pyc differ diff --git a/sprites.h b/sprites.h index 9a92810..d97efae 100644 --- a/sprites.h +++ b/sprites.h @@ -432,12 +432,32 @@ static const unsigned char icon_stats[] = { 0x00, 0x00, }; -#define ICON_COUNT 6 +// icon_settings: 16x16 +static const unsigned char icon_settings[] = { + 0x03, 0xc0, + 0x03, 0xc0, + 0x03, 0xc0, + 0x07, 0xf0, + 0x0f, 0xf8, + 0x1f, 0xfc, + 0xff, 0x7f, + 0xfe, 0x3f, + 0xfc, 0x1f, + 0xfe, 0x3f, + 0x1f, 0x7c, + 0x1f, 0xfc, + 0x0f, 0xf8, + 0x07, 0xf0, + 0x03, 0xc0, + 0x03, 0xc0, +}; + +#define ICON_COUNT 7 static const unsigned char *const menu_icons[ICON_COUNT] = { - icon_feed, icon_play, icon_sleep, icon_clean, icon_heal, icon_stats, + icon_feed, icon_play, icon_sleep, icon_clean, icon_heal, icon_stats, icon_settings, }; static const char *const menu_labels[ICON_COUNT] = { - "FEED", "PLAY", "SLEEP", "CLEAN", "HEAL", "STATS", + "FEED", "PLAY", "SLEEP", "CLEAN", "HEAL", "STATS", "SETTINGS", }; #endif // _SPRITES_H diff --git a/sprites_gen.py b/sprites_gen.py index f0a896f..343d84b 100644 --- a/sprites_gen.py +++ b/sprites_gen.py @@ -253,6 +253,17 @@ def icon_stats(): # bar chart hline(g, x, x + 1, yy) return g +def icon_settings(): # gear + g = grid(16, 16) + fill_ellipse(g, 8, 8, 6, 6) + # four teeth + for x in range(6, 10): + vline(g, x, 0, 2); vline(g, x, 13, 15) + for y in range(6, 10): + hline(g, 0, 2, y); hline(g, 13, 15, y) + fill_ellipse(g, 8, 8, 2, 2, 0) # hub hole + return g + # ---------------------------------------------------------------- main def main(): print("// Auto-generated by sprites_gen.py -- do not edit by hand.") @@ -294,16 +305,17 @@ def main(): ("icon_clean", icon_clean()), ("icon_heal", icon_heal()), ("icon_stats", icon_stats()), + ("icon_settings", icon_settings()), ] for n, g in icons: emit(n, g) - print("#define ICON_COUNT 6") + print("#define ICON_COUNT 7") print("static const unsigned char *const menu_icons[ICON_COUNT] = {") - print(" icon_feed, icon_play, icon_sleep, icon_clean, icon_heal, icon_stats,") + print(" icon_feed, icon_play, icon_sleep, icon_clean, icon_heal, icon_stats, icon_settings,") print("};") print('static const char *const menu_labels[ICON_COUNT] = {') - print(' "FEED", "PLAY", "SLEEP", "CLEAN", "HEAL", "STATS",') + print(' "FEED", "PLAY", "SLEEP", "CLEAN", "HEAL", "STATS", "SETTINGS",') print("};") print() print("#endif // _SPRITES_H") diff --git a/tama.bin b/tama.bin index ce467ea..5ef59db 100755 Binary files a/tama.bin and b/tama.bin differ 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 8e32faa..263b74a 100755 Binary files a/tama.elf and b/tama.elf differ diff --git a/tama.hex b/tama.hex index c826178..db9fddf 100644 --- a/tama.hex +++ b/tama.hex @@ -1,13 +1,13 @@ -:100000006F00100400000000FE080000B2080000AD +:100000006F00B00E00000000B00900005C090000A5 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 -:10003000B208000000000000B2080000000000004C -:10004000B2080000B2080000B2080000B2080000C8 -:10005000B2080000B2080000B2080000B2080000B8 -:10006000B2080000B2080000B2080000B2080000A8 -:10007000B2080000B2080000B2080000B208000098 -:10008000B2080000B2080000B2080000B208000088 -:10009000B2080000B2080000B20800000000000032 +:100030005C090000000000005C09000000000000F6 +:100040005C0900005C0900005C0900005C0900001C +:100050005C0900005C0900005C0900005C0900000C +:100060005C0900005C0900005C0900005C090000FC +:100070005C0900005C0900005C0900005C090000EC +:100080005C0900005C0900005C0900005C090000DC +:100090005C0900005C0900005C0900000000000031 :1000A000634E050263C305042E86AA857D5515C2DD :1000B00085466378B6006356C00006068606E36C84 :1000C000B6FE014563E4C500918D558D858205829C @@ -54,542 +54,594 @@ :100350000740136717002390E74003D70740136750 :1003600007402390E74082809307F00763E7A702E6 :100370009307F00363E3B70293D735009E07AA976C -:10038000138581C23E959D89054783470500B315B6 +:10038000138541C43E959D89054783470500B315F4 :10039000B70009C6CD8F2300F500828093C5F5FF15 -:1003A000ED8FD5BF311122C62E84AA8537A507004F -:1003B0001305051206C826C4C53993175400818F4A -:1003C0008A07A29713141500AA84A28513953700F3 -:1003D000E1392694931714002A873EC00144024550 -:1003E000B71401403AC291469384044094C8913DA9 -:1003F0000245B706040094C8A93512470504E31066 -:1004000087FEC2403244A24451018280611122C061 -:100410003714014006C213040480894737C502001F -:100420001CC8130505F2313DB707020092401CC8F5 -:1004300002442101828037575A641307070523AE0F -:10044000E1C09387C1C1130740062382E700054737 -:1004500023930700239407002385E700238C01C022 -:10046000A38B01C08280B71701408847938707405C -:1004700098479C471345F5FF19831347F7FF95836A -:1004800093C7F7FF058B05892207858B7111C2077A -:10049000598D5D8D11018280011122CC26CA06CEB4 -:1004A0002A842E83B28483C204008504638D0204EF -:1004B0000147939732008966938606BABA97B69732 -:1004C00083C60700814713D67600B305E3003305E2 -:1004D000F40016C836C63AC41AC23EC07135B246D8 -:1004E000824721468606850712432247C24293F679 -:1004F000F60FE39AC7FC0507E31DF7FA329493075A -:100500008007E3D287FAF2406244D24405618280D8 -:100510002E860147B307E60083C7070099EBC14762 -:10052000998F8A0713C7F7FF7D87AA8533F5E70000 -:10053000A5B70507C5B71307F0076362A7049307BC -:10054000F00363EEB70241119307F6FF22C406C61B -:1005500026C2AA972A846375F70013060008098E3D -:10056000B304C400228505462EC00504F53B824530 -:10057000E39A84FEB2402244924441018280828008 -:100580009307F00763CFA702411122C406C626C213 -:10059000B387C500130700042E846354F7003306A5 -:1005A000B740B304860063179400B24022449244DB -:1005B00041018280A28505462AC07D33024505049B -:1005C000DDB78280311126C4B284368606C822C6C1 -:1005D00036C22A842EC06D37124682451385F4FF39 -:1005E0002295793F824526862285B137824722852A -:1005F00032449385F7FF9247C2402686A244BE95B7 -:10060000510115BF211122C826C62A84B2842E8624 -:10061000AA85014506CA4935130500039D46130600 -:10062000C004A28545371395340026950A05269502 -:1006300006059307300663DFA702930714009305AE -:1006400040063EC0B13C82472A871904930617032F -:10065000930410032685BE85054636C43AC23EC0C3 -:100660002133A246850482471247E395D4FE8507CD -:10067000E39E87FCD2404244B24461018280130170 -:1006800081FDB387E50022D226D02AC832CA13D40E -:1006900036003EC6814393F775000547B317F70050 -:1006A0003EC0D24781469E973ECC93D735009E07E9 -:1006B0003ECEE247939236000147B69783C70700C4 -:1006C0003EC2C247BE92F247B3845700B387E200EE -:1006D0001306F0076364F604124593070008B3D7C6 -:1006E000E740E98F3386E400138581C232950343E6 -:1006F00001003EC4834705001346F3FF05077D8EC6 -:10070000A247B337F000B307F0403373F30033660A -:1007100066002300C500A147E31AF7FA8506E31A2D -:10072000D4F8B2478505A2936386B7009307000407 -:10073000E393F5F612548254130181028280B707C5 -:1007400000E083A7470F8280B70700E09387470F39 -:100750009843211106CA22C826C61377070C9306B0 -:10076000000C630BD70002C42E84DDED9C4389C7C7 -:1007700093F7070891E3E1370144D24022854244D0 -:10078000B24461018280B30794401D476353F70070 -:10079000BA87B7061000370700E085061307470F32 -:1007A000104393750608A5E111C62AC23EC0413F19 -:1007B0001245824734000D47B685634DF704A246C3 -:1007C000370700E00D46232CD70EB30695000147EE -:1007D00083C2060005073383E500230053006385C9 -:1007E000E7008506E316C7FE13874700136707F87F -:1007F0002304E100A246370700E0BE94232AD70E67 -:10080000E3C384F89DBFFD16C1FE1C4393E7070CAC -:100810001CC39DB73386E4002A96034606000507ED -:100820008506A38FC6FE51BF8144D9BF611122C086 -:1008300006C22E84113F924022850244210182800B -:10084000970100209381C1BB1381414009651305C5 -:1008500005887310053097F6FFFF9386A67A93E616 -:100860003600739056301385C1C0938581020146CE -:100870006356B50010C11105E34EB5FE1725000003 -:100880001305C5C8938541C01386C1C06388C500E0 -:10089000144194C111059105E39AC5FEB7F700E034 -:1008A000054798C385679387A7D97390173473005A -:1008B0002030732510340D3A7325003035327325FE -:1008C00030341D32732520340532B70700E093879A -:1008D000470F9843137707086DFF0567130757A85D -:1008E00098C3B70700E09387470F9843137707082B -:1008F0006DFF37B7AAAA130737A898C301A0371707 -:1009000002401C47B7068000D58F1CC7AA8703C7C3 -:10091000070001E73385A74082808507CDBF13011B -:1009200041FAA2CAA6C886CC2AC02EC23284B68496 -:1009300009E59307801A02C23EC002CA8347040039 -:1009400013071400A30FF10081EBE6405644524513 -:10095000C6441301C10582803AC6930650026380E3 -:10096000D7021246824785451305F1018297324727 -:1009700026C43A84D247A244AA973ECAC1B7834745 -:1009800014009306000313072400A30FF1003EC6D2 -:100990006393D7083A8481460147A54519A8931760 -:1009A0002700BA97860705043307F6008347F4FF4C -:1009B0008546138607FD1375F60FE3F2A5FE99C26F -:1009C000A30FF1003AC8E14663D3E60036C8130628 -:1009D000C00681466398C700834704008546050426 -:1009E000A30FF1000346F101930740066305F606E5 -:1009F00063E7C702930780056302F60A9307300690 -:100A00006300F60C39D21246824785451305F10181 -:100A1000829726C485B79306000236C6A5BF930702 -:100A20005007630AF602930780076309F6069307E7 -:100A30003007E31AF6FC9387440084403ACC3EC466 -:100A40002685E9356247AA856359E008C2463246E1 -:100A50003818268525A0938744003EC485CA13060E -:100A6000B6F818109336160088400146A945EFF0F5 -:100A70006FFEC24632463818AA850810EFF02FEAFA -:100A80001246AA85281882478297EDB5930750072A -:100A900018108546E30AF6FC8146F9B7884013062C -:100AA00086FA938744001810854613361600C14510 -:100AB0003EC4EFF02FFAC2463246AA85381875BFF9 -:100AC000938744003EC49C40C2463246A30FF100C7 -:100AD000381885451305F10155B71246268565B7C7 -:100AE000111132C62A8605652EC436C881453400E8 -:100AF0001305C58206C23ACA3ECC36C00D359240B7 -:100B00007101828089670A059387C7B8AA978C43C9 -:100B1000056571111305456806C0D937824011017A -:100B20006FF04FFF71116167B757004006C01307A0 -:100B3000076A938707407D5683D68701898AE1C675 -:100B40007D17E31BC7FE014521A8E1679387176A5C -:100B50008356470193F6060899E6FD17F5FB0D4508 -:100B60005537054589A88347050005052318F70073 -:100B7000E39DA5FCE16637570040370607009386E2 -:100B8000066A1307074013064608FD55035547013B -:100B900083578701C207C98FF18F6387C700FD168E -:100BA000E396B6FE11456DBF83570700014593E7F5 -:100BB00007202310F7008240110182803757004040 -:100BC000AA95130707406DB7930780072318F7000E -:100BD0006166B7560040370707001306066A93861A -:100BE0000640130727087D5383D2460183D7860129 -:100BF000C207B3E75700F98FE382E7FC7D16E315E0 -:100C000066FE0945B1BF03D70700E166370603005A -:100C1000136707102390E700375700409386066A52 -:100C20001307074005067D53835247018357870109 -:100C3000C207B3E75700F18FE388C7F8FD16E395C5 -:100C400066FE054531BF130181FDA300A100894562 -:100C50000A8506D223000100F1359250130181026A -:100C60008280311106C822C62AC02AC22EC49DC164 -:100C7000B337A000B307F0402A84B375F100130521 -:100C8000801A713901C4124582471D8DC240324419 -:100C90005101828001448145DDB7311136C43400F1 -:100CA00006C23AC63EC836C06D3F924051018280AE -:100CB0002A96AA876393C70082802380B70085079E -:100CC000D5BF130600408145138581C2D5B7814742 -:100CD0006313F60082803387F500834607003307ED -:100CE000F50085072300D700E5B7797113051002D9 -:100CF00006D622D426D2813F0145B1371305F0072D -:100D000099371305200281370145353F1D4513846E -:100D100081C2153F9304044093070004A285130683 -:100D20000002130511002300F1005537930510024E -:100D30000A8513040402FD33E31094FEB2502254DA -:100D4000925445618280B7270240054798C3B71780 -:100D500002403707080123A207001307170898C3AA -:100D600037079F0098C7984393166700E3DD06FE98 -:100D7000D843B7160240719B13672700D8C3214799 -:100D8000DC42B18BE39EE7FEB70700E023AC070E21 -:100D90001307000823AAE70E8280397106DE22DCE1 -:100DA00026DA5537B71402409C4C37140140FD76C3 -:100DB00093E757039CCC9307048098439386F60FE0 -:100DC000370600F11377F7F01367070198C3370769 -:100DD000020098CB9307044098437D1637050B001B -:100DE000758F1367071098C33707040098CB184016 -:100DF000130505C8419B1367870018C09843718F7E -:100E000037060008518F98C39843370610FF7D16A8 -:100E1000718F37068000518F98C3054718C8130794 -:100E2000000498CB1307000298CBEFF08FC1DC4C85 -:100E300037072000D98FDCCC9C4C7D779306F70FC9 -:100E400093E717019CCC1C400567130707D093F765 -:100E5000F7F01CC01C4093E7070D1CC01C40F58F29 -:100E60001CC01C40D98F1CC00964EFF0AFCA13042A -:100E7000043A813D034504009307F00F6314F50025 -:100E8000AD3521A00504C13375D5EFF0CFDA153D9E -:100E900085659385856B1145EFF08FE71307000299 -:100EA0000966BA861306C63BC14513050003EFF079 -:100EB0000FFD85659385456C13054003EFF04FE505 -:100EC0002D359305000513053029EFF0AFCD9305BF -:100ED000000513050031EFF0EFCC930580071305F3 -:100EE000C03DEFF02FCC1304800CEFF0CFD7135799 -:100EF000850093570501A300E102498F2301F10208 -:100F0000D98F2300A10293F7F70F81EB75651305C5 -:100F1000054C7D14EFF0EFB269F8014781440144BC -:100F20003AC0EFF04FD4935705011377F50F3AC24B -:100F3000230FF10093F7F70F935685003EC69247B3 -:100F400013F7F60FA30ED1003AC4230EA1000247F7 -:100F5000814699C3933614002246814719C293B73C -:100F60001400B245014699C11336170083C581C1EB -:100F70009384C1C12EC0024585456301B5408945B2 -:100F80006304B54A631D051C95C303C571C199452A -:100F900032CA150536C8EFF02F96A38BA1C0E545E0 -:100FA00013057041EFF00FC05246C24605C203C59B -:100FB00071C1994536C80505EFF00F94A38BA1C008 -:100FC000E54513057041EFF0EFBDC246ADC683C7DE -:100FD00071C1954663E1F60685668A079386467B6E -:100FE000B6979C4382878387040013074006F9075E -:100FF000635AF71ABA872380F400838734001307F3 -:101000004006ED176355F71ABA87A381F40011471C -:101010002386E1C09305C003314713050037238BB6 -:10102000E1C0EFF02FB89305000513057049EFF00C -:101030006FB7EFF0AFBD713183C771C101453EC8D5 -:1010400042478967938707470A07BA978C43EFF0AF -:101050002FCC83C7A4003ECA8DC303874400F54745 -:1010600063CDE70083A701C1A18B81CB0566130681 -:10107000466D81450145EFF02FC2014422850546AA -:10108000A945EFF06FAE050493070008E318F4FEDE -:1010900003C494006307042405661306866DB945EE -:1010A0001305E004EFF04FBF05661306C66DB145AA -:1010B00013054005EFF04FBE13030003C142524732 -:1010C000994719C783C761C16386072483C7C1C015 -:1010D0000967130747458A07BA9790431307000229 -:1010E000BA8696851A85EFF08FD901442285054688 -:1010F0009305E002EFF04FA7050493070008E317FC -:10110000F4FE83C7840002476366F7240144931703 -:101110002400338787000A07330387000967130712 -:10112000C743BA9790434147BA86130533009305E6 -:1011300000031AC0EFF0AFD442479377F40F024395 -:10114000631AF700C9464D469305E00213051300E4 -:10115000EFF04FC705049947E31BF4FA793683C7CC -:1011600061C181C7FD17238BF1C083C7A40081CF64 -:1011700083D741C1930610038507C207C18363E784 -:10118000F630239AF1C083A701C137850500130506 -:1011900005E4850723A8F1C0EFF0AF8A3247A244E7 -:1011A0001244BDBB13C7F7FF7D87F98FA9B513C7DD -:1011B000F7FF7D87F98F91BD03872400B94763C985 -:1011C000E700930580071305C00DEFF0AF9DA5B5AF -:1011D0008387140093064006E50763D5F604B687B7 -:1011E000A380F400930747FF130740066353F700FB -:1011F000BA872381F40009472386E1C09305C00321 -:1012000031471305C03D238BE1C0EFF0AF99930543 -:10121000C00313057052EFF0EF989305A005130576 -:10122000006231B593C6F7FFFD86F58F55BF03C544 -:10123000940093058007933715003335A0003305DC -:10124000A0401375C50DA384F4001305851BB5BF1D -:101250009386C1C1838714001307400623840400CA -:10126000A381E40095076350F702BA879305200332 -:1012700013057052A380F600EFF0CF929305200380 -:101280001305704199B713C7F7FF7D87F98FF9BF31 -:101290008387440013074006938737026356F7029B -:1012A000BA879305C003130500312382F400EFF0E1 -:1012B0006F8F9305C00313057041EFF0AF8E930558 -:1012C000A00513057052A5B313C7F7FF7D87F98FEB -:1012D000C9BF8547238CF1C09305800213053029CF -:1012E000EDB583A201C193050005168516CCEFE08C -:1012F0007FDE93077002E2421303E50163F6A70065 -:101300009307E0063383A74093F28200B332500084 -:10131000B90275B39547E31D04DA83864400754727 -:101320008D47E357D7DA838614006147E352D7DA53 -:10133000838604004D47E35DD7D803A501C193051B -:10134000200316CC1ACAEFE0FFD8E242524393378B -:101350004500BDBB82472147139517003E950A05FE -:10136000BA86138641C0930560023A95EFF02FB11B -:101370008247850793F7F70F3EC061B3D58FD18FB2 -:1013800081CBF94513050037238C01C0EFF08F8125 -:10139000EFF03F9385659385056E0145EFF04F971C -:1013A0000386040085659385056F2945EFF08FA5B9 -:1013B0000386140085659385856F4D45EFF08FA4F6 -:1013C000038624008565938505707145EFF08FA332 -:1013D0000386340085659385857013055002EFF010 -:1013E0006FA2038644008565938505711305E002AD -:1013F000EFF04FA183C7940083D6640095C30567BF -:101400001307476B056613068671C5450810EFF094 -:10141000DF881010930580030145EFF0EF873DBB97 -:1014200005671307076BF9BF99CEEFF0CF809305DF -:10143000000513053029EFE0FFF69305800713053B -:10144000C03DEFE03FF6EFF0DF87130700020966CB -:10145000BA8613068648A14513050003EFF02FA2B4 -:101460008565938545721305C002EFF06F8A83D6B8 -:10147000640005661306C672C5450810EFF0FF81CB -:101480000C1013054003EFF0AF88C9B903D3640013 -:1014900003C59400239A01C00503420313530301BB -:1014A0002393640003870400838724009305400688 -:1014B000630105149386A70063D3D512AE86E206B6 -:1014C000E1862381D4007D1713064006635EE61093 -:1014D0003287620761872380E40013069005635713 -:1014E000F600A3840400930640060145838534007A -:1014F000930740061386F5FF63DCC7143E86620639 -:101500006186A381C40015E103C58400894763EEA9 -:10151000A70093173300B387674003A301C19A97CD -:10152000BD8B81E705052384A40003C5840019C988 -:1015300083871400898F130540066350F512AA872C -:10154000A380F400D14763CCB700838714009305D0 -:101550004006FD1763D8F510AE87A380F40083C55D -:101560001400AE87E205E1856353B600B287139697 -:10157000870161866353C700BA8713978701618724 -:1015800063D3E600B687139787016187B9468387DF -:10159000440063CEE60CED1713074006635FF70CBB -:1015A000BA872382F40083874400E34EF0BC0947E6 -:1015B0009305800C1305A014238CE1C0238504003F -:1015C000EFE05FDE9305800C1305700FEFE09FDD09 -:1015D000930500191305500AEFE0DFDC6DB613C662 -:1015E000F6FF7D86F18EE1BD1346F7FF7D86718F94 -:1015F000CDB575170386140063DDE5022E876207FB -:1016000061872380E400F9179306400663D8F60249 -:10161000B68793968701E1862381D40079169307D4 -:10162000400663D2C7023E869387C1C1A380C7002C -:1016300075BD9346F7FFFD86758FD1B793C6F7FF4B -:10164000FD86F58FF9B79347F6FFFD877D8EE9BFDD -:101650009347F6FFFD877D8E5DB513C5F7FF7D854A -:10166000E98FF9BD93C5F7FFFD85ED8FFDB59306B5 -:101670002003E3DAE6F2890705B713C7F7FF7D8792 -:10168000F98F05B7737364313330365F6932635F46 -:101690006572726F72202D2074696D656F7574208C -:1016A00077616974696E6720666F722025730A0D11 -:1016B000000000005A7A7A0050414E41474F54438F -:1016C00048490000707265737320616E79206B6504 -:1016D00079000000210000007A0000005A0000009C -:1016E0002D2D20535441545553202D2D0000000022 -:1016F000464F4F440000000046554E2000000000B9 -:10170000454E475900000000574153480000000073 -:10171000484C544800000000416765202575202092 -:1017200025730000522E492E502E00006C697665FC -:1017300064202575206D696E000000006E6F7420B6 -:1017400062757379000000006D6173746572206DBD -:101750006F6465007472616E736D6974206D6F647F -:1017600065000000747820656D70747900000000D9 -:101770007472616E736D697420636F6D706C6574E3 -:10178000650000004645454400000000504C4159AA -:1017900000000000534C454550000000434C4541BB -:1017A0004E0000004845414C000000005354415495 -:1017B00053000000E60F0000B81100002E120000D8 -:1017C0005012000090120000D21200000000000031 -:1017D000000000C000C000C006C006C006D806D881 -:1017E00036D836D836D836D8000000000000008041 -:1017F00007F00FF81C3C3C3E300E300E700F300EE0 -:101800003C3E3C3E1FFC0FF807F00080000000004B -:101810000080008001C001C007F00DF80DF808F845 -:101820001DFC0DF80FF80FF807F000800000000015 -:10183000000004000C001C0018001C003C001C00F0 -:101840001E001F000FE807F00080000000000000ED -:10185000077000001F7C3F7E3F7E3F7E00003F7E82 -:101860003F7E3F7E1F7C00000770000000000000EC -:1018700000A001900FE01BF03BF831F83BF87BFC37 -:101880003FF83FF83FF81FF00FE0010000000000B4 -:1018900000000000010000800FE007F01FF00FF8CB -:1018A0001FF00FF81FF00FF83FF89FFC1FFFFFF825 -:1018B0001FFFFFF81FFFFFF80FFFFFF003FFFFE020 -:1018C00007FFFFF007FFFFF00FBBEEF80FD7F5F8AB -:1018D0000FEFFBF80FD7F5F81FBBEEFC0FFFFFF87B -:1018E0000FFFFFF80FFFFFF80FF007F807FFFFF0FB -:1018F00007FFFFF003FFFFE001FFFFC000FFFF80D5 -:10190000007FFF00001FFC000000800000000000BE -:1019100000000000010000800FE007F01FF00FF84A -:101920001FF00FF81FF00FF83FF89FFC1FFFFFF8A4 -:101930001FFFFFF81FFFFFF80FFFFFF003FFFFE09F -:1019400007FFFFF007FFFFF00FFFFFF80FFFFFF8A3 -:101950000FFFFFF80F01C0781FFFFFFC0FFFFFF81C -:101960000FFF7FF80FFC1FF80FFF7FF807FFFFF056 -:1019700007FFFFF003FFFFE001FFFFC000FFFF8054 -:10198000007FFF00001FFC0000008000000000003E -:1019900000000000010000800FE007F01FF00FF8CA -:1019A0001FF00FF81FF00FF83FF89FFC1FFFFFF824 -:1019B0001FFFFFF81FFFFFF80FFFFFF003FFFFE01F -:1019C00007EFFBF00783E0F00F93E4F80F11C47802 -:1019D0000F83E0F80F83E0F81FEFFBFC0FFF7FF8A9 -:1019E0000FFC1FF80FFC1FF80FF80FF807FC1FF093 -:1019F00007FC1FF003FF7FE001FFFFC000FFFF8037 -:101A0000007FFF00001FFC000000800000000000BD -:101A100000000000010000800FE007F01FF00FF849 -:101A20001FF00FF81FF00FF83FF89FFC1FFFFFF8A3 -:101A30001FFFFFF81FFFFFF80FFFFFF003FFFFE09E -:101A400007FFFFF007FFFFF00FEFFBF80F83E0F851 -:101A50000F93E4F80F11C4781F83E0FC0F8360F844 -:101A60000FEC1BF80FFF7FF80FFC1FF807F7F7F0DC -:101A700007FBEFF003FFFFE001FFFFC000FFFF8067 -:101A8000007FFF00001FFC0000008000000000003D -:101A900000000000010000800FE007F01FF00FF8C9 -:101AA0001FF00FF81FF00FF83FF89FFC1FFFFFF823 -:101AB0001FFFFFF81FFFFFF80FFFFFF003FFFFE01E -:101AC00007FFFFF007FFFFF00FFFFFF80FEFFBF836 -:101AD0000FD7F5F80FFFFFF81FFFFFFC0FFFFFF810 -:101AE0000FF80FF80FFBEFF80FF7F7F807FC1FF0F0 -:101AF00007FFFFF003FFFFE001FFFFC000FFFF80D3 -:101B0000007FFF00001FFC000000800000000000BC -:101B100000000000010000800FE007F01FF00FF848 -:101B20001FF00FF81FF00FF83FF89FFC1FFFFFF8A2 -:101B30001FFFFFF81FFFFFF80FFFFFF003FFFFE09D -:101B400007FFFFF007FFFFF00FFFFFF80FFFFFF8A1 -:101B50000F01C0780FFFFFF81FFFFFFC0FFF7FF89A -:101B60000FFC1FF80FFF7FF80FFFFFF807F80FF0CB -:101B700007FFFFF003FFFFE001FFFFC000FFFF8052 -:101B8000007FFF00001FFC00000080003C170000E9 -:101B90004817000054170000641700007017000079 -:101BA00000000000000000007E81A581BD99817EBB -:101BB0007EFFDBFFC3E7FF7E6CFEFEFE7C3810007D -:101BC00010387CFE7C381000387C38FEFED6103889 -:101BD00010387CFEFE7C10380000183C3C180000D9 -:101BE000FFFFE7C3C3E7FFFF003C664242663C00DD -:101BF000FFC399BDBD99C3FF0F070F7DCCCCCC7837 -:101C00003C6666663C187E183F333F303070F0E02B -:101C10007F637F636367E6C018DB3CE7E73CDB1864 -:101C200080E0F8FEF8E08000020E3EFE3E0E02006C -:101C3000183C7E18187E3C1866666666660066006C -:101C40007FDBDB7B1B1B1B003E613C66663C867CAE -:101C5000000000007E7E7E00183C7E187E3C18FF4F -:101C6000183C7E1818181800181818187E3C180010 -:101C700000180CFE0C180000003060FE6030000000 -:101C80000000C0C0C0FE0000002466FF6624000003 -:101C900000183C7EFFFF000000FFFF7E3C180000A4 -:101CA0000000000000000000183C3C18180018005C -:101CB00066662400000000006C6CFE6CFE6C6C001C -:101CC000183E603C067C180000C6CC183066C60082 -:101CD000386C3876DCCC7600181830000000000034 -:101CE0000C18303030180C0030180C0C0C18300068 -:101CF00000663CFF3C6600000018187E18180000C3 -:101D000000000000001818300000007E00000000F5 -:101D10000000000000181800060C183060C0800099 -:101D2000386CC6D6C66C38001838181818187E00DB -:101D30007CC6061C3066FE007CC6063C06C67C00DF -:101D40001C3C6CCCFE0C1E00FEC0C0FC06C67C0019 -:101D50003860C0FCC6C67C00FEC60C1830303000AF -:101D60007CC6C67CC6C67C007CC6C67E060C7800D7 -:101D70000018180000181800001818000018183073 -:101D8000060C1830180C060000007E00007E0000D3 -:101D90006030180C183060007CC60C181800180051 -:101DA0007CC6DEDEDEC07800386CC6FEC6C6C60065 -:101DB000FC66667C6666FC003C66C0C0C0663C0093 -:101DC000F86C6666666CF800FE6268786862FE0011 -:101DD000FE6268786860F0003C66C0C0CE663A007B -:101DE000C6C6C6FEC6C6C6003C18181818183C0061 -:101DF0001E0C0C0CCCCC7800E6666C786C66E600A9 -:101E0000F06060606266FE00C6EEFEFED6C6C600EA -:101E1000C6E6F6DECEC6C6007CC6C6C6C6C67C0012 -:101E2000FC66667C6060F0007CC6C6C6C6CE7C0ED2 -:101E3000FC66667C6C66E6003C6630180C663C000E -:101E40007E7E5A1818183C00C6C6C6C6C6C67C0098 -:101E5000C6C6C6C6C66C3800C6C6C6D6D6FE6C0098 -:101E6000C6C66C386CC6C6006666663C18183C0070 -:101E7000FEC68C183266FE003C30303030303C00FC -:101E8000C06030180C0602003C0C0C0C0C0C3C0022 -:101E900010386CC60000000000000000000000FFC9 -:101EA00030180C00000000000000780C7CCC76009C -:101EB000E0607C666666DC0000007CC6C0C67C0014 -:101EC0001C0C7CCCCCCC760000007CC6FEC07C0018 -:101ED0003C6660F86060F000000076CCCC7C0CF8CA -:101EE000E0606C766666E6001800381818183C004A -:101EF000060006060666663CE060666C786CE600E6 -:101F00003818181818183C000000ECFED6D6D60079 -:101F10000000DC666666660000007CC6C6C67C0003 -:101F20000000DC66667C60F0000076CCCC7C0C1E89 -:101F30000000DC766060F00000007EC07C06FC00E3 -:101F40003030FC3030361C000000CCCCCCCC7600DD -:101F50000000C6C6C66C38000000C6D6D6FE6C00AF -:101F60000000C66C386CC6000000C6C6C67E06FC03 -:101F700000007E4C18327E000E18187018180E00E3 -:101F800018181818181818007018180E181870005B -:101F900076DC0000000000000010386CC6C6FE00B1 -:101FA0007CC6C0C0C67C0C78CC00CCCCCCCC760037 -:101FB0000C187CC6FEC07C007C82780C7CCC760041 -:101FC000C600780C7CCC76003018780C7CCC76007F -:101FD0003030780C7CCC760000007EC0C07E0C389F -:101FE0007C827CC6FEC07C00C6007CC6FEC07C0035 -:101FF00030187CC6FEC07C006600381818183C00FB -:102000007C82381818183C003018003818183C002A -:10201000C6386CC6FEC6C600386C7CC6FEC6C60096 -:102020001830FEC0F8C0FE0000007E187ED87E008A -:102030003E6CCCFECCCCCE007C827CC6C6C67C007E -:10204000C6007CC6C6C67C0030187CC6C6C67C00EE -:10205000788400CCCCCC76006030CCCCCCCC760074 -:10206000C600C6C6C67E06FCC6386CC6C66C38003E -:10207000C600C6C6C6C67C0018187EC0C07E18182A -:10208000386C64F06066FC0066663C7E187E18184A -:10209000F8CCCCFAC6CFC6C70E1B183C18D87000B7 -:1020A0001830780C7CCC76000C18003818183C00DE -:1020B0000C187CC6C6C67C001830CCCCCCCC7600C4 -:1020C00076DC00DC6666660076DC00E6F6DECE00D6 -:1020D0003C6C6C3E007E0000386C6C38007C00006C -:1020E0001800181830633E00000000FEC0C0000059 -:1020F000000000FE0606000063E66C7E3366CC0F2F -:1021000063E66C7A366ADF06180018183C3C180043 -:10211000003366CC6633000000CC663366CC00002A -:10212000228822882288228855AA55AA55AA55AA0B -:1021300077DD77DD77DD77DD18181818181818188F -:1021400018181818F81818181818F818F81818186F -:1021500036363636F636363600000000FE3636366F -:102160000000F818F81818183636F606F63636361F -:1021700036363636363636360000FE06F636363613 -:102180003636F606FE00000036363636FE00000013 -:102190001818F818F800000000000000F8181818C7 -:1021A000181818181F00000018181818FF00000051 -:1021B00000000000FF181818181818181F18181811 -:1021C00000000000FF00000018181818FF18181869 -:1021D00018181F181F181818363636363736363680 -:1021E000363637303F00000000003F303736363695 -:1021F0003636F700FF0000000000FF00F7363636E5 -:1022000036363730373636360000FF00FF00000024 -:102210003636F700F73636361818FF00FF00000094 -:1022200036363636FF0000000000FF00FF18181891 -:1022300000000000FF363636363636363F000000E6 -:1022400018181F181F00000000001F181F1818186A -:10225000000000003F36363636363636FF36363624 -:102260001818FF18FF18181818181818F800000088 -:10227000000000001F181818FFFFFFFFFFFFFFFFFF -:1022800000000000FFFFFFFFF0F0F0F0F0F0F0F0D2 -:102290000F0F0F0F0F0F0F0FFFFFFFFF00000000CA -:1022A000000076DCC8DC760078CCCCD8CCC6CC007C -:1022B000FEC6C0C0C0C0C0000000FE6C6C6C6C00EC -:1022C000FEC6603060C6FE0000007ED8D8D8700020 -:1022D0000000666666667CC00076DC181818180078 -:1022E0007E183C66663C187E386CC6FEC66C3800AC -:1022F000386CC6C66C6CEE000E180C3E66663C0070 -:1023000000007EDBDB7E0000060C7EDBDB7E60C037 -:102310001E30607E60301E00007CC6C6C6C6C60089 -:1023200000FE00FE00FE000018187E1818007E0057 -:1023300030180C1830007E000C1830180C007E008D -:102340000E1B1B18181818181818181818D8D87039 -:102350000018007E001800000076DC0076DC00002B -:10236000386C6C38000000000000001818000000F5 -:1023700000000018000000000F0C0C0CEC6C3C1C62 -:102380006C36363636000000780C18307C000000C1 -:1023900000003C3C3C3C000000000000000000004D -:1023A000AED580A83FD300408D142000A1C8DA121A -:1023B000818FD9F1DB40A4A6AFFF00000000000030 -:1023C00000000000010000800FE007F01FF00FF890 -:1023D0001FF00FF81FF00FF83FF89FFC1FFFFFF8EA -:1023E0001FFFFFF81FFFFFF80FFFFFF003FFFFE0E5 -:1023F00007FFFFF007EFFBF00F83E0F80F93E4F81F -:102400000F11C4780F83E0F81F83E0FC0FEF7BF817 -:102410000FFC1FF80FFF7FF80FFFFFF807F80FF012 -:1024200007FFFFF003FFFFE001FFFFC000FFFF8099 -:10243000007FFF00001FFC00000080006C180000FF -:102440004C1800002C1800000C180000EC170000BD -:10245000CC170000BC2300000C1B00008C1A0000ED -:102460000C1A00008C1900000C1900008C180000D8 -:10247000841700008C170000941700009C170000C0 -:10248000A4170000AC1700000000000000000000CE -:1024900000FFFC0003FFFF0007FFFF80061FE18035 -:1024A0000630318006303180063FC300063303001A -:1024B000063183000630C30006000600060F060042 -:1024C00007FFFF800FFFFFC01FFFFFE03FFFFFF090 -:1024D0007FFFFFF8FFFFFFFCFFFFFFFC00F0F000B5 -:1024E00003FFF0000FFFFC000000000000000000F0 -:1024F00000000000000000000000000000000000DC -:082500000000000000000000D3 -:0825080000183C6C7EFFFF008F +:1003A000ED8FD5BF1301C1FD22CE26CC06D02A8405 +:1003B000AE82B28483C304008504638503060147CB +:1003C000939733000966BA9713064603B29703C39F +:1003D0000700814793158301E185368663C40500D4 +:1003E00013C61600B385E2003305F40036CA1AC8F6 +:1003F0001EC63AC416C23EC0853F424382472146CC +:100400000603850792422247B243D2461373F30F85 +:10041000E392C7FC0507E315F7FA329493078007C8 +:10042000E3DA87F882507244E24413014102828089 +:1004300083C761C0ADC7311122C62E84AA8537A5F6 +:1004400007001305051206C826C4B93993175400CE +:10045000818F8A07A29713141500AA84A285139589 +:10046000370099312694931714002A873EC001441F +:100470000245B71401403AC291469384044094C89F +:10048000C9330245B706040094C8653B124705040A +:10049000E31087FEC2403244A24451018280828030 +:1004A000611122C03714014006C213040480894739 +:1004B00037C502001CC8130505F26133B7070200F7 +:1004C00092401CC802442101828037575A641307A6 +:1004D000070523ACE1C2938781C31307400623823B +:1004E000E700054723930700239407002385E700CF +:1004F000A38A01C2238A01C223A801C223A601C282 +:100500008280411122C406C626C24D47AA871384A1 +:10051000C1C26344B7042A940347040015EB2AC000 +:100520009305C0031305006221379305C00313052B +:100530007049FD3D9305A00513050037D53D824761 +:10054000138701C38546BA972300D4002380D700C0 +:10055000B2402244924441018280938401C3130734 +:100560001003AA946343B70203C7040019EB2AC01F +:100570009305200313050062653D824705472380EC +:10058000E4003E9423000400E1B723800400D5BFBB +:100590002E860147B307E60083C7070081EFC147F6 +:1005A000998F8A0713C7F7FF7D87AA85854633F59C +:1005B000E700CDBB0507F9BFB71701408847938710 +:1005C000074098479C471345F5FF19831347F7FFEA +:1005D000958393C7F7FF058B05892207858B7111DA +:1005E000C207598D5D8D110182809307F00763CF9B +:1005F000A702411122C406C626C2B387C50013074D +:1006000000042E846354F7003306B740B304860019 +:1006100063179400B2402244924441018280A28533 +:1006200005462AC0913302450504DDB782801301D7 +:1006300081FDB387E50022D226D02AC832CA13D45E +:1006400036003EC6814393F775000547B317F700A0 +:100650003EC0D24781469E973ECC93D735009E0739 +:100660003ECEE247939236000147B69783C7070014 +:100670003EC2C247BE92F247B3845700B387E2003E +:100680001306F0076364F604124593070008B3D716 +:10069000E740E98F3386E400138541C43295034374 +:1006A00001003EC4834705001346F3FF05077D8E16 +:1006B000A247B337F000B307F0403373F30033665B +:1006C00066002300C500A147E31AF7FA8506E31A7E +:1006D000D4F8B2478505A2936386B7009307000458 +:1006E000E393F5F612548254130181028280411182 +:1006F0009307F6FF06C622C426C2AA971307F0077F +:100700006375F70013060008098E3304C5006317EC +:100710008500B24022449244410182800546930400 +:1007200015002EC0913182452685D5B7311126C4DA +:10073000B284368606C822C636C22A842EC07535D3 +:10074000124682451385F4FF22954535824526865B +:100750002285713F8247228532449385F7FF924775 +:10076000C2402686A244BE95510151B7211122C82C +:1007700026C62A84B28485462E86AA85014506CAE5 +:100780001531130500039D461306C004A285793F69 +:100790001395340026950A0526950605930730061D +:1007A00063DFA70293071400930540063EC0CD38CF +:1007B00082472A871904930617039304100326859A +:1007C000BE85054636C43AC23EC0793EA24685047F +:1007D00082471247E395D4FE8507E39E87FCD2400B +:1007E0004244B24461018280B70700E083A7470F0B +:1007F0008280B70700E09387470F9843211106CA0C +:1008000022C826C61377070C9306000C630BD7008B +:1008100002C42E84DDED9C4389C793F7070891E35A +:10082000E1370144D24022854244B24461018280D2 +:10083000B30794401D476353F700BA87B70610000B +:10084000370700E085061307470F10439375060826 +:10085000A5E111C62AC23EC0413F1245824734007D +:100860000D47B685634DF704A246370700E00D46F5 +:10087000232CD70EB3069500014783C20600050757 +:100880003383E500230053006385E7008506E31604 +:10089000C7FE13874700136707F82304E100A24649 +:1008A000370700E0BE94232AD70EE3C384F89DBF28 +:1008B000FD16C1FE1C4393E7070C1CC39DB733868E +:1008C000E4002A960346060005078506A38FC6FEA8 +:1008D00051BF8144D9BF611122C006C22E84113F8D +:1008E0009240228502442101828097010020938159 +:1008F00021B1138141400965130505887310053046 +:1009000097F6FFFF9386067093E636007390563095 +:100910001385C1C19385410401466356B50010C1DA +:100920001105E34EB5FE172500001305E5F093858C +:1009300041C01386C1C16388C500144194C111052B +:100940009105E39AC5FEB7F700E0054798C38567B0 +:10095000938707E6739017347300203073251034A3 +:10096000EFF09F8873250030EFF01F887325303437 +:10097000EFF09F8773252034EFF01F87B70700E063 +:100980009387470F9843137707086DFF0567130791 +:1009900057A898C3B70700E09387470F984313778A +:1009A00007086DFF37B7AAAA130737A898C301A095 +:1009B000371702401C47B7068000D58F1CC7AA878F +:1009C00003C7070001E73385A74082808507CDBFB5 +:1009D000130141FAA2CAA6C886CC2AC02EC232840C +:1009E000B68409E59307801A02C23EC002CA834753 +:1009F000040013071400A30FF10081EBE6405644F6 +:100A00005245C6441301C10582803AC6930650027E +:100A10006380D7021246824785451305F10182970C +:100A2000324726C43A84D247A244AA973ECAC1B7E5 +:100A3000834714009306000313072400A30FF1005B +:100A40003EC66393D7083A8481460147A54519A855 +:100A500093172700BA97860705043307F6008347E4 +:100A6000F4FF8546138607FD1375F60FE3F2A5FE26 +:100A700099C2A30FF1003AC8E14663D3E60036C835 +:100A80001306C00681466398C70083470400854665 +:100A90000504A30FF1000346F10193074006630527 +:100AA000F60663E7C702930780056302F60A930719 +:100AB00030066300F60C39D212468247854513058D +:100AC000F101829726C485B79306000236C6A5BFFA +:100AD00093075007630AF602930780076309F60637 +:100AE00093073007E31AF6FC9387440084403ACC1E +:100AF0003EC42685E9356247AA856359E008C246A7 +:100B000032463818268525A0938744003EC485CAFE +:100B10001306B6F818109336160088400146A9450A +:100B2000EFF04FF3C24632463818AA850810EFF0AE +:100B30000FDF1246AA85281882478297EDB59307E2 +:100B4000500718108546E30AF6FC8146F9B788403D +:100B5000130686FA9387440018108546133616004C +:100B6000C1453EC4EFF00FEFC2463246AA853818A1 +:100B700075BF938744003EC49C40C2463246A30FD3 +:100B8000F100381885451305F10155B71246268541 +:100B900065B7111132C62A8605652EC436C881454F +:100BA00034001305658D06C23ACA3ECC36C00D35F9 +:100BB00092407101828089670A05938707EAAA97A4 +:100BC0008C43096571111305C59006C0D937824061 +:100BD00011016FF02FF471116167B757004006C023 +:100BE0001307076A938707407D5683D68701898A52 +:100BF000E1C67D17E31BC7FE014521A8E167938786 +:100C0000176A8356470193F6060899E6FD17F5FB28 +:100C10000D455537054589A8834705000505231867 +:100C2000F700E39DA5FCE166375700403706070053 +:100C30009386066A1307074013064608FD550355B9 +:100C4000470183578701C207C98FF18F6387C700A8 +:100C5000FD16E396B6FE11456DBF835707000145AB +:100C600093E707202310F700824011018280375755 +:100C70000040AA95130707406DB793078007231814 +:100C8000F7006166B7560040370707001306066A8B +:100C900093860640130727087D5383D2460183D7E6 +:100CA0008601C207B3E75700F98FE382E7FC7D16A0 +:100CB000E31566FE0945B1BF03D70700E1663706B5 +:100CC0000300136707102390E7003757004093860F +:100CD000066A1307074005067D5383524701835771 +:100CE0008701C207B3E75700F18FE388C7F8FD1605 +:100CF000E39566FE054531BF130181FDA300A10008 +:100D000089450A8506D223000100F135925013016E +:100D100081028280311106C822C62AC02AC22EC48E +:100D20009DC1B337A000B307F0402A84B375F1002A +:100D30001305801A713901C4124582471D8DC240C6 +:100D400032445101828001448145DDB7311136C4FE +:100D5000340006C23AC63EC836C06D3F92405101CB +:100D600082802A96AA876393C70082802380B70077 +:100D70008507D5BF130600408145138541C4D5B70B +:100D8000AA8703C705002380E70011E38280850559 +:100D90008507C5BF81476313F60082803387F5005E +:100DA000834607003307F50085072300D700E5B722 +:100DB00079711305100206D622D426D2353F01459B +:100DC000253F1305F0070D3F130520023537014578 +:100DD00025371D45138441C4053793040440930708 +:100DE0000004A28513060002130511002300F10080 +:100DF0005537930510020A8513040402E93BE310FA +:100E000094FEB2502254925445618280B72702402A +:100E1000054798C3B71702403707080123A2070008 +:100E20001307170898C337079F0098C7984393166E +:100E30006700E3DD06FED843B7160240719B1367D7 +:100E40002700D8C32147DC42B18BE39EE7FEB707FA +:100E500000E023AC070E1307000823AAE70E8280E8 +:100E6000130181F986D2A2D0A6CE4D37B714024025 +:100E70009C4C37140140FD7693E757039CCC9307B5 +:100E8000048098439386F60F370600F11377F7F046 +:100E90001367070198C33707020098CB93070440F4 +:100EA00098437D1637050B00758F1367071098C39D +:100EB0003707040098CB1840130505C8419B1367FA +:100EC000870018C09843718F37060008518F98C368 +:100ED0009843370610FF7D16718F37068000518FBB +:100EE00098C3054718C81307000498CB13070002DE +:100EF00098CBEFF00FB5DC4C37072000D98FDCCC56 +:100F00009C4C7D779306F70F93E717019CCC1C4010 +:100F10000567130707D093F7F7F01CC01C4093E751 +:100F2000070D1CC01C40F58F1CC01C40D98F1CC075 +:100F30000964EFF02FBE130444EB2D3D034504007C +:100F40009307F00F6314F500A53521A005046D3358 +:100F500075D5EFF08FD7393D896593858594114517 +:100F6000EFF00FE3130700020966BA86130606EDD9 +:100F7000C14513050003EFF08FEB89659385459517 +:100F800013054003EFF0CFE0253593050005130569 +:100F90003029EFF0EFC99305000513050031EFF09C +:100FA0002FC9930580071305C03DEFF06FC81304E8 +:100FB000800CEFF06FE01357850093570501A304F1 +:100FC000E102498F2305F102D98F2304A10293F78F +:100FD000F70F81EB75651305054C7D14EFF06FA6D7 +:100FE00069F801468144014432C8EFF0EFDC135741 +:100FF000850093570501A302E1022303F1029376D2 +:10100000F50F1377F70F93F7F70F2302A10236C2FC +:101010003AC43EC602C0424681C6933714003EC061 +:10102000224783470100814619C393B61400324515 +:1010300093F5F60F014719C113371600CD8FD98FDD +:1010400099C323A401C203C651C025E699C713055D +:10105000F00A5D318547A382F1C083C761C281C7B1 +:10106000FD172383F1C2938781C383C7A70013842D +:1010700081C381CF83D741C29306900F8507C207F2 +:10108000C18363E7F6682392F1C283A701C2378563 +:101090000500130505E4850723A0F1C283A781C2DB +:1010A000850723A4F1C2EFF0CF993246A24412443F +:1010B00025BF83C451C30946638BC45E6362960631 +:1010C000138481C36397043C85C203C541C39D4516 +:1010D0003AC81905EFF04F82238AA1C2E5451305EE +:1010E0007041EFF0EFB4424711CF03C541C39D45B6 +:1010F0000505EFF06F80238AA1C2E5451305704115 +:10110000EFF00FB38247C1CF83C741C3194763686C +:10111000F70809678A07130747AABA979C4382878B +:101120008D47638DF44003C741C0938741C10607D3 +:10113000BA9783D70700E38207F203A781C2E36E61 +:10114000F7F01305E00A4D3EA38201C039B78307CB +:10115000040013074006F907635DF714BA872300FC +:10116000F4008307340013074006ED176358F714A3 +:10117000BA87A301F4001147238EE1C09305C00391 +:101180003147130500372383E1C2EFF06FAA9305BF +:10119000000513057049EFF0AFA9EFF06FB0D93E2D +:1011A00083C741C301453EC002478967938787F8DB +:1011B0000A07BA978C43EFF0AFBD8347A4003EC83F +:1011C00095C303074400F54763CEE70083A701C238 +:1011D000A18B89CB09668546130646968145014554 +:1011E000EFF04F9C13060008A9450145EFF02FD002 +:1011F000834794003ECA6383072009668546130629 +:101200008696B9451305E004EFF0CF990966854647 +:101210001306C696B14513054005EFF0AF981303CA +:101220000003C1424247994719C783C761C263801F +:10123000072083C7C1C109671307C7F68A07BA9792 +:1012400090431307000296851A85BA86EFF02FBEE9 +:10125000130600089305E0020145EFF04FC98347EC +:10126000840063E7F42001440967130707F5931727 +:101270002400BA97931434009043A2944147860403 +:10128000BA869305000313851400EFF04FBA0247A6 +:101290009377F40F6319F700C54636869305F0027D +:1012A0002685EFF0AFC805049D47E31FF4FA093621 +:1012B0009DBD13C7F7FF7D87F98F55B513C7F7FF9E +:1012C0007D87F98F7DB503072400B94763C9E7001F +:1012D000930580071305C00DEFF08F95C9B58307FF +:1012E000140093064006E50763D5F604B687A3000D +:1012F000F400930747FF130740066353F700BA87CC +:101300002301F4000947238EE1C09305C003314750 +:101310001305C03D2383E1C2EFF08F919305C00315 +:1013200013057052EFF0CF909305A00513050062EE +:101330009DB593C6F7FFFD86F58F55BF0345940015 +:1013400093058007933715003335A0003305A0407F +:101350001375C50DA304F4001305851BB5BF1387D2 +:1013600081C3830714009306400623040400A301ED +:10137000D400950763D0F602B687930520031305C2 +:101380007052A300F700EFF0AF8A93052003130516 +:10139000704199B793C6F7FFFD86F58FF9BF8307B4 +:1013A000440013074006938737026356F702BA8753 +:1013B0009305C003130500312302F400EFF04F87BB +:1013C0009305C00313057041EFF08F869305A005C8 +:1013D00013057052C9B313C7F7FF7D87F98FC9BFD3 +:1013E0008547A38AF1C29305800213053029EDB524 +:1013F0008D47A38AF1C2A38301C2F5B783A201C2BC +:1014000093050005168516CCEFE0DFCC930770023C +:10141000E2421303E50163F6A7009307E006338376 +:10142000A74093F28200B3325000B902E5BB5247A5 +:101430009547E31207E08306440075478D47E35C58 +:10144000D7DE830614006147E357D7DE8306040026 +:101450004D47E352D7DE03A501C29305200316CA08 +:101460001AC8EFE03FC7D242424393374500E1B389 +:1014700013951400269521470A05BA861386C1C024 +:10148000930560023A958504EFF06F9A93F4F40F98 +:10149000F9B381CBF94513050037A38A01C2EFE008 +:1014A0003FF9EFF03F8D8965938505970145EFF092 +:1014B0002F8E030604008965938505982945EFF072 +:1014C000EFAA030614008965938585984D45EFF0D2 +:1014D000EFA9030624008965938505997145EFF00E +:1014E000EFA803063400896593858599130550029A +:1014F000EFF0CFA70306440089659385059A13058D +:10150000E002EFF0AFA683479400835664009DC3CA +:1015100009671307C79309661306869AC5452810FD +:10152000EFF0DF8285463010930580030145EFE040 +:101530007FE7B5BB096713078793F1BF85C203C572 +:1015400071C2A6853AC80905EFE01FBBA383A1C2FB +:10155000E54513057041EFE0BFED424711CF03C5EC +:1015600071C28D450505EFE03FB9A383A1C2E545F2 +:1015700013057041EFE0DFEB824795CF83C771C25F +:1015800081EF83C741C09305800285078D8B23823D +:10159000F1C01305003731A805476392E71083C7F0 +:1015A00061C09305C0031305C03D93B717002383A3 +:1015B000F1C0EFE0FFE7EFF0EFFB89659385459B16 +:1015C0000145EFE0FFFC13060008A9450145EFF0D7 +:1015D0000F9203C741C08967938747FA0A07BA97F2 +:1015E000944309661306469CC5452810EFF00FF694 +:1015F00083C761C0CDCB89669386069409661306BE +:10160000469DC54513059103EFF04FF48965938519 +:10161000059E1305A104EFF0AFF601448144930742 +:1016200024013EC083C671C293F3F40F639E760219 +:10163000A9429305B401B385554001431A85054677 +:10164000050316D01ECE36CC1ACA2EC8EFE0DFD165 +:10165000524313060008C245E246F2438252E31F9A +:10166000C3FCFD12E39702FC139644008245B38647 +:10167000764026963C10B336D0003E961145EFE0FA +:101680007FD23104930640028504E31AD4F88965B9 +:101690009385859E13058003EFE09FEF09B9A38A28 +:1016A00001C2F945FDB589669386469481BF82479C +:1016B00099CFEFE09FE19305000513053029EFE096 +:1016C0003FD7930580071305C03DEFE07FD6EFF0CD +:1016D0006FEA130700020966BA86130646FBA145A6 +:1016E00013050003EFE0BFF489659385C59F1305DB +:1016F000C002EFE0FFE983D6E1C30966C5451306E2 +:1017000046A02810EFF08FE42C101305400369B7B2 +:101710008356640083070400239201C28506C20633 +:10172000C1822313D400FD1713074006034694001B +:101730006354F708BA87E20703072400E18713051B +:10174000400649C693056700635DB506AA85230078 +:10175000F4002301B4009307D00563D5E700A30488 +:101760000400014613F7160019CB830734009305D4 +:101770004006FD1763DAF508AE87A301F400834540 +:10178000840041EA894763EDB70093973600958F4F +:1017900083A601C2B697FD8BADEF85052304B40087 +:1017A00035CB8307140093064006FD1763DAF61263 +:1017B000B687A300F400B9A813C7F7FF7D87F98F98 +:1017C0009DBF13C5F5FF7D85E98D51B72300F4005A +:1017D0009307F7FF6350F502AA872301F4008307FC +:1017E000140013074006FD17635BF700BA87A300D8 +:1017F000F4008DBF13C7F7FF7D87F98FF9BF13C7BB +:10180000F7FF7D87F98FE5B793C5F7FFFD85ED8F6E +:10181000ADB7D9F583043400CD4763CD970019CB1C +:101820008307140013074006FD176350F70CBA87AF +:10183000A300F400830504008306140003072400BA +:10184000A68763D39500AE8713968701618663D31D +:10185000C600B6871396870161866353C700BA87AF +:101860001396870161863945830744006344C508A0 +:10187000F517130640066355F608B2872302F400F5 +:1018800001453AC836C0EFE0DFC782460545B68558 +:10189000EFE03FC742470945BA85EFE09FC6A685FE +:1018A0000D45EFE01FC6830744006340F0FE094783 +:1018B0009305800C1305A014A38AE1C2230504003C +:1018C000EFE01FB79305800C1305700FEFE05FB6D4 +:1018D000930500191305500AEFE09FB56FF0EFFA7A +:1018E00093C6F7FFFD86F58FE9B513C7F7FF7D8730 +:1018F000F98F3DBF13052003E354C5F8890795BF51 +:1019000013C6F7FF7D86F18F95BF000073736431B6 +:101910003330365F6932635F6572726F72202D20DB +:1019200074696D656F75742077616974696E67207D +:10193000666F722025730A0D000000005A7A7A0043 +:101940004F6E00004F66660050414E41474F544372 +:1019500048490000707265737320616E79206B6571 +:1019600079000000210000007A0000005A00000009 +:101970002D2D20535441545553202D2D000000008F +:10198000464F4F440000000046554E200000000026 +:10199000454E4759000000005741534800000000E1 +:1019A000484C544800000000416765202575202000 +:1019B000257300002D2053455454494E4753202D84 +:1019C0000000000053637265656E206F66663A25FD +:1019D00073000000536F756E643A20257300000099 +:1019E0004261636B000000004C2F52206D6F7665E2 +:1019F00020204F4B2075736500000000522E492EA9 +:101A0000502E00006C69766564202575206D696E26 +:101A1000000000006E6F7420627573790000000092 +:101A20006D6173746572206D6F6465007472616EB0 +:101A3000736D6974206D6F646500000074782065B3 +:101A40006D707479000000007472616E736D69745A +:101A500020636F6D706C65746500000046454544F9 +:101A600000000000504C415900000000534C454517 +:101A700050000000434C45414E0000004845414C99 +:101A80000000000053544154530000005345545487 +:101A9000494E475300000000313573003330730066 +:101AA000363073004E110000C61200003C130000D7 +:101AB0005E1300009E130000E0130000F01300000E +:101AC00003C003C003C007F00FF81FFCFF7FFE3FF9 +:101AD000FC1FFE3F1F7C1FFC0FF807F003C003C074 +:101AE00000000000000000C000C000C006C006C02A +:101AF00006D806D836D836D836D836D800000000F2 +:101B00000000008007F00FF81C3C3C3E300E300E09 +:101B1000700F300E3C3E3C3E1FFC0FF807F000807B +:101B2000000000000080008001C001C007F00DF837 +:101B30000DF808F81DFC0DF80FF80FF807F00080FD +:101B400000000000000004000C001C0018001C0035 +:101B50003C001C001E001F000FE807F00080000082 +:101B600000000000077000001F7C3F7E3F7E3F7E2C +:101B700000003F7E3F7E3F7E1F7C0000077000001C +:101B80000000000000A001900FE01BF03BF831F8CE +:101B90003BF87BFC3FF83FF83FF81FF00FE00100F7 +:101BA0000000000000000000010000800FE007F0CE +:101BB0001FF00FF81FF00FF81FF00FF83FF89FFC11 +:101BC0001FFFFFF81FFFFFF81FFFFFF80FFFFFF0D9 +:101BD00003FFFFE007FFFFF007FFFFF00FBBEEF88A +:101BE0000FD7F5F80FEFFBF80FD7F5F81FBBEEFC9A +:101BF0000FFFFFF80FFFFFF80FFFFFF80FF007F8D8 +:101C000007FFFFF007FFFFF003FFFFE001FFFFC04A +:101C100000FFFF80007FFF00001FFC00000080002D +:101C20000000000000000000010000800FE007F04D +:101C30001FF00FF81FF00FF81FF00FF83FF89FFC90 +:101C40001FFFFFF81FFFFFF81FFFFFF80FFFFFF058 +:101C500003FFFFE007FFFFF007FFFFF00FFFFFF8B4 +:101C60000FFFFFF80FFFFFF80F01C0781FFFFFFC09 +:101C70000FFFFFF80FFF7FF80FFC1FF80FFF7FF833 +:101C800007FFFFF007FFFFF003FFFFE001FFFFC0CA +:101C900000FFFF80007FFF00001FFC0000008000AD +:101CA0000000000000000000010000800FE007F0CD +:101CB0001FF00FF81FF00FF81FF00FF83FF89FFC10 +:101CC0001FFFFFF81FFFFFF81FFFFFF80FFFFFF0D8 +:101CD00003FFFFE007EFFBF00783E0F00F93E4F86A +:101CE0000F11C4780F83E0F80F83E0F81FEFFBFCBF +:101CF0000FFF7FF80FFC1FF80FFC1FF80FF80FF80D +:101D000007FC1FF007FC1FF003FF7FE001FFFFC08F +:101D100000FFFF80007FFF00001FFC00000080002C +:101D20000000000000000000010000800FE007F04C +:101D30001FF00FF81FF00FF81FF00FF83FF89FFC8F +:101D40001FFFFFF81FFFFFF81FFFFFF80FFFFFF057 +:101D500003FFFFE007FFFFF007FFFFF00FEFFBF8C7 +:101D60000F83E0F80F93E4F80F11C4781F83E0FCB1 +:101D70000F8360F80FEC1BF80FFF7FF80FFC1FF8C4 +:101D800007F7F7F007FBEFF003FFFFE001FFFFC0ED +:101D900000FFFF80007FFF00001FFC0000008000AC +:101DA0000000000000000000010000800FE007F0CC +:101DB0001FF00FF81FF00FF81FF00FF83FF89FFC0F +:101DC0001FFFFFF81FFFFFF81FFFFFF80FFFFFF0D7 +:101DD00003FFFFE007FFFFF007FFFFF00FFFFFF833 +:101DE0000FEFFBF80FD7F5F80FFFFFF81FFFFFFC11 +:101DF0000FFFFFF80FF80FF80FFBEFF80FF7F7F8EA +:101E000007FC1FF007FFFFF003FFFFE001FFFFC02B +:101E100000FFFF80007FFF00001FFC00000080002B +:101E20000000000000000000010000800FE007F04B +:101E30001FF00FF81FF00FF81FF00FF83FF89FFC8E +:101E40001FFFFFF81FFFFFF81FFFFFF80FFFFFF056 +:101E500003FFFFE007FFFFF007FFFFF00FFFFFF8B2 +:101E60000FFFFFF80F01C0780FFFFFF81FFFFFFC07 +:101E70000FFF7FF80FFC1FF80FFF7FF80FFFFFF831 +:101E800007F80FF007FFFFF003FFFFE001FFFFC0BF +:101E900000FFFF80007FFF00001FFC0000008000AB +:101EA000141A0000201A00002C1A00003C1A00002E +:101EB000481A0000AED580A83FD300408D14200002 +:101EC000A1C8DA12818FD9F1DB40A4A6AFFF0000D0 +:101ED0000000000000000000010000800FE007F09B +:101EE0001FF00FF81FF00FF81FF00FF83FF89FFCDE +:101EF0001FFFFFF81FFFFFF81FFFFFF80FFFFFF0A6 +:101F000003FFFFE007FFFFF007EFFBF00F83E0F8B0 +:101F10000F93E4F80F11C4780F83E0F81F83E0FCFF +:101F20000FEF7BF80FFC1FF80FFF7FF80FFFFFF894 +:101F300007F80FF007FFFFF003FFFFE001FFFFC00E +:101F400000FFFF80007FFF00001FFC0000008000FA +:101F5000801B0000601B0000401B0000201B0000D5 +:101F6000001B0000E01A0000C01A0000D01E000094 +:101F7000201E0000A01D0000201D0000A01C00006D +:101F8000201C0000A01B00005C1A0000641A000066 +:101F90006C1A0000741A00007C1A0000841A0000F9 +:101FA0008C1A0000981A00009C1A0000A01A000069 +:101FB00044190000000000000000000000FFFC00C9 +:101FC00003FFFF0007FFFF80061FE180063031801E +:101FD00006303180063FC30006330300063183001C +:101FE0000630C30006000600060F060007FFFF804C +:101FF0000FFFFFC01FFFFFE03FFFFFF07FFFFFF875 +:10200000FFFFFFFCFFFFFFFC00F0F00003FFF0000C +:102010000FFFFC00000000000000000000000000B6 +:1020200000000000000000000000000000000000B0 +:102030000000000000000000000000007E81A5817B +:10204000BD99817E7EFFDBFFC3E7FF7E6CFEFEFE57 +:102050007C38100010387CFE7C381000387C38FE4C +:10206000FED6103810387CFEFE7C10380000183C7C +:102070003C180000FFFFE7C3C3E7FFFF003C6642D8 +:1020800042663C00FFC399BDBD99C3FF0F070F7D9A +:10209000CCCCCC783C6666663C187E183F333F302B +:1020A0003070F0E07F637F636367E6C018DB3CE776 +:1020B000E73CDB1880E0F8FEF8E08000020E3EFE10 +:1020C0003E0E0200183C7E18187E3C186666666656 +:1020D000660066007FDBDB7B1B1B1B003E613C66F2 +:1020E000663C867C000000007E7E7E00183C7E18E8 +:1020F0007E3C18FF183C7E1818181800181818187D +:102100007E3C180000180CFE0C180000003060FE29 +:10211000603000000000C0C0C0FE0000002466FF68 +:102120006624000000183C7EFFFF000000FFFF7ED9 +:102130003C1800000000000000000000183C3C18A3 +:102140001800180066662400000000006C6CFE6C2D +:10215000FE6C6C00183E603C067C180000C6CC1873 +:102160003066C600386C3876DCCC76001818300043 +:10217000000000000C18303030180C0030180C0C27 +:102180000C18300000663CFF3C6600000018187E0A +:102190001818000000000000001818300000007E31 +:1021A000000000000000000000181800060C1830A5 +:1021B00060C08000386CC6D6C66C38001838181855 +:1021C00018187E007CC6061C3066FE007CC6063CE5 +:1021D00006C67C001C3C6CCCFE0C1E00FEC0C0FC85 +:1021E00006C67C003860C0FCC6C67C00FEC60C1863 +:1021F000303030007CC6C67CC6C67C007CC6C67E3D +:10220000060C7800001818000018180000181800B4 +:1022100000181830060C1830180C060000007E005C +:10222000007E00006030180C183060007CC60C186E +:10223000180018007CC6DEDEDEC07800386CC6FEF2 +:10224000C6C6C600FC66667C6666FC003C66C0C00E +:10225000C0663C00F86C6666666CF800FE626878E2 +:102260006862FE00FE6268786860F0003C66C0C08C +:10227000CE663A00C6C6C6FEC6C6C6003C181818CA +:1022800018183C001E0C0C0CCCCC7800E6666C7860 +:102290006C66E600F06060606266FE00C6EEFEFE00 +:1022A000D6C6C600C6E6F6DECEC6C6007CC6C6C624 +:1022B000C6C67C00FC66667C6060F0007CC6C6C654 +:1022C000C6CE7C0EFC66667C6C66E6003C6630180A +:1022D0000C663C007E7E5A1818183C00C6C6C6C65E +:1022E000C6C67C00C6C6C6C6C66C3800C6C6C6D63C +:1022F000D6FE6C00C6C66C386CC6C6006666663C08 +:1023000018183C00FEC68C183266FE003C30303097 +:1023100030303C00C06030180C0602003C0C0C0C45 +:102320000C0C3C0010386CC60000000000000000DF +:10233000000000FF30180C00000000000000780CC6 +:102340007CCC7600E0607C666666DC0000007CC6C3 +:10235000C0C67C001C0C7CCCCCCC760000007CC6BB +:10236000FEC07C003C6660F86060F000000076CC47 +:10237000CC7C0CF8E0606C766666E60018003818D5 +:1023800018183C00060006060666663CE060666CAF +:10239000786CE6003818181818183C000000ECFE9D +:1023A000D6D6D6000000DC666666660000007CC6F5 +:1023B000C6C67C000000DC66667C60F0000076CC5F +:1023C000CC7C0C1E0000DC766060F00000007EC05B +:1023D0007C06FC003030FC3030361C000000CCCCD9 +:1023E000CCCC76000000C6C6C66C38000000C6D64D +:1023F000D6FE6C000000C66C386CC6000000C6C675 +:10240000C67E06FC00007E4C18327E000E18187046 +:1024100018180E0018181818181818007018180E28 +:102420001818700076DC0000000000000010386C06 +:10243000C6C6FE007CC6C0C0C67C0C78CC00CCCC26 +:10244000CCCC76000C187CC6FEC07C007C82780C5C +:102450007CCC7600C600780C7CCC76003018780CEA +:102460007CCC76003030780C7CCC760000007EC0CE +:10247000C07E0C387C827CC6FEC07C00C6007CC658 +:10248000FEC07C0030187CC6FEC07C006600381898 +:1024900018183C007C82381818183C003018003896 +:1024A00018183C00C6386CC6FEC6C600386C7CC620 +:1024B000FEC6C6001830FEC0F8C0FE0000007E1840 +:1024C0007ED87E003E6CCCFECCCCCE007C827CC61E +:1024D000C6C67C00C6007CC6C6C67C0030187CC65A +:1024E000C6C67C00788400CCCCCC76006030CCCCE6 +:1024F000CCCC7600C600C6C6C67E06FCC6386CC606 +:10250000C66C3800C600C6C6C6C67C0018187EC099 +:10251000C07E1818386C64F06066FC0066663C7E0D +:10252000187E1818F8CCCCFAC6CFC6C70E1B183CBC +:1025300018D870001830780C7CCC76000C18003855 +:1025400018183C000C187CC6C6C67C001830CCCCD1 +:10255000CCCC760076DC00DC6666660076DC00E6D5 +:10256000F6DECE003C6C6C3E007E0000386C6C38B1 +:10257000007C00001800181830633E00000000FEC8 +:10258000C0C00000000000FE0606000063E66C7E8E +:102590003366CC0F63E66C7A366ADF0618001818CB +:1025A0003C3C1800003366CC6633000000CC663338 +:1025B00066CC0000228822882288228855AA55AA43 +:1025C00055AA55AA77DD77DD77DD77DD181818185D +:1025D0001818181818181818F81818181818F818BB +:1025E000F818181836363636F6363636000000003B +:1025F000FE3636360000F818F81818183636F60683 +:10260000F636363636363636363636360000FE067E +:10261000F63636363636F606FE00000036363636E4 +:10262000FE0000001818F818F80000000000000074 +:10263000F8181818181818181F000000181818187B +:10264000FF00000000000000FF18181818181818E4 +:102650001F18181800000000FF00000018181818B4 +:10266000FF18181818181F181F181818363636367D +:1026700037363636363637303F00000000003F3000 +:10268000373636363636F700FF0000000000FF0010 +:10269000F736363636363730373636360000FF00F6 +:1026A000FF0000003636F700F73636361818FF0000 +:1026B000FF00000036363636FF0000000000FF0045 +:1026C000FF18181800000000FF363636363636364A +:1026D0003F00000018181F181F00000000001F18FE +:1026E0001F181818000000003F36363636363636CA +:1026F000FF3636361818FF18FF181818181818184B +:10270000F8000000000000001F181818FFFFFFFF6E +:10271000FFFFFFFF00000000FFFFFFFFF0F0F0F001 +:10272000F0F0F0F00F0F0F0F0F0F0F0FFFFFFFFF75 +:1027300000000000000076DCC8DC760078CCCCD845 +:10274000CCC6CC00FEC6C0C0C0C0C0000000FE6C3D +:102750006C6C6C00FEC6603060C6FE0000007ED867 +:10276000D8D870000000666666667CC00076DC180B +:10277000181818007E183C66663C187E386CC6FE39 +:10278000C66C3800386CC6C66C6CEE000E180C3E79 +:1027900066663C0000007EDBDB7E0000060C7EDB14 +:1027A000DB7E60C01E30607E60301E00007CC6C6CE +:1027B000C6C6C60000FE00FE00FE000018187E1807 +:1027C00018007E0030180C1830007E000C183018ED +:1027D0000C007E000E1B1B18181818181818181853 +:1027E00018D8D8700018007E001800000076DC00B1 +:1027F00076DC0000386C6C38000000000000001827 +:102800001800000000000018000000000F0C0C0C65 +:10281000EC6C3C1C6C36363636000000780C1830F8 +:102820007C00000000003C3C3C3C0000000000003C +:0428300000000000A4 +:10283400010101000000000000183C6C7EFFFF0055 +:08284400FA00F401E8030000B2 :00000001FF diff --git a/tama.lst b/tama.lst index 520153c..4c81ce2 100644 --- a/tama.lst +++ b/tama.lst @@ -11,38 +11,38 @@ Disassembly of section .init: { #if !defined(FUNCONF_TINYVECTOR) || !FUNCONF_TINYVECTOR asm volatile( DEFAULT_INTERRUPT_VECTOR_CONTENTS ); - 0: 0410006f j 840 + 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