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: 0eb0006f j 8ea 4: 00000000 .word 0x00000000 8: 000009b0 .word 0x000009b0 c: 0000095c .word 0x0000095c ... 30: 0000095c .word 0x0000095c 34: 00000000 .word 0x00000000 38: 0000095c .word 0x0000095c 3c: 00000000 .word 0x00000000 40: 0000095c .word 0x0000095c 44: 0000095c .word 0x0000095c 48: 0000095c .word 0x0000095c 4c: 0000095c .word 0x0000095c 50: 0000095c .word 0x0000095c 54: 0000095c .word 0x0000095c 58: 0000095c .word 0x0000095c 5c: 0000095c .word 0x0000095c 60: 0000095c .word 0x0000095c 64: 0000095c .word 0x0000095c 68: 0000095c .word 0x0000095c 6c: 0000095c .word 0x0000095c 70: 0000095c .word 0x0000095c 74: 0000095c .word 0x0000095c 78: 0000095c .word 0x0000095c 7c: 0000095c .word 0x0000095c 80: 0000095c .word 0x0000095c 84: 0000095c .word 0x0000095c 88: 0000095c .word 0x0000095c 8c: 0000095c .word 0x0000095c 90: 0000095c .word 0x0000095c 94: 0000095c .word 0x0000095c 98: 0000095c .word 0x0000095c 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 : if(pad_to == 0) pad_to = len; 11e: c699 beqz a3,12c int overflow = 0; 120: 4301 li t1,0 if(len > pad_to) { 122: 00b6d763 bge a3,a1,130 len = pad_to; 126: 85b6 mv a1,a3 overflow = 1; 128: 4305 li t1,1 12a: a019 j 130 int overflow = 0; 12c: 4301 li t1,0 if(pad_to == 0) pad_to = len; 12e: 86ae mv a3,a1 for(i = pad_to - len; i > 0; i --) { 130: 8e8d sub a3,a3,a1 char * pbuffer = buffer; 132: 87ba mv a5,a4 134: 00e683b3 add t2,a3,a4 for(i = pad_to - len; i > 0; i --) { 138: 40f382b3 sub t0,t2,a5 13c: 04504a63 bgtz t0,190 140: fff6c793 not a5,a3 144: 87fd srai a5,a5,0x1f 146: 8efd and a3,a3,a5 148: 96ba add a3,a3,a4 14a: 4781 li a5,0 for(i = len; i > 0; i --) { 14c: 40f58633 sub a2,a1,a5 150: 00f682b3 add t0,a3,a5 154: 04c04263 bgtz a2,198 158: fff5c793 not a5,a1 15c: 87fd srai a5,a5,0x1f 15e: 8dfd and a1,a1,a5 160: 95b6 add a1,a1,a3 len = pbuffer - buffer; 162: 40e58533 sub a0,a1,a4 if(overflow) { 166: 02030463 beqz t1,18e for (i = 0; i < 3 && pbuffer > buffer; i ++) { 16a: 02b77263 bgeu a4,a1,18e *(pbuffer-- - 1) = '*'; 16e: 02a00793 li a5,42 172: fef58fa3 sb a5,-1(a1) 176: fff58693 addi a3,a1,-1 for (i = 0; i < 3 && pbuffer > buffer; i ++) { 17a: 00d77a63 bgeu a4,a3,18e *(pbuffer-- - 1) = '*'; 17e: fef58f23 sb a5,-2(a1) 182: ffe58693 addi a3,a1,-2 for (i = 0; i < 3 && pbuffer > buffer; i ++) { 186: 00d77463 bgeu a4,a3,18e *(pbuffer-- - 1) = '*'; 18a: fef58ea3 sb a5,-3(a1) } 18e: 8082 ret *(pbuffer++) = pad_char; 190: 0785 addi a5,a5,1 192: fec78fa3 sb a2,-1(a5) for(i = pad_to - len; i > 0; i --) { 196: b74d j 138 *(pbuffer++) = *(ptr++); 198: 00f50633 add a2,a0,a5 19c: 00064603 lbu a2,0(a2) 1a0: 0785 addi a5,a5,1 1a2: 00c28023 sb a2,0(t0) for(i = len; i > 0; i --) { 1a6: b75d j 14c 000001a8 <_puts>: { 1a8: 832a mv t1,a0 1aa: 852e mv a0,a1 if(!buf) return len; 1ac: ce01 beqz a2,1c4 <_puts+0x1c> char * p0 = b->buffer; 1ae: 00062283 lw t0,0(a2) for (i = 0; i < len; i++) { 1b2: 4701 li a4,0 if(b->pbuffer == b->buffer + b->buffer_len - 1) { 1b4: 425c lw a5,4(a2) for (i = 0; i < len; i++) { 1b6: 00a74863 blt a4,a0,1c6 <_puts+0x1e> *(b->pbuffer) = 0; 1ba: 00078023 sb zero,0(a5) return b->pbuffer - p0; 1be: 4248 lw a0,4(a2) 1c0: 40550533 sub a0,a0,t0 } 1c4: 8082 ret if(b->pbuffer == b->buffer + b->buffer_len - 1) { 1c6: 460c lw a1,8(a2) 1c8: 4214 lw a3,0(a2) 1ca: 15fd addi a1,a1,-1 1cc: 96ae add a3,a3,a1 1ce: fed786e3 beq a5,a3,1ba <_puts+0x12> *(b->pbuffer ++) = s[i]; 1d2: 00178693 addi a3,a5,1 1d6: c254 sw a3,4(a2) 1d8: 00e306b3 add a3,t1,a4 1dc: 0006c683 lbu a3,0(a3) for (i = 0; i < len; i++) { 1e0: 0705 addi a4,a4,1 *(b->pbuffer ++) = s[i]; 1e2: 00d78023 sb a3,0(a5) for (i = 0; i < len; i++) { 1e6: b7f9 j 1b4 <_puts+0xc> 000001e8 : while( (*DMDATA0) & 0x80 ); 1e8: e00007b7 lui a5,0xe0000 1ec: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> 1f0: 4398 lw a4,0(a5) 1f2: 08077713 andi a4,a4,128 1f6: ff6d bnez a4,1f0 *DMDATA0 = 0x78302088; //" 0x" 1f8: 78302737 lui a4,0x78302 1fc: 08870713 addi a4,a4,136 # 78302088 <_eusrstack+0x58301888> while( (*DMDATA0) & 0x80 ); 200: e00006b7 lui a3,0xe0000 *DMDATA0 = 0x78302088; //" 0x" 204: c398 sw a4,0(a5) while( (*DMDATA0) & 0x80 ); 206: 0f468693 addi a3,a3,244 # e00000f4 <_eusrstack+0xbffff8f4> for( shift = 28; shift >= 0; shift -= 4 ) 20a: 4771 li a4,28 s += ( s < 10 ) ? '0' : ('a' - 10); 20c: 45a5 li a1,9 for( shift = 28; shift >= 0; shift -= 4 ) 20e: 5671 li a2,-4 while( (*DMDATA0) & 0x80 ); 210: 429c lw a5,0(a3) 212: 0807f793 andi a5,a5,128 216: ffed bnez a5,210 int s = (n>>shift) & 0xf; 218: 00e55333 srl t1,a0,a4 21c: 00f37313 andi t1,t1,15 s += ( s < 10 ) ? '0' : ('a' - 10); 220: 0065b7b3 sltu a5,a1,t1 224: 40f007b3 neg a5,a5 228: 0277f793 andi a5,a5,39 22c: 03078793 addi a5,a5,48 230: 979a add a5,a5,t1 *DMDATA0 = 0x85 | (s<<8); //" 0x" 232: 07a2 slli a5,a5,0x8 234: 0857e793 ori a5,a5,133 238: c29c sw a5,0(a3) for( shift = 28; shift >= 0; shift -= 4 ) 23a: 1771 addi a4,a4,-4 23c: fcc71ae3 bne a4,a2,210 } 240: 8082 ret 00000242 : #endif void DelaySysTick( uint32_t n ) { #if defined(CH32V003) || defined(CH32V00x) uint32_t targend = SysTick->CNT + n; 242: e000f737 lui a4,0xe000f 246: 471c lw a5,8(a4) 248: 953e add a0,a0,a5 while( ((int32_t)( SysTick->CNT - targend )) < 0 ); 24a: 471c lw a5,8(a4) 24c: 8f89 sub a5,a5,a0 24e: fe07cee3 bltz a5,24a uint64_t targend = SysTick->CNT - n; while( ((int64_t)( SysTick->CNT - targend )) > 0 ); #else #error DelaySysTick not defined. #endif } 252: 8082 ret 00000254 : int mini_itoa(long value, unsigned int radix, int uppercase, int unsig, char *buffer) 254: 1101 addi sp,sp,-32 256: ce06 sw ra,28(sp) 258: cc22 sw s0,24(sp) 25a: ca26 sw s1,20(sp) int negative = 0; 25c: c002 sw zero,0(sp) int mini_itoa(long value, unsigned int radix, int uppercase, int unsig, char *buffer) 25e: 832a mv t1,a0 if (value < 0 && !unsig) { 260: 00055763 bgez a0,26e 264: e689 bnez a3,26e negative = 1; 266: 4785 li a5,1 value = -value; 268: 40a00333 neg t1,a0 negative = 1; 26c: c03e sw a5,0(sp) 26e: 8a05 andi a2,a2,1 270: 06100413 li s0,97 274: c219 beqz a2,27a 276: 04100413 li s0,65 int negative = 0; 27a: 84ba mv s1,a4 *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); 27c: 1459 addi s0,s0,-10 int digit = value % radix; 27e: 851a mv a0,t1 280: c83a sw a4,16(sp) 282: c21a sw t1,4(sp) 284: c62e sw a1,12(sp) 286: c41a sw t1,8(sp) 288: 35b1 jal d4 <__umodsi3> *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); 28a: 47a5 li a5,9 28c: 4322 lw t1,8(sp) 28e: 45b2 lw a1,12(sp) 290: 4742 lw a4,16(sp) 292: 0ff57693 zext.b a3,a0 296: 06a7e163 bltu a5,a0,2f8 29a: 03068693 addi a3,a3,48 29e: 0ff6f693 zext.b a3,a3 2a2: 00148793 addi a5,s1,1 2a6: 00d48023 sb a3,0(s1) value /= radix; 2aa: 851a mv a0,t1 2ac: c83a sw a4,16(sp) *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); 2ae: c63e sw a5,12(sp) value /= radix; 2b0: c42e sw a1,8(sp) 2b2: 3bdd jal a8 <__hidden___udivsi3> } while (value > 0); 2b4: 4692 lw a3,4(sp) 2b6: 45a2 lw a1,8(sp) 2b8: 47b2 lw a5,12(sp) 2ba: 4742 lw a4,16(sp) value /= radix; 2bc: 832a mv t1,a0 } while (value > 0); 2be: 02b6fb63 bgeu a3,a1,2f4 if (negative) 2c2: 4682 lw a3,0(sp) 2c4: c699 beqz a3,2d2 *(pbuffer++) = '-'; 2c6: 02d00693 li a3,45 2ca: 00d78023 sb a3,0(a5) 2ce: 00248793 addi a5,s1,2 len = (pbuffer - buffer); 2d2: 40e78533 sub a0,a5,a4 for (i = 0; i < len / 2; i++) { 2d6: 01f55693 srli a3,a0,0x1f 2da: 96aa add a3,a3,a0 *(pbuffer) = '\0'; 2dc: 00078023 sb zero,0(a5) for (i = 0; i < len / 2; i++) { 2e0: 8685 srai a3,a3,0x1 2e2: 4601 li a2,0 2e4: 17fd addi a5,a5,-1 2e6: 00d64b63 blt a2,a3,2fc } 2ea: 40f2 lw ra,28(sp) 2ec: 4462 lw s0,24(sp) 2ee: 44d2 lw s1,20(sp) 2f0: 6105 addi sp,sp,32 2f2: 8082 ret *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); 2f4: 84be mv s1,a5 2f6: b761 j 27e 2f8: 96a2 add a3,a3,s0 2fa: b755 j 29e char j = buffer[i]; 2fc: 00c705b3 add a1,a4,a2 buffer[i] = buffer[len-i-1]; 300: 0007c283 lbu t0,0(a5) char j = buffer[i]; 304: 0005c303 lbu t1,0(a1) for (i = 0; i < len / 2; i++) { 308: 0605 addi a2,a2,1 buffer[i] = buffer[len-i-1]; 30a: 00558023 sb t0,0(a1) buffer[len-i-1] = j; 30e: 00678023 sb t1,0(a5) for (i = 0; i < len / 2; i++) { 312: bfc9 j 2e4 00000314 : void ssd1306_i2c_setup(void) { uint16_t tempreg; // Reset I2C1 to init all regs RCC->APB1PRSTR |= RCC_APB1Periph_I2C1; 314: 400217b7 lui a5,0x40021 318: 4b98 lw a4,16(a5) 31a: 002006b7 lui a3,0x200 31e: 8f55 or a4,a4,a3 320: cb98 sw a4,16(a5) RCC->APB1PRSTR &= ~RCC_APB1Periph_I2C1; 322: 4b98 lw a4,16(a5) 324: ffe006b7 lui a3,0xffe00 328: 16fd addi a3,a3,-1 # ffdfffff <_eusrstack+0xdfdff7ff> 32a: 8f75 and a4,a4,a3 32c: cb98 sw a4,16(a5) // set freq tempreg = I2C1->CTLR2; 32e: 400057b7 lui a5,0x40005 332: 4047d703 lhu a4,1028(a5) # 40005404 <_eusrstack+0x20004c04> tempreg &= ~I2C_CTLR2_FREQ; 336: 66c1 lui a3,0x10 338: fc068693 addi a3,a3,-64 # ffc0 33c: 8f75 and a4,a4,a3 tempreg |= (FUNCONF_SYSTEM_CORE_CLOCK/SSD1306_I2C_PRERATE)&I2C_CTLR2_FREQ; 33e: 01876713 ori a4,a4,24 I2C1->CTLR2 = tempreg; 342: 40e79223 sh a4,1028(a5) tempreg = (FUNCONF_SYSTEM_CORE_CLOCK/(25*SSD1306_I2C_CLKRATE))&I2C_CKCFGR_CCR; tempreg |= I2C_CKCFGR_DUTY; #endif tempreg |= I2C_CKCFGR_FS; #endif I2C1->CKCFGR = tempreg; 346: 7771 lui a4,0xffffc 348: 0705 addi a4,a4,1 # ffffc001 <_eusrstack+0xdfffb801> 34a: 40e79e23 sh a4,1052(a5) // initialize the state ssd1306_i2c_irq_state = 0; #endif // Enable I2C I2C1->CTLR1 |= I2C_CTLR1_PE; 34e: 4007d703 lhu a4,1024(a5) 352: 00176713 ori a4,a4,1 356: 40e79023 sh a4,1024(a5) // set ACK mode I2C1->CTLR1 |= I2C_CTLR1_ACK; 35a: 4007d703 lhu a4,1024(a5) 35e: 40076713 ori a4,a4,1024 362: 40e79023 sh a4,1024(a5) } 366: 8082 ret 00000368 : void ssd1306_drawPixel(uint32_t x, uint32_t y, int color) { uint32_t addr; /* clip */ if(x >= SSD1306_W) 368: 07f00793 li a5,127 36c: 02a7e763 bltu a5,a0,39a return; if(y >= SSD1306_H) 370: 03f00793 li a5,63 374: 02b7e363 bltu a5,a1,39a return; /* compute buffer address */ addr = x + SSD1306_W*(y/8); 378: 0035d793 srli a5,a1,0x3 37c: 079e slli a5,a5,0x7 37e: 97aa add a5,a5,a0 /* set/clear bit in buffer */ if(color) ssd1306_buffer[addr] |= (1<<(y&7)); 380: c4418513 addi a0,gp,-956 # 20000040 384: 953e add a0,a0,a5 386: 899d andi a1,a1,7 388: 4705 li a4,1 38a: 00054783 lbu a5,0(a0) 38e: 00b715b3 sll a1,a4,a1 if(color) 392: c609 beqz a2,39c ssd1306_buffer[addr] |= (1<<(y&7)); 394: 8fcd or a5,a5,a1 else ssd1306_buffer[addr] &= ~(1<<(y&7)); 396: 00f50023 sb a5,0(a0) } 39a: 8082 ret ssd1306_buffer[addr] &= ~(1<<(y&7)); 39c: fff5c593 not a1,a1 3a0: 8fed and a5,a5,a1 3a2: bfd5 j 396 000003a4 : /* * draw a string to the display */ void ssd1306_drawstr(int x, int y, const char *str, uint8_t color) { 3a4: fdc10113 addi sp,sp,-36 3a8: ce22 sw s0,28(sp) 3aa: cc26 sw s1,24(sp) 3ac: d006 sw ra,32(sp) 3ae: 842a mv s0,a0 3b0: 82ae mv t0,a1 3b2: 84b2 mv s1,a2 uint8_t c; while((c=*str++)) 3b4: 0004c383 lbu t2,0(s1) 3b8: 0485 addi s1,s1,1 3ba: 06038563 beqz t2,424 3be: 4701 li a4,0 d = fontdata[(chr<<3)+i]; 3c0: 00339793 slli a5,t2,0x3 3c4: 6609 lui a2,0x2 3c6: 97ba add a5,a5,a4 3c8: 03460613 addi a2,a2,52 # 2034 3cc: 97b2 add a5,a5,a2 3ce: 0007c303 lbu t1,0(a5) 3d2: 4781 li a5,0 if(d&0x80) 3d4: 01831593 slli a1,t1,0x18 3d8: 85e1 srai a1,a1,0x18 3da: 8636 mv a2,a3 3dc: 0005c463 bltz a1,3e4 col = (~color)&1; 3e0: 0016c613 xori a2,a3,1 ssd1306_drawPixel(x+j, y+i, col); 3e4: 00e285b3 add a1,t0,a4 3e8: 00f40533 add a0,s0,a5 3ec: ca36 sw a3,20(sp) 3ee: c81a sw t1,16(sp) 3f0: c61e sw t2,12(sp) 3f2: c43a sw a4,8(sp) 3f4: c216 sw t0,4(sp) 3f6: c03e sw a5,0(sp) 3f8: 3f85 jal 368 d <<= 1; 3fa: 4342 lw t1,16(sp) for(j=0;j<8;j++) 3fc: 4782 lw a5,0(sp) 3fe: 4621 li a2,8 d <<= 1; 400: 0306 slli t1,t1,0x1 for(j=0;j<8;j++) 402: 0785 addi a5,a5,1 404: 4292 lw t0,4(sp) 406: 4722 lw a4,8(sp) 408: 43b2 lw t2,12(sp) 40a: 46d2 lw a3,20(sp) d <<= 1; 40c: 0ff37313 zext.b t1,t1 for(j=0;j<8;j++) 410: fcc792e3 bne a5,a2,3d4 for(i=0;i<8;i++) 414: 0705 addi a4,a4,1 416: faf715e3 bne a4,a5,3c0 { ssd1306_drawchar(x, y, c, color); x += 8; 41a: 9432 add s0,s0,a2 if(x>120) 41c: 07800793 li a5,120 420: f887dae3 bge a5,s0,3b4 break; } } 424: 5082 lw ra,32(sp) 426: 4472 lw s0,28(sp) 428: 44e2 lw s1,24(sp) 42a: 02410113 addi sp,sp,36 42e: 8082 ret 00000430 : static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } // short square-wave beep on the passive piezo (blocking, ms-scale only) static void beep(uint16_t freq, uint16_t ms) { if (!sound_on) return; 430: c061c783 lbu a5,-1018(gp) # 20000002 434: c7ad beqz a5,49e { 436: 1131 addi sp,sp,-20 438: c622 sw s0,12(sp) 43a: 842e mv s0,a1 if (freq == 0) { Delay_Ms(ms); return; } uint32_t half = 500000u / freq; // half-period in us 43c: 85aa mv a1,a0 43e: 0007a537 lui a0,0x7a 442: 12050513 addi a0,a0,288 # 7a120 { 446: c806 sw ra,16(sp) 448: c426 sw s1,8(sp) uint32_t half = 500000u / freq; // half-period in us 44a: 39b9 jal a8 <__hidden___udivsi3> uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 44c: 00541793 slli a5,s0,0x5 450: 8f81 sub a5,a5,s0 452: 078a slli a5,a5,0x2 454: 97a2 add a5,a5,s0 456: 00151413 slli s0,a0,0x1 uint32_t half = 500000u / freq; // half-period in us 45a: 84aa mv s1,a0 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 45c: 85a2 mv a1,s0 45e: 00379513 slli a0,a5,0x3 462: 3199 jal a8 <__hidden___udivsi3> for (uint32_t i = 0; i < cycles; i++) { funDigitalWrite(BUZZER, FUN_HIGH); Delay_Us(half); 464: 9426 add s0,s0,s1 466: 00141793 slli a5,s0,0x1 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 46a: 872a mv a4,a0 Delay_Us(half); 46c: c03e sw a5,0(sp) for (uint32_t i = 0; i < cycles; i++) { 46e: 4401 li s0,0 Delay_Us(half); 470: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_HIGH); 472: 400114b7 lui s1,0x40011 476: c23a sw a4,4(sp) 478: 4691 li a3,4 47a: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00> 47e: c894 sw a3,16(s1) Delay_Us(half); 480: 33c9 jal 242 funDigitalWrite(BUZZER, FUN_LOW); Delay_Us(half); 482: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_LOW); 484: 000406b7 lui a3,0x40 488: c894 sw a3,16(s1) Delay_Us(half); 48a: 3b65 jal 242 for (uint32_t i = 0; i < cycles; i++) { 48c: 4712 lw a4,4(sp) 48e: 0405 addi s0,s0,1 490: fe8710e3 bne a4,s0,470 } } 494: 40c2 lw ra,16(sp) 496: 4432 lw s0,12(sp) 498: 44a2 lw s1,8(sp) 49a: 0151 addi sp,sp,20 49c: 8082 ret 49e: 8082 ret 000004a0 : static void led_blink(void) { 4a0: 1161 addi sp,sp,-8 4a2: c022 sw s0,0(sp) funDigitalWrite(LED_PIN, FUN_HIGH); 4a4: 40011437 lui s0,0x40011 { 4a8: c206 sw ra,4(sp) funDigitalWrite(LED_PIN, FUN_HIGH); 4aa: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000> 4ae: 4789 li a5,2 Delay_Ms(30); 4b0: 0002c537 lui a0,0x2c funDigitalWrite(LED_PIN, FUN_HIGH); 4b4: c81c sw a5,16(s0) Delay_Ms(30); 4b6: f2050513 addi a0,a0,-224 # 2bf20 4ba: 3361 jal 242 funDigitalWrite(LED_PIN, FUN_LOW); 4bc: 000207b7 lui a5,0x20 } 4c0: 4092 lw ra,4(sp) funDigitalWrite(LED_PIN, FUN_LOW); 4c2: c81c sw a5,16(s0) } 4c4: 4402 lw s0,0(sp) 4c6: 0121 addi sp,sp,8 4c8: 8082 ret 000004ca : static void pet_reset(void) { pet.satiety = 80; 4ca: 645a5737 lui a4,0x645a5 4ce: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850> 4d2: c2e1ac23 sw a4,-968(gp) # 20000034 pet.happy = 80; pet.energy = 90; pet.hygiene = 100; pet.health = 100; 4d6: c3818793 addi a5,gp,-968 # 20000034 4da: 06400713 li a4,100 4de: 00e78223 sb a4,4(a5) # 20004 pet.age_min = 0; pet.poop = 0; pet.sleeping = 0; pet.alive = 1; 4e2: 4705 li a4,1 pet.age_min = 0; 4e4: 00079323 sh zero,6(a5) pet.poop = 0; 4e8: 00079423 sh zero,8(a5) pet.alive = 1; 4ec: 00e78523 sb a4,10(a5) screen = SCR_MAIN; 4f0: c2018aa3 sb zero,-971(gp) # 20000031 cursor = 0; 4f4: c2018a23 sb zero,-972(gp) # 20000030 for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } 4f8: c201a823 sw zero,-976(gp) # 2000002c 4fc: c201a623 sw zero,-980(gp) # 20000028 } 500: 8082 ret 00000502 : // Chirp once when a need first drops below 50% (gentle) or 20% (urgent), // re-arming only after it recovers. Audible even while the screen is off, // so it works as a "tend to me" reminder. static void notify(uint8_t idx, int8_t val) { 502: 1141 addi sp,sp,-16 504: c422 sw s0,8(sp) 506: c606 sw ra,12(sp) 508: c226 sw s1,4(sp) if (val < 20) { 50a: 474d li a4,19 { 50c: 87aa mv a5,a0 if (val < 20) { 50e: c2c18413 addi s0,gp,-980 # 20000028 512: 04b74463 blt a4,a1,55a if (!crit_flag[idx]) { // urgent: descending triple 516: 942a add s0,s0,a0 518: 00044703 lbu a4,0(s0) 51c: eb15 bnez a4,550 51e: c02a sw a0,0(sp) beep(1568, 60); beep(1175, 60); beep(880, 90); 520: 03c00593 li a1,60 524: 62000513 li a0,1568 528: 3721 jal 430 52a: 03c00593 li a1,60 52e: 49700513 li a0,1175 532: 3dfd jal 430 534: 05a00593 li a1,90 538: 37000513 li a0,880 53c: 3dd5 jal 430 crit_flag[idx] = 1; warn_flag[idx] = 1; 53e: 4782 lw a5,0(sp) 540: c3018713 addi a4,gp,-976 # 2000002c 544: 4685 li a3,1 546: 97ba add a5,a5,a4 548: 00d40023 sb a3,0(s0) 54c: 00d78023 sb a3,0(a5) } crit_flag[idx] = 0; } else { warn_flag[idx] = 0; crit_flag[idx] = 0; } } 550: 40b2 lw ra,12(sp) 552: 4422 lw s0,8(sp) 554: 4492 lw s1,4(sp) 556: 0141 addi sp,sp,16 558: 8082 ret } else if (val < 50) { 55a: c3018493 addi s1,gp,-976 # 2000002c 55e: 03100713 li a4,49 if (!warn_flag[idx]) { // gentle: single chirp 562: 94aa add s1,s1,a0 } else if (val < 50) { 564: 02b74363 blt a4,a1,58a if (!warn_flag[idx]) { // gentle: single chirp 568: 0004c703 lbu a4,0(s1) 56c: eb19 bnez a4,582 56e: c02a sw a0,0(sp) beep(1568, 50); 570: 03200593 li a1,50 574: 62000513 li a0,1568 578: 3d65 jal 430 warn_flag[idx] = 1; 57a: 4782 lw a5,0(sp) 57c: 4705 li a4,1 57e: 00e48023 sb a4,0(s1) warn_flag[idx] = 0; crit_flag[idx] = 0; 582: 943e add s0,s0,a5 584: 00040023 sb zero,0(s0) } 588: b7e1 j 550 warn_flag[idx] = 0; crit_flag[idx] = 0; 58a: 00048023 sb zero,0(s1) 58e: bfd5 j 582 00000590 : } } // ----------------------------------------------------------------- drawing static void draw_center_str(int y, const char *s) { 590: 862e mv a2,a1 int len = 0; 592: 4701 li a4,0 while (s[len]) len++; 594: 00e607b3 add a5,a2,a4 598: 0007c783 lbu a5,0(a5) 59c: ef81 bnez a5,5b4 int x = (SSD1306_W - len * 8) / 2; 59e: 47c1 li a5,16 5a0: 8f99 sub a5,a5,a4 5a2: 078a slli a5,a5,0x2 if (x < 0) x = 0; 5a4: fff7c713 not a4,a5 5a8: 877d srai a4,a4,0x1f ssd1306_drawstr(x, y, s, 1); 5aa: 85aa mv a1,a0 5ac: 4685 li a3,1 5ae: 00e7f533 and a0,a5,a4 5b2: bbcd j 3a4 while (s[len]) len++; 5b4: 0705 addi a4,a4,1 5b6: bff9 j 594 000005b8 : static Buttons read_buttons(void) { // active-low: pressed reads 0 Buttons b; b.ok = !funDigitalRead(BTN_OK); 5b8: 400117b7 lui a5,0x40011 5bc: 4788 lw a0,8(a5) b.left = !funDigitalRead(BTN_LEFT); 5be: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00> 5c2: 4798 lw a4,8(a5) b.right = !funDigitalRead(BTN_RIGHT); 5c4: 479c lw a5,8(a5) b.ok = !funDigitalRead(BTN_OK); 5c6: fff54513 not a0,a0 b.left = !funDigitalRead(BTN_LEFT); 5ca: 8319 srli a4,a4,0x6 5cc: fff74713 not a4,a4 b.right = !funDigitalRead(BTN_RIGHT); 5d0: 8395 srli a5,a5,0x5 5d2: fff7c793 not a5,a5 return b; 5d6: 8b05 andi a4,a4,1 5d8: 8905 andi a0,a0,1 5da: 0722 slli a4,a4,0x8 5dc: 8b85 andi a5,a5,1 { 5de: 1171 addi sp,sp,-4 return b; 5e0: 07c2 slli a5,a5,0x10 5e2: 8d59 or a0,a0,a4 } 5e4: 8d5d or a0,a0,a5 5e6: 0111 addi sp,sp,4 5e8: 8082 ret 000005ea : if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 5ea: 07f00793 li a5,127 5ee: 02a7cf63 blt a5,a0,62c void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) 5f2: 1141 addi sp,sp,-16 5f4: c422 sw s0,8(sp) 5f6: c606 sw ra,12(sp) 5f8: c226 sw s1,4(sp) if((y+h-1) >= SSD1306_H) h = SSD1306_H-y; 5fa: 00c587b3 add a5,a1,a2 5fe: 04000713 li a4,64 602: 842e mv s0,a1 604: 00f75463 bge a4,a5,60c 608: 40b70633 sub a2,a4,a1 60c: 008604b3 add s1,a2,s0 while(h--) 610: 00941763 bne s0,s1,61e } 614: 40b2 lw ra,12(sp) 616: 4422 lw s0,8(sp) 618: 4492 lw s1,4(sp) 61a: 0141 addi sp,sp,16 61c: 8082 ret ssd1306_drawPixel(x, y++, color); 61e: 85a2 mv a1,s0 620: 4605 li a2,1 622: c02a sw a0,0(sp) 624: 3391 jal 368 626: 4502 lw a0,0(sp) 628: 0405 addi s0,s0,1 62a: b7dd j 610 62c: 8082 ret 0000062e : void ssd1306_drawImage(uint32_t x, uint32_t y, const unsigned char* input, uint32_t width, uint32_t height, uint32_t color_mode) { 62e: fd810113 addi sp,sp,-40 632: 00e587b3 add a5,a1,a4 636: d222 sw s0,36(sp) 638: d026 sw s1,32(sp) 63a: c82a sw a0,16(sp) 63c: ca32 sw a2,20(sp) uint32_t bytes_to_draw = width / 8; 63e: 0036d413 srli s0,a3,0x3 642: c63e sw a5,12(sp) 644: 4381 li t2,0 uint32_t v_mask = 1 << (y_absolute & 7); 646: 0075f793 andi a5,a1,7 64a: 4705 li a4,1 64c: 00f717b3 sll a5,a4,a5 650: c03e sw a5,0(sp) uint32_t input_byte = input[byte + line * bytes_to_draw]; 652: 47d2 lw a5,20(sp) for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { 654: 4681 li a3,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; 656: 979e add a5,a5,t2 658: cc3e sw a5,24(sp) buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 65a: 0035d793 srli a5,a1,0x3 65e: 079e slli a5,a5,0x7 660: ce3e sw a5,28(sp) uint32_t input_byte = input[byte + line * bytes_to_draw]; 662: 47e2 lw a5,24(sp) x_absolute = x + 8 * byte + pixel; 664: 00369293 slli t0,a3,0x3 for (pixel = 0; pixel < 8; pixel++) { 668: 4701 li a4,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; 66a: 97b6 add a5,a5,a3 66c: 0007c783 lbu a5,0(a5) 670: c23e sw a5,4(sp) x_absolute = x + 8 * byte + pixel; 672: 47c2 lw a5,16(sp) 674: 92be add t0,t0,a5 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 676: 47f2 lw a5,28(sp) 678: 005784b3 add s1,a5,t0 if (x_absolute >= SSD1306_W) { 67c: 00e287b3 add a5,t0,a4 680: 07f00613 li a2,127 684: 04f66463 bltu a2,a5,6cc uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) 688: 4512 lw a0,4(sp) 68a: 08000793 li a5,128 68e: 40e7d7b3 sra a5,a5,a4 692: 8fe9 and a5,a5,a0 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 694: 00e48633 add a2,s1,a4 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 698: c4418513 addi a0,gp,-956 # 20000040 69c: 9532 add a0,a0,a2 69e: 00014303 lbu t1,0(sp) uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) 6a2: c43e sw a5,8(sp) ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 6a4: 00054783 lbu a5,0(a0) 6a8: fff34613 not a2,t1 for (pixel = 0; pixel < 8; pixel++) { 6ac: 0705 addi a4,a4,1 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 6ae: 8e7d and a2,a2,a5 6b0: 47a2 lw a5,8(sp) 6b2: 00f037b3 snez a5,a5 6b6: 40f007b3 neg a5,a5 6ba: 00f37333 and t1,t1,a5 6be: 00666633 or a2,a2,t1 6c2: 00c50023 sb a2,0(a0) for (pixel = 0; pixel < 8; pixel++) { 6c6: 47a1 li a5,8 6c8: faf71ae3 bne a4,a5,67c for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { 6cc: 0685 addi a3,a3,1 # 40001 6ce: f8d41ae3 bne s0,a3,662 for (uint32_t line = 0; line < height; line++) { 6d2: 47b2 lw a5,12(sp) 6d4: 0585 addi a1,a1,1 6d6: 93a2 add t2,t2,s0 6d8: 00b78663 beq a5,a1,6e4 if (y_absolute >= SSD1306_H) { 6dc: 04000793 li a5,64 6e0: f6f593e3 bne a1,a5,646 } 6e4: 5412 lw s0,36(sp) 6e6: 5482 lw s1,32(sp) 6e8: 02810113 addi sp,sp,40 6ec: 8082 ret 000006ee : void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) 6ee: 1141 addi sp,sp,-16 if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; 6f0: fff60793 addi a5,a2,-1 void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) 6f4: c606 sw ra,12(sp) 6f6: c422 sw s0,8(sp) 6f8: c226 sw s1,4(sp) if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; 6fa: 97aa add a5,a5,a0 6fc: 07f00713 li a4,127 700: 00f77563 bgeu a4,a5,70a 704: 08000613 li a2,128 708: 8e09 sub a2,a2,a0 70a: 00c50433 add s0,a0,a2 while (w--) 70e: 00851763 bne a0,s0,71c } 712: 40b2 lw ra,12(sp) 714: 4422 lw s0,8(sp) 716: 4492 lw s1,4(sp) 718: 0141 addi sp,sp,16 71a: 8082 ret ssd1306_drawPixel(x++, y, color); 71c: 4605 li a2,1 71e: 00150493 addi s1,a0,1 722: c02e sw a1,0(sp) 724: 3191 jal 368 726: 4582 lw a1,0(sp) 728: 8526 mv a0,s1 72a: b7d5 j 70e 0000072c : void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) 72c: 1131 addi sp,sp,-20 72e: c426 sw s1,8(sp) 730: 84b2 mv s1,a2 ssd1306_drawFastVLine(x, y, h, color); 732: 8636 mv a2,a3 void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) 734: c806 sw ra,16(sp) 736: c622 sw s0,12(sp) 738: c236 sw a3,4(sp) 73a: 842a mv s0,a0 73c: c02e sw a1,0(sp) ssd1306_drawFastVLine(x, y, h, color); 73e: 3575 jal 5ea ssd1306_drawFastVLine(x+w-1, y, h, color); 740: 4612 lw a2,4(sp) 742: 4582 lw a1,0(sp) 744: fff48513 addi a0,s1,-1 748: 9522 add a0,a0,s0 74a: 3545 jal 5ea 74c: 4582 lw a1,0(sp) 74e: 8626 mv a2,s1 750: 8522 mv a0,s0 752: 3f71 jal 6ee ssd1306_drawFastHLine(x, y+h-1, w, color); 754: 4782 lw a5,0(sp) 756: 8522 mv a0,s0 } 758: 4432 lw s0,12(sp) ssd1306_drawFastHLine(x, y+h-1, w, color); 75a: fff78593 addi a1,a5,-1 75e: 4792 lw a5,4(sp) } 760: 40c2 lw ra,16(sp) 762: 8626 mv a2,s1 764: 44a2 lw s1,8(sp) 766: 95be add a1,a1,a5 768: 0151 addi sp,sp,20 76a: b751 j 6ee 0000076c : { 76c: 1121 addi sp,sp,-24 76e: c822 sw s0,16(sp) 770: c626 sw s1,12(sp) 772: 842a mv s0,a0 774: 84b2 mv s1,a2 ssd1306_drawstr(0, y, label, 1); 776: 4685 li a3,1 778: 862e mv a2,a1 77a: 85aa mv a1,a0 77c: 4501 li a0,0 { 77e: ca06 sw ra,20(sp) ssd1306_drawstr(0, y, label, 1); 780: 3115 jal 3a4 ssd1306_drawRect(bx, y, bw, 7, 1); 782: 03000513 li a0,48 786: 469d li a3,7 788: 04c00613 li a2,76 78c: 85a2 mv a1,s0 78e: 3f79 jal 72c int fill = (val * (bw - 2)) / 100; 790: 00349513 slli a0,s1,0x3 794: 9526 add a0,a0,s1 796: 050a slli a0,a0,0x2 798: 9526 add a0,a0,s1 79a: 0506 slli a0,a0,0x1 if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 79c: 06300793 li a5,99 7a0: 02a7df63 bge a5,a0,7de 7a4: 00140793 addi a5,s0,1 int fill = (val * (bw - 2)) / 100; 7a8: 06400593 li a1,100 if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 7ac: c03e sw a5,0(sp) int fill = (val * (bw - 2)) / 100; 7ae: 38cd jal a0 <__divsi3> 7b0: 4782 lw a5,0(sp) 7b2: 872a mv a4,a0 7b4: 0419 addi s0,s0,6 7b6: 03170693 addi a3,a4,49 m=x; 7ba: 03100493 li s1,49 7be: 8526 mv a0,s1 ssd1306_drawPixel(m++, n, color); 7c0: 85be mv a1,a5 7c2: 4605 li a2,1 7c4: c436 sw a3,8(sp) 7c6: c23a sw a4,4(sp) 7c8: c03e sw a5,0(sp) 7ca: 3e79 jal 368 while(w--) 7cc: 46a2 lw a3,8(sp) ssd1306_drawPixel(m++, n, color); 7ce: 0485 addi s1,s1,1 while(w--) 7d0: 4782 lw a5,0(sp) 7d2: 4712 lw a4,4(sp) 7d4: fed495e3 bne s1,a3,7be n++; 7d8: 0785 addi a5,a5,1 while(h--) 7da: fc879ee3 bne a5,s0,7b6 } 7de: 40d2 lw ra,20(sp) 7e0: 4442 lw s0,16(sp) 7e2: 44b2 lw s1,12(sp) 7e4: 0161 addi sp,sp,24 7e6: 8082 ret 000007e8 : uint32_t dmd0 = *dmdata0; 7e8: e00007b7 lui a5,0xe0000 7ec: 0f47a783 lw a5,244(a5) # e00000f4 <_eusrstack+0xbffff8f4> } 7f0: 8082 ret 000007f2 <_write.constprop.0>: if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; 7f2: e00007b7 lui a5,0xe0000 7f6: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> 7fa: 4398 lw a4,0(a5) WEAK int _write(int fd, const char *buf, int size) 7fc: 1121 addi sp,sp,-24 7fe: ca06 sw ra,20(sp) 800: c822 sw s0,16(sp) 802: c626 sw s1,12(sp) if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; 804: 0c077713 andi a4,a4,192 808: 0c000693 li a3,192 80c: 00d70b63 beq a4,a3,822 <_write.constprop.0+0x30> char buffer[4] = { 0 }; 810: c402 sw zero,8(sp) 812: 842e mv s0,a1 if( size == 0 ) 814: eddd bnez a1,8d2 <_write.constprop.0+0xe0> lastdmd = (*DMDATA0); 816: 439c lw a5,0(a5) if( lastdmd && !(lastdmd&0x80) ) internal_handle_input( (uint32_t*)DMDATA0 ); 818: c789 beqz a5,822 <_write.constprop.0+0x30> 81a: 0807f793 andi a5,a5,128 81e: e391 bnez a5,822 <_write.constprop.0+0x30> 820: 37e1 jal 7e8 if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; 822: 4401 li s0,0 } 824: 40d2 lw ra,20(sp) 826: 8522 mv a0,s0 828: 4442 lw s0,16(sp) 82a: 44b2 lw s1,12(sp) 82c: 0161 addi sp,sp,24 82e: 8082 ret int tosend = size - place; 830: 409407b3 sub a5,s0,s1 if( tosend > 7 ) tosend = 7; 834: 471d li a4,7 836: 00f75363 bge a4,a5,83c <_write.constprop.0+0x4a> 83a: 87ba mv a5,a4 83c: 001006b7 lui a3,0x100 while( ( lastdmd = (*DMDATA0) ) & 0x80 ) 840: e0000737 lui a4,0xe0000 if( tosend > 7 ) tosend = 7; 844: 0685 addi a3,a3,1 # 100001 while( ( lastdmd = (*DMDATA0) ) & 0x80 ) 846: 0f470713 addi a4,a4,244 # e00000f4 <_eusrstack+0xbffff8f4> 84a: 4310 lw a2,0(a4) 84c: 08067593 andi a1,a2,128 850: e1a5 bnez a1,8b0 <_write.constprop.0+0xbe> if( lastdmd ) internal_handle_input( (uint32_t*)DMDATA0 ); 852: c611 beqz a2,85e <_write.constprop.0+0x6c> 854: c22a sw a0,4(sp) 856: c03e sw a5,0(sp) 858: 3f41 jal 7e8 85a: 4512 lw a0,4(sp) 85c: 4782 lw a5,0(sp) 85e: 0034 addi a3,sp,8 if( tosend > 7 ) tosend = 7; 860: 470d li a4,3 862: 85b6 mv a1,a3 while( t < tosend ) 864: 04f74d63 blt a4,a5,8be <_write.constprop.0+0xcc> *DMDATA1 = *(uint32_t*)&(buffer[0]); 868: 46a2 lw a3,8(sp) 86a: e0000737 lui a4,0xe0000 while( t < tosend && t < 3 ) 86e: 460d li a2,3 *DMDATA1 = *(uint32_t*)&(buffer[0]); 870: 0ed72c23 sw a3,248(a4) # e00000f8 <_eusrstack+0xbffff8f8> 874: 009506b3 add a3,a0,s1 t = 0; 878: 4701 li a4,0 buffer[t+1] = buf[t+place]; 87a: 0006c283 lbu t0,0(a3) 87e: 0705 addi a4,a4,1 880: 00e58333 add t1,a1,a4 884: 00530023 sb t0,0(t1) while( t < tosend && t < 3 ) 888: 00e78563 beq a5,a4,892 <_write.constprop.0+0xa0> 88c: 0685 addi a3,a3,1 88e: fec716e3 bne a4,a2,87a <_write.constprop.0+0x88> buffer[0] = 0x80 | (tosend + 4); 892: 00478713 addi a4,a5,4 896: f8076713 ori a4,a4,-128 89a: 00e10423 sb a4,8(sp) *DMDATA0 = *(uint32_t*)&(buffer[0]); 89e: 46a2 lw a3,8(sp) 8a0: e0000737 lui a4,0xe0000 place += tosend; 8a4: 94be add s1,s1,a5 *DMDATA0 = *(uint32_t*)&(buffer[0]); 8a6: 0ed72a23 sw a3,244(a4) # e00000f4 <_eusrstack+0xbffff8f4> while( place < size ) 8aa: f884c3e3 blt s1,s0,830 <_write.constprop.0+0x3e> 8ae: bf9d j 824 <_write.constprop.0+0x32> if( timeout-- == 0 ) 8b0: 16fd addi a3,a3,-1 8b2: fec1 bnez a3,84a <_write.constprop.0+0x58> *DMDATA0 |= 0xc0; 8b4: 431c lw a5,0(a4) 8b6: 0c07e793 ori a5,a5,192 8ba: c31c sw a5,0(a4) return 0; 8bc: b79d j 822 <_write.constprop.0+0x30> buffer[t-3] = buf[t+place]; 8be: 00e48633 add a2,s1,a4 8c2: 962a add a2,a2,a0 8c4: 00064603 lbu a2,0(a2) t++; 8c8: 0705 addi a4,a4,1 8ca: 0685 addi a3,a3,1 buffer[t-3] = buf[t+place]; 8cc: fec68fa3 sb a2,-1(a3) 8d0: bf51 j 864 <_write.constprop.0+0x72> 8d2: 4481 li s1,0 8d4: bfd9 j 8aa <_write.constprop.0+0xb8> 000008d6 <__puts_uart>: { 8d6: 1161 addi sp,sp,-8 8d8: c022 sw s0,0(sp) 8da: c206 sw ra,4(sp) 8dc: 842e mv s0,a1 _write( 0, s, len ); 8de: 3f11 jal 7f2 <_write.constprop.0> } 8e0: 4092 lw ra,4(sp) 8e2: 8522 mv a0,s0 8e4: 4402 lw s0,0(sp) 8e6: 0121 addi sp,sp,8 8e8: 8082 ret 000008ea : asm volatile( "\n\ 8ea: 20000197 auipc gp,0x20000 8ee: b1218193 addi gp,gp,-1262 # 200003fc <__global_pointer$> 8f2: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack> 8f6: 6509 lui a0,0x2 8f8: 88050513 addi a0,a0,-1920 # 1880 8fc: 30051073 csrw mstatus,a0 900: fffff697 auipc a3,0xfffff 904: 70068693 addi a3,a3,1792 # 0 908: 0036e693 ori a3,a3,3 90c: 30569073 csrw mtvec,a3 asm volatile( 910: c1c18513 addi a0,gp,-996 # 20000018 914: 04418593 addi a1,gp,68 # 20000440 <_ebss> 918: 4601 li a2,0 91a: 00b55663 bge a0,a1,926 91e: c110 sw a2,0(a0) 920: 0511 addi a0,a0,4 922: feb54ee3 blt a0,a1,91e 926: 00002517 auipc a0,0x2 92a: f0e50513 addi a0,a0,-242 # 2834 <_data_lma> 92e: c0418593 addi a1,gp,-1020 # 20000000 932: c1c18613 addi a2,gp,-996 # 20000018 936: 00c58863 beq a1,a2,946 93a: 4114 lw a3,0(a0) 93c: c194 sw a3,0(a1) 93e: 0511 addi a0,a0,4 940: 0591 addi a1,a1,4 942: fec59ae3 bne a1,a2,936 SysTick->CTLR = 1; 946: e000f7b7 lui a5,0xe000f 94a: 4705 li a4,1 94c: c398 sw a4,0(a5) asm volatile( 94e: 6785 lui a5,0x1 950: e6078793 addi a5,a5,-416 # e60
954: 34179073 csrw mepc,a5 958: 30200073 mret 0000095c : // Return the Machine Exception Program Register (MEPC) static inline uint32_t __get_MEPC(void) { uint32_t result; __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mepc" : "=r"(result)); 95c: 34102573 csrr a0,mepc PrintHex( __get_MEPC() ); // "addr2line -e debugprintfdemo.elf 0x000007e6" ---> debugprintfdemo.c:45 960: 889ff0ef jal 1e8 __ASM volatile( ADD_ARCH_ZICSR "csrr %0, mstatus": "=r"(result) ); 964: 30002573 csrr a0,mstatus PrintHex( __get_MSTATUS() ); 968: 881ff0ef jal 1e8 // Return the Machine Trap Value Register (MTVAL) static inline uint32_t __get_MTVAL(void) { uint32_t result; __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mtval" : "=r" (result) ); 96c: 34302573 csrr a0,mtval PrintHex( __get_MTVAL() ); 970: 879ff0ef jal 1e8 __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mcause": "=r"(result)); 974: 34202573 csrr a0,mcause PrintHex( __get_MCAUSE() ); 978: 871ff0ef jal 1e8 while( (*DMDATA0) & 0x80 ); 97c: e00007b7 lui a5,0xe0000 980: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> 984: 4398 lw a4,0(a5) 986: 08077713 andi a4,a4,128 98a: ff6d bnez a4,984 *DMDATA0 = 0x0a85; 98c: 6705 lui a4,0x1 98e: a8570713 addi a4,a4,-1403 # a85 992: c398 sw a4,0(a5) while( (*DMDATA0) & 0x80 ); 994: e00007b7 lui a5,0xe0000 998: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> 99c: 4398 lw a4,0(a5) 99e: 08077713 andi a4,a4,128 9a2: ff6d bnez a4,99c *DMDATA0 = 0xaaaaaa83; 9a4: aaaab737 lui a4,0xaaaab 9a8: a8370713 addi a4,a4,-1405 # aaaaaa83 <_eusrstack+0x8aaaa283> 9ac: c398 sw a4,0(a5) asm volatile( "1: j 1b" ); 9ae: a001 j 9ae 000009b0 : RCC->INTR |= RCC_CSSC; // clear the clock security int flag 9b0: 40021737 lui a4,0x40021 9b4: 471c lw a5,8(a4) 9b6: 008006b7 lui a3,0x800 9ba: 8fd5 or a5,a5,a3 9bc: c71c sw a5,8(a4) 000009be : for (; *s; s++); 9be: 87aa mv a5,a0 9c0: 0007c703 lbu a4,0(a5) 9c4: e701 bnez a4,9cc } 9c6: 40a78533 sub a0,a5,a0 9ca: 8082 ret for (; *s; s++); 9cc: 0785 addi a5,a5,1 9ce: bfcd j 9c0 000009d0 : { 9d0: fa410113 addi sp,sp,-92 9d4: caa2 sw s0,84(sp) 9d6: c8a6 sw s1,80(sp) 9d8: cc86 sw ra,88(sp) 9da: c02a sw a0,0(sp) 9dc: c22e sw a1,4(sp) 9de: 8432 mv s0,a2 9e0: 84b6 mv s1,a3 if(puts == (void*)0) { 9e2: e509 bnez a0,9ec puts = _puts; buf = (void*)0; 9e4: 1a800793 li a5,424 9e8: c202 sw zero,4(sp) 9ea: c03e sw a5,0(sp) int n = 0; 9ec: ca02 sw zero,20(sp) while ((ch=*(fmt++))) { 9ee: 00044783 lbu a5,0(s0) 9f2: 00140713 addi a4,s0,1 9f6: 00f10fa3 sb a5,31(sp) 9fa: eb81 bnez a5,a0a } 9fc: 40e6 lw ra,88(sp) 9fe: 4456 lw s0,84(sp) a00: 4552 lw a0,20(sp) a02: 44c6 lw s1,80(sp) a04: 05c10113 addi sp,sp,92 a08: 8082 ret a0a: c63a sw a4,12(sp) if (ch!='%') { a0c: 02500693 li a3,37 a10: 02d78063 beq a5,a3,a30 len = puts(&ch, len, buf); a14: 4612 lw a2,4(sp) a16: 4782 lw a5,0(sp) a18: 4585 li a1,1 a1a: 01f10513 addi a0,sp,31 a1e: 9782 jalr a5 while ((ch=*(fmt++))) { a20: 4732 lw a4,12(sp) a22: c426 sw s1,8(sp) a24: 843a mv s0,a4 n = n + len; a26: 47d2 lw a5,20(sp) a28: 44a2 lw s1,8(sp) a2a: 97aa add a5,a5,a0 a2c: ca3e sw a5,20(sp) a2e: b7c1 j 9ee ch=*(fmt++); a30: 00144783 lbu a5,1(s0) if (ch == '0') pad_char = '0'; a34: 03000693 li a3,48 ch=*(fmt++); a38: 00240713 addi a4,s0,2 a3c: 00f10fa3 sb a5,31(sp) if (ch == '0') pad_char = '0'; a40: c63e sw a5,12(sp) a42: 08d79363 bne a5,a3,ac8 ch=*(fmt++); a46: 843a mv s0,a4 a48: 4681 li a3,0 a4a: 4701 li a4,0 while (ch >= '0' && ch <= '9') { a4c: 45a5 li a1,9 a4e: a819 j a64 pad_to = pad_to * 10 + (ch - '0'); a50: 00271793 slli a5,a4,0x2 a54: 97ba add a5,a5,a4 a56: 0786 slli a5,a5,0x1 ch=*(fmt++); a58: 0405 addi s0,s0,1 pad_to = pad_to * 10 + (ch - '0'); a5a: 00f60733 add a4,a2,a5 ch=*(fmt++); a5e: fff44783 lbu a5,-1(s0) a62: 4685 li a3,1 while (ch >= '0' && ch <= '9') { a64: fd078613 addi a2,a5,-48 a68: 0ff67513 zext.b a0,a2 a6c: fea5f2e3 bgeu a1,a0,a50 a70: c299 beqz a3,a76 a72: 00f10fa3 sb a5,31(sp) if(pad_to > (signed int) sizeof(bf)) { a76: c83a sw a4,16(sp) a78: 46e1 li a3,24 a7a: 00e6d363 bge a3,a4,a80 a7e: c836 sw a3,16(sp) if (ch == 'l') { a80: 06c00613 li a2,108 char l = 0; a84: 4681 li a3,0 if (ch == 'l') { a86: 00c79863 bne a5,a2,a96 ch=*(fmt++); a8a: 00044783 lbu a5,0(s0) l = 1; a8e: 4685 li a3,1 ch=*(fmt++); a90: 0405 addi s0,s0,1 a92: 00f10fa3 sb a5,31(sp) switch (ch) { a96: 01f14603 lbu a2,31(sp) a9a: 06400793 li a5,100 a9e: 06f60563 beq a2,a5,b08 aa2: 02c7e763 bltu a5,a2,ad0 aa6: 05800793 li a5,88 aaa: 0af60263 beq a2,a5,b4e aae: 06300793 li a5,99 ab2: 0cf60063 beq a2,a5,b72 ab6: d239 beqz a2,9fc len = puts(&ch, len, buf); ab8: 4612 lw a2,4(sp) aba: 4782 lw a5,0(sp) abc: 4585 li a1,1 abe: 01f10513 addi a0,sp,31 ac2: 9782 jalr a5 break; ac4: c426 sw s1,8(sp) ac6: b785 j a26 char pad_char = ' '; ac8: 02000693 li a3,32 acc: c636 sw a3,12(sp) ace: bfa5 j a46 switch (ch) { ad0: 07500793 li a5,117 ad4: 02f60a63 beq a2,a5,b08 ad8: 07800793 li a5,120 adc: 06f60963 beq a2,a5,b4e ae0: 07300793 li a5,115 ae4: fcf61ae3 bne a2,a5,ab8 ptr = va_arg(va, char*); ae8: 00448793 addi a5,s1,4 aec: 4084 lw s1,0(s1) aee: cc3a sw a4,24(sp) af0: c43e sw a5,8(sp) len = mini_strlen(ptr); af2: 8526 mv a0,s1 af4: 35e9 jal 9be if (pad_to > 0) { af6: 4762 lw a4,24(sp) len = mini_strlen(ptr); af8: 85aa mv a1,a0 if (pad_to > 0) { afa: 08e05963 blez a4,b8c len = mini_pad(ptr, len, pad_char, pad_to, bf); afe: 46c2 lw a3,16(sp) b00: 4632 lw a2,12(sp) b02: 1838 addi a4,sp,56 b04: 8526 mv a0,s1 b06: a025 j b2e len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); b08: 00448793 addi a5,s1,4 b0c: c43e sw a5,8(sp) if(l) { b0e: ca85 beqz a3,b3e len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); b10: f8b60613 addi a2,a2,-117 b14: 1018 addi a4,sp,32 b16: 00163693 seqz a3,a2 b1a: 4088 lw a0,0(s1) b1c: 4601 li a2,0 b1e: 45a9 li a1,10 b20: f34ff0ef jal 254 len = mini_pad(bf2, len, pad_char, pad_to, bf); b24: 46c2 lw a3,16(sp) b26: 4632 lw a2,12(sp) b28: 1838 addi a4,sp,56 b2a: 85aa mv a1,a0 len = mini_pad(bf2, len, pad_char, pad_to, bf); b2c: 1008 addi a0,sp,32 b2e: df0ff0ef jal 11e len = puts(bf, len, buf); b32: 4612 lw a2,4(sp) len = mini_pad(bf2, len, pad_char, pad_to, bf); b34: 85aa mv a1,a0 len = puts(bf, len, buf); b36: 1828 addi a0,sp,56 b38: 4782 lw a5,0(sp) b3a: 9782 jalr a5 break; b3c: b5ed j a26 if(ch == 'u') { b3e: 07500793 li a5,117 b42: 1018 addi a4,sp,32 b44: 4685 li a3,1 b46: fcf60ae3 beq a2,a5,b1a if (radix > 16) b4a: 4681 li a3,0 b4c: b7f9 j b1a if(l) { b4e: 4088 lw a0,0(s1) len = mini_itoa(va_arg(va, unsigned long), 16, (ch=='X'), 1, bf2); b50: fa860613 addi a2,a2,-88 len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); b54: 00448793 addi a5,s1,4 b58: 1018 addi a4,sp,32 b5a: 4685 li a3,1 b5c: 00163613 seqz a2,a2 b60: 45c1 li a1,16 b62: c43e sw a5,8(sp) if (radix > 16) b64: ef0ff0ef jal 254 len = mini_pad(bf2, len, pad_char, pad_to, bf); b68: 46c2 lw a3,16(sp) b6a: 4632 lw a2,12(sp) b6c: 85aa mv a1,a0 b6e: 1838 addi a4,sp,56 b70: bf75 j b2c ch = (char)(va_arg(va, int)); b72: 00448793 addi a5,s1,4 b76: c43e sw a5,8(sp) b78: 409c lw a5,0(s1) len = mini_pad(&ch, 1, pad_char, pad_to, bf); b7a: 46c2 lw a3,16(sp) b7c: 4632 lw a2,12(sp) ch = (char)(va_arg(va, int)); b7e: 00f10fa3 sb a5,31(sp) len = mini_pad(&ch, 1, pad_char, pad_to, bf); b82: 1838 addi a4,sp,56 b84: 4585 li a1,1 b86: 01f10513 addi a0,sp,31 b8a: b755 j b2e len = puts(ptr, len, buf); b8c: 4612 lw a2,4(sp) b8e: 8526 mv a0,s1 b90: b765 j b38 00000b92 : { b92: 1111 addi sp,sp,-28 b94: c632 sw a2,12(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); b96: 862a mv a2,a0 b98: 6505 lui a0,0x1 { b9a: c42e sw a1,8(sp) b9c: c836 sw a3,16(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); b9e: 4581 li a1,0 va_start( args, format ); ba0: 0034 addi a3,sp,8 int ret_status = mini_vpprintf(__puts_uart, 0, format, args); ba2: 8d650513 addi a0,a0,-1834 # 8d6 <__puts_uart> { ba6: c206 sw ra,4(sp) ba8: ca3a sw a4,20(sp) baa: cc3e sw a5,24(sp) va_start( args, format ); bac: c036 sw a3,0(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); bae: 350d jal 9d0 } bb0: 4092 lw ra,4(sp) bb2: 0171 addi sp,sp,28 bb4: 8082 ret 00000bb6 : * error handler */ uint8_t ssd1306_i2c_error(uint8_t err) { // report error printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); bb6: 6789 lui a5,0x2 bb8: 050a slli a0,a0,0x2 bba: ea078793 addi a5,a5,-352 # 1ea0 bbe: 97aa add a5,a5,a0 bc0: 438c lw a1,0(a5) bc2: 6509 lui a0,0x2 uint8_t ssd1306_i2c_error(uint8_t err) bc4: 1171 addi sp,sp,-4 printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); bc6: 90c50513 addi a0,a0,-1780 # 190c uint8_t ssd1306_i2c_error(uint8_t err) bca: c006 sw ra,0(sp) printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); bcc: 37d9 jal b92 // reset & initialize I2C ssd1306_i2c_setup(); return 1; } bce: 4082 lw ra,0(sp) bd0: 0111 addi sp,sp,4 ssd1306_i2c_setup(); bd2: f42ff06f j 314 00000bd6 : } #else /* * low-level packet send for blocking polled operation via i2c */ uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) bd6: 1171 addi sp,sp,-4 { int32_t timeout; // wait for not busy timeout = TIMEOUT_MAX; bd8: 6761 lui a4,0x18 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); bda: 400057b7 lui a5,0x40005 uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) bde: c006 sw ra,0(sp) timeout = TIMEOUT_MAX; be0: 6a070713 addi a4,a4,1696 # 186a0 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); be4: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00> be8: 567d li a2,-1 bea: 0187d683 lhu a3,24(a5) bee: 8a89 andi a3,a3,2 bf0: c6e1 beqz a3,cb8 bf2: 177d addi a4,a4,-1 bf4: fec71be3 bne a4,a2,bea if(timeout==-1) return ssd1306_i2c_error(0); bf8: 4501 li a0,0 bfa: a821 j c12 bfc: 67e1 lui a5,0x18 bfe: 6a178793 addi a5,a5,1697 # 186a1 // send data one byte at a time while(sz--) { // wait for TX Empty timeout = TIMEOUT_MAX; while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); c02: 01475683 lhu a3,20(a4) c06: 0806f693 andi a3,a3,128 c0a: e699 bnez a3,c18 c0c: 17fd addi a5,a5,-1 c0e: fbf5 bnez a5,c02 if(timeout==-1) return ssd1306_i2c_error(3); c10: 450d li a0,3 return ssd1306_i2c_error(1); c12: 3755 jal bb6 return ssd1306_i2c_error(0); c14: 4505 li a0,1 c16: a889 j c68 // send command I2C1->DATAR = *data++; c18: 00054783 lbu a5,0(a0) c1c: 0505 addi a0,a0,1 c1e: 00f71823 sh a5,16(a4) while(sz--) c22: fca59de3 bne a1,a0,bfc } // wait for tx complete timeout = TIMEOUT_MAX; c26: 66e1 lui a3,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c28: 40005737 lui a4,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); c2c: 00070637 lui a2,0x70 timeout = TIMEOUT_MAX; c30: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c34: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); c38: 08460613 addi a2,a2,132 # 70084 c3c: 55fd li a1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c3e: 01475503 lhu a0,20(a4) c42: 01875783 lhu a5,24(a4) c46: 07c2 slli a5,a5,0x10 c48: 8fc9 or a5,a5,a0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); c4a: 8ff1 and a5,a5,a2 c4c: 00c78763 beq a5,a2,c5a c50: 16fd addi a3,a3,-1 c52: feb696e3 bne a3,a1,c3e if(timeout==-1) return ssd1306_i2c_error(4); c56: 4511 li a0,4 c58: bf6d j c12 // set STOP condition I2C1->CTLR1 |= I2C_CTLR1_STOP; c5a: 00075783 lhu a5,0(a4) // we're happy return 0; c5e: 4501 li a0,0 I2C1->CTLR1 |= I2C_CTLR1_STOP; c60: 2007e793 ori a5,a5,512 c64: 00f71023 sh a5,0(a4) } c68: 4082 lw ra,0(sp) c6a: 0111 addi sp,sp,4 c6c: 8082 ret while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); c6e: 40005737 lui a4,0x40005 c72: 95aa add a1,a1,a0 c74: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> c78: b76d j c22 I2C1->DATAR = addr<<1; c7a: 07800793 li a5,120 c7e: 00f71823 sh a5,16(a4) timeout = TIMEOUT_MAX; c82: 6661 lui a2,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c84: 400056b7 lui a3,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); c88: 00070737 lui a4,0x70 timeout = TIMEOUT_MAX; c8c: 6a060613 addi a2,a2,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c90: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); c94: 08270713 addi a4,a4,130 # 70082 c98: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c9a: 0146d283 lhu t0,20(a3) c9e: 0186d783 lhu a5,24(a3) ca2: 07c2 slli a5,a5,0x10 ca4: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); ca8: 8ff9 and a5,a5,a4 caa: fce782e3 beq a5,a4,c6e cae: 167d addi a2,a2,-1 cb0: fe6615e3 bne a2,t1,c9a return ssd1306_i2c_error(2); cb4: 4509 li a0,2 cb6: bfb1 j c12 I2C1->CTLR1 |= I2C_CTLR1_START; cb8: 0007d703 lhu a4,0(a5) timeout = TIMEOUT_MAX; cbc: 66e1 lui a3,0x18 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); cbe: 00030637 lui a2,0x30 I2C1->CTLR1 |= I2C_CTLR1_START; cc2: 10076713 ori a4,a4,256 cc6: 00e79023 sh a4,0(a5) uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); cca: 40005737 lui a4,0x40005 timeout = TIMEOUT_MAX; cce: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); cd2: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); cd6: 0605 addi a2,a2,1 # 30001 cd8: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); cda: 01475283 lhu t0,20(a4) cde: 01875783 lhu a5,24(a4) ce2: 07c2 slli a5,a5,0x10 ce4: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); ce8: 8ff1 and a5,a5,a2 cea: f8c788e3 beq a5,a2,c7a cee: 16fd addi a3,a3,-1 cf0: fe6695e3 bne a3,t1,cda return ssd1306_i2c_error(1); cf4: 4505 li a0,1 cf6: bf31 j c12 00000cf8 : { cf8: fd810113 addi sp,sp,-40 /* build command or data packets */ if(cmd) { pkt[0] = 0; pkt[1] = *data; cfc: 00a100a3 sb a0,1(sp) else { pkt[0] = 0x40; memcpy(&pkt[1], data, sz); } return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); d00: 4589 li a1,2 d02: 850a mv a0,sp d04: d206 sw ra,36(sp) pkt[0] = 0; d06: 00010023 sb zero,0(sp) return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); d0a: 35f1 jal bd6 } d0c: 5092 lw ra,36(sp) d0e: 02810113 addi sp,sp,40 d12: 8082 ret 00000d14 : { d14: 1131 addi sp,sp,-20 d16: c806 sw ra,16(sp) d18: c622 sw s0,12(sp) b.buffer = buffer; d1a: c02a sw a0,0(sp) b.pbuffer = buffer; d1c: c22a sw a0,4(sp) b.buffer_len = buffer_len; d1e: c42e sw a1,8(sp) if(buffer_len == 0) buffer = (void*) 0; d20: c19d beqz a1,d46 int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); d22: 00a037b3 snez a5,a0 d26: 40f007b3 neg a5,a5 d2a: 842a mv s0,a0 d2c: 00f175b3 and a1,sp,a5 d30: 1a800513 li a0,424 d34: 3971 jal 9d0 if(buffer == (void*) 0) { d36: c401 beqz s0,d3e return b.pbuffer - b.buffer; d38: 4512 lw a0,4(sp) d3a: 4782 lw a5,0(sp) d3c: 8d1d sub a0,a0,a5 } d3e: 40c2 lw ra,16(sp) d40: 4432 lw s0,12(sp) d42: 0151 addi sp,sp,20 d44: 8082 ret d46: 4401 li s0,0 int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); d48: 4581 li a1,0 d4a: b7dd j d30 00000d4c : { d4c: 1131 addi sp,sp,-20 d4e: c436 sw a3,8(sp) va_start( args, format ); d50: 0034 addi a3,sp,8 { d52: c206 sw ra,4(sp) d54: c63a sw a4,12(sp) d56: c83e sw a5,16(sp) va_start( args, format ); d58: c036 sw a3,0(sp) int ret = mini_vsnprintf( buffer, buffer_len, format, args ); d5a: 3f6d jal d14 } d5c: 4092 lw ra,4(sp) d5e: 0151 addi sp,sp,20 d60: 8082 ret 00000d62 : WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; } d62: 962a add a2,a2,a0 d64: 87aa mv a5,a0 d66: 00c79363 bne a5,a2,d6c d6a: 8082 ret d6c: 00b78023 sb a1,0(a5) d70: 0785 addi a5,a5,1 d72: bfd5 j d66 00000d74 : memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer)); d74: 40000613 li a2,1024 d78: 4581 li a1,0 d7a: c4418513 addi a0,gp,-956 # 20000040 d7e: b7d5 j d62 00000d80 : for (; (*d=*s); s++, d++); d80: 87aa mv a5,a0 d82: 0005c703 lbu a4,0(a1) d86: 00e78023 sb a4,0(a5) d8a: e311 bnez a4,d8e } d8c: 8082 ret for (; (*d=*s); s++, d++); d8e: 0585 addi a1,a1,1 d90: 0785 addi a5,a5,1 d92: bfc5 j d82 00000d94 : for (; n; n--) *d++ = *s++; d94: 4781 li a5,0 d96: 00f61363 bne a2,a5,d9c } d9a: 8082 ret for (; n; n--) *d++ = *s++; d9c: 00f58733 add a4,a1,a5 da0: 00074683 lbu a3,0(a4) da4: 00f50733 add a4,a0,a5 da8: 0785 addi a5,a5,1 daa: 00d70023 sb a3,0(a4) dae: b7e5 j d96 00000db0 : { db0: 7179 addi sp,sp,-48 ssd1306_cmd(SSD1306_COLUMNADDR); db2: 02100513 li a0,33 { db6: d606 sw ra,44(sp) db8: d422 sw s0,40(sp) dba: d226 sw s1,36(sp) ssd1306_cmd(SSD1306_COLUMNADDR); dbc: 3f35 jal cf8 ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset) dbe: 4501 li a0,0 dc0: 3f25 jal cf8 ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset) dc2: 07f00513 li a0,127 dc6: 3f0d jal cf8 ssd1306_cmd(SSD1306_PAGEADDR); dc8: 02200513 li a0,34 dcc: 3735 jal cf8 ssd1306_cmd(0); // Page start address (0 = reset) dce: 4501 li a0,0 dd0: 3725 jal cf8 ssd1306_cmd(7); // Page end address dd2: 451d li a0,7 dd4: c4418413 addi s0,gp,-956 # 20000040 dd8: 3705 jal cf8 for(i=0;i return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); df2: 02100593 li a1,33 df6: 850a mv a0,sp df8: 02040413 addi s0,s0,32 dfc: 3be9 jal bd6 dfe: fe9410e3 bne s0,s1,dde } e02: 50b2 lw ra,44(sp) e04: 5422 lw s0,40(sp) e06: 5492 lw s1,36(sp) e08: 6145 addi sp,sp,48 e0a: 8082 ret 00000e0c : //#define BASE_CTLR (((FUNCONF_HSITRIM) << 3) | HSEBYP | RCC_CSS) // disable HSI in HSE modes // Flash latency settings. #if defined(CH32V003) #if FUNCONF_SYSTEM_CORE_CLOCK > 25000000 FLASH->ACTLR = FLASH_ACTLR_LATENCY_1; // +1 Cycle Latency e0c: 400227b7 lui a5,0x40022 e10: 4705 li a4,1 e12: c398 sw a4,0(a5) #elif defined(FUNCONF_USE_HSI) && FUNCONF_USE_HSI #if defined(CH32V30x) || defined(CH32V20x) || defined(CH32L103) || defined(CH32V10x) EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; #endif #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL RCC->CFGR0 = BASE_CFGR0; e14: 400217b7 lui a5,0x40021 RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. e18: 01080737 lui a4,0x1080 RCC->CFGR0 = BASE_CFGR0; e1c: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. e20: 08170713 addi a4,a4,129 # 1080081 e24: c398 sw a4,0(a5) FLASH->ACTLR = FLASH_ACTLR_LATENCY_0; #endif #endif #ifndef CH5xx RCC->INTR = 0x009F0000; // Clear PLL, CSSC, HSE, HSI and LSI ready flags. e26: 009f0737 lui a4,0x9f0 e2a: c798 sw a4,8(a5) #endif #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL && !defined(CH5xx) while((RCC->CTLR & RCC_PLLRDY) == 0) {}; // Wait till PLL is ready e2c: 4398 lw a4,0(a5) e2e: 00671693 slli a3,a4,0x6 e32: fe06dde3 bgez a3,e2c #if defined(CH32H41x) RCC->PLLCFGR |= RCC_SYSPLL_GATE; #endif uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW e36: 43d8 lw a4,4(a5) RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source e38: 400216b7 lui a3,0x40021 uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW e3c: 9b71 andi a4,a4,-4 RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source e3e: 00276713 ori a4,a4,2 e42: c3d8 sw a4,4(a5) while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source e44: 4721 li a4,8 e46: 42dc lw a5,4(a3) e48: 8bb1 andi a5,a5,12 e4a: fee79ee3 bne a5,a4,e46 *DMDATA1 = 0x00; e4e: e00007b7 lui a5,0xe0000 e52: 0e07ac23 sw zero,248(a5) # e00000f8 <_eusrstack+0xbffff8f8> *DMDATA0 = 0x80; e56: 08000713 li a4,128 e5a: 0ee7aa23 sw a4,244(a5) SetupDebugPrintf(); #endif #if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS CallConstructors(); #endif } e5e: 8082 ret 00000e60
: } } // ----------------------------------------------------------------- main int main(void) { e60: f9810113 addi sp,sp,-104 e64: d286 sw ra,100(sp) e66: d0a2 sw s0,96(sp) e68: cea6 sw s1,92(sp) SystemInit(); e6a: 374d jal e0c funGpioInitAll(); e6c: 400214b7 lui s1,0x40021 e70: 4c9c lw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); e72: 40011437 lui s0,0x40011 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); e76: 76fd lui a3,0xfffff funGpioInitAll(); e78: 0357e793 ori a5,a5,53 e7c: cc9c sw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); e7e: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000> e82: 4398 lw a4,0(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); e84: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff> funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); e88: f1000637 lui a2,0xf1000 funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); e8c: f0f77713 andi a4,a4,-241 e90: 01076713 ori a4,a4,16 e94: c398 sw a4,0(a5) funDigitalWrite(LED_PIN, FUN_LOW); e96: 00020737 lui a4,0x20 e9a: cb98 sw a4,16(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); e9c: 40040793 addi a5,s0,1024 ea0: 4398 lw a4,0(a5) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); ea2: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff> gpio_setup(); Delay_Ms(120); // let the OLED rail settle ea4: 000b0537 lui a0,0xb0 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); ea8: 8f75 and a4,a4,a3 eaa: 10076713 ori a4,a4,256 eae: c398 sw a4,0(a5) funDigitalWrite(BUZZER, FUN_LOW); eb0: 00040737 lui a4,0x40 eb4: cb98 sw a4,16(a5) funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); eb6: 4018 lw a4,0(s0) Delay_Ms(120); // let the OLED rail settle eb8: c8050513 addi a0,a0,-896 # afc80 funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); ebc: 9b41 andi a4,a4,-16 ebe: 00876713 ori a4,a4,8 ec2: c018 sw a4,0(s0) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); ec4: 4398 lw a4,0(a5) ec6: 8f71 and a4,a4,a2 ec8: 08000637 lui a2,0x8000 ecc: 8f51 or a4,a4,a2 ece: c398 sw a4,0(a5) funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD); ed0: 4398 lw a4,0(a5) ed2: ff100637 lui a2,0xff100 ed6: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff> ed8: 8f71 and a4,a4,a2 eda: 00800637 lui a2,0x800 ede: 8f51 or a4,a4,a2 ee0: c398 sw a4,0(a5) funDigitalWrite(BTN_OK, FUN_HIGH); ee2: 4705 li a4,1 ee4: c818 sw a4,16(s0) funDigitalWrite(BTN_LEFT, FUN_HIGH); ee6: 04000713 li a4,64 eea: cb98 sw a4,16(a5) funDigitalWrite(BTN_RIGHT, FUN_HIGH); eec: 02000713 li a4,32 ef0: cb98 sw a4,16(a5) Delay_Ms(120); // let the OLED rail settle ef2: b50ff0ef jal 242 * init I2C and GPIO */ uint8_t ssd1306_i2c_init(void) { // Enable GPIOC and I2C RCC->APB1PCENR |= RCC_APB1Periph_I2C1; ef6: 4cdc lw a5,28(s1) ef8: 00200737 lui a4,0x200 efc: 8fd9 or a5,a5,a4 efe: ccdc sw a5,28(s1) funPinMode( PB6, GPIO_CFGLR_OUT_10Mhz_AF_OD ); funPinMode( PB7, GPIO_CFGLR_OUT_10Mhz_AF_OD ); #endif #else RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; f00: 4c9c lw a5,24(s1) // PC1 is SDA, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*1)); GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); // PC2 is SCL, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*2)); f02: 777d lui a4,0xfffff f04: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; f08: 0117e793 ori a5,a5,17 f0c: cc9c sw a5,24(s1) GPIOC->CFGLR &= ~(0xf<<(4*1)); f0e: 401c lw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); f10: 6705 lui a4,0x1 f12: d0070713 addi a4,a4,-768 # d00 GPIOC->CFGLR &= ~(0xf<<(4*1)); f16: f0f7f793 andi a5,a5,-241 f1a: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); f1c: 401c lw a5,0(s0) f1e: 0d07e793 ori a5,a5,208 f22: c01c sw a5,0(s0) GPIOC->CFGLR &= ~(0xf<<(4*2)); f24: 401c lw a5,0(s0) f26: 8ff5 and a5,a5,a3 f28: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); f2a: 401c lw a5,0(s0) f2c: 8fd9 or a5,a5,a4 f2e: c01c sw a5,0(s0) ssd1306_setbuf(0); // initialize OLED #if !defined(SSD1306_CUSTOM_INIT_ARRAY) || !SSD1306_CUSTOM_INIT_ARRAY uint8_t *cmd_list = (uint8_t *)ssd1306_init_array; f30: 6409 lui s0,0x2 GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4); GPIOC->BSHR = (1<<(16+4)); #endif // load I2C regs ssd1306_i2c_setup(); f32: be2ff0ef jal 314 f36: eb440413 addi s0,s0,-332 # 1eb4 ssd1306_setbuf(0); f3a: 3d2d jal d74 while(*cmd_list != SSD1306_TERMINATE_CMDS) f3c: 00044503 lbu a0,0(s0) f40: 0ff00793 li a5,255 f44: 00f51463 bne a0,a5,f4c { if(ssd1306_cmd(*cmd_list++)) return 1; } ssd1306_refresh(); f48: 35a5 jal db0 #endif return 0; f4a: a021 j f52 if(ssd1306_cmd(*cmd_list++)) f4c: 0405 addi s0,s0,1 f4e: 336d jal cf8 f50: d575 beqz a0,f3c // no display: fall back to a heartbeat blink so the board still shows life while (1) { led_blink(); Delay_Ms(700); } } ssd1306_init(); pet_reset(); f52: d78ff0ef jal 4ca ssd1306_setbuf(0); f56: 3d39 jal d74 draw_center_str(4, "PANAGOTCHI"); f58: 6589 lui a1,0x2 f5a: 94858593 addi a1,a1,-1720 # 1948 f5e: 4511 li a0,4 f60: e30ff0ef jal 590 ssd1306_drawImage(48, 16, pana_idle, PANA_W, PANA_H, 0); f64: 02000713 li a4,32 f68: 6609 lui a2,0x2 f6a: 86ba mv a3,a4 f6c: ed060613 addi a2,a2,-304 # 1ed0 f70: 45c1 li a1,16 f72: 03000513 li a0,48 f76: eb8ff0ef jal 62e draw_center_str(52, "press any key"); f7a: 6589 lui a1,0x2 f7c: 95458593 addi a1,a1,-1708 # 1954 f80: 03400513 li a0,52 f84: e0cff0ef jal 590 ssd1306_refresh(); f88: 3525 jal db0 beep(659, 80); beep(784, 80); beep(988, 120); f8a: 05000593 li a1,80 f8e: 29300513 li a0,659 f92: c9eff0ef jal 430 f96: 05000593 li a1,80 f9a: 31000513 li a0,784 f9e: c92ff0ef jal 430 fa2: 07800593 li a1,120 fa6: 3dc00513 li a0,988 faa: c86ff0ef jal 430 fae: 0c800413 li s0,200 Buttons b = read_buttons(); fb2: e06ff0ef jal 5b8 fb6: 00855713 srli a4,a0,0x8 fba: 01055793 srli a5,a0,0x10 fbe: 02e104a3 sb a4,41(sp) if (b.ok || b.left || b.right) break; fc2: 8f49 or a4,a4,a0 Buttons b = read_buttons(); fc4: 02f10523 sb a5,42(sp) if (b.ok || b.left || b.right) break; fc8: 8fd9 or a5,a5,a4 Buttons b = read_buttons(); fca: 02a10423 sb a0,40(sp) if (b.ok || b.left || b.right) break; fce: 0ff7f793 zext.b a5,a5 fd2: eb81 bnez a5,fe2 Delay_Ms(20); fd4: 6575 lui a0,0x1d fd6: 4c050513 addi a0,a0,1216 # 1d4c0 for (int i = 0; i < 200; i++) { fda: 147d addi s0,s0,-1 Delay_Ms(20); fdc: a66ff0ef jal 242 for (int i = 0; i < 200; i++) { fe0: f869 bnez s0,fb2 beep(659, 80); beep(784, 80); beep(988, 120); fe2: 4601 li a2,0 fe4: 4481 li s1,0 fe6: 4401 li s0,0 fe8: c832 sw a2,16(sp) splash(); Buttons prev = {0, 0, 0}; while (1) { Buttons b = read_buttons(); fea: dceff0ef jal 5b8 fee: 00855713 srli a4,a0,0x8 ff2: 01055793 srli a5,a0,0x10 ff6: 02e102a3 sb a4,37(sp) ffa: 02f10323 sb a5,38(sp) ffe: 0ff57693 zext.b a3,a0 1002: 0ff77713 zext.b a4,a4 1006: 0ff7f793 zext.b a5,a5 100a: 02a10223 sb a0,36(sp) 100e: c236 sw a3,4(sp) 1010: c43a sw a4,8(sp) 1012: c63e sw a5,12(sp) uint8_t ok_edge = b.ok && !prev.ok; 1014: c002 sw zero,0(sp) 1016: 4642 lw a2,16(sp) 1018: c681 beqz a3,1020 101a: 00143793 seqz a5,s0 101e: c03e sw a5,0(sp) uint8_t left_edge = b.left && !prev.left; 1020: 4722 lw a4,8(sp) uint8_t ok_edge = b.ok && !prev.ok; 1022: 00014783 lbu a5,0(sp) uint8_t left_edge = b.left && !prev.left; 1026: 4681 li a3,0 1028: c319 beqz a4,102e 102a: 0014b693 seqz a3,s1 uint8_t right_edge = b.right && !prev.right; 102e: 4532 lw a0,12(sp) uint8_t left_edge = b.left && !prev.left; 1030: 0ff6f593 zext.b a1,a3 uint8_t right_edge = b.right && !prev.right; 1034: 4701 li a4,0 1036: c119 beqz a0,103c 1038: 00163713 seqz a4,a2 uint8_t any_edge = ok_edge | left_edge | right_edge; 103c: 8fcd or a5,a5,a1 103e: 8fd9 or a5,a5,a4 prev = b; if (any_edge) idle_frames = 0; 1040: c399 beqz a5,1046 1042: c201a423 sw zero,-984(gp) # 20000024 if (!disp_on) { 1046: c051c603 lbu a2,-1019(gp) # 20000001 104a: e625 bnez a2,10b2 // screen is asleep: the first press only wakes it (not an action) if (any_edge) { 104c: c799 beqz a5,105a ssd1306_cmd(SSD1306_DISPLAYON); 104e: 0af00513 li a0,175 1052: 315d jal cf8 disp_on = 1; 1054: 4785 li a5,1 1056: c0f182a3 sb a5,-1019(gp) # 20000001 ssd1306_cmd(SSD1306_DISPLAYOFF); disp_on = 0; } } if (anim_timer) anim_timer--; 105a: c261c783 lbu a5,-986(gp) # 20000022 105e: c781 beqz a5,1066 1060: 17fd addi a5,a5,-1 1062: c2f18323 sb a5,-986(gp) # 20000022 // advance game time independent of screen / display state if (pet.alive && ++tick_acc >= TICK_FRAMES) { 1066: c3818793 addi a5,gp,-968 # 20000034 106a: 00a7c783 lbu a5,10(a5) 106e: c3818413 addi s0,gp,-968 # 20000034 1072: cf81 beqz a5,108a 1074: c241d783 lhu a5,-988(gp) # 20000020 1078: 0f900693 li a3,249 107c: 0785 addi a5,a5,1 107e: 07c2 slli a5,a5,0x10 1080: 83c1 srli a5,a5,0x10 1082: 68f6e763 bltu a3,a5,1710 1086: c2f19223 sh a5,-988(gp) # 20000020 tick_acc = 0; game_tick(); } frame++; 108a: c201a783 lw a5,-992(gp) # 2000001c idle_frames++; Delay_Ms(FRAME_MS); 108e: 00058537 lui a0,0x58 1092: e4050513 addi a0,a0,-448 # 57e40 frame++; 1096: 0785 addi a5,a5,1 1098: c2f1a023 sw a5,-992(gp) # 2000001c idle_frames++; 109c: c281a783 lw a5,-984(gp) # 20000024 10a0: 0785 addi a5,a5,1 10a2: c2f1a423 sw a5,-984(gp) # 20000024 Delay_Ms(FRAME_MS); 10a6: 99cff0ef jal 242 prev = b; 10aa: 4632 lw a2,12(sp) 10ac: 44a2 lw s1,8(sp) 10ae: 4412 lw s0,4(sp) while (1) { 10b0: bf25 j fe8 switch (screen) { 10b2: c351c483 lbu s1,-971(gp) # 20000031 10b6: 4609 li a2,2 10b8: 5ec48b63 beq s1,a2,16ae 10bc: 06966263 bltu a2,s1,1120 10c0: c3818413 addi s0,gp,-968 # 20000034 10c4: 3c049763 bnez s1,1492 if (left_edge) { 10c8: c285 beqz a3,10e8 cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; 10ca: c341c503 lbu a0,-972(gp) # 20000030 10ce: 459d li a1,7 10d0: c83a sw a4,16(sp) 10d2: 0519 addi a0,a0,6 10d4: 824ff0ef jal f8 <__modsi3> 10d8: c2a18a23 sb a0,-972(gp) # 20000030 beep(1047, 25); 10dc: 45e5 li a1,25 10de: 41700513 li a0,1047 10e2: b4eff0ef jal 430 10e6: 4742 lw a4,16(sp) if (right_edge) { 10e8: cf11 beqz a4,1104 cursor = (cursor + 1) % ICON_COUNT; 10ea: c341c503 lbu a0,-972(gp) # 20000030 10ee: 459d li a1,7 10f0: 0505 addi a0,a0,1 10f2: 806ff0ef jal f8 <__modsi3> 10f6: c2a18a23 sb a0,-972(gp) # 20000030 beep(1047, 25); 10fa: 45e5 li a1,25 10fc: 41700513 li a0,1047 1100: b30ff0ef jal 430 if (ok_edge) do_action(cursor); 1104: 4782 lw a5,0(sp) 1106: cfc1 beqz a5,119e switch (act) { 1108: c341c783 lbu a5,-972(gp) # 20000030 110c: 4719 li a4,6 110e: 08f76863 bltu a4,a5,119e 1112: 6709 lui a4,0x2 1114: 078a slli a5,a5,0x2 1116: aa470713 addi a4,a4,-1372 # 1aa4 111a: 97ba add a5,a5,a4 111c: 439c lw a5,0(a5) 111e: 8782 jr a5 switch (screen) { 1120: 478d li a5,3 1122: 40f48d63 beq s1,a5,153c uint16_t timeout = screen_timeout_opts[timeout_idx]; 1126: c041c703 lbu a4,-1020(gp) # 20000000 112a: c1418793 addi a5,gp,-1004 # 20000010 112e: 0706 slli a4,a4,0x1 1130: 97ba add a5,a5,a4 1132: 0007d783 lhu a5,0(a5) if (timeout && idle_frames >= timeout) { 1136: f20782e3 beqz a5,105a 113a: c281a703 lw a4,-984(gp) # 20000024 113e: f0f76ee3 bltu a4,a5,105a ssd1306_cmd(SSD1306_DISPLAYOFF); 1142: 0ae00513 li a0,174 1146: 3e4d jal cf8 disp_on = 0; 1148: c00182a3 sb zero,-1019(gp) # 20000001 114c: b739 j 105a pet.satiety = clamp100(pet.satiety + 30); 114e: 00040783 lb a5,0(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1152: 06400713 li a4,100 pet.satiety = clamp100(pet.satiety + 30); 1156: 07f9 addi a5,a5,30 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1158: 14f75d63 bge a4,a5,12b2 115c: 87ba mv a5,a4 115e: 00f40023 sb a5,0(s0) pet.hygiene = clamp100(pet.hygiene - 5); 1162: 00340783 lb a5,3(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1166: 06400713 li a4,100 pet.hygiene = clamp100(pet.hygiene - 5); 116a: 17ed addi a5,a5,-5 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 116c: 14f75863 bge a4,a5,12bc 1170: 87ba mv a5,a4 1172: 00f401a3 sb a5,3(s0) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1176: 4711 li a4,4 1178: c0e18e23 sb a4,-996(gp) # 20000018 beep(880, 60); beep(1175, 80); 117c: 03c00593 li a1,60 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1180: 4731 li a4,12 beep(880, 60); beep(1175, 80); 1182: 37000513 li a0,880 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1186: c2e18323 sb a4,-986(gp) # 20000022 beep(880, 60); beep(1175, 80); 118a: aa6ff0ef jal 430 118e: 05000593 li a1,80 1192: 49700513 li a0,1175 beep(784, 60); beep(1047, 60); beep(1319, 90); 1196: a9aff0ef jal 430 led_blink(); 119a: b06ff0ef jal 4a0 ssd1306_setbuf(0); 119e: 3ed9 jal d74 draw_center_str(0, menu_labels[cursor]); 11a0: c341c783 lbu a5,-972(gp) # 20000030 11a4: 4501 li a0,0 11a6: c03e sw a5,0(sp) 11a8: 4702 lw a4,0(sp) 11aa: 6789 lui a5,0x2 11ac: f8878793 addi a5,a5,-120 # 1f88 11b0: 070a slli a4,a4,0x2 11b2: 97ba add a5,a5,a4 11b4: 438c lw a1,0(a5) 11b6: bdaff0ef jal 590 if (pet.alive && pet.health < 30 && (frame & 8)) 11ba: 00a44783 lbu a5,10(s0) 11be: c83e sw a5,16(sp) 11c0: c395 beqz a5,11e4 11c2: 00440703 lb a4,4(s0) 11c6: 47f5 li a5,29 11c8: 00e7ce63 blt a5,a4,11e4 11cc: c201a783 lw a5,-992(gp) # 2000001c 11d0: 8ba1 andi a5,a5,8 11d2: cb89 beqz a5,11e4 ssd1306_drawstr(0, 0, "!", 1); 11d4: 6609 lui a2,0x2 11d6: 4685 li a3,1 11d8: 96460613 addi a2,a2,-1692 # 1964 11dc: 4581 li a1,0 11de: 4501 li a0,0 11e0: 9c4ff0ef jal 3a4 if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 11e4: 08000613 li a2,128 11e8: 45a9 li a1,10 11ea: 4501 li a0,0 11ec: d02ff0ef jal 6ee if (pet.sleeping) { 11f0: 00944783 lbu a5,9(s0) 11f4: ca3e sw a5,20(sp) 11f6: 20078363 beqz a5,13fc ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1); 11fa: 6609 lui a2,0x2 11fc: 4685 li a3,1 11fe: 96860613 addi a2,a2,-1688 # 1968 1202: 45b9 li a1,14 1204: 04e00513 li a0,78 1208: 99cff0ef jal 3a4 ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1); 120c: 6609 lui a2,0x2 120e: 4685 li a3,1 1210: 96c60613 addi a2,a2,-1684 # 196c 1214: 45b1 li a1,12 1216: 05400513 li a0,84 121a: 98aff0ef jal 3a4 121e: 03000313 li t1,48 px = 48; py = 16; 1222: 42c1 li t0,16 if (!pet.alive) return EXP_DEAD; 1224: 4742 lw a4,16(sp) 1226: 4799 li a5,6 1228: c719 beqz a4,1236 if (anim_timer) return anim_exp; 122a: c261c783 lbu a5,-986(gp) # 20000022 122e: 20078063 beqz a5,142e 1232: c1c1c783 lbu a5,-996(gp) # 20000018 ssd1306_drawImage(px, py, pana_frames[current_expression()], 1236: 6709 lui a4,0x2 1238: f6c70713 addi a4,a4,-148 # 1f6c 123c: 078a slli a5,a5,0x2 123e: 97ba add a5,a5,a4 1240: 4390 lw a2,0(a5) 1242: 02000713 li a4,32 1246: 8596 mv a1,t0 1248: 851a mv a0,t1 124a: 86ba mv a3,a4 124c: be2ff0ef jal 62e 1250: 08000613 li a2,128 1254: 02e00593 li a1,46 1258: 4501 li a0,0 125a: c94ff0ef jal 6ee for (uint8_t i = 0; i < pet.poop; i++) 125e: 00844783 lbu a5,8(s0) 1262: 20f4e763 bltu s1,a5,1470 1266: 4401 li s0,0 ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); 1268: 6709 lui a4,0x2 126a: f5070713 addi a4,a4,-176 # 1f50 126e: 00241793 slli a5,s0,0x2 1272: 97ba add a5,a5,a4 1274: 00341493 slli s1,s0,0x3 1278: 4390 lw a2,0(a5) 127a: 94a2 add s1,s1,s0 127c: 4741 li a4,16 127e: 0486 slli s1,s1,0x1 1280: 86ba mv a3,a4 1282: 03000593 li a1,48 1286: 00148513 addi a0,s1,1 # 40021001 <_eusrstack+0x20020801> 128a: ba4ff0ef jal 62e if (i == cursor) 128e: 4702 lw a4,0(sp) 1290: 0ff47793 zext.b a5,s0 1294: 00f71963 bne a4,a5,12a6 ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1); 1298: 46c5 li a3,17 129a: 8636 mv a2,a3 129c: 02f00593 li a1,47 12a0: 8526 mv a0,s1 12a2: c8aff0ef jal 72c for (uint8_t i = 0; i < ICON_COUNT; i++) { 12a6: 0405 addi s0,s0,1 12a8: 479d li a5,7 12aa: faf41fe3 bne s0,a5,1268 ssd1306_refresh(); 12ae: 3609 jal db0 } 12b0: bd9d j 1126 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12b2: fff7c713 not a4,a5 12b6: 877d srai a4,a4,0x1f 12b8: 8ff9 and a5,a5,a4 12ba: b555 j 115e 12bc: fff7c713 not a4,a5 12c0: 877d srai a4,a4,0x1f 12c2: 8ff9 and a5,a5,a4 12c4: b57d j 1172 if (pet.energy < 15) { beep(220, 120); break; } // too tired 12c6: 00240703 lb a4,2(s0) 12ca: 47b9 li a5,14 12cc: 00e7c963 blt a5,a4,12de 12d0: 07800593 li a1,120 12d4: 0dc00513 li a0,220 beep(659, 40); 12d8: 958ff0ef jal 430 break; 12dc: b5c9 j 119e pet.happy = clamp100(pet.happy + 25); 12de: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12e2: 06400693 li a3,100 pet.happy = clamp100(pet.happy + 25); 12e6: 07e5 addi a5,a5,25 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12e8: 04f6d563 bge a3,a5,1332 12ec: 87b6 mv a5,a3 12ee: 00f400a3 sb a5,1(s0) pet.energy = clamp100(pet.energy - 12); 12f2: ff470793 addi a5,a4,-12 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12f6: 06400713 li a4,100 12fa: 00f75363 bge a4,a5,1300 12fe: 87ba mv a5,a4 1300: 00f40123 sb a5,2(s0) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1304: 4709 li a4,2 1306: c0e18e23 sb a4,-996(gp) # 20000018 beep(988, 60); beep(1319, 60); beep(1568, 90); 130a: 03c00593 li a1,60 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 130e: 4731 li a4,12 beep(988, 60); beep(1319, 60); beep(1568, 90); 1310: 3dc00513 li a0,988 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1314: c2e18323 sb a4,-986(gp) # 20000022 beep(988, 60); beep(1319, 60); beep(1568, 90); 1318: 918ff0ef jal 430 131c: 03c00593 li a1,60 1320: 52700513 li a0,1319 1324: 90cff0ef jal 430 1328: 05a00593 li a1,90 132c: 62000513 li a0,1568 1330: b59d j 1196 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1332: fff7c693 not a3,a5 1336: 86fd srai a3,a3,0x1f 1338: 8ff5 and a5,a5,a3 133a: bf55 j 12ee pet.sleeping = !pet.sleeping; 133c: 00944503 lbu a0,9(s0) beep(pet.sleeping ? 440 : 660, 120); 1340: 07800593 li a1,120 pet.sleeping = !pet.sleeping; 1344: 00153793 seqz a5,a0 beep(pet.sleeping ? 440 : 660, 120); 1348: 00a03533 snez a0,a0 134c: 40a00533 neg a0,a0 1350: 0dc57513 andi a0,a0,220 pet.sleeping = !pet.sleeping; 1354: 00f404a3 sb a5,9(s0) beep(pet.sleeping ? 440 : 660, 120); 1358: 1b850513 addi a0,a0,440 135c: bfb5 j 12d8 pet.happy = clamp100(pet.happy + 5); 135e: c3818713 addi a4,gp,-968 # 20000034 1362: 00140783 lb a5,1(s0) pet.hygiene = 100; 1366: 06400693 li a3,100 pet.poop = 0; 136a: 00040423 sb zero,8(s0) pet.hygiene = 100; 136e: 00d401a3 sb a3,3(s0) pet.happy = clamp100(pet.happy + 5); 1372: 0795 addi a5,a5,5 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1374: 02f6d063 bge a3,a5,1394 1378: 87b6 mv a5,a3 beep(1319, 50); beep(1047, 50); 137a: 03200593 li a1,50 137e: 52700513 li a0,1319 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1382: 00f700a3 sb a5,1(a4) beep(1319, 50); beep(1047, 50); 1386: 8aaff0ef jal 430 138a: 03200593 li a1,50 138e: 41700513 li a0,1047 1392: b799 j 12d8 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1394: fff7c693 not a3,a5 1398: 86fd srai a3,a3,0x1f 139a: 8ff5 and a5,a5,a3 139c: bff9 j 137a pet.health = clamp100(pet.health + 35); 139e: 00440783 lb a5,4(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 13a2: 06400713 li a4,100 pet.health = clamp100(pet.health + 35); 13a6: 02378793 addi a5,a5,35 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 13aa: 02f75663 bge a4,a5,13d6 13ae: 87ba mv a5,a4 beep(784, 60); beep(1047, 60); beep(1319, 90); 13b0: 03c00593 li a1,60 13b4: 31000513 li a0,784 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 13b8: 00f40223 sb a5,4(s0) beep(784, 60); beep(1047, 60); beep(1319, 90); 13bc: 874ff0ef jal 430 13c0: 03c00593 li a1,60 13c4: 41700513 li a0,1047 13c8: 868ff0ef jal 430 13cc: 05a00593 li a1,90 13d0: 52700513 li a0,1319 13d4: b3c9 j 1196 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 13d6: fff7c713 not a4,a5 13da: 877d srai a4,a4,0x1f 13dc: 8ff9 and a5,a5,a4 13de: bfc9 j 13b0 screen = SCR_STATS; 13e0: 4785 li a5,1 13e2: c2f18aa3 sb a5,-971(gp) # 20000031 beep(659, 40); 13e6: 02800593 li a1,40 13ea: 29300513 li a0,659 13ee: b5ed j 12d8 screen = SCR_SETTINGS; 13f0: 478d li a5,3 13f2: c2f18aa3 sb a5,-971(gp) # 20000031 set_sel = 0; 13f6: c20183a3 sb zero,-985(gp) # 20000023 13fa: b7f5 j 13e6 uint32_t t = frame % 80; 13fc: c201a283 lw t0,-992(gp) # 2000001c 1400: 05000593 li a1,80 1404: 8516 mv a0,t0 1406: cc16 sw t0,24(sp) 1408: ccdfe0ef jal d4 <__umodsi3> px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 140c: 02700793 li a5,39 1410: 42e2 lw t0,24(sp) 1412: 01e50313 addi t1,a0,30 1416: 00a7f663 bgeu a5,a0,1422 141a: 06e00793 li a5,110 141e: 40a78333 sub t1,a5,a0 py = 14 + ((frame % 16) < 8 ? 0 : 1); 1422: 0082f293 andi t0,t0,8 1426: 005032b3 snez t0,t0 142a: 02b9 addi t0,t0,14 142c: bbe5 j 1224 if (pet.sleeping) return EXP_SLEEP; 142e: 4752 lw a4,20(sp) 1430: 4795 li a5,5 1432: e00712e3 bnez a4,1236 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 1436: 00440683 lb a3,4(s0) 143a: 4775 li a4,29 return EXP_SAD; 143c: 478d li a5,3 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 143e: ded75ce3 bge a4,a3,1236 1442: 00140683 lb a3,1(s0) 1446: 4761 li a4,24 1448: ded757e3 bge a4,a3,1236 144c: 00040683 lb a3,0(s0) 1450: 474d li a4,19 1452: ded752e3 bge a4,a3,1236 if ((frame % 50) < 4) return EXP_BLINK; 1456: c201a503 lw a0,-992(gp) # 2000001c 145a: 03200593 li a1,50 145e: ca16 sw t0,20(sp) 1460: c81a sw t1,16(sp) 1462: c73fe0ef jal d4 <__umodsi3> 1466: 42d2 lw t0,20(sp) 1468: 4342 lw t1,16(sp) 146a: 00453793 sltiu a5,a0,4 146e: b3e1 j 1236 ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 1470: 00149513 slli a0,s1,0x1 1474: 9526 add a0,a0,s1 1476: 4721 li a4,8 1478: 050a slli a0,a0,0x2 147a: 86ba mv a3,a4 147c: c0c18613 addi a2,gp,-1012 # 20000008 1480: 02600593 li a1,38 1484: 953a add a0,a0,a4 for (uint8_t i = 0; i < pet.poop; i++) 1486: 0485 addi s1,s1,1 ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 1488: 9a6ff0ef jal 62e for (uint8_t i = 0; i < pet.poop; i++) 148c: 0ff4f493 zext.b s1,s1 1490: b3f9 j 125e if (any_edge) { screen = SCR_MAIN; beep(880, 30); } 1492: cb81 beqz a5,14a2 1494: 45f9 li a1,30 1496: 37000513 li a0,880 149a: c2018aa3 sb zero,-971(gp) # 20000031 149e: f93fe0ef jal 430 ssd1306_setbuf(0); 14a2: 8d3ff0ef jal d74 draw_center_str(0, "-- STATUS --"); 14a6: 6589 lui a1,0x2 14a8: 97058593 addi a1,a1,-1680 # 1970 14ac: 4501 li a0,0 14ae: 8e2ff0ef jal 590 draw_bar(10, "FOOD", pet.satiety); 14b2: 00040603 lb a2,0(s0) 14b6: 6589 lui a1,0x2 14b8: 98058593 addi a1,a1,-1664 # 1980 14bc: 4529 li a0,10 14be: aaeff0ef jal 76c draw_bar(19, "FUN ", pet.happy); 14c2: 00140603 lb a2,1(s0) 14c6: 6589 lui a1,0x2 14c8: 98858593 addi a1,a1,-1656 # 1988 14cc: 454d li a0,19 14ce: a9eff0ef jal 76c draw_bar(28, "ENGY", pet.energy); 14d2: 00240603 lb a2,2(s0) 14d6: 6589 lui a1,0x2 14d8: 99058593 addi a1,a1,-1648 # 1990 14dc: 4571 li a0,28 14de: a8eff0ef jal 76c draw_bar(37, "WASH", pet.hygiene); 14e2: 00340603 lb a2,3(s0) 14e6: 6589 lui a1,0x2 14e8: 99858593 addi a1,a1,-1640 # 1998 14ec: 02500513 li a0,37 14f0: a7cff0ef jal 76c draw_bar(46, "HLTH", pet.health); 14f4: 00440603 lb a2,4(s0) 14f8: 6589 lui a1,0x2 14fa: 9a058593 addi a1,a1,-1632 # 19a0 14fe: 02e00513 li a0,46 1502: a6aff0ef jal 76c snprintf(line, sizeof(line), "Age %u %s", pet.age_min, 1506: 00944783 lbu a5,9(s0) 150a: 00645683 lhu a3,6(s0) 150e: c39d beqz a5,1534 1510: 6709 lui a4,0x2 1512: 93c70713 addi a4,a4,-1732 # 193c 1516: 6609 lui a2,0x2 1518: 9a860613 addi a2,a2,-1624 # 19a8 151c: 45c5 li a1,17 151e: 1028 addi a0,sp,40 1520: 82dff0ef jal d4c ssd1306_drawstr(0, 56, line, 1); 1524: 4685 li a3,1 1526: 1030 addi a2,sp,40 1528: 03800593 li a1,56 152c: 4501 li a0,0 152e: e77fe0ef jal 3a4 ssd1306_refresh(); 1532: bbb5 j 12ae snprintf(line, sizeof(line), "Age %u %s", pet.age_min, 1534: 6709 lui a4,0x2 1536: 93870713 addi a4,a4,-1736 # 1938 153a: bff1 j 1516 if (left_edge) { 153c: c285 beqz a3,155c set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS; 153e: c271c503 lbu a0,-985(gp) # 20000023 1542: 85a6 mv a1,s1 1544: c83a sw a4,16(sp) 1546: 0509 addi a0,a0,2 1548: bb1fe0ef jal f8 <__modsi3> 154c: c2a183a3 sb a0,-985(gp) # 20000023 beep(1047, 25); 1550: 45e5 li a1,25 1552: 41700513 li a0,1047 1556: edbfe0ef jal 430 155a: 4742 lw a4,16(sp) if (right_edge) { 155c: cf11 beqz a4,1578 set_sel = (set_sel + 1) % SETTINGS_ROWS; 155e: c271c503 lbu a0,-985(gp) # 20000023 1562: 458d li a1,3 1564: 0505 addi a0,a0,1 1566: b93fe0ef jal f8 <__modsi3> 156a: c2a183a3 sb a0,-985(gp) # 20000023 beep(1047, 25); 156e: 45e5 li a1,25 1570: 41700513 li a0,1047 1574: ebdfe0ef jal 430 if (ok_edge) { 1578: 4782 lw a5,0(sp) 157a: cf95 beqz a5,15b6 if (set_sel == 0) { // cycle screen-off timeout 157c: c271c783 lbu a5,-985(gp) # 20000023 1580: ef81 bnez a5,1598 timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; 1582: c041c783 lbu a5,-1020(gp) # 20000000 beep(880, 40); 1586: 02800593 li a1,40 timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; 158a: 0785 addi a5,a5,1 158c: 8b8d andi a5,a5,3 158e: c0f18223 sb a5,-1020(gp) # 20000000 beep(880, 30); 1592: 37000513 li a0,880 1596: a831 j 15b2 } else if (set_sel == 1) { // toggle sound 1598: 4705 li a4,1 159a: 10e79263 bne a5,a4,169e sound_on = !sound_on; 159e: c061c783 lbu a5,-1018(gp) # 20000002 beep(988, 60); // only audible if just enabled 15a2: 03c00593 li a1,60 15a6: 3dc00513 li a0,988 sound_on = !sound_on; 15aa: 0017b793 seqz a5,a5 15ae: c0f18323 sb a5,-1018(gp) # 20000002 beep(880, 30); 15b2: e7ffe0ef jal 430 ssd1306_setbuf(0); 15b6: fbeff0ef jal d74 draw_center_str(0, "- SETTINGS -"); 15ba: 6589 lui a1,0x2 15bc: 9b458593 addi a1,a1,-1612 # 19b4 15c0: 4501 li a0,0 15c2: fcffe0ef jal 590 15c6: 08000613 li a2,128 15ca: 45a9 li a1,10 15cc: 4501 li a0,0 15ce: 920ff0ef jal 6ee snprintf(rows[0], 17, "Screen off:%s", screen_timeout_names[timeout_idx]); 15d2: c041c703 lbu a4,-1020(gp) # 20000000 15d6: 6789 lui a5,0x2 15d8: fa478793 addi a5,a5,-92 # 1fa4 15dc: 070a slli a4,a4,0x2 15de: 97ba add a5,a5,a4 15e0: 4394 lw a3,0(a5) 15e2: 6609 lui a2,0x2 15e4: 9c460613 addi a2,a2,-1596 # 19c4 15e8: 45c5 li a1,17 15ea: 1028 addi a0,sp,40 15ec: f60ff0ef jal d4c snprintf(rows[1], 17, "Sound: %s", sound_on ? "On" : "Off"); 15f0: c061c783 lbu a5,-1018(gp) # 20000002 15f4: cbcd beqz a5,16a6 15f6: 6689 lui a3,0x2 15f8: 94068693 addi a3,a3,-1728 # 1940 15fc: 6609 lui a2,0x2 15fe: 9d460613 addi a2,a2,-1580 # 19d4 1602: 45c5 li a1,17 1604: 03910513 addi a0,sp,57 1608: f44ff0ef jal d4c snprintf(rows[2], 17, "Back"); 160c: 6589 lui a1,0x2 160e: 9e058593 addi a1,a1,-1568 # 19e0 1612: 04a10513 addi a0,sp,74 1616: f6aff0ef jal d80 161a: 4401 li s0,0 161c: 4481 li s1,0 int y = 18 + r * 12; 161e: 01240793 addi a5,s0,18 1622: c03e sw a5,0(sp) if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1); 1624: c271c683 lbu a3,-985(gp) # 20000023 1628: 0ff4f393 zext.b t2,s1 162c: 02769e63 bne a3,t2,1668 1630: 42a9 li t0,10 1632: 01b40593 addi a1,s0,27 1636: 405585b3 sub a1,a1,t0 m=x; 163a: 4301 li t1,0 163c: 851a mv a0,t1 ssd1306_drawPixel(m++, n, color); 163e: 4605 li a2,1 1640: 0305 addi t1,t1,1 1642: d016 sw t0,32(sp) 1644: ce1e sw t2,28(sp) 1646: cc36 sw a3,24(sp) 1648: ca1a sw t1,20(sp) 164a: c82e sw a1,16(sp) 164c: d1dfe0ef jal 368 while(w--) 1650: 4352 lw t1,20(sp) 1652: 08000613 li a2,128 1656: 45c2 lw a1,16(sp) 1658: 46e2 lw a3,24(sp) 165a: 43f2 lw t2,28(sp) 165c: 5282 lw t0,32(sp) 165e: fcc31fe3 bne t1,a2,163c while(h--) 1662: 12fd addi t0,t0,-1 1664: fc0297e3 bnez t0,1632 ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1); 1668: 00449613 slli a2,s1,0x4 166c: 4582 lw a1,0(sp) 166e: 407686b3 sub a3,a3,t2 1672: 9626 add a2,a2,s1 1674: 103c addi a5,sp,40 1676: 00d036b3 snez a3,a3 167a: 963e add a2,a2,a5 167c: 4511 li a0,4 167e: d27fe0ef jal 3a4 for (uint8_t r = 0; r < SETTINGS_ROWS; r++) { 1682: 0431 addi s0,s0,12 1684: 02400693 li a3,36 1688: 0485 addi s1,s1,1 168a: f8d41ae3 bne s0,a3,161e draw_center_str(56, "L/R move OK use"); 168e: 6589 lui a1,0x2 1690: 9e858593 addi a1,a1,-1560 # 19e8 1694: 03800513 li a0,56 draw_center_str(52, line); 1698: ef9fe0ef jal 590 169c: b909 j 12ae screen = SCR_MAIN; 169e: c2018aa3 sb zero,-971(gp) # 20000031 beep(880, 30); 16a2: 45f9 li a1,30 16a4: b5fd j 1592 snprintf(rows[1], 17, "Sound: %s", sound_on ? "On" : "Off"); 16a6: 6689 lui a3,0x2 16a8: 94468693 addi a3,a3,-1724 # 1944 16ac: bf81 j 15fc if (ok_edge) { // start a new pet 16ae: 4782 lw a5,0(sp) 16b0: cf99 beqz a5,16ce pet_reset(); 16b2: e19fe0ef jal 4ca beep(659, 80); beep(988, 120); 16b6: 05000593 li a1,80 16ba: 29300513 li a0,659 16be: d73fe0ef jal 430 16c2: 07800593 li a1,120 16c6: 3dc00513 li a0,988 16ca: d67fe0ef jal 430 ssd1306_setbuf(0); 16ce: ea6ff0ef jal d74 ssd1306_drawImage(48, 8, spr_grave, 32, 32, 0); 16d2: 02000713 li a4,32 16d6: 6609 lui a2,0x2 16d8: 86ba mv a3,a4 16da: fb460613 addi a2,a2,-76 # 1fb4 16de: 45a1 li a1,8 16e0: 03000513 li a0,48 16e4: f4bfe0ef jal 62e draw_center_str(44, "R.I.P."); 16e8: 6589 lui a1,0x2 16ea: 9fc58593 addi a1,a1,-1540 # 19fc 16ee: 02c00513 li a0,44 16f2: e9ffe0ef jal 590 snprintf(line, sizeof(line), "lived %u min", pet.age_min); 16f6: c3e1d683 lhu a3,-962(gp) # 2000003a 16fa: 6609 lui a2,0x2 16fc: 45c5 li a1,17 16fe: a0460613 addi a2,a2,-1532 # 1a04 1702: 1028 addi a0,sp,40 1704: e48ff0ef jal d4c draw_center_str(52, line); 1708: 102c addi a1,sp,40 170a: 03400513 li a0,52 170e: b769 j 1698 pet.age_min++; 1710: 00645683 lhu a3,6(s0) pet.satiety = clamp100(pet.satiety - 1); 1714: 00040783 lb a5,0(s0) tick_acc = 0; 1718: c2019223 sh zero,-988(gp) # 20000020 pet.age_min++; 171c: 0685 addi a3,a3,1 171e: 06c2 slli a3,a3,0x10 1720: 82c1 srli a3,a3,0x10 1722: 00d41323 sh a3,6(s0) pet.satiety = clamp100(pet.satiety - 1); 1726: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1728: 06400713 li a4,100 if (pet.sleeping) { 172c: 00944603 lbu a2,9(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1730: 08f75463 bge a4,a5,17b8 1734: 87ba mv a5,a4 1736: 07e2 slli a5,a5,0x18 pet.energy = clamp100(pet.energy + 6); 1738: 00240703 lb a4,2(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 173c: 87e1 srai a5,a5,0x18 173e: 06400513 li a0,100 if (pet.sleeping) { 1742: c649 beqz a2,17cc pet.energy = clamp100(pet.energy + 6); 1744: 00670593 addi a1,a4,6 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1748: 06b55d63 bge a0,a1,17c2 174c: 85aa mv a1,a0 pet.satiety = clamp100(pet.satiety - 1); 174e: 00f40023 sb a5,0(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1752: 00b40123 sb a1,2(s0) if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested 1756: 05d00793 li a5,93 175a: 00e7d563 bge a5,a4,1764 175e: 000404a3 sb zero,9(s0) 1762: 4601 li a2,0 if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); 1764: 0016f713 andi a4,a3,1 1768: cb19 beqz a4,177e 176a: 00340783 lb a5,3(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 176e: 06400593 li a1,100 if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); 1772: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1774: 08f5da63 bge a1,a5,1808 1778: 87ae mv a5,a1 177a: 00f401a3 sb a5,3(s0) if (!pet.sleeping && pet.poop < 3 && 177e: 00844583 lbu a1,8(s0) 1782: ea41 bnez a2,1812 1784: 4789 li a5,2 1786: 00b7ed63 bltu a5,a1,17a0 ((pet.age_min * 7u + frame) & 0x1F) == 0) 178a: 00369793 slli a5,a3,0x3 178e: 8f95 sub a5,a5,a3 1790: c201a683 lw a3,-992(gp) # 2000001c 1794: 97b6 add a5,a5,a3 1796: 8bfd andi a5,a5,31 if (!pet.sleeping && pet.poop < 3 && 1798: efad bnez a5,1812 pet.poop++; 179a: 0585 addi a1,a1,1 179c: 00b40423 sb a1,8(s0) if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 17a0: cb35 beqz a4,1814 17a2: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17a6: 06400693 li a3,100 if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 17aa: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17ac: 12f6da63 bge a3,a5,18e0 17b0: 87b6 mv a5,a3 17b2: 00f400a3 sb a5,1(s0) 17b6: a8b9 j 1814 17b8: fff7c713 not a4,a5 17bc: 877d srai a4,a4,0x1f 17be: 8ff9 and a5,a5,a4 17c0: bf9d j 1736 17c2: fff5c513 not a0,a1 17c6: 857d srai a0,a0,0x1f 17c8: 8de9 and a1,a1,a0 17ca: b751 j 174e pet.satiety = clamp100(pet.satiety - 1); 17cc: 00f40023 sb a5,0(s0) pet.energy = clamp100(pet.energy - 1); 17d0: fff70793 addi a5,a4,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17d4: 02f55063 bge a0,a5,17f4 17d8: 87aa mv a5,a0 17da: 00f40123 sb a5,2(s0) pet.happy = clamp100(pet.happy - 1); 17de: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17e2: 06400713 li a4,100 pet.happy = clamp100(pet.happy - 1); 17e6: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 17e8: 00f75b63 bge a4,a5,17fe 17ec: 87ba mv a5,a4 17ee: 00f400a3 sb a5,1(s0) 17f2: bf8d j 1764 17f4: fff7c713 not a4,a5 17f8: 877d srai a4,a4,0x1f 17fa: 8ff9 and a5,a5,a4 17fc: bff9 j 17da 17fe: fff7c713 not a4,a5 1802: 877d srai a4,a4,0x1f 1804: 8ff9 and a5,a5,a4 1806: b7e5 j 17ee 1808: fff7c593 not a1,a5 180c: 85fd srai a1,a1,0x1f 180e: 8fed and a5,a5,a1 1810: b7ad j 177a if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 1812: f5d9 bnez a1,17a0 if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 1814: 00340483 lb s1,3(s0) 1818: 47cd li a5,19 181a: 0097cd63 blt a5,s1,1834 181e: cb19 beqz a4,1834 1820: 00140783 lb a5,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1824: 06400713 li a4,100 if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 1828: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 182a: 0cf75063 bge a4,a5,18ea 182e: 87ba mv a5,a4 1830: 00f400a3 sb a5,1(s0) int8_t lo = pet.satiety; 1834: 00040583 lb a1,0(s0) if (pet.happy < lo) lo = pet.happy; 1838: 00140683 lb a3,1(s0) if (pet.energy < lo) lo = pet.energy; 183c: 00240703 lb a4,2(s0) if (pet.hygiene < lo) lo = pet.hygiene; 1840: 87a6 mv a5,s1 1842: 0095d363 bge a1,s1,1848 1846: 87ae mv a5,a1 1848: 01879613 slli a2,a5,0x18 184c: 8661 srai a2,a2,0x18 184e: 00c6d363 bge a3,a2,1854 1852: 87b6 mv a5,a3 1854: 01879613 slli a2,a5,0x18 1858: 8661 srai a2,a2,0x18 185a: 00c75363 bge a4,a2,1860 185e: 87ba mv a5,a4 1860: 01879613 slli a2,a5,0x18 1864: 8661 srai a2,a2,0x18 if (lo < 15) pet.health = clamp100(pet.health - 3); 1866: 4539 li a0,14 1868: 00440783 lb a5,4(s0) 186c: 08c54463 blt a0,a2,18f4 1870: 17f5 addi a5,a5,-3 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1872: 06400613 li a2,100 1876: 08f65563 bge a2,a5,1900 187a: 87b2 mv a5,a2 187c: 00f40223 sb a5,4(s0) notify(N_FOOD, pet.satiety); 1880: 4501 li a0,0 1882: c83a sw a4,16(sp) 1884: c036 sw a3,0(sp) 1886: c7dfe0ef jal 502 notify(N_FUN, pet.happy); 188a: 4682 lw a3,0(sp) 188c: 4505 li a0,1 188e: 85b6 mv a1,a3 1890: c73fe0ef jal 502 notify(N_ENGY, pet.energy); 1894: 4742 lw a4,16(sp) 1896: 4509 li a0,2 1898: 85ba mv a1,a4 189a: c69fe0ef jal 502 notify(N_WASH, pet.hygiene); 189e: 85a6 mv a1,s1 18a0: 450d li a0,3 18a2: c61fe0ef jal 502 if (pet.health <= 0) { 18a6: 00440783 lb a5,4(s0) 18aa: fef04063 bgtz a5,108a screen = SCR_DEAD; 18ae: 4709 li a4,2 beep(330, 200); beep(247, 200); beep(165, 400); 18b0: 0c800593 li a1,200 18b4: 14a00513 li a0,330 screen = SCR_DEAD; 18b8: c2e18aa3 sb a4,-971(gp) # 20000031 pet.alive = 0; 18bc: 00040523 sb zero,10(s0) beep(330, 200); beep(247, 200); beep(165, 400); 18c0: b71fe0ef jal 430 18c4: 0c800593 li a1,200 18c8: 0f700513 li a0,247 18cc: b65fe0ef jal 430 18d0: 19000593 li a1,400 18d4: 0a500513 li a0,165 18d8: b59fe0ef jal 430 18dc: faeff06f j 108a static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 18e0: fff7c693 not a3,a5 18e4: 86fd srai a3,a3,0x1f 18e6: 8ff5 and a5,a5,a3 18e8: b5e9 j 17b2 18ea: fff7c713 not a4,a5 18ee: 877d srai a4,a4,0x1f 18f0: 8ff9 and a5,a5,a4 18f2: bf3d j 1830 else if (lo > 50) pet.health = clamp100(pet.health + 2); 18f4: 03200513 li a0,50 18f8: f8c554e3 bge a0,a2,1880 18fc: 0789 addi a5,a5,2 18fe: bf95 j 1872 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1900: fff7c613 not a2,a5 1904: 867d srai a2,a2,0x1f 1906: 8ff1 and a5,a5,a2 1908: bf95 j 187c 190a: 0000 unimp 190c: 31647373 .insn 4, 0x31647373 1910: 5f363033 .insn 4, 0x5f363033 1914: 3269 jal 129e 1916: 72655f63 bge a0,t1,2054 191a: 6f72 .insn 2, 0x6f72 191c: 2072 .insn 2, 0x2072 191e: 202d jal 1948 1920: 6974 .insn 2, 0x6974 1922: 656d lui a0,0x1b 1924: 2074756f jal a0,4932a 1928: 74696177 .insn 4, 0x74696177 192c: 6e69 lui t3,0x1a 192e: 6f662067 .insn 4, 0x6f662067 1932: 2072 .insn 2, 0x2072 1934: 7325 lui t1,0xfffe9 1936: 0d0a slli s10,s10,0x2 1938: 0000 unimp 193a: 0000 unimp 193c: 7a5a .insn 2, 0x7a5a 193e: 007a c.slli zero,0x1e 1940: 00006e4f .insn 4, 0x6e4f 1944: 0066664f .insn 4, 0x0066664f 1948: 4150 lw a2,4(a0) 194a: 414e lw sp,208(sp) 194c: 43544f47 .insn 4, 0x43544f47 1950: 4948 lw a0,20(a0) 1952: 0000 unimp 1954: 7270 .insn 2, 0x7270 1956: 7365 lui t1,0xffff9 1958: 6e612073 .insn 4, 0x6e612073 195c: 2079 jal 19ea 195e: 0079656b .insn 4, 0x0079656b 1962: 0000 unimp 1964: 0021 c.nop 8 1966: 0000 unimp 1968: 007a c.slli zero,0x1e 196a: 0000 unimp 196c: 005a c.slli zero,0x16 196e: 0000 unimp 1970: 2d2d jal 1faa 1972: 5320 lw s0,96(a4) 1974: 4154 lw a3,4(a0) 1976: 5554 lw a3,44(a0) 1978: 2d2d2053 .insn 4, 0x2d2d2053 197c: 0000 unimp 197e: 0000 unimp 1980: 4f46 lw t5,80(sp) 1982: 0000444f .insn 4, 0x444f 1986: 0000 unimp 1988: 5546 lw a0,112(sp) 198a: 204e .insn 2, 0x204e 198c: 0000 unimp 198e: 0000 unimp 1990: 4e45 li t3,17 1992: 00005947 .insn 4, 0x5947 1996: 0000 unimp 1998: 48534157 .insn 4, 0x48534157 199c: 0000 unimp 199e: 0000 unimp 19a0: 4c48 lw a0,28(s0) 19a2: 4854 lw a3,20(s0) 19a4: 0000 unimp 19a6: 0000 unimp 19a8: 6741 lui a4,0x10 19aa: 2065 jal 1a52 19ac: 7525 lui a0,0xfffe9 19ae: 2020 .insn 2, 0x2020 19b0: 7325 lui t1,0xfffe9 19b2: 0000 unimp 19b4: 202d jal 19de 19b6: 54544553 .insn 4, 0x54544553 19ba: 4e49 li t3,18 19bc: 2d205347 .insn 4, 0x2d205347 19c0: 0000 unimp 19c2: 0000 unimp 19c4: 65726353 .insn 4, 0x65726353 19c8: 6e65 lui t3,0x19 19ca: 6f20 .insn 2, 0x6f20 19cc: 6666 .insn 2, 0x6666 19ce: 253a .insn 2, 0x253a 19d0: 00000073 ecall 19d4: 6e756f53 .insn 4, 0x6e756f53 19d8: 3a64 .insn 2, 0x3a64 19da: 2520 .insn 2, 0x2520 19dc: 00000073 ecall 19e0: 6142 .insn 2, 0x6142 19e2: 00006b63 bltu zero,zero,19f8 19e6: 0000 unimp 19e8: 2f4c .insn 2, 0x2f4c 19ea: 2052 .insn 2, 0x2052 19ec: 6f6d lui t5,0x1b 19ee: 6576 .insn 2, 0x6576 19f0: 2020 .insn 2, 0x2020 19f2: 75204b4f .insn 4, 0x75204b4f 19f6: 00006573 .insn 4, 0x6573 19fa: 0000 unimp 19fc: 2e52 .insn 2, 0x2e52 19fe: 2e49 jal 1d90 1a00: 2e50 .insn 2, 0x2e50 1a02: 0000 unimp 1a04: 696c .insn 2, 0x696c 1a06: 6576 .insn 2, 0x6576 1a08: 2064 .insn 2, 0x2064 1a0a: 7525 lui a0,0xfffe9 1a0c: 6d20 .insn 2, 0x6d20 1a0e: 6e69 lui t3,0x1a 1a10: 0000 unimp 1a12: 0000 unimp 1a14: 6f6e .insn 2, 0x6f6e 1a16: 2074 .insn 2, 0x2074 1a18: 7562 .insn 2, 0x7562 1a1a: 00007973 .insn 4, 0x7973 1a1e: 0000 unimp 1a20: 616d addi sp,sp,240 1a22: 72657473 .insn 4, 0x72657473 1a26: 6d20 .insn 2, 0x6d20 1a28: 0065646f jal s0,57a2e 1a2c: 7274 .insn 2, 0x7274 1a2e: 6e61 lui t3,0x18 1a30: 74696d73 .insn 4, 0x74696d73 1a34: 6d20 .insn 2, 0x6d20 1a36: 0065646f jal s0,57a3c 1a3a: 0000 unimp 1a3c: 7874 .insn 2, 0x7874 1a3e: 6520 .insn 2, 0x6520 1a40: 706d c.lui zero,0xffffb 1a42: 7974 .insn 2, 0x7974 1a44: 0000 unimp 1a46: 0000 unimp 1a48: 7274 .insn 2, 0x7274 1a4a: 6e61 lui t3,0x18 1a4c: 74696d73 .insn 4, 0x74696d73 1a50: 6320 .insn 2, 0x6320 1a52: 6c706d6f jal s10,8918 1a56: 7465 lui s0,0xffff9 1a58: 0065 c.nop 25 1a5a: 0000 unimp 1a5c: 4546 lw a0,80(sp) 1a5e: 4445 li s0,17 1a60: 0000 unimp 1a62: 0000 unimp 1a64: 4c50 lw a2,28(s0) 1a66: 5941 li s2,-16 1a68: 0000 unimp 1a6a: 0000 unimp 1a6c: 45454c53 .insn 4, 0x45454c53 1a70: 0050 addi a2,sp,4 1a72: 0000 unimp 1a74: 41454c43 .insn 4, 0x41454c43 1a78: 004e c.slli zero,0x13 1a7a: 0000 unimp 1a7c: 4548 lw a0,12(a0) 1a7e: 4c41 li s8,16 1a80: 0000 unimp 1a82: 0000 unimp 1a84: 54415453 .insn 4, 0x54415453 1a88: 00000053 .insn 4, 0x0053 1a8c: 54544553 .insn 4, 0x54544553 1a90: 4e49 li t3,18 1a92: 00005347 .insn 4, 0x5347 1a96: 0000 unimp 1a98: 3531 jal 18a4 1a9a: 30330073 .insn 4, 0x30330073 1a9e: 30360073 .insn 4, 0x30360073 1aa2: 114e0073 .insn 4, 0x114e0073 1aa6: 0000 unimp 1aa8: 12c6 slli t0,t0,0x31 1aaa: 0000 unimp 1aac: 133c addi a5,sp,424 1aae: 0000 unimp 1ab0: 135e slli t1,t1,0x37 1ab2: 0000 unimp 1ab4: 139e slli t2,t2,0x27 1ab6: 0000 unimp 1ab8: 13e0 addi s0,sp,492 1aba: 0000 unimp 1abc: 13f0 addi a2,sp,492 ... 00001ac0 : 1ac0: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............? 1ad0: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|.......... 00001ae0 : 1ae0: 0000 0000 0000 c000 c000 c000 c006 c006 ................ 1af0: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... 00001b00 : 1b00: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. 1b10: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ 00001b20 : 1b20: 0000 0000 8000 8000 c001 c001 f007 f80d ................ 1b30: f80d f808 fc1d f80d f80f f80f f007 8000 ................ 00001b40 : 1b40: 0000 0000 0000 0004 000c 001c 0018 001c ................ 1b50: 003c 001c 001e 001f e80f f007 8000 0000 <............... 00001b60 : 1b60: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ 1b70: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. 00001b80 : 1b80: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. 1b90: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... 00001ba0 : ... 1ba8: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1bb8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1bc8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1bd8: ff07 f0ff bb0f f8ee d70f f8f5 ef0f f8fb ................ 1be8: d70f f8f5 bb1f fcee ff0f f8ff ff0f f8ff ................ 1bf8: ff0f f8ff f00f f807 ff07 f0ff ff07 f0ff ................ 1c08: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1c18: 1f00 00fc 0000 0080 ........ 00001c20 : ... 1c28: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1c38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1c48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1c58: ff07 f0ff ff0f f8ff ff0f f8ff ff0f f8ff ................ 1c68: 010f 78c0 ff1f fcff ff0f f8ff ff0f f87f ...x............ 1c78: fc0f f81f ff0f f87f ff07 f0ff ff07 f0ff ................ 1c88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1c98: 1f00 00fc 0000 0080 ........ 00001ca0 : ... 1ca8: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1cb8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1cc8: ff1f f8ff ff0f f0ff ff03 e0ff ef07 f0fb ................ 1cd8: 8307 f0e0 930f f8e4 110f 78c4 830f f8e0 ...........x.... 1ce8: 830f f8e0 ef1f fcfb ff0f f87f fc0f f81f ................ 1cf8: fc0f f81f f80f f80f fc07 f01f fc07 f01f ................ 1d08: ff03 e07f ff01 c0ff ff00 80ff 7f00 00ff ................ 1d18: 1f00 00fc 0000 0080 ........ 00001d20 : ... 1d28: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1d38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1d48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1d58: ff07 f0ff ef0f f8fb 830f f8e0 930f f8e4 ................ 1d68: 110f 78c4 831f fce0 830f f860 ec0f f81b ...x......`..... 1d78: ff0f f87f fc0f f81f f707 f0f7 fb07 f0ef ................ 1d88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1d98: 1f00 00fc 0000 0080 ........ 00001da0 : ... 1da8: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1db8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1dc8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1dd8: ff07 f0ff ff0f f8ff ef0f f8fb d70f f8f5 ................ 1de8: ff0f f8ff ff1f fcff ff0f f8ff f80f f80f ................ 1df8: fb0f f8ef f70f f8f7 fc07 f01f ff07 f0ff ................ 1e08: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1e18: 1f00 00fc 0000 0080 ........ 00001e20 : ... 1e28: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1e38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1e48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1e58: ff07 f0ff ff0f f8ff ff0f f8ff 010f 78c0 ...............x 1e68: ff0f f8ff ff1f fcff ff0f f87f fc0f f81f ................ 1e78: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................ 1e88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1e98: 1f00 00fc 0000 0080 ........ 00001ea0 : 1ea0: 1a14 0000 1a20 0000 1a2c 0000 1a3c 0000 .... ...,...<... 1eb0: 1a48 0000 H... 00001eb4 : 1eb4: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... 1ec4: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... 00001ed0 : ... 1ed8: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1ee8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1ef8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1f08: ef07 f0fb 830f f8e0 930f f8e4 110f 78c4 ...............x 1f18: 830f f8e0 831f fce0 ef0f f87b fc0f f81f ..........{..... 1f28: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................ 1f38: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1f48: 1f00 00fc 0000 0080 ........ 00001f50 : 1f50: 1b80 0000 1b60 0000 1b40 0000 1b20 0000 ....`...@... ... 1f60: 1b00 0000 1ae0 0000 1ac0 0000 ............ 00001f6c : 1f6c: 1ed0 0000 1e20 0000 1da0 0000 1d20 0000 .... ....... ... 1f7c: 1ca0 0000 1c20 0000 1ba0 0000 .... ....... 00001f88 : 1f88: 1a5c 0000 1a64 0000 1a6c 0000 1a74 0000 \...d...l...t... 1f98: 1a7c 0000 1a84 0000 1a8c 0000 |........... 00001fa4 : 1fa4: 1a98 0000 1a9c 0000 1aa0 0000 1944 0000 ............D... 00001fb4 : ... 1fbc: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................ 1fcc: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3.. 1fdc: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0.......... 1fec: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?... 1ffc: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................ 200c: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................ ... 00002034 : ... 203c: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~ 204c: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8.. 205c: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8 206c: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<........... 207c: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 ..>....<~..~<. 20cc: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{.... 20dc: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a`<.|.. 215c: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v. 216c: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000... 217c: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.l...... 24cc: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|. 24dc: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v. 24ec: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~.. 24fc: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|. 250c: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f.. 251c: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~.......... 252c: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v. 253c: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|. 254c: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff. 255c: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v........~.. 256c: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>. 257c: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................ 258c: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j.. 259c: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3.. 25ac: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".". 25bc: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w. 25cc: 1818 1818 1818 1818 1818 1818 18f8 1818 ................ 25dc: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666 25ec: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........ 25fc: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666 260c: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666...... 261c: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............ 262c: 0000 0000 18f8 1818 1818 1818 001f 0000 ................ 263c: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................ 264c: 1818 1818 181f 1818 0000 0000 00ff 0000 ................ 265c: 1818 1818 18ff 1818 1818 181f 181f 1818 ................ 266c: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?... 267c: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666...... 268c: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666 269c: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666 26ac: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666.... 26bc: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666 26cc: 3636 3636 003f 0000 1818 181f 001f 0000 6666?........... 26dc: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666 26ec: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........ 26fc: 1818 1818 00f8 0000 0000 0000 181f 1818 ................ 270c: ffff ffff ffff ffff 0000 0000 ffff ffff ................ 271c: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................ 272c: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v. 273c: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x............... 274c: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`... 275c: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|. 276c: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.ff<...~..~.. 279c: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0.. 27ac: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|.............. 27bc: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~. 27cc: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~......... 27dc: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~.... 27ec: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8.... 27fc: 0000 1800 0018 0000 0000 1800 0000 0000 ................ 280c: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666... 281c: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<.. ...