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: 3af0006f j bae 4: 00000000 .word 0x00000000 8: 00000c22 .word 0x00000c22 c: 00000c20 .word 0x00000c20 ... 30: 00000c20 .word 0x00000c20 34: 00000000 .word 0x00000000 38: 00000c20 .word 0x00000c20 3c: 00000000 .word 0x00000000 40: 00000c20 .word 0x00000c20 44: 00000c20 .word 0x00000c20 48: 00000c20 .word 0x00000c20 4c: 00000c20 .word 0x00000c20 50: 00001a9a .word 0x00001a9a 54: 00000c20 .word 0x00000c20 58: 00000c20 .word 0x00000c20 5c: 00000c20 .word 0x00000c20 60: 00000c20 .word 0x00000c20 64: 00000c20 .word 0x00000c20 68: 00000c20 .word 0x00000c20 6c: 00000c20 .word 0x00000c20 70: 00000c20 .word 0x00000c20 74: 00000c20 .word 0x00000c20 78: 00000c20 .word 0x00000c20 7c: 00000c20 .word 0x00000c20 80: 00000c20 .word 0x00000c20 84: 00000c20 .word 0x00000c20 88: 00000c20 .word 0x00000c20 8c: 00000c20 .word 0x00000c20 90: 00000c20 .word 0x00000c20 94: 00000c20 .word 0x00000c20 98: 00001abe .word 0x00001abe 9c: 0000 unimp ... Disassembly of section .text: 000000a0 <__divsi3>: a0: 02054e63 bltz a0,dc <__umodsi3+0x8> a4: 0405c363 bltz a1,ea <__umodsi3+0x16> 000000a8 <__hidden___udivsi3>: a8: 862e mv a2,a1 aa: 85aa mv a1,a0 ac: 557d li a0,-1 ae: c215 beqz a2,d2 <__hidden___udivsi3+0x2a> b0: 4685 li a3,1 b2: 00b67863 bgeu a2,a1,c2 <__hidden___udivsi3+0x1a> b6: 00c05663 blez a2,c2 <__hidden___udivsi3+0x1a> ba: 0606 slli a2,a2,0x1 bc: 0686 slli a3,a3,0x1 be: feb66ce3 bltu a2,a1,b6 <__hidden___udivsi3+0xe> c2: 4501 li a0,0 c4: 00c5e463 bltu a1,a2,cc <__hidden___udivsi3+0x24> c8: 8d91 sub a1,a1,a2 ca: 8d55 or a0,a0,a3 cc: 8285 srli a3,a3,0x1 ce: 8205 srli a2,a2,0x1 d0: faf5 bnez a3,c4 <__hidden___udivsi3+0x1c> d2: 8082 ret 000000d4 <__umodsi3>: d4: 8286 mv t0,ra d6: 3fc9 jal a8 <__hidden___udivsi3> d8: 852e mv a0,a1 da: 8282 jr t0 dc: 40a00533 neg a0,a0 e0: 00b04763 bgtz a1,ee <__umodsi3+0x1a> e4: 40b005b3 neg a1,a1 e8: b7c1 j a8 <__hidden___udivsi3> ea: 40b005b3 neg a1,a1 ee: 8286 mv t0,ra f0: 3f65 jal a8 <__hidden___udivsi3> f2: 40a00533 neg a0,a0 f6: 8282 jr t0 000000f8 <__modsi3>: f8: 8286 mv t0,ra fa: 0005c763 bltz a1,108 <__modsi3+0x10> fe: 00054963 bltz a0,110 <__modsi3+0x18> 102: 375d jal a8 <__hidden___udivsi3> 104: 852e mv a0,a1 106: 8282 jr t0 108: 40b005b3 neg a1,a1 10c: fe055be3 bgez a0,102 <__modsi3+0xa> 110: 40a00533 neg a0,a0 114: 3f51 jal a8 <__hidden___udivsi3> 116: 40b00533 neg a0,a1 11a: 8282 jr t0 ... 0000011e : #endif void DelaySysTick( uint32_t n ) { #if defined(CH32V003) || defined(CH32V00x) uint32_t targend = SysTick->CNT + n; 11e: e000f737 lui a4,0xe000f 122: 471c lw a5,8(a4) 124: 953e add a0,a0,a5 while( ((int32_t)( SysTick->CNT - targend )) < 0 ); 126: 471c lw a5,8(a4) 128: 8f89 sub a5,a5,a0 12a: fe07cee3 bltz a5,126 uint64_t targend = SysTick->CNT - n; while( ((int64_t)( SysTick->CNT - targend )) > 0 ); #else #error DelaySysTick not defined. #endif } 12e: 8082 ret 00000130 : void ssd1306_i2c_setup(void) { uint16_t tempreg; // Reset I2C1 to init all regs RCC->APB1PRSTR |= RCC_APB1Periph_I2C1; 130: 400217b7 lui a5,0x40021 134: 4b98 lw a4,16(a5) 136: 002006b7 lui a3,0x200 13a: 8f55 or a4,a4,a3 13c: cb98 sw a4,16(a5) RCC->APB1PRSTR &= ~RCC_APB1Periph_I2C1; 13e: 4b98 lw a4,16(a5) 140: ffe006b7 lui a3,0xffe00 144: 16fd addi a3,a3,-1 # ffdfffff <_eusrstack+0xdfdff7ff> 146: 8f75 and a4,a4,a3 148: cb98 sw a4,16(a5) // set freq tempreg = I2C1->CTLR2; 14a: 400057b7 lui a5,0x40005 14e: 4047d703 lhu a4,1028(a5) # 40005404 <_eusrstack+0x20004c04> tempreg &= ~I2C_CTLR2_FREQ; 152: 66c1 lui a3,0x10 154: fc068693 addi a3,a3,-64 # ffc0 158: 8f75 and a4,a4,a3 tempreg |= (FUNCONF_SYSTEM_CORE_CLOCK/SSD1306_I2C_PRERATE)&I2C_CTLR2_FREQ; 15a: 01876713 ori a4,a4,24 I2C1->CTLR2 = tempreg; 15e: 40e79223 sh a4,1028(a5) tempreg = (FUNCONF_SYSTEM_CORE_CLOCK/(25*SSD1306_I2C_CLKRATE))&I2C_CKCFGR_CCR; tempreg |= I2C_CKCFGR_DUTY; #endif tempreg |= I2C_CKCFGR_FS; #endif I2C1->CKCFGR = tempreg; 162: 7771 lui a4,0xffffc 164: 0705 addi a4,a4,1 # ffffc001 <_eusrstack+0xdfffb801> 166: 40e79e23 sh a4,1052(a5) // initialize the state ssd1306_i2c_irq_state = 0; #endif // Enable I2C I2C1->CTLR1 |= I2C_CTLR1_PE; 16a: 4007d703 lhu a4,1024(a5) 16e: 00176713 ori a4,a4,1 172: 40e79023 sh a4,1024(a5) // set ACK mode I2C1->CTLR1 |= I2C_CTLR1_ACK; 176: 4007d703 lhu a4,1024(a5) 17a: 40076713 ori a4,a4,1024 17e: 40e79023 sh a4,1024(a5) } 182: 8082 ret 00000184 : void ssd1306_drawPixel(uint32_t x, uint32_t y, int color) { uint32_t addr; /* clip */ if(x >= SSD1306_W) 184: 07f00793 li a5,127 188: 02a7e763 bltu a5,a0,1b6 return; if(y >= SSD1306_H) 18c: 03f00793 li a5,63 190: 02b7e363 bltu a5,a1,1b6 return; /* compute buffer address */ addr = x + SSD1306_W*(y/8); 194: 0035d793 srli a5,a1,0x3 198: 079e slli a5,a5,0x7 19a: 97aa add a5,a5,a0 /* set/clear bit in buffer */ if(color) ssd1306_buffer[addr] |= (1<<(y&7)); 19c: c5c18513 addi a0,gp,-932 # 20000058 1a0: 953e add a0,a0,a5 1a2: 899d andi a1,a1,7 1a4: 4705 li a4,1 1a6: 00054783 lbu a5,0(a0) 1aa: 00b715b3 sll a1,a4,a1 if(color) 1ae: c609 beqz a2,1b8 ssd1306_buffer[addr] |= (1<<(y&7)); 1b0: 8fcd or a5,a5,a1 else ssd1306_buffer[addr] &= ~(1<<(y&7)); 1b2: 00f50023 sb a5,0(a0) } 1b6: 8082 ret ssd1306_buffer[addr] &= ~(1<<(y&7)); 1b8: fff5c593 not a1,a1 1bc: 8fed and a5,a5,a1 1be: bfd5 j 1b2 000001c0 : /* * fill a rectangle */ void ssd1306_fillRect(uint32_t x, uint32_t y, uint8_t w, uint32_t h, uint32_t color) { 1c0: 1101 addi sp,sp,-32 1c2: 8332 mv t1,a2 1c4: cc22 sw s0,24(sp) 1c6: ca26 sw s1,20(sp) 1c8: ce06 sw ra,28(sp) 1ca: 84aa mv s1,a0 1cc: 863a mv a2,a4 1ce: 96ae add a3,a3,a1 /* scan vertical */ while(h--) { m=x; w=iw; 1d0: 841a mv s0,t1 /* scan horizontal */ while(w--) 1d2: 147d addi s0,s0,-1 1d4: 0ff47413 zext.b s0,s0 1d8: 0ff00713 li a4,255 1dc: 00e41a63 bne s0,a4,1f0 { /* invert pixels */ ssd1306_drawPixel(m++, n, color); } n++; 1e0: 0585 addi a1,a1,1 while(h--) 1e2: 02d58663 beq a1,a3,20e while(w--) 1e6: fff30413 addi s0,t1,-1 1ea: 0ff47413 zext.b s0,s0 m=x; 1ee: 8526 mv a0,s1 ssd1306_drawPixel(m++, n, color); 1f0: 00150713 addi a4,a0,1 1f4: c81a sw t1,16(sp) 1f6: c636 sw a3,12(sp) 1f8: c43a sw a4,8(sp) 1fa: c232 sw a2,4(sp) 1fc: c02e sw a1,0(sp) 1fe: 3759 jal 184 200: 4722 lw a4,8(sp) 202: 4342 lw t1,16(sp) 204: 46b2 lw a3,12(sp) 206: 4612 lw a2,4(sp) 208: 4582 lw a1,0(sp) 20a: 853a mv a0,a4 20c: b7d9 j 1d2 } } 20e: 40f2 lw ra,28(sp) 210: 4462 lw s0,24(sp) 212: 44d2 lw s1,20(sp) 214: 6105 addi sp,sp,32 216: 8082 ret 00000218 : /* * draw a string to the display */ void ssd1306_drawstr(int x, int y, const char *str, uint8_t color) { 218: fdc10113 addi sp,sp,-36 21c: ce22 sw s0,28(sp) 21e: cc26 sw s1,24(sp) 220: d006 sw ra,32(sp) 222: 842a mv s0,a0 224: 82ae mv t0,a1 226: 84b2 mv s1,a2 uint8_t c; while((c=*str++)) 228: 0004c383 lbu t2,0(s1) 22c: 0485 addi s1,s1,1 22e: 06038563 beqz t2,298 232: 4701 li a4,0 d = fontdata[(chr<<3)+i]; 234: 00339793 slli a5,t2,0x3 238: 6609 lui a2,0x2 23a: 97ba add a5,a5,a4 23c: 7f060613 addi a2,a2,2032 # 27f0 240: 97b2 add a5,a5,a2 242: 0007c303 lbu t1,0(a5) 246: 4781 li a5,0 if(d&0x80) 248: 01831593 slli a1,t1,0x18 24c: 85e1 srai a1,a1,0x18 24e: 8636 mv a2,a3 250: 0005c463 bltz a1,258 col = (~color)&1; 254: 0016c613 xori a2,a3,1 ssd1306_drawPixel(x+j, y+i, col); 258: 00e285b3 add a1,t0,a4 25c: 00f40533 add a0,s0,a5 260: ca36 sw a3,20(sp) 262: c81a sw t1,16(sp) 264: c61e sw t2,12(sp) 266: c43a sw a4,8(sp) 268: c216 sw t0,4(sp) 26a: c03e sw a5,0(sp) 26c: 3f21 jal 184 d <<= 1; 26e: 4342 lw t1,16(sp) for(j=0;j<8;j++) 270: 4782 lw a5,0(sp) 272: 4621 li a2,8 d <<= 1; 274: 0306 slli t1,t1,0x1 for(j=0;j<8;j++) 276: 0785 addi a5,a5,1 278: 4292 lw t0,4(sp) 27a: 4722 lw a4,8(sp) 27c: 43b2 lw t2,12(sp) 27e: 46d2 lw a3,20(sp) d <<= 1; 280: 0ff37313 zext.b t1,t1 for(j=0;j<8;j++) 284: fcc792e3 bne a5,a2,248 for(i=0;i<8;i++) 288: 0705 addi a4,a4,1 28a: faf715e3 bne a4,a5,234 { ssd1306_drawchar(x, y, c, color); x += 8; 28e: 9432 add s0,s0,a2 if(x>120) 290: 07800793 li a5,120 294: f887dae3 bge a5,s0,228 break; } } 298: 5082 lw ra,32(sp) 29a: 4472 lw s0,28(sp) 29c: 44e2 lw s1,24(sp) 29e: 02410113 addi sp,sp,36 2a2: 8082 ret 000002a4 : // Tiny string builders used instead of snprintf: we only ever paste short // strings and small unsigned ints, and avoiding keeps the whole // printf machinery (~1 KB) out of the image. Each returns the new end pointer // so calls chain; remember to NUL-terminate the final buffer yourself. static char *s_cat(char *p, const char *s) { while (*s) *p++ = *s++; return p; } 2a4: 0005c783 lbu a5,0(a1) 2a8: e391 bnez a5,2ac 2aa: 8082 ret 2ac: 0505 addi a0,a0,1 2ae: 0585 addi a1,a1,1 2b0: fef50fa3 sb a5,-1(a0) 2b4: bfc5 j 2a4 000002b6 : static char *u_cat(char *p, unsigned v) { 2b6: 1111 addi sp,sp,-28 2b8: ca22 sw s0,20(sp) 2ba: c826 sw s1,16(sp) 2bc: cc06 sw ra,24(sp) 2be: 87aa mv a5,a0 2c0: 872e mv a4,a1 2c2: 0020 addi s0,sp,8 char tmp[5]; int n = 0; 2c4: 4481 li s1,0 do { tmp[n++] = '0' + v % 10; v /= 10; } while (v); 2c6: 45a9 li a1,10 2c8: 853a mv a0,a4 2ca: c23e sw a5,4(sp) 2cc: c03a sw a4,0(sp) 2ce: 3519 jal d4 <__umodsi3> 2d0: 4702 lw a4,0(sp) 2d2: 03050513 addi a0,a0,48 2d6: 00a40023 sb a0,0(s0) 2da: 45a9 li a1,10 2dc: 853a mv a0,a4 2de: 33e9 jal a8 <__hidden___udivsi3> 2e0: 4302 lw t1,0(sp) 2e2: 46a5 li a3,9 2e4: 4792 lw a5,4(sp) 2e6: 0485 addi s1,s1,1 2e8: 872a mv a4,a0 2ea: 0405 addi s0,s0,1 2ec: 0030 addi a2,sp,8 2ee: fc66ece3 bltu a3,t1,2c6 2f2: 8726 mv a4,s1 2f4: 86be mv a3,a5 while (n) *p++ = tmp[--n]; 2f6: 177d addi a4,a4,-1 2f8: 00e605b3 add a1,a2,a4 2fc: 0005c583 lbu a1,0(a1) 300: 0685 addi a3,a3,1 302: feb68fa3 sb a1,-1(a3) 306: fb65 bnez a4,2f6 return p; } 308: 40e2 lw ra,24(sp) 30a: 4452 lw s0,20(sp) 30c: 00978533 add a0,a5,s1 310: 44c2 lw s1,16(sp) 312: 0171 addi sp,sp,28 314: 8082 ret 00000316 : // short square-wave beep on the passive piezo (blocking, ms-scale only) static void beep(uint16_t freq, uint16_t ms) { if (!sound_on) return; 316: c061c783 lbu a5,-1018(gp) # 20000002 31a: c7ad beqz a5,384 { 31c: 1131 addi sp,sp,-20 31e: c622 sw s0,12(sp) 320: 842e mv s0,a1 if (freq == 0) { Delay_Ms(ms); return; } uint32_t half = 500000u / freq; // half-period in us 322: 85aa mv a1,a0 324: 0007a537 lui a0,0x7a 328: 12050513 addi a0,a0,288 # 7a120 { 32c: c806 sw ra,16(sp) 32e: c426 sw s1,8(sp) uint32_t half = 500000u / freq; // half-period in us 330: 3ba5 jal a8 <__hidden___udivsi3> uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 332: 00541793 slli a5,s0,0x5 336: 8f81 sub a5,a5,s0 338: 078a slli a5,a5,0x2 33a: 97a2 add a5,a5,s0 33c: 00151413 slli s0,a0,0x1 uint32_t half = 500000u / freq; // half-period in us 340: 84aa mv s1,a0 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 342: 85a2 mv a1,s0 344: 00379513 slli a0,a5,0x3 348: 3385 jal a8 <__hidden___udivsi3> for (uint32_t i = 0; i < cycles; i++) { funDigitalWrite(BUZZER, FUN_HIGH); Delay_Us(half); 34a: 9426 add s0,s0,s1 34c: 00141793 slli a5,s0,0x1 uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u); 350: 872a mv a4,a0 Delay_Us(half); 352: c03e sw a5,0(sp) for (uint32_t i = 0; i < cycles; i++) { 354: 4401 li s0,0 Delay_Us(half); 356: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_HIGH); 358: 400114b7 lui s1,0x40011 35c: c23a sw a4,4(sp) 35e: 4691 li a3,4 360: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00> 364: c894 sw a3,16(s1) Delay_Us(half); 366: 3b65 jal 11e funDigitalWrite(BUZZER, FUN_LOW); Delay_Us(half); 368: 4502 lw a0,0(sp) funDigitalWrite(BUZZER, FUN_LOW); 36a: 000406b7 lui a3,0x40 36e: c894 sw a3,16(s1) Delay_Us(half); 370: 337d jal 11e for (uint32_t i = 0; i < cycles; i++) { 372: 4712 lw a4,4(sp) 374: 0405 addi s0,s0,1 376: fe8710e3 bne a4,s0,356 } } 37a: 40c2 lw ra,16(sp) 37c: 4432 lw s0,12(sp) 37e: 44a2 lw s1,8(sp) 380: 0151 addi sp,sp,20 382: 8082 ret 384: 8082 ret 00000386 : static void led_blink(void) { 386: 1161 addi sp,sp,-8 388: c022 sw s0,0(sp) funDigitalWrite(LED_PIN, FUN_HIGH); 38a: 40011437 lui s0,0x40011 { 38e: c206 sw ra,4(sp) funDigitalWrite(LED_PIN, FUN_HIGH); 390: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000> 394: 4789 li a5,2 Delay_Ms(30); 396: 0002c537 lui a0,0x2c funDigitalWrite(LED_PIN, FUN_HIGH); 39a: c81c sw a5,16(s0) Delay_Ms(30); 39c: f2050513 addi a0,a0,-224 # 2bf20 3a0: 3bbd jal 11e funDigitalWrite(LED_PIN, FUN_LOW); 3a2: 000207b7 lui a5,0x20 } 3a6: 4092 lw ra,4(sp) funDigitalWrite(LED_PIN, FUN_LOW); 3a8: c81c sw a5,16(s0) } 3aa: 4402 lw s0,0(sp) 3ac: 0121 addi sp,sp,8 3ae: 8082 ret 000003b0 : } // Award XP; promote (and trigger the evolution banner) when a tier is reached. static void add_xp(uint8_t n) { if (!pet.alive) return; 3b0: c4818713 addi a4,gp,-952 # 20000044 3b4: 01074703 lbu a4,16(a4) 3b8: c371 beqz a4,47c 3ba: c4818793 addi a5,gp,-952 # 20000044 if (pet.xp < 60000) pet.xp += n; 3be: 0087d683 lhu a3,8(a5) # 20008 3c2: 673d lui a4,0xf 3c4: a5f70713 addi a4,a4,-1441 # ea5f 3c8: 02d76663 bltu a4,a3,3f4 3cc: 9536 add a0,a0,a3 3ce: 0542 slli a0,a0,0x10 3d0: 8141 srli a0,a0,0x10 3d2: 00a79423 sh a0,8(a5) uint8_t nl = 1; for (uint8_t i = 1; i < MAX_LEVEL; i++) if (pet.xp >= level_xp[i]) nl = i + 1; 3d6: 02c00693 li a3,44 uint8_t nl = 1; 3da: 4705 li a4,1 if (pet.xp >= level_xp[i]) nl = i + 1; 3dc: 00a6fd63 bgeu a3,a0,3f6 3e0: 07700693 li a3,119 3e4: 4709 li a4,2 3e6: 00a6f863 bgeu a3,a0,3f6 3ea: 0ef00693 li a3,239 3ee: 470d li a4,3 3f0: 00a6f363 bgeu a3,a0,3f6 3f4: 4711 li a4,4 if (nl > pet.level) { 3f6: 00b7c683 lbu a3,11(a5) 3fa: 08e6f163 bgeu a3,a4,47c { 3fe: 1171 addi sp,sp,-4 400: c006 sw ra,0(sp) pet.level = nl; 402: 00e785a3 sb a4,11(a5) switch (pet.level) { 406: 4589 li a1,2 408: 4685 li a3,1 40a: 02b70663 beq a4,a1,436 40e: 460d li a2,3 410: 86ae mv a3,a1 412: 02c70263 beq a4,a2,436 416: 4605 li a2,1 418: 4681 li a3,0 41a: 00c70e63 beq a4,a2,436 if (!pet.ascend) pet.ascend = (pet.health >= 60) ? 1 : 2; 41e: 00d7c703 lbu a4,13(a5) 422: eb31 bnez a4,476 424: 00478683 lb a3,4(a5) 428: 03b00713 li a4,59 42c: 04d74163 blt a4,a3,46e 430: 00b786a3 sb a1,13(a5) pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; 434: 4691 li a3,4 case 1: pet.form = FORM_PROC; break; 436: 00d78623 sb a3,12(a5) compute_form(); evo_anim = 30; // ~1.8 s celebratory banner 43a: 4779 li a4,30 beep(784, 60); beep(988, 60); beep(1175, 60); beep(1568, 140); 43c: 03c00593 li a1,60 440: 31000513 li a0,784 evo_anim = 30; // ~1.8 s celebratory banner 444: c4e18223 sb a4,-956(gp) # 20000040 beep(784, 60); beep(988, 60); beep(1175, 60); beep(1568, 140); 448: 35f9 jal 316 44a: 03c00593 li a1,60 44e: 3dc00513 li a0,988 452: 35d1 jal 316 454: 03c00593 li a1,60 458: 49700513 li a0,1175 45c: 3d6d jal 316 45e: 08c00593 li a1,140 462: 62000513 li a0,1568 466: 3d45 jal 316 led_blink(); } } 468: 4082 lw ra,0(sp) 46a: 0111 addi sp,sp,4 led_blink(); 46c: bf29 j 386 if (!pet.ascend) pet.ascend = (pet.health >= 60) ? 1 : 2; 46e: 00c786a3 sb a2,13(a5) pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; 472: 468d li a3,3 break; 474: b7c9 j 436 pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH; 476: fac71fe3 bne a4,a2,434 47a: bfe5 j 472 47c: 8082 ret 0000047e : // Chirp once when a need first drops below 50% (gentle) or 20% (urgent), // re-arming only after it recovers. Audible even while the screen is off, // so it works as a "tend to me" reminder. static void notify(uint8_t idx, int8_t val) { 47e: 1141 addi sp,sp,-16 480: c422 sw s0,8(sp) 482: c606 sw ra,12(sp) 484: c226 sw s1,4(sp) if (val < 20) { 486: 474d li a4,19 { 488: 87aa mv a5,a0 if (val < 20) { 48a: c4018413 addi s0,gp,-960 # 2000003c 48e: 04b74463 blt a4,a1,4d6 if (!crit_flag[idx]) { // urgent: descending triple 492: 942a add s0,s0,a0 494: 00044703 lbu a4,0(s0) 498: eb15 bnez a4,4cc 49a: c02a sw a0,0(sp) beep(1568, 60); beep(1175, 60); beep(880, 90); 49c: 03c00593 li a1,60 4a0: 62000513 li a0,1568 4a4: 3d8d jal 316 4a6: 03c00593 li a1,60 4aa: 49700513 li a0,1175 4ae: 35a5 jal 316 4b0: 05a00593 li a1,90 4b4: 37000513 li a0,880 4b8: 3db9 jal 316 crit_flag[idx] = 1; warn_flag[idx] = 1; 4ba: 4782 lw a5,0(sp) 4bc: c3c18713 addi a4,gp,-964 # 20000038 4c0: 4685 li a3,1 4c2: 97ba add a5,a5,a4 4c4: 00d40023 sb a3,0(s0) 4c8: 00d78023 sb a3,0(a5) } crit_flag[idx] = 0; } else { warn_flag[idx] = 0; crit_flag[idx] = 0; } } 4cc: 40b2 lw ra,12(sp) 4ce: 4422 lw s0,8(sp) 4d0: 4492 lw s1,4(sp) 4d2: 0141 addi sp,sp,16 4d4: 8082 ret } else if (val < 50) { 4d6: c3c18493 addi s1,gp,-964 # 20000038 4da: 03100713 li a4,49 if (!warn_flag[idx]) { // gentle: single chirp 4de: 94aa add s1,s1,a0 } else if (val < 50) { 4e0: 02b74363 blt a4,a1,506 if (!warn_flag[idx]) { // gentle: single chirp 4e4: 0004c703 lbu a4,0(s1) 4e8: eb19 bnez a4,4fe 4ea: c02a sw a0,0(sp) beep(1568, 50); 4ec: 03200593 li a1,50 4f0: 62000513 li a0,1568 4f4: 350d jal 316 warn_flag[idx] = 1; 4f6: 4782 lw a5,0(sp) 4f8: 4705 li a4,1 4fa: 00e48023 sb a4,0(s1) warn_flag[idx] = 0; crit_flag[idx] = 0; 4fe: 943e add s0,s0,a5 500: 00040023 sb zero,0(s0) } 504: b7e1 j 4cc warn_flag[idx] = 0; crit_flag[idx] = 0; 506: 00048023 sb zero,0(s1) 50a: bfd5 j 4fe 0000050c : } // ----------------------------------------------------------------- game tick static void game_tick(void) { pet.age_min++; 50c: c4818793 addi a5,gp,-952 # 20000044 510: 0067d583 lhu a1,6(a5) { 514: 1161 addi sp,sp,-8 516: c022 sw s0,0(sp) 518: c206 sw ra,4(sp) if (pet.sleeping) { pet.energy = clamp100(pet.energy + 6); // needs still drift down slowly even while asleep pet.satiety = clamp100(pet.satiety - 1); 51a: 00078703 lb a4,0(a5) pet.age_min++; 51e: 0585 addi a1,a1,1 520: 05c2 slli a1,a1,0x10 522: 81c1 srli a1,a1,0x10 if (pet.sleeping) { 524: 00f7c603 lbu a2,15(a5) pet.energy = clamp100(pet.energy + 6); 528: 00278683 lb a3,2(a5) pet.age_min++; 52c: 00b79323 sh a1,6(a5) pet.satiety = clamp100(pet.satiety - 1); 530: 177d addi a4,a4,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 532: 06400793 li a5,100 536: c4818413 addi s0,gp,-952 # 20000044 53a: 08e7d663 bge a5,a4,5c6 53e: 873e mv a4,a5 540: 0762 slli a4,a4,0x18 542: 8761 srai a4,a4,0x18 if (pet.sleeping) { 544: ca59 beqz a2,5da pet.energy = clamp100(pet.energy + 6); 546: 00668793 addi a5,a3,6 # 40006 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 54a: 06400513 li a0,100 54e: 08f55163 bge a0,a5,5d0 552: 87aa mv a5,a0 554: 07e2 slli a5,a5,0x18 556: 87e1 srai a5,a5,0x18 pet.energy = clamp100(pet.energy + 6); 558: 00f40123 sb a5,2(s0) pet.satiety = clamp100(pet.satiety - 1); 55c: 00e40023 sb a4,0(s0) if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested 560: 05d00513 li a0,93 564: 00d55763 bge a0,a3,572 568: 000407a3 sb zero,15(s0) 56c: 06400793 li a5,100 570: 4601 li a2,0 pet.energy = clamp100(pet.energy - 1); pet.happy = clamp100(pet.happy - 1); } // hygiene drifts every other tick if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); 572: 0015f513 andi a0,a1,1 576: c919 beqz a0,58c 578: 00340683 lb a3,3(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 57c: 06400313 li t1,100 if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1); 580: 16fd addi a3,a3,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 582: 0ad35163 bge t1,a3,624 586: 869a mv a3,t1 588: 00d401a3 sb a3,3(s0) // occasional bowel movements (derived from counters, no RNG needed) if (!pet.sleeping && pet.poop < 3 && 58c: 00e44303 lbu t1,14(s0) 590: e24d bnez a2,632 592: 4689 li a3,2 594: 0066ed63 bltu a3,t1,5ae ((pet.age_min * 7u + frame) & 0x1F) == 0) 598: 00359693 slli a3,a1,0x3 59c: 8e8d sub a3,a3,a1 59e: c381a583 lw a1,-968(gp) # 20000034 5a2: 96ae add a3,a3,a1 5a4: 8afd andi a3,a3,31 if (!pet.sleeping && pet.poop < 3 && 5a6: e6d1 bnez a3,632 pet.poop++; 5a8: 0305 addi t1,t1,1 5aa: 00640723 sb t1,14(s0) // being dirty / full of poop slowly saps happiness if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 5ae: c541 beqz a0,636 5b0: 00140683 lb a3,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 5b4: 06400593 li a1,100 if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 5b8: 16fd addi a3,a3,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 5ba: 12d5de63 bge a1,a3,6f6 5be: 86ae mv a3,a1 5c0: 00d400a3 sb a3,1(s0) 5c4: a88d j 636 5c6: fff74793 not a5,a4 5ca: 87fd srai a5,a5,0x1f 5cc: 8f7d and a4,a4,a5 5ce: bf8d j 540 5d0: fff7c513 not a0,a5 5d4: 857d srai a0,a0,0x1f 5d6: 8fe9 and a5,a5,a0 5d8: bfb5 j 554 pet.energy = clamp100(pet.energy - 1); 5da: fff68793 addi a5,a3,-1 pet.satiety = clamp100(pet.satiety - 1); 5de: 00e40023 sb a4,0(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 5e2: 06400693 li a3,100 pet.happy = clamp100(pet.happy - 1); 5e6: 00140503 lb a0,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 5ea: 02f6d363 bge a3,a5,610 5ee: 87b6 mv a5,a3 5f0: 07e2 slli a5,a5,0x18 5f2: 87e1 srai a5,a5,0x18 pet.happy = clamp100(pet.happy - 1); 5f4: fff50693 addi a3,a0,-1 pet.energy = clamp100(pet.energy - 1); 5f8: 00f40123 sb a5,2(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 5fc: 06400513 li a0,100 pet.happy = clamp100(pet.happy - 1); 600: c4818313 addi t1,gp,-952 # 20000044 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 604: 00d55b63 bge a0,a3,61a 608: 86aa mv a3,a0 60a: 00d300a3 sb a3,1(t1) 60e: b795 j 572 610: fff7c693 not a3,a5 614: 86fd srai a3,a3,0x1f 616: 8ff5 and a5,a5,a3 618: bfe1 j 5f0 61a: fff6c513 not a0,a3 61e: 857d srai a0,a0,0x1f 620: 8ee9 and a3,a3,a0 622: b7e5 j 60a 624: fff6c313 not t1,a3 628: 41f35313 srai t1,t1,0x1f 62c: 0066f6b3 and a3,a3,t1 630: bfa1 j 588 if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 632: f6031ee3 bnez t1,5ae if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 636: 00340303 lb t1,3(s0) 63a: 46cd li a3,19 63c: 0066cd63 blt a3,t1,656 640: c919 beqz a0,656 642: 00140683 lb a3,1(s0) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 646: 06400593 li a1,100 if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1); 64a: 16fd addi a3,a3,-1 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 64c: 0ad5da63 bge a1,a3,700 650: 86ae mv a3,a1 652: 00d400a3 sb a3,1(s0) // health responds to overall wellbeing int8_t lo = pet.satiety; if (pet.happy < lo) lo = pet.happy; if (pet.energy < lo) lo = pet.energy; if (pet.hygiene < lo) lo = pet.hygiene; 656: 00144583 lbu a1,1(s0) 65a: 86ae mv a3,a1 65c: 05e2 slli a1,a1,0x18 65e: 85e1 srai a1,a1,0x18 660: 00b35363 bge t1,a1,666 664: 869a mv a3,t1 666: 01869593 slli a1,a3,0x18 66a: 85e1 srai a1,a1,0x18 66c: 00b7d363 bge a5,a1,672 670: 86be mv a3,a5 672: 87b6 mv a5,a3 674: 01879693 slli a3,a5,0x18 678: 86e1 srai a3,a3,0x18 67a: 00d75363 bge a4,a3,680 67e: 87ba mv a5,a4 680: 01879713 slli a4,a5,0x18 684: 8761 srai a4,a4,0x18 if (lo < 15) pet.health = clamp100(pet.health - 3); 686: 46b9 li a3,14 688: 00440783 lb a5,4(s0) 68c: 08e6c463 blt a3,a4,714 690: 17f5 addi a5,a5,-3 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 692: 06400713 li a4,100 696: 06f75a63 bge a4,a5,70a 69a: 87ba mv a5,a4 69c: 00f40223 sb a5,4(s0) notify(N_FOOD, pet.satiety); 6a0: 00040583 lb a1,0(s0) 6a4: 4501 li a0,0 6a6: 3be1 jal 47e notify(N_FUN, pet.happy); 6a8: 00140583 lb a1,1(s0) 6ac: 4505 li a0,1 6ae: 3bc1 jal 47e notify(N_ENGY, pet.energy); 6b0: 00240583 lb a1,2(s0) 6b4: 4509 li a0,2 6b6: 33e1 jal 47e notify(N_WASH, pet.hygiene); 6b8: 00340583 lb a1,3(s0) 6bc: 450d li a0,3 6be: 33c1 jal 47e // a well-kept pet matures: passive XP while every need stays healthy if (lo > 50 && !pet.sleeping) add_xp(3); check_notifications(); if (pet.health <= 0) { 6c0: 00440783 lb a5,4(s0) 6c4: 06f04d63 bgtz a5,73e pet.alive = 0; screen = SCR_DEAD; 6c8: 470d li a4,3 beep(330, 200); beep(247, 200); beep(165, 400); 6ca: 0c800593 li a1,200 6ce: 14a00513 li a0,330 pet.alive = 0; 6d2: 00040823 sb zero,16(s0) screen = SCR_DEAD; 6d6: c2e18b23 sb a4,-970(gp) # 20000032 beep(330, 200); beep(247, 200); beep(165, 400); 6da: 3935 jal 316 6dc: 0c800593 li a1,200 6e0: 0f700513 li a0,247 6e4: 390d jal 316 } } 6e6: 4402 lw s0,0(sp) 6e8: 4092 lw ra,4(sp) beep(330, 200); beep(247, 200); beep(165, 400); 6ea: 19000593 li a1,400 6ee: 0a500513 li a0,165 } 6f2: 0121 addi sp,sp,8 beep(330, 200); beep(247, 200); beep(165, 400); 6f4: b10d j 316 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 6f6: fff6c593 not a1,a3 6fa: 85fd srai a1,a1,0x1f 6fc: 8eed and a3,a3,a1 6fe: b5c9 j 5c0 700: fff6c593 not a1,a3 704: 85fd srai a1,a1,0x1f 706: 8eed and a3,a3,a1 708: b7a9 j 652 70a: fff7c713 not a4,a5 70e: 877d srai a4,a4,0x1f 710: 8ff9 and a5,a5,a4 712: b769 j 69c else if (lo > 50) pet.health = clamp100(pet.health + 2); 714: 03200693 li a3,50 718: f8e6d4e3 bge a3,a4,6a0 71c: 0789 addi a5,a5,2 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 71e: 06400713 li a4,100 722: 00f75963 bge a4,a5,734 726: 87ba mv a5,a4 728: 00f40223 sb a5,4(s0) if (lo > 50 && !pet.sleeping) add_xp(3); 72c: fa35 bnez a2,6a0 72e: 450d li a0,3 730: 3141 jal 3b0 732: b7bd j 6a0 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 734: fff7c713 not a4,a5 738: 877d srai a4,a4,0x1f 73a: 8ff9 and a5,a5,a4 73c: b7f5 j 728 } 73e: 4092 lw ra,4(sp) 740: 4402 lw s0,0(sp) 742: 0121 addi sp,sp,8 744: 8082 ret 00000746 : // ----------------------------------------------------------------- drawing static void draw_center_str(int y, const char *s) { 746: 862e mv a2,a1 int len = 0; 748: 4701 li a4,0 while (s[len]) len++; 74a: 00e607b3 add a5,a2,a4 74e: 0007c783 lbu a5,0(a5) 752: ef81 bnez a5,76a int x = (SSD1306_W - len * 8) / 2; 754: 47c1 li a5,16 756: 8f99 sub a5,a5,a4 758: 078a slli a5,a5,0x2 if (x < 0) x = 0; 75a: fff7c713 not a4,a5 75e: 877d srai a4,a4,0x1f ssd1306_drawstr(x, y, s, 1); 760: 85aa mv a1,a0 762: 4685 li a3,1 764: 00e7f533 and a0,a5,a4 768: bc45 j 218 while (s[len]) len++; 76a: 0705 addi a4,a4,1 76c: bff9 j 74a 0000076e : static Buttons read_buttons(void) { // active-low: pressed reads 0 Buttons b; b.ok = !funDigitalRead(BTN_OK); 76e: 400117b7 lui a5,0x40011 772: 4788 lw a0,8(a5) b.left = !funDigitalRead(BTN_LEFT); 774: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00> 778: 4798 lw a4,8(a5) b.right = !funDigitalRead(BTN_RIGHT); 77a: 479c lw a5,8(a5) b.ok = !funDigitalRead(BTN_OK); 77c: fff54513 not a0,a0 b.left = !funDigitalRead(BTN_LEFT); 780: 8319 srli a4,a4,0x6 782: fff74713 not a4,a4 b.right = !funDigitalRead(BTN_RIGHT); 786: 8395 srli a5,a5,0x5 788: fff7c793 not a5,a5 return b; 78c: 8b05 andi a4,a4,1 78e: 8905 andi a0,a0,1 790: 0722 slli a4,a4,0x8 792: 8b85 andi a5,a5,1 { 794: 1171 addi sp,sp,-4 return b; 796: 07c2 slli a5,a5,0x10 798: 8d59 or a0,a0,a4 } 79a: 8d5d or a0,a0,a5 79c: 0111 addi sp,sp,4 79e: 8082 ret 000007a0 : void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) 7a0: 87b2 mv a5,a2 7a2: 1131 addi sp,sp,-20 if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; 7a4: fff78713 addi a4,a5,-1 void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) 7a8: 8636 mv a2,a3 7aa: c806 sw ra,16(sp) 7ac: c622 sw s0,12(sp) 7ae: c426 sw s1,8(sp) if((x+w-1) >= SSD1306_W) w = SSD1306_W-x; 7b0: 972a add a4,a4,a0 7b2: 07f00693 li a3,127 7b6: 00e6f563 bgeu a3,a4,7c0 7ba: 08000793 li a5,128 7be: 8f89 sub a5,a5,a0 7c0: 00f50433 add s0,a0,a5 while (w--) 7c4: 00851763 bne a0,s0,7d2 } 7c8: 40c2 lw ra,16(sp) 7ca: 4432 lw s0,12(sp) 7cc: 44a2 lw s1,8(sp) 7ce: 0151 addi sp,sp,20 7d0: 8082 ret ssd1306_drawPixel(x++, y, color); 7d2: 00150493 addi s1,a0,1 7d6: c232 sw a2,4(sp) 7d8: c02e sw a1,0(sp) 7da: 326d jal 184 7dc: 4612 lw a2,4(sp) 7de: 4582 lw a1,0(sp) 7e0: 8526 mv a0,s1 7e2: b7cd j 7c4 000007e4 : void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) 7e4: fd810113 addi sp,sp,-40 steep = (gfx_abs(y1 - y0) > gfx_abs(x1 - x0)); 7e8: 40b68333 sub t1,a3,a1 void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) 7ec: d022 sw s0,32(sp) 7ee: 8436 mv s0,a3 return (x<0) ? -x : x; 7f0: 41f35693 srai a3,t1,0x1f 7f4: 0066c333 xor t1,a3,t1 steep = (gfx_abs(y1 - y0) > gfx_abs(x1 - x0)); 7f8: 40a602b3 sub t0,a2,a0 return (x<0) ? -x : x; 7fc: 40d30333 sub t1,t1,a3 800: 41f2d693 srai a3,t0,0x1f 804: 0056c2b3 xor t0,a3,t0 void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) 808: ce26 sw s1,28(sp) 80a: d206 sw ra,36(sp) return (x<0) ? -x : x; 80c: 40d282b3 sub t0,t0,a3 void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color) 810: 84ae mv s1,a1 812: 87b2 mv a5,a2 if(steep) 814: 0062c763 blt t0,t1,822 818: 86a2 mv a3,s0 81a: 84aa mv s1,a0 81c: 8432 mv s0,a2 81e: 87b6 mv a5,a3 820: 852e mv a0,a1 if(x0 > x1) 822: 00944863 blt s0,s1,832 826: 86be mv a3,a5 828: 87aa mv a5,a0 82a: 8536 mv a0,a3 82c: 86a2 mv a3,s0 82e: 8426 mv s0,s1 830: 84b6 mv s1,a3 deltay = gfx_abs(y1 - y0); 832: 40f503b3 sub t2,a0,a5 return (x<0) ? -x : x; 836: 41f3d693 srai a3,t2,0x1f deltax = x1 - x0; 83a: 40848733 sub a4,s1,s0 return (x<0) ? -x : x; 83e: 0076c3b3 xor t2,a3,t2 842: 40d383b3 sub t2,t2,a3 error = deltax/2; 846: 01f75693 srli a3,a4,0x1f 84a: 96ba add a3,a3,a4 deltax = x1 - x0; 84c: c23a sw a4,4(sp) ystep = -1; 84e: 577d li a4,-1 850: c03a sw a4,0(sp) error = deltax/2; 852: 8685 srai a3,a3,0x1 if(y0 < y1) 854: 00a7d463 bge a5,a0,85c ystep = 1; 858: 4705 li a4,1 85a: c03a sw a4,0(sp) for(x=x0;x<=x1;x++) 85c: 0084d863 bge s1,s0,86c } 860: 5092 lw ra,36(sp) 862: 5402 lw s0,32(sp) 864: 44f2 lw s1,28(sp) 866: 02810113 addi sp,sp,40 86a: 8082 ret 86c: cc36 sw a3,24(sp) 86e: ca1e sw t2,20(sp) 870: c816 sw t0,16(sp) 872: c61a sw t1,12(sp) ssd1306_drawPixel(y, x, color); 874: 4601 li a2,0 if(steep) 876: 0262d563 bge t0,t1,8a0 ssd1306_drawPixel(y, x, color); 87a: 853e mv a0,a5 87c: 85a2 mv a1,s0 87e: c43e sw a5,8(sp) 880: 3211 jal 184 882: 47a2 lw a5,8(sp) 884: 4332 lw t1,12(sp) 886: 42c2 lw t0,16(sp) 888: 43d2 lw t2,20(sp) 88a: 46e2 lw a3,24(sp) error = error - deltay; 88c: 407686b3 sub a3,a3,t2 if(error < 0) 890: 0006d663 bgez a3,89c y = y + ystep; 894: 4702 lw a4,0(sp) 896: 97ba add a5,a5,a4 error = error + deltax; 898: 4712 lw a4,4(sp) 89a: 96ba add a3,a3,a4 for(x=x0;x<=x1;x++) 89c: 0405 addi s0,s0,1 89e: bf7d j 85c ssd1306_drawPixel(x, y, color); 8a0: 85be mv a1,a5 8a2: 8522 mv a0,s0 8a4: c43e sw a5,8(sp) 8a6: 38f9 jal 184 8a8: 46e2 lw a3,24(sp) 8aa: 43d2 lw t2,20(sp) 8ac: 42c2 lw t0,16(sp) 8ae: 4332 lw t1,12(sp) 8b0: 47a2 lw a5,8(sp) 8b2: bfe9 j 88c 000008b4 : if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 8b4: 07f00793 li a5,127 8b8: 04a7c063 blt a5,a0,8f8 void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) 8bc: 1141 addi sp,sp,-16 8be: c422 sw s0,8(sp) 8c0: c606 sw ra,12(sp) 8c2: c226 sw s1,4(sp) if((y+h-1) >= SSD1306_H) h = SSD1306_H-y; 8c4: 00c587b3 add a5,a1,a2 8c8: 04000713 li a4,64 8cc: 842e mv s0,a1 8ce: 00f75463 bge a4,a5,8d6 8d2: 40b70633 sub a2,a4,a1 8d6: 008604b3 add s1,a2,s0 while(h--) 8da: 00941763 bne s0,s1,8e8 } 8de: 40b2 lw ra,12(sp) 8e0: 4422 lw s0,8(sp) 8e2: 4492 lw s1,4(sp) 8e4: 0141 addi sp,sp,16 8e6: 8082 ret ssd1306_drawPixel(x, y++, color); 8e8: 85a2 mv a1,s0 8ea: 4605 li a2,1 8ec: c02a sw a0,0(sp) 8ee: 897ff0ef jal 184 8f2: 4502 lw a0,0(sp) 8f4: 0405 addi s0,s0,1 8f6: b7d5 j 8da 8f8: 8082 ret 000008fa : void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) 8fa: 1131 addi sp,sp,-20 8fc: c426 sw s1,8(sp) 8fe: 84b2 mv s1,a2 ssd1306_drawFastVLine(x, y, h, color); 900: 8636 mv a2,a3 void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color) 902: c806 sw ra,16(sp) 904: c236 sw a3,4(sp) 906: c622 sw s0,12(sp) 908: c02e sw a1,0(sp) 90a: 842a mv s0,a0 ssd1306_drawFastVLine(x, y, h, color); 90c: 3765 jal 8b4 ssd1306_drawFastVLine(x+w-1, y, h, color); 90e: 4612 lw a2,4(sp) 910: 4582 lw a1,0(sp) 912: fff48513 addi a0,s1,-1 916: 9522 add a0,a0,s0 918: 3f71 jal 8b4 91a: 4582 lw a1,0(sp) 91c: 4685 li a3,1 91e: 8626 mv a2,s1 920: 8522 mv a0,s0 922: 3dbd jal 7a0 ssd1306_drawFastHLine(x, y+h-1, w, color); 924: 4782 lw a5,0(sp) 926: fff78593 addi a1,a5,-1 92a: 4792 lw a5,4(sp) 92c: 95be add a1,a1,a5 if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 92e: 03f00793 li a5,63 932: 00b7ea63 bltu a5,a1,946 936: 8522 mv a0,s0 } 938: 4432 lw s0,12(sp) 93a: 40c2 lw ra,16(sp) 93c: 8626 mv a2,s1 93e: 44a2 lw s1,8(sp) 940: 4685 li a3,1 942: 0151 addi sp,sp,20 944: bdb1 j 7a0 946: 40c2 lw ra,16(sp) 948: 4432 lw s0,12(sp) 94a: 44a2 lw s1,8(sp) 94c: 0151 addi sp,sp,20 94e: 8082 ret 00000950 : { 950: 1151 addi sp,sp,-12 952: c222 sw s0,4(sp) 954: c026 sw s1,0(sp) 956: 842a mv s0,a0 958: 84b2 mv s1,a2 ssd1306_drawstr(0, y, label, 1); 95a: 4685 li a3,1 95c: 862e mv a2,a1 95e: 85aa mv a1,a0 960: 4501 li a0,0 { 962: c406 sw ra,8(sp) ssd1306_drawstr(0, y, label, 1); 964: 8b5ff0ef jal 218 ssd1306_drawRect(bx, y, bw, 7, 1); 968: 03000513 li a0,48 96c: 469d li a3,7 96e: 04c00613 li a2,76 972: 85a2 mv a1,s0 974: 3759 jal 8fa int fill = (val * (bw - 2)) / 100; 976: 00349513 slli a0,s1,0x3 97a: 9526 add a0,a0,s1 97c: 050a slli a0,a0,0x2 97e: 9526 add a0,a0,s1 980: 0506 slli a0,a0,0x1 if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 982: 06300793 li a5,99 986: 02a7d463 bge a5,a0,9ae int fill = (val * (bw - 2)) / 100; 98a: 06400593 li a1,100 98e: f12ff0ef jal a0 <__divsi3> if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 992: 4705 li a4,1 994: 00e405b3 add a1,s0,a4 } 998: 4412 lw s0,4(sp) 99a: 40a2 lw ra,8(sp) 99c: 4482 lw s1,0(sp) if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 99e: 0ff57613 zext.b a2,a0 9a2: 4695 li a3,5 9a4: 03100513 li a0,49 } 9a8: 0131 addi sp,sp,12 if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1); 9aa: 817ff06f j 1c0 } 9ae: 40a2 lw ra,8(sp) 9b0: 4412 lw s0,4(sp) 9b2: 4482 lw s1,0(sp) 9b4: 0131 addi sp,sp,12 9b6: 8082 ret 000009b8 : void ssd1306_drawImage(uint32_t x, uint32_t y, const unsigned char* input, uint32_t width, uint32_t height, uint32_t color_mode) { 9b8: fd810113 addi sp,sp,-40 9bc: 00e587b3 add a5,a1,a4 9c0: d222 sw s0,36(sp) 9c2: d026 sw s1,32(sp) 9c4: c82a sw a0,16(sp) 9c6: ca32 sw a2,20(sp) uint32_t bytes_to_draw = width / 8; 9c8: 0036d413 srli s0,a3,0x3 9cc: c63e sw a5,12(sp) 9ce: 4381 li t2,0 if (y_absolute >= SSD1306_H) { 9d0: 03f00793 li a5,63 9d4: 08b7ed63 bltu a5,a1,a6e uint32_t v_mask = 1 << (y_absolute & 7); 9d8: 0075f793 andi a5,a1,7 9dc: 4705 li a4,1 9de: 00f717b3 sll a5,a4,a5 9e2: c03e sw a5,0(sp) uint32_t input_byte = input[byte + line * bytes_to_draw]; 9e4: 47d2 lw a5,20(sp) for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { 9e6: 4681 li a3,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; 9e8: 979e add a5,a5,t2 9ea: cc3e sw a5,24(sp) buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); 9ec: 0035d793 srli a5,a1,0x3 9f0: 079e slli a5,a5,0x7 9f2: ce3e sw a5,28(sp) uint32_t input_byte = input[byte + line * bytes_to_draw]; 9f4: 47e2 lw a5,24(sp) x_absolute = x + 8 * byte + pixel; 9f6: 00369293 slli t0,a3,0x3 for (pixel = 0; pixel < 8; pixel++) { 9fa: 4701 li a4,0 uint32_t input_byte = input[byte + line * bytes_to_draw]; 9fc: 97b6 add a5,a5,a3 9fe: 0007c783 lbu a5,0(a5) a02: c23e sw a5,4(sp) x_absolute = x + 8 * byte + pixel; a04: 47c2 lw a5,16(sp) a06: 92be add t0,t0,a5 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); a08: 47f2 lw a5,28(sp) a0a: 005784b3 add s1,a5,t0 if (x_absolute >= SSD1306_W) { a0e: 00e287b3 add a5,t0,a4 a12: 07f00613 li a2,127 a16: 04f66463 bltu a2,a5,a5e uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) a1a: 4512 lw a0,4(sp) a1c: 08000793 li a5,128 a20: 40e7d7b3 sra a5,a5,a4 a24: 8fe9 and a5,a5,a0 buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8); a26: 00e48633 add a2,s1,a4 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); a2a: c5c18513 addi a0,gp,-932 # 20000058 a2e: 9532 add a0,a0,a2 a30: 00014303 lbu t1,0(sp) uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default) a34: c43e sw a5,8(sp) ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); a36: 00054783 lbu a5,0(a0) a3a: fff34613 not a2,t1 for (pixel = 0; pixel < 8; pixel++) { a3e: 0705 addi a4,a4,1 ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0); a40: 8e7d and a2,a2,a5 a42: 47a2 lw a5,8(sp) a44: 00f037b3 snez a5,a5 a48: 40f007b3 neg a5,a5 a4c: 00f37333 and t1,t1,a5 a50: 00666633 or a2,a2,t1 a54: 00c50023 sb a2,0(a0) for (pixel = 0; pixel < 8; pixel++) { a58: 47a1 li a5,8 a5a: faf71ae3 bne a4,a5,a0e for (uint32_t byte = 0; byte < bytes_to_draw; byte++) { a5e: 0685 addi a3,a3,1 a60: f8d41ae3 bne s0,a3,9f4 for (uint32_t line = 0; line < height; line++) { a64: 47b2 lw a5,12(sp) a66: 0585 addi a1,a1,1 a68: 93a2 add t2,t2,s0 a6a: f6b793e3 bne a5,a1,9d0 } a6e: 5412 lw s0,36(sp) a70: 5482 lw s1,32(sp) a72: 02810113 addi sp,sp,40 a76: 8082 ret 00000a78 : uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) { int32_t timeout; // wait for not busy timeout = TIMEOUT_MAX; a78: 6761 lui a4,0x18 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); a7a: 400057b7 lui a5,0x40005 timeout = TIMEOUT_MAX; a7e: 6a070713 addi a4,a4,1696 # 186a0 while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--)); a82: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00> a86: 567d li a2,-1 a88: 0187d683 lhu a3,24(a5) a8c: 8a89 andi a3,a3,2 a8e: c2f9 beqz a3,b54 a90: 177d addi a4,a4,-1 a92: fec71be3 bne a4,a2,a88 uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz) a96: 1171 addi sp,sp,-4 a98: c006 sw ra,0(sp) ssd1306_i2c_setup(); a9a: e96ff0ef jal 130 // set STOP condition I2C1->CTLR1 |= I2C_CTLR1_STOP; // we're happy return 0; } a9e: 4082 lw ra,0(sp) return ssd1306_i2c_error(0); aa0: 4505 li a0,1 } aa2: 0111 addi sp,sp,4 aa4: 8082 ret aa6: 67e1 lui a5,0x18 aa8: 6a178793 addi a5,a5,1697 # 186a1 while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); aac: 01475683 lhu a3,20(a4) ab0: 0806f693 andi a3,a3,128 ab4: e681 bnez a3,abc ab6: 17fd addi a5,a5,-1 ab8: fbf5 bnez a5,aac aba: bff1 j a96 I2C1->DATAR = *data++; abc: 00054783 lbu a5,0(a0) ac0: 0505 addi a0,a0,1 ac2: 00f71823 sh a5,16(a4) while(sz--) ac6: feb510e3 bne a0,a1,aa6 timeout = TIMEOUT_MAX; aca: 66e1 lui a3,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); acc: 40005737 lui a4,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); ad0: 00070637 lui a2,0x70 timeout = TIMEOUT_MAX; ad4: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); ad8: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); adc: 08460613 addi a2,a2,132 # 70084 ae0: 55fd li a1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); ae2: 01475503 lhu a0,20(a4) ae6: 01875783 lhu a5,24(a4) aea: 07c2 slli a5,a5,0x10 aec: 8fc9 or a5,a5,a0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--)); aee: 8ff1 and a5,a5,a2 af0: 00c78663 beq a5,a2,afc af4: 16fd addi a3,a3,-1 af6: feb696e3 bne a3,a1,ae2 afa: bf71 j a96 I2C1->CTLR1 |= I2C_CTLR1_STOP; afc: 00075783 lhu a5,0(a4) return 0; b00: 4501 li a0,0 I2C1->CTLR1 |= I2C_CTLR1_STOP; b02: 2007e793 ori a5,a5,512 b06: 00f71023 sh a5,0(a4) } b0a: 8082 ret while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--)); b0c: 40005737 lui a4,0x40005 b10: 95aa add a1,a1,a0 b12: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> b16: bf45 j ac6 I2C1->DATAR = addr<<1; b18: 07800793 li a5,120 b1c: 00f71823 sh a5,16(a4) timeout = TIMEOUT_MAX; b20: 6661 lui a2,0x18 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b22: 400056b7 lui a3,0x40005 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); b26: 00070737 lui a4,0x70 timeout = TIMEOUT_MAX; b2a: 6a060613 addi a2,a2,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b2e: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); b32: 08270713 addi a4,a4,130 # 70082 b36: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b38: 0146d283 lhu t0,20(a3) b3c: 0186d783 lhu a5,24(a3) b40: 07c2 slli a5,a5,0x10 b42: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--)); b46: 8ff9 and a5,a5,a4 b48: fce782e3 beq a5,a4,b0c b4c: 167d addi a2,a2,-1 b4e: fe6615e3 bne a2,t1,b38 b52: b791 j a96 I2C1->CTLR1 |= I2C_CTLR1_START; b54: 0007d703 lhu a4,0(a5) timeout = TIMEOUT_MAX; b58: 66e1 lui a3,0x18 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); b5a: 00030637 lui a2,0x30 I2C1->CTLR1 |= I2C_CTLR1_START; b5e: 10076713 ori a4,a4,256 b62: 00e79023 sh a4,0(a5) uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b66: 40005737 lui a4,0x40005 timeout = TIMEOUT_MAX; b6a: 6a068693 addi a3,a3,1696 # 186a0 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b6e: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00> while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); b72: 0605 addi a2,a2,1 # 30001 b74: 537d li t1,-1 uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16); b76: 01475283 lhu t0,20(a4) b7a: 01875783 lhu a5,24(a4) b7e: 07c2 slli a5,a5,0x10 b80: 0057e7b3 or a5,a5,t0 while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--)); b84: 8ff1 and a5,a5,a2 b86: f8c789e3 beq a5,a2,b18 b8a: 16fd addi a3,a3,-1 b8c: fe6695e3 bne a3,t1,b76 b90: b719 j a96 00000b92 : { b92: fd810113 addi sp,sp,-40 /* build command or data packets */ if(cmd) { pkt[0] = 0; pkt[1] = *data; b96: 00a100a3 sb a0,1(sp) else { pkt[0] = 0x40; memcpy(&pkt[1], data, sz); } return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); b9a: 4589 li a1,2 b9c: 850a mv a0,sp b9e: d206 sw ra,36(sp) pkt[0] = 0; ba0: 00010023 sb zero,0(sp) return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); ba4: 3dd1 jal a78 } ba6: 5092 lw ra,36(sp) ba8: 02810113 addi sp,sp,40 bac: 8082 ret 00000bae : asm volatile( "\n\ bae: 20000197 auipc gp,0x20000 bb2: 84e18193 addi gp,gp,-1970 # 200003fc <__global_pointer$> bb6: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack> bba: 6509 lui a0,0x2 bbc: 88050513 addi a0,a0,-1920 # 1880 bc0: 30051073 csrw mstatus,a0 bc4: fffff697 auipc a3,0xfffff bc8: 43c68693 addi a3,a3,1084 # 0 bcc: 0036e693 ori a3,a3,3 bd0: 30569073 csrw mtvec,a3 asm volatile( bd4: c2818513 addi a0,gp,-984 # 20000024 bd8: 05c18593 addi a1,gp,92 # 20000458 <_ebss> bdc: 4601 li a2,0 bde: 00b55663 bge a0,a1,bea be2: c110 sw a2,0(a0) be4: 0511 addi a0,a0,4 be6: feb54ee3 blt a0,a1,be2 bea: 00002517 auipc a0,0x2 bee: 40650513 addi a0,a0,1030 # 2ff0 <_data_lma> bf2: c0418593 addi a1,gp,-1020 # 20000000 bf6: c2818613 addi a2,gp,-984 # 20000024 bfa: 00c58863 beq a1,a2,c0a bfe: 4114 lw a3,0(a0) c00: c194 sw a3,0(a1) c02: 0511 addi a0,a0,4 c04: 0591 addi a1,a1,4 c06: fec59ae3 bne a1,a2,bfa SysTick->CTLR = 1; c0a: e000f7b7 lui a5,0xe000f c0e: 4705 li a4,1 c10: c398 sw a4,0(a5) asm volatile( c12: 6785 lui a5,0x1 c14: d0a78793 addi a5,a5,-758 # d0a
c18: 34179073 csrw mepc,a5 c1c: 30200073 mret 00000c20 : asm volatile( "1: j 1b" ); c20: a001 j c20 00000c22 : RCC->INTR |= RCC_CSSC; // clear the clock security int flag c22: 40021737 lui a4,0x40021 c26: 471c lw a5,8(a4) c28: 008006b7 lui a3,0x800 c2c: 8fd5 or a5,a5,a3 c2e: c71c sw a5,8(a4) 00000c30 : WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; } c30: 962a add a2,a2,a0 c32: 87aa mv a5,a0 c34: 00c79363 bne a5,a2,c3a c38: 8082 ret c3a: 00b78023 sb a1,0(a5) c3e: 0785 addi a5,a5,1 c40: bfd5 j c34 00000c42 : memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer)); c42: 40000613 li a2,1024 c46: 4581 li a1,0 c48: c5c18513 addi a0,gp,-932 # 20000058 c4c: b7d5 j c30 00000c4e : for (; n; n--) *d++ = *s++; c4e: 4781 li a5,0 c50: 00f61363 bne a2,a5,c56 } c54: 8082 ret for (; n; n--) *d++ = *s++; c56: 00f58733 add a4,a1,a5 c5a: 00074683 lbu a3,0(a4) # 40021000 <_eusrstack+0x20020800> c5e: 00f50733 add a4,a0,a5 c62: 0785 addi a5,a5,1 c64: 00d70023 sb a3,0(a4) c68: b7e5 j c50 00000c6a : { c6a: 7179 addi sp,sp,-48 ssd1306_cmd(SSD1306_COLUMNADDR); c6c: 02100513 li a0,33 { c70: d606 sw ra,44(sp) c72: d422 sw s0,40(sp) c74: d226 sw s1,36(sp) ssd1306_cmd(SSD1306_COLUMNADDR); c76: 3f31 jal b92 ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset) c78: 4501 li a0,0 c7a: 3f21 jal b92 ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset) c7c: 07f00513 li a0,127 c80: 3f09 jal b92 ssd1306_cmd(SSD1306_PAGEADDR); c82: 02200513 li a0,34 c86: 3731 jal b92 ssd1306_cmd(0); // Page start address (0 = reset) c88: 4501 li a0,0 c8a: 3721 jal b92 ssd1306_cmd(7); // Page end address c8c: 451d li a0,7 c8e: c5c18413 addi s0,gp,-932 # 20000058 c92: 3701 jal b92 for(i=0;i return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); cac: 02100593 li a1,33 cb0: 850a mv a0,sp cb2: 02040413 addi s0,s0,32 cb6: 33c9 jal a78 cb8: fe9410e3 bne s0,s1,c98 } cbc: 50b2 lw ra,44(sp) cbe: 5422 lw s0,40(sp) cc0: 5492 lw s1,36(sp) cc2: 6145 addi sp,sp,48 cc4: 8082 ret 00000cc6 : //#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 cc6: 400227b7 lui a5,0x40022 cca: 4705 li a4,1 ccc: 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; cce: 400217b7 lui a5,0x40021 RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. cd2: 01080737 lui a4,0x1080 RCC->CFGR0 = BASE_CFGR0; cd6: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. cda: 08170713 addi a4,a4,129 # 1080081 cde: 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. ce0: 009f0737 lui a4,0x9f0 ce4: 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 ce6: 4398 lw a4,0(a5) ce8: 00671693 slli a3,a4,0x6 cec: fe06dde3 bgez a3,ce6 #if defined(CH32H41x) RCC->PLLCFGR |= RCC_SYSPLL_GATE; #endif uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW cf0: 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 cf2: 400216b7 lui a3,0x40021 uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW cf6: 9b71 andi a4,a4,-4 RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source cf8: 00276713 ori a4,a4,2 cfc: c3d8 sw a4,4(a5) while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source cfe: 4721 li a4,8 d00: 42dc lw a5,4(a3) d02: 8bb1 andi a5,a5,12 d04: fee79ee3 bne a5,a4,d00 SetupDebugPrintf(); #endif #if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS CallConstructors(); #endif } d08: 8082 ret 00000d0a
: } } // ----------------------------------------------------------------- main int main(void) { d0a: 7119 addi sp,sp,-128 d0c: de86 sw ra,124(sp) d0e: dca2 sw s0,120(sp) d10: daa6 sw s1,116(sp) SystemInit(); d12: 3f55 jal cc6 funGpioInitAll(); d14: 400214b7 lui s1,0x40021 d18: 4c9c lw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d1a: 40011437 lui s0,0x40011 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d1e: 76fd lui a3,0xfffff funGpioInitAll(); d20: 0357e793 ori a5,a5,53 d24: cc9c sw a5,24(s1) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d26: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000> d2a: 4398 lw a4,0(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d2c: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff> funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); d30: f1000637 lui a2,0xf1000 funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d34: f0f77713 andi a4,a4,-241 d38: 01076713 ori a4,a4,16 d3c: c398 sw a4,0(a5) funDigitalWrite(LED_PIN, FUN_LOW); d3e: 00020737 lui a4,0x20 d42: cb98 sw a4,16(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d44: 40040793 addi a5,s0,1024 d48: 4398 lw a4,0(a5) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); d4a: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff> funDigitalWrite(BTN_OK, FUN_HIGH); d4c: 4585 li a1,1 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d4e: 8f75 and a4,a4,a3 d50: 10076713 ori a4,a4,256 d54: c398 sw a4,0(a5) funDigitalWrite(BUZZER, FUN_LOW); d56: 00040737 lui a4,0x40 d5a: cb98 sw a4,16(a5) funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); d5c: 4018 lw a4,0(s0) AFIO->EXTICR |= AFIO_EXTICR_EXTI0_PC | // OK on PC0 d5e: 40010537 lui a0,0x40010 funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); d62: 9b41 andi a4,a4,-16 d64: 00876713 ori a4,a4,8 d68: c018 sw a4,0(s0) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); d6a: 4398 lw a4,0(a5) d6c: 8f71 and a4,a4,a2 d6e: 08000637 lui a2,0x8000 d72: 8f51 or a4,a4,a2 d74: c398 sw a4,0(a5) funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD); d76: 4398 lw a4,0(a5) d78: ff100637 lui a2,0xff100 d7c: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff> d7e: 8f71 and a4,a4,a2 d80: 00800637 lui a2,0x800 d84: 8f51 or a4,a4,a2 d86: c398 sw a4,0(a5) funDigitalWrite(BTN_OK, FUN_HIGH); d88: c80c sw a1,16(s0) funDigitalWrite(BTN_LEFT, FUN_HIGH); d8a: 04000613 li a2,64 d8e: cb90 sw a2,16(a5) funDigitalWrite(BTN_RIGHT, FUN_HIGH); d90: 02000713 li a4,32 d94: cb98 sw a4,16(a5) AFIO->EXTICR |= AFIO_EXTICR_EXTI0_PC | // OK on PC0 d96: 451c lw a5,8(a0) d98: 6711 lui a4,0x4 d9a: c0270713 addi a4,a4,-1022 # 3c02 d9e: 8fd9 or a5,a5,a4 da0: c51c sw a5,8(a0) EXTI->INTENR |= EXTI_Line0 | EXTI_Line5 | EXTI_Line6; da2: 40050793 addi a5,a0,1024 # 40010400 <_eusrstack+0x2000fc00> da6: 4398 lw a4,0(a5) } // Enable Interrupt (by interrupt number) RV_STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) { NVIC->IENR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); da8: e000e537 lui a0,0xe000e dac: 06176713 ori a4,a4,97 db0: c398 sw a4,0(a5) EXTI->FTENR |= EXTI_Line0 | EXTI_Line5 | EXTI_Line6; // press == falling edge db2: 47d8 lw a4,12(a5) db4: 06176713 ori a4,a4,97 db8: c7d8 sw a4,12(a5) dba: 001007b7 lui a5,0x100 dbe: 10f52023 sw a5,256(a0) # e000e100 <_eusrstack+0xc000d900> RCC->APB1PCENR |= RCC_APB1Periph_TIM2; dc2: 4cdc lw a5,28(s1) TIM2->PSC = 23999; // 24 MHz / 24000 = 1 kHz (1 ms/count) dc4: 6719 lui a4,0x6 dc6: dbf70713 addi a4,a4,-577 # 5dbf RCC->APB1PCENR |= RCC_APB1Periph_TIM2; dca: 8fcd or a5,a5,a1 dcc: ccdc sw a5,28(s1) TIM2->PSC = 23999; // 24 MHz / 24000 = 1 kHz (1 ms/count) dce: 400007b7 lui a5,0x40000 dd2: 02e79423 sh a4,40(a5) # 40000028 <_eusrstack+0x1ffff828> TIM2->ATRLR = TICK_MS - 1; // overflow once per game tick dd6: 6711 lui a4,0x4 dd8: a9770713 addi a4,a4,-1385 # 3a97 ddc: 02e79623 sh a4,44(a5) TIM2->SWEVGR = TIM_PSCReloadMode_Immediate; // latch PSC/ARR now de0: 00b79a23 sh a1,20(a5) TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; de4: 5779 li a4,-2 de6: 00e79823 sh a4,16(a5) TIM2->DMAINTENR |= TIM_UIE; // enable update interrupt dea: 00c7d703 lhu a4,12(a5) dee: 8f4d or a4,a4,a1 df0: 00e79623 sh a4,12(a5) df4: 10c52223 sw a2,260(a0) gpio_setup(); lowpower_setup(); // button-wake EXTI + periodic-check timer Delay_Ms(120); // let the OLED rail settle df8: 000b0537 lui a0,0xb0 dfc: c8050513 addi a0,a0,-896 # afc80 e00: b1eff0ef jal 11e * init I2C and GPIO */ uint8_t ssd1306_i2c_init(void) { // Enable GPIOC and I2C RCC->APB1PCENR |= RCC_APB1Periph_I2C1; e04: 4cdc lw a5,28(s1) e06: 00200737 lui a4,0x200 e0a: 8fd9 or a5,a5,a4 e0c: 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; e0e: 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)); e10: 777d lui a4,0xfffff e12: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO; e16: 0117e793 ori a5,a5,17 e1a: cc9c sw a5,24(s1) GPIOC->CFGLR &= ~(0xf<<(4*1)); e1c: 401c lw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); e1e: 6705 lui a4,0x1 e20: d0070713 addi a4,a4,-768 # d00 GPIOC->CFGLR &= ~(0xf<<(4*1)); e24: f0f7f793 andi a5,a5,-241 e28: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); e2a: 401c lw a5,0(s0) e2c: 0d07e793 ori a5,a5,208 e30: c01c sw a5,0(s0) GPIOC->CFGLR &= ~(0xf<<(4*2)); e32: 401c lw a5,0(s0) e34: 8ff5 and a5,a5,a3 e36: c01c sw a5,0(s0) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); e38: 401c lw a5,0(s0) e3a: 8fd9 or a5,a5,a4 e3c: 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; e3e: 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(); e40: af0ff0ef jal 130 e44: 57040413 addi s0,s0,1392 # 2570 ssd1306_setbuf(0); e48: 3bed jal c42 while(*cmd_list != SSD1306_TERMINATE_CMDS) e4a: 00044503 lbu a0,0(s0) e4e: 0ff00793 li a5,255 e52: 00f51463 bne a0,a5,e5a { if(ssd1306_cmd(*cmd_list++)) return 1; } ssd1306_refresh(); e56: 3d11 jal c6a #endif return 0; e58: a021 j e60 if(ssd1306_cmd(*cmd_list++)) e5a: 0405 addi s0,s0,1 e5c: 3b1d jal b92 e5e: d575 beqz a0,e4a ssd1306_setbuf(0); e60: 6489 lui s1,0x2 e62: 33c5 jal c42 for (uint8_t i = 0; i < 5; i++) { e64: 58c48493 addi s1,s1,1420 # 258c ssd1306_setbuf(0); e68: 4401 li s0,0 ssd1306_drawstr(0, i * 10, boot[i], 1); e6a: 4090 lw a2,0(s1) e6c: 4685 li a3,1 e6e: 85a2 mv a1,s0 e70: 4501 li a0,0 e72: ba6ff0ef jal 218 ssd1306_refresh(); e76: 3bd5 jal c6a beep(1200 + i * 120, 25); e78: 00141513 slli a0,s0,0x1 e7c: 9522 add a0,a0,s0 e7e: 050a slli a0,a0,0x2 e80: 4b050513 addi a0,a0,1200 e84: 0542 slli a0,a0,0x10 e86: 8141 srli a0,a0,0x10 e88: 45e5 li a1,25 e8a: c8cff0ef jal 316 Delay_Ms(220); e8e: 00142537 lui a0,0x142 e92: 44050513 addi a0,a0,1088 # 142440 e96: a88ff0ef jal 11e for (uint8_t i = 0; i < 5; i++) { e9a: 0429 addi s0,s0,10 e9c: 03200793 li a5,50 ea0: 0491 addi s1,s1,4 ea2: fcf414e3 bne s0,a5,e6a draw_center_str(54, "press any key"); ea6: 6589 lui a1,0x2 ea8: b0c58593 addi a1,a1,-1268 # 1b0c eac: 03600513 li a0,54 eb0: 897ff0ef jal 746 ssd1306_refresh(); eb4: 3b5d jal c6a beep(988, 120); eb6: 07800593 li a1,120 eba: 3dc00513 li a0,988 ebe: c58ff0ef jal 316 ec2: 0c800413 li s0,200 Buttons b = read_buttons(); ec6: 8a9ff0ef jal 76e eca: 00855713 srli a4,a0,0x8 ece: 01055793 srli a5,a0,0x10 ed2: 04e100a3 sb a4,65(sp) if (b.ok || b.left || b.right) break; ed6: 8f49 or a4,a4,a0 Buttons b = read_buttons(); ed8: 04f10123 sb a5,66(sp) if (b.ok || b.left || b.right) break; edc: 8fd9 or a5,a5,a4 Buttons b = read_buttons(); ede: 04a10023 sb a0,64(sp) if (b.ok || b.left || b.right) break; ee2: 0ff7f793 zext.b a5,a5 ee6: eb81 bnez a5,ef6 Delay_Ms(20); ee8: 6575 lui a0,0x1d eea: 4c050513 addi a0,a0,1216 # 1d4c0 for (int i = 0; i < 200; i++) { eee: 147d addi s0,s0,-1 Delay_Ms(20); ef0: a2eff0ef jal 11e for (int i = 0; i < 200; i++) { ef4: f869 bnez s0,ec6 while (1) { led_blink(); Delay_Ms(700); } } ssd1306_init(); splash(); screen = SCR_SELECT; // pick a species before a pet is born ef6: c2018b23 sb zero,-970(gp) # 20000032 Buttons prev = {0, 0, 0}; efa: 4481 li s1,0 efc: 4701 li a4,0 efe: 4781 li a5,0 while (1) { if (!disp_on) { f00: c051c683 lbu a3,-1019(gp) # 20000001 f04: eadd bnez a3,fba TIM2->CNT = 0; f06: 400007b7 lui a5,0x40000 TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; f0a: 52f9 li t0,-2 } // WFI - wait for interrupt (like a light sleep) __attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFI(void) { NVIC->SCTLR &= ~(1<<3); // wfi f0c: e000f5b7 lui a1,0xe000f exti_wake = 0; f10: c2018aa3 sb zero,-971(gp) # 20000031 tick_wake = 0; f14: c2018a23 sb zero,-972(gp) # 20000030 TIM2->CNT = 0; f18: 02079223 sh zero,36(a5) # 40000024 <_eusrstack+0x1ffff824> TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; f1c: 00579823 sh t0,16(a5) TIM2->CTLR1 |= TIM_CEN; // arm the periodic wake f20: 0007d703 lhu a4,0(a5) f24: 00176713 ori a4,a4,1 f28: 00e79023 sh a4,0(a5) f2c: d105a703 lw a4,-752(a1) # e000ed10 <_eusrstack+0xc000e510> f30: 9b5d andi a4,a4,-9 f32: d0e5a823 sw a4,-752(a1) __ASM volatile ("wfi"); f36: 10500073 wfi TIM2->CTLR1 &= ~TIM_CEN; // halt it while we're awake f3a: 0007d703 lhu a4,0(a5) f3e: 66c1 lui a3,0x10 f40: 16f9 addi a3,a3,-2 # fffe f42: 8f75 and a4,a4,a3 f44: 00e79023 sh a4,0(a5) if (exti_wake) { // a button: bring the screen back f48: c351c703 lbu a4,-971(gp) # 20000031 f4c: c721 beqz a4,f94 ssd1306_cmd(SSD1306_DISPLAYON); f4e: 0af00513 li a0,175 f52: 3181 jal b92 disp_on = 1; f54: 4785 li a5,1 f56: c0f182a3 sb a5,-1019(gp) # 20000001 idle_frames = 0; f5a: c201a823 sw zero,-976(gp) # 2000002c tick_acc = 0; f5e: c2019523 sh zero,-982(gp) # 20000026 // Display is off: hand the core to WFI light-sleep, waking only // for button presses or the periodic background check. It returns // once the screen is lit again; swallow whatever press woke us so // it just wakes the display rather than also firing an action. enter_low_power(); prev = read_buttons(); f62: 80dff0ef jal 76e f66: 00855713 srli a4,a0,0x8 f6a: 01055793 srli a5,a0,0x10 f6e: 02e108a3 sb a4,49(sp) f72: 02f10923 sb a5,50(sp) f76: 0ff57693 zext.b a3,a0 f7a: 0ff77713 zext.b a4,a4 f7e: 0ff7f793 zext.b a5,a5 f82: 02a10823 sb a0,48(sp) f86: ca36 sw a3,20(sp) f88: cc3a sw a4,24(sp) f8a: ce3e sw a5,28(sp) beep(988, 120); f8c: 44f2 lw s1,28(sp) f8e: 4762 lw a4,24(sp) f90: 47d2 lw a5,20(sp) f92: b7bd j f00 if (pet.alive) { f94: c4818493 addi s1,gp,-952 # 20000044 f98: 0104c703 lbu a4,16(s1) f9c: db35 beqz a4,f10 game_tick(); f9e: d6eff0ef jal 50c if (!pet.alive) { // it died in its sleep: show the grave fa2: 0104c783 lbu a5,16(s1) fa6: f3a5 bnez a5,f06 ssd1306_cmd(SSD1306_DISPLAYON); fa8: 0af00513 li a0,175 fac: 36dd jal b92 disp_on = 1; fae: 4785 li a5,1 fb0: c0f182a3 sb a5,-1019(gp) # 20000001 idle_frames = 0; fb4: c201a823 sw zero,-976(gp) # 2000002c return; fb8: b76d j f62 fba: c43e sw a5,8(sp) fbc: c23a sw a4,4(sp) continue; } Buttons b = read_buttons(); fbe: fb0ff0ef jal 76e fc2: 00855613 srli a2,a0,0x8 fc6: 0ff57793 zext.b a5,a0 fca: 01055693 srli a3,a0,0x10 fce: ca3e sw a5,20(sp) fd0: 0ff67793 zext.b a5,a2 fd4: cc3e sw a5,24(sp) fd6: 0ff6f793 zext.b a5,a3 fda: ce3e sw a5,28(sp) uint8_t ok_edge = b.ok && !prev.ok; fdc: 47d2 lw a5,20(sp) Buttons b = read_buttons(); fde: 02a10a23 sb a0,52(sp) fe2: 02c10aa3 sb a2,53(sp) fe6: 02d10b23 sb a3,54(sp) uint8_t ok_edge = b.ok && !prev.ok; fea: c002 sw zero,0(sp) fec: 4712 lw a4,4(sp) fee: c789 beqz a5,ff8 ff0: 47a2 lw a5,8(sp) ff2: 0017b793 seqz a5,a5 ff6: c03e sw a5,0(sp) uint8_t left_edge = b.left && !prev.left; ff8: 46e2 lw a3,24(sp) uint8_t ok_edge = b.ok && !prev.ok; ffa: 00014783 lbu a5,0(sp) uint8_t left_edge = b.left && !prev.left; ffe: 4581 li a1,0 1000: c299 beqz a3,1006 1002: 00173593 seqz a1,a4 uint8_t right_edge = b.right && !prev.right; 1006: 4672 lw a2,28(sp) uint8_t left_edge = b.left && !prev.left; 1008: 0ff5f713 zext.b a4,a1 uint8_t right_edge = b.right && !prev.right; 100c: 4681 li a3,0 100e: c219 beqz a2,1014 1010: 0014b693 seqz a3,s1 uint8_t any_edge = ok_edge | left_edge | right_edge; 1014: 8fd9 or a5,a5,a4 1016: 8fd5 or a5,a5,a3 prev = b; if (any_edge) idle_frames = 0; 1018: c399 beqz a5,101e 101a: c201a823 sw zero,-976(gp) # 2000002c { switch (screen) { 101e: c361c703 lbu a4,-970(gp) # 20000032 1022: 4611 li a2,4 1024: 7ee66963 bltu a2,a4,1816 1028: 6609 lui a2,0x2 102a: 070a slli a4,a4,0x2 102c: ce060613 addi a2,a2,-800 # 1ce0 1030: 9732 add a4,a4,a2 1032: 4318 lw a4,0(a4) 1034: 8702 jr a4 case SCR_SELECT: if (left_edge) { 1036: c185 beqz a1,1056 sel_species = (sel_species + SPECIES_COUNT - 1) % SPECIES_COUNT; 1038: c2f1c503 lbu a0,-977(gp) # 2000002b 103c: 458d li a1,3 103e: c236 sw a3,4(sp) 1040: 0509 addi a0,a0,2 1042: 8b6ff0ef jal f8 <__modsi3> 1046: c2a187a3 sb a0,-977(gp) # 2000002b beep(1047, 25); 104a: 45e5 li a1,25 104c: 41700513 li a0,1047 1050: ac6ff0ef jal 316 1054: 4692 lw a3,4(sp) } if (right_edge) { 1056: ce91 beqz a3,1072 sel_species = (sel_species + 1) % SPECIES_COUNT; 1058: c2f1c503 lbu a0,-977(gp) # 2000002b 105c: 458d li a1,3 105e: 0505 addi a0,a0,1 1060: 898ff0ef jal f8 <__modsi3> 1064: c2a187a3 sb a0,-977(gp) # 2000002b beep(1047, 25); 1068: 45e5 li a1,25 106a: 41700513 li a0,1047 106e: aa8ff0ef jal 316 } if (ok_edge) { // born! boot the chosen species 1072: 4782 lw a5,0(sp) 1074: c3b5 beqz a5,10d8 pet.satiety = 80; 1076: 645a5737 lui a4,0x645a5 107a: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850> 107e: c4e1a423 sw a4,-952(gp) # 20000044 pet.health = 100; 1082: c4818793 addi a5,gp,-952 # 20000044 1086: 06400713 li a4,100 108a: 00e78223 sb a4,4(a5) pet.species = sel_species; 108e: c2f1c703 lbu a4,-977(gp) # 2000002b pet.age_min = 0; 1092: 00079323 sh zero,6(a5) pet.xp = 0; 1096: 00079423 sh zero,8(a5) pet.species = sel_species; 109a: 00e78523 sb a4,10(a5) pet.level = 1; 109e: 4705 li a4,1 10a0: 00e785a3 sb a4,11(a5) pet.form = FORM_PROC; 10a4: 0007a623 sw zero,12(a5) pet.alive = 1; 10a8: 00e78823 sb a4,16(a5) cursor = 0; 10ac: c2018723 sb zero,-978(gp) # 2000002a evo_anim = 0; 10b0: c4018223 sb zero,-956(gp) # 20000040 for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } 10b4: c201ae23 sw zero,-964(gp) # 20000038 pet_reset(); // sets screen = SCR_MAIN, species = sel_species beep(659, 80); beep(988, 120); 10b8: 05000593 li a1,80 10bc: 29300513 li a0,659 screen = SCR_MAIN; 10c0: c2e18b23 sb a4,-970(gp) # 20000032 for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } 10c4: c401a023 sw zero,-960(gp) # 2000003c beep(659, 80); beep(988, 120); 10c8: a4eff0ef jal 316 10cc: 07800593 li a1,120 10d0: 3dc00513 li a0,988 10d4: a42ff0ef jal 316 ssd1306_setbuf(0); 10d8: 36ad jal c42 draw_center_str(0, "~ $ adopt --pet"); 10da: 6589 lui a1,0x2 10dc: b1c58593 addi a1,a1,-1252 # 1b1c 10e0: 4501 li a0,0 10e2: e64ff0ef jal 746 if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 10e6: 4685 li a3,1 10e8: 08000613 li a2,128 10ec: 45a9 li a1,10 10ee: 4501 li a0,0 10f0: eb0ff0ef jal 7a0 ssd1306_drawImage(48, 13, species_frames[sel_species][EXP_IDLE], 10f4: c2f1c403 lbu s0,-977(gp) # 2000002b 10f8: 6789 lui a5,0x2 10fa: 6ac78793 addi a5,a5,1708 # 26ac 10fe: 00341713 slli a4,s0,0x3 1102: 8f01 sub a4,a4,s0 1104: 070a slli a4,a4,0x2 1106: 97ba add a5,a5,a4 1108: 4390 lw a2,0(a5) 110a: 02000713 li a4,32 110e: 86ba mv a3,a4 1110: 45b5 li a1,13 1112: 03000513 li a0,48 1116: 8a3ff0ef jal 9b8 p = s_cat(p, "< "); 111a: 6589 lui a1,0x2 111c: b2c58593 addi a1,a1,-1236 # 1b2c 1120: 0088 addi a0,sp,64 1122: 982ff0ef jal 2a4 p = s_cat(p, species_names[sel_species]); 1126: 6789 lui a5,0x2 1128: 040a slli s0,s0,0x2 112a: 5a078793 addi a5,a5,1440 # 25a0 112e: 97a2 add a5,a5,s0 1130: 438c lw a1,0(a5) 1132: 972ff0ef jal 2a4 p = s_cat(p, " >"); 1136: 6589 lui a1,0x2 1138: b3058593 addi a1,a1,-1232 # 1b30 113c: 968ff0ef jal 2a4 *p = 0; 1140: 00050023 sb zero,0(a0) draw_center_str(47, line); 1144: 008c addi a1,sp,64 1146: 02f00513 li a0,47 114a: dfcff0ef jal 746 draw_center_str(56, "L/R pick OK go"); 114e: 6589 lui a1,0x2 1150: b3458593 addi a1,a1,-1228 # 1b34 draw_center_str(56, "OK: respawn"); 1154: 03800513 li a0,56 1158: a98d j 15ca } draw_select(); break; case SCR_MAIN: if (left_edge) { 115a: c185 beqz a1,117a cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; 115c: c2e1c503 lbu a0,-978(gp) # 2000002a 1160: 459d li a1,7 1162: c236 sw a3,4(sp) 1164: 0519 addi a0,a0,6 1166: f93fe0ef jal f8 <__modsi3> 116a: c2a18723 sb a0,-978(gp) # 2000002a beep(1047, 25); 116e: 45e5 li a1,25 1170: 41700513 li a0,1047 1174: 9a2ff0ef jal 316 1178: 4692 lw a3,4(sp) } if (right_edge) { 117a: ce91 beqz a3,1196 cursor = (cursor + 1) % ICON_COUNT; 117c: c2e1c503 lbu a0,-978(gp) # 2000002a 1180: 459d li a1,7 1182: 0505 addi a0,a0,1 1184: f75fe0ef jal f8 <__modsi3> 1188: c2a18723 sb a0,-978(gp) # 2000002a beep(1047, 25); 118c: 45e5 li a1,25 118e: 41700513 li a0,1047 1192: 984ff0ef jal 316 } if (ok_edge) do_action(cursor); 1196: 4782 lw a5,0(sp) 1198: c4818493 addi s1,gp,-952 # 20000044 119c: 0e078e63 beqz a5,1298 switch (act) { 11a0: c2e1c783 lbu a5,-978(gp) # 2000002a 11a4: 4699 li a3,6 11a6: 0ef6e963 bltu a3,a5,1298 11aa: 6689 lui a3,0x2 11ac: 078a slli a5,a5,0x2 11ae: cf468693 addi a3,a3,-780 # 1cf4 11b2: 97b6 add a5,a5,a3 11b4: 439c lw a5,0(a5) 11b6: 8782 jr a5 pet.satiety = clamp100(pet.satiety + 30); 11b8: 00048783 lb a5,0(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 11bc: 06400713 li a4,100 pet.satiety = clamp100(pet.satiety + 30); 11c0: 07f9 addi a5,a5,30 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 11c2: 04f75563 bge a4,a5,120c 11c6: 87ba mv a5,a4 11c8: 00f48023 sb a5,0(s1) pet.hygiene = clamp100(pet.hygiene - 5); 11cc: 00348783 lb a5,3(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 11d0: 06400713 li a4,100 pet.hygiene = clamp100(pet.hygiene - 5); 11d4: 17ed addi a5,a5,-5 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 11d6: 04f75063 bge a4,a5,1216 11da: 87ba mv a5,a4 11dc: 00f481a3 sb a5,3(s1) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 11e0: 4411 li s0,4 11e2: c2818423 sb s0,-984(gp) # 20000024 11e6: 4731 li a4,12 beep(880, 60); beep(1175, 80); 11e8: 03c00593 li a1,60 11ec: 37000513 li a0,880 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 11f0: c2e18623 sb a4,-980(gp) # 20000028 beep(880, 60); beep(1175, 80); 11f4: 922ff0ef jal 316 11f8: 05000593 li a1,80 11fc: 49700513 li a0,1175 beep(784, 60); beep(1047, 60); beep(1319, 90); 1200: 916ff0ef jal 316 led_blink(); 1204: 982ff0ef jal 386 add_xp(4); 1208: 4511 li a0,4 120a: a069 j 1294 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 120c: fff7c713 not a4,a5 1210: 877d srai a4,a4,0x1f 1212: 8ff9 and a5,a5,a4 1214: bf55 j 11c8 1216: fff7c713 not a4,a5 121a: 877d srai a4,a4,0x1f 121c: 8ff9 and a5,a5,a4 121e: bf7d j 11dc if (pet.energy < 15) { beep(220, 120); break; } // too tired 1220: 00248703 lb a4,2(s1) 1224: 47b9 li a5,14 1226: 00e7c963 blt a5,a4,1238 122a: 07800593 li a1,120 122e: 0dc00513 li a0,220 beep(659, 40); 1232: 8e4ff0ef jal 316 break; 1236: a08d j 1298 pet.happy = clamp100(pet.happy + 25); 1238: 00148783 lb a5,1(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 123c: 06400693 li a3,100 pet.happy = clamp100(pet.happy + 25); 1240: 07e5 addi a5,a5,25 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1242: 38f6d763 bge a3,a5,15d0 1246: 87b6 mv a5,a3 1248: 00f480a3 sb a5,1(s1) pet.energy = clamp100(pet.energy - 12); 124c: ff470793 addi a5,a4,-12 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1250: 06400713 li a4,100 1254: 00f75363 bge a4,a5,125a 1258: 87ba mv a5,a4 125a: 00f48123 sb a5,2(s1) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 125e: 4709 li a4,2 1260: c2e18423 sb a4,-984(gp) # 20000024 beep(988, 60); beep(1319, 60); beep(1568, 90); 1264: 03c00593 li a1,60 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1268: 4731 li a4,12 beep(988, 60); beep(1319, 60); beep(1568, 90); 126a: 3dc00513 li a0,988 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 126e: c2e18623 sb a4,-980(gp) # 20000028 beep(988, 60); beep(1319, 60); beep(1568, 90); 1272: 8a4ff0ef jal 316 1276: 03c00593 li a1,60 127a: 52700513 li a0,1319 127e: 898ff0ef jal 316 1282: 62000513 li a0,1568 1286: 05a00593 li a1,90 128a: 88cff0ef jal 316 led_blink(); 128e: 8f8ff0ef jal 386 add_xp(6); 1292: 4519 li a0,6 add_xp(4); 1294: 91cff0ef jal 3b0 ssd1306_setbuf(0); 1298: 9abff0ef jal c42 draw_center_str(0, menu_labels[cursor]); 129c: c2e1c783 lbu a5,-978(gp) # 2000002a 12a0: 4501 li a0,0 12a2: d03e sw a5,32(sp) 12a4: 5702 lw a4,32(sp) 12a6: 6789 lui a5,0x2 12a8: 73078793 addi a5,a5,1840 # 2730 12ac: 070a slli a4,a4,0x2 12ae: 97ba add a5,a5,a4 12b0: 438c lw a1,0(a5) 12b2: c94ff0ef jal 746 if (pet.alive && pet.health < 30 && (frame & 8)) 12b6: 0104c783 lbu a5,16(s1) 12ba: c83e sw a5,16(sp) 12bc: c395 beqz a5,12e0 12be: 00448703 lb a4,4(s1) 12c2: 47f5 li a5,29 12c4: 00e7ce63 blt a5,a4,12e0 12c8: c381a783 lw a5,-968(gp) # 20000034 12cc: 8ba1 andi a5,a5,8 12ce: cb89 beqz a5,12e0 ssd1306_drawstr(0, 0, "!", 1); 12d0: 6609 lui a2,0x2 12d2: 4685 li a3,1 12d4: b4460613 addi a2,a2,-1212 # 1b44 12d8: 4581 li a1,0 12da: 4501 li a0,0 12dc: f3dfe0ef jal 218 bp = u_cat(bp, pet.level); 12e0: 00b4c583 lbu a1,11(s1) *bp++ = 'L'; 12e4: 04c00793 li a5,76 bp = u_cat(bp, pet.level); 12e8: 03910513 addi a0,sp,57 *bp++ = 'L'; 12ec: 02f10c23 sb a5,56(sp) bp = u_cat(bp, pet.level); 12f0: fc7fe0ef jal 2b6 *bp = 0; 12f4: 00050023 sb zero,0(a0) ssd1306_drawstr(SSD1306_W - 2 * 8, 0, badge, 1); 12f8: 4685 li a3,1 12fa: 1830 addi a2,sp,56 12fc: 4581 li a1,0 12fe: 07000513 li a0,112 1302: f17fe0ef jal 218 1306: 4685 li a3,1 1308: 08000613 li a2,128 130c: 45a9 li a1,10 130e: 4501 li a0,0 1310: c90ff0ef jal 7a0 if (pet.sleeping) { 1314: 00f4c403 lbu s0,15(s1) 1318: 38040463 beqz s0,16a0 ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1); 131c: 6609 lui a2,0x2 131e: 4685 li a3,1 1320: b4860613 addi a2,a2,-1208 # 1b48 1324: 45b9 li a1,14 1326: 04e00513 li a0,78 132a: eeffe0ef jal 218 ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1); 132e: 6609 lui a2,0x2 1330: 4685 li a3,1 1332: b4c60613 addi a2,a2,-1204 # 1b4c 1336: 45b1 li a1,12 1338: 05400513 li a0,84 133c: eddfe0ef jal 218 1340: 03000793 li a5,48 1344: c43e sw a5,8(sp) px = 48; py = 16; 1346: 47c1 li a5,16 1348: c03e sw a5,0(sp) 134a: 03000793 li a5,48 134e: c23e sw a5,4(sp) if (pet.form == FORM_CLAUDE) spr = spr_claude; 1350: 00c4c783 lbu a5,12(s1) 1354: 6609 lui a2,0x2 1356: 62c60613 addi a2,a2,1580 # 262c 135a: c63e sw a5,12(sp) 135c: 4732 lw a4,12(sp) 135e: 478d li a5,3 1360: 02f70b63 beq a4,a5,1396 else if (pet.form == FORM_GLITCH) spr = spr_glitch; 1364: 46b2 lw a3,12(sp) 1366: 4711 li a4,4 1368: 3ae68663 beq a3,a4,1714 if (!pet.alive) return EXP_DEAD; 136c: 4742 lw a4,16(sp) else spr = species_frames[pet.species][current_expression()]; 136e: 00a4c683 lbu a3,10(s1) if (!pet.alive) return EXP_DEAD; 1372: 4519 li a0,6 1374: c719 beqz a4,1382 if (anim_timer) return anim_exp; 1376: c2c1c703 lbu a4,-980(gp) # 20000028 137a: 34070f63 beqz a4,16d8 137e: c281c503 lbu a0,-984(gp) # 20000024 else spr = species_frames[pet.species][current_expression()]; 1382: 00369793 slli a5,a3,0x3 1386: 8f95 sub a5,a5,a3 1388: 6709 lui a4,0x2 138a: 97aa add a5,a5,a0 138c: 078a slli a5,a5,0x2 138e: 6ac70713 addi a4,a4,1708 # 26ac 1392: 97ba add a5,a5,a4 1394: 4390 lw a2,0(a5) ssd1306_drawImage(x, y, spr, PANA_W, PANA_H, 0); 1396: 4582 lw a1,0(sp) 1398: 4522 lw a0,8(sp) 139a: 02000713 li a4,32 139e: 86ba mv a3,a4 13a0: c832 sw a2,16(sp) 13a2: e16ff0ef jal 9b8 if (spr != spr_claude && spr != spr_glitch && !pet.sleeping) 13a6: 4642 lw a2,16(sp) 13a8: 6789 lui a5,0x2 13aa: 62c78793 addi a5,a5,1580 # 262c 13ae: 10f60f63 beq a2,a5,14cc 13b2: 6789 lui a5,0x2 13b4: 5ac78793 addi a5,a5,1452 # 25ac 13b8: 10f60a63 beq a2,a5,14cc 13bc: 10041863 bnez s0,14cc if (pet.form >= FORM_USER) { // shades 13c0: 47b2 lw a5,12(sp) 13c2: 14078263 beqz a5,1506 uint8_t cy = eye_cy[sp], lx = eye_lx[sp], rx = eye_rx[sp]; 13c6: 00a4c703 lbu a4,10(s1) 13ca: c0c18793 addi a5,gp,-1012 # 20000008 13ce: 97ba add a5,a5,a4 13d0: 0007c403 lbu s0,0(a5) 13d4: c1418693 addi a3,gp,-1004 # 20000010 13d8: c1018793 addi a5,gp,-1008 # 2000000c 13dc: 97ba add a5,a5,a4 13de: 9736 add a4,a4,a3 ssd1306_fillRect(x + lx - 3, y + cy - 2, 7, 4, 0); 13e0: 0007c303 lbu t1,0(a5) 13e4: 00074703 lbu a4,0(a4) 13e8: 4682 lw a3,0(sp) 13ea: 4792 lw a5,4(sp) 13ec: 461d li a2,7 13ee: 00d702b3 add t0,a4,a3 13f2: 979a add a5,a5,t1 13f4: ffe28593 addi a1,t0,-2 13f8: ffd78513 addi a0,a5,-3 13fc: 4701 li a4,0 13fe: 4691 li a3,4 1400: d61a sw t1,44(sp) 1402: d416 sw t0,40(sp) 1404: d22e sw a1,36(sp) 1406: c83e sw a5,16(sp) 1408: db9fe0ef jal 1c0 ssd1306_fillRect(x + rx - 3, y + cy - 2, 7, 4, 0); 140c: 4792 lw a5,4(sp) 140e: 5592 lw a1,36(sp) 1410: 4701 li a4,0 1412: 00878533 add a0,a5,s0 1416: 461d li a2,7 1418: 4691 li a3,4 141a: 1575 addi a0,a0,-3 141c: da5fe0ef jal 1c0 if (rx - lx > 7) 1420: 5332 lw t1,44(sp) 1422: 471d li a4,7 1424: 47c2 lw a5,16(sp) 1426: 40640633 sub a2,s0,t1 142a: 52a2 lw t0,40(sp) 142c: 02c75263 bge a4,a2,1450 ssd1306_drawFastHLine(x + lx + 4, y + cy - 1, rx - lx - 7, 0); 1430: 00478513 addi a0,a5,4 1434: 07f00793 li a5,127 1438: 00a7cc63 blt a5,a0,1450 143c: fff28593 addi a1,t0,-1 1440: 03f00793 li a5,63 1444: 00b7c663 blt a5,a1,1450 1448: 4681 li a3,0 144a: 1665 addi a2,a2,-7 144c: b54ff0ef jal 7a0 if (pet.form >= FORM_ROOT) { // gaming headset + mic boom 1450: 4732 lw a4,12(sp) 1452: 4785 li a5,1 1454: 0af70963 beq a4,a5,1506 ssd1306_drawLine(x + 3, y + 10, x + 9, y + 2, 0); 1458: 4792 lw a5,4(sp) 145a: 078d addi a5,a5,3 145c: d23e sw a5,36(sp) 145e: 4782 lw a5,0(sp) 1460: 5512 lw a0,36(sp) 1462: 00a78413 addi s0,a5,10 1466: 4792 lw a5,4(sp) 1468: 85a2 mv a1,s0 146a: 07a5 addi a5,a5,9 146c: d43e sw a5,40(sp) 146e: 4782 lw a5,0(sp) 1470: 5622 lw a2,40(sp) 1472: 0789 addi a5,a5,2 1474: 86be mv a3,a5 1476: c83e sw a5,16(sp) 1478: b6cff0ef jal 7e4 ssd1306_drawLine(x + 9, y + 2, x + 23, y + 2, 0); 147c: 4792 lw a5,4(sp) 147e: 46c2 lw a3,16(sp) 1480: 5522 lw a0,40(sp) 1482: 07dd addi a5,a5,23 1484: 863e mv a2,a5 1486: 85b6 mv a1,a3 1488: d63e sw a5,44(sp) 148a: b5aff0ef jal 7e4 ssd1306_drawLine(x + 23, y + 2, x + 29, y + 10, 0); 148e: 4792 lw a5,4(sp) 1490: 45c2 lw a1,16(sp) 1492: 5532 lw a0,44(sp) 1494: 01d78613 addi a2,a5,29 1498: 86a2 mv a3,s0 149a: b4aff0ef jal 7e4 ssd1306_fillRect(x + 1, y + 12, 4, 7, 0); 149e: 4782 lw a5,0(sp) 14a0: 469d li a3,7 14a2: 4611 li a2,4 14a4: 00c78593 addi a1,a5,12 14a8: 4792 lw a5,4(sp) 14aa: 4701 li a4,0 14ac: 00178513 addi a0,a5,1 14b0: d11fe0ef jal 1c0 ssd1306_drawLine(x + 3, y + 18, x + 10, y + 24, 0); 14b4: 4782 lw a5,0(sp) 14b6: 5512 lw a0,36(sp) 14b8: 01878693 addi a3,a5,24 14bc: 4792 lw a5,4(sp) 14be: 00a78613 addi a2,a5,10 14c2: 4782 lw a5,0(sp) 14c4: 01278593 addi a1,a5,18 14c8: b1cff0ef jal 7e4 if (pet.form == FORM_CLAUDE) { 14cc: 4732 lw a4,12(sp) 14ce: 478d li a5,3 14d0: 02f71b63 bne a4,a5,1506 ssd1306_drawPixel(x - 2 + (frame & 3), y + 4, 1); 14d4: c381a403 lw s0,-968(gp) # 20000034 14d8: 4782 lw a5,0(sp) 14da: 4605 li a2,1 14dc: 00347513 andi a0,s0,3 14e0: 00478593 addi a1,a5,4 14e4: 47a2 lw a5,8(sp) 14e6: 1579 addi a0,a0,-2 14e8: 953e add a0,a0,a5 14ea: c9bfe0ef jal 184 ssd1306_drawPixel(x + PANA_W + (frame & 1), y + 10, 1); 14ee: 4782 lw a5,0(sp) 14f0: 00147513 andi a0,s0,1 14f4: 02050513 addi a0,a0,32 14f8: 00a78593 addi a1,a5,10 14fc: 47a2 lw a5,8(sp) 14fe: 4605 li a2,1 1500: 953e add a0,a0,a5 1502: c83fe0ef jal 184 1506: 4685 li a3,1 1508: 08000613 li a2,128 150c: 02e00593 li a1,46 1510: 4501 li a0,0 1512: a8eff0ef jal 7a0 for (uint8_t i = 0; i < pet.poop; i++) 1516: 4401 li s0,0 1518: 00e4c783 lbu a5,14(s1) 151c: 20f46063 bltu s0,a5,171c 1520: 4401 li s0,0 ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); 1522: 6709 lui a4,0x2 1524: 70070713 addi a4,a4,1792 # 2700 1528: 00241793 slli a5,s0,0x2 152c: 97ba add a5,a5,a4 152e: 00341493 slli s1,s0,0x3 1532: 4390 lw a2,0(a5) 1534: 94a2 add s1,s1,s0 1536: 4741 li a4,16 1538: 0486 slli s1,s1,0x1 153a: 86ba mv a3,a4 153c: 03000593 li a1,48 1540: 00148513 addi a0,s1,1 1544: c74ff0ef jal 9b8 if (i == cursor) 1548: 5702 lw a4,32(sp) 154a: 0ff47793 zext.b a5,s0 154e: 00f71963 bne a4,a5,1560 ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1); 1552: 46c5 li a3,17 1554: 8636 mv a2,a3 1556: 02f00593 li a1,47 155a: 8526 mv a0,s1 155c: b9eff0ef jal 8fa for (uint8_t i = 0; i < ICON_COUNT; i++) { 1560: 0405 addi s0,s0,1 1562: 479d li a5,7 1564: faf41fe3 bne s0,a5,1522 if (evo_anim) draw_evo_banner(); // celebratory overlay on top 1568: c441c783 lbu a5,-956(gp) # 20000040 156c: 2a078363 beqz a5,1812 ssd1306_fillRect(6, 18, SSD1306_W - 12, 24, 0); 1570: 4701 li a4,0 1572: 46e1 li a3,24 1574: 07400613 li a2,116 1578: 45c9 li a1,18 157a: 4519 li a0,6 157c: c45fe0ef jal 1c0 ssd1306_drawRect(6, 18, SSD1306_W - 12, 24, 1); 1580: 46e1 li a3,24 1582: 07400613 li a2,116 1586: 45c9 li a1,18 1588: 4519 li a0,6 158a: b70ff0ef jal 8fa draw_center_str(21, ">> evolving"); 158e: 6589 lui a1,0x2 1590: b5058593 addi a1,a1,-1200 # 1b50 1594: 4555 li a0,21 1596: 9b0ff0ef jal 746 p = s_cat(p, "[ "); 159a: 6589 lui a1,0x2 159c: b5c58593 addi a1,a1,-1188 # 1b5c 15a0: 0088 addi a0,sp,64 15a2: d03fe0ef jal 2a4 p = s_cat(p, form_names[pet.form]); 15a6: 47b2 lw a5,12(sp) 15a8: 6709 lui a4,0x2 15aa: 71c70713 addi a4,a4,1820 # 271c 15ae: 078a slli a5,a5,0x2 15b0: 97ba add a5,a5,a4 15b2: 438c lw a1,0(a5) 15b4: cf1fe0ef jal 2a4 p = s_cat(p, " ]"); 15b8: 6589 lui a1,0x2 15ba: b6058593 addi a1,a1,-1184 # 1b60 15be: ce7fe0ef jal 2a4 *p = 0; 15c2: 00050023 sb zero,0(a0) draw_center_str(31, b); 15c6: 008c addi a1,sp,64 15c8: 457d li a0,31 draw_center_str(56, "OK: respawn"); 15ca: 97cff0ef jal 746 15ce: a491 j 1812 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 15d0: fff7c693 not a3,a5 15d4: 86fd srai a3,a3,0x1f 15d6: 8ff5 and a5,a5,a3 15d8: b985 j 1248 pet.sleeping = !pet.sleeping; 15da: 00f4c503 lbu a0,15(s1) beep(pet.sleeping ? 440 : 660, 120); 15de: 07800593 li a1,120 pet.sleeping = !pet.sleeping; 15e2: 00153793 seqz a5,a0 beep(pet.sleeping ? 440 : 660, 120); 15e6: 00a03533 snez a0,a0 15ea: 40a00533 neg a0,a0 15ee: 0dc57513 andi a0,a0,220 pet.sleeping = !pet.sleeping; 15f2: 00f487a3 sb a5,15(s1) beep(pet.sleeping ? 440 : 660, 120); 15f6: 1b850513 addi a0,a0,440 15fa: b925 j 1232 pet.happy = clamp100(pet.happy + 5); 15fc: 00148783 lb a5,1(s1) pet.hygiene = 100; 1600: 06400693 li a3,100 pet.poop = 0; 1604: 00048723 sb zero,14(s1) pet.hygiene = 100; 1608: 00d481a3 sb a3,3(s1) pet.happy = clamp100(pet.happy + 5); 160c: 0795 addi a5,a5,5 160e: c4818713 addi a4,gp,-952 # 20000044 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1612: 02f6d363 bge a3,a5,1638 1616: 87b6 mv a5,a3 beep(1319, 50); beep(1047, 50); 1618: 03200593 li a1,50 161c: 52700513 li a0,1319 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1620: 00f700a3 sb a5,1(a4) beep(1319, 50); beep(1047, 50); 1624: cf3fe0ef jal 316 1628: 41700513 li a0,1047 162c: 03200593 li a1,50 1630: ce7fe0ef jal 316 add_xp(3); 1634: 450d li a0,3 1636: b9b9 j 1294 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1638: fff7c693 not a3,a5 163c: 86fd srai a3,a3,0x1f 163e: 8ff5 and a5,a5,a3 1640: bfe1 j 1618 pet.health = clamp100(pet.health + 35); 1642: 00448783 lb a5,4(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1646: 06400713 li a4,100 pet.health = clamp100(pet.health + 35); 164a: 02378793 addi a5,a5,35 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 164e: 02f75663 bge a4,a5,167a 1652: 87ba mv a5,a4 beep(784, 60); beep(1047, 60); beep(1319, 90); 1654: 03c00593 li a1,60 1658: 31000513 li a0,784 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 165c: 00f48223 sb a5,4(s1) beep(784, 60); beep(1047, 60); beep(1319, 90); 1660: cb7fe0ef jal 316 1664: 03c00593 li a1,60 1668: 41700513 li a0,1047 166c: cabfe0ef jal 316 1670: 05a00593 li a1,90 1674: 52700513 li a0,1319 1678: b661 j 1200 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: bfc9 j 1654 screen = SCR_STATS; 1684: 4789 li a5,2 1686: c2f18b23 sb a5,-970(gp) # 20000032 beep(659, 40); 168a: 02800593 li a1,40 168e: 29300513 li a0,659 1692: b645 j 1232 screen = SCR_SETTINGS; 1694: 4791 li a5,4 1696: c2f18b23 sb a5,-970(gp) # 20000032 set_sel = 0; 169a: c20186a3 sb zero,-979(gp) # 20000029 169e: b7f5 j 168a uint32_t t = frame % 80; 16a0: c381a783 lw a5,-968(gp) # 20000034 16a4: 05000593 li a1,80 16a8: 853e mv a0,a5 16aa: c03e sw a5,0(sp) 16ac: a29fe0ef jal d4 <__umodsi3> px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 16b0: 02700713 li a4,39 16b4: 4782 lw a5,0(sp) 16b6: 00a76d63 bltu a4,a0,16d0 16ba: 01e50713 addi a4,a0,30 16be: c43a sw a4,8(sp) 16c0: 4722 lw a4,8(sp) py = 14 + ((frame % 16) < 8 ? 0 : 1); 16c2: 8ba1 andi a5,a5,8 16c4: 00f037b3 snez a5,a5 16c8: 07b9 addi a5,a5,14 16ca: c23a sw a4,4(sp) 16cc: c03e sw a5,0(sp) 16ce: b149 j 1350 px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 16d0: 06e00713 li a4,110 16d4: 8f09 sub a4,a4,a0 16d6: b7e5 j 16be if (pet.sleeping) return EXP_SLEEP; 16d8: 4515 li a0,5 16da: ca0414e3 bnez s0,1382 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 16de: 00448603 lb a2,4(s1) 16e2: 4775 li a4,29 return EXP_SAD; 16e4: 853e mv a0,a5 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 16e6: c8c75ee3 bge a4,a2,1382 16ea: 00148603 lb a2,1(s1) 16ee: 4761 li a4,24 16f0: c8c759e3 bge a4,a2,1382 16f4: 00048603 lb a2,0(s1) 16f8: 474d li a4,19 16fa: c8c754e3 bge a4,a2,1382 if ((frame % 50) < 4) return EXP_BLINK; 16fe: c381a503 lw a0,-968(gp) # 20000034 1702: 03200593 li a1,50 1706: c836 sw a3,16(sp) 1708: 9cdfe0ef jal d4 <__umodsi3> 170c: 46c2 lw a3,16(sp) 170e: 00453513 sltiu a0,a0,4 1712: b985 j 1382 else if (pet.form == FORM_GLITCH) spr = spr_glitch; 1714: 6609 lui a2,0x2 1716: 5ac60613 addi a2,a2,1452 # 25ac 171a: b9b5 j 1396 ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 171c: 00141513 slli a0,s0,0x1 1720: 9522 add a0,a0,s0 1722: 4721 li a4,8 1724: 050a slli a0,a0,0x2 1726: 86ba mv a3,a4 1728: c1818613 addi a2,gp,-1000 # 20000014 172c: 02600593 li a1,38 1730: 953a add a0,a0,a4 for (uint8_t i = 0; i < pet.poop; i++) 1732: 0405 addi s0,s0,1 ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 1734: a84ff0ef jal 9b8 for (uint8_t i = 0; i < pet.poop; i++) 1738: 0ff47413 zext.b s0,s0 173c: bbf1 j 1518 draw_main(); break; case SCR_STATS: if (any_edge) { screen = SCR_MAIN; beep(880, 30); } 173e: cb89 beqz a5,1750 1740: 4785 li a5,1 1742: 45f9 li a1,30 1744: 37000513 li a0,880 1748: c2f18b23 sb a5,-970(gp) # 20000032 174c: bcbfe0ef jal 316 ssd1306_setbuf(0); 1750: cf2ff0ef jal c42 draw_center_str(0, "~/pet $ stat"); 1754: 6589 lui a1,0x2 1756: b6458593 addi a1,a1,-1180 # 1b64 175a: 4501 li a0,0 draw_bar(10, "FOOD", pet.satiety); 175c: c4818413 addi s0,gp,-952 # 20000044 draw_center_str(0, "~/pet $ stat"); 1760: fe7fe0ef jal 746 draw_bar(10, "FOOD", pet.satiety); 1764: 00040603 lb a2,0(s0) 1768: 6589 lui a1,0x2 176a: b7458593 addi a1,a1,-1164 # 1b74 176e: 4529 li a0,10 1770: 9e0ff0ef jal 950 draw_bar(19, "HAPPY", pet.happy); 1774: 00140603 lb a2,1(s0) 1778: 6589 lui a1,0x2 177a: b7c58593 addi a1,a1,-1156 # 1b7c 177e: 454d li a0,19 1780: 9d0ff0ef jal 950 draw_bar(28, "ENERGY", pet.energy); 1784: 00240603 lb a2,2(s0) 1788: 6589 lui a1,0x2 178a: b8458593 addi a1,a1,-1148 # 1b84 178e: 4571 li a0,28 1790: 9c0ff0ef jal 950 draw_bar(37, "CLEAN", pet.hygiene); 1794: 00340603 lb a2,3(s0) 1798: 6589 lui a1,0x2 179a: b8c58593 addi a1,a1,-1140 # 1b8c 179e: 02500513 li a0,37 17a2: 9aeff0ef jal 950 draw_bar(46, "HEALTH", pet.health); 17a6: 00440603 lb a2,4(s0) 17aa: 6589 lui a1,0x2 17ac: b9458593 addi a1,a1,-1132 # 1b94 17b0: 02e00513 li a0,46 17b4: 99cff0ef jal 950 p = u_cat(p, pet.level); 17b8: 00b44483 lbu s1,11(s0) *p++ = 'L'; 17bc: 04c00793 li a5,76 p = u_cat(p, pet.level); 17c0: 04110513 addi a0,sp,65 17c4: 85a6 mv a1,s1 *p++ = 'L'; 17c6: 04f10023 sb a5,64(sp) p = u_cat(p, pet.level); 17ca: aedfe0ef jal 2b6 p = s_cat(p, " xp "); 17ce: 6589 lui a1,0x2 17d0: b9c58593 addi a1,a1,-1124 # 1b9c 17d4: ad1fe0ef jal 2a4 if (pet.level < MAX_LEVEL) { 17d8: 478d li a5,3 17da: 0a97ec63 bltu a5,s1,1892 p = u_cat(p, pet.xp); 17de: 00845583 lhu a1,8(s0) p = u_cat(p, level_xp[pet.level]); 17e2: 0486 slli s1,s1,0x1 p = u_cat(p, pet.xp); 17e4: ad3fe0ef jal 2b6 *p++ = '/'; 17e8: 02f00793 li a5,47 17ec: 00f50023 sb a5,0(a0) p = u_cat(p, level_xp[pet.level]); 17f0: c2018793 addi a5,gp,-992 # 2000001c 17f4: 94be add s1,s1,a5 17f6: 0004d583 lhu a1,0(s1) 17fa: 0505 addi a0,a0,1 17fc: abbfe0ef jal 2b6 *p = 0; 1800: 00050023 sb zero,0(a0) ssd1306_drawstr(0, 56, line, 1); 1804: 4685 li a3,1 1806: 0090 addi a2,sp,64 1808: 03800593 li a1,56 180c: 4501 li a0,0 180e: a0bfe0ef jal 218 ssd1306_refresh(); 1812: c58ff0ef jal c6a draw_dead(); break; } // sleep the display after the configured idle period uint16_t timeout = screen_timeout_opts[timeout_idx]; 1816: c041c703 lbu a4,-1020(gp) # 20000000 181a: 6789 lui a5,0x2 181c: 7e478793 addi a5,a5,2020 # 27e4 1820: 0706 slli a4,a4,0x1 1822: 97ba add a5,a5,a4 1824: 0007d783 lhu a5,0(a5) if (timeout && idle_frames >= timeout) { 1828: c301a403 lw s0,-976(gp) # 2000002c 182c: cb89 beqz a5,183e 182e: 00f46863 bltu s0,a5,183e ssd1306_cmd(SSD1306_DISPLAYOFF); 1832: 0ae00513 li a0,174 1836: b5cff0ef jal b92 disp_on = 0; 183a: c00182a3 sb zero,-1019(gp) # 20000001 } } if (anim_timer) anim_timer--; 183e: c2c1c783 lbu a5,-980(gp) # 20000028 1842: c781 beqz a5,184a 1844: 17fd addi a5,a5,-1 1846: c2f18623 sb a5,-980(gp) # 20000028 if (evo_anim) evo_anim--; 184a: c441c783 lbu a5,-956(gp) # 20000040 184e: c781 beqz a5,1856 1850: 17fd addi a5,a5,-1 1852: c4f18223 sb a5,-956(gp) # 20000040 // advance game time independent of screen / display state if (pet.alive && ++tick_acc >= TICK_FRAMES) { 1856: c581c783 lbu a5,-936(gp) # 20000054 185a: cf81 beqz a5,1872 185c: c2a1d783 lhu a5,-982(gp) # 20000026 1860: 0f900693 li a3,249 1864: 0785 addi a5,a5,1 1866: 07c2 slli a5,a5,0x10 1868: 83c1 srli a5,a5,0x10 186a: 22f6e363 bltu a3,a5,1a90 186e: c2f19523 sh a5,-982(gp) # 20000026 tick_acc = 0; game_tick(); } frame++; 1872: c381a783 lw a5,-968(gp) # 20000034 idle_frames++; Delay_Ms(FRAME_MS); 1876: 00058537 lui a0,0x58 idle_frames++; 187a: 0405 addi s0,s0,1 frame++; 187c: 0785 addi a5,a5,1 Delay_Ms(FRAME_MS); 187e: e4050513 addi a0,a0,-448 # 57e40 frame++; 1882: c2f1ac23 sw a5,-968(gp) # 20000034 idle_frames++; 1886: c281a823 sw s0,-976(gp) # 2000002c Delay_Ms(FRAME_MS); 188a: 895fe0ef jal 11e 188e: efeff06f j f8c p = s_cat(p, "MAX"); 1892: 6589 lui a1,0x2 1894: ba458593 addi a1,a1,-1116 # 1ba4 1898: a0dfe0ef jal 2a4 189c: b795 j 1800 if (left_edge) { 189e: c185 beqz a1,18be set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS; 18a0: c2d1c503 lbu a0,-979(gp) # 20000029 18a4: 458d li a1,3 18a6: c236 sw a3,4(sp) 18a8: 0509 addi a0,a0,2 18aa: 84ffe0ef jal f8 <__modsi3> 18ae: c2a186a3 sb a0,-979(gp) # 20000029 beep(1047, 25); 18b2: 45e5 li a1,25 18b4: 41700513 li a0,1047 18b8: a5ffe0ef jal 316 18bc: 4692 lw a3,4(sp) if (right_edge) { 18be: ce91 beqz a3,18da set_sel = (set_sel + 1) % SETTINGS_ROWS; 18c0: c2d1c503 lbu a0,-979(gp) # 20000029 18c4: 458d li a1,3 18c6: 0505 addi a0,a0,1 18c8: 831fe0ef jal f8 <__modsi3> 18cc: c2a186a3 sb a0,-979(gp) # 20000029 beep(1047, 25); 18d0: 45e5 li a1,25 18d2: 41700513 li a0,1047 18d6: a41fe0ef jal 316 if (ok_edge) { 18da: 4782 lw a5,0(sp) 18dc: c3a1 beqz a5,191c if (set_sel == 0) { // cycle screen-off timeout 18de: c2d1c703 lbu a4,-979(gp) # 20000029 18e2: ef11 bnez a4,18fe timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; 18e4: c041c503 lbu a0,-1020(gp) # 20000000 18e8: 4599 li a1,6 18ea: 0505 addi a0,a0,1 18ec: 80dfe0ef jal f8 <__modsi3> 18f0: c0a18223 sb a0,-1020(gp) # 20000000 beep(880, 40); 18f4: 02800593 li a1,40 beep(880, 30); 18f8: 37000513 li a0,880 18fc: a831 j 1918 } else if (set_sel == 1) { // toggle sound 18fe: 4785 li a5,1 1900: 0ef71963 bne a4,a5,19f2 sound_on = !sound_on; 1904: c061c783 lbu a5,-1018(gp) # 20000002 beep(988, 60); // only audible if just enabled 1908: 03c00593 li a1,60 190c: 3dc00513 li a0,988 sound_on = !sound_on; 1910: 0017b793 seqz a5,a5 1914: c0f18323 sb a5,-1018(gp) # 20000002 beep(880, 30); 1918: 9fffe0ef jal 316 ssd1306_setbuf(0); 191c: b26ff0ef jal c42 draw_center_str(0, "- SETTINGS -"); 1920: 6589 lui a1,0x2 1922: ba858593 addi a1,a1,-1112 # 1ba8 1926: 4501 li a0,0 1928: e1ffe0ef jal 746 192c: 4685 li a3,1 192e: 08000613 li a2,128 1932: 45a9 li a1,10 1934: 4501 li a0,0 1936: e6bfe0ef jal 7a0 *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; 193a: 6589 lui a1,0x2 193c: bb858593 addi a1,a1,-1096 # 1bb8 1940: 0088 addi a0,sp,64 1942: 963fe0ef jal 2a4 1946: c041c703 lbu a4,-1020(gp) # 20000000 194a: 6789 lui a5,0x2 194c: 74c78793 addi a5,a5,1868 # 274c 1950: 070a slli a4,a4,0x2 1952: 97ba add a5,a5,a4 1954: 438c lw a1,0(a5) 1956: 94ffe0ef jal 2a4 *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; 195a: 6589 lui a1,0x2 *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; 195c: 00050023 sb zero,0(a0) *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; 1960: bc458593 addi a1,a1,-1084 # 1bc4 1964: 05110513 addi a0,sp,81 1968: 93dfe0ef jal 2a4 196c: c061c783 lbu a5,-1018(gp) # 20000002 1970: c7c9 beqz a5,19fa 1972: 6589 lui a1,0x2 1974: ae058593 addi a1,a1,-1312 # 1ae0 1978: 92dfe0ef jal 2a4 *s_cat(rows[2], "Back") = 0; 197c: 6589 lui a1,0x2 *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; 197e: 00050023 sb zero,0(a0) *s_cat(rows[2], "Back") = 0; 1982: bcc58593 addi a1,a1,-1076 # 1bcc 1986: 06210513 addi a0,sp,98 198a: 91bfe0ef jal 2a4 198e: 00050023 sb zero,0(a0) 1992: 44c5 li s1,17 1994: 4401 li s0,0 int y = 18 + r * 12; 1996: 00148793 addi a5,s1,1 199a: c03e sw a5,0(sp) if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1); 199c: c2d1c283 lbu t0,-979(gp) # 20000029 19a0: 0ff47313 zext.b t1,s0 19a4: 00531e63 bne t1,t0,19c0 19a8: 4705 li a4,1 19aa: 46a9 li a3,10 19ac: 08000613 li a2,128 19b0: 85a6 mv a1,s1 19b2: 4501 li a0,0 19b4: c216 sw t0,4(sp) 19b6: c01a sw t1,0(sp) 19b8: 809fe0ef jal 1c0 19bc: 4292 lw t0,4(sp) 19be: 4302 lw t1,0(sp) ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1); 19c0: 00441613 slli a2,s0,0x4 19c4: 405306b3 sub a3,t1,t0 19c8: 9622 add a2,a2,s0 19ca: 009c addi a5,sp,64 19cc: 00148593 addi a1,s1,1 19d0: 00d036b3 snez a3,a3 19d4: 963e add a2,a2,a5 19d6: 4511 li a0,4 19d8: 841fe0ef jal 218 for (uint8_t r = 0; r < SETTINGS_ROWS; r++) { 19dc: 04b1 addi s1,s1,12 19de: 03500713 li a4,53 19e2: 0405 addi s0,s0,1 19e4: fae499e3 bne s1,a4,1996 draw_center_str(56, "L/R move OK use"); 19e8: 6589 lui a1,0x2 19ea: bd458593 addi a1,a1,-1068 # 1bd4 19ee: f66ff06f j 1154 screen = SCR_MAIN; 19f2: c2f18b23 sb a5,-970(gp) # 20000032 beep(880, 30); 19f6: 45f9 li a1,30 19f8: b701 j 18f8 *s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0; 19fa: 6589 lui a1,0x2 19fc: ae858593 addi a1,a1,-1304 # 1ae8 1a00: bfa5 j 1978 if (ok_edge) { // back to the welcome screen to re-pick 1a02: 4782 lw a5,0(sp) 1a04: cf99 beqz a5,1a22 beep(659, 80); beep(988, 120); 1a06: 05000593 li a1,80 1a0a: 29300513 li a0,659 screen = SCR_SELECT; 1a0e: c2018b23 sb zero,-970(gp) # 20000032 beep(659, 80); beep(988, 120); 1a12: 905fe0ef jal 316 1a16: 07800593 li a1,120 1a1a: 3dc00513 li a0,988 1a1e: 8f9fe0ef jal 316 ssd1306_setbuf(0); 1a22: a20ff0ef jal c42 ssd1306_drawImage(48, 2, spr_grave, 32, 32, 0); 1a26: 02000713 li a4,32 1a2a: 6609 lui a2,0x2 1a2c: 86ba mv a3,a4 1a2e: 76460613 addi a2,a2,1892 # 2764 1a32: 4589 li a1,2 1a34: 03000513 li a0,48 1a38: f81fe0ef jal 9b8 draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); 1a3c: c4818713 addi a4,gp,-952 # 20000044 1a40: 00d74683 lbu a3,13(a4) 1a44: 4709 li a4,2 1a46: c4818413 addi s0,gp,-952 # 20000044 1a4a: 02e69f63 bne a3,a4,1a88 1a4e: 6589 lui a1,0x2 1a50: aec58593 addi a1,a1,-1300 # 1aec 1a54: 02400513 li a0,36 1a58: ceffe0ef jal 746 p = s_cat(p, "core dumped L"); 1a5c: 6589 lui a1,0x2 1a5e: be858593 addi a1,a1,-1048 # 1be8 1a62: 0088 addi a0,sp,64 1a64: 841fe0ef jal 2a4 p = u_cat(p, pet.level); 1a68: 00b44583 lbu a1,11(s0) 1a6c: 84bfe0ef jal 2b6 *p = 0; 1a70: 00050023 sb zero,0(a0) draw_center_str(46, line); 1a74: 008c addi a1,sp,64 1a76: 02e00513 li a0,46 1a7a: ccdfe0ef jal 746 draw_center_str(56, "OK: respawn"); 1a7e: 6589 lui a1,0x2 1a80: bf858593 addi a1,a1,-1032 # 1bf8 1a84: ed0ff06f j 1154 draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); 1a88: 6589 lui a1,0x2 1a8a: afc58593 addi a1,a1,-1284 # 1afc 1a8e: b7d9 j 1a54 tick_acc = 0; 1a90: c2019523 sh zero,-982(gp) # 20000026 game_tick(); 1a94: a79fe0ef jal 50c 1a98: bbe9 j 1872 00001a9a : { 1a9a: 1161 addi sp,sp,-8 1a9c: c03e sw a5,0(sp) EXTI->INTFR = EXTI_Line0 | EXTI_Line5 | EXTI_Line6; // clear pending 1a9e: 400107b7 lui a5,0x40010 { 1aa2: c23a sw a4,4(sp) EXTI->INTFR = EXTI_Line0 | EXTI_Line5 | EXTI_Line6; // clear pending 1aa4: 40078793 addi a5,a5,1024 # 40010400 <_eusrstack+0x2000fc00> 1aa8: 06100713 li a4,97 1aac: cbd8 sw a4,20(a5) exti_wake = 1; 1aae: 4705 li a4,1 1ab0: c2e18aa3 sb a4,-971(gp) # 20000031 } 1ab4: 4712 lw a4,4(sp) 1ab6: 4782 lw a5,0(sp) 1ab8: 0121 addi sp,sp,8 1aba: 30200073 mret 00001abe : { 1abe: 1161 addi sp,sp,-8 1ac0: c23a sw a4,4(sp) 1ac2: c03e sw a5,0(sp) TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; // clear update flag 1ac4: 5779 li a4,-2 1ac6: 400007b7 lui a5,0x40000 1aca: 00e79823 sh a4,16(a5) # 40000010 <_eusrstack+0x1ffff810> tick_wake = 1; 1ace: 4705 li a4,1 1ad0: c2e18a23 sb a4,-972(gp) # 20000030 } 1ad4: 4712 lw a4,4(sp) 1ad6: 4782 lw a5,0(sp) 1ad8: 0121 addi sp,sp,8 1ada: 30200073 mret 1ade: 0000 unimp 1ae0: 00006e4f .insn 4, 0x6e4f 1ae4: 0000 unimp 1ae6: 0000 unimp 1ae8: 0066664f .insn 4, 0x0066664f 1aec: 2a2a .insn 2, 0x2a2a 1aee: 4320 lw s0,64(a4) 1af0: 5552524f .insn 4, 0x5552524f 1af4: 5450 lw a2,44(s0) 1af6: 4445 li s0,17 1af8: 2a20 .insn 2, 0x2a20 1afa: 002a c.slli zero,0xa 1afc: 46474553 .insn 4, 0x46474553 1b00: 5541 li a0,-16 1b02: 544c lw a1,44(s0) 1b04: 2820 .insn 2, 0x2820 1b06: 3131 jal 1712 1b08: 0029 c.nop 10 1b0a: 0000 unimp 1b0c: 7270 .insn 2, 0x7270 1b0e: 7365 lui t1,0xffff9 1b10: 6e612073 .insn 4, 0x6e612073 1b14: 2079 jal 1ba2 1b16: 0079656b .insn 4, 0x0079656b 1b1a: 0000 unimp 1b1c: 207e .insn 2, 0x207e 1b1e: 2024 .insn 2, 0x2024 1b20: 6461 lui s0,0x18 1b22: 2074706f j 49528 1b26: 2d2d jal 2160 1b28: 6570 .insn 2, 0x6570 1b2a: 0074 addi a3,sp,12 1b2c: 203c .insn 2, 0x203c 1b2e: 0000 unimp 1b30: 3e20 .insn 2, 0x3e20 1b32: 0000 unimp 1b34: 2f4c .insn 2, 0x2f4c 1b36: 2052 .insn 2, 0x2052 1b38: 6970 .insn 2, 0x6970 1b3a: 20206b63 bltu zero,sp,1d50 1b3e: 67204b4f .insn 4, 0x67204b4f 1b42: 0021006f j 11b44 1b46: 0000 unimp 1b48: 007a c.slli zero,0x1e 1b4a: 0000 unimp 1b4c: 005a c.slli zero,0x16 1b4e: 0000 unimp 1b50: 3e3e .insn 2, 0x3e3e 1b52: 6520 .insn 2, 0x6520 1b54: 6f76 .insn 2, 0x6f76 1b56: 766c .insn 2, 0x766c 1b58: 6e69 lui t3,0x1a 1b5a: 205b0067 jr 517(s6) 1b5e: 0000 unimp 1b60: 5d20 lw s0,120(a0) 1b62: 0000 unimp 1b64: 2f7e .insn 2, 0x2f7e 1b66: 6570 .insn 2, 0x6570 1b68: 2074 .insn 2, 0x2074 1b6a: 2024 .insn 2, 0x2024 1b6c: 74617473 .insn 4, 0x74617473 1b70: 0000 unimp 1b72: 0000 unimp 1b74: 4f46 lw t5,80(sp) 1b76: 0000444f .insn 4, 0x444f 1b7a: 0000 unimp 1b7c: 4148 lw a0,4(a0) 1b7e: 5050 lw a2,36(s0) 1b80: 0059 c.nop 22 1b82: 0000 unimp 1b84: 4e45 li t3,17 1b86: 5245 li tp,-15 1b88: 00005947 .insn 4, 0x5947 1b8c: 41454c43 .insn 4, 0x41454c43 1b90: 004e c.slli zero,0x13 1b92: 0000 unimp 1b94: 4548 lw a0,12(a0) 1b96: 4c41 li s8,16 1b98: 4854 lw a3,20(s0) 1b9a: 0000 unimp 1b9c: 2020 .insn 2, 0x2020 1b9e: 7078 .insn 2, 0x7078 1ba0: 0020 addi s0,sp,8 1ba2: 0000 unimp 1ba4: 414d li sp,19 1ba6: 0058 addi a4,sp,4 1ba8: 202d jal 1bd2 1baa: 54544553 .insn 4, 0x54544553 1bae: 4e49 li t3,18 1bb0: 2d205347 .insn 4, 0x2d205347 1bb4: 0000 unimp 1bb6: 0000 unimp 1bb8: 65726353 .insn 4, 0x65726353 1bbc: 6e65 lui t3,0x19 1bbe: 6f20 .insn 2, 0x6f20 1bc0: 6666 .insn 2, 0x6666 1bc2: 003a c.slli zero,0xe 1bc4: 6e756f53 .insn 4, 0x6e756f53 1bc8: 3a64 .insn 2, 0x3a64 1bca: 0020 addi s0,sp,8 1bcc: 6142 .insn 2, 0x6142 1bce: 00006b63 bltu zero,zero,1be4 1bd2: 0000 unimp 1bd4: 2f4c .insn 2, 0x2f4c 1bd6: 2052 .insn 2, 0x2052 1bd8: 6f6d lui t5,0x1b 1bda: 6576 .insn 2, 0x6576 1bdc: 2020 .insn 2, 0x2020 1bde: 75204b4f .insn 4, 0x75204b4f 1be2: 00006573 .insn 4, 0x6573 1be6: 0000 unimp 1be8: 65726f63 bltu tp,s7,2246 1bec: 6420 .insn 2, 0x6420 1bee: 6d75 lui s10,0x1d 1bf0: 6570 .insn 2, 0x6570 1bf2: 2064 .insn 2, 0x2064 1bf4: 004c addi a1,sp,4 1bf6: 0000 unimp 1bf8: 203a4b4f .insn 4, 0x203a4b4f 1bfc: 6572 .insn 2, 0x6572 1bfe: 77617073 .insn 4, 0x77617073 1c02: 006e c.slli zero,0x1b 1c04: 6170 .insn 2, 0x6170 1c06: 616e .insn 2, 0x616e 1c08: 63746f67 .insn 4, 0x63746f67 1c0c: 6968 .insn 2, 0x6968 1c0e: 7620 .insn 2, 0x7620 1c10: 0032 c.slli zero,0xc 1c12: 0000 unimp 1c14: 6f62 .insn 2, 0x6f62 1c16: 6e69746f jal s0,992fc 1c1a: 656b2067 .insn 4, 0x656b2067 1c1e: 6e72 .insn 2, 0x6e72 1c20: 6c65 lui s8,0x19 1c22: 2e2e .insn 2, 0x2e2e 1c24: 0000 unimp 1c26: 0000 unimp 1c28: 6f6d lui t5,0x1b 1c2a: 6e75 lui t3,0x1d 1c2c: 2074 .insn 2, 0x2074 1c2e: 7465702f .insn 4, 0x7465702f 1c32: 2020 .insn 2, 0x2020 1c34: 00006b6f jal s6,7c34 1c38: 77617073 .insn 4, 0x77617073 1c3c: 206e .insn 2, 0x206e 1c3e: 6c656873 .insn 4, 0x6c656873 1c42: 206c .insn 2, 0x206c 1c44: 6f20 .insn 2, 0x6f20 1c46: 203e006b .insn 4, 0x203e006b 1c4a: 2f2e .insn 2, 0x2f2e 1c4c: 6174 .insn 2, 0x6174 1c4e: 616d addi sp,sp,240 1c50: 63746f67 .insn 4, 0x63746f67 1c54: 6968 .insn 2, 0x6968 1c56: 005f 6853 6c65 .insn 6, 0x6c656853005f 1c5c: 006c addi a1,sp,12 1c5e: 0000 unimp 1c60: 6150 .insn 2, 0x6150 1c62: 6b6e .insn 2, 0x6b6e 1c64: 0000006f j 1c64 1c68: 6d54 .insn 2, 0x6d54 1c6a: 7875 lui a6,0xffffd 1c6c: 0000 unimp 1c6e: 0000 unimp 1c70: 7270 .insn 2, 0x7270 1c72: 0000636f jal t1,7c72 1c76: 0000 unimp 1c78: 7375 lui t1,0xffffd 1c7a: 7265 lui tp,0xffff9 1c7c: 0000 unimp 1c7e: 0000 unimp 1c80: 6f72 .insn 2, 0x6f72 1c82: 0000746f jal s0,8c82 1c86: 0000 unimp 1c88: 75616c43 .insn 4, 0x75616c43 1c8c: 6564 .insn 2, 0x6564 1c8e: 0000 unimp 1c90: 74696c67 .insn 4, 0x74696c67 1c94: 00006863 bltu zero,zero,1ca4 1c98: 4546 lw a0,80(sp) 1c9a: 4445 li s0,17 1c9c: 0000 unimp 1c9e: 0000 unimp 1ca0: 4c50 lw a2,28(s0) 1ca2: 5941 li s2,-16 1ca4: 0000 unimp 1ca6: 0000 unimp 1ca8: 45454c53 .insn 4, 0x45454c53 1cac: 0050 addi a2,sp,4 1cae: 0000 unimp 1cb0: 4548 lw a0,12(a0) 1cb2: 4c41 li s8,16 1cb4: 0000 unimp 1cb6: 0000 unimp 1cb8: 54415453 .insn 4, 0x54415453 1cbc: 00000053 .insn 4, 0x0053 1cc0: 54544553 .insn 4, 0x54544553 1cc4: 4e49 li t3,18 1cc6: 00005347 .insn 4, 0x5347 1cca: 0000 unimp 1ccc: 7335 lui t1,0xfffed 1cce: 0000 unimp 1cd0: 3031 jal 14dc 1cd2: 35310073 .insn 4, 0x35310073 1cd6: 30330073 .insn 4, 0x30330073 1cda: 30360073 .insn 4, 0x30360073 1cde: 10360073 .insn 4, 0x10360073 1ce2: 0000 unimp 1ce4: 115a slli sp,sp,0x36 1ce6: 0000 unimp 1ce8: 173e slli a4,a4,0x2f 1cea: 0000 unimp 1cec: 1a02 slli s4,s4,0x20 1cee: 0000 unimp 1cf0: 189e slli a7,a7,0x27 1cf2: 0000 unimp 1cf4: 11b8 addi a4,sp,232 1cf6: 0000 unimp 1cf8: 1220 addi s0,sp,296 1cfa: 0000 unimp 1cfc: 15da slli a1,a1,0x36 1cfe: 0000 unimp 1d00: 15fc addi a5,sp,748 1d02: 0000 unimp 1d04: 1642 slli a2,a2,0x30 1d06: 0000 unimp 1d08: 1684 addi s1,sp,864 1d0a: 0000 unimp 1d0c: 1694 addi a3,sp,864 ... 00001d10 : ... 1d1c: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1d2c: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1d3c: ff3f fc7f ff3f fc7f 073c 1c70 ff3f fc7f ?...?...<.p.?... 1d4c: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1d5c: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1d6c: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'... 1d7c: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ............... 1d8c: 0000 0000 .... 00001d90 : ... 1d9c: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1dac: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1dbc: bf3f fc7e 1f3f 7c7c 0f3e 3c78 1f3f 7c7c ?.~.?.||>.x: ... 1e1c: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1e2c: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1e3c: 5f3f 7c7d af3e bc7a ff3f fc7f ff3f fc7f ?_}|>.z.?...?... 1e4c: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1e5c: 033c 1c60 ff3f fc7f ff3f fc7f ff3f fc7f <.`.?...?...?... 1e6c: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'... 1e7c: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ............... 1e8c: 0000 0000 .... 00001e90 : ... 1e9c: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1eac: ff3f fc7f ff3f fc7f ff3f fc7f bf3f fc7e ?...?...?...?.~. 1ebc: 1f3f 7c7c 0f3e 3c78 1f3f 7c7c bf3f fc7e ?.||>.x: 1f10: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 1f20: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 1f30: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 1f40: ff01 80ff ff03 c0ff ff03 c0ff db03 c0db ................ 1f50: e703 c0e7 e703 c0e7 db03 c0db fd01 80df ................ 1f60: fa01 80bf f700 007f 7f00 00fe ff01 c0ff ................ 1f70: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 1f80: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00001f90 : 1f90: 0000 0080 1000 0088 1100 f088 3100 208c .............1. 1fa0: 3900 40dc 3b00 f0dc 7f00 00fe 7f00 00fe .9.@.;.......... 1fb0: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 1fc0: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................ 1fd0: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................ 1fe0: fe01 807f ff00 00ff 7f00 00fe ff01 c0ff ................ 1ff0: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2000: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00002010 : 2010: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 2020: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 2030: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 2040: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................ 2050: e703 c0e7 ff03 c0ff ff03 c0ff fc01 803f ..............?. 2060: fd01 803f fc00 00bf 7c00 003e ff01 c0ff ..?......|>..... 2070: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2080: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00002090 : 2090: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 20a0: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 20b0: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 20c0: ff01 80ff 9f03 c0f9 e703 c0e7 ff03 c0ff ................ 20d0: e703 c0e7 e703 c0e7 ff03 c0ff ff01 80ff ................ 20e0: ff01 80ff fc00 003f 7b00 00de f701 c0ef ......?..{...... 20f0: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2100: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00002110 : 2110: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 2120: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 2130: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 2140: ff01 80ff ff03 c0ff ff03 c0ff ef03 c0f7 ................ 2150: e703 c0eb db03 c0db ff03 c0ff ff01 80ff ................ 2160: f701 80ef f700 00ef 7b00 00de fc01 c03f .........{....?. 2170: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2180: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00002190 : 2190: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 21a0: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 21b0: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 21c0: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................ 21d0: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................ 21e0: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?............. 21f0: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2200: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00002210 : 2210: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 2220: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 2230: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 2240: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................ 2250: e703 c0e7 ff03 c0ff ff03 c0ff ff01 80ff ................ 2260: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?............. 2270: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 2280: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 00002290 : ... 229c: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 22ac: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 22bc: ff0f f0ff 010f f080 ff0f f0ff ff0f f0ff ................ 22cc: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 22dc: ff0f f0ff f80f f00f ff0f f0ff ff0f f0ff ................ 22ec: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 22fc: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 230c: 7f00 00fe .... 00002310 : ... 231c: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 232c: ff0f f0ff ff0f f0ff ff0f f0ff ef0f f0f7 ................ 233c: c70f f0e3 830f f0c1 c70f f0e3 ef0f f0f7 ................ 234c: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 235c: ff0f f0ff ff0f f0ff ff0f f0ff f80f f01f ................ 236c: c70f f0e3 ff0f f0ff ff07 e0ff 0700 00e0 ................ 237c: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 238c: 7f00 00fe .... 00002390 : ... 239c: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 23ac: ff0f f0ff ff0f f0ff ff0f f0ff df0f f0ef ................ 23bc: af0f f0d7 ff0f f0ff ff0f f0ff ff0f f0ff ................ 23cc: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 23dc: c70f f0e3 f80f f01f ff0f f0ff ff0f f0ff ................ 23ec: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 23fc: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 240c: 7f00 00fe .... 00002410 : ... 241c: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 242c: ff0f f0ff ff0f f0ff ef0f f0f7 c70f f0e3 ................ 243c: 830f f0c1 c70f f0e3 ef0f f0f7 ff0f f0ff ................ 244c: ff0f f0ff ff0f f0ff ff0f f0ff 7f0f f0ff ................ 245c: bf0f f0ff df0f f0ff bf0f f0ff 780f f00f .............x.. 246c: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 247c: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 248c: 7f00 00fe .... 00002490 : 2490: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............? 24a0: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|.......... 000024b0 : 24b0: 0000 0000 0000 c000 c000 c000 c006 c006 ................ 24c0: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... 000024d0 : 24d0: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. 24e0: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ 000024f0 : 24f0: 0000 0000 8000 8000 c001 c001 f007 f80d ................ 2500: f80d f808 fc1d f80d f80f f80f f007 8000 ................ 00002510 : 2510: 0000 0000 0000 0004 000c 001c 0018 001c ................ 2520: 003c 001c 001e 001f e80f f007 8000 0000 <............... 00002530 : 2530: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ 2540: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. 00002550 : 2550: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. 2560: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... 00002570 : 2570: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... 2580: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... 0000258c : 258c: 1c04 0000 1c14 0000 1c28 0000 1c38 0000 ........(...8... 259c: 1c48 0000 H... 000025a0 : 25a0: 1c58 0000 1c60 0000 1c68 0000 X...`...h... 000025ac : ... 25bc: 0000 0200 0000 0000 0000 0000 0000 0000 ................ 25cc: 0080 0080 0f00 00f8 1500 0054 ff00 80ff ..........T..... 25dc: ff01 c0ff ff03 e0ff 1101 4144 d707 f0f5 ..........DA.... 25ec: ef07 f0fb d707 f0f5 1105 5044 ff0f f8ff ..........DP.... 25fc: ff07 f0ff ff07 f0ff 5505 5055 ea07 f0ab .........UUP.... 260c: ff43 e0ff ff03 e0ff 5501 4055 ff00 80ff C........UU@.... 261c: 3f00 00fe 0f00 04f8 0020 0000 0000 0000 .?...... ....... 0000262c : ... 2634: 0000 2000 0000 2000 0004 a800 000e 2000 ... ... ....... 2644: 0004 fe03 0000 2000 0000 a880 0f00 20f8 ....... ....... 2654: 3f00 20fe 7f00 00ff ff00 80ff ff01 c0ff .?. ............ 2664: ff01 c0ff ff03 e0ff f703 e0f7 f703 e0f7 ................ 2674: e303 e0e3 f707 f0f7 f703 e0f7 ff03 e0ff ................ 2684: ff03 e0ff e703 e0f3 f801 c00f ff01 c0ff ................ 2694: ff00 80ff 7f00 00ff 3f00 00fe 0f00 00f8 .........?...... 26a4: 0000 0080 0000 0000 ........ 000026ac : 26ac: 2410 0000 2410 0000 2390 0000 2310 0000 .$...$...#...#.. 26bc: 2390 0000 2290 0000 2310 0000 2210 0000 .#..."...#...".. 26cc: 2190 0000 2110 0000 2090 0000 2010 0000 .!...!... ... .. 26dc: 1f90 0000 1f10 0000 1e90 0000 1e90 0000 ................ 26ec: 1e10 0000 1d90 0000 1e10 0000 1d10 0000 ................ 26fc: 1d90 0000 .... 00002700 : 2700: 2550 0000 2530 0000 2510 0000 24f0 0000 P%..0%...%...$.. 2710: 24d0 0000 24b0 0000 2490 0000 .$...$...$.. 0000271c : 271c: 1c70 0000 1c78 0000 1c80 0000 1c88 0000 p...x........... 272c: 1c90 0000 .... 00002730 : 2730: 1c98 0000 1ca0 0000 1ca8 0000 1b8c 0000 ................ 2740: 1cb0 0000 1cb8 0000 1cc0 0000 ............ 0000274c : 274c: 1ccc 0000 1cd0 0000 1cd4 0000 1cd8 0000 ................ 275c: 1cdc 0000 1ae8 0000 ........ 00002764 : ... 276c: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................ 277c: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3.. 278c: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0.......... 279c: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?... 27ac: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................ 27bc: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................ ... 000027e4 : 27e4: 0053 00a7 00fa 01f4 03e8 0000 S........... 000027f0 : ... 27f8: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~ 2808: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8.. 2818: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8 2828: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<........... 2838: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 ..>....<~..~<. 2888: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{.... 2898: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a`<.|.. 2918: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v. 2928: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000... 2938: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.l...... 2c88: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|. 2c98: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v. 2ca8: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~.. 2cb8: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|. 2cc8: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f.. 2cd8: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~.......... 2ce8: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v. 2cf8: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|. 2d08: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff. 2d18: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v........~.. 2d28: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>. 2d38: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................ 2d48: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j.. 2d58: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3.. 2d68: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".". 2d78: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w. 2d88: 1818 1818 1818 1818 1818 1818 18f8 1818 ................ 2d98: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666 2da8: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........ 2db8: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666 2dc8: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666...... 2dd8: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............ 2de8: 0000 0000 18f8 1818 1818 1818 001f 0000 ................ 2df8: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................ 2e08: 1818 1818 181f 1818 0000 0000 00ff 0000 ................ 2e18: 1818 1818 18ff 1818 1818 181f 181f 1818 ................ 2e28: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?... 2e38: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666...... 2e48: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666 2e58: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666 2e68: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666.... 2e78: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666 2e88: 3636 3636 003f 0000 1818 181f 001f 0000 6666?........... 2e98: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666 2ea8: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........ 2eb8: 1818 1818 00f8 0000 0000 0000 181f 1818 ................ 2ec8: ffff ffff ffff ffff 0000 0000 ffff ffff ................ 2ed8: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................ 2ee8: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v. 2ef8: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x............... 2f08: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`... 2f18: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|. 2f28: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.ff<...~..~.. 2f58: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0.. 2f68: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|.............. 2f78: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~. 2f88: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~......... 2f98: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~.... 2fa8: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8.... 2fb8: 0000 1800 0018 0000 0000 1800 0000 0000 ................ 2fc8: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666... 2fd8: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<.. ...