tama.elf: file format elf32-littleriscv Disassembly of section .init: 00000000 : void InterruptVectorDefault() __attribute__((naked)) __attribute((section(".init"))) __attribute((naked)); void InterruptVectorDefault( void ) { #if !defined(FUNCONF_TINYVECTOR) || !FUNCONF_TINYVECTOR asm volatile( DEFAULT_INTERRUPT_VECTOR_CONTENTS ); 0: 16d0006f j 96c 4: 00000000 .word 0x00000000 8: 000009e0 .word 0x000009e0 c: 000009de .word 0x000009de ... 30: 000009de .word 0x000009de 34: 00000000 .word 0x00000000 38: 000009de .word 0x000009de 3c: 00000000 .word 0x00000000 40: 000009de .word 0x000009de 44: 000009de .word 0x000009de 48: 000009de .word 0x000009de 4c: 000009de .word 0x000009de 50: 000009de .word 0x000009de 54: 000009de .word 0x000009de 58: 000009de .word 0x000009de 5c: 000009de .word 0x000009de 60: 000009de .word 0x000009de 64: 000009de .word 0x000009de 68: 000009de .word 0x000009de 6c: 000009de .word 0x000009de 70: 000009de .word 0x000009de 74: 000009de .word 0x000009de 78: 000009de .word 0x000009de 7c: 000009de .word 0x000009de 80: 000009de .word 0x000009de 84: 000009de .word 0x000009de 88: 000009de .word 0x000009de 8c: 000009de .word 0x000009de 90: 000009de .word 0x000009de 94: 000009de .word 0x000009de 98: 000009de .word 0x000009de 9c: 0000 unimp ... Disassembly of section .text: 000000a0 <__divsi3>: a0: 02054e63 bltz a0,dc <__umodsi3+0x8> a4: 0405c363 bltz a1,ea <__umodsi3+0x16> 000000a8 <__hidden___udivsi3>: a8: 862e mv a2,a1 aa: 85aa mv a1,a0 ac: 557d li a0,-1 ae: c215 beqz a2,d2 <__hidden___udivsi3+0x2a> b0: 4685 li a3,1 b2: 00b67863 bgeu a2,a1,c2 <__hidden___udivsi3+0x1a> b6: 00c05663 blez a2,c2 <__hidden___udivsi3+0x1a> ba: 0606 slli a2,a2,0x1 bc: 0686 slli a3,a3,0x1 be: feb66ce3 bltu a2,a1,b6 <__hidden___udivsi3+0xe> c2: 4501 li a0,0 c4: 00c5e463 bltu a1,a2,cc <__hidden___udivsi3+0x24> c8: 8d91 sub a1,a1,a2 ca: 8d55 or a0,a0,a3 cc: 8285 srli a3,a3,0x1 ce: 8205 srli a2,a2,0x1 d0: faf5 bnez a3,c4 <__hidden___udivsi3+0x1c> d2: 8082 ret 000000d4 <__umodsi3>: d4: 8286 mv t0,ra d6: 3fc9 jal a8 <__hidden___udivsi3> d8: 852e mv a0,a1 da: 8282 jr t0 dc: 40a00533 neg a0,a0 e0: 00b04763 bgtz a1,ee <__umodsi3+0x1a> e4: 40b005b3 neg a1,a1 e8: b7c1 j a8 <__hidden___udivsi3> ea: 40b005b3 neg a1,a1 ee: 8286 mv t0,ra f0: 3f65 jal a8 <__hidden___udivsi3> f2: 40a00533 neg a0,a0 f6: 8282 jr t0 000000f8 <__modsi3>: f8: 8286 mv t0,ra fa: 0005c763 bltz a1,108 <__modsi3+0x10> fe: 00054963 bltz a0,110 <__modsi3+0x18> 102: 375d jal a8 <__hidden___udivsi3> 104: 852e mv a0,a1 106: 8282 jr t0 108: 40b005b3 neg a1,a1 10c: fe055be3 bgez a0,102 <__modsi3+0xa> 110: 40a00533 neg a0,a0 114: 3f51 jal a8 <__hidden___udivsi3> 116: 40b00533 neg a0,a1 11a: 8282 jr t0 ... 0000011e : #endif void DelaySysTick( uint32_t n ) { #if defined(CH32V003) || defined(CH32V00x) uint32_t targend = SysTick->CNT + n; 11e: e000f737 lui a4,0xe000f 122: 471c lw a5,8(a4) 124: 953e add a0,a0,a5 while( ((int32_t)( SysTick->CNT - targend )) < 0 ); 126: 471c lw a5,8(a4) 128: 8f89 sub a5,a5,a0 12a: fe07cee3 bltz a5,126 uint64_t targend = SysTick->CNT - n; while( ((int64_t)( SysTick->CNT - targend )) > 0 ); #else #error DelaySysTick not defined. #endif } 12e: 8082 ret 00000130 : void ssd1306_i2c_setup(void) { uint16_t tempreg; // Reset I2C1 to init all regs RCC->APB1PRSTR |= RCC_APB1Periph_I2C1; 130: 400217b7 lui a5,0x40021 134: 4b98 lw a4,16(a5) 136: 002006b7 lui a3,0x200 13a: 8f55 or a4,a4,a3 13c: cb98 sw a4,16(a5) RCC->APB1PRSTR &= ~RCC_APB1Periph_I2C1; 13e: 4b98 lw a4,16(a5) 140: ffe006b7 lui a3,0xffe00 144: 16fd addi a3,a3,-1 # ffdfffff <_eusrstack+0xdfdff7ff> 146: 8f75 and a4,a4,a3 148: cb98 sw a4,16(a5) // set freq tempreg = I2C1->CTLR2; 14a: 400057b7 lui a5,0x40005 14e: 4047d703 lhu a4,1028(a5) # 40005404 <_eusrstack+0x20004c04> tempreg &= ~I2C_CTLR2_FREQ; 152: 66c1 lui a3,0x10 154: fc068693 addi a3,a3,-64 # ffc0 158: 8f75 and a4,a4,a3 tempreg |= (FUNCONF_SYSTEM_CORE_CLOCK/SSD1306_I2C_PRERATE)&I2C_CTLR2_FREQ; 15a: 01876713 ori a4,a4,24 I2C1->CTLR2 = tempreg; 15e: 40e79223 sh a4,1028(a5) tempreg = (FUNCONF_SYSTEM_CORE_CLOCK/(25*SSD1306_I2C_CLKRATE))&I2C_CKCFGR_CCR; tempreg |= I2C_CKCFGR_DUTY; #endif tempreg |= I2C_CKCFGR_FS; #endif I2C1->CKCFGR = tempreg; 162: 7771 lui a4,0xffffc 164: 0705 addi a4,a4,1 # ffffc001 <_eusrstack+0xdfffb801> 166: 40e79e23 sh a4,1052(a5) // initialize the state ssd1306_i2c_irq_state = 0; #endif // Enable I2C I2C1->CTLR1 |= I2C_CTLR1_PE; 16a: 4007d703 lhu a4,1024(a5) 16e: 00176713 ori a4,a4,1 172: 40e79023 sh a4,1024(a5) // set ACK mode I2C1->CTLR1 |= I2C_CTLR1_ACK; 176: 4007d703 lhu a4,1024(a5) 17a: 40076713 ori a4,a4,1024 17e: 40e79023 sh a4,1024(a5) } 182: 8082 ret 00000184 : void ssd1306_drawPixel(uint32_t x, uint32_t y, int color) { uint32_t addr; /* clip */ if(x >= SSD1306_W) 184: 07f00793 li a5,127 188: 02a7e763 bltu a5,a0,1b6 return; if(y >= SSD1306_H) 18c: 03f00793 li a5,63 190: 02b7e363 bltu a5,a1,1b6 return; /* compute buffer address */ addr = x + SSD1306_W*(y/8); 194: 0035d793 srli a5,a1,0x3 198: 079e slli a5,a5,0x7 19a: 97aa add a5,a5,a0 /* set/clear bit in buffer */ if(color) ssd1306_buffer[addr] |= (1<<(y&7)); 19c: c6818513 addi a0,gp,-920 # 20000064 1a0: 953e add a0,a0,a5 1a2: 899d andi a1,a1,7 1a4: 4705 li a4,1 1a6: 00054783 lbu a5,0(a0) 1aa: 00b715b3 sll a1,a4,a1 if(color) 1ae: c609 beqz a2,1b8 ssd1306_buffer[addr] |= (1<<(y&7)); 1b0: 8fcd or a5,a5,a1 else ssd1306_buffer[addr] &= ~(1<<(y&7)); 1b2: 00f50023 sb a5,0(a0) } 1b6: 8082 ret ssd1306_buffer[addr] &= ~(1<<(y&7)); 1b8: fff5c593 not a1,a1 1bc: 8fed and a5,a5,a1 1be: bfd5 j 1b2 000001c0 : /* * fill a rectangle */ void ssd1306_fillRect(uint32_t x, uint32_t y, uint8_t w, uint32_t h, uint32_t color) { 1c0: 1101 addi sp,sp,-32 1c2: 8332 mv t1,a2 1c4: cc22 sw s0,24(sp) 1c6: ca26 sw s1,20(sp) 1c8: ce06 sw ra,28(sp) 1ca: 84aa mv s1,a0 1cc: 863a mv a2,a4 1ce: 96ae add a3,a3,a1 /* scan vertical */ while(h--) { m=x; w=iw; 1d0: 841a mv s0,t1 /* scan horizontal */ while(w--) 1d2: 147d addi s0,s0,-1 1d4: 0ff47413 zext.b s0,s0 1d8: 0ff00713 li a4,255 1dc: 00e41a63 bne s0,a4,1f0 { /* invert pixels */ ssd1306_drawPixel(m++, n, color); } n++; 1e0: 0585 addi a1,a1,1 while(h--) 1e2: 02d58663 beq a1,a3,20e while(w--) 1e6: fff30413 addi s0,t1,-1 1ea: 0ff47413 zext.b s0,s0 m=x; 1ee: 8526 mv a0,s1 ssd1306_drawPixel(m++, n, color); 1f0: 00150713 addi a4,a0,1 1f4: c81a sw t1,16(sp) 1f6: c636 sw a3,12(sp) 1f8: c43a sw a4,8(sp) 1fa: c232 sw a2,4(sp) 1fc: c02e sw a1,0(sp) 1fe: 3759 jal 184 200: 4722 lw a4,8(sp) 202: 4342 lw t1,16(sp) 204: 46b2 lw a3,12(sp) 206: 4612 lw a2,4(sp) 208: 4582 lw a1,0(sp) 20a: 853a mv a0,a4 20c: b7d9 j 1d2 } } 20e: 40f2 lw ra,28(sp) 210: 4462 lw s0,24(sp) 212: 44d2 lw s1,20(sp) 214: 6105 addi sp,sp,32 216: 8082 ret 00000218 : /* * draw a string to the display */ void ssd1306_drawstr(int x, int y, const char *str, uint8_t color) { 218: fdc10113 addi sp,sp,-36 21c: ce22 sw s0,28(sp) 21e: cc26 sw s1,24(sp) 220: d006 sw ra,32(sp) 222: 842a mv s0,a0 224: 82ae mv t0,a1 226: 84b2 mv s1,a2 uint8_t c; while((c=*str++)) 228: 0004c383 lbu t2,0(s1) 22c: 0485 addi s1,s1,1 22e: 06038563 beqz t2,298 232: 4701 li a4,0 d = fontdata[(chr<<3)+i]; 234: 00339793 slli a5,t2,0x3 238: 6609 lui a2,0x2 23a: 97ba add a5,a5,a4 23c: 67060613 addi a2,a2,1648 # 2670 240: 97b2 add a5,a5,a2 242: 0007c303 lbu t1,0(a5) 246: 4781 li a5,0 if(d&0x80) 248: 01831593 slli a1,t1,0x18 24c: 85e1 srai a1,a1,0x18 24e: 8636 mv a2,a3 250: 0005c463 bltz a1,258 col = (~color)&1; 254: 0016c613 xori a2,a3,1 ssd1306_drawPixel(x+j, y+i, col); 258: 00e285b3 add a1,t0,a4 25c: 00f40533 add a0,s0,a5 260: ca36 sw a3,20(sp) 262: c81a sw t1,16(sp) 264: c61e sw t2,12(sp) 266: c43a sw a4,8(sp) 268: c216 sw t0,4(sp) 26a: c03e sw a5,0(sp) 26c: 3f21 jal 184 d <<= 1; 26e: 4342 lw t1,16(sp) for(j=0;j<8;j++) 270: 4782 lw a5,0(sp) 272: 4621 li a2,8 d <<= 1; 274: 0306 slli t1,t1,0x1 for(j=0;j<8;j++) 276: 0785 addi a5,a5,1 278: 4292 lw t0,4(sp) 27a: 4722 lw a4,8(sp) 27c: 43b2 lw t2,12(sp) 27e: 46d2 lw a3,20(sp) d <<= 1; 280: 0ff37313 zext.b t1,t1 for(j=0;j<8;j++) 284: fcc792e3 bne a5,a2,248 for(i=0;i<8;i++) 288: 0705 addi a4,a4,1 28a: faf715e3 bne a4,a5,234 { ssd1306_drawchar(x, y, c, color); x += 8; 28e: 9432 add s0,s0,a2 if(x>120) 290: 07800793 li a5,120 294: f887dae3 bge a5,s0,228 break; } } 298: 5082 lw ra,32(sp) 29a: 4472 lw s0,28(sp) 29c: 44e2 lw s1,24(sp) 29e: 02410113 addi sp,sp,36 2a2: 8082 ret 000002a4 : // Tiny string builders used instead of snprintf: we only ever paste short // strings and small unsigned ints, and avoiding keeps the whole // printf machinery (~1 KB) out of the image. Each returns the new end pointer // so calls chain; remember to NUL-terminate the final buffer yourself. static char *s_cat(char *p, const char *s) { while (*s) *p++ = *s++; return p; } 2a4: 0005c783 lbu a5,0(a1) 2a8: e391 bnez a5,2ac 2aa: 8082 ret 2ac: 0505 addi a0,a0,1 2ae: 0585 addi a1,a1,1 2b0: fef50fa3 sb a5,-1(a0) 2b4: bfc5 j 2a4 000002b6 : static char *u_cat(char *p, unsigned v) { 2b6: 1111 addi sp,sp,-28 2b8: ca22 sw s0,20(sp) 2ba: c826 sw s1,16(sp) 2bc: cc06 sw ra,24(sp) 2be: 87aa mv a5,a0 2c0: 872e mv a4,a1 2c2: 0020 addi s0,sp,8 char tmp[5]; int n = 0; 2c4: 4481 li s1,0 do { tmp[n++] = '0' + v % 10; v /= 10; } while (v); 2c6: 45a9 li a1,10 2c8: 853a mv a0,a4 2ca: c23e sw a5,4(sp) 2cc: c03a sw a4,0(sp) 2ce: 3519 jal d4 <__umodsi3> 2d0: 4702 lw a4,0(sp) 2d2: 03050513 addi a0,a0,48 2d6: 00a40023 sb a0,0(s0) 2da: 45a9 li a1,10 2dc: 853a mv a0,a4 2de: 33e9 jal a8 <__hidden___udivsi3> 2e0: 4302 lw t1,0(sp) 2e2: 46a5 li a3,9 2e4: 4792 lw a5,4(sp) 2e6: 0485 addi s1,s1,1 2e8: 872a mv a4,a0 2ea: 0405 addi s0,s0,1 2ec: 0030 addi a2,sp,8 2ee: fc66ece3 bltu a3,t1,2c6 2f2: 8726 mv a4,s1 2f4: 86be mv a3,a5 while (n) *p++ = tmp[--n]; 2f6: 177d addi a4,a4,-1 2f8: 00e605b3 add a1,a2,a4 2fc: 0005c583 lbu a1,0(a1) 300: 0685 addi a3,a3,1 302: feb68fa3 sb a1,-1(a3) 306: fb65 bnez a4,2f6 return p; } 308: 40e2 lw ra,24(sp) 30a: 4452 lw s0,20(sp) 30c: 00978533 add a0,a5,s1 310: 44c2 lw s1,16(sp) 312: 0171 addi sp,sp,28 314: 8082 ret 00000316 : // short square-wave beep on the passive piezo (blocking, ms-scale only) static void beep(uint16_t freq, uint16_t ms) { if (!sound_on) return; 316: c061c783 lbu a5,-1018(gp) # 20000002 31a: c7ad beqz a5,384 { 31c: 1131 addi sp,sp,-20 31e: c622 sw s0,12(sp) 320: 842e mv s0,a1 if (freq == 0) { Delay_Ms(ms); return; } uint32_t half = 500000u / freq; // half-period in us 322: 85aa mv a1,a0 324: 0007a537 lui a0,0x7a 328: 12050513 addi a0,a0,288 # 7a120 { 32c: c806 sw ra,16(sp) 32e: c426 sw s1,8(sp) uint32_t half = 500000u / freq; // half-period in us 330: 3ba5 jal a8 <__hidden___udivsi3> uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 332: 00541793 slli a5,s0,0x5 336: 8f81 sub a5,a5,s0 338: 078a slli a5,a5,0x2 33a: 97a2 add a5,a5,s0 33c: 00151413 slli s0,a0,0x1 uint32_t half = 500000u / freq; // half-period in us 340: 84aa mv s1,a0 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 342: 85a2 mv a1,s0 344: 00379513 slli a0,a5,0x3 348: 3385 jal a8 <__hidden___udivsi3> for (uint32_t i = 0; i < cycles; i++) { funDigitalWrite(BUZZER, FUN_HIGH); Delay_Us(half); 34a: 9426 add s0,s0,s1 34c: 00141793 slli a5,s0,0x1 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 350: 872a mv a4,a0 Delay_Us(half); 352: c03e sw a5,0(sp) for (uint32_t i = 0; i < cycles; i++) { 354: 4401 li s0,0 Delay_Us(half); 356: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_HIGH); 358: 400114b7 lui s1,0x40011 35c: c23a sw a4,4(sp) 35e: 4691 li a3,4 360: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00> 364: c894 sw a3,16(s1) Delay_Us(half); 366: 3b65 jal 11e funDigitalWrite(BUZZER, FUN_LOW); Delay_Us(half); 368: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_LOW); 36a: 000406b7 lui a3,0x40 36e: c894 sw a3,16(s1) Delay_Us(half); 370: 337d jal 11e for (uint32_t i = 0; i < cycles; i++) { 372: 4712 lw a4,4(sp) 374: 0405 addi s0,s0,1 376: fe8710e3 bne a4,s0,356 } } 37a: 40c2 lw ra,16(sp) 37c: 4432 lw s0,12(sp) 37e: 44a2 lw s1,8(sp) 380: 0151 addi sp,sp,20 382: 8082 ret 384: 8082 ret 00000386 : static void led_blink(void) { 386: 1161 addi sp,sp,-8 388: c022 sw s0,0(sp) funDigitalWrite(LED_PIN, FUN_HIGH); 38a: 40011437 lui s0,0x40011 { 38e: c206 sw ra,4(sp) funDigitalWrite(LED_PIN, FUN_HIGH); 390: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000> 394: 4789 li a5,2 Delay_Ms(30); 396: 0002c537 lui a0,0x2c funDigitalWrite(LED_PIN, FUN_HIGH); 39a: c81c sw a5,16(s0) Delay_Ms(30); 39c: f2050513 addi a0,a0,-224 # 2bf20 3a0: 3bbd jal 11e funDigitalWrite(LED_PIN, FUN_LOW); 3a2: 000207b7 lui a5,0x20 } 3a6: 4092 lw ra,4(sp) funDigitalWrite(LED_PIN, FUN_LOW); 3a8: c81c sw a5,16(s0) } 3aa: 4402 lw s0,0(sp) 3ac: 0121 addi sp,sp,8 3ae: 8082 ret 000003b0 : } // Award XP; promote (and trigger the evolution banner) when a tier is reached. static void add_xp(uint8_t n) { if (!pet.alive) return; 3b0: c5418713 addi a4,gp,-940 # 20000050 3b4: 01074703 lbu a4,16(a4) 3b8: c371 beqz a4,47c 3ba: c5418793 addi a5,gp,-940 # 20000050 if (pet.xp < 60000) pet.xp += n; 3be: 0087d683 lhu a3,8(a5) # 20008 3c2: 673d lui a4,0xf 3c4: a5f70713 addi a4,a4,-1441 # ea5f 3c8: 02d76663 bltu a4,a3,3f4 3cc: 9536 add a0,a0,a3 3ce: 0542 slli a0,a0,0x10 3d0: 8141 srli a0,a0,0x10 3d2: 00a79423 sh a0,8(a5) uint8_t nl = 1; for (uint8_t i = 1; i < MAX_LEVEL; i++) if (pet.xp >= level_xp[i]) nl = i + 1; 3d6: 02c00693 li a3,44 uint8_t nl = 1; 3da: 4705 li a4,1 if (pet.xp >= level_xp[i]) nl = i + 1; 3dc: 00a6fd63 bgeu a3,a0,3f6 3e0: 07700693 li a3,119 3e4: 4709 li a4,2 3e6: 00a6f863 bgeu a3,a0,3f6 3ea: 0ef00693 li a3,239 3ee: 470d li a4,3 3f0: 00a6f363 bgeu a3,a0,3f6 3f4: 4711 li a4,4 if (nl > pet.level) { 3f6: 00b7c683 lbu a3,11(a5) 3fa: 08e6f163 bgeu a3,a4,47c { 3fe: 1171 addi sp,sp,-4 400: c006 sw ra,0(sp) pet.level = nl; 402: 00e785a3 sb a4,11(a5) switch (pet.level) { 406: 4589 li a1,2 408: 4685 li a3,1 40a: 02b70663 beq a4,a1,436 40e: 460d li a2,3 410: 86ae mv a3,a1 412: 02c70263 beq a4,a2,436 416: 4605 li a2,1 418: 4681 li a3,0 41a: 00c70e63 beq a4,a2,436 if (!pet.ascend) pet.ascend = (pet.health >= 60) ? 1 : 2; 41e: 00d7c703 lbu a4,13(a5) 422: eb31 bnez a4,476 424: 00478683 lb a3,4(a5) 428: 03b00713 li a4,59 42c: 04d74163 blt a4,a3,46e 430: 00b786a3 sb a1,13(a5) pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; 434: 4691 li a3,4 case 1: pet.form = FORM_PROC; break; 436: 00d78623 sb a3,12(a5) compute_form(); evo_anim = 30; // ~1.8 s celebratory banner 43a: 4779 li a4,30 beep(784, 60); beep(988, 60); beep(1175, 60); beep(1568, 140); 43c: 03c00593 li a1,60 440: 31000513 li a0,784 evo_anim = 30; // ~1.8 s celebratory banner 444: c4e18823 sb a4,-944(gp) # 2000004c beep(784, 60); beep(988, 60); beep(1175, 60); beep(1568, 140); 448: 35f9 jal 316 44a: 03c00593 li a1,60 44e: 3dc00513 li a0,988 452: 35d1 jal 316 454: 03c00593 li a1,60 458: 49700513 li a0,1175 45c: 3d6d jal 316 45e: 08c00593 li a1,140 462: 62000513 li a0,1568 466: 3d45 jal 316 led_blink(); } } 468: 4082 lw ra,0(sp) 46a: 0111 addi sp,sp,4 led_blink(); 46c: bf29 j 386 if (!pet.ascend) pet.ascend = (pet.health >= 60) ? 1 : 2; 46e: 00c786a3 sb a2,13(a5) pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; 472: 468d li a3,3 break; 474: b7c9 j 436 pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; 476: fac71fe3 bne a4,a2,434 47a: bfe5 j 472 47c: 8082 ret 0000047e : // Chirp once when a need first drops below 50% (gentle) or 20% (urgent), // re-arming only after it recovers. Audible even while the screen is off, // so it works as a "tend to me" reminder. static void notify(uint8_t idx, int8_t val) { 47e: 1141 addi sp,sp,-16 480: c422 sw s0,8(sp) 482: c606 sw ra,12(sp) 484: c226 sw s1,4(sp) if (val < 20) { 486: 474d li a4,19 { 488: 87aa mv a5,a0 if (val < 20) { 48a: c4c18413 addi s0,gp,-948 # 20000048 48e: 04b74463 blt a4,a1,4d6 if (!crit_flag[idx]) { // urgent: descending triple 492: 942a add s0,s0,a0 494: 00044703 lbu a4,0(s0) 498: eb15 bnez a4,4cc 49a: c02a sw a0,0(sp) beep(1568, 60); beep(1175, 60); beep(880, 90); 49c: 03c00593 li a1,60 4a0: 62000513 li a0,1568 4a4: 3d8d jal 316 4a6: 03c00593 li a1,60 4aa: 49700513 li a0,1175 4ae: 35a5 jal 316 4b0: 05a00593 li a1,90 4b4: 37000513 li a0,880 4b8: 3db9 jal 316 crit_flag[idx] = 1; warn_flag[idx] = 1; 4ba: 4782 lw a5,0(sp) 4bc: c4818713 addi a4,gp,-952 # 20000044 4c0: 4685 li a3,1 4c2: 97ba add a5,a5,a4 4c4: 00d40023 sb a3,0(s0) 4c8: 00d78023 sb a3,0(a5) } crit_flag[idx] = 0; } else { warn_flag[idx] = 0; crit_flag[idx] = 0; } } 4cc: 40b2 lw ra,12(sp) 4ce: 4422 lw s0,8(sp) 4d0: 4492 lw s1,4(sp) 4d2: 0141 addi sp,sp,16 4d4: 8082 ret } else if (val < 50) { 4d6: c4818493 addi s1,gp,-952 # 20000044 4da: 03100713 li a4,49 if (!warn_flag[idx]) { // gentle: single chirp 4de: 94aa add s1,s1,a0 } else if (val < 50) { 4e0: 02b74363 blt a4,a1,506 if (!warn_flag[idx]) { // gentle: single chirp 4e4: 0004c703 lbu a4,0(s1) 4e8: eb19 bnez a4,4fe 4ea: c02a sw a0,0(sp) beep(1568, 50); 4ec: 03200593 li a1,50 4f0: 62000513 li a0,1568 4f4: 350d jal 316 warn_flag[idx] = 1; 4f6: 4782 lw a5,0(sp) 4f8: 4705 li a4,1 4fa: 00e48023 sb a4,0(s1) warn_flag[idx] = 0; crit_flag[idx] = 0; 4fe: 943e add s0,s0,a5 500: 00040023 sb zero,0(s0) } 504: b7e1 j 4cc warn_flag[idx] = 0; crit_flag[idx] = 0; 506: 00048023 sb zero,0(s1) 50a: bfd5 j 4fe 0000050c : } } // ----------------------------------------------------------------- drawing static void draw_center_str(int y, const char *s) { 50c: 862e mv a2,a1 int len = 0; 50e: 4701 li a4,0 while (s[len]) len++; 510: 00e607b3 add a5,a2,a4 514: 0007c783 lbu a5,0(a5) 518: ef81 bnez a5,530 int x = (SSD1306_W - len * 8) / 2; 51a: 47c1 li a5,16 51c: 8f99 sub a5,a5,a4 51e: 078a slli a5,a5,0x2 if (x < 0) x = 0; 520: fff7c713 not a4,a5 524: 877d srai a4,a4,0x1f ssd1306_drawstr(x, y, s, 1); 526: 85aa mv a1,a0 528: 4685 li a3,1 52a: 00e7f533 and a0,a5,a4 52e: b1ed j 218 while (s[len]) len++; 530: 0705 addi a4,a4,1 532: bff9 j 510 00000534 : static Buttons read_buttons(void) { // active-low: pressed reads 0 Buttons b; b.ok = !funDigitalRead(BTN_OK); 534: 400117b7 lui a5,0x40011 538: 4788 lw a0,8(a5) b.left = !funDigitalRead(BTN_LEFT); 53a: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00> 53e: 4798 lw a4,8(a5) b.right = !funDigitalRead(BTN_RIGHT); 540: 479c lw a5,8(a5) b.ok = !funDigitalRead(BTN_OK); 542: fff54513 not a0,a0 b.left = !funDigitalRead(BTN_LEFT); 546: 8319 srli a4,a4,0x6 548: fff74713 not a4,a4 b.right = !funDigitalRead(BTN_RIGHT); 54c: 8395 srli a5,a5,0x5 54e: fff7c793 not a5,a5 return b; 552: 8b05 andi a4,a4,1 554: 8905 andi a0,a0,1 556: 0722 slli a4,a4,0x8 558: 8b85 andi a5,a5,1 { 55a: 1171 addi sp,sp,-4 return b; 55c: 07c2 slli a5,a5,0x10 55e: 8d59 or a0,a0,a4 } 560: 8d5d or a0,a0,a5 562: 0111 addi sp,sp,4 564: 8082 ret 00000566 : void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) 566: 87b2 mv a5,a2 568: 1131 addi sp,sp,-20 if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; 56a: fff78713 addi a4,a5,-1 void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) 56e: 8636 mv a2,a3 570: c806 sw ra,16(sp) 572: c622 sw s0,12(sp) 574: c426 sw s1,8(sp) if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; 576: 972a add a4,a4,a0 578: 07f00693 li a3,127 57c: 00e6f563 bgeu a3,a4,586 580: 08000793 li a5,128 584: 8f89 sub a5,a5,a0 586: 00f50433 add s0,a0,a5 while (w--) 58a: 00851763 bne a0,s0,598 } 58e: 40c2 lw ra,16(sp) 590: 4432 lw s0,12(sp) 592: 44a2 lw s1,8(sp) 594: 0151 addi sp,sp,20 596: 8082 ret ssd1306_drawPixel(x++, y, color); 598: 00150493 addi s1,a0,1 59c: c232 sw a2,4(sp) 59e: c02e sw a1,0(sp) 5a0: 36d5 jal 184 5a2: 4612 lw a2,4(sp) 5a4: 4582 lw a1,0(sp) 5a6: 8526 mv a0,s1 5a8: b7cd j 58a 000005aa : void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) 5aa: fd810113 addi sp,sp,-40 steep = (gfx_abs(y1 - y0) > gfx_abs(x1 - x0)); 5ae: 40b68333 sub t1,a3,a1 void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) 5b2: d022 sw s0,32(sp) 5b4: 8436 mv s0,a3 return (x<0) ? -x : x; 5b6: 41f35693 srai a3,t1,0x1f 5ba: 0066c333 xor t1,a3,t1 steep = (gfx_abs(y1 - y0) > gfx_abs(x1 - x0)); 5be: 40a602b3 sub t0,a2,a0 return (x<0) ? -x : x; 5c2: 40d30333 sub t1,t1,a3 5c6: 41f2d693 srai a3,t0,0x1f 5ca: 0056c2b3 xor t0,a3,t0 void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) 5ce: ce26 sw s1,28(sp) 5d0: d206 sw ra,36(sp) return (x<0) ? -x : x; 5d2: 40d282b3 sub t0,t0,a3 void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) 5d6: 84ae mv s1,a1 5d8: 87b2 mv a5,a2 if(steep) 5da: 0062c763 blt t0,t1,5e8 5de: 86a2 mv a3,s0 5e0: 84aa mv s1,a0 5e2: 8432 mv s0,a2 5e4: 87b6 mv a5,a3 5e6: 852e mv a0,a1 if(x0 > x1) 5e8: 00944863 blt s0,s1,5f8 5ec: 86be mv a3,a5 5ee: 87aa mv a5,a0 5f0: 8536 mv a0,a3 5f2: 86a2 mv a3,s0 5f4: 8426 mv s0,s1 5f6: 84b6 mv s1,a3 deltay = gfx_abs(y1 - y0); 5f8: 40f503b3 sub t2,a0,a5 return (x<0) ? -x : x; 5fc: 41f3d693 srai a3,t2,0x1f deltax = x1 - x0; 600: 40848733 sub a4,s1,s0 return (x<0) ? -x : x; 604: 0076c3b3 xor t2,a3,t2 608: 40d383b3 sub t2,t2,a3 error = deltax/2; 60c: 01f75693 srli a3,a4,0x1f 610: 96ba add a3,a3,a4 deltax = x1 - x0; 612: c23a sw a4,4(sp) ystep = -1; 614: 577d li a4,-1 616: c03a sw a4,0(sp) error = deltax/2; 618: 8685 srai a3,a3,0x1 if(y0 < y1) 61a: 00a7d463 bge a5,a0,622 ystep = 1; 61e: 4705 li a4,1 620: c03a sw a4,0(sp) for(x=x0;x<=x1;x++) 622: 0084d863 bge s1,s0,632 } 626: 5092 lw ra,36(sp) 628: 5402 lw s0,32(sp) 62a: 44f2 lw s1,28(sp) 62c: 02810113 addi sp,sp,40 630: 8082 ret 632: cc36 sw a3,24(sp) 634: ca1e sw t2,20(sp) 636: c816 sw t0,16(sp) 638: c61a sw t1,12(sp) ssd1306_drawPixel(y, x, color); 63a: 4601 li a2,0 if(steep) 63c: 0262d563 bge t0,t1,666 ssd1306_drawPixel(y, x, color); 640: 853e mv a0,a5 642: 85a2 mv a1,s0 644: c43e sw a5,8(sp) 646: 3e3d jal 184 648: 47a2 lw a5,8(sp) 64a: 4332 lw t1,12(sp) 64c: 42c2 lw t0,16(sp) 64e: 43d2 lw t2,20(sp) 650: 46e2 lw a3,24(sp) error = error - deltay; 652: 407686b3 sub a3,a3,t2 if(error < 0) 656: 0006d663 bgez a3,662 y = y + ystep; 65a: 4702 lw a4,0(sp) 65c: 97ba add a5,a5,a4 error = error + deltax; 65e: 4712 lw a4,4(sp) 660: 96ba add a3,a3,a4 for(x=x0;x<=x1;x++) 662: 0405 addi s0,s0,1 664: bf7d j 622 ssd1306_drawPixel(x, y, color); 666: 85be mv a1,a5 668: 8522 mv a0,s0 66a: c43e sw a5,8(sp) 66c: 3e21 jal 184 66e: 46e2 lw a3,24(sp) 670: 43d2 lw t2,20(sp) 672: 42c2 lw t0,16(sp) 674: 4332 lw t1,12(sp) 676: 47a2 lw a5,8(sp) 678: bfe9 j 652 0000067a : if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 67a: 07f00793 li a5,127 67e: 02a7cf63 blt a5,a0,6bc void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) 682: 1141 addi sp,sp,-16 684: c422 sw s0,8(sp) 686: c606 sw ra,12(sp) 688: c226 sw s1,4(sp) if((y+h-1) >= SSD1306_H) h = SSD1306_H-y; 68a: 00c587b3 add a5,a1,a2 68e: 04000713 li a4,64 692: 842e mv s0,a1 694: 00f75463 bge a4,a5,69c 698: 40b70633 sub a2,a4,a1 69c: 008604b3 add s1,a2,s0 while(h--) 6a0: 00941763 bne s0,s1,6ae } 6a4: 40b2 lw ra,12(sp) 6a6: 4422 lw s0,8(sp) 6a8: 4492 lw s1,4(sp) 6aa: 0141 addi sp,sp,16 6ac: 8082 ret ssd1306_drawPixel(x, y++, color); 6ae: 85a2 mv a1,s0 6b0: 4605 li a2,1 6b2: c02a sw a0,0(sp) 6b4: 3cc1 jal 184 6b6: 4502 lw a0,0(sp) 6b8: 0405 addi s0,s0,1 6ba: b7dd j 6a0 6bc: 8082 ret 000006be : void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) 6be: 1131 addi sp,sp,-20 6c0: c426 sw s1,8(sp) 6c2: 84b2 mv s1,a2 ssd1306_drawFastVLine(x, y, h, color); 6c4: 8636 mv a2,a3 void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) 6c6: c806 sw ra,16(sp) 6c8: c236 sw a3,4(sp) 6ca: c622 sw s0,12(sp) 6cc: c02e sw a1,0(sp) 6ce: 842a mv s0,a0 ssd1306_drawFastVLine(x, y, h, color); 6d0: 376d jal 67a ssd1306_drawFastVLine(x+w-1, y, h, color); 6d2: 4612 lw a2,4(sp) 6d4: 4582 lw a1,0(sp) 6d6: fff48513 addi a0,s1,-1 6da: 9522 add a0,a0,s0 6dc: 3f79 jal 67a 6de: 4582 lw a1,0(sp) 6e0: 4685 li a3,1 6e2: 8626 mv a2,s1 6e4: 8522 mv a0,s0 6e6: 3541 jal 566 ssd1306_drawFastHLine(x, y+h-1, w, color); 6e8: 4782 lw a5,0(sp) 6ea: fff78593 addi a1,a5,-1 6ee: 4792 lw a5,4(sp) 6f0: 95be add a1,a1,a5 if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 6f2: 03f00793 li a5,63 6f6: 00b7ea63 bltu a5,a1,70a 6fa: 8522 mv a0,s0 } 6fc: 4432 lw s0,12(sp) 6fe: 40c2 lw ra,16(sp) 700: 8626 mv a2,s1 702: 44a2 lw s1,8(sp) 704: 4685 li a3,1 706: 0151 addi sp,sp,20 708: bdb9 j 566 70a: 40c2 lw ra,16(sp) 70c: 4432 lw s0,12(sp) 70e: 44a2 lw s1,8(sp) 710: 0151 addi sp,sp,20 712: 8082 ret 00000714 : { 714: 1151 addi sp,sp,-12 716: c222 sw s0,4(sp) 718: c026 sw s1,0(sp) 71a: 842a mv s0,a0 71c: 84b2 mv s1,a2 ssd1306_drawstr(0, y, label, 1); 71e: 4685 li a3,1 720: 862e mv a2,a1 722: 85aa mv a1,a0 724: 4501 li a0,0 { 726: c406 sw ra,8(sp) ssd1306_drawstr(0, y, label, 1); 728: 3cc5 jal 218 ssd1306_drawRect(bx, y, bw, 7, 1); 72a: 03000513 li a0,48 72e: 469d li a3,7 730: 04c00613 li a2,76 734: 85a2 mv a1,s0 736: 3761 jal 6be int fill = (val * (bw - 2)) / 100; 738: 00349513 slli a0,s1,0x3 73c: 9526 add a0,a0,s1 73e: 050a slli a0,a0,0x2 740: 9526 add a0,a0,s1 742: 0506 slli a0,a0,0x1 if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 744: 06300793 li a5,99 748: 02a7d263 bge a5,a0,76c int fill = (val * (bw - 2)) / 100; 74c: 06400593 li a1,100 750: 3a81 jal a0 <__divsi3> if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 752: 4705 li a4,1 754: 00e405b3 add a1,s0,a4 } 758: 4412 lw s0,4(sp) 75a: 40a2 lw ra,8(sp) 75c: 4482 lw s1,0(sp) if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 75e: 0ff57613 zext.b a2,a0 762: 4695 li a3,5 764: 03100513 li a0,49 } 768: 0131 addi sp,sp,12 if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 76a: bc99 j 1c0 } 76c: 40a2 lw ra,8(sp) 76e: 4412 lw s0,4(sp) 770: 4482 lw s1,0(sp) 772: 0131 addi sp,sp,12 774: 8082 ret 00000776 : void ssd1306_drawImage(uint32_t x, uint32_t y, const unsigned char* input, uint32_t width, uint32_t height, uint32_t color_mode) { 776: fd810113 addi sp,sp,-40 77a: 00e587b3 add a5,a1,a4 77e: d222 sw s0,36(sp) 780: d026 sw s1,32(sp) 782: c82a sw a0,16(sp) 784: ca32 sw a2,20(sp) uint32_t bytes_to_draw = width / 8; 786: 0036d413 srli s0,a3,0x3 78a: c63e sw a5,12(sp) 78c: 4381 li t2,0 if (y_absolute >= SSD1306_H) { 78e: 03f00793 li a5,63 792: 08b7ed63 bltu a5,a1,82c uint32_t v_mask = 1 << (y_absolute & 7); 796: 0075f793 andi a5,a1,7 79a: 4705 li a4,1 79c: 00f717b3 sll a5,a4,a5 7a0: c03e sw a5,0(sp) uint32_t input_byte = input[byte + line * bytes_to_draw]; 7a2: 47d2 lw a5,20(sp) for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { 7a4: 4681 li a3,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; 7a6: 979e add a5,a5,t2 7a8: cc3e sw a5,24(sp) buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 7aa: 0035d793 srli a5,a1,0x3 7ae: 079e slli a5,a5,0x7 7b0: ce3e sw a5,28(sp) uint32_t input_byte = input[byte + line * bytes_to_draw]; 7b2: 47e2 lw a5,24(sp) x_absolute = x + 8 * byte + pixel; 7b4: 00369293 slli t0,a3,0x3 for (pixel = 0; pixel < 8; pixel++) { 7b8: 4701 li a4,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; 7ba: 97b6 add a5,a5,a3 7bc: 0007c783 lbu a5,0(a5) 7c0: c23e sw a5,4(sp) x_absolute = x + 8 * byte + pixel; 7c2: 47c2 lw a5,16(sp) 7c4: 92be add t0,t0,a5 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 7c6: 47f2 lw a5,28(sp) 7c8: 005784b3 add s1,a5,t0 if (x_absolute >= SSD1306_W) { 7cc: 00e287b3 add a5,t0,a4 7d0: 07f00613 li a2,127 7d4: 04f66463 bltu a2,a5,81c uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) 7d8: 4512 lw a0,4(sp) 7da: 08000793 li a5,128 7de: 40e7d7b3 sra a5,a5,a4 7e2: 8fe9 and a5,a5,a0 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 7e4: 00e48633 add a2,s1,a4 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 7e8: c6818513 addi a0,gp,-920 # 20000064 7ec: 9532 add a0,a0,a2 7ee: 00014303 lbu t1,0(sp) uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) 7f2: c43e sw a5,8(sp) ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 7f4: 00054783 lbu a5,0(a0) 7f8: fff34613 not a2,t1 for (pixel = 0; pixel < 8; pixel++) { 7fc: 0705 addi a4,a4,1 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 7fe: 8e7d and a2,a2,a5 800: 47a2 lw a5,8(sp) 802: 00f037b3 snez a5,a5 806: 40f007b3 neg a5,a5 80a: 00f37333 and t1,t1,a5 80e: 00666633 or a2,a2,t1 812: 00c50023 sb a2,0(a0) for (pixel = 0; pixel < 8; pixel++) { 816: 47a1 li a5,8 818: faf71ae3 bne a4,a5,7cc for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { 81c: 0685 addi a3,a3,1 # 40001 81e: f8d41ae3 bne s0,a3,7b2 for (uint32_t line = 0; line < height; line++) { 822: 47b2 lw a5,12(sp) 824: 0585 addi a1,a1,1 826: 93a2 add t2,t2,s0 828: f6b793e3 bne a5,a1,78e } 82c: 5412 lw s0,36(sp) 82e: 5482 lw s1,32(sp) 830: 02810113 addi sp,sp,40 834: 8082 ret 00000836 : uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) { int32_t timeout; // wait for not busy timeout = TIMEOUT_MAX; 836: 6761 lui a4,0x18 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); 838: 400057b7 lui a5,0x40005 timeout = TIMEOUT_MAX; 83c: 6a070713 addi a4,a4,1696 # 186a0 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); 840: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00> 844: 567d li a2,-1 846: 0187d683 lhu a3,24(a5) 84a: 8a89 andi a3,a3,2 84c: c2f9 beqz a3,912 84e: 177d addi a4,a4,-1 850: fec71be3 bne a4,a2,846 uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) 854: 1171 addi sp,sp,-4 856: c006 sw ra,0(sp) ssd1306_i2c_setup(); 858: 8d9ff0ef jal 130 // set STOP condition I2C1->CTLR1 |= I2C_CTLR1_STOP; // we're happy return 0; } 85c: 4082 lw ra,0(sp) return ssd1306_i2c_error(0); 85e: 4505 li a0,1 } 860: 0111 addi sp,sp,4 862: 8082 ret 864: 67e1 lui a5,0x18 866: 6a178793 addi a5,a5,1697 # 186a1 while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); 86a: 01475683 lhu a3,20(a4) 86e: 0806f693 andi a3,a3,128 872: e681 bnez a3,87a 874: 17fd addi a5,a5,-1 876: fbf5 bnez a5,86a 878: bff1 j 854 I2C1->DATAR = *data++; 87a: 00054783 lbu a5,0(a0) 87e: 0505 addi a0,a0,1 880: 00f71823 sh a5,16(a4) while(sz--) 884: feb510e3 bne a0,a1,864 timeout = TIMEOUT_MAX; 888: 66e1 lui a3,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 88a: 40005737 lui a4,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); 88e: 00070637 lui a2,0x70 timeout = TIMEOUT_MAX; 892: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 896: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); 89a: 08460613 addi a2,a2,132 # 70084 89e: 55fd li a1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 8a0: 01475503 lhu a0,20(a4) 8a4: 01875783 lhu a5,24(a4) 8a8: 07c2 slli a5,a5,0x10 8aa: 8fc9 or a5,a5,a0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); 8ac: 8ff1 and a5,a5,a2 8ae: 00c78663 beq a5,a2,8ba 8b2: 16fd addi a3,a3,-1 8b4: feb696e3 bne a3,a1,8a0 8b8: bf71 j 854 I2C1->CTLR1 |= I2C_CTLR1_STOP; 8ba: 00075783 lhu a5,0(a4) return 0; 8be: 4501 li a0,0 I2C1->CTLR1 |= I2C_CTLR1_STOP; 8c0: 2007e793 ori a5,a5,512 8c4: 00f71023 sh a5,0(a4) } 8c8: 8082 ret while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); 8ca: 40005737 lui a4,0x40005 8ce: 95aa add a1,a1,a0 8d0: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> 8d4: bf45 j 884 I2C1->DATAR = addr<<1; 8d6: 07800793 li a5,120 8da: 00f71823 sh a5,16(a4) timeout = TIMEOUT_MAX; 8de: 6661 lui a2,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 8e0: 400056b7 lui a3,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); 8e4: 00070737 lui a4,0x70 timeout = TIMEOUT_MAX; 8e8: 6a060613 addi a2,a2,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 8ec: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); 8f0: 08270713 addi a4,a4,130 # 70082 8f4: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 8f6: 0146d283 lhu t0,20(a3) 8fa: 0186d783 lhu a5,24(a3) 8fe: 07c2 slli a5,a5,0x10 900: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); 904: 8ff9 and a5,a5,a4 906: fce782e3 beq a5,a4,8ca 90a: 167d addi a2,a2,-1 90c: fe6615e3 bne a2,t1,8f6 910: b791 j 854 I2C1->CTLR1 |= I2C_CTLR1_START; 912: 0007d703 lhu a4,0(a5) timeout = TIMEOUT_MAX; 916: 66e1 lui a3,0x18 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); 918: 00030637 lui a2,0x30 I2C1->CTLR1 |= I2C_CTLR1_START; 91c: 10076713 ori a4,a4,256 920: 00e79023 sh a4,0(a5) uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 924: 40005737 lui a4,0x40005 timeout = TIMEOUT_MAX; 928: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 92c: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); 930: 0605 addi a2,a2,1 # 30001 932: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); 934: 01475283 lhu t0,20(a4) 938: 01875783 lhu a5,24(a4) 93c: 07c2 slli a5,a5,0x10 93e: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); 942: 8ff1 and a5,a5,a2 944: f8c789e3 beq a5,a2,8d6 948: 16fd addi a3,a3,-1 94a: fe6695e3 bne a3,t1,934 94e: b719 j 854 00000950 : { 950: fd810113 addi sp,sp,-40 /* build command or data packets */ if(cmd) { pkt[0] = 0; pkt[1] = *data; 954: 00a100a3 sb a0,1(sp) else { pkt[0] = 0x40; memcpy(&pkt[1], data, sz); } return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); 958: 4589 li a1,2 95a: 850a mv a0,sp 95c: d206 sw ra,36(sp) pkt[0] = 0; 95e: 00010023 sb zero,0(sp) return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); 962: 3dd1 jal 836 } 964: 5092 lw ra,36(sp) 966: 02810113 addi sp,sp,40 96a: 8082 ret 0000096c : asm volatile( "\n\ 96c: 20000197 auipc gp,0x20000 970: a9018193 addi gp,gp,-1392 # 200003fc <__global_pointer$> 974: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack> 978: 6509 lui a0,0x2 97a: 88050513 addi a0,a0,-1920 # 1880 97e: 30051073 csrw mstatus,a0 982: fffff697 auipc a3,0xfffff 986: 67e68693 addi a3,a3,1662 # 0 98a: 0036e693 ori a3,a3,3 98e: 30569073 csrw mtvec,a3 asm volatile( 992: c3018513 addi a0,gp,-976 # 2000002c 996: 06818593 addi a1,gp,104 # 20000464 <_ebss> 99a: 4601 li a2,0 99c: 00b55663 bge a0,a1,9a8 9a0: c110 sw a2,0(a0) 9a2: 0511 addi a0,a0,4 9a4: feb54ee3 blt a0,a1,9a0 9a8: 00002517 auipc a0,0x2 9ac: 4c850513 addi a0,a0,1224 # 2e70 <_data_lma> 9b0: c0418593 addi a1,gp,-1020 # 20000000 9b4: c3018613 addi a2,gp,-976 # 2000002c 9b8: 00c58863 beq a1,a2,9c8 9bc: 4114 lw a3,0(a0) 9be: c194 sw a3,0(a1) 9c0: 0511 addi a0,a0,4 9c2: 0591 addi a1,a1,4 9c4: fec59ae3 bne a1,a2,9b8 SysTick->CTLR = 1; 9c8: e000f7b7 lui a5,0xe000f 9cc: 4705 li a4,1 9ce: c398 sw a4,0(a5) asm volatile( 9d0: 6785 lui a5,0x1 9d2: ac878793 addi a5,a5,-1336 # ac8
9d6: 34179073 csrw mepc,a5 9da: 30200073 mret 000009de : asm volatile( "1: j 1b" ); 9de: a001 j 9de 000009e0 : RCC->INTR |= RCC_CSSC; // clear the clock security int flag 9e0: 40021737 lui a4,0x40021 9e4: 471c lw a5,8(a4) 9e6: 008006b7 lui a3,0x800 9ea: 8fd5 or a5,a5,a3 9ec: c71c sw a5,8(a4) 000009ee : WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; } 9ee: 962a add a2,a2,a0 9f0: 87aa mv a5,a0 9f2: 00c79363 bne a5,a2,9f8 9f6: 8082 ret 9f8: 00b78023 sb a1,0(a5) 9fc: 0785 addi a5,a5,1 9fe: bfd5 j 9f2 00000a00 : memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer)); a00: 40000613 li a2,1024 a04: 4581 li a1,0 a06: c6818513 addi a0,gp,-920 # 20000064 a0a: b7d5 j 9ee 00000a0c : for (; n; n--) *d++ = *s++; a0c: 4781 li a5,0 a0e: 00f61363 bne a2,a5,a14 } a12: 8082 ret for (; n; n--) *d++ = *s++; a14: 00f58733 add a4,a1,a5 a18: 00074683 lbu a3,0(a4) # 40021000 <_eusrstack+0x20020800> a1c: 00f50733 add a4,a0,a5 a20: 0785 addi a5,a5,1 a22: 00d70023 sb a3,0(a4) a26: b7e5 j a0e 00000a28 : { a28: 7179 addi sp,sp,-48 ssd1306_cmd(SSD1306_COLUMNADDR); a2a: 02100513 li a0,33 { a2e: d606 sw ra,44(sp) a30: d422 sw s0,40(sp) a32: d226 sw s1,36(sp) ssd1306_cmd(SSD1306_COLUMNADDR); a34: 3f31 jal 950 ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset) a36: 4501 li a0,0 a38: 3f21 jal 950 ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset) a3a: 07f00513 li a0,127 a3e: 3f09 jal 950 ssd1306_cmd(SSD1306_PAGEADDR); a40: 02200513 li a0,34 a44: 3731 jal 950 ssd1306_cmd(0); // Page start address (0 = reset) a46: 4501 li a0,0 a48: 3721 jal 950 ssd1306_cmd(7); // Page end address a4a: 451d li a0,7 a4c: c6818413 addi s0,gp,-920 # 20000064 a50: 3701 jal 950 for(i=0;i return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); a6a: 02100593 li a1,33 a6e: 850a mv a0,sp a70: 02040413 addi s0,s0,32 a74: 33c9 jal 836 a76: fe9410e3 bne s0,s1,a56 } a7a: 50b2 lw ra,44(sp) a7c: 5422 lw s0,40(sp) a7e: 5492 lw s1,36(sp) a80: 6145 addi sp,sp,48 a82: 8082 ret 00000a84 : //#define BASE_CTLR (((FUNCONF_HSITRIM) << 3) | HSEBYP | RCC_CSS) // disable HSI in HSE modes // Flash latency settings. #if defined(CH32V003) #if FUNCONF_SYSTEM_CORE_CLOCK > 25000000 FLASH->ACTLR = FLASH_ACTLR_LATENCY_1; // +1 Cycle Latency a84: 400227b7 lui a5,0x40022 a88: 4705 li a4,1 a8a: c398 sw a4,0(a5) #elif defined(FUNCONF_USE_HSI) && FUNCONF_USE_HSI #if defined(CH32V30x) || defined(CH32V20x) || defined(CH32L103) || defined(CH32V10x) EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; #endif #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL RCC->CFGR0 = BASE_CFGR0; a8c: 400217b7 lui a5,0x40021 RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. a90: 01080737 lui a4,0x1080 RCC->CFGR0 = BASE_CFGR0; a94: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. a98: 08170713 addi a4,a4,129 # 1080081 a9c: c398 sw a4,0(a5) FLASH->ACTLR = FLASH_ACTLR_LATENCY_0; #endif #endif #ifndef CH5xx RCC->INTR = 0x009F0000; // Clear PLL, CSSC, HSE, HSI and LSI ready flags. a9e: 009f0737 lui a4,0x9f0 aa2: c798 sw a4,8(a5) #endif #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL && !defined(CH5xx) while((RCC->CTLR & RCC_PLLRDY) == 0) {}; // Wait till PLL is ready aa4: 4398 lw a4,0(a5) aa6: 00671693 slli a3,a4,0x6 aaa: fe06dde3 bgez a3,aa4 #if defined(CH32H41x) RCC->PLLCFGR |= RCC_SYSPLL_GATE; #endif uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW aae: 43d8 lw a4,4(a5) RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source ab0: 400216b7 lui a3,0x40021 uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW ab4: 9b71 andi a4,a4,-4 RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source ab6: 00276713 ori a4,a4,2 aba: c3d8 sw a4,4(a5) while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source abc: 4721 li a4,8 abe: 42dc lw a5,4(a3) ac0: 8bb1 andi a5,a5,12 ac2: fee79ee3 bne a5,a4,abe SetupDebugPrintf(); #endif #if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS CallConstructors(); #endif } ac6: 8082 ret 00000ac8
: } } // ----------------------------------------------------------------- main int main(void) { ac8: f8410113 addi sp,sp,-124 acc: dc86 sw ra,120(sp) ace: daa2 sw s0,116(sp) ad0: d8a6 sw s1,112(sp) SystemInit(); ad2: 3f4d jal a84 funGpioInitAll(); ad4: 400214b7 lui s1,0x40021 ad8: 4c9c lw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); ada: 40011437 lui s0,0x40011 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); ade: 76fd lui a3,0xfffff funGpioInitAll(); ae0: 0357e793 ori a5,a5,53 ae4: cc9c sw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); ae6: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000> aea: 4398 lw a4,0(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); aec: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff> funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); af0: f1000637 lui a2,0xf1000 funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); af4: f0f77713 andi a4,a4,-241 af8: 01076713 ori a4,a4,16 afc: c398 sw a4,0(a5) funDigitalWrite(LED_PIN, FUN_LOW); afe: 00020737 lui a4,0x20 b02: cb98 sw a4,16(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); b04: 40040793 addi a5,s0,1024 b08: 4398 lw a4,0(a5) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); b0a: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff> gpio_setup(); Delay_Ms(120); // let the OLED rail settle b0c: 000b0537 lui a0,0xb0 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); b10: 8f75 and a4,a4,a3 b12: 10076713 ori a4,a4,256 b16: c398 sw a4,0(a5) funDigitalWrite(BUZZER, FUN_LOW); b18: 00040737 lui a4,0x40 b1c: cb98 sw a4,16(a5) funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); b1e: 4018 lw a4,0(s0) Delay_Ms(120); // let the OLED rail settle b20: c8050513 addi a0,a0,-896 # afc80 funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); b24: 9b41 andi a4,a4,-16 b26: 00876713 ori a4,a4,8 b2a: c018 sw a4,0(s0) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); b2c: 4398 lw a4,0(a5) b2e: 8f71 and a4,a4,a2 b30: 08000637 lui a2,0x8000 b34: 8f51 or a4,a4,a2 b36: c398 sw a4,0(a5) funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD); b38: 4398 lw a4,0(a5) b3a: ff100637 lui a2,0xff100 b3e: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff> b40: 8f71 and a4,a4,a2 b42: 00800637 lui a2,0x800 b46: 8f51 or a4,a4,a2 b48: c398 sw a4,0(a5) funDigitalWrite(BTN_OK, FUN_HIGH); b4a: 4705 li a4,1 b4c: c818 sw a4,16(s0) funDigitalWrite(BTN_LEFT, FUN_HIGH); b4e: 04000713 li a4,64 b52: cb98 sw a4,16(a5) funDigitalWrite(BTN_RIGHT, FUN_HIGH); b54: 02000713 li a4,32 b58: cb98 sw a4,16(a5) Delay_Ms(120); // let the OLED rail settle b5a: dc4ff0ef jal 11e * init I2C and GPIO */ uint8_t ssd1306_i2c_init(void) { // Enable GPIOC and I2C RCC->APB1PCENR |= RCC_APB1Periph_I2C1; b5e: 4cdc lw a5,28(s1) b60: 00200737 lui a4,0x200 b64: 8fd9 or a5,a5,a4 b66: ccdc sw a5,28(s1) funPinMode( PB6, GPIO_CFGLR_OUT_10Mhz_AF_OD ); funPinMode( PB7, GPIO_CFGLR_OUT_10Mhz_AF_OD ); #endif #else RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; b68: 4c9c lw a5,24(s1) // PC1 is SDA, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*1)); GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); // PC2 is SCL, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*2)); b6a: 777d lui a4,0xfffff b6c: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; b70: 0117e793 ori a5,a5,17 b74: cc9c sw a5,24(s1) GPIOC->CFGLR &= ~(0xf<<(4*1)); b76: 401c lw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); b78: 6705 lui a4,0x1 b7a: d0070713 addi a4,a4,-768 # d00 GPIOC->CFGLR &= ~(0xf<<(4*1)); b7e: f0f7f793 andi a5,a5,-241 b82: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); b84: 401c lw a5,0(s0) b86: 0d07e793 ori a5,a5,208 b8a: c01c sw a5,0(s0) GPIOC->CFGLR &= ~(0xf<<(4*2)); b8c: 401c lw a5,0(s0) b8e: 8ff5 and a5,a5,a3 b90: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); b92: 401c lw a5,0(s0) b94: 8fd9 or a5,a5,a4 b96: c01c sw a5,0(s0) ssd1306_setbuf(0); // initialize OLED #if !defined(SSD1306_CUSTOM_INIT_ARRAY) || !SSD1306_CUSTOM_INIT_ARRAY uint8_t *cmd_list = (uint8_t *)ssd1306_init_array; b98: 6409 lui s0,0x2 GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4); GPIOC->BSHR = (1<<(16+4)); #endif // load I2C regs ssd1306_i2c_setup(); b9a: d96ff0ef jal 130 b9e: 40440413 addi s0,s0,1028 # 2404 ssd1306_setbuf(0); ba2: 3db9 jal a00 while(*cmd_list != SSD1306_TERMINATE_CMDS) ba4: 00044503 lbu a0,0(s0) ba8: 0ff00793 li a5,255 bac: 00f51463 bne a0,a5,bb4 { if(ssd1306_cmd(*cmd_list++)) return 1; } ssd1306_refresh(); bb0: 3da5 jal a28 #endif return 0; bb2: a021 j bba if(ssd1306_cmd(*cmd_list++)) bb4: 0405 addi s0,s0,1 bb6: 3b69 jal 950 bb8: d575 beqz a0,ba4 ssd1306_setbuf(0); bba: 6489 lui s1,0x2 bbc: 3591 jal a00 for (uint8_t i = 0; i < 5; i++) { bbe: 42048493 addi s1,s1,1056 # 2420 ssd1306_setbuf(0); bc2: 4401 li s0,0 ssd1306_drawstr(0, i * 10, boot[i], 1); bc4: 4090 lw a2,0(s1) bc6: 4685 li a3,1 bc8: 85a2 mv a1,s0 bca: 4501 li a0,0 bcc: e4cff0ef jal 218 ssd1306_refresh(); bd0: 3da1 jal a28 beep(1200 + i * 120, 25); bd2: 00141513 slli a0,s0,0x1 bd6: 9522 add a0,a0,s0 bd8: 050a slli a0,a0,0x2 bda: 4b050513 addi a0,a0,1200 bde: 0542 slli a0,a0,0x10 be0: 8141 srli a0,a0,0x10 be2: 45e5 li a1,25 be4: f32ff0ef jal 316 Delay_Ms(220); be8: 00142537 lui a0,0x142 bec: 44050513 addi a0,a0,1088 # 142440 bf0: d2eff0ef jal 11e for (uint8_t i = 0; i < 5; i++) { bf4: 0429 addi s0,s0,10 bf6: 03200793 li a5,50 bfa: 0491 addi s1,s1,4 bfc: fcf414e3 bne s0,a5,bc4 draw_center_str(54, "press any key"); c00: 6589 lui a1,0x2 c02: 9a858593 addi a1,a1,-1624 # 19a8 c06: 03600513 li a0,54 c0a: 903ff0ef jal 50c ssd1306_refresh(); c0e: 3d29 jal a28 beep(988, 120); c10: 07800593 li a1,120 c14: 3dc00513 li a0,988 c18: efeff0ef jal 316 c1c: 0c800413 li s0,200 Buttons b = read_buttons(); c20: 915ff0ef jal 534 c24: 00855713 srli a4,a0,0x8 c28: 01055793 srli a5,a0,0x10 c2c: 02e10ea3 sb a4,61(sp) if (b.ok || b.left || b.right) break; c30: 8f49 or a4,a4,a0 Buttons b = read_buttons(); c32: 02f10f23 sb a5,62(sp) if (b.ok || b.left || b.right) break; c36: 8fd9 or a5,a5,a4 Buttons b = read_buttons(); c38: 02a10e23 sb a0,60(sp) if (b.ok || b.left || b.right) break; c3c: 0ff7f793 zext.b a5,a5 c40: eb81 bnez a5,c50 Delay_Ms(20); c42: 6575 lui a0,0x1d c44: 4c050513 addi a0,a0,1216 # 1d4c0 for (int i = 0; i < 200; i++) { c48: 147d addi s0,s0,-1 Delay_Ms(20); c4a: cd4ff0ef jal 11e for (int i = 0; i < 200; i++) { c4e: f869 bnez s0,c20 while (1) { led_blink(); Delay_Ms(700); } } ssd1306_init(); splash(); screen = SCR_SELECT; // pick a species before a pet is born c50: c4018223 sb zero,-956(gp) # 20000040 Buttons prev = {0, 0, 0}; c54: 4701 li a4,0 c56: 4481 li s1,0 c58: 4401 li s0,0 c5a: c23a sw a4,4(sp) while (1) { Buttons b = read_buttons(); c5c: 8d9ff0ef jal 534 c60: 01055793 srli a5,a0,0x10 c64: 0ff57713 zext.b a4,a0 c68: cc3a sw a4,24(sp) c6a: 02f10923 sb a5,50(sp) c6e: 0ff7f793 zext.b a5,a5 c72: 00855693 srli a3,a0,0x8 c76: ce3e sw a5,28(sp) uint8_t ok_edge = b.ok && !prev.ok; c78: 47e2 lw a5,24(sp) Buttons b = read_buttons(); c7a: 0ff6f713 zext.b a4,a3 c7e: ca3a sw a4,20(sp) c80: 02a10823 sb a0,48(sp) c84: 02d108a3 sb a3,49(sp) uint8_t ok_edge = b.ok && !prev.ok; c88: c002 sw zero,0(sp) c8a: 4712 lw a4,4(sp) c8c: c781 beqz a5,c94 c8e: 00143793 seqz a5,s0 c92: c03e sw a5,0(sp) uint8_t left_edge = b.left && !prev.left; c94: 46d2 lw a3,20(sp) uint8_t ok_edge = b.ok && !prev.ok; c96: 00014783 lbu a5,0(sp) uint8_t left_edge = b.left && !prev.left; c9a: 4581 li a1,0 c9c: c299 beqz a3,ca2 c9e: 0014b593 seqz a1,s1 uint8_t right_edge = b.right && !prev.right; ca2: 4572 lw a0,28(sp) uint8_t left_edge = b.left && !prev.left; ca4: 0ff5f613 zext.b a2,a1 uint8_t right_edge = b.right && !prev.right; ca8: 4681 li a3,0 caa: c119 beqz a0,cb0 cac: 00173693 seqz a3,a4 uint8_t any_edge = ok_edge | left_edge | right_edge; cb0: 8fd1 or a5,a5,a2 cb2: 8fd5 or a5,a5,a3 prev = b; if (any_edge) idle_frames = 0; cb4: c399 beqz a5,cba cb6: c401a023 sw zero,-960(gp) # 2000003c if (!disp_on) { cba: c051c703 lbu a4,-1019(gp) # 20000001 cbe: eb35 bnez a4,d32 // screen is asleep: the first press only wakes it (not an action) if (any_edge) { cc0: c799 beqz a5,cce ssd1306_cmd(SSD1306_DISPLAYON); cc2: 0af00513 li a0,175 cc6: 3169 jal 950 disp_on = 1; cc8: 4785 li a5,1 cca: c0f182a3 sb a5,-1019(gp) # 20000001 ssd1306_cmd(SSD1306_DISPLAYOFF); disp_on = 0; } } if (anim_timer) anim_timer--; cce: c3a1c783 lbu a5,-966(gp) # 20000036 cd2: c781 beqz a5,cda cd4: 17fd addi a5,a5,-1 cd6: c2f18d23 sb a5,-966(gp) # 20000036 if (evo_anim) evo_anim--; cda: c501c783 lbu a5,-944(gp) # 2000004c cde: c781 beqz a5,ce6 ce0: 17fd addi a5,a5,-1 ce2: c4f18823 sb a5,-944(gp) # 2000004c // advance game time independent of screen / display state if (pet.alive && ++tick_acc >= TICK_FRAMES) { ce6: c5418793 addi a5,gp,-940 # 20000050 cea: 0107c783 lbu a5,16(a5) cee: c5418413 addi s0,gp,-940 # 20000050 cf2: cf81 beqz a5,d0a cf4: c381d783 lhu a5,-968(gp) # 20000034 cf8: 0f900693 li a3,249 cfc: 0785 addi a5,a5,1 cfe: 07c2 slli a5,a5,0x10 d00: 83c1 srli a5,a5,0x10 d02: 24f6e7e3 bltu a3,a5,1750 d06: c2f19c23 sh a5,-968(gp) # 20000034 tick_acc = 0; game_tick(); } frame++; d0a: c341a783 lw a5,-972(gp) # 20000030 idle_frames++; Delay_Ms(FRAME_MS); d0e: 00058537 lui a0,0x58 d12: e4050513 addi a0,a0,-448 # 57e40 frame++; d16: 0785 addi a5,a5,1 d18: c2f1aa23 sw a5,-972(gp) # 20000030 idle_frames++; d1c: c401a783 lw a5,-960(gp) # 2000003c d20: 0785 addi a5,a5,1 d22: c4f1a023 sw a5,-960(gp) # 2000003c Delay_Ms(FRAME_MS); d26: bf8ff0ef jal 11e prev = b; d2a: 4772 lw a4,28(sp) d2c: 44d2 lw s1,20(sp) d2e: 4462 lw s0,24(sp) while (1) { d30: b72d j c5a switch (screen) { d32: c441c703 lbu a4,-956(gp) # 20000040 d36: 4611 li a2,4 d38: 7ee66963 bltu a2,a4,152a d3c: 6609 lui a2,0x2 d3e: 070a slli a4,a4,0x2 d40: b7460613 addi a2,a2,-1164 # 1b74 d44: 9732 add a4,a4,a2 d46: 4318 lw a4,0(a4) d48: 8702 jr a4 if (left_edge) { d4a: c185 beqz a1,d6a sel_species = (sel_species + SPECIES_COUNT - 1) % SPECIES_COUNT; d4c: c3d1c503 lbu a0,-963(gp) # 20000039 d50: 458d li a1,3 d52: c236 sw a3,4(sp) d54: 0509 addi a0,a0,2 d56: ba2ff0ef jal f8 <__modsi3> d5a: c2a18ea3 sb a0,-963(gp) # 20000039 beep(1047, 25); d5e: 45e5 li a1,25 d60: 41700513 li a0,1047 d64: db2ff0ef jal 316 d68: 4692 lw a3,4(sp) if (right_edge) { d6a: ce91 beqz a3,d86 sel_species = (sel_species + 1) % SPECIES_COUNT; d6c: c3d1c503 lbu a0,-963(gp) # 20000039 d70: 458d li a1,3 d72: 0505 addi a0,a0,1 d74: b84ff0ef jal f8 <__modsi3> d78: c2a18ea3 sb a0,-963(gp) # 20000039 beep(1047, 25); d7c: 45e5 li a1,25 d7e: 41700513 li a0,1047 d82: d94ff0ef jal 316 if (ok_edge) { // born! boot the chosen species d86: 4782 lw a5,0(sp) d88: c3b5 beqz a5,dec pet.satiety = 80; d8a: 645a5737 lui a4,0x645a5 d8e: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850> d92: c4e1aa23 sw a4,-940(gp) # 20000050 pet.health = 100; d96: c5418793 addi a5,gp,-940 # 20000050 d9a: 06400713 li a4,100 d9e: 00e78223 sb a4,4(a5) pet.species = sel_species; da2: c3d1c703 lbu a4,-963(gp) # 20000039 pet.age_min = 0; da6: 00079323 sh zero,6(a5) pet.xp = 0; daa: 00079423 sh zero,8(a5) pet.species = sel_species; dae: 00e78523 sb a4,10(a5) pet.level = 1; db2: 4705 li a4,1 db4: 00e785a3 sb a4,11(a5) pet.form = FORM_PROC; db8: 0007a623 sw zero,12(a5) pet.alive = 1; dbc: 00e78823 sb a4,16(a5) cursor = 0; dc0: c2018e23 sb zero,-964(gp) # 20000038 evo_anim = 0; dc4: c4018823 sb zero,-944(gp) # 2000004c for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } dc8: c401a423 sw zero,-952(gp) # 20000044 beep(659, 80); beep(988, 120); dcc: 05000593 li a1,80 dd0: 29300513 li a0,659 screen = SCR_MAIN; dd4: c4e18223 sb a4,-956(gp) # 20000040 for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } dd8: c401a623 sw zero,-948(gp) # 20000048 beep(659, 80); beep(988, 120); ddc: d3aff0ef jal 316 de0: 07800593 li a1,120 de4: 3dc00513 li a0,988 de8: d2eff0ef jal 316 ssd1306_setbuf(0); dec: 3911 jal a00 draw_center_str(0, "~ $ adopt --pet"); dee: 6589 lui a1,0x2 df0: 9b858593 addi a1,a1,-1608 # 19b8 df4: 4501 li a0,0 df6: f16ff0ef jal 50c if((x >= SSD1306_W) || (y >= SSD1306_H)) return; dfa: 4685 li a3,1 dfc: 08000613 li a2,128 e00: 45a9 li a1,10 e02: 4501 li a0,0 e04: f62ff0ef jal 566 ssd1306_drawImage(48, 13, species_frames[sel_species][EXP_IDLE], e08: c3d1c403 lbu s0,-963(gp) # 20000039 e0c: 6789 lui a5,0x2 e0e: 54078793 addi a5,a5,1344 # 2540 e12: 00341713 slli a4,s0,0x3 e16: 8f01 sub a4,a4,s0 e18: 070a slli a4,a4,0x2 e1a: 97ba add a5,a5,a4 e1c: 4390 lw a2,0(a5) e1e: 02000713 li a4,32 e22: 86ba mv a3,a4 e24: 45b5 li a1,13 e26: 03000513 li a0,48 e2a: 94dff0ef jal 776 p = s_cat(p, "< "); e2e: 6589 lui a1,0x2 e30: 9c858593 addi a1,a1,-1592 # 19c8 e34: 1868 addi a0,sp,60 e36: c6eff0ef jal 2a4 p = s_cat(p, species_names[sel_species]); e3a: 6789 lui a5,0x2 e3c: 040a slli s0,s0,0x2 e3e: 43478793 addi a5,a5,1076 # 2434 e42: 97a2 add a5,a5,s0 e44: 438c lw a1,0(a5) e46: c5eff0ef jal 2a4 p = s_cat(p, " >"); e4a: 6589 lui a1,0x2 e4c: 9cc58593 addi a1,a1,-1588 # 19cc e50: c54ff0ef jal 2a4 *p = 0; e54: 00050023 sb zero,0(a0) draw_center_str(47, line); e58: 186c addi a1,sp,60 e5a: 02f00513 li a0,47 e5e: eaeff0ef jal 50c draw_center_str(56, "L/R pick OK go"); e62: 6589 lui a1,0x2 e64: 9d058593 addi a1,a1,-1584 # 19d0 draw_center_str(56, "OK: respawn"); e68: 03800513 li a0,56 e6c: a98d j 12de if (left_edge) { e6e: c185 beqz a1,e8e cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; e70: c3c1c503 lbu a0,-964(gp) # 20000038 e74: 459d li a1,7 e76: c236 sw a3,4(sp) e78: 0519 addi a0,a0,6 e7a: a7eff0ef jal f8 <__modsi3> e7e: c2a18e23 sb a0,-964(gp) # 20000038 beep(1047, 25); e82: 45e5 li a1,25 e84: 41700513 li a0,1047 e88: c8eff0ef jal 316 e8c: 4692 lw a3,4(sp) if (right_edge) { e8e: ce91 beqz a3,eaa cursor = (cursor + 1) % ICON_COUNT; e90: c3c1c503 lbu a0,-964(gp) # 20000038 e94: 459d li a1,7 e96: 0505 addi a0,a0,1 e98: a60ff0ef jal f8 <__modsi3> e9c: c2a18e23 sb a0,-964(gp) # 20000038 beep(1047, 25); ea0: 45e5 li a1,25 ea2: 41700513 li a0,1047 ea6: c70ff0ef jal 316 if (ok_edge) do_action(cursor); eaa: 4782 lw a5,0(sp) eac: c5418493 addi s1,gp,-940 # 20000050 eb0: 0e078e63 beqz a5,fac switch (act) { eb4: c3c1c783 lbu a5,-964(gp) # 20000038 eb8: 4699 li a3,6 eba: 0ef6e963 bltu a3,a5,fac ebe: 6689 lui a3,0x2 ec0: 078a slli a5,a5,0x2 ec2: b8868693 addi a3,a3,-1144 # 1b88 ec6: 97b6 add a5,a5,a3 ec8: 439c lw a5,0(a5) eca: 8782 jr a5 pet.satiety = clamp100(pet.satiety + 30); ecc: 00048783 lb a5,0(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } ed0: 06400713 li a4,100 pet.satiety = clamp100(pet.satiety + 30); ed4: 07f9 addi a5,a5,30 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } ed6: 04f75563 bge a4,a5,f20 eda: 87ba mv a5,a4 edc: 00f48023 sb a5,0(s1) pet.hygiene = clamp100(pet.hygiene - 5); ee0: 00348783 lb a5,3(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } ee4: 06400713 li a4,100 pet.hygiene = clamp100(pet.hygiene - 5); ee8: 17ed addi a5,a5,-5 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } eea: 04f75063 bge a4,a5,f2a eee: 87ba mv a5,a4 ef0: 00f481a3 sb a5,3(s1) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } ef4: 4411 li s0,4 ef6: c2818823 sb s0,-976(gp) # 2000002c efa: 4731 li a4,12 beep(880, 60); beep(1175, 80); efc: 03c00593 li a1,60 f00: 37000513 li a0,880 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } f04: c2e18d23 sb a4,-966(gp) # 20000036 beep(880, 60); beep(1175, 80); f08: c0eff0ef jal 316 f0c: 05000593 li a1,80 f10: 49700513 li a0,1175 beep(784, 60); beep(1047, 60); beep(1319, 90); f14: c02ff0ef jal 316 led_blink(); f18: c6eff0ef jal 386 add_xp(4); f1c: 4511 li a0,4 f1e: a069 j fa8 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } f20: fff7c713 not a4,a5 f24: 877d srai a4,a4,0x1f f26: 8ff9 and a5,a5,a4 f28: bf55 j edc f2a: fff7c713 not a4,a5 f2e: 877d srai a4,a4,0x1f f30: 8ff9 and a5,a5,a4 f32: bf7d j ef0 if (pet.energy < 15) { beep(220, 120); break; } // too tired f34: 00248703 lb a4,2(s1) f38: 47b9 li a5,14 f3a: 00e7c963 blt a5,a4,f4c f3e: 07800593 li a1,120 f42: 0dc00513 li a0,220 beep(659, 40); f46: bd0ff0ef jal 316 break; f4a: a08d j fac pet.happy = clamp100(pet.happy + 25); f4c: 00148783 lb a5,1(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } f50: 06400693 li a3,100 pet.happy = clamp100(pet.happy + 25); f54: 07e5 addi a5,a5,25 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } f56: 38f6d763 bge a3,a5,12e4 f5a: 87b6 mv a5,a3 f5c: 00f480a3 sb a5,1(s1) pet.energy = clamp100(pet.energy - 12); f60: ff470793 addi a5,a4,-12 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } f64: 06400713 li a4,100 f68: 00f75363 bge a4,a5,f6e f6c: 87ba mv a5,a4 f6e: 00f48123 sb a5,2(s1) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } f72: 4709 li a4,2 f74: c2e18823 sb a4,-976(gp) # 2000002c beep(988, 60); beep(1319, 60); beep(1568, 90); f78: 03c00593 li a1,60 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } f7c: 4731 li a4,12 beep(988, 60); beep(1319, 60); beep(1568, 90); f7e: 3dc00513 li a0,988 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } f82: c2e18d23 sb a4,-966(gp) # 20000036 beep(988, 60); beep(1319, 60); beep(1568, 90); f86: b90ff0ef jal 316 f8a: 03c00593 li a1,60 f8e: 52700513 li a0,1319 f92: b84ff0ef jal 316 f96: 62000513 li a0,1568 f9a: 05a00593 li a1,90 f9e: b78ff0ef jal 316 led_blink(); fa2: be4ff0ef jal 386 add_xp(6); fa6: 4519 li a0,6 add_xp(4); fa8: c08ff0ef jal 3b0 ssd1306_setbuf(0); fac: a55ff0ef jal a00 draw_center_str(0, menu_labels[cursor]); fb0: c3c1c783 lbu a5,-964(gp) # 20000038 fb4: 4501 li a0,0 fb6: d03e sw a5,32(sp) fb8: 5702 lw a4,32(sp) fba: 6789 lui a5,0x2 fbc: 5c478793 addi a5,a5,1476 # 25c4 fc0: 070a slli a4,a4,0x2 fc2: 97ba add a5,a5,a4 fc4: 438c lw a1,0(a5) fc6: d46ff0ef jal 50c if (pet.alive && pet.health < 30 && (frame & 8)) fca: 0104c783 lbu a5,16(s1) fce: c83e sw a5,16(sp) fd0: c395 beqz a5,ff4 fd2: 00448703 lb a4,4(s1) fd6: 47f5 li a5,29 fd8: 00e7ce63 blt a5,a4,ff4 fdc: c341a783 lw a5,-972(gp) # 20000030 fe0: 8ba1 andi a5,a5,8 fe2: cb89 beqz a5,ff4 ssd1306_drawstr(0, 0, "!", 1); fe4: 6609 lui a2,0x2 fe6: 4685 li a3,1 fe8: 9e060613 addi a2,a2,-1568 # 19e0 fec: 4581 li a1,0 fee: 4501 li a0,0 ff0: a28ff0ef jal 218 bp = u_cat(bp, pet.level); ff4: 00b4c583 lbu a1,11(s1) *bp++ = 'L'; ff8: 04c00793 li a5,76 bp = u_cat(bp, pet.level); ffc: 03510513 addi a0,sp,53 *bp++ = 'L'; 1000: 02f10a23 sb a5,52(sp) bp = u_cat(bp, pet.level); 1004: ab2ff0ef jal 2b6 *bp = 0; 1008: 00050023 sb zero,0(a0) ssd1306_drawstr(SSD1306_W - 2 * 8, 0, badge, 1); 100c: 4685 li a3,1 100e: 1850 addi a2,sp,52 1010: 4581 li a1,0 1012: 07000513 li a0,112 1016: a02ff0ef jal 218 101a: 4685 li a3,1 101c: 08000613 li a2,128 1020: 45a9 li a1,10 1022: 4501 li a0,0 1024: d42ff0ef jal 566 if (pet.sleeping) { 1028: 00f4c403 lbu s0,15(s1) 102c: 38040463 beqz s0,13b4 ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1); 1030: 6609 lui a2,0x2 1032: 4685 li a3,1 1034: 9e460613 addi a2,a2,-1564 # 19e4 1038: 45b9 li a1,14 103a: 04e00513 li a0,78 103e: 9daff0ef jal 218 ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1); 1042: 6609 lui a2,0x2 1044: 4685 li a3,1 1046: 9e860613 addi a2,a2,-1560 # 19e8 104a: 45b1 li a1,12 104c: 05400513 li a0,84 1050: 9c8ff0ef jal 218 1054: 03000793 li a5,48 1058: c43e sw a5,8(sp) px = 48; py = 16; 105a: 47c1 li a5,16 105c: c03e sw a5,0(sp) 105e: 03000793 li a5,48 1062: c23e sw a5,4(sp) if (pet.form == FORM_CLAUDE) spr = spr_claude; 1064: 00c4c783 lbu a5,12(s1) 1068: 6609 lui a2,0x2 106a: 4c060613 addi a2,a2,1216 # 24c0 106e: c63e sw a5,12(sp) 1070: 4732 lw a4,12(sp) 1072: 478d li a5,3 1074: 02f70b63 beq a4,a5,10aa else if (pet.form == FORM_GLITCH) spr = spr_glitch; 1078: 46b2 lw a3,12(sp) 107a: 4711 li a4,4 107c: 3ae68663 beq a3,a4,1428 if (!pet.alive) return EXP_DEAD; 1080: 4742 lw a4,16(sp) else spr = species_frames[pet.species][current_expression()]; 1082: 00a4c683 lbu a3,10(s1) if (!pet.alive) return EXP_DEAD; 1086: 4519 li a0,6 1088: c719 beqz a4,1096 if (anim_timer) return anim_exp; 108a: c3a1c703 lbu a4,-966(gp) # 20000036 108e: 34070f63 beqz a4,13ec 1092: c301c503 lbu a0,-976(gp) # 2000002c else spr = species_frames[pet.species][current_expression()]; 1096: 00369793 slli a5,a3,0x3 109a: 8f95 sub a5,a5,a3 109c: 6709 lui a4,0x2 109e: 97aa add a5,a5,a0 10a0: 078a slli a5,a5,0x2 10a2: 54070713 addi a4,a4,1344 # 2540 10a6: 97ba add a5,a5,a4 10a8: 4390 lw a2,0(a5) ssd1306_drawImage(x, y, spr, PANA_W, PANA_H, 0); 10aa: 4582 lw a1,0(sp) 10ac: 4522 lw a0,8(sp) 10ae: 02000713 li a4,32 10b2: 86ba mv a3,a4 10b4: c832 sw a2,16(sp) 10b6: ec0ff0ef jal 776 if (spr != spr_claude && spr != spr_glitch && !pet.sleeping) 10ba: 4642 lw a2,16(sp) 10bc: 6789 lui a5,0x2 10be: 4c078793 addi a5,a5,1216 # 24c0 10c2: 10f60f63 beq a2,a5,11e0 10c6: 6789 lui a5,0x2 10c8: 44078793 addi a5,a5,1088 # 2440 10cc: 10f60a63 beq a2,a5,11e0 10d0: 10041863 bnez s0,11e0 if (pet.form >= FORM_USER) { // shades 10d4: 47b2 lw a5,12(sp) 10d6: 14078263 beqz a5,121a uint8_t cy = eye_cy[sp], lx = eye_lx[sp], rx = eye_rx[sp]; 10da: 00a4c703 lbu a4,10(s1) 10de: c0c18793 addi a5,gp,-1012 # 20000008 10e2: 97ba add a5,a5,a4 10e4: 0007c403 lbu s0,0(a5) 10e8: c1418693 addi a3,gp,-1004 # 20000010 10ec: c1018793 addi a5,gp,-1008 # 2000000c 10f0: 97ba add a5,a5,a4 10f2: 9736 add a4,a4,a3 ssd1306_fillRect(x + lx - 3, y + cy - 2, 7, 4, 0); 10f4: 0007c303 lbu t1,0(a5) 10f8: 00074703 lbu a4,0(a4) 10fc: 4682 lw a3,0(sp) 10fe: 4792 lw a5,4(sp) 1100: 461d li a2,7 1102: 00d702b3 add t0,a4,a3 1106: 979a add a5,a5,t1 1108: ffe28593 addi a1,t0,-2 110c: ffd78513 addi a0,a5,-3 1110: 4701 li a4,0 1112: 4691 li a3,4 1114: d61a sw t1,44(sp) 1116: d416 sw t0,40(sp) 1118: d22e sw a1,36(sp) 111a: c83e sw a5,16(sp) 111c: 8a4ff0ef jal 1c0 ssd1306_fillRect(x + rx - 3, y + cy - 2, 7, 4, 0); 1120: 4792 lw a5,4(sp) 1122: 5592 lw a1,36(sp) 1124: 4701 li a4,0 1126: 00878533 add a0,a5,s0 112a: 461d li a2,7 112c: 4691 li a3,4 112e: 1575 addi a0,a0,-3 1130: 890ff0ef jal 1c0 if (rx - lx > 7) 1134: 5332 lw t1,44(sp) 1136: 471d li a4,7 1138: 47c2 lw a5,16(sp) 113a: 40640633 sub a2,s0,t1 113e: 52a2 lw t0,40(sp) 1140: 02c75263 bge a4,a2,1164 ssd1306_drawFastHLine(x + lx + 4, y + cy - 1, rx - lx - 7, 0); 1144: 00478513 addi a0,a5,4 1148: 07f00793 li a5,127 114c: 00a7cc63 blt a5,a0,1164 1150: fff28593 addi a1,t0,-1 1154: 03f00793 li a5,63 1158: 00b7c663 blt a5,a1,1164 115c: 4681 li a3,0 115e: 1665 addi a2,a2,-7 1160: c06ff0ef jal 566 if (pet.form >= FORM_ROOT) { // gaming headset + mic boom 1164: 4732 lw a4,12(sp) 1166: 4785 li a5,1 1168: 0af70963 beq a4,a5,121a ssd1306_drawLine(x + 3, y + 10, x + 9, y + 2, 0); 116c: 4792 lw a5,4(sp) 116e: 078d addi a5,a5,3 1170: d23e sw a5,36(sp) 1172: 4782 lw a5,0(sp) 1174: 5512 lw a0,36(sp) 1176: 00a78413 addi s0,a5,10 117a: 4792 lw a5,4(sp) 117c: 85a2 mv a1,s0 117e: 07a5 addi a5,a5,9 1180: d43e sw a5,40(sp) 1182: 4782 lw a5,0(sp) 1184: 5622 lw a2,40(sp) 1186: 0789 addi a5,a5,2 1188: 86be mv a3,a5 118a: c83e sw a5,16(sp) 118c: c1eff0ef jal 5aa ssd1306_drawLine(x + 9, y + 2, x + 23, y + 2, 0); 1190: 4792 lw a5,4(sp) 1192: 46c2 lw a3,16(sp) 1194: 5522 lw a0,40(sp) 1196: 07dd addi a5,a5,23 1198: 863e mv a2,a5 119a: 85b6 mv a1,a3 119c: d63e sw a5,44(sp) 119e: c0cff0ef jal 5aa ssd1306_drawLine(x + 23, y + 2, x + 29, y + 10, 0); 11a2: 4792 lw a5,4(sp) 11a4: 45c2 lw a1,16(sp) 11a6: 5532 lw a0,44(sp) 11a8: 01d78613 addi a2,a5,29 11ac: 86a2 mv a3,s0 11ae: bfcff0ef jal 5aa ssd1306_fillRect(x + 1, y + 12, 4, 7, 0); 11b2: 4782 lw a5,0(sp) 11b4: 469d li a3,7 11b6: 4611 li a2,4 11b8: 00c78593 addi a1,a5,12 11bc: 4792 lw a5,4(sp) 11be: 4701 li a4,0 11c0: 00178513 addi a0,a5,1 11c4: ffdfe0ef jal 1c0 ssd1306_drawLine(x + 3, y + 18, x + 10, y + 24, 0); 11c8: 4782 lw a5,0(sp) 11ca: 5512 lw a0,36(sp) 11cc: 01878693 addi a3,a5,24 11d0: 4792 lw a5,4(sp) 11d2: 00a78613 addi a2,a5,10 11d6: 4782 lw a5,0(sp) 11d8: 01278593 addi a1,a5,18 11dc: bceff0ef jal 5aa if (pet.form == FORM_CLAUDE) { 11e0: 4732 lw a4,12(sp) 11e2: 478d li a5,3 11e4: 02f71b63 bne a4,a5,121a ssd1306_drawPixel(x - 2 + (frame & 3), y + 4, 1); 11e8: c341a403 lw s0,-972(gp) # 20000030 11ec: 4782 lw a5,0(sp) 11ee: 4605 li a2,1 11f0: 00347513 andi a0,s0,3 11f4: 00478593 addi a1,a5,4 11f8: 47a2 lw a5,8(sp) 11fa: 1579 addi a0,a0,-2 11fc: 953e add a0,a0,a5 11fe: f87fe0ef jal 184 ssd1306_drawPixel(x + PANA_W + (frame & 1), y + 10, 1); 1202: 4782 lw a5,0(sp) 1204: 00147513 andi a0,s0,1 1208: 02050513 addi a0,a0,32 120c: 00a78593 addi a1,a5,10 1210: 47a2 lw a5,8(sp) 1212: 4605 li a2,1 1214: 953e add a0,a0,a5 1216: f6ffe0ef jal 184 121a: 4685 li a3,1 121c: 08000613 li a2,128 1220: 02e00593 li a1,46 1224: 4501 li a0,0 1226: b40ff0ef jal 566 for (uint8_t i = 0; i < pet.poop; i++) 122a: 4401 li s0,0 122c: 00e4c783 lbu a5,14(s1) 1230: 20f46063 bltu s0,a5,1430 1234: 4401 li s0,0 ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); 1236: 6709 lui a4,0x2 1238: 59470713 addi a4,a4,1428 # 2594 123c: 00241793 slli a5,s0,0x2 1240: 97ba add a5,a5,a4 1242: 00341493 slli s1,s0,0x3 1246: 4390 lw a2,0(a5) 1248: 94a2 add s1,s1,s0 124a: 4741 li a4,16 124c: 0486 slli s1,s1,0x1 124e: 86ba mv a3,a4 1250: 03000593 li a1,48 1254: 00148513 addi a0,s1,1 1258: d1eff0ef jal 776 if (i == cursor) 125c: 5702 lw a4,32(sp) 125e: 0ff47793 zext.b a5,s0 1262: 00f71963 bne a4,a5,1274 ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1); 1266: 46c5 li a3,17 1268: 8636 mv a2,a3 126a: 02f00593 li a1,47 126e: 8526 mv a0,s1 1270: c4eff0ef jal 6be for (uint8_t i = 0; i < ICON_COUNT; i++) { 1274: 0405 addi s0,s0,1 1276: 479d li a5,7 1278: faf41fe3 bne s0,a5,1236 if (evo_anim) draw_evo_banner(); // celebratory overlay on top 127c: c501c783 lbu a5,-944(gp) # 2000004c 1280: 2a078363 beqz a5,1526 ssd1306_fillRect(6, 18, SSD1306_W - 12, 24, 0); 1284: 4701 li a4,0 1286: 46e1 li a3,24 1288: 07400613 li a2,116 128c: 45c9 li a1,18 128e: 4519 li a0,6 1290: f31fe0ef jal 1c0 ssd1306_drawRect(6, 18, SSD1306_W - 12, 24, 1); 1294: 46e1 li a3,24 1296: 07400613 li a2,116 129a: 45c9 li a1,18 129c: 4519 li a0,6 129e: c20ff0ef jal 6be draw_center_str(21, ">> evolving"); 12a2: 6589 lui a1,0x2 12a4: 9ec58593 addi a1,a1,-1556 # 19ec 12a8: 4555 li a0,21 12aa: a62ff0ef jal 50c p = s_cat(p, "[ "); 12ae: 6589 lui a1,0x2 12b0: 9f858593 addi a1,a1,-1544 # 19f8 12b4: 1868 addi a0,sp,60 12b6: feffe0ef jal 2a4 p = s_cat(p, form_names[pet.form]); 12ba: 47b2 lw a5,12(sp) 12bc: 6709 lui a4,0x2 12be: 5b070713 addi a4,a4,1456 # 25b0 12c2: 078a slli a5,a5,0x2 12c4: 97ba add a5,a5,a4 12c6: 438c lw a1,0(a5) 12c8: fddfe0ef jal 2a4 p = s_cat(p, " ]"); 12cc: 6589 lui a1,0x2 12ce: 9fc58593 addi a1,a1,-1540 # 19fc 12d2: fd3fe0ef jal 2a4 *p = 0; 12d6: 00050023 sb zero,0(a0) draw_center_str(31, b); 12da: 186c addi a1,sp,60 12dc: 457d li a0,31 draw_center_str(56, "OK: respawn"); 12de: a2eff0ef jal 50c 12e2: a491 j 1526 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12e4: fff7c693 not a3,a5 12e8: 86fd srai a3,a3,0x1f 12ea: 8ff5 and a5,a5,a3 12ec: b985 j f5c pet.sleeping = !pet.sleeping; 12ee: 00f4c503 lbu a0,15(s1) beep(pet.sleeping ? 440 : 660, 120); 12f2: 07800593 li a1,120 pet.sleeping = !pet.sleeping; 12f6: 00153793 seqz a5,a0 beep(pet.sleeping ? 440 : 660, 120); 12fa: 00a03533 snez a0,a0 12fe: 40a00533 neg a0,a0 1302: 0dc57513 andi a0,a0,220 pet.sleeping = !pet.sleeping; 1306: 00f487a3 sb a5,15(s1) beep(pet.sleeping ? 440 : 660, 120); 130a: 1b850513 addi a0,a0,440 130e: b925 j f46 pet.happy = clamp100(pet.happy + 5); 1310: 00148783 lb a5,1(s1) pet.hygiene = 100; 1314: 06400693 li a3,100 pet.poop = 0; 1318: 00048723 sb zero,14(s1) pet.hygiene = 100; 131c: 00d481a3 sb a3,3(s1) pet.happy = clamp100(pet.happy + 5); 1320: 0795 addi a5,a5,5 1322: c5418713 addi a4,gp,-940 # 20000050 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1326: 02f6d363 bge a3,a5,134c 132a: 87b6 mv a5,a3 beep(1319, 50); beep(1047, 50); 132c: 03200593 li a1,50 1330: 52700513 li a0,1319 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1334: 00f700a3 sb a5,1(a4) beep(1319, 50); beep(1047, 50); 1338: fdffe0ef jal 316 133c: 41700513 li a0,1047 1340: 03200593 li a1,50 1344: fd3fe0ef jal 316 add_xp(3); 1348: 450d li a0,3 134a: b9b9 j fa8 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 134c: fff7c693 not a3,a5 1350: 86fd srai a3,a3,0x1f 1352: 8ff5 and a5,a5,a3 1354: bfe1 j 132c pet.health = clamp100(pet.health + 35); 1356: 00448783 lb a5,4(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 135a: 06400713 li a4,100 pet.health = clamp100(pet.health + 35); 135e: 02378793 addi a5,a5,35 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1362: 02f75663 bge a4,a5,138e 1366: 87ba mv a5,a4 beep(784, 60); beep(1047, 60); beep(1319, 90); 1368: 03c00593 li a1,60 136c: 31000513 li a0,784 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1370: 00f48223 sb a5,4(s1) beep(784, 60); beep(1047, 60); beep(1319, 90); 1374: fa3fe0ef jal 316 1378: 03c00593 li a1,60 137c: 41700513 li a0,1047 1380: f97fe0ef jal 316 1384: 05a00593 li a1,90 1388: 52700513 li a0,1319 138c: b661 j f14 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 138e: fff7c713 not a4,a5 1392: 877d srai a4,a4,0x1f 1394: 8ff9 and a5,a5,a4 1396: bfc9 j 1368 screen = SCR_STATS; 1398: 4789 li a5,2 139a: c4f18223 sb a5,-956(gp) # 20000040 beep(659, 40); 139e: 02800593 li a1,40 13a2: 29300513 li a0,659 13a6: b645 j f46 screen = SCR_SETTINGS; 13a8: 4791 li a5,4 13aa: c4f18223 sb a5,-956(gp) # 20000040 set_sel = 0; 13ae: c2018da3 sb zero,-965(gp) # 20000037 13b2: b7f5 j 139e uint32_t t = frame % 80; 13b4: c341a783 lw a5,-972(gp) # 20000030 13b8: 05000593 li a1,80 13bc: 853e mv a0,a5 13be: c03e sw a5,0(sp) 13c0: d15fe0ef jal d4 <__umodsi3> px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 13c4: 02700713 li a4,39 13c8: 4782 lw a5,0(sp) 13ca: 00a76d63 bltu a4,a0,13e4 13ce: 01e50713 addi a4,a0,30 13d2: c43a sw a4,8(sp) 13d4: 4722 lw a4,8(sp) py = 14 + ((frame % 16) < 8 ? 0 : 1); 13d6: 8ba1 andi a5,a5,8 13d8: 00f037b3 snez a5,a5 13dc: 07b9 addi a5,a5,14 13de: c23a sw a4,4(sp) 13e0: c03e sw a5,0(sp) 13e2: b149 j 1064 px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 13e4: 06e00713 li a4,110 13e8: 8f09 sub a4,a4,a0 13ea: b7e5 j 13d2 if (pet.sleeping) return EXP_SLEEP; 13ec: 4515 li a0,5 13ee: ca0414e3 bnez s0,1096 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 13f2: 00448603 lb a2,4(s1) 13f6: 4775 li a4,29 return EXP_SAD; 13f8: 853e mv a0,a5 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 13fa: c8c75ee3 bge a4,a2,1096 13fe: 00148603 lb a2,1(s1) 1402: 4761 li a4,24 1404: c8c759e3 bge a4,a2,1096 1408: 00048603 lb a2,0(s1) 140c: 474d li a4,19 140e: c8c754e3 bge a4,a2,1096 if ((frame % 50) < 4) return EXP_BLINK; 1412: c341a503 lw a0,-972(gp) # 20000030 1416: 03200593 li a1,50 141a: c836 sw a3,16(sp) 141c: cb9fe0ef jal d4 <__umodsi3> 1420: 46c2 lw a3,16(sp) 1422: 00453513 sltiu a0,a0,4 1426: b985 j 1096 else if (pet.form == FORM_GLITCH) spr = spr_glitch; 1428: 6609 lui a2,0x2 142a: 44060613 addi a2,a2,1088 # 2440 142e: b9b5 j 10aa ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 1430: 00141513 slli a0,s0,0x1 1434: 9522 add a0,a0,s0 1436: 4721 li a4,8 1438: 050a slli a0,a0,0x2 143a: 86ba mv a3,a4 143c: c1818613 addi a2,gp,-1000 # 20000014 1440: 02600593 li a1,38 1444: 953a add a0,a0,a4 for (uint8_t i = 0; i < pet.poop; i++) 1446: 0405 addi s0,s0,1 ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 1448: b2eff0ef jal 776 for (uint8_t i = 0; i < pet.poop; i++) 144c: 0ff47413 zext.b s0,s0 1450: bbf1 j 122c if (any_edge) { screen = SCR_MAIN; beep(880, 30); } 1452: cb89 beqz a5,1464 1454: 4785 li a5,1 1456: 45f9 li a1,30 1458: 37000513 li a0,880 145c: c4f18223 sb a5,-956(gp) # 20000040 1460: eb7fe0ef jal 316 ssd1306_setbuf(0); 1464: d9cff0ef jal a00 draw_center_str(0, "~/pet $ stat"); 1468: 6589 lui a1,0x2 146a: a0058593 addi a1,a1,-1536 # 1a00 146e: 4501 li a0,0 draw_bar(10, "FOOD", pet.satiety); 1470: c5418413 addi s0,gp,-940 # 20000050 draw_center_str(0, "~/pet $ stat"); 1474: 898ff0ef jal 50c draw_bar(10, "FOOD", pet.satiety); 1478: 00040603 lb a2,0(s0) 147c: 6589 lui a1,0x2 147e: a1058593 addi a1,a1,-1520 # 1a10 1482: 4529 li a0,10 1484: a90ff0ef jal 714 draw_bar(19, "HAPPY", pet.happy); 1488: 00140603 lb a2,1(s0) 148c: 6589 lui a1,0x2 148e: a1858593 addi a1,a1,-1512 # 1a18 1492: 454d li a0,19 1494: a80ff0ef jal 714 draw_bar(28, "ENERGY", pet.energy); 1498: 00240603 lb a2,2(s0) 149c: 6589 lui a1,0x2 149e: a2058593 addi a1,a1,-1504 # 1a20 14a2: 4571 li a0,28 14a4: a70ff0ef jal 714 draw_bar(37, "CLEAN", pet.hygiene); 14a8: 00340603 lb a2,3(s0) 14ac: 6589 lui a1,0x2 14ae: a2858593 addi a1,a1,-1496 # 1a28 14b2: 02500513 li a0,37 14b6: a5eff0ef jal 714 draw_bar(46, "HEALTH", pet.health); 14ba: 00440603 lb a2,4(s0) 14be: 6589 lui a1,0x2 14c0: a3058593 addi a1,a1,-1488 # 1a30 14c4: 02e00513 li a0,46 14c8: a4cff0ef jal 714 p = u_cat(p, pet.level); 14cc: 00b44483 lbu s1,11(s0) *p++ = 'L'; 14d0: 04c00793 li a5,76 p = u_cat(p, pet.level); 14d4: 03d10513 addi a0,sp,61 14d8: 85a6 mv a1,s1 *p++ = 'L'; 14da: 02f10e23 sb a5,60(sp) p = u_cat(p, pet.level); 14de: dd9fe0ef jal 2b6 p = s_cat(p, " xp "); 14e2: 6589 lui a1,0x2 14e4: a3858593 addi a1,a1,-1480 # 1a38 14e8: dbdfe0ef jal 2a4 if (pet.level < MAX_LEVEL) { 14ec: 478d li a5,3 14ee: 0697e463 bltu a5,s1,1556 p = u_cat(p, pet.xp); 14f2: 00845583 lhu a1,8(s0) p = u_cat(p, level_xp[pet.level]); 14f6: 0486 slli s1,s1,0x1 p = u_cat(p, pet.xp); 14f8: dbffe0ef jal 2b6 *p++ = '/'; 14fc: 02f00793 li a5,47 1500: 00f50023 sb a5,0(a0) p = u_cat(p, level_xp[pet.level]); 1504: c2818793 addi a5,gp,-984 # 20000024 1508: 94be add s1,s1,a5 150a: 0004d583 lhu a1,0(s1) 150e: 0505 addi a0,a0,1 1510: da7fe0ef jal 2b6 *p = 0; 1514: 00050023 sb zero,0(a0) ssd1306_drawstr(0, 56, line, 1); 1518: 4685 li a3,1 151a: 1870 addi a2,sp,60 151c: 03800593 li a1,56 1520: 4501 li a0,0 1522: cf7fe0ef jal 218 ssd1306_refresh(); 1526: d02ff0ef jal a28 uint16_t timeout = screen_timeout_opts[timeout_idx]; 152a: c041c703 lbu a4,-1020(gp) # 20000000 152e: c2018793 addi a5,gp,-992 # 2000001c 1532: 0706 slli a4,a4,0x1 1534: 97ba add a5,a5,a4 1536: 0007d783 lhu a5,0(a5) if (timeout && idle_frames >= timeout) { 153a: f8078a63 beqz a5,cce 153e: c401a703 lw a4,-960(gp) # 2000003c 1542: f8f76663 bltu a4,a5,cce ssd1306_cmd(SSD1306_DISPLAYOFF); 1546: 0ae00513 li a0,174 154a: c06ff0ef jal 950 disp_on = 0; 154e: c00182a3 sb zero,-1019(gp) # 20000001 1552: f7cff06f j cce p = s_cat(p, "MAX"); 1556: 6589 lui a1,0x2 1558: a4058593 addi a1,a1,-1472 # 1a40 155c: d49fe0ef jal 2a4 1560: bf55 j 1514 if (left_edge) { 1562: c185 beqz a1,1582 set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS; 1564: c3b1c503 lbu a0,-965(gp) # 20000037 1568: 458d li a1,3 156a: c236 sw a3,4(sp) 156c: 0509 addi a0,a0,2 156e: b8bfe0ef jal f8 <__modsi3> 1572: c2a18da3 sb a0,-965(gp) # 20000037 beep(1047, 25); 1576: 45e5 li a1,25 1578: 41700513 li a0,1047 157c: d9bfe0ef jal 316 1580: 4692 lw a3,4(sp) if (right_edge) { 1582: ce91 beqz a3,159e set_sel = (set_sel + 1) % SETTINGS_ROWS; 1584: c3b1c503 lbu a0,-965(gp) # 20000037 1588: 458d li a1,3 158a: 0505 addi a0,a0,1 158c: b6dfe0ef jal f8 <__modsi3> 1590: c2a18da3 sb a0,-965(gp) # 20000037 beep(1047, 25); 1594: 45e5 li a1,25 1596: 41700513 li a0,1047 159a: d7dfe0ef jal 316 if (ok_edge) { 159e: 4782 lw a5,0(sp) 15a0: cf95 beqz a5,15dc if (set_sel == 0) { // cycle screen-off timeout 15a2: c3b1c703 lbu a4,-965(gp) # 20000037 15a6: ef01 bnez a4,15be timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; 15a8: c041c783 lbu a5,-1020(gp) # 20000000 beep(880, 40); 15ac: 02800593 li a1,40 timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; 15b0: 0785 addi a5,a5,1 15b2: 8b8d andi a5,a5,3 15b4: c0f18223 sb a5,-1020(gp) # 20000000 beep(880, 30); 15b8: 37000513 li a0,880 15bc: a831 j 15d8 } else if (set_sel == 1) { // toggle sound 15be: 4785 li a5,1 15c0: 0ef71963 bne a4,a5,16b2 sound_on = !sound_on; 15c4: c061c783 lbu a5,-1018(gp) # 20000002 beep(988, 60); // only audible if just enabled 15c8: 03c00593 li a1,60 15cc: 3dc00513 li a0,988 sound_on = !sound_on; 15d0: 0017b793 seqz a5,a5 15d4: c0f18323 sb a5,-1018(gp) # 20000002 beep(880, 30); 15d8: d3ffe0ef jal 316 ssd1306_setbuf(0); 15dc: c24ff0ef jal a00 draw_center_str(0, "- SETTINGS -"); 15e0: 6589 lui a1,0x2 15e2: a4458593 addi a1,a1,-1468 # 1a44 15e6: 4501 li a0,0 15e8: f25fe0ef jal 50c 15ec: 4685 li a3,1 15ee: 08000613 li a2,128 15f2: 45a9 li a1,10 15f4: 4501 li a0,0 15f6: f71fe0ef jal 566 *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; 15fa: 6589 lui a1,0x2 15fc: a5458593 addi a1,a1,-1452 # 1a54 1600: 1868 addi a0,sp,60 1602: ca3fe0ef jal 2a4 1606: c041c703 lbu a4,-1020(gp) # 20000000 160a: 6789 lui a5,0x2 160c: 5e078793 addi a5,a5,1504 # 25e0 1610: 070a slli a4,a4,0x2 1612: 97ba add a5,a5,a4 1614: 438c lw a1,0(a5) 1616: c8ffe0ef jal 2a4 *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; 161a: 6589 lui a1,0x2 *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; 161c: 00050023 sb zero,0(a0) *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; 1620: a6058593 addi a1,a1,-1440 # 1a60 1624: 04d10513 addi a0,sp,77 1628: c7dfe0ef jal 2a4 162c: c061c783 lbu a5,-1018(gp) # 20000002 1630: c7c9 beqz a5,16ba 1632: 6589 lui a1,0x2 1634: 97c58593 addi a1,a1,-1668 # 197c 1638: c6dfe0ef jal 2a4 *s_cat(rows[2], "Back") = 0; 163c: 6589 lui a1,0x2 *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; 163e: 00050023 sb zero,0(a0) *s_cat(rows[2], "Back") = 0; 1642: a6858593 addi a1,a1,-1432 # 1a68 1646: 05e10513 addi a0,sp,94 164a: c5bfe0ef jal 2a4 164e: 00050023 sb zero,0(a0) 1652: 44c5 li s1,17 1654: 4401 li s0,0 int y = 18 + r * 12; 1656: 00148793 addi a5,s1,1 165a: c03e sw a5,0(sp) if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1); 165c: c3b1c303 lbu t1,-965(gp) # 20000037 1660: 0ff47293 zext.b t0,s0 1664: 00531e63 bne t1,t0,1680 1668: 4705 li a4,1 166a: 46a9 li a3,10 166c: 08000613 li a2,128 1670: 85a6 mv a1,s1 1672: 4501 li a0,0 1674: c216 sw t0,4(sp) 1676: c01a sw t1,0(sp) 1678: b49fe0ef jal 1c0 167c: 4292 lw t0,4(sp) 167e: 4302 lw t1,0(sp) ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1); 1680: 00441613 slli a2,s0,0x4 1684: 405306b3 sub a3,t1,t0 1688: 9622 add a2,a2,s0 168a: 187c addi a5,sp,60 168c: 00148593 addi a1,s1,1 1690: 00d036b3 snez a3,a3 1694: 963e add a2,a2,a5 1696: 4511 li a0,4 1698: b81fe0ef jal 218 for (uint8_t r = 0; r < SETTINGS_ROWS; r++) { 169c: 04b1 addi s1,s1,12 169e: 03500713 li a4,53 16a2: 0405 addi s0,s0,1 16a4: fae499e3 bne s1,a4,1656 draw_center_str(56, "L/R move OK use"); 16a8: 6589 lui a1,0x2 16aa: a7058593 addi a1,a1,-1424 # 1a70 16ae: fbaff06f j e68 screen = SCR_MAIN; 16b2: c4f18223 sb a5,-956(gp) # 20000040 beep(880, 30); 16b6: 45f9 li a1,30 16b8: b701 j 15b8 *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; 16ba: 6589 lui a1,0x2 16bc: 98458593 addi a1,a1,-1660 # 1984 16c0: bfa5 j 1638 if (ok_edge) { // back to the welcome screen to re-pick 16c2: 4782 lw a5,0(sp) 16c4: cf99 beqz a5,16e2 beep(659, 80); beep(988, 120); 16c6: 05000593 li a1,80 16ca: 29300513 li a0,659 screen = SCR_SELECT; 16ce: c4018223 sb zero,-956(gp) # 20000040 beep(659, 80); beep(988, 120); 16d2: c45fe0ef jal 316 16d6: 07800593 li a1,120 16da: 3dc00513 li a0,988 16de: c39fe0ef jal 316 ssd1306_setbuf(0); 16e2: b1eff0ef jal a00 ssd1306_drawImage(48, 2, spr_grave, 32, 32, 0); 16e6: 02000713 li a4,32 16ea: 6609 lui a2,0x2 16ec: 86ba mv a3,a4 16ee: 5f060613 addi a2,a2,1520 # 25f0 16f2: 4589 li a1,2 16f4: 03000513 li a0,48 16f8: 87eff0ef jal 776 draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); 16fc: c5418713 addi a4,gp,-940 # 20000050 1700: 00d74683 lbu a3,13(a4) 1704: 4709 li a4,2 1706: c5418413 addi s0,gp,-940 # 20000050 170a: 02e69f63 bne a3,a4,1748 170e: 6589 lui a1,0x2 1710: 98858593 addi a1,a1,-1656 # 1988 1714: 02400513 li a0,36 1718: df5fe0ef jal 50c p = s_cat(p, "core dumped L"); 171c: 6589 lui a1,0x2 171e: a8458593 addi a1,a1,-1404 # 1a84 1722: 1868 addi a0,sp,60 1724: b81fe0ef jal 2a4 p = u_cat(p, pet.level); 1728: 00b44583 lbu a1,11(s0) 172c: b8bfe0ef jal 2b6 *p = 0; 1730: 00050023 sb zero,0(a0) draw_center_str(46, line); 1734: 186c addi a1,sp,60 1736: 02e00513 li a0,46 173a: dd3fe0ef jal 50c draw_center_str(56, "OK: respawn"); 173e: 6589 lui a1,0x2 1740: a9458593 addi a1,a1,-1388 # 1a94 1744: f24ff06f j e68 draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); 1748: 6589 lui a1,0x2 174a: 99858593 addi a1,a1,-1640 # 1998 174e: b7d9 j 1714 pet.age_min++; 1750: 00645603 lhu a2,6(s0) pet.satiety = clamp100(pet.satiety - 1); 1754: 00040783 lb a5,0(s0) tick_acc = 0; 1758: c2019c23 sh zero,-968(gp) # 20000034 pet.age_min++; 175c: 0605 addi a2,a2,1 175e: 0642 slli a2,a2,0x10 1760: 8241 srli a2,a2,0x10 1762: 00c41323 sh a2,6(s0) pet.satiety = clamp100(pet.satiety - 1); 1766: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1768: 06400713 li a4,100 if (pet.sleeping) { 176c: 00f44683 lbu a3,15(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1770: 08f75463 bge a4,a5,17f8 1774: 87ba mv a5,a4 1776: 07e2 slli a5,a5,0x18 pet.energy = clamp100(pet.energy + 6); 1778: 00240703 lb a4,2(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 177c: 87e1 srai a5,a5,0x18 177e: 06400513 li a0,100 if (pet.sleeping) { 1782: c6c9 beqz a3,180c pet.energy = clamp100(pet.energy + 6); 1784: 00670593 addi a1,a4,6 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1788: 06b55d63 bge a0,a1,1802 178c: 85aa mv a1,a0 pet.satiety = clamp100(pet.satiety - 1); 178e: 00f40023 sb a5,0(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1792: 00b40123 sb a1,2(s0) if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested 1796: 05d00793 li a5,93 179a: 00e7d563 bge a5,a4,17a4 179e: 000407a3 sb zero,15(s0) 17a2: 4681 li a3,0 if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); 17a4: 00167713 andi a4,a2,1 17a8: cb19 beqz a4,17be 17aa: 00340783 lb a5,3(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17ae: 06400593 li a1,100 if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); 17b2: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17b4: 08f5da63 bge a1,a5,1848 17b8: 87ae mv a5,a1 17ba: 00f401a3 sb a5,3(s0) if (!pet.sleeping && pet.poop < 3 && 17be: 00e44583 lbu a1,14(s0) 17c2: eac1 bnez a3,1852 17c4: 4789 li a5,2 17c6: 00b7ed63 bltu a5,a1,17e0 ((pet.age_min * 7u + frame) & 0x1F) == 0) 17ca: 00361793 slli a5,a2,0x3 17ce: 8f91 sub a5,a5,a2 17d0: c341a603 lw a2,-972(gp) # 20000030 17d4: 97b2 add a5,a5,a2 17d6: 8bfd andi a5,a5,31 if (!pet.sleeping && pet.poop < 3 && 17d8: efad bnez a5,1852 pet.poop++; 17da: 0585 addi a1,a1,1 17dc: 00b40723 sb a1,14(s0) if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 17e0: cb35 beqz a4,1854 17e2: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17e6: 06400613 li a2,100 if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 17ea: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17ec: 14f65363 bge a2,a5,1932 17f0: 87b2 mv a5,a2 17f2: 00f400a3 sb a5,1(s0) 17f6: a8b9 j 1854 17f8: fff7c713 not a4,a5 17fc: 877d srai a4,a4,0x1f 17fe: 8ff9 and a5,a5,a4 1800: bf9d j 1776 1802: fff5c513 not a0,a1 1806: 857d srai a0,a0,0x1f 1808: 8de9 and a1,a1,a0 180a: b751 j 178e pet.satiety = clamp100(pet.satiety - 1); 180c: 00f40023 sb a5,0(s0) pet.energy = clamp100(pet.energy - 1); 1810: fff70793 addi a5,a4,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1814: 02f55063 bge a0,a5,1834 1818: 87aa mv a5,a0 181a: 00f40123 sb a5,2(s0) pet.happy = clamp100(pet.happy - 1); 181e: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1822: 06400713 li a4,100 pet.happy = clamp100(pet.happy - 1); 1826: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1828: 00f75b63 bge a4,a5,183e 182c: 87ba mv a5,a4 182e: 00f400a3 sb a5,1(s0) 1832: bf8d j 17a4 1834: fff7c713 not a4,a5 1838: 877d srai a4,a4,0x1f 183a: 8ff9 and a5,a5,a4 183c: bff9 j 181a 183e: fff7c713 not a4,a5 1842: 877d srai a4,a4,0x1f 1844: 8ff9 and a5,a5,a4 1846: b7e5 j 182e 1848: fff7c593 not a1,a5 184c: 85fd srai a1,a1,0x1f 184e: 8fed and a5,a5,a1 1850: b7ad j 17ba if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 1852: f5d9 bnez a1,17e0 if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 1854: 00340603 lb a2,3(s0) 1858: 47cd li a5,19 185a: 00c7cd63 blt a5,a2,1874 185e: cb19 beqz a4,1874 1860: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1864: 06400713 li a4,100 if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 1868: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 186a: 0cf75963 bge a4,a5,193c 186e: 87ba mv a5,a4 1870: 00f400a3 sb a5,1(s0) if (pet.hygiene < lo) lo = pet.hygiene; 1874: 00044703 lbu a4,0(s0) 1878: 87ba mv a5,a4 187a: 0762 slli a4,a4,0x18 187c: 8761 srai a4,a4,0x18 187e: 00e65363 bge a2,a4,1884 1882: 87b2 mv a5,a2 1884: 00144703 lbu a4,1(s0) 1888: 01879593 slli a1,a5,0x18 188c: 85e1 srai a1,a1,0x18 188e: 01871613 slli a2,a4,0x18 1892: 8661 srai a2,a2,0x18 1894: 00b65363 bge a2,a1,189a 1898: 87ba mv a5,a4 189a: 00244703 lbu a4,2(s0) 189e: 01879593 slli a1,a5,0x18 18a2: 85e1 srai a1,a1,0x18 18a4: 01871613 slli a2,a4,0x18 18a8: 8661 srai a2,a2,0x18 18aa: 00b65363 bge a2,a1,18b0 18ae: 87ba mv a5,a4 18b0: 01879713 slli a4,a5,0x18 18b4: 8761 srai a4,a4,0x18 if (lo < 15) pet.health = clamp100(pet.health - 3); 18b6: 4639 li a2,14 18b8: 00440783 lb a5,4(s0) 18bc: 08e64a63 blt a2,a4,1950 18c0: 17f5 addi a5,a5,-3 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 18c2: 06400713 li a4,100 18c6: 08f75063 bge a4,a5,1946 18ca: 87ba mv a5,a4 18cc: 00f40223 sb a5,4(s0) notify(N_FOOD, pet.satiety); 18d0: 00040583 lb a1,0(s0) 18d4: 4501 li a0,0 18d6: ba9fe0ef jal 47e notify(N_FUN, pet.happy); 18da: 00140583 lb a1,1(s0) 18de: 4505 li a0,1 18e0: b9ffe0ef jal 47e notify(N_ENGY, pet.energy); 18e4: 00240583 lb a1,2(s0) 18e8: 4509 li a0,2 18ea: b95fe0ef jal 47e notify(N_WASH, pet.hygiene); 18ee: 00340583 lb a1,3(s0) 18f2: 450d li a0,3 18f4: b8bfe0ef jal 47e if (pet.health <= 0) { 18f8: 00440783 lb a5,4(s0) 18fc: c0f04763 bgtz a5,d0a screen = SCR_DEAD; 1900: 470d li a4,3 beep(330, 200); beep(247, 200); beep(165, 400); 1902: 0c800593 li a1,200 1906: 14a00513 li a0,330 screen = SCR_DEAD; 190a: c4e18223 sb a4,-956(gp) # 20000040 pet.alive = 0; 190e: 00040823 sb zero,16(s0) beep(330, 200); beep(247, 200); beep(165, 400); 1912: a05fe0ef jal 316 1916: 0c800593 li a1,200 191a: 0f700513 li a0,247 191e: 9f9fe0ef jal 316 1922: 19000593 li a1,400 1926: 0a500513 li a0,165 192a: 9edfe0ef jal 316 192e: bdcff06f j d0a static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1932: fff7c613 not a2,a5 1936: 867d srai a2,a2,0x1f 1938: 8ff1 and a5,a5,a2 193a: bd65 j 17f2 193c: fff7c713 not a4,a5 1940: 877d srai a4,a4,0x1f 1942: 8ff9 and a5,a5,a4 1944: b735 j 1870 1946: fff7c713 not a4,a5 194a: 877d srai a4,a4,0x1f 194c: 8ff9 and a5,a5,a4 194e: bfbd j 18cc else if (lo > 50) pet.health = clamp100(pet.health + 2); 1950: 03200613 li a2,50 1954: f6e65ee3 bge a2,a4,18d0 1958: 0789 addi a5,a5,2 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 195a: 06400713 li a4,100 195e: 00f75a63 bge a4,a5,1972 1962: 87ba mv a5,a4 1964: 00f40223 sb a5,4(s0) if (lo > 50 && !pet.sleeping) add_xp(3); 1968: f6a5 bnez a3,18d0 196a: 450d li a0,3 196c: a45fe0ef jal 3b0 1970: b785 j 18d0 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1972: fff7c713 not a4,a5 1976: 877d srai a4,a4,0x1f 1978: 8ff9 and a5,a5,a4 197a: b7ed j 1964 197c: 00006e4f .insn 4, 0x6e4f 1980: 0000 unimp 1982: 0000 unimp 1984: 0066664f .insn 4, 0x0066664f 1988: 2a2a .insn 2, 0x2a2a 198a: 4320 lw s0,64(a4) 198c: 5552524f .insn 4, 0x5552524f 1990: 5450 lw a2,44(s0) 1992: 4445 li s0,17 1994: 2a20 .insn 2, 0x2a20 1996: 002a c.slli zero,0xa 1998: 46474553 .insn 4, 0x46474553 199c: 5541 li a0,-16 199e: 544c lw a1,44(s0) 19a0: 2820 .insn 2, 0x2820 19a2: 3131 jal 15ae 19a4: 0029 c.nop 10 19a6: 0000 unimp 19a8: 7270 .insn 2, 0x7270 19aa: 7365 lui t1,0xffff9 19ac: 6e612073 .insn 4, 0x6e612073 19b0: 2079 jal 1a3e 19b2: 0079656b .insn 4, 0x0079656b 19b6: 0000 unimp 19b8: 207e .insn 2, 0x207e 19ba: 2024 .insn 2, 0x2024 19bc: 6461 lui s0,0x18 19be: 2074706f j 493c4 19c2: 2d2d jal 1ffc 19c4: 6570 .insn 2, 0x6570 19c6: 0074 addi a3,sp,12 19c8: 203c .insn 2, 0x203c 19ca: 0000 unimp 19cc: 3e20 .insn 2, 0x3e20 19ce: 0000 unimp 19d0: 2f4c .insn 2, 0x2f4c 19d2: 2052 .insn 2, 0x2052 19d4: 6970 .insn 2, 0x6970 19d6: 20206b63 bltu zero,sp,1bec 19da: 67204b4f .insn 4, 0x67204b4f 19de: 0021006f j 119e0 19e2: 0000 unimp 19e4: 007a c.slli zero,0x1e 19e6: 0000 unimp 19e8: 005a c.slli zero,0x16 19ea: 0000 unimp 19ec: 3e3e .insn 2, 0x3e3e 19ee: 6520 .insn 2, 0x6520 19f0: 6f76 .insn 2, 0x6f76 19f2: 766c .insn 2, 0x766c 19f4: 6e69 lui t3,0x1a 19f6: 205b0067 jr 517(s6) 19fa: 0000 unimp 19fc: 5d20 lw s0,120(a0) 19fe: 0000 unimp 1a00: 2f7e .insn 2, 0x2f7e 1a02: 6570 .insn 2, 0x6570 1a04: 2074 .insn 2, 0x2074 1a06: 2024 .insn 2, 0x2024 1a08: 74617473 .insn 4, 0x74617473 1a0c: 0000 unimp 1a0e: 0000 unimp 1a10: 4f46 lw t5,80(sp) 1a12: 0000444f .insn 4, 0x444f 1a16: 0000 unimp 1a18: 4148 lw a0,4(a0) 1a1a: 5050 lw a2,36(s0) 1a1c: 0059 c.nop 22 1a1e: 0000 unimp 1a20: 4e45 li t3,17 1a22: 5245 li tp,-15 1a24: 00005947 .insn 4, 0x5947 1a28: 41454c43 .insn 4, 0x41454c43 1a2c: 004e c.slli zero,0x13 1a2e: 0000 unimp 1a30: 4548 lw a0,12(a0) 1a32: 4c41 li s8,16 1a34: 4854 lw a3,20(s0) 1a36: 0000 unimp 1a38: 2020 .insn 2, 0x2020 1a3a: 7078 .insn 2, 0x7078 1a3c: 0020 addi s0,sp,8 1a3e: 0000 unimp 1a40: 414d li sp,19 1a42: 0058 addi a4,sp,4 1a44: 202d jal 1a6e 1a46: 54544553 .insn 4, 0x54544553 1a4a: 4e49 li t3,18 1a4c: 2d205347 .insn 4, 0x2d205347 1a50: 0000 unimp 1a52: 0000 unimp 1a54: 65726353 .insn 4, 0x65726353 1a58: 6e65 lui t3,0x19 1a5a: 6f20 .insn 2, 0x6f20 1a5c: 6666 .insn 2, 0x6666 1a5e: 003a c.slli zero,0xe 1a60: 6e756f53 .insn 4, 0x6e756f53 1a64: 3a64 .insn 2, 0x3a64 1a66: 0020 addi s0,sp,8 1a68: 6142 .insn 2, 0x6142 1a6a: 00006b63 bltu zero,zero,1a80 1a6e: 0000 unimp 1a70: 2f4c .insn 2, 0x2f4c 1a72: 2052 .insn 2, 0x2052 1a74: 6f6d lui t5,0x1b 1a76: 6576 .insn 2, 0x6576 1a78: 2020 .insn 2, 0x2020 1a7a: 75204b4f .insn 4, 0x75204b4f 1a7e: 00006573 .insn 4, 0x6573 1a82: 0000 unimp 1a84: 65726f63 bltu tp,s7,20e2 1a88: 6420 .insn 2, 0x6420 1a8a: 6d75 lui s10,0x1d 1a8c: 6570 .insn 2, 0x6570 1a8e: 2064 .insn 2, 0x2064 1a90: 004c addi a1,sp,4 1a92: 0000 unimp 1a94: 203a4b4f .insn 4, 0x203a4b4f 1a98: 6572 .insn 2, 0x6572 1a9a: 77617073 .insn 4, 0x77617073 1a9e: 006e c.slli zero,0x1b 1aa0: 6170 .insn 2, 0x6170 1aa2: 616e .insn 2, 0x616e 1aa4: 63746f67 .insn 4, 0x63746f67 1aa8: 6968 .insn 2, 0x6968 1aaa: 7620 .insn 2, 0x7620 1aac: 0032 c.slli zero,0xc 1aae: 0000 unimp 1ab0: 6f62 .insn 2, 0x6f62 1ab2: 6e69746f jal s0,99198 1ab6: 656b2067 .insn 4, 0x656b2067 1aba: 6e72 .insn 2, 0x6e72 1abc: 6c65 lui s8,0x19 1abe: 2e2e .insn 2, 0x2e2e 1ac0: 0000 unimp 1ac2: 0000 unimp 1ac4: 6f6d lui t5,0x1b 1ac6: 6e75 lui t3,0x1d 1ac8: 2074 .insn 2, 0x2074 1aca: 7465702f .insn 4, 0x7465702f 1ace: 2020 .insn 2, 0x2020 1ad0: 00006b6f jal s6,7ad0 1ad4: 77617073 .insn 4, 0x77617073 1ad8: 206e .insn 2, 0x206e 1ada: 6c656873 .insn 4, 0x6c656873 1ade: 206c .insn 2, 0x206c 1ae0: 6f20 .insn 2, 0x6f20 1ae2: 203e006b .insn 4, 0x203e006b 1ae6: 2f2e .insn 2, 0x2f2e 1ae8: 6174 .insn 2, 0x6174 1aea: 616d addi sp,sp,240 1aec: 63746f67 .insn 4, 0x63746f67 1af0: 6968 .insn 2, 0x6968 1af2: 005f 6853 6c65 .insn 6, 0x6c656853005f 1af8: 006c addi a1,sp,12 1afa: 0000 unimp 1afc: 6150 .insn 2, 0x6150 1afe: 6b6e .insn 2, 0x6b6e 1b00: 0000006f j 1b00 1b04: 6d54 .insn 2, 0x6d54 1b06: 7875 lui a6,0xffffd 1b08: 0000 unimp 1b0a: 0000 unimp 1b0c: 7270 .insn 2, 0x7270 1b0e: 0000636f jal t1,7b0e 1b12: 0000 unimp 1b14: 7375 lui t1,0xffffd 1b16: 7265 lui tp,0xffff9 1b18: 0000 unimp 1b1a: 0000 unimp 1b1c: 6f72 .insn 2, 0x6f72 1b1e: 0000746f jal s0,8b1e 1b22: 0000 unimp 1b24: 75616c43 .insn 4, 0x75616c43 1b28: 6564 .insn 2, 0x6564 1b2a: 0000 unimp 1b2c: 74696c67 .insn 4, 0x74696c67 1b30: 00006863 bltu zero,zero,1b40 1b34: 4546 lw a0,80(sp) 1b36: 4445 li s0,17 1b38: 0000 unimp 1b3a: 0000 unimp 1b3c: 4c50 lw a2,28(s0) 1b3e: 5941 li s2,-16 1b40: 0000 unimp 1b42: 0000 unimp 1b44: 45454c53 .insn 4, 0x45454c53 1b48: 0050 addi a2,sp,4 1b4a: 0000 unimp 1b4c: 4548 lw a0,12(a0) 1b4e: 4c41 li s8,16 1b50: 0000 unimp 1b52: 0000 unimp 1b54: 54415453 .insn 4, 0x54415453 1b58: 00000053 .insn 4, 0x0053 1b5c: 54544553 .insn 4, 0x54544553 1b60: 4e49 li t3,18 1b62: 00005347 .insn 4, 0x5347 1b66: 0000 unimp 1b68: 3531 jal 1974 1b6a: 30330073 .insn 4, 0x30330073 1b6e: 30360073 .insn 4, 0x30360073 1b72: 0d4a0073 .insn 4, 0x0d4a0073 1b76: 0000 unimp 1b78: 0e6e slli t3,t3,0x1b 1b7a: 0000 unimp 1b7c: 1452 slli s0,s0,0x34 1b7e: 0000 unimp 1b80: 16c2 slli a3,a3,0x30 1b82: 0000 unimp 1b84: 1562 slli a0,a0,0x38 1b86: 0000 unimp 1b88: 0ecc addi a1,sp,852 1b8a: 0000 unimp 1b8c: 0f34 addi a3,sp,920 1b8e: 0000 unimp 1b90: 12ee slli t0,t0,0x3b 1b92: 0000 unimp 1b94: 1310 addi a2,sp,416 1b96: 0000 unimp 1b98: 1356 slli t1,t1,0x35 1b9a: 0000 unimp 1b9c: 1398 addi a4,sp,480 1b9e: 0000 unimp 1ba0: 13a8 addi a0,sp,488 ... 00001ba4 : ... 1bb0: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1bc0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1bd0: ff3f fc7f ff3f fc7f 073c 1c70 ff3f fc7f ?...?...<.p.?... 1be0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1bf0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1c00: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'... 1c10: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ............... 1c20: 0000 0000 .... 00001c24 : ... 1c30: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1c40: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1c50: bf3f fc7e 1f3f 7c7c 0f3e 3c78 1f3f 7c7c ?.~.?.||>.x: ... 1cb0: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1cc0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1cd0: 5f3f 7c7d af3e bc7a ff3f fc7f ff3f fc7f ?_}|>.z.?...?... 1ce0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1cf0: 033c 1c60 ff3f fc7f ff3f fc7f ff3f fc7f <.`.?...?...?... 1d00: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'... 1d10: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ............... 1d20: 0000 0000 .... 00001d24 : ... 1d30: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1d40: ff3f fc7f ff3f fc7f ff3f fc7f bf3f fc7e ?...?...?...?.~. 1d50: 1f3f 7c7c 0f3e 3c78 1f3f 7c7c bf3f fc7e ?.||>.x: 1da4: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 1db4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 1dc4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 1dd4: ff01 80ff ff03 c0ff ff03 c0ff db03 c0db ................ 1de4: e703 c0e7 e703 c0e7 db03 c0db fd01 80df ................ 1df4: fa01 80bf f700 007f 7f00 00fe ff01 c0ff ................ 1e04: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 1e14: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00001e24 : 1e24: 0000 0080 1000 0088 1100 f088 3100 208c .............1. 1e34: 3900 40dc 3b00 f0dc 7f00 00fe 7f00 00fe .9.@.;.......... 1e44: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 1e54: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................ 1e64: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................ 1e74: fe01 807f ff00 00ff 7f00 00fe ff01 c0ff ................ 1e84: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 1e94: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00001ea4 : 1ea4: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 1eb4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 1ec4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 1ed4: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................ 1ee4: e703 c0e7 ff03 c0ff ff03 c0ff fc01 803f ..............?. 1ef4: fd01 803f fc00 00bf 7c00 003e ff01 c0ff ..?......|>..... 1f04: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 1f14: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00001f24 : 1f24: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 1f34: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 1f44: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 1f54: ff01 80ff 9f03 c0f9 e703 c0e7 ff03 c0ff ................ 1f64: e703 c0e7 e703 c0e7 ff03 c0ff ff01 80ff ................ 1f74: ff01 80ff fc00 003f 7b00 00de f701 c0ef ......?..{...... 1f84: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 1f94: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00001fa4 : 1fa4: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 1fb4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 1fc4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 1fd4: ff01 80ff ff03 c0ff ff03 c0ff ef03 c0f7 ................ 1fe4: e703 c0eb db03 c0db ff03 c0ff ff01 80ff ................ 1ff4: f701 80ef f700 00ef 7b00 00de fc01 c03f .........{....?. 2004: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2014: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00002024 : 2024: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 2034: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 2044: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 2054: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................ 2064: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................ 2074: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?............. 2084: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2094: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 000020a4 : 20a4: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 20b4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 20c4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 20d4: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................ 20e4: e703 c0e7 ff03 c0ff ff03 c0ff ff01 80ff ................ 20f4: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?............. 2104: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2114: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00002124 : ... 2130: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2140: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2150: ff0f f0ff 010f f080 ff0f f0ff ff0f f0ff ................ 2160: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2170: ff0f f0ff f80f f00f ff0f f0ff ff0f f0ff ................ 2180: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 2190: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 21a0: 7f00 00fe .... 000021a4 : ... 21b0: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 21c0: ff0f f0ff ff0f f0ff ff0f f0ff ef0f f0f7 ................ 21d0: c70f f0e3 830f f0c1 c70f f0e3 ef0f f0f7 ................ 21e0: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 21f0: ff0f f0ff ff0f f0ff ff0f f0ff f80f f01f ................ 2200: c70f f0e3 ff0f f0ff ff07 e0ff 0700 00e0 ................ 2210: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 2220: 7f00 00fe .... 00002224 : ... 2230: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2240: ff0f f0ff ff0f f0ff ff0f f0ff df0f f0ef ................ 2250: af0f f0d7 ff0f f0ff ff0f f0ff ff0f f0ff ................ 2260: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2270: c70f f0e3 f80f f01f ff0f f0ff ff0f f0ff ................ 2280: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 2290: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 22a0: 7f00 00fe .... 000022a4 : ... 22b0: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 22c0: ff0f f0ff ff0f f0ff ef0f f0f7 c70f f0e3 ................ 22d0: 830f f0c1 c70f f0e3 ef0f f0f7 ff0f f0ff ................ 22e0: ff0f f0ff ff0f f0ff ff0f f0ff 7f0f f0ff ................ 22f0: bf0f f0ff df0f f0ff bf0f f0ff 780f f00f .............x.. 2300: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 2310: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 2320: 7f00 00fe .... 00002324 : 2324: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............? 2334: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|.......... 00002344 : 2344: 0000 0000 0000 c000 c000 c000 c006 c006 ................ 2354: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... 00002364 : 2364: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. 2374: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ 00002384 : 2384: 0000 0000 8000 8000 c001 c001 f007 f80d ................ 2394: f80d f808 fc1d f80d f80f f80f f007 8000 ................ 000023a4 : 23a4: 0000 0000 0000 0004 000c 001c 0018 001c ................ 23b4: 003c 001c 001e 001f e80f f007 8000 0000 <............... 000023c4 : 23c4: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ 23d4: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. 000023e4 : 23e4: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. 23f4: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... 00002404 : 2404: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... 2414: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... 00002420 : 2420: 1aa0 0000 1ab0 0000 1ac4 0000 1ad4 0000 ................ 2430: 1ae4 0000 .... 00002434 : 2434: 1af4 0000 1afc 0000 1b04 0000 ............ 00002440 : ... 2450: 0000 0200 0000 0000 0000 0000 0000 0000 ................ 2460: 0080 0080 0f00 00f8 1500 0054 ff00 80ff ..........T..... 2470: ff01 c0ff ff03 e0ff 1101 4144 d707 f0f5 ..........DA.... 2480: ef07 f0fb d707 f0f5 1105 5044 ff0f f8ff ..........DP.... 2490: ff07 f0ff ff07 f0ff 5505 5055 ea07 f0ab .........UUP.... 24a0: ff43 e0ff ff03 e0ff 5501 4055 ff00 80ff C........UU@.... 24b0: 3f00 00fe 0f00 04f8 0020 0000 0000 0000 .?...... ....... 000024c0 : ... 24c8: 0000 2000 0000 2000 0004 a800 000e 2000 ... ... ....... 24d8: 0004 fe03 0000 2000 0000 a880 0f00 20f8 ....... ....... 24e8: 3f00 20fe 7f00 00ff ff00 80ff ff01 c0ff .?. ............ 24f8: ff01 c0ff ff03 e0ff f703 e0f7 f703 e0f7 ................ 2508: e303 e0e3 f707 f0f7 f703 e0f7 ff03 e0ff ................ 2518: ff03 e0ff e703 e0f3 f801 c00f ff01 c0ff ................ 2528: ff00 80ff 7f00 00ff 3f00 00fe 0f00 00f8 .........?...... 2538: 0000 0080 0000 0000 ........ 00002540 : 2540: 22a4 0000 22a4 0000 2224 0000 21a4 0000 ."..."..$"...!.. 2550: 2224 0000 2124 0000 21a4 0000 20a4 0000 $"..$!...!... .. 2560: 2024 0000 1fa4 0000 1f24 0000 1ea4 0000 $ ......$....... 2570: 1e24 0000 1da4 0000 1d24 0000 1d24 0000 $.......$...$... 2580: 1ca4 0000 1c24 0000 1ca4 0000 1ba4 0000 ....$........... 2590: 1c24 0000 $... 00002594 : 2594: 23e4 0000 23c4 0000 23a4 0000 2384 0000 .#...#...#...#.. 25a4: 2364 0000 2344 0000 2324 0000 d#..D#..$#.. 000025b0 : 25b0: 1b0c 0000 1b14 0000 1b1c 0000 1b24 0000 ............$... 25c0: 1b2c 0000 ,... 000025c4 : 25c4: 1b34 0000 1b3c 0000 1b44 0000 1a28 0000 4...<...D...(... 25d4: 1b4c 0000 1b54 0000 1b5c 0000 L...T...\... 000025e0 : 25e0: 1b68 0000 1b6c 0000 1b70 0000 1984 0000 h...l...p....... 000025f0 : ... 25f8: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................ 2608: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3.. 2618: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0.......... 2628: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?... 2638: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................ 2648: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................ ... 00002670 : ... 2678: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~ 2688: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8.. 2698: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8 26a8: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<........... 26b8: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 ..>....<~..~<. 2708: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{.... 2718: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a`<.|.. 2798: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v. 27a8: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000... 27b8: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.l...... 2b08: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|. 2b18: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v. 2b28: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~.. 2b38: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|. 2b48: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f.. 2b58: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~.......... 2b68: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v. 2b78: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|. 2b88: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff. 2b98: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v........~.. 2ba8: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>. 2bb8: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................ 2bc8: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j.. 2bd8: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3.. 2be8: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".". 2bf8: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w. 2c08: 1818 1818 1818 1818 1818 1818 18f8 1818 ................ 2c18: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666 2c28: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........ 2c38: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666 2c48: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666...... 2c58: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............ 2c68: 0000 0000 18f8 1818 1818 1818 001f 0000 ................ 2c78: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................ 2c88: 1818 1818 181f 1818 0000 0000 00ff 0000 ................ 2c98: 1818 1818 18ff 1818 1818 181f 181f 1818 ................ 2ca8: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?... 2cb8: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666...... 2cc8: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666 2cd8: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666 2ce8: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666.... 2cf8: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666 2d08: 3636 3636 003f 0000 1818 181f 001f 0000 6666?........... 2d18: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666 2d28: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........ 2d38: 1818 1818 00f8 0000 0000 0000 181f 1818 ................ 2d48: ffff ffff ffff ffff 0000 0000 ffff ffff ................ 2d58: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................ 2d68: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v. 2d78: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x............... 2d88: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`... 2d98: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|. 2da8: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.ff<...~..~.. 2dd8: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0.. 2de8: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|.............. 2df8: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~. 2e08: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~......... 2e18: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~.... 2e28: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8.... 2e38: 0000 1800 0018 0000 0000 1800 0000 0000 ................ 2e48: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666... 2e58: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<.. ...