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: 3cd0006f j bcc 4: 00000000 .word 0x00000000 8: 00000c40 .word 0x00000c40 c: 00000c3e .word 0x00000c3e ... 30: 00000c3e .word 0x00000c3e 34: 00000000 .word 0x00000000 38: 00000c3e .word 0x00000c3e 3c: 00000000 .word 0x00000000 40: 00000c3e .word 0x00000c3e 44: 00000c3e .word 0x00000c3e 48: 00000c3e .word 0x00000c3e 4c: 00000c3e .word 0x00000c3e 50: 00001bc8 .word 0x00001bc8 54: 00000c3e .word 0x00000c3e 58: 00000c3e .word 0x00000c3e 5c: 00000c3e .word 0x00000c3e 60: 00000c3e .word 0x00000c3e 64: 00000c3e .word 0x00000c3e 68: 00000c3e .word 0x00000c3e 6c: 00000c3e .word 0x00000c3e 70: 00000c3e .word 0x00000c3e 74: 00000c3e .word 0x00000c3e 78: 00000c3e .word 0x00000c3e 7c: 00000c3e .word 0x00000c3e 80: 00000c3e .word 0x00000c3e 84: 00000c3e .word 0x00000c3e 88: 00000c3e .word 0x00000c3e 8c: 00000c3e .word 0x00000c3e 90: 00000c3e .word 0x00000c3e 94: 00000c3e .word 0x00000c3e 98: 00001bec .word 0x00001bec 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: c6418513 addi a0,gp,-924 # 20000060 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: 660d lui a2,0x3 23a: 97ba add a5,a5,a4 23c: 98c60613 addi a2,a2,-1652 # 298c 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: c071c783 lbu a5,-1017(gp) # 20000003 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: c5018713 addi a4,gp,-944 # 2000004c 3b4: 01074703 lbu a4,16(a4) 3b8: c371 beqz a4,47c 3ba: c5018793 addi a5,gp,-944 # 2000004c 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: c4e18623 sb a4,-948(gp) # 20000048 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: c4818413 addi s0,gp,-952 # 20000044 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: c4418713 addi a4,gp,-956 # 20000040 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: c4418493 addi s1,gp,-956 # 20000040 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: c5018793 addi a5,gp,-944 # 2000004c 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: c5018413 addi s0,gp,-944 # 2000004c 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: c401a583 lw a1,-960(gp) # 2000003c 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: c5018313 addi t1,gp,-944 # 2000004c 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: c2e18f23 sb a4,-962(gp) # 2000003a 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: c6418513 addi a0,gp,-924 # 20000060 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 : { bae: 1171 addi sp,sp,-4 ssd1306_cmd(SSD1306_SETCONTRAST); bb0: 08100513 li a0,129 { bb4: c006 sw ra,0(sp) ssd1306_cmd(SSD1306_SETCONTRAST); bb6: 3ff1 jal b92 ssd1306_cmd(brightness_opts[bright_idx]); bb8: c061c783 lbu a5,-1018(gp) # 20000002 bbc: c2818713 addi a4,gp,-984 # 20000024 bc0: 97ba add a5,a5,a4 } bc2: 4082 lw ra,0(sp) ssd1306_cmd(brightness_opts[bright_idx]); bc4: 0007c503 lbu a0,0(a5) } bc8: 0111 addi sp,sp,4 ssd1306_cmd(brightness_opts[bright_idx]); bca: b7e1 j b92 00000bcc : asm volatile( "\n\ bcc: 20000197 auipc gp,0x20000 bd0: 83018193 addi gp,gp,-2000 # 200003fc <__global_pointer$> bd4: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack> bd8: 6509 lui a0,0x2 bda: 88050513 addi a0,a0,-1920 # 1880 bde: 30051073 csrw mstatus,a0 be2: fffff697 auipc a3,0xfffff be6: 41e68693 addi a3,a3,1054 # 0 bea: 0036e693 ori a3,a3,3 bee: 30569073 csrw mtvec,a3 asm volatile( bf2: c2c18513 addi a0,gp,-980 # 20000028 bf6: 06418593 addi a1,gp,100 # 20000460 <_ebss> bfa: 4601 li a2,0 bfc: 00b55663 bge a0,a1,c08 c00: c110 sw a2,0(a0) c02: 0511 addi a0,a0,4 c04: feb54ee3 blt a0,a1,c00 c08: 00002517 auipc a0,0x2 c0c: 58450513 addi a0,a0,1412 # 318c <_data_lma> c10: c0418593 addi a1,gp,-1020 # 20000000 c14: c2c18613 addi a2,gp,-980 # 20000028 c18: 00c58863 beq a1,a2,c28 c1c: 4114 lw a3,0(a0) c1e: c194 sw a3,0(a1) c20: 0511 addi a0,a0,4 c22: 0591 addi a1,a1,4 c24: fec59ae3 bne a1,a2,c18 SysTick->CTLR = 1; c28: e000f7b7 lui a5,0xe000f c2c: 4705 li a4,1 c2e: c398 sw a4,0(a5) asm volatile( c30: 6785 lui a5,0x1 c32: d2878793 addi a5,a5,-728 # d28
c36: 34179073 csrw mepc,a5 c3a: 30200073 mret 00000c3e : asm volatile( "1: j 1b" ); c3e: a001 j c3e 00000c40 : RCC->INTR |= RCC_CSSC; // clear the clock security int flag c40: 40021737 lui a4,0x40021 c44: 471c lw a5,8(a4) c46: 008006b7 lui a3,0x800 c4a: 8fd5 or a5,a5,a3 c4c: c71c sw a5,8(a4) 00000c4e : WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; } c4e: 962a add a2,a2,a0 c50: 87aa mv a5,a0 c52: 00c79363 bne a5,a2,c58 c56: 8082 ret c58: 00b78023 sb a1,0(a5) c5c: 0785 addi a5,a5,1 c5e: bfd5 j c52 00000c60 : memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer)); c60: 40000613 li a2,1024 c64: 4581 li a1,0 c66: c6418513 addi a0,gp,-924 # 20000060 c6a: b7d5 j c4e 00000c6c : for (; n; n--) *d++ = *s++; c6c: 4781 li a5,0 c6e: 00f61363 bne a2,a5,c74 } c72: 8082 ret for (; n; n--) *d++ = *s++; c74: 00f58733 add a4,a1,a5 c78: 00074683 lbu a3,0(a4) # 40021000 <_eusrstack+0x20020800> c7c: 00f50733 add a4,a0,a5 c80: 0785 addi a5,a5,1 c82: 00d70023 sb a3,0(a4) c86: b7e5 j c6e 00000c88 : { c88: 7179 addi sp,sp,-48 ssd1306_cmd(SSD1306_COLUMNADDR); c8a: 02100513 li a0,33 { c8e: d606 sw ra,44(sp) c90: d422 sw s0,40(sp) c92: d226 sw s1,36(sp) ssd1306_cmd(SSD1306_COLUMNADDR); c94: 3dfd jal b92 ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset) c96: 4501 li a0,0 c98: 3ded jal b92 ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset) c9a: 07f00513 li a0,127 c9e: 3dd5 jal b92 ssd1306_cmd(SSD1306_PAGEADDR); ca0: 02200513 li a0,34 ca4: 35fd jal b92 ssd1306_cmd(0); // Page start address (0 = reset) ca6: 4501 li a0,0 ca8: 35ed jal b92 ssd1306_cmd(7); // Page end address caa: 451d li a0,7 cac: c6418413 addi s0,gp,-924 # 20000060 cb0: 35cd jal b92 for(i=0;i return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1); cca: 02100593 li a1,33 cce: 850a mv a0,sp cd0: 02040413 addi s0,s0,32 cd4: 3355 jal a78 cd6: fe9410e3 bne s0,s1,cb6 } cda: 50b2 lw ra,44(sp) cdc: 5422 lw s0,40(sp) cde: 5492 lw s1,36(sp) ce0: 6145 addi sp,sp,48 ce2: 8082 ret 00000ce4 : //#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 ce4: 400227b7 lui a5,0x40022 ce8: 4705 li a4,1 cea: 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; cec: 400217b7 lui a5,0x40021 RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. cf0: 01080737 lui a4,0x1080 RCC->CFGR0 = BASE_CFGR0; cf4: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804> RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL. cf8: 08170713 addi a4,a4,129 # 1080081 cfc: 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. cfe: 009f0737 lui a4,0x9f0 d02: 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 d04: 4398 lw a4,0(a5) d06: 00671693 slli a3,a4,0x6 d0a: fe06dde3 bgez a3,d04 #if defined(CH32H41x) RCC->PLLCFGR |= RCC_SYSPLL_GATE; #endif uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW d0e: 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 d10: 400216b7 lui a3,0x40021 uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW d14: 9b71 andi a4,a4,-4 RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source d16: 00276713 ori a4,a4,2 d1a: c3d8 sw a4,4(a5) while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source d1c: 4721 li a4,8 d1e: 42dc lw a5,4(a3) d20: 8bb1 andi a5,a5,12 d22: fee79ee3 bne a5,a4,d1e SetupDebugPrintf(); #endif #if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS CallConstructors(); #endif } d26: 8082 ret 00000d28
: } } // ----------------------------------------------------------------- main int main(void) { d28: 7175 addi sp,sp,-144 d2a: c706 sw ra,140(sp) d2c: c522 sw s0,136(sp) d2e: c326 sw s1,132(sp) SystemInit(); d30: 3f55 jal ce4 reset_cause = RCC->RSTSCKR & 0xFC000000; // latch reset flags... d32: 400217b7 lui a5,0x40021 d36: 53d8 lw a4,36(a5) d38: fc0006b7 lui a3,0xfc000 d3c: 8f75 and a4,a4,a3 d3e: c2e1ac23 sw a4,-968(gp) # 20000034 RCC->RSTSCKR |= RCC_RMVF; // ...then clear for next boot d42: 53d8 lw a4,36(a5) d44: 010006b7 lui a3,0x1000 funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d48: 400114b7 lui s1,0x40011 RCC->RSTSCKR |= RCC_RMVF; // ...then clear for next boot d4c: 8f55 or a4,a4,a3 d4e: d3d8 sw a4,36(a5) funGpioInitAll(); d50: 4f98 lw a4,24(a5) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d52: 767d lui a2,0xfffff d54: 0ff60613 addi a2,a2,255 # fffff0ff <_eusrstack+0xdfffe8ff> funGpioInitAll(); d58: 03576713 ori a4,a4,53 d5c: cf98 sw a4,24(a5) funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d5e: 80048713 addi a4,s1,-2048 # 40010800 <_eusrstack+0x20010000> d62: 4314 lw a3,0(a4) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); d64: f10005b7 lui a1,0xf1000 d68: 15fd addi a1,a1,-1 # f0ffffff <_eusrstack+0xd0fff7ff> funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d6a: f0f6f693 andi a3,a3,-241 d6e: 0106e693 ori a3,a3,16 d72: c314 sw a3,0(a4) funDigitalWrite(LED_PIN, FUN_LOW); d74: 000206b7 lui a3,0x20 d78: cb14 sw a3,16(a4) funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d7a: 40048713 addi a4,s1,1024 d7e: 4314 lw a3,0(a4) funDigitalWrite(BTN_OK, FUN_HIGH); d80: 4505 li a0,1 AFIO->EXTICR |= AFIO_EXTICR_EXTI0_PC | // OK on PC0 d82: 40010337 lui t1,0x40010 funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP); d86: 8ef1 and a3,a3,a2 d88: 1006e693 ori a3,a3,256 d8c: c314 sw a3,0(a4) funDigitalWrite(BUZZER, FUN_LOW); d8e: 000406b7 lui a3,0x40 d92: cb14 sw a3,16(a4) funPinMode(BTN_OK, GPIO_CNF_IN_PUPD); d94: 4094 lw a3,0(s1) d96: 9ac1 andi a3,a3,-16 d98: 0086e693 ori a3,a3,8 d9c: c094 sw a3,0(s1) funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD); d9e: 4314 lw a3,0(a4) da0: 8eed and a3,a3,a1 da2: 080005b7 lui a1,0x8000 da6: 8ecd or a3,a3,a1 da8: c314 sw a3,0(a4) funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD); daa: 4314 lw a3,0(a4) dac: ff1005b7 lui a1,0xff100 db0: 15fd addi a1,a1,-1 # ff0fffff <_eusrstack+0xdf0ff7ff> db2: 8eed and a3,a3,a1 db4: 008005b7 lui a1,0x800 db8: 8ecd or a3,a3,a1 dba: c314 sw a3,0(a4) funDigitalWrite(BTN_OK, FUN_HIGH); dbc: c888 sw a0,16(s1) funDigitalWrite(BTN_LEFT, FUN_HIGH); dbe: 04000593 li a1,64 dc2: cb0c sw a1,16(a4) funDigitalWrite(BTN_RIGHT, FUN_HIGH); dc4: 02000693 li a3,32 dc8: cb14 sw a3,16(a4) AFIO->EXTICR |= AFIO_EXTICR_EXTI0_PC | // OK on PC0 dca: 00832703 lw a4,8(t1) # 40010008 <_eusrstack+0x2000f808> dce: 6691 lui a3,0x4 dd0: c0268693 addi a3,a3,-1022 # 3c02 dd4: 8f55 or a4,a4,a3 dd6: 00e32423 sw a4,8(t1) EXTI->INTENR |= EXTI_Line0 | EXTI_Line5 | EXTI_Line6; dda: 40030713 addi a4,t1,1024 dde: 4314 lw a3,0(a4) } // 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)); de0: e000e337 lui t1,0xe000e de4: 0616e693 ori a3,a3,97 de8: c314 sw a3,0(a4) EXTI->FTENR |= EXTI_Line0 | EXTI_Line5 | EXTI_Line6; // press == falling edge dea: 4754 lw a3,12(a4) dec: 0616e693 ori a3,a3,97 df0: c754 sw a3,12(a4) df2: 00100737 lui a4,0x100 df6: 10e32023 sw a4,256(t1) # e000e100 <_eusrstack+0xc000d900> RCC->APB1PCENR |= RCC_APB1Periph_TIM2; dfa: 4fd8 lw a4,28(a5) TIM2->PSC = 23999; // 24 MHz / 24000 = 1 kHz (1 ms/count) dfc: 6699 lui a3,0x6 dfe: dbf68693 addi a3,a3,-577 # 5dbf RCC->APB1PCENR |= RCC_APB1Periph_TIM2; e02: 8f49 or a4,a4,a0 e04: cfd8 sw a4,28(a5) TIM2->PSC = 23999; // 24 MHz / 24000 = 1 kHz (1 ms/count) e06: 40000737 lui a4,0x40000 e0a: 02d71423 sh a3,40(a4) # 40000028 <_eusrstack+0x1ffff828> TIM2->ATRLR = TICK_MS - 1; // overflow once per game tick e0e: 6691 lui a3,0x4 e10: a9768693 addi a3,a3,-1385 # 3a97 e14: 02d71623 sh a3,44(a4) TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; e18: 56f9 li a3,-2 TIM2->SWEVGR = TIM_PSCReloadMode_Immediate; // latch PSC/ARR now e1a: 00a71a23 sh a0,20(a4) TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; e1e: 00d71823 sh a3,16(a4) TIM2->DMAINTENR |= TIM_UIE; // enable update interrupt e22: 00c75683 lhu a3,12(a4) e26: 8ec9 or a3,a3,a0 e28: 00d71623 sh a3,12(a4) gpio_setup(); lowpower_setup(); // button-wake EXTI + periodic-check timer Delay_Ms(120); // let the OLED rail settle e2c: 000b0537 lui a0,0xb0 e30: 10b32223 sw a1,260(t1) e34: c8050513 addi a0,a0,-896 # afc80 e38: ae6ff0ef jal 11e * init I2C and GPIO */ uint8_t ssd1306_i2c_init(void) { // Enable GPIOC and I2C RCC->APB1PCENR |= RCC_APB1Periph_I2C1; e3c: 400217b7 lui a5,0x40021 e40: 4fd8 lw a4,28(a5) e42: 002006b7 lui a3,0x200 e46: 8f55 or a4,a4,a3 e48: cfd8 sw a4,28(a5) 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; e4a: 4f98 lw a4,24(a5) e4c: 01176713 ori a4,a4,17 e50: cf98 sw a4,24(a5) // PC1 is SDA, 10MHz Output, alt func, open-drain GPIOC->CFGLR &= ~(0xf<<(4*1)); e52: 409c lw a5,0(s1) 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)); e54: 777d lui a4,0xfffff e56: 0ff70613 addi a2,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff> GPIOC->CFGLR &= ~(0xf<<(4*1)); e5a: f0f7f793 andi a5,a5,-241 e5e: c09c sw a5,0(s1) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); e60: 409c lw a5,0(s1) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); e62: 6705 lui a4,0x1 e64: d0070713 addi a4,a4,-768 # d00 GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1); e68: 0d07e793 ori a5,a5,208 e6c: c09c sw a5,0(s1) GPIOC->CFGLR &= ~(0xf<<(4*2)); e6e: 409c lw a5,0(s1) e70: 8ff1 and a5,a5,a2 e72: c09c sw a5,0(s1) GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2); e74: 409c lw a5,0(s1) e76: 8fd9 or a5,a5,a4 e78: c09c sw a5,0(s1) ssd1306_setbuf(0); // initialize OLED #if !defined(SSD1306_CUSTOM_INIT_ARRAY) || !SSD1306_CUSTOM_INIT_ARRAY uint8_t *cmd_list = (uint8_t *)ssd1306_init_array; e7a: 6489 lui s1,0x2 GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4); GPIOC->BSHR = (1<<(16+4)); #endif // load I2C regs ssd1306_i2c_setup(); e7c: ab4ff0ef jal 130 e80: 6fc48493 addi s1,s1,1788 # 26fc ssd1306_setbuf(0); e84: 3bf1 jal c60 while(*cmd_list != SSD1306_TERMINATE_CMDS) e86: 0004c503 lbu a0,0(s1) e8a: 0ff00793 li a5,255 e8e: 00f51463 bne a0,a5,e96 { if(ssd1306_cmd(*cmd_list++)) return 1; } ssd1306_refresh(); e92: 3bdd jal c88 #endif return 0; e94: a021 j e9c if(ssd1306_cmd(*cmd_list++)) e96: 0485 addi s1,s1,1 e98: 39ed jal b92 e9a: d575 beqz a0,e86 if (ssd1306_i2c_init()) { // non-zero == failure // no display: fall back to a heartbeat blink so the board still shows life while (1) { led_blink(); Delay_Ms(700); } } ssd1306_init(); apply_brightness(); // start at the configured (dimmer) brightness e9c: 3b09 jal bae ssd1306_setbuf(0); e9e: 33c9 jal c60 for (uint8_t i = 0; i < 5; i++) { ea0: 6789 lui a5,0x2 ea2: 71878793 addi a5,a5,1816 # 2718 ssd1306_setbuf(0); ea6: 4481 li s1,0 ssd1306_drawstr(0, i * 10, boot[i], 1); ea8: 4390 lw a2,0(a5) eaa: 4685 li a3,1 eac: 85a6 mv a1,s1 eae: 4501 li a0,0 eb0: c03e sw a5,0(sp) eb2: b66ff0ef jal 218 ssd1306_refresh(); eb6: 3bc9 jal c88 beep(1200 + i * 120, 25); eb8: 00149513 slli a0,s1,0x1 ebc: 9526 add a0,a0,s1 ebe: 050a slli a0,a0,0x2 ec0: 4b050513 addi a0,a0,1200 ec4: 0542 slli a0,a0,0x10 ec6: 8141 srli a0,a0,0x10 ec8: 45e5 li a1,25 eca: c4cff0ef jal 316 Delay_Ms(220); ece: 00142537 lui a0,0x142 ed2: 44050513 addi a0,a0,1088 # 142440 ed6: a48ff0ef jal 11e for (uint8_t i = 0; i < 5; i++) { eda: 4782 lw a5,0(sp) edc: 04a9 addi s1,s1,10 ede: 03200713 li a4,50 ee2: 0791 addi a5,a5,4 ee4: fce492e3 bne s1,a4,ea8 rp = s_cat(rp, "rst:"); ee8: 6589 lui a1,0x2 eea: c3858593 addi a1,a1,-968 # 1c38 eee: 0088 addi a0,sp,64 ef0: bb4ff0ef jal 2a4 if (reset_cause & RCC_LPWRRSTF) rp = s_cat(rp, "LPW "); ef4: c381a403 lw s0,-968(gp) # 20000034 rp = s_cat(rp, "rst:"); ef8: 87aa mv a5,a0 if (reset_cause & RCC_LPWRRSTF) rp = s_cat(rp, "LPW "); efa: 00045863 bgez s0,f0a efe: 6589 lui a1,0x2 f00: c4058593 addi a1,a1,-960 # 1c40 f04: ba0ff0ef jal 2a4 f08: 87aa mv a5,a0 if (reset_cause & RCC_WWDGRSTF) rp = s_cat(rp, "WWD "); f0a: 00141713 slli a4,s0,0x1 f0e: 00075963 bgez a4,f20 f12: 6589 lui a1,0x2 f14: 853e mv a0,a5 f16: c4858593 addi a1,a1,-952 # 1c48 f1a: b8aff0ef jal 2a4 f1e: 87aa mv a5,a0 if (reset_cause & RCC_IWDGRSTF) rp = s_cat(rp, "WDG "); f20: 00241713 slli a4,s0,0x2 f24: 00075963 bgez a4,f36 f28: 6589 lui a1,0x2 f2a: 853e mv a0,a5 f2c: c5058593 addi a1,a1,-944 # 1c50 f30: b74ff0ef jal 2a4 f34: 87aa mv a5,a0 if (reset_cause & RCC_SFTRSTF) rp = s_cat(rp, "SFT "); f36: 00341713 slli a4,s0,0x3 f3a: 00075963 bgez a4,f4c f3e: 6589 lui a1,0x2 f40: 853e mv a0,a5 f42: c5858593 addi a1,a1,-936 # 1c58 f46: b5eff0ef jal 2a4 f4a: 87aa mv a5,a0 if (reset_cause & RCC_PORRSTF) rp = s_cat(rp, "POR "); f4c: 00441713 slli a4,s0,0x4 f50: 00075963 bgez a4,f62 f54: 6589 lui a1,0x2 f56: 853e mv a0,a5 f58: c6058593 addi a1,a1,-928 # 1c60 f5c: b48ff0ef jal 2a4 f60: 87aa mv a5,a0 if (reset_cause & RCC_PINRSTF) rp = s_cat(rp, "PIN "); f62: 00541713 slli a4,s0,0x5 f66: 00075963 bgez a4,f78 f6a: 6589 lui a1,0x2 f6c: 853e mv a0,a5 f6e: c6858593 addi a1,a1,-920 # 1c68 f72: b32ff0ef jal 2a4 f76: 87aa mv a5,a0 if (rp == rc + 4) rp = s_cat(rp, "none"); f78: 00d8 addi a4,sp,68 f7a: 00e79963 bne a5,a4,f8c f7e: 6589 lui a1,0x2 f80: 853e mv a0,a5 f82: c7058593 addi a1,a1,-912 # 1c70 f86: b1eff0ef jal 2a4 f8a: 87aa mv a5,a0 *rp = 0; f8c: 00078023 sb zero,0(a5) ssd1306_drawstr(0, 44, rc, 1); f90: 4685 li a3,1 f92: 0090 addi a2,sp,64 f94: 02c00593 li a1,44 f98: 4501 li a0,0 f9a: a7eff0ef jal 218 draw_center_str(54, "press any key"); f9e: 6589 lui a1,0x2 fa0: c7858593 addi a1,a1,-904 # 1c78 fa4: 03600513 li a0,54 fa8: f9eff0ef jal 746 ssd1306_refresh(); fac: 39f1 jal c88 beep(988, 120); fae: 07800593 li a1,120 fb2: 3dc00513 li a0,988 fb6: b60ff0ef jal 316 fba: 0c800413 li s0,200 Buttons b = read_buttons(); fbe: fb0ff0ef jal 76e fc2: 00855713 srli a4,a0,0x8 fc6: 01055793 srli a5,a0,0x10 fca: 02e10ca3 sb a4,57(sp) if (b.ok || b.left || b.right) break; fce: 8f49 or a4,a4,a0 Buttons b = read_buttons(); fd0: 02f10d23 sb a5,58(sp) if (b.ok || b.left || b.right) break; fd4: 8fd9 or a5,a5,a4 Buttons b = read_buttons(); fd6: 02a10c23 sb a0,56(sp) if (b.ok || b.left || b.right) break; fda: 0ff7f793 zext.b a5,a5 fde: eb81 bnez a5,fee Delay_Ms(20); fe0: 6575 lui a0,0x1d fe2: 4c050513 addi a0,a0,1216 # 1d4c0 for (int i = 0; i < 200; i++) { fe6: 147d addi s0,s0,-1 Delay_Ms(20); fe8: 936ff0ef jal 11e for (int i = 0; i < 200; i++) { fec: f869 bnez s0,fbe splash(); screen = SCR_SELECT; // pick a species before a pet is born fee: c2018f23 sb zero,-962(gp) # 2000003a Buttons prev = {0, 0, 0}; ff2: 4481 li s1,0 ff4: 4701 li a4,0 ff6: 4781 li a5,0 while (1) { if (!disp_on) { ff8: c051c683 lbu a3,-1019(gp) # 20000001 ffc: eadd bnez a3,10b2 TIM2->CNT = 0; ffe: 400007b7 lui a5,0x40000 TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; 1002: 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 1004: e000f5b7 lui a1,0xe000f exti_wake = 0; 1008: c2018ea3 sb zero,-963(gp) # 20000039 tick_wake = 0; 100c: c2018e23 sb zero,-964(gp) # 20000038 TIM2->CNT = 0; 1010: 02079223 sh zero,36(a5) # 40000024 <_eusrstack+0x1ffff824> TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; 1014: 00579823 sh t0,16(a5) TIM2->CTLR1 |= TIM_CEN; // arm the periodic wake 1018: 0007d703 lhu a4,0(a5) 101c: 00176713 ori a4,a4,1 1020: 00e79023 sh a4,0(a5) 1024: d105a703 lw a4,-752(a1) # e000ed10 <_eusrstack+0xc000e510> 1028: 9b5d andi a4,a4,-9 102a: d0e5a823 sw a4,-752(a1) __ASM volatile ("wfi"); 102e: 10500073 wfi TIM2->CTLR1 &= ~TIM_CEN; // halt it while we're awake 1032: 0007d703 lhu a4,0(a5) 1036: 66c1 lui a3,0x10 1038: 16f9 addi a3,a3,-2 # fffe 103a: 8f75 and a4,a4,a3 103c: 00e79023 sh a4,0(a5) if (exti_wake) { // a button: bring the screen back 1040: c3d1c703 lbu a4,-963(gp) # 20000039 1044: c721 beqz a4,108c ssd1306_cmd(SSD1306_DISPLAYON); 1046: 0af00513 li a0,175 104a: 36a1 jal b92 disp_on = 1; 104c: 4785 li a5,1 104e: c0f182a3 sb a5,-1019(gp) # 20000001 idle_frames = 0; 1052: c201aa23 sw zero,-972(gp) # 20000030 tick_acc = 0; 1056: c2019723 sh zero,-978(gp) # 2000002a // 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(); 105a: f14ff0ef jal 76e 105e: 00855713 srli a4,a0,0x8 1062: 01055793 srli a5,a0,0x10 1066: 02e108a3 sb a4,49(sp) 106a: 02f10923 sb a5,50(sp) 106e: 0ff57693 zext.b a3,a0 1072: 0ff77713 zext.b a4,a4 1076: 0ff7f793 zext.b a5,a5 107a: 02a10823 sb a0,48(sp) 107e: ca36 sw a3,20(sp) 1080: cc3a sw a4,24(sp) 1082: ce3e sw a5,28(sp) beep(988, 120); 1084: 44f2 lw s1,28(sp) 1086: 4762 lw a4,24(sp) 1088: 47d2 lw a5,20(sp) 108a: b7bd j ff8 if (pet.alive) { 108c: c5018493 addi s1,gp,-944 # 2000004c 1090: 0104c703 lbu a4,16(s1) 1094: db35 beqz a4,1008 game_tick(); 1096: c76ff0ef jal 50c if (!pet.alive) { // it died in its sleep: show the grave 109a: 0104c783 lbu a5,16(s1) 109e: f3a5 bnez a5,ffe ssd1306_cmd(SSD1306_DISPLAYON); 10a0: 0af00513 li a0,175 10a4: 34fd jal b92 disp_on = 1; 10a6: 4785 li a5,1 10a8: c0f182a3 sb a5,-1019(gp) # 20000001 idle_frames = 0; 10ac: c201aa23 sw zero,-972(gp) # 20000030 return; 10b0: b76d j 105a 10b2: c43e sw a5,8(sp) 10b4: c23a sw a4,4(sp) continue; } Buttons b = read_buttons(); 10b6: eb8ff0ef jal 76e 10ba: 00855613 srli a2,a0,0x8 10be: 0ff57793 zext.b a5,a0 10c2: 01055693 srli a3,a0,0x10 10c6: ca3e sw a5,20(sp) 10c8: 0ff67793 zext.b a5,a2 10cc: cc3e sw a5,24(sp) 10ce: 0ff6f793 zext.b a5,a3 10d2: ce3e sw a5,28(sp) uint8_t ok_edge = b.ok && !prev.ok; 10d4: 47d2 lw a5,20(sp) Buttons b = read_buttons(); 10d6: 02a10a23 sb a0,52(sp) 10da: 02c10aa3 sb a2,53(sp) 10de: 02d10b23 sb a3,54(sp) uint8_t ok_edge = b.ok && !prev.ok; 10e2: c002 sw zero,0(sp) 10e4: 4712 lw a4,4(sp) 10e6: c789 beqz a5,10f0 10e8: 47a2 lw a5,8(sp) 10ea: 0017b793 seqz a5,a5 10ee: c03e sw a5,0(sp) uint8_t left_edge = b.left && !prev.left; 10f0: 46e2 lw a3,24(sp) uint8_t ok_edge = b.ok && !prev.ok; 10f2: 00014783 lbu a5,0(sp) uint8_t left_edge = b.left && !prev.left; 10f6: 4581 li a1,0 10f8: c299 beqz a3,10fe 10fa: 00173593 seqz a1,a4 uint8_t right_edge = b.right && !prev.right; 10fe: 4672 lw a2,28(sp) uint8_t left_edge = b.left && !prev.left; 1100: 0ff5f713 zext.b a4,a1 uint8_t right_edge = b.right && !prev.right; 1104: 4681 li a3,0 1106: c219 beqz a2,110c 1108: 0014b693 seqz a3,s1 uint8_t any_edge = ok_edge | left_edge | right_edge; 110c: 8fd9 or a5,a5,a4 110e: 8fd5 or a5,a5,a3 prev = b; if (any_edge) idle_frames = 0; 1110: c399 beqz a5,1116 1112: c201aa23 sw zero,-972(gp) # 20000030 { switch (screen) { 1116: c3e1c703 lbu a4,-962(gp) # 2000003a 111a: 4611 li a2,4 111c: 7ee66963 bltu a2,a4,190e 1120: 6609 lui a2,0x2 1122: 070a slli a4,a4,0x2 1124: e6c60613 addi a2,a2,-404 # 1e6c 1128: 9732 add a4,a4,a2 112a: 4318 lw a4,0(a4) 112c: 8702 jr a4 case SCR_SELECT: if (left_edge) { 112e: c185 beqz a1,114e sel_species = (sel_species + SPECIES_COUNT - 1) % SPECIES_COUNT; 1130: c331c503 lbu a0,-973(gp) # 2000002f 1134: 458d li a1,3 1136: c236 sw a3,4(sp) 1138: 0509 addi a0,a0,2 113a: fbffe0ef jal f8 <__modsi3> 113e: c2a189a3 sb a0,-973(gp) # 2000002f beep(1047, 25); 1142: 45e5 li a1,25 1144: 41700513 li a0,1047 1148: 9ceff0ef jal 316 114c: 4692 lw a3,4(sp) } if (right_edge) { 114e: ce91 beqz a3,116a sel_species = (sel_species + 1) % SPECIES_COUNT; 1150: c331c503 lbu a0,-973(gp) # 2000002f 1154: 458d li a1,3 1156: 0505 addi a0,a0,1 1158: fa1fe0ef jal f8 <__modsi3> 115c: c2a189a3 sb a0,-973(gp) # 2000002f beep(1047, 25); 1160: 45e5 li a1,25 1162: 41700513 li a0,1047 1166: 9b0ff0ef jal 316 } if (ok_edge) { // born! boot the chosen species 116a: 4782 lw a5,0(sp) 116c: c3b5 beqz a5,11d0 pet.satiety = 80; 116e: 645a5737 lui a4,0x645a5 1172: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850> 1176: c4e1a823 sw a4,-944(gp) # 2000004c pet.health = 100; 117a: c5018793 addi a5,gp,-944 # 2000004c 117e: 06400713 li a4,100 1182: 00e78223 sb a4,4(a5) pet.species = sel_species; 1186: c331c703 lbu a4,-973(gp) # 2000002f pet.age_min = 0; 118a: 00079323 sh zero,6(a5) pet.xp = 0; 118e: 00079423 sh zero,8(a5) pet.species = sel_species; 1192: 00e78523 sb a4,10(a5) pet.level = 1; 1196: 4705 li a4,1 1198: 00e785a3 sb a4,11(a5) pet.form = FORM_PROC; 119c: 0007a623 sw zero,12(a5) pet.alive = 1; 11a0: 00e78823 sb a4,16(a5) cursor = 0; 11a4: c2018923 sb zero,-974(gp) # 2000002e evo_anim = 0; 11a8: c4018623 sb zero,-948(gp) # 20000048 for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } 11ac: c401a223 sw zero,-956(gp) # 20000040 pet_reset(); // sets screen = SCR_MAIN, species = sel_species beep(659, 80); beep(988, 120); 11b0: 05000593 li a1,80 11b4: 29300513 li a0,659 screen = SCR_MAIN; 11b8: c2e18f23 sb a4,-962(gp) # 2000003a for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; } 11bc: c401a423 sw zero,-952(gp) # 20000044 beep(659, 80); beep(988, 120); 11c0: 956ff0ef jal 316 11c4: 07800593 li a1,120 11c8: 3dc00513 li a0,988 11cc: 94aff0ef jal 316 ssd1306_setbuf(0); 11d0: 3c41 jal c60 draw_center_str(0, "~ $ adopt --pet"); 11d2: 6589 lui a1,0x2 11d4: c8858593 addi a1,a1,-888 # 1c88 11d8: 4501 li a0,0 11da: d6cff0ef jal 746 if((x >= SSD1306_W) || (y >= SSD1306_H)) return; 11de: 4685 li a3,1 11e0: 08000613 li a2,128 11e4: 45a9 li a1,10 11e6: 4501 li a0,0 11e8: db8ff0ef jal 7a0 ssd1306_drawImage(48, 13, species_frames[sel_species][EXP_IDLE], 11ec: c331c403 lbu s0,-973(gp) # 2000002f 11f0: 678d lui a5,0x3 11f2: 83878793 addi a5,a5,-1992 # 2838 11f6: 00341713 slli a4,s0,0x3 11fa: 8f01 sub a4,a4,s0 11fc: 070a slli a4,a4,0x2 11fe: 97ba add a5,a5,a4 1200: 4390 lw a2,0(a5) 1202: 02000713 li a4,32 1206: 86ba mv a3,a4 1208: 45b5 li a1,13 120a: 03000513 li a0,48 120e: faaff0ef jal 9b8 p = s_cat(p, "< "); 1212: 6589 lui a1,0x2 1214: c9858593 addi a1,a1,-872 # 1c98 1218: 0088 addi a0,sp,64 121a: 88aff0ef jal 2a4 p = s_cat(p, species_names[sel_species]); 121e: 6789 lui a5,0x2 1220: 040a slli s0,s0,0x2 1222: 72c78793 addi a5,a5,1836 # 272c 1226: 97a2 add a5,a5,s0 1228: 438c lw a1,0(a5) 122a: 87aff0ef jal 2a4 p = s_cat(p, " >"); 122e: 6589 lui a1,0x2 1230: c9c58593 addi a1,a1,-868 # 1c9c 1234: 870ff0ef jal 2a4 *p = 0; 1238: 00050023 sb zero,0(a0) draw_center_str(47, line); 123c: 008c addi a1,sp,64 123e: 02f00513 li a0,47 1242: d04ff0ef jal 746 draw_center_str(56, "L/R pick OK go"); 1246: 6589 lui a1,0x2 1248: ca058593 addi a1,a1,-864 # 1ca0 draw_center_str(56, "OK: respawn"); 124c: 03800513 li a0,56 1250: a98d j 16c2 } draw_select(); break; case SCR_MAIN: if (left_edge) { 1252: c185 beqz a1,1272 cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT; 1254: c321c503 lbu a0,-974(gp) # 2000002e 1258: 459d li a1,7 125a: c236 sw a3,4(sp) 125c: 0519 addi a0,a0,6 125e: e9bfe0ef jal f8 <__modsi3> 1262: c2a18923 sb a0,-974(gp) # 2000002e beep(1047, 25); 1266: 45e5 li a1,25 1268: 41700513 li a0,1047 126c: 8aaff0ef jal 316 1270: 4692 lw a3,4(sp) } if (right_edge) { 1272: ce91 beqz a3,128e cursor = (cursor + 1) % ICON_COUNT; 1274: c321c503 lbu a0,-974(gp) # 2000002e 1278: 459d li a1,7 127a: 0505 addi a0,a0,1 127c: e7dfe0ef jal f8 <__modsi3> 1280: c2a18923 sb a0,-974(gp) # 2000002e beep(1047, 25); 1284: 45e5 li a1,25 1286: 41700513 li a0,1047 128a: 88cff0ef jal 316 } if (ok_edge) do_action(cursor); 128e: 4782 lw a5,0(sp) 1290: c5018493 addi s1,gp,-944 # 2000004c 1294: 0e078e63 beqz a5,1390 switch (act) { 1298: c321c783 lbu a5,-974(gp) # 2000002e 129c: 4699 li a3,6 129e: 0ef6e963 bltu a3,a5,1390 12a2: 6689 lui a3,0x2 12a4: 078a slli a5,a5,0x2 12a6: e8068693 addi a3,a3,-384 # 1e80 12aa: 97b6 add a5,a5,a3 12ac: 439c lw a5,0(a5) 12ae: 8782 jr a5 pet.satiety = clamp100(pet.satiety + 30); 12b0: 00048783 lb a5,0(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12b4: 06400713 li a4,100 pet.satiety = clamp100(pet.satiety + 30); 12b8: 07f9 addi a5,a5,30 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12ba: 04f75563 bge a4,a5,1304 12be: 87ba mv a5,a4 12c0: 00f48023 sb a5,0(s1) pet.hygiene = clamp100(pet.hygiene - 5); 12c4: 00348783 lb a5,3(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12c8: 06400713 li a4,100 pet.hygiene = clamp100(pet.hygiene - 5); 12cc: 17ed addi a5,a5,-5 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 12ce: 04f75063 bge a4,a5,130e 12d2: 87ba mv a5,a4 12d4: 00f481a3 sb a5,3(s1) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 12d8: 4411 li s0,4 12da: c2818623 sb s0,-980(gp) # 20000028 12de: 4731 li a4,12 beep(880, 60); beep(1175, 80); 12e0: 03c00593 li a1,60 12e4: 37000513 li a0,880 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 12e8: c2e18823 sb a4,-976(gp) # 2000002c beep(880, 60); beep(1175, 80); 12ec: 82aff0ef jal 316 12f0: 05000593 li a1,80 12f4: 49700513 li a0,1175 beep(784, 60); beep(1047, 60); beep(1319, 90); 12f8: 81eff0ef jal 316 led_blink(); 12fc: 88aff0ef jal 386 add_xp(4); 1300: 4511 li a0,4 1302: a069 j 138c static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1304: fff7c713 not a4,a5 1308: 877d srai a4,a4,0x1f 130a: 8ff9 and a5,a5,a4 130c: bf55 j 12c0 130e: fff7c713 not a4,a5 1312: 877d srai a4,a4,0x1f 1314: 8ff9 and a5,a5,a4 1316: bf7d j 12d4 if (pet.energy < 15) { beep(220, 120); break; } // too tired 1318: 00248703 lb a4,2(s1) 131c: 47b9 li a5,14 131e: 00e7c963 blt a5,a4,1330 1322: 07800593 li a1,120 1326: 0dc00513 li a0,220 beep(659, 40); 132a: fedfe0ef jal 316 break; 132e: a08d j 1390 pet.happy = clamp100(pet.happy + 25); 1330: 00148783 lb a5,1(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1334: 06400693 li a3,100 pet.happy = clamp100(pet.happy + 25); 1338: 07e5 addi a5,a5,25 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 133a: 38f6d763 bge a3,a5,16c8 133e: 87b6 mv a5,a3 1340: 00f480a3 sb a5,1(s1) pet.energy = clamp100(pet.energy - 12); 1344: ff470793 addi a5,a4,-12 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1348: 06400713 li a4,100 134c: 00f75363 bge a4,a5,1352 1350: 87ba mv a5,a4 1352: 00f48123 sb a5,2(s1) static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1356: 4709 li a4,2 1358: c2e18623 sb a4,-980(gp) # 20000028 beep(988, 60); beep(1319, 60); beep(1568, 90); 135c: 03c00593 li a1,60 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1360: 4731 li a4,12 beep(988, 60); beep(1319, 60); beep(1568, 90); 1362: 3dc00513 li a0,988 static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; } 1366: c2e18823 sb a4,-976(gp) # 2000002c beep(988, 60); beep(1319, 60); beep(1568, 90); 136a: fadfe0ef jal 316 136e: 03c00593 li a1,60 1372: 52700513 li a0,1319 1376: fa1fe0ef jal 316 137a: 62000513 li a0,1568 137e: 05a00593 li a1,90 1382: f95fe0ef jal 316 led_blink(); 1386: 800ff0ef jal 386 add_xp(6); 138a: 4519 li a0,6 add_xp(4); 138c: 824ff0ef jal 3b0 ssd1306_setbuf(0); 1390: 8d1ff0ef jal c60 draw_center_str(0, menu_labels[cursor]); 1394: c321c783 lbu a5,-974(gp) # 2000002e 1398: 4501 li a0,0 139a: d03e sw a5,32(sp) 139c: 5702 lw a4,32(sp) 139e: 678d lui a5,0x3 13a0: 8bc78793 addi a5,a5,-1860 # 28bc 13a4: 070a slli a4,a4,0x2 13a6: 97ba add a5,a5,a4 13a8: 438c lw a1,0(a5) 13aa: b9cff0ef jal 746 if (pet.alive && pet.health < 30 && (frame & 8)) 13ae: 0104c783 lbu a5,16(s1) 13b2: c83e sw a5,16(sp) 13b4: c395 beqz a5,13d8 13b6: 00448703 lb a4,4(s1) 13ba: 47f5 li a5,29 13bc: 00e7ce63 blt a5,a4,13d8 13c0: c401a783 lw a5,-960(gp) # 2000003c 13c4: 8ba1 andi a5,a5,8 13c6: cb89 beqz a5,13d8 ssd1306_drawstr(0, 0, "!", 1); 13c8: 6609 lui a2,0x2 13ca: 4685 li a3,1 13cc: cb060613 addi a2,a2,-848 # 1cb0 13d0: 4581 li a1,0 13d2: 4501 li a0,0 13d4: e45fe0ef jal 218 bp = u_cat(bp, pet.level); 13d8: 00b4c583 lbu a1,11(s1) *bp++ = 'L'; 13dc: 04c00793 li a5,76 bp = u_cat(bp, pet.level); 13e0: 03910513 addi a0,sp,57 *bp++ = 'L'; 13e4: 02f10c23 sb a5,56(sp) bp = u_cat(bp, pet.level); 13e8: ecffe0ef jal 2b6 *bp = 0; 13ec: 00050023 sb zero,0(a0) ssd1306_drawstr(SSD1306_W - 2 * 8, 0, badge, 1); 13f0: 4685 li a3,1 13f2: 1830 addi a2,sp,56 13f4: 4581 li a1,0 13f6: 07000513 li a0,112 13fa: e1ffe0ef jal 218 13fe: 4685 li a3,1 1400: 08000613 li a2,128 1404: 45a9 li a1,10 1406: 4501 li a0,0 1408: b98ff0ef jal 7a0 if (pet.sleeping) { 140c: 00f4c403 lbu s0,15(s1) 1410: 38040463 beqz s0,1798 ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1); 1414: 6609 lui a2,0x2 1416: 4685 li a3,1 1418: cb460613 addi a2,a2,-844 # 1cb4 141c: 45b9 li a1,14 141e: 04e00513 li a0,78 1422: df7fe0ef jal 218 ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1); 1426: 6609 lui a2,0x2 1428: 4685 li a3,1 142a: cb860613 addi a2,a2,-840 # 1cb8 142e: 45b1 li a1,12 1430: 05400513 li a0,84 1434: de5fe0ef jal 218 1438: 03000793 li a5,48 143c: c43e sw a5,8(sp) px = 48; py = 16; 143e: 47c1 li a5,16 1440: c03e sw a5,0(sp) 1442: 03000793 li a5,48 1446: c23e sw a5,4(sp) if (pet.form == FORM_CLAUDE) spr = spr_claude; 1448: 00c4c783 lbu a5,12(s1) 144c: 6609 lui a2,0x2 144e: 7b860613 addi a2,a2,1976 # 27b8 1452: c63e sw a5,12(sp) 1454: 4732 lw a4,12(sp) 1456: 478d li a5,3 1458: 02f70b63 beq a4,a5,148e else if (pet.form == FORM_GLITCH) spr = spr_glitch; 145c: 46b2 lw a3,12(sp) 145e: 4711 li a4,4 1460: 3ae68663 beq a3,a4,180c if (!pet.alive) return EXP_DEAD; 1464: 4742 lw a4,16(sp) else spr = species_frames[pet.species][current_expression()]; 1466: 00a4c683 lbu a3,10(s1) if (!pet.alive) return EXP_DEAD; 146a: 4519 li a0,6 146c: c719 beqz a4,147a if (anim_timer) return anim_exp; 146e: c301c703 lbu a4,-976(gp) # 2000002c 1472: 34070f63 beqz a4,17d0 1476: c2c1c503 lbu a0,-980(gp) # 20000028 else spr = species_frames[pet.species][current_expression()]; 147a: 00369793 slli a5,a3,0x3 147e: 8f95 sub a5,a5,a3 1480: 670d lui a4,0x3 1482: 97aa add a5,a5,a0 1484: 078a slli a5,a5,0x2 1486: 83870713 addi a4,a4,-1992 # 2838 148a: 97ba add a5,a5,a4 148c: 4390 lw a2,0(a5) ssd1306_drawImage(x, y, spr, PANA_W, PANA_H, 0); 148e: 4582 lw a1,0(sp) 1490: 4522 lw a0,8(sp) 1492: 02000713 li a4,32 1496: 86ba mv a3,a4 1498: c832 sw a2,16(sp) 149a: d1eff0ef jal 9b8 if (spr != spr_claude && spr != spr_glitch && !pet.sleeping) 149e: 4642 lw a2,16(sp) 14a0: 6789 lui a5,0x2 14a2: 7b878793 addi a5,a5,1976 # 27b8 14a6: 10f60f63 beq a2,a5,15c4 14aa: 6789 lui a5,0x2 14ac: 73878793 addi a5,a5,1848 # 2738 14b0: 10f60a63 beq a2,a5,15c4 14b4: 10041863 bnez s0,15c4 if (pet.form >= FORM_USER) { // shades 14b8: 47b2 lw a5,12(sp) 14ba: 14078263 beqz a5,15fe uint8_t cy = eye_cy[sp], lx = eye_lx[sp], rx = eye_rx[sp]; 14be: 00a4c703 lbu a4,10(s1) 14c2: c0c18793 addi a5,gp,-1012 # 20000008 14c6: 97ba add a5,a5,a4 14c8: 0007c403 lbu s0,0(a5) 14cc: c1418693 addi a3,gp,-1004 # 20000010 14d0: c1018793 addi a5,gp,-1008 # 2000000c 14d4: 97ba add a5,a5,a4 14d6: 9736 add a4,a4,a3 ssd1306_fillRect(x + lx - 3, y + cy - 2, 7, 4, 0); 14d8: 0007c303 lbu t1,0(a5) 14dc: 00074703 lbu a4,0(a4) 14e0: 4682 lw a3,0(sp) 14e2: 4792 lw a5,4(sp) 14e4: 461d li a2,7 14e6: 00d702b3 add t0,a4,a3 14ea: 979a add a5,a5,t1 14ec: ffe28593 addi a1,t0,-2 14f0: ffd78513 addi a0,a5,-3 14f4: 4701 li a4,0 14f6: 4691 li a3,4 14f8: d61a sw t1,44(sp) 14fa: d416 sw t0,40(sp) 14fc: d22e sw a1,36(sp) 14fe: c83e sw a5,16(sp) 1500: cc1fe0ef jal 1c0 ssd1306_fillRect(x + rx - 3, y + cy - 2, 7, 4, 0); 1504: 4792 lw a5,4(sp) 1506: 5592 lw a1,36(sp) 1508: 4701 li a4,0 150a: 00878533 add a0,a5,s0 150e: 461d li a2,7 1510: 4691 li a3,4 1512: 1575 addi a0,a0,-3 1514: cadfe0ef jal 1c0 if (rx - lx > 7) 1518: 5332 lw t1,44(sp) 151a: 471d li a4,7 151c: 47c2 lw a5,16(sp) 151e: 40640633 sub a2,s0,t1 1522: 52a2 lw t0,40(sp) 1524: 02c75263 bge a4,a2,1548 ssd1306_drawFastHLine(x + lx + 4, y + cy - 1, rx - lx - 7, 0); 1528: 00478513 addi a0,a5,4 152c: 07f00793 li a5,127 1530: 00a7cc63 blt a5,a0,1548 1534: fff28593 addi a1,t0,-1 1538: 03f00793 li a5,63 153c: 00b7c663 blt a5,a1,1548 1540: 4681 li a3,0 1542: 1665 addi a2,a2,-7 1544: a5cff0ef jal 7a0 if (pet.form >= FORM_ROOT) { // gaming headset + mic boom 1548: 4732 lw a4,12(sp) 154a: 4785 li a5,1 154c: 0af70963 beq a4,a5,15fe ssd1306_drawLine(x + 3, y + 10, x + 9, y + 2, 0); 1550: 4792 lw a5,4(sp) 1552: 078d addi a5,a5,3 1554: d23e sw a5,36(sp) 1556: 4782 lw a5,0(sp) 1558: 5512 lw a0,36(sp) 155a: 00a78413 addi s0,a5,10 155e: 4792 lw a5,4(sp) 1560: 85a2 mv a1,s0 1562: 07a5 addi a5,a5,9 1564: d43e sw a5,40(sp) 1566: 4782 lw a5,0(sp) 1568: 5622 lw a2,40(sp) 156a: 0789 addi a5,a5,2 156c: 86be mv a3,a5 156e: c83e sw a5,16(sp) 1570: a74ff0ef jal 7e4 ssd1306_drawLine(x + 9, y + 2, x + 23, y + 2, 0); 1574: 4792 lw a5,4(sp) 1576: 46c2 lw a3,16(sp) 1578: 5522 lw a0,40(sp) 157a: 07dd addi a5,a5,23 157c: 863e mv a2,a5 157e: 85b6 mv a1,a3 1580: d63e sw a5,44(sp) 1582: a62ff0ef jal 7e4 ssd1306_drawLine(x + 23, y + 2, x + 29, y + 10, 0); 1586: 4792 lw a5,4(sp) 1588: 45c2 lw a1,16(sp) 158a: 5532 lw a0,44(sp) 158c: 01d78613 addi a2,a5,29 1590: 86a2 mv a3,s0 1592: a52ff0ef jal 7e4 ssd1306_fillRect(x + 1, y + 12, 4, 7, 0); 1596: 4782 lw a5,0(sp) 1598: 469d li a3,7 159a: 4611 li a2,4 159c: 00c78593 addi a1,a5,12 15a0: 4792 lw a5,4(sp) 15a2: 4701 li a4,0 15a4: 00178513 addi a0,a5,1 15a8: c19fe0ef jal 1c0 ssd1306_drawLine(x + 3, y + 18, x + 10, y + 24, 0); 15ac: 4782 lw a5,0(sp) 15ae: 5512 lw a0,36(sp) 15b0: 01878693 addi a3,a5,24 15b4: 4792 lw a5,4(sp) 15b6: 00a78613 addi a2,a5,10 15ba: 4782 lw a5,0(sp) 15bc: 01278593 addi a1,a5,18 15c0: a24ff0ef jal 7e4 if (pet.form == FORM_CLAUDE) { 15c4: 4732 lw a4,12(sp) 15c6: 478d li a5,3 15c8: 02f71b63 bne a4,a5,15fe ssd1306_drawPixel(x - 2 + (frame & 3), y + 4, 1); 15cc: c401a403 lw s0,-960(gp) # 2000003c 15d0: 4782 lw a5,0(sp) 15d2: 4605 li a2,1 15d4: 00347513 andi a0,s0,3 15d8: 00478593 addi a1,a5,4 15dc: 47a2 lw a5,8(sp) 15de: 1579 addi a0,a0,-2 15e0: 953e add a0,a0,a5 15e2: ba3fe0ef jal 184 ssd1306_drawPixel(x + PANA_W + (frame & 1), y + 10, 1); 15e6: 4782 lw a5,0(sp) 15e8: 00147513 andi a0,s0,1 15ec: 02050513 addi a0,a0,32 15f0: 00a78593 addi a1,a5,10 15f4: 47a2 lw a5,8(sp) 15f6: 4605 li a2,1 15f8: 953e add a0,a0,a5 15fa: b8bfe0ef jal 184 15fe: 4685 li a3,1 1600: 08000613 li a2,128 1604: 02e00593 li a1,46 1608: 4501 li a0,0 160a: 996ff0ef jal 7a0 for (uint8_t i = 0; i < pet.poop; i++) 160e: 4401 li s0,0 1610: 00e4c783 lbu a5,14(s1) 1614: 20f46063 bltu s0,a5,1814 1618: 4401 li s0,0 ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0); 161a: 670d lui a4,0x3 161c: 88c70713 addi a4,a4,-1908 # 288c 1620: 00241793 slli a5,s0,0x2 1624: 97ba add a5,a5,a4 1626: 00341493 slli s1,s0,0x3 162a: 4390 lw a2,0(a5) 162c: 94a2 add s1,s1,s0 162e: 4741 li a4,16 1630: 0486 slli s1,s1,0x1 1632: 86ba mv a3,a4 1634: 03000593 li a1,48 1638: 00148513 addi a0,s1,1 163c: b7cff0ef jal 9b8 if (i == cursor) 1640: 5702 lw a4,32(sp) 1642: 0ff47793 zext.b a5,s0 1646: 00f71963 bne a4,a5,1658 ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1); 164a: 46c5 li a3,17 164c: 8636 mv a2,a3 164e: 02f00593 li a1,47 1652: 8526 mv a0,s1 1654: aa6ff0ef jal 8fa for (uint8_t i = 0; i < ICON_COUNT; i++) { 1658: 0405 addi s0,s0,1 165a: 479d li a5,7 165c: faf41fe3 bne s0,a5,161a if (evo_anim) draw_evo_banner(); // celebratory overlay on top 1660: c4c1c783 lbu a5,-948(gp) # 20000048 1664: 2a078363 beqz a5,190a ssd1306_fillRect(6, 18, SSD1306_W - 12, 24, 0); 1668: 4701 li a4,0 166a: 46e1 li a3,24 166c: 07400613 li a2,116 1670: 45c9 li a1,18 1672: 4519 li a0,6 1674: b4dfe0ef jal 1c0 ssd1306_drawRect(6, 18, SSD1306_W - 12, 24, 1); 1678: 46e1 li a3,24 167a: 07400613 li a2,116 167e: 45c9 li a1,18 1680: 4519 li a0,6 1682: a78ff0ef jal 8fa draw_center_str(21, ">> evolving"); 1686: 6589 lui a1,0x2 1688: cbc58593 addi a1,a1,-836 # 1cbc 168c: 4555 li a0,21 168e: 8b8ff0ef jal 746 p = s_cat(p, "[ "); 1692: 6589 lui a1,0x2 1694: cc858593 addi a1,a1,-824 # 1cc8 1698: 0088 addi a0,sp,64 169a: c0bfe0ef jal 2a4 p = s_cat(p, form_names[pet.form]); 169e: 47b2 lw a5,12(sp) 16a0: 670d lui a4,0x3 16a2: 8a870713 addi a4,a4,-1880 # 28a8 16a6: 078a slli a5,a5,0x2 16a8: 97ba add a5,a5,a4 16aa: 438c lw a1,0(a5) 16ac: bf9fe0ef jal 2a4 p = s_cat(p, " ]"); 16b0: 6589 lui a1,0x2 16b2: ccc58593 addi a1,a1,-820 # 1ccc 16b6: beffe0ef jal 2a4 *p = 0; 16ba: 00050023 sb zero,0(a0) draw_center_str(31, b); 16be: 008c addi a1,sp,64 16c0: 457d li a0,31 draw_center_str(56, "OK: respawn"); 16c2: 884ff0ef jal 746 16c6: a491 j 190a static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 16c8: fff7c693 not a3,a5 16cc: 86fd srai a3,a3,0x1f 16ce: 8ff5 and a5,a5,a3 16d0: b985 j 1340 pet.sleeping = !pet.sleeping; 16d2: 00f4c503 lbu a0,15(s1) beep(pet.sleeping ? 440 : 660, 120); 16d6: 07800593 li a1,120 pet.sleeping = !pet.sleeping; 16da: 00153793 seqz a5,a0 beep(pet.sleeping ? 440 : 660, 120); 16de: 00a03533 snez a0,a0 16e2: 40a00533 neg a0,a0 16e6: 0dc57513 andi a0,a0,220 pet.sleeping = !pet.sleeping; 16ea: 00f487a3 sb a5,15(s1) beep(pet.sleeping ? 440 : 660, 120); 16ee: 1b850513 addi a0,a0,440 16f2: b925 j 132a pet.happy = clamp100(pet.happy + 5); 16f4: 00148783 lb a5,1(s1) pet.hygiene = 100; 16f8: 06400693 li a3,100 pet.poop = 0; 16fc: 00048723 sb zero,14(s1) pet.hygiene = 100; 1700: 00d481a3 sb a3,3(s1) pet.happy = clamp100(pet.happy + 5); 1704: 0795 addi a5,a5,5 1706: c5018713 addi a4,gp,-944 # 2000004c static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 170a: 02f6d363 bge a3,a5,1730 170e: 87b6 mv a5,a3 beep(1319, 50); beep(1047, 50); 1710: 03200593 li a1,50 1714: 52700513 li a0,1319 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1718: 00f700a3 sb a5,1(a4) beep(1319, 50); beep(1047, 50); 171c: bfbfe0ef jal 316 1720: 41700513 li a0,1047 1724: 03200593 li a1,50 1728: beffe0ef jal 316 add_xp(3); 172c: 450d li a0,3 172e: b9b9 j 138c static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1730: fff7c693 not a3,a5 1734: 86fd srai a3,a3,0x1f 1736: 8ff5 and a5,a5,a3 1738: bfe1 j 1710 pet.health = clamp100(pet.health + 35); 173a: 00448783 lb a5,4(s1) static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 173e: 06400713 li a4,100 pet.health = clamp100(pet.health + 35); 1742: 02378793 addi a5,a5,35 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1746: 02f75663 bge a4,a5,1772 174a: 87ba mv a5,a4 beep(784, 60); beep(1047, 60); beep(1319, 90); 174c: 03c00593 li a1,60 1750: 31000513 li a0,784 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1754: 00f48223 sb a5,4(s1) beep(784, 60); beep(1047, 60); beep(1319, 90); 1758: bbffe0ef jal 316 175c: 03c00593 li a1,60 1760: 41700513 li a0,1047 1764: bb3fe0ef jal 316 1768: 05a00593 li a1,90 176c: 52700513 li a0,1319 1770: b661 j 12f8 static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); } 1772: fff7c713 not a4,a5 1776: 877d srai a4,a4,0x1f 1778: 8ff9 and a5,a5,a4 177a: bfc9 j 174c screen = SCR_STATS; 177c: 4789 li a5,2 177e: c2f18f23 sb a5,-962(gp) # 2000003a beep(659, 40); 1782: 02800593 li a1,40 1786: 29300513 li a0,659 178a: b645 j 132a screen = SCR_SETTINGS; 178c: 4791 li a5,4 178e: c2f18f23 sb a5,-962(gp) # 2000003a set_sel = 0; 1792: c20188a3 sb zero,-975(gp) # 2000002d 1796: b7f5 j 1782 uint32_t t = frame % 80; 1798: c401a783 lw a5,-960(gp) # 2000003c 179c: 05000593 li a1,80 17a0: 853e mv a0,a5 17a2: c03e sw a5,0(sp) 17a4: 931fe0ef jal d4 <__umodsi3> px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 17a8: 02700713 li a4,39 17ac: 4782 lw a5,0(sp) 17ae: 00a76d63 bltu a4,a0,17c8 17b2: 01e50713 addi a4,a0,30 17b6: c43a sw a4,8(sp) 17b8: 4722 lw a4,8(sp) py = 14 + ((frame % 16) < 8 ? 0 : 1); 17ba: 8ba1 andi a5,a5,8 17bc: 00f037b3 snez a5,a5 17c0: 07b9 addi a5,a5,14 17c2: c23a sw a4,4(sp) 17c4: c03e sw a5,0(sp) 17c6: b149 j 1448 px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30 17c8: 06e00713 li a4,110 17cc: 8f09 sub a4,a4,a0 17ce: b7e5 j 17b6 if (pet.sleeping) return EXP_SLEEP; 17d0: 4515 li a0,5 17d2: ca0414e3 bnez s0,147a if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 17d6: 00448603 lb a2,4(s1) 17da: 4775 li a4,29 return EXP_SAD; 17dc: 853e mv a0,a5 if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20) 17de: c8c75ee3 bge a4,a2,147a 17e2: 00148603 lb a2,1(s1) 17e6: 4761 li a4,24 17e8: c8c759e3 bge a4,a2,147a 17ec: 00048603 lb a2,0(s1) 17f0: 474d li a4,19 17f2: c8c754e3 bge a4,a2,147a if ((frame % 50) < 4) return EXP_BLINK; 17f6: c401a503 lw a0,-960(gp) # 2000003c 17fa: 03200593 li a1,50 17fe: c836 sw a3,16(sp) 1800: 8d5fe0ef jal d4 <__umodsi3> 1804: 46c2 lw a3,16(sp) 1806: 00453513 sltiu a0,a0,4 180a: b985 j 147a else if (pet.form == FORM_GLITCH) spr = spr_glitch; 180c: 6609 lui a2,0x2 180e: 73860613 addi a2,a2,1848 # 2738 1812: b9b5 j 148e ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 1814: 00141513 slli a0,s0,0x1 1818: 9522 add a0,a0,s0 181a: 4721 li a4,8 181c: 050a slli a0,a0,0x2 181e: 86ba mv a3,a4 1820: c1818613 addi a2,gp,-1000 # 20000014 1824: 02600593 li a1,38 1828: 953a add a0,a0,a4 for (uint8_t i = 0; i < pet.poop; i++) 182a: 0405 addi s0,s0,1 ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0); 182c: 98cff0ef jal 9b8 for (uint8_t i = 0; i < pet.poop; i++) 1830: 0ff47413 zext.b s0,s0 1834: bbf1 j 1610 draw_main(); break; case SCR_STATS: if (any_edge) { screen = SCR_MAIN; beep(880, 30); } 1836: cb89 beqz a5,1848 1838: 4785 li a5,1 183a: 45f9 li a1,30 183c: 37000513 li a0,880 1840: c2f18f23 sb a5,-962(gp) # 2000003a 1844: ad3fe0ef jal 316 ssd1306_setbuf(0); 1848: c18ff0ef jal c60 draw_center_str(0, "~/pet $ stat"); 184c: 6589 lui a1,0x2 184e: cd058593 addi a1,a1,-816 # 1cd0 1852: 4501 li a0,0 draw_bar(10, "FOOD", pet.satiety); 1854: c5018413 addi s0,gp,-944 # 2000004c draw_center_str(0, "~/pet $ stat"); 1858: eeffe0ef jal 746 draw_bar(10, "FOOD", pet.satiety); 185c: 00040603 lb a2,0(s0) 1860: 6589 lui a1,0x2 1862: ce058593 addi a1,a1,-800 # 1ce0 1866: 4529 li a0,10 1868: 8e8ff0ef jal 950 draw_bar(19, "HAPPY", pet.happy); 186c: 00140603 lb a2,1(s0) 1870: 6589 lui a1,0x2 1872: ce858593 addi a1,a1,-792 # 1ce8 1876: 454d li a0,19 1878: 8d8ff0ef jal 950 draw_bar(28, "ENERGY", pet.energy); 187c: 00240603 lb a2,2(s0) 1880: 6589 lui a1,0x2 1882: cf058593 addi a1,a1,-784 # 1cf0 1886: 4571 li a0,28 1888: 8c8ff0ef jal 950 draw_bar(37, "CLEAN", pet.hygiene); 188c: 00340603 lb a2,3(s0) 1890: 6589 lui a1,0x2 1892: cf858593 addi a1,a1,-776 # 1cf8 1896: 02500513 li a0,37 189a: 8b6ff0ef jal 950 draw_bar(46, "HEALTH", pet.health); 189e: 00440603 lb a2,4(s0) 18a2: 6589 lui a1,0x2 18a4: d0058593 addi a1,a1,-768 # 1d00 18a8: 02e00513 li a0,46 18ac: 8a4ff0ef jal 950 p = u_cat(p, pet.level); 18b0: 00b44483 lbu s1,11(s0) *p++ = 'L'; 18b4: 04c00793 li a5,76 p = u_cat(p, pet.level); 18b8: 04110513 addi a0,sp,65 18bc: 85a6 mv a1,s1 *p++ = 'L'; 18be: 04f10023 sb a5,64(sp) p = u_cat(p, pet.level); 18c2: 9f5fe0ef jal 2b6 p = s_cat(p, " xp "); 18c6: 6589 lui a1,0x2 18c8: d0858593 addi a1,a1,-760 # 1d08 18cc: 9d9fe0ef jal 2a4 if (pet.level < MAX_LEVEL) { 18d0: 478d li a5,3 18d2: 0a97ec63 bltu a5,s1,198a p = u_cat(p, pet.xp); 18d6: 00845583 lhu a1,8(s0) p = u_cat(p, level_xp[pet.level]); 18da: 0486 slli s1,s1,0x1 p = u_cat(p, pet.xp); 18dc: 9dbfe0ef jal 2b6 *p++ = '/'; 18e0: 02f00793 li a5,47 18e4: 00f50023 sb a5,0(a0) p = u_cat(p, level_xp[pet.level]); 18e8: c2018793 addi a5,gp,-992 # 2000001c 18ec: 94be add s1,s1,a5 18ee: 0004d583 lhu a1,0(s1) 18f2: 0505 addi a0,a0,1 18f4: 9c3fe0ef jal 2b6 *p = 0; 18f8: 00050023 sb zero,0(a0) ssd1306_drawstr(0, 56, line, 1); 18fc: 4685 li a3,1 18fe: 0090 addi a2,sp,64 1900: 03800593 li a1,56 1904: 4501 li a0,0 1906: 913fe0ef jal 218 ssd1306_refresh(); 190a: b7eff0ef jal c88 draw_dead(); break; } // sleep the display after the configured idle period uint16_t timeout = screen_timeout_opts[timeout_idx]; 190e: c041c703 lbu a4,-1020(gp) # 20000000 1912: 678d lui a5,0x3 1914: 98078793 addi a5,a5,-1664 # 2980 1918: 0706 slli a4,a4,0x1 191a: 97ba add a5,a5,a4 191c: 0007d783 lhu a5,0(a5) if (timeout && idle_frames >= timeout) { 1920: c341a403 lw s0,-972(gp) # 20000030 1924: cb89 beqz a5,1936 1926: 00f46863 bltu s0,a5,1936 ssd1306_cmd(SSD1306_DISPLAYOFF); 192a: 0ae00513 li a0,174 192e: a64ff0ef jal b92 disp_on = 0; 1932: c00182a3 sb zero,-1019(gp) # 20000001 } } if (anim_timer) anim_timer--; 1936: c301c783 lbu a5,-976(gp) # 2000002c 193a: c781 beqz a5,1942 193c: 17fd addi a5,a5,-1 193e: c2f18823 sb a5,-976(gp) # 2000002c if (evo_anim) evo_anim--; 1942: c4c1c783 lbu a5,-948(gp) # 20000048 1946: c781 beqz a5,194e 1948: 17fd addi a5,a5,-1 194a: c4f18623 sb a5,-948(gp) # 20000048 // advance game time independent of screen / display state if (pet.alive && ++tick_acc >= TICK_FRAMES) { 194e: c601c783 lbu a5,-928(gp) # 2000005c 1952: cf81 beqz a5,196a 1954: c2e1d783 lhu a5,-978(gp) # 2000002a 1958: 0f900693 li a3,249 195c: 0785 addi a5,a5,1 195e: 07c2 slli a5,a5,0x10 1960: 83c1 srli a5,a5,0x10 1962: 24f6ee63 bltu a3,a5,1bbe 1966: c2f19723 sh a5,-978(gp) # 2000002a tick_acc = 0; game_tick(); } frame++; 196a: c401a783 lw a5,-960(gp) # 2000003c idle_frames++; Delay_Ms(FRAME_MS); 196e: 00058537 lui a0,0x58 idle_frames++; 1972: 0405 addi s0,s0,1 frame++; 1974: 0785 addi a5,a5,1 Delay_Ms(FRAME_MS); 1976: e4050513 addi a0,a0,-448 # 57e40 frame++; 197a: c4f1a023 sw a5,-960(gp) # 2000003c idle_frames++; 197e: c281aa23 sw s0,-972(gp) # 20000030 Delay_Ms(FRAME_MS); 1982: f9cfe0ef jal 11e 1986: efeff06f j 1084 p = s_cat(p, "MAX"); 198a: 6589 lui a1,0x2 198c: d1058593 addi a1,a1,-752 # 1d10 1990: 915fe0ef jal 2a4 1994: b795 j 18f8 if (left_edge) { 1996: cd91 beqz a1,19b2 set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS; 1998: c311c783 lbu a5,-975(gp) # 2000002d beep(1047, 25); 199c: 45e5 li a1,25 199e: 41700513 li a0,1047 set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS; 19a2: 078d addi a5,a5,3 19a4: 8b8d andi a5,a5,3 19a6: c236 sw a3,4(sp) 19a8: c2f188a3 sb a5,-975(gp) # 2000002d beep(1047, 25); 19ac: 96bfe0ef jal 316 19b0: 4692 lw a3,4(sp) if (right_edge) { 19b2: ce81 beqz a3,19ca set_sel = (set_sel + 1) % SETTINGS_ROWS; 19b4: c311c783 lbu a5,-975(gp) # 2000002d beep(1047, 25); 19b8: 45e5 li a1,25 19ba: 41700513 li a0,1047 set_sel = (set_sel + 1) % SETTINGS_ROWS; 19be: 0785 addi a5,a5,1 19c0: 8b8d andi a5,a5,3 19c2: c2f188a3 sb a5,-975(gp) # 2000002d beep(1047, 25); 19c6: 951fe0ef jal 316 if (ok_edge) { 19ca: 4782 lw a5,0(sp) 19cc: cfa1 beqz a5,1a24 if (set_sel == 0) { // cycle screen-off timeout 19ce: c311c783 lbu a5,-975(gp) # 2000002d 19d2: ef91 bnez a5,19ee timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT; 19d4: c041c503 lbu a0,-1020(gp) # 20000000 19d8: 4599 li a1,6 19da: 0505 addi a0,a0,1 19dc: f1cfe0ef jal f8 <__modsi3> 19e0: c0a18223 sb a0,-1020(gp) # 20000000 beep(880, 40); 19e4: 02800593 li a1,40 beep(880, 30); 19e8: 37000513 li a0,880 19ec: a815 j 1a20 } else if (set_sel == 1) { // cycle brightness 19ee: 4705 li a4,1 19f0: 00e79b63 bne a5,a4,1a06 bright_idx = (bright_idx + 1) % BRIGHT_OPT_COUNT; 19f4: c061c783 lbu a5,-1018(gp) # 20000002 19f8: 0785 addi a5,a5,1 19fa: 8b8d andi a5,a5,3 19fc: c0f18323 sb a5,-1018(gp) # 20000002 apply_brightness(); // takes effect immediately 1a00: 9aeff0ef jal bae 1a04: b7c5 j 19e4 } else if (set_sel == 2) { // toggle sound 1a06: 4689 li a3,2 1a08: 10d79c63 bne a5,a3,1b20 sound_on = !sound_on; 1a0c: c071c783 lbu a5,-1017(gp) # 20000003 beep(988, 60); // only audible if just enabled 1a10: 03c00593 li a1,60 1a14: 3dc00513 li a0,988 sound_on = !sound_on; 1a18: 0017b793 seqz a5,a5 1a1c: c0f183a3 sb a5,-1017(gp) # 20000003 beep(880, 30); 1a20: 8f7fe0ef jal 316 ssd1306_setbuf(0); 1a24: a3cff0ef jal c60 draw_center_str(0, "- SETTINGS -"); 1a28: 6589 lui a1,0x2 1a2a: d1458593 addi a1,a1,-748 # 1d14 1a2e: 4501 li a0,0 1a30: d17fe0ef jal 746 1a34: 4685 li a3,1 1a36: 08000613 li a2,128 1a3a: 45a9 li a1,10 1a3c: 4501 li a0,0 1a3e: d63fe0ef jal 7a0 *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; 1a42: 6589 lui a1,0x2 1a44: d2458593 addi a1,a1,-732 # 1d24 1a48: 0088 addi a0,sp,64 1a4a: 85bfe0ef jal 2a4 1a4e: c041c703 lbu a4,-1020(gp) # 20000000 1a52: 678d lui a5,0x3 1a54: 8e878793 addi a5,a5,-1816 # 28e8 1a58: 070a slli a4,a4,0x2 1a5a: 97ba add a5,a5,a4 1a5c: 438c lw a1,0(a5) 1a5e: 847fe0ef jal 2a4 *s_cat(s_cat(rows[1], "Bright: "), brightness_names[bright_idx]) = 0; 1a62: 6589 lui a1,0x2 *s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0; 1a64: 00050023 sb zero,0(a0) *s_cat(s_cat(rows[1], "Bright: "), brightness_names[bright_idx]) = 0; 1a68: d3058593 addi a1,a1,-720 # 1d30 1a6c: 05110513 addi a0,sp,81 1a70: 835fe0ef jal 2a4 1a74: c061c703 lbu a4,-1018(gp) # 20000002 1a78: 678d lui a5,0x3 1a7a: 8d878793 addi a5,a5,-1832 # 28d8 1a7e: 070a slli a4,a4,0x2 1a80: 97ba add a5,a5,a4 1a82: 438c lw a1,0(a5) 1a84: 821fe0ef jal 2a4 *s_cat(s_cat(rows[2], "Sound: "), sound_on ? "On" : "Off") = 0; 1a88: 6589 lui a1,0x2 *s_cat(s_cat(rows[1], "Bright: "), brightness_names[bright_idx]) = 0; 1a8a: 00050023 sb zero,0(a0) *s_cat(s_cat(rows[2], "Sound: "), sound_on ? "On" : "Off") = 0; 1a8e: d3c58593 addi a1,a1,-708 # 1d3c 1a92: 06210513 addi a0,sp,98 1a96: 80ffe0ef jal 2a4 1a9a: c071c783 lbu a5,-1017(gp) # 20000003 1a9e: c7c9 beqz a5,1b28 1aa0: 6589 lui a1,0x2 1aa2: c0c58593 addi a1,a1,-1012 # 1c0c 1aa6: ffefe0ef jal 2a4 *s_cat(rows[3], "Back") = 0; 1aaa: 6589 lui a1,0x2 *s_cat(s_cat(rows[2], "Sound: "), sound_on ? "On" : "Off") = 0; 1aac: 00050023 sb zero,0(a0) *s_cat(rows[3], "Back") = 0; 1ab0: d4458593 addi a1,a1,-700 # 1d44 1ab4: 07310513 addi a0,sp,115 1ab8: fecfe0ef jal 2a4 1abc: 00050023 sb zero,0(a0) 1ac0: 44ad li s1,11 1ac2: 4401 li s0,0 int y = 12 + r * 11; 1ac4: 00148793 addi a5,s1,1 1ac8: c03e sw a5,0(sp) if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1); 1aca: c311c283 lbu t0,-975(gp) # 2000002d 1ace: 0ff47313 zext.b t1,s0 1ad2: 00531e63 bne t1,t0,1aee 1ad6: 4705 li a4,1 1ad8: 46a9 li a3,10 1ada: 08000613 li a2,128 1ade: 85a6 mv a1,s1 1ae0: 4501 li a0,0 1ae2: c216 sw t0,4(sp) 1ae4: c01a sw t1,0(sp) 1ae6: edafe0ef jal 1c0 1aea: 4292 lw t0,4(sp) 1aec: 4302 lw t1,0(sp) ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1); 1aee: 00441613 slli a2,s0,0x4 1af2: 405306b3 sub a3,t1,t0 1af6: 9622 add a2,a2,s0 1af8: 009c addi a5,sp,64 1afa: 00148593 addi a1,s1,1 1afe: 00d036b3 snez a3,a3 1b02: 963e add a2,a2,a5 1b04: 4511 li a0,4 1b06: f12fe0ef jal 218 for (uint8_t r = 0; r < SETTINGS_ROWS; r++) { 1b0a: 04ad addi s1,s1,11 1b0c: 03700713 li a4,55 1b10: 0405 addi s0,s0,1 1b12: fae499e3 bne s1,a4,1ac4 draw_center_str(56, "L/R move OK use"); 1b16: 6589 lui a1,0x2 1b18: d4c58593 addi a1,a1,-692 # 1d4c 1b1c: f30ff06f j 124c screen = SCR_MAIN; 1b20: c2e18f23 sb a4,-962(gp) # 2000003a beep(880, 30); 1b24: 45f9 li a1,30 1b26: b5c9 j 19e8 *s_cat(s_cat(rows[2], "Sound: "), sound_on ? "On" : "Off") = 0; 1b28: 6589 lui a1,0x2 1b2a: c1458593 addi a1,a1,-1004 # 1c14 1b2e: bfa5 j 1aa6 if (ok_edge) { // back to the welcome screen to re-pick 1b30: 4782 lw a5,0(sp) 1b32: cf99 beqz a5,1b50 beep(659, 80); beep(988, 120); 1b34: 05000593 li a1,80 1b38: 29300513 li a0,659 screen = SCR_SELECT; 1b3c: c2018f23 sb zero,-962(gp) # 2000003a beep(659, 80); beep(988, 120); 1b40: fd6fe0ef jal 316 1b44: 07800593 li a1,120 1b48: 3dc00513 li a0,988 1b4c: fcafe0ef jal 316 ssd1306_setbuf(0); 1b50: 910ff0ef jal c60 ssd1306_drawImage(48, 2, spr_grave, 32, 32, 0); 1b54: 02000713 li a4,32 1b58: 660d lui a2,0x3 1b5a: 86ba mv a3,a4 1b5c: 90060613 addi a2,a2,-1792 # 2900 1b60: 4589 li a1,2 1b62: 03000513 li a0,48 1b66: e53fe0ef jal 9b8 draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); 1b6a: c5018713 addi a4,gp,-944 # 2000004c 1b6e: 00d74683 lbu a3,13(a4) 1b72: 4709 li a4,2 1b74: c5018413 addi s0,gp,-944 # 2000004c 1b78: 02e69f63 bne a3,a4,1bb6 1b7c: 6589 lui a1,0x2 1b7e: c1858593 addi a1,a1,-1000 # 1c18 1b82: 02400513 li a0,36 1b86: bc1fe0ef jal 746 p = s_cat(p, "core dumped L"); 1b8a: 6589 lui a1,0x2 1b8c: d6058593 addi a1,a1,-672 # 1d60 1b90: 0088 addi a0,sp,64 1b92: f12fe0ef jal 2a4 p = u_cat(p, pet.level); 1b96: 00b44583 lbu a1,11(s0) 1b9a: f1cfe0ef jal 2b6 *p = 0; 1b9e: 00050023 sb zero,0(a0) draw_center_str(46, line); 1ba2: 008c addi a1,sp,64 1ba4: 02e00513 li a0,46 1ba8: b9ffe0ef jal 746 draw_center_str(56, "OK: respawn"); 1bac: 6589 lui a1,0x2 1bae: d7058593 addi a1,a1,-656 # 1d70 1bb2: e9aff06f j 124c draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)"); 1bb6: 6589 lui a1,0x2 1bb8: c2858593 addi a1,a1,-984 # 1c28 1bbc: b7d9 j 1b82 tick_acc = 0; 1bbe: c2019723 sh zero,-978(gp) # 2000002a game_tick(); 1bc2: 94bfe0ef jal 50c 1bc6: b355 j 196a 00001bc8 : { 1bc8: 1161 addi sp,sp,-8 1bca: c03e sw a5,0(sp) EXTI->INTFR = EXTI_Line0 | EXTI_Line5 | EXTI_Line6; // clear pending 1bcc: 400107b7 lui a5,0x40010 { 1bd0: c23a sw a4,4(sp) EXTI->INTFR = EXTI_Line0 | EXTI_Line5 | EXTI_Line6; // clear pending 1bd2: 40078793 addi a5,a5,1024 # 40010400 <_eusrstack+0x2000fc00> 1bd6: 06100713 li a4,97 1bda: cbd8 sw a4,20(a5) exti_wake = 1; 1bdc: 4705 li a4,1 1bde: c2e18ea3 sb a4,-963(gp) # 20000039 } 1be2: 4712 lw a4,4(sp) 1be4: 4782 lw a5,0(sp) 1be6: 0121 addi sp,sp,8 1be8: 30200073 mret 00001bec : { 1bec: 1161 addi sp,sp,-8 1bee: c23a sw a4,4(sp) 1bf0: c03e sw a5,0(sp) TIM2->INTFR = (uint16_t)~TIM_FLAG_Update; // clear update flag 1bf2: 5779 li a4,-2 1bf4: 400007b7 lui a5,0x40000 1bf8: 00e79823 sh a4,16(a5) # 40000010 <_eusrstack+0x1ffff810> tick_wake = 1; 1bfc: 4705 li a4,1 1bfe: c2e18e23 sb a4,-964(gp) # 20000038 } 1c02: 4712 lw a4,4(sp) 1c04: 4782 lw a5,0(sp) 1c06: 0121 addi sp,sp,8 1c08: 30200073 mret 1c0c: 00006e4f .insn 4, 0x6e4f 1c10: 0000 unimp 1c12: 0000 unimp 1c14: 0066664f .insn 4, 0x0066664f 1c18: 2a2a .insn 2, 0x2a2a 1c1a: 4320 lw s0,64(a4) 1c1c: 5552524f .insn 4, 0x5552524f 1c20: 5450 lw a2,44(s0) 1c22: 4445 li s0,17 1c24: 2a20 .insn 2, 0x2a20 1c26: 002a c.slli zero,0xa 1c28: 46474553 .insn 4, 0x46474553 1c2c: 5541 li a0,-16 1c2e: 544c lw a1,44(s0) 1c30: 2820 .insn 2, 0x2820 1c32: 3131 jal 183e 1c34: 0029 c.nop 10 1c36: 0000 unimp 1c38: 7372 .insn 2, 0x7372 1c3a: 3a74 .insn 2, 0x3a74 1c3c: 0000 unimp 1c3e: 0000 unimp 1c40: 504c lw a1,36(s0) 1c42: 00002057 .insn 4, 0x2057 1c46: 0000 unimp 1c48: 20445757 .insn 4, 0x20445757 1c4c: 0000 unimp 1c4e: 0000 unimp 1c50: 20474457 .insn 4, 0x20474457 1c54: 0000 unimp 1c56: 0000 unimp 1c58: 20544653 .insn 4, 0x20544653 1c5c: 0000 unimp 1c5e: 0000 unimp 1c60: 4f50 lw a2,28(a4) 1c62: 2052 .insn 2, 0x2052 1c64: 0000 unimp 1c66: 0000 unimp 1c68: 4950 lw a2,20(a0) 1c6a: 204e .insn 2, 0x204e 1c6c: 0000 unimp 1c6e: 0000 unimp 1c70: 6f6e .insn 2, 0x6f6e 1c72: 656e .insn 2, 0x656e 1c74: 0000 unimp 1c76: 0000 unimp 1c78: 7270 .insn 2, 0x7270 1c7a: 7365 lui t1,0xffff9 1c7c: 6e612073 .insn 4, 0x6e612073 1c80: 2079 jal 1d0e 1c82: 0079656b .insn 4, 0x0079656b 1c86: 0000 unimp 1c88: 207e .insn 2, 0x207e 1c8a: 2024 .insn 2, 0x2024 1c8c: 6461 lui s0,0x18 1c8e: 2074706f j 49694 1c92: 2d2d jal 22cc 1c94: 6570 .insn 2, 0x6570 1c96: 0074 addi a3,sp,12 1c98: 203c .insn 2, 0x203c 1c9a: 0000 unimp 1c9c: 3e20 .insn 2, 0x3e20 1c9e: 0000 unimp 1ca0: 2f4c .insn 2, 0x2f4c 1ca2: 2052 .insn 2, 0x2052 1ca4: 6970 .insn 2, 0x6970 1ca6: 20206b63 bltu zero,sp,1ebc 1caa: 67204b4f .insn 4, 0x67204b4f 1cae: 0021006f j 11cb0 1cb2: 0000 unimp 1cb4: 007a c.slli zero,0x1e 1cb6: 0000 unimp 1cb8: 005a c.slli zero,0x16 1cba: 0000 unimp 1cbc: 3e3e .insn 2, 0x3e3e 1cbe: 6520 .insn 2, 0x6520 1cc0: 6f76 .insn 2, 0x6f76 1cc2: 766c .insn 2, 0x766c 1cc4: 6e69 lui t3,0x1a 1cc6: 205b0067 jr 517(s6) 1cca: 0000 unimp 1ccc: 5d20 lw s0,120(a0) 1cce: 0000 unimp 1cd0: 2f7e .insn 2, 0x2f7e 1cd2: 6570 .insn 2, 0x6570 1cd4: 2074 .insn 2, 0x2074 1cd6: 2024 .insn 2, 0x2024 1cd8: 74617473 .insn 4, 0x74617473 1cdc: 0000 unimp 1cde: 0000 unimp 1ce0: 4f46 lw t5,80(sp) 1ce2: 0000444f .insn 4, 0x444f 1ce6: 0000 unimp 1ce8: 4148 lw a0,4(a0) 1cea: 5050 lw a2,36(s0) 1cec: 0059 c.nop 22 1cee: 0000 unimp 1cf0: 4e45 li t3,17 1cf2: 5245 li tp,-15 1cf4: 00005947 .insn 4, 0x5947 1cf8: 41454c43 .insn 4, 0x41454c43 1cfc: 004e c.slli zero,0x13 1cfe: 0000 unimp 1d00: 4548 lw a0,12(a0) 1d02: 4c41 li s8,16 1d04: 4854 lw a3,20(s0) 1d06: 0000 unimp 1d08: 2020 .insn 2, 0x2020 1d0a: 7078 .insn 2, 0x7078 1d0c: 0020 addi s0,sp,8 1d0e: 0000 unimp 1d10: 414d li sp,19 1d12: 0058 addi a4,sp,4 1d14: 202d jal 1d3e 1d16: 54544553 .insn 4, 0x54544553 1d1a: 4e49 li t3,18 1d1c: 2d205347 .insn 4, 0x2d205347 1d20: 0000 unimp 1d22: 0000 unimp 1d24: 65726353 .insn 4, 0x65726353 1d28: 6e65 lui t3,0x19 1d2a: 6f20 .insn 2, 0x6f20 1d2c: 6666 .insn 2, 0x6666 1d2e: 003a c.slli zero,0xe 1d30: 7242 .insn 2, 0x7242 1d32: 6769 lui a4,0x1a 1d34: 7468 .insn 2, 0x7468 1d36: 203a .insn 2, 0x203a 1d38: 0000 unimp 1d3a: 0000 unimp 1d3c: 6e756f53 .insn 4, 0x6e756f53 1d40: 3a64 .insn 2, 0x3a64 1d42: 0020 addi s0,sp,8 1d44: 6142 .insn 2, 0x6142 1d46: 00006b63 bltu zero,zero,1d5c 1d4a: 0000 unimp 1d4c: 2f4c .insn 2, 0x2f4c 1d4e: 2052 .insn 2, 0x2052 1d50: 6f6d lui t5,0x1b 1d52: 6576 .insn 2, 0x6576 1d54: 2020 .insn 2, 0x2020 1d56: 75204b4f .insn 4, 0x75204b4f 1d5a: 00006573 .insn 4, 0x6573 1d5e: 0000 unimp 1d60: 65726f63 bltu tp,s7,23be 1d64: 6420 .insn 2, 0x6420 1d66: 6d75 lui s10,0x1d 1d68: 6570 .insn 2, 0x6570 1d6a: 2064 .insn 2, 0x2064 1d6c: 004c addi a1,sp,4 1d6e: 0000 unimp 1d70: 203a4b4f .insn 4, 0x203a4b4f 1d74: 6572 .insn 2, 0x6572 1d76: 77617073 .insn 4, 0x77617073 1d7a: 006e c.slli zero,0x1b 1d7c: 6170 .insn 2, 0x6170 1d7e: 616e .insn 2, 0x616e 1d80: 63746f67 .insn 4, 0x63746f67 1d84: 6968 .insn 2, 0x6968 1d86: 7620 .insn 2, 0x7620 1d88: 0032 c.slli zero,0xc 1d8a: 0000 unimp 1d8c: 6f62 .insn 2, 0x6f62 1d8e: 6e69746f jal s0,99474 1d92: 656b2067 .insn 4, 0x656b2067 1d96: 6e72 .insn 2, 0x6e72 1d98: 6c65 lui s8,0x19 1d9a: 2e2e .insn 2, 0x2e2e 1d9c: 0000 unimp 1d9e: 0000 unimp 1da0: 6f6d lui t5,0x1b 1da2: 6e75 lui t3,0x1d 1da4: 2074 .insn 2, 0x2074 1da6: 7465702f .insn 4, 0x7465702f 1daa: 2020 .insn 2, 0x2020 1dac: 00006b6f jal s6,7dac 1db0: 77617073 .insn 4, 0x77617073 1db4: 206e .insn 2, 0x206e 1db6: 6c656873 .insn 4, 0x6c656873 1dba: 206c .insn 2, 0x206c 1dbc: 6f20 .insn 2, 0x6f20 1dbe: 203e006b .insn 4, 0x203e006b 1dc2: 2f2e .insn 2, 0x2f2e 1dc4: 6174 .insn 2, 0x6174 1dc6: 616d addi sp,sp,240 1dc8: 63746f67 .insn 4, 0x63746f67 1dcc: 6968 .insn 2, 0x6968 1dce: 005f 6853 6c65 .insn 6, 0x6c656853005f 1dd4: 006c addi a1,sp,12 1dd6: 0000 unimp 1dd8: 6150 .insn 2, 0x6150 1dda: 6b6e .insn 2, 0x6b6e 1ddc: 0000006f j 1ddc 1de0: 6d54 .insn 2, 0x6d54 1de2: 7875 lui a6,0xffffd 1de4: 0000 unimp 1de6: 0000 unimp 1de8: 7270 .insn 2, 0x7270 1dea: 0000636f jal t1,7dea 1dee: 0000 unimp 1df0: 7375 lui t1,0xffffd 1df2: 7265 lui tp,0xffff9 1df4: 0000 unimp 1df6: 0000 unimp 1df8: 6f72 .insn 2, 0x6f72 1dfa: 0000746f jal s0,8dfa 1dfe: 0000 unimp 1e00: 75616c43 .insn 4, 0x75616c43 1e04: 6564 .insn 2, 0x6564 1e06: 0000 unimp 1e08: 74696c67 .insn 4, 0x74696c67 1e0c: 00006863 bltu zero,zero,1e1c 1e10: 4546 lw a0,80(sp) 1e12: 4445 li s0,17 1e14: 0000 unimp 1e16: 0000 unimp 1e18: 4c50 lw a2,28(s0) 1e1a: 5941 li s2,-16 1e1c: 0000 unimp 1e1e: 0000 unimp 1e20: 45454c53 .insn 4, 0x45454c53 1e24: 0050 addi a2,sp,4 1e26: 0000 unimp 1e28: 4548 lw a0,12(a0) 1e2a: 4c41 li s8,16 1e2c: 0000 unimp 1e2e: 0000 unimp 1e30: 54415453 .insn 4, 0x54415453 1e34: 00000053 .insn 4, 0x0053 1e38: 54544553 .insn 4, 0x54544553 1e3c: 4e49 li t3,18 1e3e: 00005347 .insn 4, 0x5347 1e42: 0000 unimp 1e44: 6f4c .insn 2, 0x6f4c 1e46: 654d0077 .insn 4, 0x654d0077 1e4a: 0064 addi s1,sp,12 1e4c: 6948 .insn 2, 0x6948 1e4e: 00006867 .insn 4, 0x6867 1e52: 0000 unimp 1e54: 614d addi sp,sp,176 1e56: 0078 addi a4,sp,12 1e58: 7335 lui t1,0xfffed 1e5a: 0000 unimp 1e5c: 3031 jal 1668 1e5e: 35310073 .insn 4, 0x35310073 1e62: 30330073 .insn 4, 0x30330073 1e66: 30360073 .insn 4, 0x30360073 1e6a: 112e0073 .insn 4, 0x112e0073 1e6e: 0000 unimp 1e70: 1252 slli tp,tp,0x34 1e72: 0000 unimp 1e74: 1836 slli a6,a6,0x2d 1e76: 0000 unimp 1e78: 1b30 addi a2,sp,440 1e7a: 0000 unimp 1e7c: 1996 slli s3,s3,0x25 1e7e: 0000 unimp 1e80: 12b0 addi a2,sp,360 1e82: 0000 unimp 1e84: 1318 addi a4,sp,416 1e86: 0000 unimp 1e88: 16d2 slli a3,a3,0x34 1e8a: 0000 unimp 1e8c: 16f4 addi a3,sp,876 1e8e: 0000 unimp 1e90: 173a slli a4,a4,0x2e 1e92: 0000 unimp 1e94: 177c addi a5,sp,940 1e96: 0000 unimp 1e98: 178c addi a1,sp,992 ... 00001e9c : ... 1ea8: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1eb8: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1ec8: ff3f fc7f ff3f fc7f 073c 1c70 ff3f fc7f ?...?...<.p.?... 1ed8: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1ee8: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1ef8: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'... 1f08: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ............... 1f18: 0000 0000 .... 00001f1c : ... 1f28: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1f38: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1f48: bf3f fc7e 1f3f 7c7c 0f3e 3c78 1f3f 7c7c ?.~.?.||>.x: ... 1fa8: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 1fb8: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1fc8: 5f3f 7c7d af3e bc7a ff3f fc7f ff3f fc7f ?_}|>.z.?...?... 1fd8: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?... 1fe8: 033c 1c60 ff3f fc7f ff3f fc7f ff3f fc7f <.`.?...?...?... 1ff8: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'... 2008: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ............... 2018: 0000 0000 .... 0000201c : ... 2028: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?... 2038: ff3f fc7f ff3f fc7f ff3f fc7f bf3f fc7e ?...?...?...?.~. 2048: 1f3f 7c7c 0f3e 3c78 1f3f 7c7c bf3f fc7e ?.||>.x: 209c: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 20ac: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 20bc: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 20cc: ff01 80ff ff03 c0ff ff03 c0ff db03 c0db ................ 20dc: e703 c0e7 e703 c0e7 db03 c0db fd01 80df ................ 20ec: fa01 80bf f700 007f 7f00 00fe ff01 c0ff ................ 20fc: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 210c: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 0000211c : 211c: 0000 0080 1000 0088 1100 f088 3100 208c .............1. 212c: 3900 40dc 3b00 f0dc 7f00 00fe 7f00 00fe .9.@.;.......... 213c: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 214c: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................ 215c: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................ 216c: fe01 807f ff00 00ff 7f00 00fe ff01 c0ff ................ 217c: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 218c: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 0000219c : 219c: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 21ac: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 21bc: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 21cc: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................ 21dc: e703 c0e7 ff03 c0ff ff03 c0ff fc01 803f ..............?. 21ec: fd01 803f fc00 00bf 7c00 003e ff01 c0ff ..?......|>..... 21fc: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 220c: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 0000221c : 221c: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 222c: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 223c: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 224c: ff01 80ff 9f03 c0f9 e703 c0e7 ff03 c0ff ................ 225c: e703 c0e7 e703 c0e7 ff03 c0ff ff01 80ff ................ 226c: ff01 80ff fc00 003f 7b00 00de f701 c0ef ......?..{...... 227c: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 228c: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 0000229c : 229c: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 22ac: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 22bc: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 22cc: ff01 80ff ff03 c0ff ff03 c0ff ef03 c0f7 ................ 22dc: e703 c0eb db03 c0db ff03 c0ff ff01 80ff ................ 22ec: f701 80ef f700 00ef 7b00 00de fc01 c03f .........{....?. 22fc: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 230c: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 0000231c : 231c: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 232c: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 233c: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 234c: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................ 235c: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................ 236c: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?............. 237c: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 238c: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 0000239c : 239c: 0000 0080 1000 0088 1100 0088 3100 008c .............1.. 23ac: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;.......... 23bc: f800 003f e700 00c7 df00 00fb bf01 80fd ..?............. 23cc: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................ 23dc: e703 c0e7 ff03 c0ff ff03 c0ff ff01 80ff ................ 23ec: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?............. 23fc: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................ 240c: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................ 0000241c : ... 2428: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2438: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2448: ff0f f0ff 010f f080 ff0f f0ff ff0f f0ff ................ 2458: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2468: ff0f f0ff f80f f00f ff0f f0ff ff0f f0ff ................ 2478: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 2488: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 2498: 7f00 00fe .... 0000249c : ... 24a8: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 24b8: ff0f f0ff ff0f f0ff ff0f f0ff ef0f f0f7 ................ 24c8: c70f f0e3 830f f0c1 c70f f0e3 ef0f f0f7 ................ 24d8: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 24e8: ff0f f0ff ff0f f0ff ff0f f0ff f80f f01f ................ 24f8: c70f f0e3 ff0f f0ff ff07 e0ff 0700 00e0 ................ 2508: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 2518: 7f00 00fe .... 0000251c : ... 2528: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2538: ff0f f0ff ff0f f0ff ff0f f0ff df0f f0ef ................ 2548: af0f f0d7 ff0f f0ff ff0f f0ff ff0f f0ff ................ 2558: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 2568: c70f f0e3 f80f f01f ff0f f0ff ff0f f0ff ................ 2578: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 2588: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 2598: 7f00 00fe .... 0000259c : ... 25a8: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................ 25b8: ff0f f0ff ff0f f0ff ef0f f0f7 c70f f0e3 ................ 25c8: 830f f0c1 c70f f0e3 ef0f f0f7 ff0f f0ff ................ 25d8: ff0f f0ff ff0f f0ff ff0f f0ff 7f0f f0ff ................ 25e8: bf0f f0ff df0f f0ff bf0f f0ff 780f f00f .............x.. 25f8: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................ 2608: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................ 2618: 7f00 00fe .... 0000261c : 261c: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............? 262c: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|.......... 0000263c : 263c: 0000 0000 0000 c000 c000 c000 c006 c006 ................ 264c: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6..... 0000265c : 265c: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0. 266c: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........ 0000267c : 267c: 0000 0000 8000 8000 c001 c001 f007 f80d ................ 268c: f80d f808 fc1d f80d f80f f80f f007 8000 ................ 0000269c : 269c: 0000 0000 0000 0004 000c 001c 0018 001c ................ 26ac: 003c 001c 001e 001f e80f f007 8000 0000 <............... 000026bc : 26bc: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~ 26cc: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p.. 000026dc : 26dc: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1. 26ec: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?....... 000026fc : 26fc: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. ..... 270c: 8f81 f1d9 40db a6a4 ffaf 0000 .....@...... 00002718 : 2718: 1d7c 0000 1d8c 0000 1da0 0000 1db0 0000 |............... 2728: 1dc0 0000 .... 0000272c : 272c: 1dd0 0000 1dd8 0000 1de0 0000 ............ 00002738 : ... 2748: 0000 0200 0000 0000 0000 0000 0000 0000 ................ 2758: 0080 0080 0f00 00f8 1500 0054 ff00 80ff ..........T..... 2768: ff01 c0ff ff03 e0ff 1101 4144 d707 f0f5 ..........DA.... 2778: ef07 f0fb d707 f0f5 1105 5044 ff0f f8ff ..........DP.... 2788: ff07 f0ff ff07 f0ff 5505 5055 ea07 f0ab .........UUP.... 2798: ff43 e0ff ff03 e0ff 5501 4055 ff00 80ff C........UU@.... 27a8: 3f00 00fe 0f00 04f8 0020 0000 0000 0000 .?...... ....... 000027b8 : ... 27c0: 0000 2000 0000 2000 0004 a800 000e 2000 ... ... ....... 27d0: 0004 fe03 0000 2000 0000 a880 0f00 20f8 ....... ....... 27e0: 3f00 20fe 7f00 00ff ff00 80ff ff01 c0ff .?. ............ 27f0: ff01 c0ff ff03 e0ff f703 e0f7 f703 e0f7 ................ 2800: e303 e0e3 f707 f0f7 f703 e0f7 ff03 e0ff ................ 2810: ff03 e0ff e703 e0f3 f801 c00f ff01 c0ff ................ 2820: ff00 80ff 7f00 00ff 3f00 00fe 0f00 00f8 .........?...... 2830: 0000 0080 0000 0000 ........ 00002838 : 2838: 259c 0000 259c 0000 251c 0000 249c 0000 .%...%...%...$.. 2848: 251c 0000 241c 0000 249c 0000 239c 0000 .%...$...$...#.. 2858: 231c 0000 229c 0000 221c 0000 219c 0000 .#..."..."...!.. 2868: 211c 0000 209c 0000 201c 0000 201c 0000 .!... ... ... .. 2878: 1f9c 0000 1f1c 0000 1f9c 0000 1e9c 0000 ................ 2888: 1f1c 0000 .... 0000288c : 288c: 26dc 0000 26bc 0000 269c 0000 267c 0000 .&...&...&..|&.. 289c: 265c 0000 263c 0000 261c 0000 \&..<&...&.. 000028a8 : 28a8: 1de8 0000 1df0 0000 1df8 0000 1e00 0000 ................ 28b8: 1e08 0000 .... 000028bc : 28bc: 1e10 0000 1e18 0000 1e20 0000 1cf8 0000 ........ ....... 28cc: 1e28 0000 1e30 0000 1e38 0000 (...0...8... 000028d8 : 28d8: 1e44 0000 1e48 0000 1e4c 0000 1e54 0000 D...H...L...T... 000028e8 : 28e8: 1e58 0000 1e5c 0000 1e60 0000 1e64 0000 X...\...`...d... 28f8: 1e68 0000 1c14 0000 h....... 00002900 : ... 2908: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................ 2918: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3.. 2928: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0.......... 2938: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?... 2948: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................ 2958: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................ ... 00002980 : 2980: 0053 00a7 00fa 01f4 03e8 0000 S........... 0000298c : ... 2994: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~ 29a4: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8.. 29b4: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8 29c4: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<........... 29d4: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 ..>....<~..~<. 2a24: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{.... 2a34: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a`<.|.. 2ab4: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v. 2ac4: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000... 2ad4: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.l...... 2e24: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|. 2e34: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v. 2e44: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~.. 2e54: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|. 2e64: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f.. 2e74: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~.......... 2e84: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v. 2e94: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|. 2ea4: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff. 2eb4: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v........~.. 2ec4: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>. 2ed4: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................ 2ee4: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j.. 2ef4: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3.. 2f04: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".". 2f14: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w. 2f24: 1818 1818 1818 1818 1818 1818 18f8 1818 ................ 2f34: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666 2f44: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........ 2f54: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666 2f64: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666...... 2f74: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............ 2f84: 0000 0000 18f8 1818 1818 1818 001f 0000 ................ 2f94: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................ 2fa4: 1818 1818 181f 1818 0000 0000 00ff 0000 ................ 2fb4: 1818 1818 18ff 1818 1818 181f 181f 1818 ................ 2fc4: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?... 2fd4: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666...... 2fe4: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666 2ff4: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666 3004: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666.... 3014: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666 3024: 3636 3636 003f 0000 1818 181f 001f 0000 6666?........... 3034: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666 3044: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........ 3054: 1818 1818 00f8 0000 0000 0000 181f 1818 ................ 3064: ffff ffff ffff ffff 0000 0000 ffff ffff ................ 3074: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................ 3084: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v. 3094: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x............... 30a4: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`... 30b4: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|. 30c4: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.ff<...~..~.. 30f4: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0.. 3104: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|.............. 3114: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~. 3124: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~......... 3134: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~.... 3144: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8.... 3154: 0000 1800 0018 0000 0000 1800 0000 0000 ................ 3164: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666... 3174: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<.. ...