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: 0410006f j 840 4: 00000000 .word 0x00000000 8: 000008fe .word 0x000008fe c: 000008b2 .word 0x000008b2 ... 30: 000008b2 .word 0x000008b2 34: 00000000 .word 0x00000000 38: 000008b2 .word 0x000008b2 3c: 00000000 .word 0x00000000 40: 000008b2 .word 0x000008b2 44: 000008b2 .word 0x000008b2 48: 000008b2 .word 0x000008b2 4c: 000008b2 .word 0x000008b2 50: 000008b2 .word 0x000008b2 54: 000008b2 .word 0x000008b2 58: 000008b2 .word 0x000008b2 5c: 000008b2 .word 0x000008b2 60: 000008b2 .word 0x000008b2 64: 000008b2 .word 0x000008b2 68: 000008b2 .word 0x000008b2 6c: 000008b2 .word 0x000008b2 70: 000008b2 .word 0x000008b2 74: 000008b2 .word 0x000008b2 78: 000008b2 .word 0x000008b2 7c: 000008b2 .word 0x000008b2 80: 000008b2 .word 0x000008b2 84: 000008b2 .word 0x000008b2 88: 000008b2 .word 0x000008b2 8c: 000008b2 .word 0x000008b2 90: 000008b2 .word 0x000008b2 94: 000008b2 .word 0x000008b2 98: 000008b2 .word 0x000008b2 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: c2818513 addi a0,gp,-984 # 20000024 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 : // ----------------------------------------------------------------- helpers static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } // short square-wave beep on the passive piezo (blocking, ms-scale only) static void beep(uint16_t freq, uint16_t ms) { 3a4: 1131 addi sp,sp,-20 3a6: c622 sw s0,12(sp) 3a8: 842e mv s0,a1 if (freq == 0) { Delay_Ms(ms); return; } uint32_t half = 500000u / freq; // half-period in us 3aa: 85aa mv a1,a0 3ac: 0007a537 lui a0,0x7a 3b0: 12050513 addi a0,a0,288 # 7a120 { 3b4: c806 sw ra,16(sp) 3b6: c426 sw s1,8(sp) uint32_t half = 500000u / freq; // half-period in us 3b8: 39c5 jal a8 <__hidden___udivsi3> uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 3ba: 00541793 slli a5,s0,0x5 3be: 8f81 sub a5,a5,s0 3c0: 078a slli a5,a5,0x2 3c2: 97a2 add a5,a5,s0 3c4: 00151413 slli s0,a0,0x1 uint32_t half = 500000u / freq; // half-period in us 3c8: 84aa mv s1,a0 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 3ca: 85a2 mv a1,s0 3cc: 00379513 slli a0,a5,0x3 3d0: 39e1 jal a8 <__hidden___udivsi3> for (uint32_t i = 0; i < cycles; i++) { funDigitalWrite(BUZZER, FUN_HIGH); Delay_Us(half); 3d2: 9426 add s0,s0,s1 3d4: 00141793 slli a5,s0,0x1 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 3d8: 872a mv a4,a0 Delay_Us(half); 3da: c03e sw a5,0(sp) for (uint32_t i = 0; i < cycles; i++) { 3dc: 4401 li s0,0 Delay_Us(half); 3de: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_HIGH); 3e0: 400114b7 lui s1,0x40011 3e4: c23a sw a4,4(sp) 3e6: 4691 li a3,4 3e8: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00> 3ec: c894 sw a3,16(s1) Delay_Us(half); 3ee: 3d91 jal 242 funDigitalWrite(BUZZER, FUN_LOW); Delay_Us(half); 3f0: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_LOW); 3f2: 000406b7 lui a3,0x40 3f6: c894 sw a3,16(s1) Delay_Us(half); 3f8: 35a9 jal 242 for (uint32_t i = 0; i < cycles; i++) { 3fa: 4712 lw a4,4(sp) 3fc: 0405 addi s0,s0,1 3fe: fe8710e3 bne a4,s0,3de } } 402: 40c2 lw ra,16(sp) 404: 4432 lw s0,12(sp) 406: 44a2 lw s1,8(sp) 408: 0151 addi sp,sp,20 40a: 8082 ret 0000040c : static void led_blink(void) { 40c: 1161 addi sp,sp,-8 40e: c022 sw s0,0(sp) funDigitalWrite(LED_PIN, FUN_HIGH); 410: 40011437 lui s0,0x40011 { 414: c206 sw ra,4(sp) funDigitalWrite(LED_PIN, FUN_HIGH); 416: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000> 41a: 4789 li a5,2 Delay_Ms(30); 41c: 0002c537 lui a0,0x2c funDigitalWrite(LED_PIN, FUN_HIGH); 420: c81c sw a5,16(s0) Delay_Ms(30); 422: f2050513 addi a0,a0,-224 # 2bf20 426: 3d31 jal 242 funDigitalWrite(LED_PIN, FUN_LOW); 428: 000207b7 lui a5,0x20 } 42c: 4092 lw ra,4(sp) funDigitalWrite(LED_PIN, FUN_LOW); 42e: c81c sw a5,16(s0) } 430: 4402 lw s0,0(sp) 432: 0121 addi sp,sp,8 434: 8082 ret 00000436 : static void pet_reset(void) { pet.satiety = 80; 436: 645a5737 lui a4,0x645a5 43a: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850> 43e: c0e1ae23 sw a4,-996(gp) # 20000018 pet.happy = 80; pet.energy = 90; pet.hygiene = 100; pet.health = 100; 442: c1c18793 addi a5,gp,-996 # 20000018 446: 06400713 li a4,100 44a: 00e78223 sb a4,4(a5) # 20004 pet.age_min = 0; pet.poop = 0; pet.sleeping = 0; pet.alive = 1; 44e: 4705 li a4,1 pet.age_min = 0; 450: 00079323 sh zero,6(a5) pet.poop = 0; 454: 00079423 sh zero,8(a5) pet.alive = 1; 458: 00e78523 sb a4,10(a5) screen = SCR_MAIN; 45c: c0018c23 sb zero,-1000(gp) # 20000014 cursor = 0; 460: c0018ba3 sb zero,-1001(gp) # 20000013 } 464: 8082 ret 00000466 : static Buttons read_buttons(void) { // active-low: pressed reads 0 Buttons b; b.ok = !funDigitalRead(BTN_OK); 466: 400117b7 lui a5,0x40011 46a: 4788 lw a0,8(a5) b.left = !funDigitalRead(BTN_LEFT); 46c: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00> 470: 4798 lw a4,8(a5) b.right = !funDigitalRead(BTN_RIGHT); 472: 479c lw a5,8(a5) b.ok = !funDigitalRead(BTN_OK); 474: fff54513 not a0,a0 b.left = !funDigitalRead(BTN_LEFT); 478: 8319 srli a4,a4,0x6 47a: fff74713 not a4,a4 b.right = !funDigitalRead(BTN_RIGHT); 47e: 8395 srli a5,a5,0x5 480: fff7c793 not a5,a5 return b; 484: 8b05 andi a4,a4,1 486: 8905 andi a0,a0,1 488: 0722 slli a4,a4,0x8 48a: 8b85 andi a5,a5,1 { 48c: 1171 addi sp,sp,-4 return b; 48e: 07c2 slli a5,a5,0x10 490: 8d59 or a0,a0,a4 } 492: 8d5d or a0,a0,a5 494: 0111 addi sp,sp,4 496: 8082 ret 00000498 : } /* * draw a string to the display */ void ssd1306_drawstr(int x, int y, const char *str, uint8_t color) 498: 1101 addi sp,sp,-32 49a: cc22 sw s0,24(sp) 49c: ca26 sw s1,20(sp) 49e: ce06 sw ra,28(sp) 4a0: 842a mv s0,a0 4a2: 832e mv t1,a1 4a4: 84b2 mv s1,a2 { uint8_t c; while((c=*str++)) 4a6: 0004c283 lbu t0,0(s1) 4aa: 0485 addi s1,s1,1 4ac: 04028d63 beqz t0,506 4b0: 4701 li a4,0 d = fontdata[(chr<<3)+i]; 4b2: 00329793 slli a5,t0,0x3 4b6: 6689 lui a3,0x2 4b8: ba068693 addi a3,a3,-1120 # 1ba0 4bc: 97ba add a5,a5,a4 4be: 97b6 add a5,a5,a3 4c0: 0007c683 lbu a3,0(a5) 4c4: 4781 li a5,0 ssd1306_drawPixel(x+j, y+i, col); 4c6: 0076d613 srli a2,a3,0x7 4ca: 00e305b3 add a1,t1,a4 4ce: 00f40533 add a0,s0,a5 4d2: c816 sw t0,16(sp) 4d4: c636 sw a3,12(sp) 4d6: c43a sw a4,8(sp) 4d8: c21a sw t1,4(sp) 4da: c03e sw a5,0(sp) 4dc: 3571 jal 368 d <<= 1; 4de: 46b2 lw a3,12(sp) for(j=0;j<8;j++) 4e0: 4782 lw a5,0(sp) 4e2: 4621 li a2,8 d <<= 1; 4e4: 0686 slli a3,a3,0x1 for(j=0;j<8;j++) 4e6: 0785 addi a5,a5,1 4e8: 4312 lw t1,4(sp) 4ea: 4722 lw a4,8(sp) 4ec: 42c2 lw t0,16(sp) d <<= 1; 4ee: 0ff6f693 zext.b a3,a3 for(j=0;j<8;j++) 4f2: fcc79ae3 bne a5,a2,4c6 for(i=0;i<8;i++) 4f6: 0705 addi a4,a4,1 4f8: faf71de3 bne a4,a5,4b2 { ssd1306_drawchar(x, y, c, color); x += 8; 4fc: 9432 add s0,s0,a2 if(x>120) 4fe: 07800793 li a5,120 502: fa87d2e3 bge a5,s0,4a6 break; } } 506: 40f2 lw ra,28(sp) 508: 4462 lw s0,24(sp) 50a: 44d2 lw s1,20(sp) 50c: 6105 addi sp,sp,32 50e: 8082 ret 00000510 : { 510: 862e mv a2,a1 int len = 0; 512: 4701 li a4,0 while (s[len]) len++; 514: 00e607b3 add a5,a2,a4 518: 0007c783 lbu a5,0(a5) 51c: eb99 bnez a5,532 int x = (SSD1306_W - len * 8) / 2; 51e: 47c1 li a5,16 520: 8f99 sub a5,a5,a4 522: 078a slli a5,a5,0x2 if (x < 0) x = 0; 524: fff7c713 not a4,a5 528: 877d srai a4,a4,0x1f ssd1306_drawstr(x, y, s, 1); 52a: 85aa mv a1,a0 52c: 00e7f533 and a0,a5,a4 530: b7a5 j 498 while (s[len]) len++; 532: 0705 addi a4,a4,1 534: b7c5 j 514 00000536 : if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 536: 07f00713 li a4,127 53a: 04a76263 bltu a4,a0,57e 53e: 03f00793 li a5,63 542: 02b7ee63 bltu a5,a1,57e void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) 546: 1141 addi sp,sp,-16 if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; 548: fff60793 addi a5,a2,-1 void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) 54c: c422 sw s0,8(sp) 54e: c606 sw ra,12(sp) 550: c226 sw s1,4(sp) if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; 552: 97aa add a5,a5,a0 554: 842a mv s0,a0 556: 00f77563 bgeu a4,a5,560 55a: 08000613 li a2,128 55e: 8e09 sub a2,a2,a0 560: 00c404b3 add s1,s0,a2 564: 8522 mv a0,s0 ssd1306_drawPixel(x++, y, color); 566: 4605 li a2,1 568: c02e sw a1,0(sp) 56a: 0405 addi s0,s0,1 56c: 3bf5 jal 368 while (w--) 56e: 4582 lw a1,0(sp) 570: fe849ae3 bne s1,s0,564 } 574: 40b2 lw ra,12(sp) 576: 4422 lw s0,8(sp) 578: 4492 lw s1,4(sp) 57a: 0141 addi sp,sp,16 57c: 8082 ret 57e: 8082 ret 00000580 : if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 580: 07f00793 li a5,127 584: 02a7cf63 blt a5,a0,5c2 void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) 588: 1141 addi sp,sp,-16 58a: c422 sw s0,8(sp) 58c: c606 sw ra,12(sp) 58e: c226 sw s1,4(sp) if((y+h-1) >= SSD1306_H) h = SSD1306_H-y; 590: 00c587b3 add a5,a1,a2 594: 04000713 li a4,64 598: 842e mv s0,a1 59a: 00f75463 bge a4,a5,5a2 59e: 40b70633 sub a2,a4,a1 5a2: 008604b3 add s1,a2,s0 while(h--) 5a6: 00941763 bne s0,s1,5b4 } 5aa: 40b2 lw ra,12(sp) 5ac: 4422 lw s0,8(sp) 5ae: 4492 lw s1,4(sp) 5b0: 0141 addi sp,sp,16 5b2: 8082 ret ssd1306_drawPixel(x, y++, color); 5b4: 85a2 mv a1,s0 5b6: 4605 li a2,1 5b8: c02a sw a0,0(sp) 5ba: 337d jal 368 5bc: 4502 lw a0,0(sp) 5be: 0405 addi s0,s0,1 5c0: b7dd j 5a6 5c2: 8082 ret 000005c4 : void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) 5c4: 1131 addi sp,sp,-20 5c6: c426 sw s1,8(sp) 5c8: 84b2 mv s1,a2 ssd1306_drawFastVLine(x, y, h, color); 5ca: 8636 mv a2,a3 void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) 5cc: c806 sw ra,16(sp) 5ce: c622 sw s0,12(sp) 5d0: c236 sw a3,4(sp) 5d2: 842a mv s0,a0 5d4: c02e sw a1,0(sp) ssd1306_drawFastVLine(x, y, h, color); 5d6: 376d jal 580 ssd1306_drawFastVLine(x+w-1, y, h, color); 5d8: 4612 lw a2,4(sp) 5da: 4582 lw a1,0(sp) 5dc: fff48513 addi a0,s1,-1 5e0: 9522 add a0,a0,s0 5e2: 3f79 jal 580 ssd1306_drawFastHLine(x, y, w, color); 5e4: 4582 lw a1,0(sp) 5e6: 8626 mv a2,s1 5e8: 8522 mv a0,s0 5ea: 37b1 jal 536 ssd1306_drawFastHLine(x, y+h-1, w, color); 5ec: 4782 lw a5,0(sp) 5ee: 8522 mv a0,s0 } 5f0: 4432 lw s0,12(sp) ssd1306_drawFastHLine(x, y+h-1, w, color); 5f2: fff78593 addi a1,a5,-1 5f6: 4792 lw a5,4(sp) } 5f8: 40c2 lw ra,16(sp) ssd1306_drawFastHLine(x, y+h-1, w, color); 5fa: 8626 mv a2,s1 } 5fc: 44a2 lw s1,8(sp) ssd1306_drawFastHLine(x, y+h-1, w, color); 5fe: 95be add a1,a1,a5 } 600: 0151 addi sp,sp,20 ssd1306_drawFastHLine(x, y+h-1, w, color); 602: bf15 j 536 00000604 : { 604: 1121 addi sp,sp,-24 606: c822 sw s0,16(sp) 608: c626 sw s1,12(sp) 60a: 842a mv s0,a0 60c: 84b2 mv s1,a2 ssd1306_drawstr(0, y, label, 1); 60e: 862e mv a2,a1 610: 85aa mv a1,a0 612: 4501 li a0,0 { 614: ca06 sw ra,20(sp) ssd1306_drawstr(0, y, label, 1); 616: 3549 jal 498 ssd1306_drawRect(bx, y, bw, 7, 1); 618: 03000513 li a0,48 61c: 469d li a3,7 61e: 04c00613 li a2,76 622: 85a2 mv a1,s0 624: 3745 jal 5c4 int fill = (val * (bw - 2)) / 100; 626: 00349513 slli a0,s1,0x3 62a: 9526 add a0,a0,s1 62c: 050a slli a0,a0,0x2 62e: 9526 add a0,a0,s1 630: 0506 slli a0,a0,0x1 if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 632: 06300793 li a5,99 636: 02a7df63 bge a5,a0,674 63a: 00140793 addi a5,s0,1 int fill = (val * (bw - 2)) / 100; 63e: 06400593 li a1,100 if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 642: c03e sw a5,0(sp) int fill = (val * (bw - 2)) / 100; 644: 3cb1 jal a0 <__divsi3> 646: 4782 lw a5,0(sp) 648: 872a mv a4,a0 64a: 0419 addi s0,s0,6 64c: 03170693 addi a3,a4,49 m=x; 650: 03100493 li s1,49 654: 8526 mv a0,s1 ssd1306_drawPixel(m++, n, color); 656: 85be mv a1,a5 658: 4605 li a2,1 65a: c436 sw a3,8(sp) 65c: c23a sw a4,4(sp) 65e: c03e sw a5,0(sp) 660: 3321 jal 368 while(w--) 662: 46a2 lw a3,8(sp) ssd1306_drawPixel(m++, n, color); 664: 0485 addi s1,s1,1 while(w--) 666: 4782 lw a5,0(sp) 668: 4712 lw a4,4(sp) 66a: fed495e3 bne s1,a3,654 n++; 66e: 0785 addi a5,a5,1 while(h--) 670: fc879ee3 bne a5,s0,64c } 674: 40d2 lw ra,20(sp) 676: 4442 lw s0,16(sp) 678: 44b2 lw s1,12(sp) 67a: 0161 addi sp,sp,24 67c: 8082 ret 0000067e : void ssd1306_drawImage(uint32_t x, uint32_t y, const unsigned char* input, uint32_t width, uint32_t height, uint32_t color_mode) { 67e: fd810113 addi sp,sp,-40 682: 00e587b3 add a5,a1,a4 686: d222 sw s0,36(sp) 688: d026 sw s1,32(sp) 68a: c82a sw a0,16(sp) 68c: ca32 sw a2,20(sp) uint32_t bytes_to_draw = width / 8; 68e: 0036d413 srli s0,a3,0x3 692: c63e sw a5,12(sp) 694: 4381 li t2,0 uint32_t v_mask = 1 << (y_absolute & 7); 696: 0075f793 andi a5,a1,7 69a: 4705 li a4,1 69c: 00f717b3 sll a5,a4,a5 6a0: c03e sw a5,0(sp) uint32_t input_byte = input[byte + line * bytes_to_draw]; 6a2: 47d2 lw a5,20(sp) for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { 6a4: 4681 li a3,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; 6a6: 979e add a5,a5,t2 6a8: cc3e sw a5,24(sp) buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 6aa: 0035d793 srli a5,a1,0x3 6ae: 079e slli a5,a5,0x7 6b0: ce3e sw a5,28(sp) uint32_t input_byte = input[byte + line * bytes_to_draw]; 6b2: 47e2 lw a5,24(sp) x_absolute = x + 8 * byte + pixel; 6b4: 00369293 slli t0,a3,0x3 for (pixel = 0; pixel < 8; pixel++) { 6b8: 4701 li a4,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; 6ba: 97b6 add a5,a5,a3 6bc: 0007c783 lbu a5,0(a5) 6c0: c23e sw a5,4(sp) x_absolute = x + 8 * byte + pixel; 6c2: 47c2 lw a5,16(sp) 6c4: 92be add t0,t0,a5 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 6c6: 47f2 lw a5,28(sp) 6c8: 005784b3 add s1,a5,t0 if (x_absolute >= SSD1306_W) { 6cc: 00e287b3 add a5,t0,a4 6d0: 07f00613 li a2,127 6d4: 04f66463 bltu a2,a5,71c uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) 6d8: 4512 lw a0,4(sp) 6da: 08000793 li a5,128 6de: 40e7d7b3 sra a5,a5,a4 6e2: 8fe9 and a5,a5,a0 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 6e4: 00e48633 add a2,s1,a4 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 6e8: c2818513 addi a0,gp,-984 # 20000024 6ec: 9532 add a0,a0,a2 6ee: 00014303 lbu t1,0(sp) uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) 6f2: c43e sw a5,8(sp) ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 6f4: 00054783 lbu a5,0(a0) 6f8: fff34613 not a2,t1 for (pixel = 0; pixel < 8; pixel++) { 6fc: 0705 addi a4,a4,1 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); 6fe: 8e7d and a2,a2,a5 700: 47a2 lw a5,8(sp) 702: 00f037b3 snez a5,a5 706: 40f007b3 neg a5,a5 70a: 00f37333 and t1,t1,a5 70e: 00666633 or a2,a2,t1 712: 00c50023 sb a2,0(a0) for (pixel = 0; pixel < 8; pixel++) { 716: 47a1 li a5,8 718: faf71ae3 bne a4,a5,6cc for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { 71c: 0685 addi a3,a3,1 71e: f8d41ae3 bne s0,a3,6b2 for (uint32_t line = 0; line < height; line++) { 722: 47b2 lw a5,12(sp) 724: 0585 addi a1,a1,1 726: 93a2 add t2,t2,s0 728: 00b78663 beq a5,a1,734 if (y_absolute >= SSD1306_H) { 72c: 04000793 li a5,64 730: f6f593e3 bne a1,a5,696 } 734: 5412 lw s0,36(sp) 736: 5482 lw s1,32(sp) 738: 02810113 addi sp,sp,40 73c: 8082 ret 0000073e : uint32_t dmd0 = *dmdata0; 73e: e00007b7 lui a5,0xe0000 742: 0f47a783 lw a5,244(a5) # e00000f4 <_eusrstack+0xbffff8f4> } 746: 8082 ret 00000748 <_write.constprop.0>: if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; 748: e00007b7 lui a5,0xe0000 74c: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> 750: 4398 lw a4,0(a5) WEAK int _write(int fd, const char *buf, int size) 752: 1121 addi sp,sp,-24 754: ca06 sw ra,20(sp) 756: c822 sw s0,16(sp) 758: c626 sw s1,12(sp) if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; 75a: 0c077713 andi a4,a4,192 75e: 0c000693 li a3,192 762: 00d70b63 beq a4,a3,778 <_write.constprop.0+0x30> char buffer[4] = { 0 }; 766: c402 sw zero,8(sp) 768: 842e mv s0,a1 if( size == 0 ) 76a: eddd bnez a1,828 <_write.constprop.0+0xe0> lastdmd = (*DMDATA0); 76c: 439c lw a5,0(a5) if( lastdmd && !(lastdmd&0x80) ) internal_handle_input( (uint32_t*)DMDATA0 ); 76e: c789 beqz a5,778 <_write.constprop.0+0x30> 770: 0807f793 andi a5,a5,128 774: e391 bnez a5,778 <_write.constprop.0+0x30> 776: 37e1 jal 73e if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0; 778: 4401 li s0,0 } 77a: 40d2 lw ra,20(sp) 77c: 8522 mv a0,s0 77e: 4442 lw s0,16(sp) 780: 44b2 lw s1,12(sp) 782: 0161 addi sp,sp,24 784: 8082 ret int tosend = size - place; 786: 409407b3 sub a5,s0,s1 if( tosend > 7 ) tosend = 7; 78a: 471d li a4,7 78c: 00f75363 bge a4,a5,792 <_write.constprop.0+0x4a> 790: 87ba mv a5,a4 792: 001006b7 lui a3,0x100 while( ( lastdmd = (*DMDATA0) ) & 0x80 ) 796: e0000737 lui a4,0xe0000 if( tosend > 7 ) tosend = 7; 79a: 0685 addi a3,a3,1 # 100001 while( ( lastdmd = (*DMDATA0) ) & 0x80 ) 79c: 0f470713 addi a4,a4,244 # e00000f4 <_eusrstack+0xbffff8f4> 7a0: 4310 lw a2,0(a4) 7a2: 08067593 andi a1,a2,128 7a6: e1a5 bnez a1,806 <_write.constprop.0+0xbe> if( lastdmd ) internal_handle_input( (uint32_t*)DMDATA0 ); 7a8: c611 beqz a2,7b4 <_write.constprop.0+0x6c> 7aa: c22a sw a0,4(sp) 7ac: c03e sw a5,0(sp) 7ae: 3f41 jal 73e 7b0: 4512 lw a0,4(sp) 7b2: 4782 lw a5,0(sp) 7b4: 0034 addi a3,sp,8 if( tosend > 7 ) tosend = 7; 7b6: 470d li a4,3 7b8: 85b6 mv a1,a3 while( t < tosend ) 7ba: 04f74d63 blt a4,a5,814 <_write.constprop.0+0xcc> *DMDATA1 = *(uint32_t*)&(buffer[0]); 7be: 46a2 lw a3,8(sp) 7c0: e0000737 lui a4,0xe0000 while( t < tosend && t < 3 ) 7c4: 460d li a2,3 *DMDATA1 = *(uint32_t*)&(buffer[0]); 7c6: 0ed72c23 sw a3,248(a4) # e00000f8 <_eusrstack+0xbffff8f8> 7ca: 009506b3 add a3,a0,s1 t = 0; 7ce: 4701 li a4,0 buffer[t+1] = buf[t+place]; 7d0: 0006c283 lbu t0,0(a3) 7d4: 0705 addi a4,a4,1 7d6: 00e58333 add t1,a1,a4 7da: 00530023 sb t0,0(t1) while( t < tosend && t < 3 ) 7de: 00e78563 beq a5,a4,7e8 <_write.constprop.0+0xa0> 7e2: 0685 addi a3,a3,1 7e4: fec716e3 bne a4,a2,7d0 <_write.constprop.0+0x88> buffer[0] = 0x80 | (tosend + 4); 7e8: 00478713 addi a4,a5,4 7ec: f8076713 ori a4,a4,-128 7f0: 00e10423 sb a4,8(sp) *DMDATA0 = *(uint32_t*)&(buffer[0]); 7f4: 46a2 lw a3,8(sp) 7f6: e0000737 lui a4,0xe0000 place += tosend; 7fa: 94be add s1,s1,a5 *DMDATA0 = *(uint32_t*)&(buffer[0]); 7fc: 0ed72a23 sw a3,244(a4) # e00000f4 <_eusrstack+0xbffff8f4> while( place < size ) 800: f884c3e3 blt s1,s0,786 <_write.constprop.0+0x3e> 804: bf9d j 77a <_write.constprop.0+0x32> if( timeout-- == 0 ) 806: 16fd addi a3,a3,-1 808: fec1 bnez a3,7a0 <_write.constprop.0+0x58> *DMDATA0 |= 0xc0; 80a: 431c lw a5,0(a4) 80c: 0c07e793 ori a5,a5,192 810: c31c sw a5,0(a4) return 0; 812: b79d j 778 <_write.constprop.0+0x30> buffer[t-3] = buf[t+place]; 814: 00e48633 add a2,s1,a4 818: 962a add a2,a2,a0 81a: 00064603 lbu a2,0(a2) t++; 81e: 0705 addi a4,a4,1 820: 0685 addi a3,a3,1 buffer[t-3] = buf[t+place]; 822: fec68fa3 sb a2,-1(a3) 826: bf51 j 7ba <_write.constprop.0+0x72> 828: 4481 li s1,0 82a: bfd9 j 800 <_write.constprop.0+0xb8> 0000082c <__puts_uart>: { 82c: 1161 addi sp,sp,-8 82e: c022 sw s0,0(sp) 830: c206 sw ra,4(sp) 832: 842e mv s0,a1 _write( 0, s, len ); 834: 3f11 jal 748 <_write.constprop.0> } 836: 4092 lw ra,4(sp) 838: 8522 mv a0,s0 83a: 4402 lw s0,0(sp) 83c: 0121 addi sp,sp,8 83e: 8082 ret 00000840 : asm volatile( "\n\ 840: 20000197 auipc gp,0x20000 844: bbc18193 addi gp,gp,-1092 # 200003fc <__global_pointer$> 848: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack> 84c: 6509 lui a0,0x2 84e: 88050513 addi a0,a0,-1920 # 1880 852: 30051073 csrw mstatus,a0 856: fffff697 auipc a3,0xfffff 85a: 7aa68693 addi a3,a3,1962 # 0 85e: 0036e693 ori a3,a3,3 862: 30569073 csrw mtvec,a3 asm volatile( 866: c0c18513 addi a0,gp,-1012 # 20000008 86a: 02818593 addi a1,gp,40 # 20000424 <_ebss> 86e: 4601 li a2,0 870: 00b55663 bge a0,a1,87c 874: c110 sw a2,0(a0) 876: 0511 addi a0,a0,4 878: feb54ee3 blt a0,a1,874 87c: 00002517 auipc a0,0x2 880: c8c50513 addi a0,a0,-884 # 2508 <_data_lma> 884: c0418593 addi a1,gp,-1020 # 20000000 888: c0c18613 addi a2,gp,-1012 # 20000008 88c: 00c58863 beq a1,a2,89c 890: 4114 lw a3,0(a0) 892: c194 sw a3,0(a1) 894: 0511 addi a0,a0,4 896: 0591 addi a1,a1,4 898: fec59ae3 bne a1,a2,88c SysTick->CTLR = 1; 89c: e000f7b7 lui a5,0xe000f 8a0: 4705 li a4,1 8a2: c398 sw a4,0(a5) asm volatile( 8a4: 6785 lui a5,0x1 8a6: d9a78793 addi a5,a5,-614 # d9a
8aa: 34179073 csrw mepc,a5 8ae: 30200073 mret 000008b2 : // Return the Machine Exception Program Register (MEPC) static inline uint32_t __get_MEPC(void) { uint32_t result; __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mepc" : "=r"(result)); 8b2: 34102573 csrr a0,mepc PrintHex( __get_MEPC() ); // "addr2line -e debugprintfdemo.elf 0x000007e6" ---> debugprintfdemo.c:45 8b6: 3a0d jal 1e8 __ASM volatile( ADD_ARCH_ZICSR "csrr %0, mstatus": "=r"(result) ); 8b8: 30002573 csrr a0,mstatus PrintHex( __get_MSTATUS() ); 8bc: 3235 jal 1e8 // Return the Machine Trap Value Register (MTVAL) static inline uint32_t __get_MTVAL(void) { uint32_t result; __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mtval" : "=r" (result) ); 8be: 34302573 csrr a0,mtval PrintHex( __get_MTVAL() ); 8c2: 321d jal 1e8 __ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mcause": "=r"(result)); 8c4: 34202573 csrr a0,mcause PrintHex( __get_MCAUSE() ); 8c8: 3205 jal 1e8 while( (*DMDATA0) & 0x80 ); 8ca: e00007b7 lui a5,0xe0000 8ce: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> 8d2: 4398 lw a4,0(a5) 8d4: 08077713 andi a4,a4,128 8d8: ff6d bnez a4,8d2 *DMDATA0 = 0x0a85; 8da: 6705 lui a4,0x1 8dc: a8570713 addi a4,a4,-1403 # a85 8e0: c398 sw a4,0(a5) while( (*DMDATA0) & 0x80 ); 8e2: e00007b7 lui a5,0xe0000 8e6: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4> 8ea: 4398 lw a4,0(a5) 8ec: 08077713 andi a4,a4,128 8f0: ff6d bnez a4,8ea *DMDATA0 = 0xaaaaaa83; 8f2: aaaab737 lui a4,0xaaaab 8f6: a8370713 addi a4,a4,-1405 # aaaaaa83 <_eusrstack+0x8aaaa283> 8fa: c398 sw a4,0(a5) asm volatile( "1: j 1b" ); 8fc: a001 j 8fc 000008fe : RCC->INTR |= RCC_CSSC; // clear the clock security int flag 8fe: 40021737 lui a4,0x40021 902: 471c lw a5,8(a4) 904: 008006b7 lui a3,0x800 908: 8fd5 or a5,a5,a3 90a: c71c sw a5,8(a4) 0000090c : for (; *s; s++); 90c: 87aa mv a5,a0 90e: 0007c703 lbu a4,0(a5) 912: e701 bnez a4,91a } 914: 40a78533 sub a0,a5,a0 918: 8082 ret for (; *s; s++); 91a: 0785 addi a5,a5,1 91c: bfcd j 90e 0000091e : { 91e: fa410113 addi sp,sp,-92 922: caa2 sw s0,84(sp) 924: c8a6 sw s1,80(sp) 926: cc86 sw ra,88(sp) 928: c02a sw a0,0(sp) 92a: c22e sw a1,4(sp) 92c: 8432 mv s0,a2 92e: 84b6 mv s1,a3 if(puts == (void*)0) { 930: e509 bnez a0,93a puts = _puts; buf = (void*)0; 932: 1a800793 li a5,424 936: c202 sw zero,4(sp) 938: c03e sw a5,0(sp) int n = 0; 93a: ca02 sw zero,20(sp) while ((ch=*(fmt++))) { 93c: 00044783 lbu a5,0(s0) 940: 00140713 addi a4,s0,1 944: 00f10fa3 sb a5,31(sp) 948: eb81 bnez a5,958 } 94a: 40e6 lw ra,88(sp) 94c: 4456 lw s0,84(sp) 94e: 4552 lw a0,20(sp) 950: 44c6 lw s1,80(sp) 952: 05c10113 addi sp,sp,92 956: 8082 ret 958: c63a sw a4,12(sp) if (ch!='%') { 95a: 02500693 li a3,37 95e: 02d78063 beq a5,a3,97e len = puts(&ch, len, buf); 962: 4612 lw a2,4(sp) 964: 4782 lw a5,0(sp) 966: 4585 li a1,1 968: 01f10513 addi a0,sp,31 96c: 9782 jalr a5 while ((ch=*(fmt++))) { 96e: 4732 lw a4,12(sp) 970: c426 sw s1,8(sp) 972: 843a mv s0,a4 n = n + len; 974: 47d2 lw a5,20(sp) 976: 44a2 lw s1,8(sp) 978: 97aa add a5,a5,a0 97a: ca3e sw a5,20(sp) 97c: b7c1 j 93c ch=*(fmt++); 97e: 00144783 lbu a5,1(s0) if (ch == '0') pad_char = '0'; 982: 03000693 li a3,48 ch=*(fmt++); 986: 00240713 addi a4,s0,2 98a: 00f10fa3 sb a5,31(sp) if (ch == '0') pad_char = '0'; 98e: c63e sw a5,12(sp) 990: 08d79363 bne a5,a3,a16 ch=*(fmt++); 994: 843a mv s0,a4 996: 4681 li a3,0 998: 4701 li a4,0 while (ch >= '0' && ch <= '9') { 99a: 45a5 li a1,9 99c: a819 j 9b2 pad_to = pad_to * 10 + (ch - '0'); 99e: 00271793 slli a5,a4,0x2 9a2: 97ba add a5,a5,a4 9a4: 0786 slli a5,a5,0x1 ch=*(fmt++); 9a6: 0405 addi s0,s0,1 pad_to = pad_to * 10 + (ch - '0'); 9a8: 00f60733 add a4,a2,a5 ch=*(fmt++); 9ac: fff44783 lbu a5,-1(s0) 9b0: 4685 li a3,1 while (ch >= '0' && ch <= '9') { 9b2: fd078613 addi a2,a5,-48 9b6: 0ff67513 zext.b a0,a2 9ba: fea5f2e3 bgeu a1,a0,99e 9be: c299 beqz a3,9c4 9c0: 00f10fa3 sb a5,31(sp) if(pad_to > (signed int) sizeof(bf)) { 9c4: c83a sw a4,16(sp) 9c6: 46e1 li a3,24 9c8: 00e6d363 bge a3,a4,9ce 9cc: c836 sw a3,16(sp) if (ch == 'l') { 9ce: 06c00613 li a2,108 char l = 0; 9d2: 4681 li a3,0 if (ch == 'l') { 9d4: 00c79863 bne a5,a2,9e4 ch=*(fmt++); 9d8: 00044783 lbu a5,0(s0) l = 1; 9dc: 4685 li a3,1 ch=*(fmt++); 9de: 0405 addi s0,s0,1 9e0: 00f10fa3 sb a5,31(sp) switch (ch) { 9e4: 01f14603 lbu a2,31(sp) 9e8: 06400793 li a5,100 9ec: 06f60563 beq a2,a5,a56 9f0: 02c7e763 bltu a5,a2,a1e 9f4: 05800793 li a5,88 9f8: 0af60263 beq a2,a5,a9c 9fc: 06300793 li a5,99 a00: 0cf60063 beq a2,a5,ac0 a04: d239 beqz a2,94a len = puts(&ch, len, buf); a06: 4612 lw a2,4(sp) a08: 4782 lw a5,0(sp) a0a: 4585 li a1,1 a0c: 01f10513 addi a0,sp,31 a10: 9782 jalr a5 break; a12: c426 sw s1,8(sp) a14: b785 j 974 char pad_char = ' '; a16: 02000693 li a3,32 a1a: c636 sw a3,12(sp) a1c: bfa5 j 994 switch (ch) { a1e: 07500793 li a5,117 a22: 02f60a63 beq a2,a5,a56 a26: 07800793 li a5,120 a2a: 06f60963 beq a2,a5,a9c a2e: 07300793 li a5,115 a32: fcf61ae3 bne a2,a5,a06 ptr = va_arg(va, char*); a36: 00448793 addi a5,s1,4 a3a: 4084 lw s1,0(s1) a3c: cc3a sw a4,24(sp) a3e: c43e sw a5,8(sp) len = mini_strlen(ptr); a40: 8526 mv a0,s1 a42: 35e9 jal 90c if (pad_to > 0) { a44: 4762 lw a4,24(sp) len = mini_strlen(ptr); a46: 85aa mv a1,a0 if (pad_to > 0) { a48: 08e05963 blez a4,ada len = mini_pad(ptr, len, pad_char, pad_to, bf); a4c: 46c2 lw a3,16(sp) a4e: 4632 lw a2,12(sp) a50: 1838 addi a4,sp,56 a52: 8526 mv a0,s1 a54: a025 j a7c len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); a56: 00448793 addi a5,s1,4 a5a: c43e sw a5,8(sp) if(l) { a5c: ca85 beqz a3,a8c len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); a5e: f8b60613 addi a2,a2,-117 a62: 1018 addi a4,sp,32 a64: 00163693 seqz a3,a2 a68: 4088 lw a0,0(s1) a6a: 4601 li a2,0 a6c: 45a9 li a1,10 a6e: fe6ff0ef jal 254 len = mini_pad(bf2, len, pad_char, pad_to, bf); a72: 46c2 lw a3,16(sp) a74: 4632 lw a2,12(sp) a76: 1838 addi a4,sp,56 a78: 85aa mv a1,a0 len = mini_pad(bf2, len, pad_char, pad_to, bf); a7a: 1008 addi a0,sp,32 a7c: ea2ff0ef jal 11e len = puts(bf, len, buf); a80: 4612 lw a2,4(sp) len = mini_pad(bf2, len, pad_char, pad_to, bf); a82: 85aa mv a1,a0 len = puts(bf, len, buf); a84: 1828 addi a0,sp,56 a86: 4782 lw a5,0(sp) a88: 9782 jalr a5 break; a8a: b5ed j 974 if(ch == 'u') { a8c: 07500793 li a5,117 a90: 1018 addi a4,sp,32 a92: 4685 li a3,1 a94: fcf60ae3 beq a2,a5,a68 if (radix > 16) a98: 4681 li a3,0 a9a: b7f9 j a68 if(l) { a9c: 4088 lw a0,0(s1) len = mini_itoa(va_arg(va, unsigned long), 16, (ch=='X'), 1, bf2); a9e: fa860613 addi a2,a2,-88 len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); aa2: 00448793 addi a5,s1,4 aa6: 1018 addi a4,sp,32 aa8: 4685 li a3,1 aaa: 00163613 seqz a2,a2 aae: 45c1 li a1,16 ab0: c43e sw a5,8(sp) if (radix > 16) ab2: fa2ff0ef jal 254 len = mini_pad(bf2, len, pad_char, pad_to, bf); ab6: 46c2 lw a3,16(sp) ab8: 4632 lw a2,12(sp) aba: 85aa mv a1,a0 abc: 1838 addi a4,sp,56 abe: bf75 j a7a ch = (char)(va_arg(va, int)); ac0: 00448793 addi a5,s1,4 ac4: c43e sw a5,8(sp) ac6: 409c lw a5,0(s1) len = mini_pad(&ch, 1, pad_char, pad_to, bf); ac8: 46c2 lw a3,16(sp) aca: 4632 lw a2,12(sp) ch = (char)(va_arg(va, int)); acc: 00f10fa3 sb a5,31(sp) len = mini_pad(&ch, 1, pad_char, pad_to, bf); ad0: 1838 addi a4,sp,56 ad2: 4585 li a1,1 ad4: 01f10513 addi a0,sp,31 ad8: b755 j a7c len = puts(ptr, len, buf); ada: 4612 lw a2,4(sp) adc: 8526 mv a0,s1 ade: b765 j a86 00000ae0 : { ae0: 1111 addi sp,sp,-28 ae2: c632 sw a2,12(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); ae4: 862a mv a2,a0 ae6: 6505 lui a0,0x1 { ae8: c42e sw a1,8(sp) aea: c836 sw a3,16(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); aec: 4581 li a1,0 va_start( args, format ); aee: 0034 addi a3,sp,8 int ret_status = mini_vpprintf(__puts_uart, 0, format, args); af0: 82c50513 addi a0,a0,-2004 # 82c <__puts_uart> { af4: c206 sw ra,4(sp) af6: ca3a sw a4,20(sp) af8: cc3e sw a5,24(sp) va_start( args, format ); afa: c036 sw a3,0(sp) int ret_status = mini_vpprintf(__puts_uart, 0, format, args); afc: 350d jal 91e } afe: 4092 lw ra,4(sp) b00: 0171 addi sp,sp,28 b02: 8082 ret 00000b04 : * error handler */ uint8_t ssd1306_i2c_error(uint8_t err) { // report error printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); b04: 6789 lui a5,0x2 b06: 050a slli a0,a0,0x2 b08: b8c78793 addi a5,a5,-1140 # 1b8c b0c: 97aa add a5,a5,a0 b0e: 438c lw a1,0(a5) b10: 6505 lui a0,0x1 uint8_t ssd1306_i2c_error(uint8_t err) b12: 1171 addi sp,sp,-4 printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); b14: 68450513 addi a0,a0,1668 # 1684 uint8_t ssd1306_i2c_error(uint8_t err) b18: c006 sw ra,0(sp) printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]); b1a: 37d9 jal ae0 // reset & initialize I2C ssd1306_i2c_setup(); return 1; } b1c: 4082 lw ra,0(sp) b1e: 0111 addi sp,sp,4 ssd1306_i2c_setup(); b20: ff4ff06f j 314 00000b24 : } #else /* * low-level packet send for blocking polled operation via i2c */ uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) b24: 1171 addi sp,sp,-4 { int32_t timeout; // wait for not busy timeout = TIMEOUT_MAX; b26: 6761 lui a4,0x18 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); b28: 400057b7 lui a5,0x40005 uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) b2c: c006 sw ra,0(sp) timeout = TIMEOUT_MAX; b2e: 6a070713 addi a4,a4,1696 # 186a0 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); b32: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00> b36: 567d li a2,-1 b38: 0187d683 lhu a3,24(a5) b3c: 8a89 andi a3,a3,2 b3e: c6e1 beqz a3,c06 b40: 177d addi a4,a4,-1 b42: fec71be3 bne a4,a2,b38 if(timeout==-1) return ssd1306_i2c_error(0); b46: 4501 li a0,0 b48: a821 j b60 b4a: 67e1 lui a5,0x18 b4c: 6a178793 addi a5,a5,1697 # 186a1 // send data one byte at a time while(sz--) { // wait for TX Empty timeout = TIMEOUT_MAX; while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); b50: 01475683 lhu a3,20(a4) b54: 0806f693 andi a3,a3,128 b58: e699 bnez a3,b66 b5a: 17fd addi a5,a5,-1 b5c: fbf5 bnez a5,b50 if(timeout==-1) return ssd1306_i2c_error(3); b5e: 450d li a0,3 return ssd1306_i2c_error(1); b60: 3755 jal b04 return ssd1306_i2c_error(0); b62: 4505 li a0,1 b64: a889 j bb6 // send command I2C1->DATAR = *data++; b66: 00054783 lbu a5,0(a0) b6a: 0505 addi a0,a0,1 b6c: 00f71823 sh a5,16(a4) while(sz--) b70: fca59de3 bne a1,a0,b4a } // wait for tx complete timeout = TIMEOUT_MAX; b74: 66e1 lui a3,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b76: 40005737 lui a4,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); b7a: 00070637 lui a2,0x70 timeout = TIMEOUT_MAX; b7e: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b82: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); b86: 08460613 addi a2,a2,132 # 70084 b8a: 55fd li a1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b8c: 01475503 lhu a0,20(a4) b90: 01875783 lhu a5,24(a4) b94: 07c2 slli a5,a5,0x10 b96: 8fc9 or a5,a5,a0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); b98: 8ff1 and a5,a5,a2 b9a: 00c78763 beq a5,a2,ba8 b9e: 16fd addi a3,a3,-1 ba0: feb696e3 bne a3,a1,b8c if(timeout==-1) return ssd1306_i2c_error(4); ba4: 4511 li a0,4 ba6: bf6d j b60 // set STOP condition I2C1->CTLR1 |= I2C_CTLR1_STOP; ba8: 00075783 lhu a5,0(a4) // we're happy return 0; bac: 4501 li a0,0 I2C1->CTLR1 |= I2C_CTLR1_STOP; bae: 2007e793 ori a5,a5,512 bb2: 00f71023 sh a5,0(a4) } bb6: 4082 lw ra,0(sp) bb8: 0111 addi sp,sp,4 bba: 8082 ret while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); bbc: 40005737 lui a4,0x40005 bc0: 95aa add a1,a1,a0 bc2: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> bc6: b76d j b70 I2C1->DATAR = addr<<1; bc8: 07800793 li a5,120 bcc: 00f71823 sh a5,16(a4) timeout = TIMEOUT_MAX; bd0: 6661 lui a2,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); bd2: 400056b7 lui a3,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); bd6: 00070737 lui a4,0x70 timeout = TIMEOUT_MAX; bda: 6a060613 addi a2,a2,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); bde: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); be2: 08270713 addi a4,a4,130 # 70082 be6: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); be8: 0146d283 lhu t0,20(a3) bec: 0186d783 lhu a5,24(a3) bf0: 07c2 slli a5,a5,0x10 bf2: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); bf6: 8ff9 and a5,a5,a4 bf8: fce782e3 beq a5,a4,bbc bfc: 167d addi a2,a2,-1 bfe: fe6615e3 bne a2,t1,be8 return ssd1306_i2c_error(2); c02: 4509 li a0,2 c04: bfb1 j b60 I2C1->CTLR1 |= I2C_CTLR1_START; c06: 0007d703 lhu a4,0(a5) timeout = TIMEOUT_MAX; c0a: 66e1 lui a3,0x18 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); c0c: 00030637 lui a2,0x30 I2C1->CTLR1 |= I2C_CTLR1_START; c10: 10076713 ori a4,a4,256 c14: 00e79023 sh a4,0(a5) uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c18: 40005737 lui a4,0x40005 timeout = TIMEOUT_MAX; c1c: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c20: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); c24: 0605 addi a2,a2,1 # 30001 c26: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); c28: 01475283 lhu t0,20(a4) c2c: 01875783 lhu a5,24(a4) c30: 07c2 slli a5,a5,0x10 c32: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); c36: 8ff1 and a5,a5,a2 c38: f8c788e3 beq a5,a2,bc8 c3c: 16fd addi a3,a3,-1 c3e: fe6695e3 bne a3,t1,c28 return ssd1306_i2c_error(1); c42: 4505 li a0,1 c44: bf31 j b60 00000c46 : { c46: fd810113 addi sp,sp,-40 /* build command or data packets */ if(cmd) { pkt[0] = 0; pkt[1] = *data; c4a: 00a100a3 sb a0,1(sp) else { pkt[0] = 0x40; memcpy(&pkt[1], data, sz); } return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); c4e: 4589 li a1,2 c50: 850a mv a0,sp c52: d206 sw ra,36(sp) pkt[0] = 0; c54: 00010023 sb zero,0(sp) return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); c58: 35f1 jal b24 } c5a: 5092 lw ra,36(sp) c5c: 02810113 addi sp,sp,40 c60: 8082 ret 00000c62 : { c62: 1131 addi sp,sp,-20 c64: c806 sw ra,16(sp) c66: c622 sw s0,12(sp) b.buffer = buffer; c68: c02a sw a0,0(sp) b.pbuffer = buffer; c6a: c22a sw a0,4(sp) b.buffer_len = buffer_len; c6c: c42e sw a1,8(sp) if(buffer_len == 0) buffer = (void*) 0; c6e: c19d beqz a1,c94 int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); c70: 00a037b3 snez a5,a0 c74: 40f007b3 neg a5,a5 c78: 842a mv s0,a0 c7a: 00f175b3 and a1,sp,a5 c7e: 1a800513 li a0,424 c82: 3971 jal 91e if(buffer == (void*) 0) { c84: c401 beqz s0,c8c return b.pbuffer - b.buffer; c86: 4512 lw a0,4(sp) c88: 4782 lw a5,0(sp) c8a: 8d1d sub a0,a0,a5 } c8c: 40c2 lw ra,16(sp) c8e: 4432 lw s0,12(sp) c90: 0151 addi sp,sp,20 c92: 8082 ret c94: 4401 li s0,0 int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); c96: 4581 li a1,0 c98: b7dd j c7e 00000c9a : { c9a: 1131 addi sp,sp,-20 c9c: c436 sw a3,8(sp) va_start( args, format ); c9e: 0034 addi a3,sp,8 { ca0: c206 sw ra,4(sp) ca2: c63a sw a4,12(sp) ca4: c83e sw a5,16(sp) va_start( args, format ); ca6: c036 sw a3,0(sp) int ret = mini_vsnprintf( buffer, buffer_len, format, args ); ca8: 3f6d jal c62 } caa: 4092 lw ra,4(sp) cac: 0151 addi sp,sp,20 cae: 8082 ret 00000cb0 : WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; } cb0: 962a add a2,a2,a0 cb2: 87aa mv a5,a0 cb4: 00c79363 bne a5,a2,cba cb8: 8082 ret cba: 00b78023 sb a1,0(a5) cbe: 0785 addi a5,a5,1 cc0: bfd5 j cb4 00000cc2 : memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer)); cc2: 40000613 li a2,1024 cc6: 4581 li a1,0 cc8: c2818513 addi a0,gp,-984 # 20000024 ccc: b7d5 j cb0 00000cce : for (; n; n--) *d++ = *s++; cce: 4781 li a5,0 cd0: 00f61363 bne a2,a5,cd6 } cd4: 8082 ret for (; n; n--) *d++ = *s++; cd6: 00f58733 add a4,a1,a5 cda: 00074683 lbu a3,0(a4) cde: 00f50733 add a4,a0,a5 ce2: 0785 addi a5,a5,1 ce4: 00d70023 sb a3,0(a4) ce8: b7e5 j cd0 00000cea : { cea: 7179 addi sp,sp,-48 ssd1306_cmd(SSD1306_COLUMNADDR); cec: 02100513 li a0,33 { cf0: d606 sw ra,44(sp) cf2: d422 sw s0,40(sp) cf4: d226 sw s1,36(sp) ssd1306_cmd(SSD1306_COLUMNADDR); cf6: 3f81 jal c46 ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset) cf8: 4501 li a0,0 cfa: 37b1 jal c46 ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset) cfc: 07f00513 li a0,127 d00: 3799 jal c46 ssd1306_cmd(SSD1306_PAGEADDR); d02: 02200513 li a0,34 d06: 3781 jal c46 ssd1306_cmd(0); // Page start address (0 = reset) d08: 4501 li a0,0 d0a: 3f35 jal c46 ssd1306_cmd(7); // Page end address d0c: 451d li a0,7 d0e: c2818413 addi s0,gp,-984 # 20000024 d12: 3f15 jal c46 for(i=0;i return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); d2c: 02100593 li a1,33 d30: 850a mv a0,sp d32: 02040413 addi s0,s0,32 d36: 33fd jal b24 d38: fe9410e3 bne s0,s1,d18 } d3c: 50b2 lw ra,44(sp) d3e: 5422 lw s0,40(sp) d40: 5492 lw s1,36(sp) d42: 6145 addi sp,sp,48 d44: 8082 ret 00000d46 : //#define BASE_CTLR (((FUNCONF_HSITRIM) << 3) | HSEBYP | RCC_CSS) // disable HSI in HSE modes // Flash latency settings. #if defined(CH32V003) #if FUNCONF_SYSTEM_CORE_CLOCK > 25000000 FLASH->ACTLR = FLASH_ACTLR_LATENCY_1; // +1 Cycle Latency d46: 400227b7 lui a5,0x40022 d4a: 4705 li a4,1 d4c: c398 sw a4,0(a5) #elif defined(FUNCONF_USE_HSI) && FUNCONF_USE_HSI #if defined(CH32V30x) || defined(CH32V20x) || defined(CH32L103) || defined(CH32V10x) EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; #endif #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL RCC->CFGR0 = BASE_CFGR0; d4e: 400217b7 lui a5,0x40021 RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. d52: 01080737 lui a4,0x1080 RCC->CFGR0 = BASE_CFGR0; d56: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. d5a: 08170713 addi a4,a4,129 # 1080081 d5e: c398 sw a4,0(a5) FLASH->ACTLR = FLASH_ACTLR_LATENCY_0; #endif #endif #ifndef CH5xx RCC->INTR = 0x009F0000; // Clear PLL, CSSC, HSE, HSI and LSI ready flags. d60: 009f0737 lui a4,0x9f0 d64: c798 sw a4,8(a5) #endif #if defined(FUNCONF_USE_PLL) && FUNCONF_USE_PLL && !defined(CH5xx) while((RCC->CTLR & RCC_PLLRDY) == 0) {}; // Wait till PLL is ready d66: 4398 lw a4,0(a5) d68: 00671693 slli a3,a4,0x6 d6c: fe06dde3 bgez a3,d66 #if defined(CH32H41x) RCC->PLLCFGR |= RCC_SYSPLL_GATE; #endif uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW d70: 43d8 lw a4,4(a5) RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source d72: 400216b7 lui a3,0x40021 uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW d76: 9b71 andi a4,a4,-4 RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source d78: 00276713 ori a4,a4,2 d7c: c3d8 sw a4,4(a5) while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source d7e: 4721 li a4,8 d80: 42dc lw a5,4(a3) d82: 8bb1 andi a5,a5,12 d84: fee79ee3 bne a5,a4,d80 *DMDATA1 = 0x00; d88: e00007b7 lui a5,0xe0000 d8c: 0e07ac23 sw zero,248(a5) # e00000f8 <_eusrstack+0xbffff8f8> *DMDATA0 = 0x80; d90: 08000713 li a4,128 d94: 0ee7aa23 sw a4,244(a5) SetupDebugPrintf(); #endif #if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS CallConstructors(); #endif } d98: 8082 ret 00000d9a
: } } // ----------------------------------------------------------------- main int main(void) { d9a: 7139 addi sp,sp,-64 d9c: de06 sw ra,60(sp) d9e: dc22 sw s0,56(sp) da0: da26 sw s1,52(sp) SystemInit(); da2: 3755 jal d46 funGpioInitAll(); da4: 400214b7 lui s1,0x40021 da8: 4c9c lw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); daa: 40011437 lui s0,0x40011 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); dae: 76fd lui a3,0xfffff funGpioInitAll(); db0: 0357e793 ori a5,a5,53 db4: cc9c sw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); db6: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000> dba: 4398 lw a4,0(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); dbc: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff> funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); dc0: f1000637 lui a2,0xf1000 funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); dc4: f0f77713 andi a4,a4,-241 dc8: 01076713 ori a4,a4,16 dcc: c398 sw a4,0(a5) funDigitalWrite(LED_PIN, FUN_LOW); dce: 00020737 lui a4,0x20 dd2: cb98 sw a4,16(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); dd4: 40040793 addi a5,s0,1024 dd8: 4398 lw a4,0(a5) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); dda: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff> gpio_setup(); Delay_Ms(120); // let the OLED rail settle ddc: 000b0537 lui a0,0xb0 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); de0: 8f75 and a4,a4,a3 de2: 10076713 ori a4,a4,256 de6: c398 sw a4,0(a5) funDigitalWrite(BUZZER, FUN_LOW); de8: 00040737 lui a4,0x40 dec: cb98 sw a4,16(a5) funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); dee: 4018 lw a4,0(s0) Delay_Ms(120); // let the OLED rail settle df0: c8050513 addi a0,a0,-896 # afc80 funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); df4: 9b41 andi a4,a4,-16 df6: 00876713 ori a4,a4,8 dfa: c018 sw a4,0(s0) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); dfc: 4398 lw a4,0(a5) dfe: 8f71 and a4,a4,a2 e00: 08000637 lui a2,0x8000 e04: 8f51 or a4,a4,a2 e06: c398 sw a4,0(a5) funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD); e08: 4398 lw a4,0(a5) e0a: ff100637 lui a2,0xff100 e0e: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff> e10: 8f71 and a4,a4,a2 e12: 00800637 lui a2,0x800 e16: 8f51 or a4,a4,a2 e18: c398 sw a4,0(a5) funDigitalWrite(BTN_OK, FUN_HIGH); e1a: 4705 li a4,1 e1c: c818 sw a4,16(s0) funDigitalWrite(BTN_LEFT, FUN_HIGH); e1e: 04000713 li a4,64 e22: cb98 sw a4,16(a5) funDigitalWrite(BTN_RIGHT, FUN_HIGH); e24: 02000713 li a4,32 e28: cb98 sw a4,16(a5) Delay_Ms(120); // let the OLED rail settle e2a: c18ff0ef jal 242 * init I2C and GPIO */ uint8_t ssd1306_i2c_init(void) { // Enable GPIOC and I2C RCC->APB1PCENR |= RCC_APB1Periph_I2C1; e2e: 4cdc lw a5,28(s1) e30: 00200737 lui a4,0x200 e34: 8fd9 or a5,a5,a4 e36: ccdc sw a5,28(s1) funPinMode( PB6, GPIO_CFGLR_OUT_10Mhz_AF_OD ); funPinMode( PB7, GPIO_CFGLR_OUT_10Mhz_AF_OD ); #endif #else RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; e38: 4c9c lw a5,24(s1) // PC1 is SDA, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*1)); GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); // PC2 is SCL, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*2)); e3a: 777d lui a4,0xfffff e3c: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; e40: 0117e793 ori a5,a5,17 e44: cc9c sw a5,24(s1) GPIOC->CFGLR &= ~(0xf<<(4*1)); e46: 401c lw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); e48: 6705 lui a4,0x1 e4a: d0070713 addi a4,a4,-768 # d00 GPIOC->CFGLR &= ~(0xf<<(4*1)); e4e: f0f7f793 andi a5,a5,-241 e52: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); e54: 401c lw a5,0(s0) e56: 0d07e793 ori a5,a5,208 e5a: c01c sw a5,0(s0) GPIOC->CFGLR &= ~(0xf<<(4*2)); e5c: 401c lw a5,0(s0) e5e: 8ff5 and a5,a5,a3 e60: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); e62: 401c lw a5,0(s0) e64: 8fd9 or a5,a5,a4 e66: c01c sw a5,0(s0) ssd1306_setbuf(0); // initialize OLED #if !defined(SSD1306_CUSTOM_INIT_ARRAY) || !SSD1306_CUSTOM_INIT_ARRAY uint8_t *cmd_list = (uint8_t *)ssd1306_init_array; e68: 6409 lui s0,0x2 GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4); GPIOC->BSHR = (1<<(16+4)); #endif // load I2C regs ssd1306_i2c_setup(); e6a: caaff0ef jal 314 e6e: 3a040413 addi s0,s0,928 # 23a0 ssd1306_setbuf(0); e72: 3d81 jal cc2 while(*cmd_list != SSD1306_TERMINATE_CMDS) e74: 00044503 lbu a0,0(s0) e78: 0ff00793 li a5,255 e7c: 00f51463 bne a0,a5,e84 { if(ssd1306_cmd(*cmd_list++)) return 1; } ssd1306_refresh(); e80: 35ad jal cea #endif return 0; e82: a021 j e8a if(ssd1306_cmd(*cmd_list++)) e84: 0405 addi s0,s0,1 e86: 33c1 jal c46 e88: d575 beqz a0,e74 // no display: fall back to a heartbeat blink so the board still shows life while (1) { led_blink(); Delay_Ms(700); } } ssd1306_init(); pet_reset(); e8a: dacff0ef jal 436 ssd1306_setbuf(0); e8e: 3d15 jal cc2 draw_center_str(4, "PANAGOTCHI"); e90: 6585 lui a1,0x1 e92: 6b858593 addi a1,a1,1720 # 16b8 e96: 4511 li a0,4 e98: e78ff0ef jal 510 ssd1306_drawImage(48, 16, pana_idle, PANA_W, PANA_H, 0); e9c: 02000713 li a4,32 ea0: 6609 lui a2,0x2 ea2: 86ba mv a3,a4 ea4: 3bc60613 addi a2,a2,956 # 23bc ea8: 45c1 li a1,16 eaa: 03000513 li a0,48 eae: fd0ff0ef jal 67e draw_center_str(52, "press any key"); eb2: 6585 lui a1,0x1 eb4: 6c458593 addi a1,a1,1732 # 16c4 eb8: 03400513 li a0,52 ebc: e54ff0ef jal 510 ssd1306_refresh(); ec0: 352d jal cea beep(659, 80); beep(784, 80); beep(988, 120); ec2: 05000593 li a1,80 ec6: 29300513 li a0,659 eca: cdaff0ef jal 3a4 ece: 05000593 li a1,80 ed2: 31000513 li a0,784 ed6: cceff0ef jal 3a4 eda: 07800593 li a1,120 ede: 3dc00513 li a0,988 ee2: cc2ff0ef jal 3a4 ee6: 0c800413 li s0,200 Buttons b = read_buttons(); eea: d7cff0ef jal 466 eee: 00855713 srli a4,a0,0x8 ef2: 01055793 srli a5,a0,0x10 ef6: 02e100a3 sb a4,33(sp) if (b.ok || b.left || b.right) break; efa: 8f49 or a4,a4,a0 Buttons b = read_buttons(); efc: 02f10123 sb a5,34(sp) if (b.ok || b.left || b.right) break; f00: 8fd9 or a5,a5,a4 Buttons b = read_buttons(); f02: 02a10023 sb a0,32(sp) if (b.ok || b.left || b.right) break; f06: 0ff7f793 zext.b a5,a5 f0a: eb81 bnez a5,f1a Delay_Ms(20); f0c: 6575 lui a0,0x1d f0e: 4c050513 addi a0,a0,1216 # 1d4c0 for (int i = 0; i < 200; i++) { f12: 147d addi s0,s0,-1 Delay_Ms(20); f14: b2eff0ef jal 242 for (int i = 0; i < 200; i++) { f18: f869 bnez s0,eea beep(659, 80); beep(784, 80); beep(988, 120); f1a: 4701 li a4,0 f1c: 4481 li s1,0 f1e: 4401 li s0,0 f20: c03a sw a4,0(sp) splash(); Buttons prev = {0, 0, 0}; while (1) { Buttons b = read_buttons(); f22: d44ff0ef jal 466 f26: 01055793 srli a5,a0,0x10 f2a: 0ff57713 zext.b a4,a0 f2e: c23a sw a4,4(sp) f30: 00f10f23 sb a5,30(sp) f34: 0ff7f793 zext.b a5,a5 f38: 00855693 srli a3,a0,0x8 f3c: c63e sw a5,12(sp) uint8_t ok_edge = b.ok && !prev.ok; f3e: 4792 lw a5,4(sp) Buttons b = read_buttons(); f40: 0ff6f713 zext.b a4,a3 f44: 00d10ea3 sb a3,29(sp) f48: c43a sw a4,8(sp) f4a: 00a10e23 sb a0,28(sp) uint8_t ok_edge = b.ok && !prev.ok; f4e: 4702 lw a4,0(sp) f50: 4681 li a3,0 f52: c399 beqz a5,f58 f54: 00143693 seqz a3,s0 uint8_t left_edge = b.left && !prev.left; f58: 4622 lw a2,8(sp) f5a: 4781 li a5,0 f5c: c219 beqz a2,f62 f5e: 0014b793 seqz a5,s1 uint8_t right_edge = b.right && !prev.right; f62: 45b2 lw a1,12(sp) f64: 4601 li a2,0 f66: c199 beqz a1,f6c f68: 00173613 seqz a2,a4 prev = b; switch (screen) { f6c: c181c583 lbu a1,-1000(gp) # 20000014 f70: c1c18493 addi s1,gp,-996 # 20000018 f74: c02e sw a1,0(sp) f76: 4502 lw a0,0(sp) f78: 4585 li a1,1 f7a: 40b50163 beq a0,a1,137c f7e: 4589 li a1,2 f80: 4ab50463 beq a0,a1,1428 f84: 1c051d63 bnez a0,115e case SCR_MAIN: if (left_edge) { f88: c395 beqz a5,fac cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; f8a: c171c503 lbu a0,-1001(gp) # 20000013 f8e: 4599 li a1,6 f90: ca32 sw a2,20(sp) f92: 0515 addi a0,a0,5 f94: c836 sw a3,16(sp) f96: 962ff0ef jal f8 <__modsi3> f9a: c0a18ba3 sb a0,-1001(gp) # 20000013 beep(1047, 25); f9e: 45e5 li a1,25 fa0: 41700513 li a0,1047 fa4: c00ff0ef jal 3a4 fa8: 4652 lw a2,20(sp) faa: 46c2 lw a3,16(sp) } if (right_edge) { fac: c205 beqz a2,fcc cursor = (cursor + 1) % ICON_COUNT; fae: c171c503 lbu a0,-1001(gp) # 20000013 fb2: 4599 li a1,6 fb4: c836 sw a3,16(sp) fb6: 0505 addi a0,a0,1 fb8: 940ff0ef jal f8 <__modsi3> fbc: c0a18ba3 sb a0,-1001(gp) # 20000013 beep(1047, 25); fc0: 45e5 li a1,25 fc2: 41700513 li a0,1047 fc6: bdeff0ef jal 3a4 fca: 46c2 lw a3,16(sp) } if (ok_edge) do_action(cursor); fcc: c6ad beqz a3,1036 switch (act) { fce: c171c783 lbu a5,-1001(gp) # 20000013 fd2: 4695 li a3,5 fd4: 06f6e163 bltu a3,a5,1036 fd8: 6685 lui a3,0x1 fda: 078a slli a5,a5,0x2 fdc: 7b468693 addi a3,a3,1972 # 17b4 fe0: 97b6 add a5,a5,a3 fe2: 439c lw a5,0(a5) fe4: 8782 jr a5 pet.satiety = clamp100(pet.satiety + 30); fe6: 00048783 lb a5,0(s1) # 40021000 <_eusrstack+0x20020800> static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } fea: 06400713 li a4,100 pet.satiety = clamp100(pet.satiety + 30); fee: 07f9 addi a5,a5,30 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } ff0: 1af75a63 bge a4,a5,11a4 ff4: 87ba mv a5,a4 ff6: 00f48023 sb a5,0(s1) pet.hygiene = clamp100(pet.hygiene - 5); ffa: 00348783 lb a5,3(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } ffe: 06400713 li a4,100 pet.hygiene = clamp100(pet.hygiene - 5); 1002: 17ed addi a5,a5,-5 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1004: 1af75563 bge a4,a5,11ae 1008: 87ba mv a5,a4 100a: 00f481a3 sb a5,3(s1) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 100e: 4711 li a4,4 1010: c0e18623 sb a4,-1012(gp) # 20000008 beep(880, 60); beep(1175, 80); 1014: 03c00593 li a1,60 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1018: 4731 li a4,12 beep(880, 60); beep(1175, 80); 101a: 37000513 li a0,880 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 101e: c0e18b23 sb a4,-1002(gp) # 20000012 beep(880, 60); beep(1175, 80); 1022: b82ff0ef jal 3a4 1026: 05000593 li a1,80 102a: 49700513 li a0,1175 beep(988, 60); beep(1319, 60); beep(1568, 90); 102e: b76ff0ef jal 3a4 led_blink(); 1032: bdaff0ef jal 40c ssd1306_setbuf(0); 1036: 3171 jal cc2 draw_center_str(0, menu_labels[cursor]); 1038: c171c783 lbu a5,-1001(gp) # 20000013 103c: 4501 li a0,0 103e: c83e sw a5,16(sp) 1040: 4742 lw a4,16(sp) 1042: 6789 lui a5,0x2 1044: 47078793 addi a5,a5,1136 # 2470 1048: 070a slli a4,a4,0x2 104a: 97ba add a5,a5,a4 104c: 438c lw a1,0(a5) 104e: cc2ff0ef jal 510 if (pet.alive && pet.health < 30 && (frame & 8)) 1052: 00a4c783 lbu a5,10(s1) 1056: ca3e sw a5,20(sp) 1058: c38d beqz a5,107a 105a: 00448703 lb a4,4(s1) 105e: 47f5 li a5,29 1060: 00e7cd63 blt a5,a4,107a 1064: c101a783 lw a5,-1008(gp) # 2000000c 1068: 8ba1 andi a5,a5,8 106a: cb81 beqz a5,107a ssd1306_drawstr(0, 0, "!", 1); 106c: 6605 lui a2,0x1 106e: 6d460613 addi a2,a2,1748 # 16d4 1072: 4581 li a1,0 1074: 4501 li a0,0 1076: c22ff0ef jal 498 beep(pet.sleeping ? 440 : 660, 120); 107a: 4401 li s0,0 107c: 8522 mv a0,s0 ssd1306_drawPixel(x++, y, color); 107e: 4605 li a2,1 1080: 45a9 li a1,10 1082: ae6ff0ef jal 368 1086: 0405 addi s0,s0,1 while (w--) 1088: 08000793 li a5,128 108c: fef418e3 bne s0,a5,107c if (pet.sleeping) { 1090: 0094c403 lbu s0,9(s1) 1094: 24040763 beqz s0,12e2 ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1); 1098: 6605 lui a2,0x1 109a: 6d860613 addi a2,a2,1752 # 16d8 109e: 45b9 li a1,14 10a0: 04e00513 li a0,78 10a4: bf4ff0ef jal 498 ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1); 10a8: 6605 lui a2,0x1 10aa: 6dc60613 addi a2,a2,1756 # 16dc 10ae: 45b1 li a1,12 10b0: 05400513 li a0,84 10b4: be4ff0ef jal 498 10b8: 03000313 li t1,48 px = 48; py = 16; 10bc: 42c1 li t0,16 if (!pet.alive) return EXP_DEAD; 10be: 4752 lw a4,20(sp) 10c0: 4799 li a5,6 10c2: c719 beqz a4,10d0 if (anim_timer) return anim_exp; 10c4: c161c783 lbu a5,-1002(gp) # 20000012 10c8: 24078663 beqz a5,1314 10cc: c0c1c783 lbu a5,-1012(gp) # 20000008 ssd1306_drawImage(px, py, pana_frames[current_expression()], 10d0: 6709 lui a4,0x2 10d2: 45470713 addi a4,a4,1108 # 2454 10d6: 078a slli a5,a5,0x2 10d8: 97ba add a5,a5,a4 10da: 4390 lw a2,0(a5) 10dc: 02000713 li a4,32 10e0: 86ba mv a3,a4 10e2: 8596 mv a1,t0 10e4: 851a mv a0,t1 10e6: d98ff0ef jal 67e 10ea: 4401 li s0,0 10ec: 8522 mv a0,s0 ssd1306_drawPixel(x++, y, color); 10ee: 4605 li a2,1 10f0: 02e00593 li a1,46 10f4: a74ff0ef jal 368 10f8: 0405 addi s0,s0,1 while (w--) 10fa: 08000793 li a5,128 10fe: fef417e3 bne s0,a5,10ec for (uint8_t i = 0; i < pet.poop; i++) 1102: 0084c783 lbu a5,8(s1) 1106: 4702 lw a4,0(sp) 1108: 24f76663 bltu a4,a5,1354 110c: 4401 li s0,0 ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); 110e: 00241793 slli a5,s0,0x2 1112: 00878733 add a4,a5,s0 1116: 070a slli a4,a4,0x2 1118: 00870333 add t1,a4,s0 111c: 6709 lui a4,0x2 111e: 43c70713 addi a4,a4,1084 # 243c 1122: 97ba add a5,a5,a4 1124: 4390 lw a2,0(a5) 1126: 4741 li a4,16 1128: 86ba mv a3,a4 112a: 00330513 addi a0,t1,3 112e: 03000593 li a1,48 1132: c01a sw t1,0(sp) 1134: d4aff0ef jal 67e if (i == cursor) 1138: 4742 lw a4,16(sp) 113a: 0ff47793 zext.b a5,s0 113e: 4302 lw t1,0(sp) 1140: 00f71a63 bne a4,a5,1154 ssd1306_drawRect(x - 2, 46, ICON_W + 3, ICON_H + 2, 1); 1144: 46c9 li a3,18 1146: 464d li a2,19 1148: 02e00593 li a1,46 114c: 00130513 addi a0,t1,1 1150: c74ff0ef jal 5c4 for (uint8_t i = 0; i < ICON_COUNT; i++) { 1154: 0405 addi s0,s0,1 1156: 4799 li a5,6 1158: faf41be3 bne s0,a5,110e ssd1306_refresh(); 115c: 3679 jal cea } draw_dead(); break; } if (anim_timer) anim_timer--; 115e: c161c783 lbu a5,-1002(gp) # 20000012 1162: c781 beqz a5,116a 1164: 17fd addi a5,a5,-1 1166: c0f18b23 sb a5,-1002(gp) # 20000012 // advance game time independent of which screen is showing if (pet.alive && ++tick_acc >= TICK_FRAMES) { 116a: 00a4c783 lbu a5,10(s1) 116e: cf81 beqz a5,1186 1170: c141d783 lhu a5,-1004(gp) # 20000010 1174: 03100693 li a3,49 1178: 0785 addi a5,a5,1 117a: 07c2 slli a5,a5,0x10 117c: 83c1 srli a5,a5,0x10 117e: 30f6e763 bltu a3,a5,148c 1182: c0f19a23 sh a5,-1004(gp) # 20000010 tick_acc = 0; game_tick(); } frame++; 1186: c101a783 lw a5,-1008(gp) # 2000000c Delay_Ms(FRAME_MS); 118a: 00058537 lui a0,0x58 118e: e4050513 addi a0,a0,-448 # 57e40 frame++; 1192: 0785 addi a5,a5,1 1194: c0f1a823 sw a5,-1008(gp) # 2000000c Delay_Ms(FRAME_MS); 1198: 8aaff0ef jal 242 prev = b; 119c: 4732 lw a4,12(sp) 119e: 44a2 lw s1,8(sp) 11a0: 4412 lw s0,4(sp) while (1) { 11a2: bbbd j f20 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 11a4: fff7c713 not a4,a5 11a8: 877d srai a4,a4,0x1f 11aa: 8ff9 and a5,a5,a4 11ac: b5a9 j ff6 11ae: fff7c713 not a4,a5 11b2: 877d srai a4,a4,0x1f 11b4: 8ff9 and a5,a5,a4 11b6: bd91 j 100a if (pet.energy < 15) { beep(220, 120); break; } // too tired 11b8: 00248703 lb a4,2(s1) 11bc: 47b9 li a5,14 11be: 00e7c963 blt a5,a4,11d0 11c2: 07800593 li a1,120 11c6: 0dc00513 li a0,220 beep(659, 40); 11ca: 9daff0ef jal 3a4 break; 11ce: b5a5 j 1036 pet.happy = clamp100(pet.happy + 25); 11d0: 00148783 lb a5,1(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 11d4: 06400693 li a3,100 pet.happy = clamp100(pet.happy + 25); 11d8: 07e5 addi a5,a5,25 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 11da: 04f6d563 bge a3,a5,1224 11de: 87b6 mv a5,a3 11e0: 00f480a3 sb a5,1(s1) pet.energy = clamp100(pet.energy - 12); 11e4: ff470793 addi a5,a4,-12 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 11e8: 06400713 li a4,100 11ec: 00f75363 bge a4,a5,11f2 11f0: 87ba mv a5,a4 11f2: 00f48123 sb a5,2(s1) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 11f6: 4709 li a4,2 11f8: c0e18623 sb a4,-1012(gp) # 20000008 beep(988, 60); beep(1319, 60); beep(1568, 90); 11fc: 03c00593 li a1,60 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1200: 4731 li a4,12 beep(988, 60); beep(1319, 60); beep(1568, 90); 1202: 3dc00513 li a0,988 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1206: c0e18b23 sb a4,-1002(gp) # 20000012 beep(988, 60); beep(1319, 60); beep(1568, 90); 120a: 99aff0ef jal 3a4 120e: 03c00593 li a1,60 1212: 52700513 li a0,1319 1216: 98eff0ef jal 3a4 121a: 05a00593 li a1,90 121e: 62000513 li a0,1568 1222: b531 j 102e static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1224: fff7c693 not a3,a5 1228: 86fd srai a3,a3,0x1f 122a: 8ff5 and a5,a5,a3 122c: bf55 j 11e0 pet.sleeping = !pet.sleeping; 122e: 0094c503 lbu a0,9(s1) beep(pet.sleeping ? 440 : 660, 120); 1232: 07800593 li a1,120 pet.sleeping = !pet.sleeping; 1236: 00153793 seqz a5,a0 beep(pet.sleeping ? 440 : 660, 120); 123a: 00a03533 snez a0,a0 123e: 40a00533 neg a0,a0 1242: 0dc57513 andi a0,a0,220 pet.sleeping = !pet.sleeping; 1246: 00f484a3 sb a5,9(s1) beep(pet.sleeping ? 440 : 660, 120); 124a: 1b850513 addi a0,a0,440 124e: bfb5 j 11ca pet.happy = clamp100(pet.happy + 5); 1250: c1c18693 addi a3,gp,-996 # 20000018 1254: 00148783 lb a5,1(s1) pet.hygiene = 100; 1258: 06400713 li a4,100 pet.poop = 0; 125c: 00048423 sb zero,8(s1) pet.hygiene = 100; 1260: 00e481a3 sb a4,3(s1) pet.happy = clamp100(pet.happy + 5); 1264: 0795 addi a5,a5,5 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1266: 02f75063 bge a4,a5,1286 126a: 87ba mv a5,a4 beep(1319, 50); beep(1047, 50); 126c: 03200593 li a1,50 1270: 52700513 li a0,1319 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1274: 00f680a3 sb a5,1(a3) beep(1319, 50); beep(1047, 50); 1278: 92cff0ef jal 3a4 127c: 03200593 li a1,50 1280: 41700513 li a0,1047 1284: b799 j 11ca static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1286: fff7c713 not a4,a5 128a: 877d srai a4,a4,0x1f 128c: 8ff9 and a5,a5,a4 128e: bff9 j 126c pet.health = clamp100(pet.health + 35); 1290: 00448783 lb a5,4(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1294: 06400713 li a4,100 pet.health = clamp100(pet.health + 35); 1298: 02378793 addi a5,a5,35 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 129c: 02f75663 bge a4,a5,12c8 12a0: 87ba mv a5,a4 beep(784, 60); beep(1047, 60); beep(1319, 90); 12a2: 03c00593 li a1,60 12a6: 31000513 li a0,784 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12aa: 00f48223 sb a5,4(s1) beep(784, 60); beep(1047, 60); beep(1319, 90); 12ae: 8f6ff0ef jal 3a4 12b2: 03c00593 li a1,60 12b6: 41700513 li a0,1047 12ba: 8eaff0ef jal 3a4 12be: 05a00593 li a1,90 12c2: 52700513 li a0,1319 12c6: b3a5 j 102e static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12c8: fff7c713 not a4,a5 12cc: 877d srai a4,a4,0x1f 12ce: 8ff9 and a5,a5,a4 12d0: bfc9 j 12a2 screen = SCR_STATS; 12d2: 4785 li a5,1 12d4: c0f18c23 sb a5,-1000(gp) # 20000014 beep(659, 40); 12d8: 02800593 li a1,40 12dc: 29300513 li a0,659 12e0: b5ed j 11ca uint32_t t = frame % 80; 12e2: c101a283 lw t0,-1008(gp) # 2000000c 12e6: 05000593 li a1,80 12ea: 8516 mv a0,t0 12ec: cc16 sw t0,24(sp) 12ee: de7fe0ef jal d4 <__umodsi3> px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 12f2: 02700793 li a5,39 12f6: 42e2 lw t0,24(sp) 12f8: 01e50313 addi t1,a0,30 12fc: 00a7f663 bgeu a5,a0,1308 1300: 06e00793 li a5,110 1304: 40a78333 sub t1,a5,a0 py = 14 + ((frame % 16) < 8 ? 0 : 1); 1308: 0082f293 andi t0,t0,8 130c: 005032b3 snez t0,t0 1310: 02b9 addi t0,t0,14 1312: b375 j 10be if (pet.sleeping) return EXP_SLEEP; 1314: 4795 li a5,5 1316: da041de3 bnez s0,10d0 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 131a: 00448683 lb a3,4(s1) 131e: 4775 li a4,29 return EXP_SAD; 1320: 478d li a5,3 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 1322: dad757e3 bge a4,a3,10d0 1326: 00148683 lb a3,1(s1) 132a: 4761 li a4,24 132c: dad752e3 bge a4,a3,10d0 1330: 00048683 lb a3,0(s1) 1334: 474d li a4,19 1336: d8d75de3 bge a4,a3,10d0 if ((frame % 50) < 4) return EXP_BLINK; 133a: c101a503 lw a0,-1008(gp) # 2000000c 133e: 03200593 li a1,50 1342: cc16 sw t0,24(sp) 1344: ca1a sw t1,20(sp) 1346: d8ffe0ef jal d4 <__umodsi3> 134a: 42e2 lw t0,24(sp) 134c: 4352 lw t1,20(sp) 134e: 00453793 sltiu a5,a0,4 1352: bbbd j 10d0 ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 1354: 4782 lw a5,0(sp) 1356: 4721 li a4,8 1358: 00179513 slli a0,a5,0x1 135c: 953e add a0,a0,a5 135e: 050a slli a0,a0,0x2 1360: 86ba mv a3,a4 1362: c0418613 addi a2,gp,-1020 # 20000000 1366: 02600593 li a1,38 136a: 953a add a0,a0,a4 136c: b12ff0ef jal 67e for (uint8_t i = 0; i < pet.poop; i++) 1370: 4782 lw a5,0(sp) 1372: 0785 addi a5,a5,1 1374: 0ff7f793 zext.b a5,a5 1378: c03e sw a5,0(sp) 137a: b361 j 1102 if (ok_edge || left_edge || right_edge) { 137c: 8fd5 or a5,a5,a3 137e: 8fd1 or a5,a5,a2 1380: cb81 beqz a5,1390 beep(880, 30); 1382: 45f9 li a1,30 1384: 37000513 li a0,880 screen = SCR_MAIN; 1388: c0018c23 sb zero,-1000(gp) # 20000014 beep(880, 30); 138c: 818ff0ef jal 3a4 ssd1306_setbuf(0); 1390: 933ff0ef jal cc2 draw_center_str(0, "-- STATUS --"); 1394: 6585 lui a1,0x1 1396: 6e058593 addi a1,a1,1760 # 16e0 139a: 4501 li a0,0 139c: 974ff0ef jal 510 draw_bar(10, "FOOD", pet.satiety); 13a0: 00048603 lb a2,0(s1) 13a4: 6585 lui a1,0x1 13a6: 6f058593 addi a1,a1,1776 # 16f0 13aa: 4529 li a0,10 13ac: a58ff0ef jal 604 draw_bar(19, "FUN ", pet.happy); 13b0: 00148603 lb a2,1(s1) 13b4: 6585 lui a1,0x1 13b6: 6f858593 addi a1,a1,1784 # 16f8 13ba: 454d li a0,19 13bc: a48ff0ef jal 604 draw_bar(28, "ENGY", pet.energy); 13c0: 00248603 lb a2,2(s1) 13c4: 6585 lui a1,0x1 13c6: 70058593 addi a1,a1,1792 # 1700 13ca: 4571 li a0,28 13cc: a38ff0ef jal 604 draw_bar(37, "WASH", pet.hygiene); 13d0: 00348603 lb a2,3(s1) 13d4: 6585 lui a1,0x1 13d6: 70858593 addi a1,a1,1800 # 1708 13da: 02500513 li a0,37 13de: a26ff0ef jal 604 draw_bar(46, "HLTH", pet.health); 13e2: 00448603 lb a2,4(s1) 13e6: 6585 lui a1,0x1 13e8: 71058593 addi a1,a1,1808 # 1710 13ec: 02e00513 li a0,46 13f0: a14ff0ef jal 604 snprintf(line, sizeof(line), "Age %u %s", pet.age_min, 13f4: 0094c783 lbu a5,9(s1) 13f8: 0064d683 lhu a3,6(s1) 13fc: c395 beqz a5,1420 13fe: 6705 lui a4,0x1 1400: 6b470713 addi a4,a4,1716 # 16b4 1404: 6605 lui a2,0x1 1406: 71860613 addi a2,a2,1816 # 1718 140a: 45c5 li a1,17 140c: 1008 addi a0,sp,32 140e: 88dff0ef jal c9a ssd1306_drawstr(0, 56, line, 1); 1412: 1010 addi a2,sp,32 1414: 03800593 li a1,56 1418: 4501 li a0,0 141a: 87eff0ef jal 498 ssd1306_refresh(); 141e: bb3d j 115c snprintf(line, sizeof(line), "Age %u %s", pet.age_min, 1420: 6705 lui a4,0x1 1422: 6b070713 addi a4,a4,1712 # 16b0 1426: bff9 j 1404 if (ok_edge) { // start a new pet 1428: ce99 beqz a3,1446 pet_reset(); 142a: 80cff0ef jal 436 beep(659, 80); beep(988, 120); 142e: 05000593 li a1,80 1432: 29300513 li a0,659 1436: f6ffe0ef jal 3a4 143a: 07800593 li a1,120 143e: 3dc00513 li a0,988 1442: f63fe0ef jal 3a4 ssd1306_setbuf(0); 1446: 87dff0ef jal cc2 ssd1306_drawImage(48, 8, spr_grave, 32, 32, 0); 144a: 02000713 li a4,32 144e: 6609 lui a2,0x2 1450: 86ba mv a3,a4 1452: 48860613 addi a2,a2,1160 # 2488 1456: 45a1 li a1,8 1458: 03000513 li a0,48 145c: a22ff0ef jal 67e draw_center_str(44, "R.I.P."); 1460: 6585 lui a1,0x1 1462: 72458593 addi a1,a1,1828 # 1724 1466: 02c00513 li a0,44 146a: 8a6ff0ef jal 510 snprintf(line, sizeof(line), "lived %u min", pet.age_min); 146e: 0064d683 lhu a3,6(s1) 1472: 6605 lui a2,0x1 1474: 72c60613 addi a2,a2,1836 # 172c 1478: 45c5 li a1,17 147a: 1008 addi a0,sp,32 147c: 81fff0ef jal c9a draw_center_str(52, line); 1480: 100c addi a1,sp,32 1482: 03400513 li a0,52 1486: 88aff0ef jal 510 148a: b9c9 j 115c pet.age_min++; 148c: 0064d303 lhu t1,6(s1) if (pet.sleeping) { 1490: 0094c503 lbu a0,9(s1) tick_acc = 0; 1494: c0019a23 sh zero,-1004(gp) # 20000010 pet.age_min++; 1498: 0305 addi t1,t1,1 149a: 0342 slli t1,t1,0x10 149c: 01035313 srli t1,t1,0x10 14a0: 00649323 sh t1,6(s1) pet.satiety = clamp100(pet.satiety - 1); 14a4: 00048703 lb a4,0(s1) pet.energy = clamp100(pet.energy + 10); 14a8: 00248783 lb a5,2(s1) 14ac: 06400593 li a1,100 if (pet.sleeping) { 14b0: 14050163 beqz a0,15f2 pet.energy = clamp100(pet.energy + 10); 14b4: 00a78693 addi a3,a5,10 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 14b8: 12d5d363 bge a1,a3,15de 14bc: 86ae mv a3,a1 14be: 06e2 slli a3,a3,0x18 14c0: 86e1 srai a3,a3,0x18 pet.energy = clamp100(pet.energy + 10); 14c2: 00d48123 sb a3,2(s1) pet.satiety = clamp100(pet.satiety - 1); 14c6: 177d addi a4,a4,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 14c8: 06400613 li a2,100 14cc: 10e65e63 bge a2,a4,15e8 14d0: 8732 mv a4,a2 14d2: 0762 slli a4,a4,0x18 14d4: 8761 srai a4,a4,0x18 pet.satiety = clamp100(pet.satiety - 1); 14d6: 00e48023 sb a4,0(s1) if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested 14da: 05900613 li a2,89 14de: 00f65763 bge a2,a5,14ec 14e2: 000484a3 sb zero,9(s1) 14e6: 06400693 li a3,100 14ea: 4501 li a0,0 pet.hygiene = clamp100(pet.hygiene - 1); 14ec: 00348583 lb a1,3(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 14f0: 06400793 li a5,100 pet.hygiene = clamp100(pet.hygiene - 1); 14f4: fff58613 addi a2,a1,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 14f8: 14c7dc63 bge a5,a2,1650 14fc: 863e mv a2,a5 14fe: 0662 slli a2,a2,0x18 1500: 8661 srai a2,a2,0x18 pet.hygiene = clamp100(pet.hygiene - 1); 1502: 00c481a3 sb a2,3(s1) if (!pet.sleeping && pet.poop < 3 && 1506: e115 bnez a0,152a 1508: 0084c503 lbu a0,8(s1) 150c: 4789 li a5,2 150e: 00a7ee63 bltu a5,a0,152a ((pet.age_min * 7u + frame) & 0x0F) == 0) 1512: 00331793 slli a5,t1,0x3 1516: 406787b3 sub a5,a5,t1 151a: c101a303 lw t1,-1008(gp) # 2000000c 151e: 979a add a5,a5,t1 1520: 8bbd andi a5,a5,15 if (!pet.sleeping && pet.poop < 3 && 1522: e781 bnez a5,152a pet.poop++; 1524: 0505 addi a0,a0,1 1526: 00a48423 sb a0,8(s1) if (pet.poop) pet.happy = clamp100(pet.happy - pet.poop); 152a: 0084c503 lbu a0,8(s1) 152e: c919 beqz a0,1544 1530: 00148783 lb a5,1(s1) 1534: 8f89 sub a5,a5,a0 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1536: 06400513 li a0,100 153a: 12f55063 bge a0,a5,165a 153e: 87aa mv a5,a0 1540: 00f480a3 sb a5,1(s1) if (pet.hygiene < 20) pet.happy = clamp100(pet.happy - 1); 1544: 47d1 li a5,20 1546: 00b7cc63 blt a5,a1,155e 154a: 00148783 lb a5,1(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 154e: 06400593 li a1,100 if (pet.hygiene < 20) pet.happy = clamp100(pet.happy - 1); 1552: 17fd addi a5,a5,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1554: 10f5d863 bge a1,a5,1664 1558: 87ae mv a5,a1 155a: 00f480a3 sb a5,1(s1) if (pet.hygiene < lo) lo = pet.hygiene; 155e: 0014c583 lbu a1,1(s1) 1562: 87ae mv a5,a1 1564: 05e2 slli a1,a1,0x18 1566: 85e1 srai a1,a1,0x18 1568: 00b65363 bge a2,a1,156e 156c: 87b2 mv a5,a2 156e: 01879613 slli a2,a5,0x18 1572: 8661 srai a2,a2,0x18 1574: 00c75363 bge a4,a2,157a 1578: 87ba mv a5,a4 157a: 01879713 slli a4,a5,0x18 157e: 8761 srai a4,a4,0x18 1580: 00e6d363 bge a3,a4,1586 1584: 87b6 mv a5,a3 1586: 01879713 slli a4,a5,0x18 158a: 8761 srai a4,a4,0x18 if (lo < 15) pet.health = clamp100(pet.health - 5); 158c: 46b9 li a3,14 158e: 00448783 lb a5,4(s1) 1592: 0ce6ce63 blt a3,a4,166e 1596: 17ed addi a5,a5,-5 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1598: 06400713 li a4,100 159c: 0cf75f63 bge a4,a5,167a 15a0: 87ba mv a5,a4 15a2: 00f48223 sb a5,4(s1) if (pet.health <= 0) { 15a6: 00448783 lb a5,4(s1) 15aa: bcf04ee3 bgtz a5,1186 screen = SCR_DEAD; 15ae: 4709 li a4,2 beep(330, 200); beep(247, 200); beep(165, 400); 15b0: 0c800593 li a1,200 15b4: 14a00513 li a0,330 screen = SCR_DEAD; 15b8: c0e18c23 sb a4,-1000(gp) # 20000014 pet.alive = 0; 15bc: 00048523 sb zero,10(s1) beep(330, 200); beep(247, 200); beep(165, 400); 15c0: de5fe0ef jal 3a4 15c4: 0c800593 li a1,200 15c8: 0f700513 li a0,247 15cc: dd9fe0ef jal 3a4 15d0: 19000593 li a1,400 15d4: 0a500513 li a0,165 15d8: dcdfe0ef jal 3a4 15dc: b66d j 1186 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 15de: fff6c613 not a2,a3 15e2: 867d srai a2,a2,0x1f 15e4: 8ef1 and a3,a3,a2 15e6: bde1 j 14be 15e8: fff74613 not a2,a4 15ec: 867d srai a2,a2,0x1f 15ee: 8f71 and a4,a4,a2 15f0: b5cd j 14d2 pet.satiety = clamp100(pet.satiety - 3); 15f2: 1775 addi a4,a4,-3 pet.happy = clamp100(pet.happy - 2); 15f4: 00148603 lb a2,1(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 15f8: 02e5dd63 bge a1,a4,1632 15fc: 872e mv a4,a1 15fe: 0762 slli a4,a4,0x18 1600: 8761 srai a4,a4,0x18 pet.satiety = clamp100(pet.satiety - 3); 1602: 00e48023 sb a4,0(s1) pet.energy = clamp100(pet.energy - 2); 1606: 17f9 addi a5,a5,-2 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1608: 06400693 li a3,100 160c: 02f6d863 bge a3,a5,163c 1610: 87b6 mv a5,a3 1612: 01879693 slli a3,a5,0x18 1616: 86e1 srai a3,a3,0x18 pet.energy = clamp100(pet.energy - 2); 1618: 00d48123 sb a3,2(s1) pet.happy = clamp100(pet.happy - 2); 161c: 1679 addi a2,a2,-2 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 161e: 06400793 li a5,100 1622: 02c7d263 bge a5,a2,1646 1626: 863e mv a2,a5 1628: c1c18793 addi a5,gp,-996 # 20000018 162c: 00c780a3 sb a2,1(a5) 1630: bd75 j 14ec 1632: fff74693 not a3,a4 1636: 86fd srai a3,a3,0x1f 1638: 8f75 and a4,a4,a3 163a: b7d1 j 15fe 163c: fff7c693 not a3,a5 1640: 86fd srai a3,a3,0x1f 1642: 8ff5 and a5,a5,a3 1644: b7f9 j 1612 1646: fff64793 not a5,a2 164a: 87fd srai a5,a5,0x1f 164c: 8e7d and a2,a2,a5 164e: bfe9 j 1628 1650: fff64793 not a5,a2 1654: 87fd srai a5,a5,0x1f 1656: 8e7d and a2,a2,a5 1658: b55d j 14fe 165a: fff7c513 not a0,a5 165e: 857d srai a0,a0,0x1f 1660: 8fe9 and a5,a5,a0 1662: bdf9 j 1540 1664: fff7c593 not a1,a5 1668: 85fd srai a1,a1,0x1f 166a: 8fed and a5,a5,a1 166c: b5fd j 155a else if (lo > 50) pet.health = clamp100(pet.health + 2); 166e: 03200693 li a3,50 1672: f2e6dae3 bge a3,a4,15a6 1676: 0789 addi a5,a5,2 1678: b705 j 1598 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 167a: fff7c713 not a4,a5 167e: 877d srai a4,a4,0x1f 1680: 8ff9 and a5,a5,a4 1682: b705 j 15a2 1684: 31647373 .insn 4, 0x31647373 1688: 5f363033 .insn 4, 0x5f363033 168c: 3269 jal 1016 168e: 72655f63 bge a0,t1,1dcc 1692: 6f72 .insn 2, 0x6f72 1694: 2072 .insn 2, 0x2072 1696: 202d jal 16c0 1698: 6974 .insn 2, 0x6974 169a: 656d lui a0,0x1b 169c: 2074756f jal a0,490a2 16a0: 74696177 .insn 4, 0x74696177 16a4: 6e69 lui t3,0x1a 16a6: 6f662067 .insn 4, 0x6f662067 16aa: 2072 .insn 2, 0x2072 16ac: 7325 lui t1,0xfffe9 16ae: 0d0a slli s10,s10,0x2 16b0: 0000 unimp 16b2: 0000 unimp 16b4: 7a5a .insn 2, 0x7a5a 16b6: 007a c.slli zero,0x1e 16b8: 4150 lw a2,4(a0) 16ba: 414e lw sp,208(sp) 16bc: 43544f47 .insn 4, 0x43544f47 16c0: 4948 lw a0,20(a0) 16c2: 0000 unimp 16c4: 7270 .insn 2, 0x7270 16c6: 7365 lui t1,0xffff9 16c8: 6e612073 .insn 4, 0x6e612073 16cc: 2079 jal 175a 16ce: 0079656b .insn 4, 0x0079656b 16d2: 0000 unimp 16d4: 0021 c.nop 8 16d6: 0000 unimp 16d8: 007a c.slli zero,0x1e 16da: 0000 unimp 16dc: 005a c.slli zero,0x16 16de: 0000 unimp 16e0: 2d2d jal 1d1a 16e2: 5320 lw s0,96(a4) 16e4: 4154 lw a3,4(a0) 16e6: 5554 lw a3,44(a0) 16e8: 2d2d2053 .insn 4, 0x2d2d2053 16ec: 0000 unimp 16ee: 0000 unimp 16f0: 4f46 lw t5,80(sp) 16f2: 0000444f .insn 4, 0x444f 16f6: 0000 unimp 16f8: 5546 lw a0,112(sp) 16fa: 204e .insn 2, 0x204e 16fc: 0000 unimp 16fe: 0000 unimp 1700: 4e45 li t3,17 1702: 00005947 .insn 4, 0x5947 1706: 0000 unimp 1708: 48534157 .insn 4, 0x48534157 170c: 0000 unimp 170e: 0000 unimp 1710: 4c48 lw a0,28(s0) 1712: 4854 lw a3,20(s0) 1714: 0000 unimp 1716: 0000 unimp 1718: 6741 lui a4,0x10 171a: 2065 jal 17c2 171c: 7525 lui a0,0xfffe9 171e: 2020 .insn 2, 0x2020 1720: 7325 lui t1,0xfffe9 1722: 0000 unimp 1724: 2e52 .insn 2, 0x2e52 1726: 2e49 jal 1ab8 1728: 2e50 .insn 2, 0x2e50 172a: 0000 unimp 172c: 696c .insn 2, 0x696c 172e: 6576 .insn 2, 0x6576 1730: 2064 .insn 2, 0x2064 1732: 7525 lui a0,0xfffe9 1734: 6d20 .insn 2, 0x6d20 1736: 6e69 lui t3,0x1a 1738: 0000 unimp 173a: 0000 unimp 173c: 6f6e .insn 2, 0x6f6e 173e: 2074 .insn 2, 0x2074 1740: 7562 .insn 2, 0x7562 1742: 00007973 .insn 4, 0x7973 1746: 0000 unimp 1748: 616d addi sp,sp,240 174a: 72657473 .insn 4, 0x72657473 174e: 6d20 .insn 2, 0x6d20 1750: 0065646f jal s0,57756 1754: 7274 .insn 2, 0x7274 1756: 6e61 lui t3,0x18 1758: 74696d73 .insn 4, 0x74696d73 175c: 6d20 .insn 2, 0x6d20 175e: 0065646f jal s0,57764 1762: 0000 unimp 1764: 7874 .insn 2, 0x7874 1766: 6520 .insn 2, 0x6520 1768: 706d c.lui zero,0xffffb 176a: 7974 .insn 2, 0x7974 176c: 0000 unimp 176e: 0000 unimp 1770: 7274 .insn 2, 0x7274 1772: 6e61 lui t3,0x18 1774: 74696d73 .insn 4, 0x74696d73 1778: 6320 .insn 2, 0x6320 177a: 6c706d6f jal s10,8640 177e: 7465 lui s0,0xffff9 1780: 0065 c.nop 25 1782: 0000 unimp 1784: 4546 lw a0,80(sp) 1786: 4445 li s0,17 1788: 0000 unimp 178a: 0000 unimp 178c: 4c50 lw a2,28(s0) 178e: 5941 li s2,-16 1790: 0000 unimp 1792: 0000 unimp 1794: 45454c53 .insn 4, 0x45454c53 1798: 0050 addi a2,sp,4 179a: 0000 unimp 179c: 41454c43 .insn 4, 0x41454c43 17a0: 004e c.slli zero,0x13 17a2: 0000 unimp 17a4: 4548 lw a0,12(a0) 17a6: 4c41 li s8,16 17a8: 0000 unimp 17aa: 0000 unimp 17ac: 54415453 .insn 4, 0x54415453 17b0: 00000053 .insn 4, 0x0053 17b4: 0fe6 slli t6,t6,0x19 17b6: 0000 unimp 17b8: 11b8 addi a4,sp,232 17ba: 0000 unimp 17bc: 122e slli tp,tp,0x2b 17be: 0000 unimp 17c0: 1250 addi a2,sp,292 17c2: 0000 unimp 17c4: 1290 addi a2,sp,352 17c6: 0000 unimp 17c8: 12d2 slli t0,t0,0x34 ... 000017cc : 17cc: 0000 0000 0000 c000 c000 c000 c006 c006 ................ 17dc: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... 000017ec : 17ec: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. 17fc: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ 0000180c : 180c: 0000 0000 8000 8000 c001 c001 f007 f80d ................ 181c: f80d f808 fc1d f80d f80f f80f f007 8000 ................ 0000182c : 182c: 0000 0000 0000 0004 000c 001c 0018 001c ................ 183c: 003c 001c 001e 001f e80f f007 8000 0000 <............... 0000184c : 184c: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ 185c: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. 0000186c : 186c: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. 187c: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... 0000188c : ... 1894: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 18a4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 18b4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 18c4: ff07 f0ff bb0f f8ee d70f f8f5 ef0f f8fb ................ 18d4: d70f f8f5 bb1f fcee ff0f f8ff ff0f f8ff ................ 18e4: ff0f f8ff f00f f807 ff07 f0ff ff07 f0ff ................ 18f4: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1904: 1f00 00fc 0000 0080 ........ 0000190c : ... 1914: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1924: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1934: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1944: ff07 f0ff ff0f f8ff ff0f f8ff ff0f f8ff ................ 1954: 010f 78c0 ff1f fcff ff0f f8ff ff0f f87f ...x............ 1964: fc0f f81f ff0f f87f ff07 f0ff ff07 f0ff ................ 1974: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1984: 1f00 00fc 0000 0080 ........ 0000198c : ... 1994: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 19a4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 19b4: ff1f f8ff ff0f f0ff ff03 e0ff ef07 f0fb ................ 19c4: 8307 f0e0 930f f8e4 110f 78c4 830f f8e0 ...........x.... 19d4: 830f f8e0 ef1f fcfb ff0f f87f fc0f f81f ................ 19e4: fc0f f81f f80f f80f fc07 f01f fc07 f01f ................ 19f4: ff03 e07f ff01 c0ff ff00 80ff 7f00 00ff ................ 1a04: 1f00 00fc 0000 0080 ........ 00001a0c : ... 1a14: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1a24: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1a34: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1a44: ff07 f0ff ef0f f8fb 830f f8e0 930f f8e4 ................ 1a54: 110f 78c4 831f fce0 830f f860 ec0f f81b ...x......`..... 1a64: ff0f f87f fc0f f81f f707 f0f7 fb07 f0ef ................ 1a74: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1a84: 1f00 00fc 0000 0080 ........ 00001a8c : ... 1a94: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1aa4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1ab4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1ac4: ff07 f0ff ff0f f8ff ef0f f8fb d70f f8f5 ................ 1ad4: ff0f f8ff ff1f fcff ff0f f8ff f80f f80f ................ 1ae4: fb0f f8ef f70f f8f7 fc07 f01f ff07 f0ff ................ 1af4: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1b04: 1f00 00fc 0000 0080 ........ 00001b0c : ... 1b14: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 1b24: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 1b34: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 1b44: ff07 f0ff ff0f f8ff ff0f f8ff 010f 78c0 ...............x 1b54: ff0f f8ff ff1f fcff ff0f f87f fc0f f81f ................ 1b64: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................ 1b74: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 1b84: 1f00 00fc 0000 0080 ........ 00001b8c : 1b8c: 173c 0000 1748 0000 1754 0000 1764 0000 <...H...T...d... 1b9c: 1770 0000 p... 00001ba0 : ... 1ba8: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~ 1bb8: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8.. 1bc8: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8 1bd8: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<........... 1be8: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 ..>....<~..~<. 1c38: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{.... 1c48: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a`<.|.. 1cc8: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v. 1cd8: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000... 1ce8: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.l...... 2038: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|. 2048: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v. 2058: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~.. 2068: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|. 2078: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f.. 2088: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~.......... 2098: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v. 20a8: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|. 20b8: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff. 20c8: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v........~.. 20d8: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>. 20e8: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................ 20f8: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j.. 2108: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3.. 2118: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".". 2128: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w. 2138: 1818 1818 1818 1818 1818 1818 18f8 1818 ................ 2148: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666 2158: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........ 2168: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666 2178: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666...... 2188: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............ 2198: 0000 0000 18f8 1818 1818 1818 001f 0000 ................ 21a8: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................ 21b8: 1818 1818 181f 1818 0000 0000 00ff 0000 ................ 21c8: 1818 1818 18ff 1818 1818 181f 181f 1818 ................ 21d8: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?... 21e8: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666...... 21f8: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666 2208: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666 2218: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666.... 2228: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666 2238: 3636 3636 003f 0000 1818 181f 001f 0000 6666?........... 2248: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666 2258: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........ 2268: 1818 1818 00f8 0000 0000 0000 181f 1818 ................ 2278: ffff ffff ffff ffff 0000 0000 ffff ffff ................ 2288: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................ 2298: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v. 22a8: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x............... 22b8: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`... 22c8: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|. 22d8: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.ff<...~..~.. 2308: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0.. 2318: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|.............. 2328: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~. 2338: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~......... 2348: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~.... 2358: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8.... 2368: 0000 1800 0018 0000 0000 1800 0000 0000 ................ 2378: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666... 2388: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<.. ... 000023a0 : 23a0: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... 23b0: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... 000023bc : ... 23c4: 0001 8000 e00f f007 f01f f80f f01f f80f ................ 23d4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?........... 23e4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................ 23f4: ef07 f0fb 830f f8e0 930f f8e4 110f 78c4 ...............x 2404: 830f f8e0 831f fce0 ef0f f87b fc0f f81f ..........{..... 2414: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................ 2424: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................ 2434: 1f00 00fc 0000 0080 ........ 0000243c : 243c: 186c 0000 184c 0000 182c 0000 180c 0000 l...L...,....... 244c: 17ec 0000 17cc 0000 ........ 00002454 : 2454: 23bc 0000 1b0c 0000 1a8c 0000 1a0c 0000 .#.............. 2464: 198c 0000 190c 0000 188c 0000 ............ 00002470 : 2470: 1784 0000 178c 0000 1794 0000 179c 0000 ................ 2480: 17a4 0000 17ac 0000 ........ 00002488 : ... 2490: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................ 24a0: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3.. 24b0: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0.......... 24c0: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?... 24d0: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................ 24e0: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................ ...