PanBadge/tama.lst

4295 lines
185 KiB
Plaintext

tama.elf: file format elf32-littleriscv
Disassembly of section .init:
00000000 <InterruptVector>:
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 <handle_reset>
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 <DelaySysTick>:
#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 <DelaySysTick+0x8>
uint64_t targend = SysTick->CNT - n;
while( ((int64_t)( SysTick->CNT - targend )) > 0 );
#else
#error DelaySysTick not defined.
#endif
}
12e: 8082 ret
00000130 <ssd1306_i2c_setup>:
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 <tama.c.fb7bdcf7+0xbdef>
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 <ssd1306_drawPixel>:
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 <ssd1306_drawPixel+0x32>
return;
if(y >= SSD1306_H)
18c: 03f00793 li a5,63
190: 02b7e363 bltu a5,a1,1b6 <ssd1306_drawPixel+0x32>
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 <ssd1306_buffer>
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_drawPixel+0x34>
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 <ssd1306_drawPixel+0x2e>
000001c0 <ssd1306_fillRect>:
/*
* 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 <ssd1306_fillRect+0x30>
{
/* invert pixels */
ssd1306_drawPixel(m++, n, color);
}
n++;
1e0: 0585 addi a1,a1,1
while(h--)
1e2: 02d58663 beq a1,a3,20e <ssd1306_fillRect+0x4e>
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 <ssd1306_drawPixel>
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 <ssd1306_fillRect+0x12>
}
}
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 <ssd1306_drawstr>:
/*
* 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 <ssd1306_drawstr+0x80>
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 <fontdata>
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 <ssd1306_drawstr+0x40>
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 <ssd1306_drawPixel>
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 <ssd1306_drawstr+0x30>
for(i=0;i<8;i++)
288: 0705 addi a4,a4,1
28a: faf715e3 bne a4,a5,234 <ssd1306_drawstr+0x1c>
{
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 <ssd1306_drawstr+0x10>
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 <s_cat>:
// Tiny string builders used instead of snprintf: we only ever paste short
// strings and small unsigned ints, and avoiding <stdio.h> 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 <s_cat+0x8>
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 <s_cat>
000002b6 <u_cat>:
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 <u_cat+0x10>
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 <u_cat+0x40>
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 <beep>:
// 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 <sound_on>
31a: c7ad beqz a5,384 <beep+0x6e>
{
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 <tama.c.fb7bdcf7+0x75f4f>
{
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 <DelaySysTick>
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 <DelaySysTick>
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 <beep+0x40>
}
}
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 <led_blink>:
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 <tama.c.fb7bdcf7+0x27d4f>
3a0: 3bbd jal 11e <DelaySysTick>
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 <add_xp>:
}
// 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 <pet>
3b4: 01074703 lbu a4,16(a4)
3b8: c371 beqz a4,47c <add_xp+0xcc>
3ba: c5018793 addi a5,gp,-944 # 2000004c <pet>
if (pet.xp < 60000) pet.xp += n;
3be: 0087d683 lhu a3,8(a5) # 20008 <tama.c.fb7bdcf7+0x1be37>
3c2: 673d lui a4,0xf
3c4: a5f70713 addi a4,a4,-1441 # ea5f <tama.c.fb7bdcf7+0xa88e>
3c8: 02d76663 bltu a4,a3,3f4 <add_xp+0x44>
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 <add_xp+0x46>
3e0: 07700693 li a3,119
3e4: 4709 li a4,2
3e6: 00a6f863 bgeu a3,a0,3f6 <add_xp+0x46>
3ea: 0ef00693 li a3,239
3ee: 470d li a4,3
3f0: 00a6f363 bgeu a3,a0,3f6 <add_xp+0x46>
3f4: 4711 li a4,4
if (nl > pet.level) {
3f6: 00b7c683 lbu a3,11(a5)
3fa: 08e6f163 bgeu a3,a4,47c <add_xp+0xcc>
{
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 <add_xp+0x86>
40e: 460d li a2,3
410: 86ae mv a3,a1
412: 02c70263 beq a4,a2,436 <add_xp+0x86>
416: 4605 li a2,1
418: 4681 li a3,0
41a: 00c70e63 beq a4,a2,436 <add_xp+0x86>
if (!pet.ascend) pet.ascend = (pet.health >= 60) ? 1 : 2;
41e: 00d7c703 lbu a4,13(a5)
422: eb31 bnez a4,476 <add_xp+0xc6>
424: 00478683 lb a3,4(a5)
428: 03b00713 li a4,59
42c: 04d74163 blt a4,a3,46e <add_xp+0xbe>
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 <evo_anim>
beep(784, 60); beep(988, 60); beep(1175, 60); beep(1568, 140);
448: 35f9 jal 316 <beep>
44a: 03c00593 li a1,60
44e: 3dc00513 li a0,988
452: 35d1 jal 316 <beep>
454: 03c00593 li a1,60
458: 49700513 li a0,1175
45c: 3d6d jal 316 <beep>
45e: 08c00593 li a1,140
462: 62000513 li a0,1568
466: 3d45 jal 316 <beep>
led_blink();
}
}
468: 4082 lw ra,0(sp)
46a: 0111 addi sp,sp,4
led_blink();
46c: bf29 j 386 <led_blink>
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 <add_xp+0x86>
pet.form = (pet.ascend == 1) ? FORM_CLAUDE : FORM_GLITCH;
476: fac71fe3 bne a4,a2,434 <add_xp+0x84>
47a: bfe5 j 472 <add_xp+0xc2>
47c: 8082 ret
0000047e <notify>:
// 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 <crit_flag>
48e: 04b74463 blt a4,a1,4d6 <notify+0x58>
if (!crit_flag[idx]) { // urgent: descending triple
492: 942a add s0,s0,a0
494: 00044703 lbu a4,0(s0)
498: eb15 bnez a4,4cc <notify+0x4e>
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 <beep>
4a6: 03c00593 li a1,60
4aa: 49700513 li a0,1175
4ae: 35a5 jal 316 <beep>
4b0: 05a00593 li a1,90
4b4: 37000513 li a0,880
4b8: 3db9 jal 316 <beep>
crit_flag[idx] = 1; warn_flag[idx] = 1;
4ba: 4782 lw a5,0(sp)
4bc: c4418713 addi a4,gp,-956 # 20000040 <warn_flag>
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 <warn_flag>
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 <notify+0x88>
if (!warn_flag[idx]) { // gentle: single chirp
4e4: 0004c703 lbu a4,0(s1)
4e8: eb19 bnez a4,4fe <notify+0x80>
4ea: c02a sw a0,0(sp)
beep(1568, 50);
4ec: 03200593 li a1,50
4f0: 62000513 li a0,1568
4f4: 350d jal 316 <beep>
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 <notify+0x4e>
warn_flag[idx] = 0; crit_flag[idx] = 0;
506: 00048023 sb zero,0(s1)
50a: bfd5 j 4fe <notify+0x80>
0000050c <game_tick>:
}
// ----------------------------------------------------------------- game tick
static void game_tick(void)
{
pet.age_min++;
50c: c5018793 addi a5,gp,-944 # 2000004c <pet>
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 <pet>
53a: 08e7d663 bge a5,a4,5c6 <game_tick+0xba>
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 <game_tick+0xce>
pet.energy = clamp100(pet.energy + 6);
546: 00668793 addi a5,a3,6 # 40006 <tama.c.fb7bdcf7+0x3be35>
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 <game_tick+0xc4>
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 <game_tick+0x66>
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 <game_tick+0x80>
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 <game_tick+0x118>
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 <game_tick+0x126>
592: 4689 li a3,2
594: 0066ed63 bltu a3,t1,5ae <game_tick+0xa2>
((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 <frame>
5a2: 96ae add a3,a3,a1
5a4: 8afd andi a3,a3,31
if (!pet.sleeping && pet.poop < 3 &&
5a6: e6d1 bnez a3,632 <game_tick+0x126>
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 <game_tick+0x12a>
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 <game_tick+0x1ea>
5be: 86ae mv a3,a1
5c0: 00d400a3 sb a3,1(s0)
5c4: a88d j 636 <game_tick+0x12a>
5c6: fff74793 not a5,a4
5ca: 87fd srai a5,a5,0x1f
5cc: 8f7d and a4,a4,a5
5ce: bf8d j 540 <game_tick+0x34>
5d0: fff7c513 not a0,a5
5d4: 857d srai a0,a0,0x1f
5d6: 8fe9 and a5,a5,a0
5d8: bfb5 j 554 <game_tick+0x48>
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 <game_tick+0x104>
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 <pet>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
604: 00d55b63 bge a0,a3,61a <game_tick+0x10e>
608: 86aa mv a3,a0
60a: 00d300a3 sb a3,1(t1)
60e: b795 j 572 <game_tick+0x66>
610: fff7c693 not a3,a5
614: 86fd srai a3,a3,0x1f
616: 8ff5 and a5,a5,a3
618: bfe1 j 5f0 <game_tick+0xe4>
61a: fff6c513 not a0,a3
61e: 857d srai a0,a0,0x1f
620: 8ee9 and a3,a3,a0
622: b7e5 j 60a <game_tick+0xfe>
624: fff6c313 not t1,a3
628: 41f35313 srai t1,t1,0x1f
62c: 0066f6b3 and a3,a3,t1
630: bfa1 j 588 <game_tick+0x7c>
if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
632: f6031ee3 bnez t1,5ae <game_tick+0xa2>
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 <game_tick+0x14a>
640: c919 beqz a0,656 <game_tick+0x14a>
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 <game_tick+0x1f4>
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 <game_tick+0x15a>
664: 869a mv a3,t1
666: 01869593 slli a1,a3,0x18
66a: 85e1 srai a1,a1,0x18
66c: 00b7d363 bge a5,a1,672 <game_tick+0x166>
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 <game_tick+0x174>
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 <game_tick+0x208>
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 <game_tick+0x1fe>
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>
notify(N_FUN, pet.happy);
6a8: 00140583 lb a1,1(s0)
6ac: 4505 li a0,1
6ae: 3bc1 jal 47e <notify>
notify(N_ENGY, pet.energy);
6b0: 00240583 lb a1,2(s0)
6b4: 4509 li a0,2
6b6: 33e1 jal 47e <notify>
notify(N_WASH, pet.hygiene);
6b8: 00340583 lb a1,3(s0)
6bc: 450d li a0,3
6be: 33c1 jal 47e <notify>
// 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 <game_tick+0x232>
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 <screen>
beep(330, 200); beep(247, 200); beep(165, 400);
6da: 3935 jal 316 <beep>
6dc: 0c800593 li a1,200
6e0: 0f700513 li a0,247
6e4: 390d jal 316 <beep>
}
}
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 <beep>
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 <game_tick+0xb4>
700: fff6c593 not a1,a3
704: 85fd srai a1,a1,0x1f
706: 8eed and a3,a3,a1
708: b7a9 j 652 <game_tick+0x146>
70a: fff7c713 not a4,a5
70e: 877d srai a4,a4,0x1f
710: 8ff9 and a5,a5,a4
712: b769 j 69c <game_tick+0x190>
else if (lo > 50) pet.health = clamp100(pet.health + 2);
714: 03200693 li a3,50
718: f8e6d4e3 bge a3,a4,6a0 <game_tick+0x194>
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 <game_tick+0x228>
726: 87ba mv a5,a4
728: 00f40223 sb a5,4(s0)
if (lo > 50 && !pet.sleeping) add_xp(3);
72c: fa35 bnez a2,6a0 <game_tick+0x194>
72e: 450d li a0,3
730: 3141 jal 3b0 <add_xp>
732: b7bd j 6a0 <game_tick+0x194>
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 <game_tick+0x21c>
}
73e: 4092 lw ra,4(sp)
740: 4402 lw s0,0(sp)
742: 0121 addi sp,sp,8
744: 8082 ret
00000746 <draw_center_str>:
// ----------------------------------------------------------------- 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 <draw_center_str+0x24>
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 <ssd1306_drawstr>
while (s[len]) len++;
76a: 0705 addi a4,a4,1
76c: bff9 j 74a <draw_center_str+0x4>
0000076e <read_buttons>:
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 <ssd1306_drawFastHLine.part.0>:
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 <ssd1306_drawFastHLine.part.0+0x20>
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 <ssd1306_drawFastHLine.part.0+0x32>
}
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 <ssd1306_drawPixel>
7dc: 4612 lw a2,4(sp)
7de: 4582 lw a1,0(sp)
7e0: 8526 mv a0,s1
7e2: b7cd j 7c4 <ssd1306_drawFastHLine.part.0+0x24>
000007e4 <ssd1306_drawLine.constprop.0>:
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 <ssd1306_drawLine.constprop.0+0x3e>
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 <ssd1306_drawLine.constprop.0+0x4e>
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 <ssd1306_drawLine.constprop.0+0x78>
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 <ssd1306_drawLine.constprop.0+0x88>
}
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_drawLine.constprop.0+0xbc>
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 <ssd1306_drawPixel>
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 <ssd1306_drawLine.constprop.0+0xb8>
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_drawLine.constprop.0+0x78>
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 <ssd1306_drawPixel>
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 <ssd1306_drawLine.constprop.0+0xa8>
000008b4 <ssd1306_drawFastVLine.constprop.0>:
if((x >= SSD1306_W) || (y >= SSD1306_H)) return;
8b4: 07f00793 li a5,127
8b8: 04a7c063 blt a5,a0,8f8 <ssd1306_drawFastVLine.constprop.0+0x44>
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 <ssd1306_drawFastVLine.constprop.0+0x22>
8d2: 40b70633 sub a2,a4,a1
8d6: 008604b3 add s1,a2,s0
while(h--)
8da: 00941763 bne s0,s1,8e8 <ssd1306_drawFastVLine.constprop.0+0x34>
}
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 <ssd1306_drawPixel>
8f2: 4502 lw a0,0(sp)
8f4: 0405 addi s0,s0,1
8f6: b7d5 j 8da <ssd1306_drawFastVLine.constprop.0+0x26>
8f8: 8082 ret
000008fa <ssd1306_drawRect.constprop.0>:
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.constprop.0>
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 <ssd1306_drawFastVLine.constprop.0>
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.part.0>
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 <ssd1306_drawRect.constprop.0+0x4c>
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 <ssd1306_drawFastHLine.part.0>
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 <draw_bar>:
{
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_drawstr>
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 <ssd1306_drawRect.constprop.0>
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 <draw_bar+0x5e>
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 <ssd1306_fillRect>
}
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 <ssd1306_drawImage.constprop.0>:
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 <ssd1306_drawImage.constprop.0+0xb6>
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 <ssd1306_drawImage.constprop.0+0xa6>
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 <ssd1306_buffer>
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 <ssd1306_drawImage.constprop.0+0x56>
for (uint32_t byte = 0; byte < bytes_to_draw; byte++) {
a5e: 0685 addi a3,a3,1
a60: f8d41ae3 bne s0,a3,9f4 <ssd1306_drawImage.constprop.0+0x3c>
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 <ssd1306_drawImage.constprop.0+0x18>
}
a6e: 5412 lw s0,36(sp)
a70: 5482 lw s1,32(sp)
a72: 02810113 addi sp,sp,40
a76: 8082 ret
00000a78 <ssd1306_i2c_send.constprop.0>:
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 <tama.c.fb7bdcf7+0x144cf>
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 <ssd1306_i2c_send.constprop.0+0xdc>
a90: 177d addi a4,a4,-1
a92: fec71be3 bne a4,a2,a88 <ssd1306_i2c_send.constprop.0+0x10>
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 <ssd1306_i2c_setup>
// 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 <tama.c.fb7bdcf7+0x144d0>
while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--));
aac: 01475683 lhu a3,20(a4)
ab0: 0806f693 andi a3,a3,128
ab4: e681 bnez a3,abc <ssd1306_i2c_send.constprop.0+0x44>
ab6: 17fd addi a5,a5,-1
ab8: fbf5 bnez a5,aac <ssd1306_i2c_send.constprop.0+0x34>
aba: bff1 j a96 <ssd1306_i2c_send.constprop.0+0x1e>
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 <ssd1306_i2c_send.constprop.0+0x2e>
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 <tama.c.fb7bdcf7+0x144cf>
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 <tama.c.fb7bdcf7+0x6beb3>
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 <ssd1306_i2c_send.constprop.0+0x84>
af4: 16fd addi a3,a3,-1
af6: feb696e3 bne a3,a1,ae2 <ssd1306_i2c_send.constprop.0+0x6a>
afa: bf71 j a96 <ssd1306_i2c_send.constprop.0+0x1e>
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 <ssd1306_i2c_send.constprop.0+0x4e>
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 <tama.c.fb7bdcf7+0x144cf>
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 <tama.c.fb7bdcf7+0x6beb1>
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 <ssd1306_i2c_send.constprop.0+0x94>
b4c: 167d addi a2,a2,-1
b4e: fe6615e3 bne a2,t1,b38 <ssd1306_i2c_send.constprop.0+0xc0>
b52: b791 j a96 <ssd1306_i2c_send.constprop.0+0x1e>
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 <tama.c.fb7bdcf7+0x144cf>
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 <tama.c.fb7bdcf7+0x2be30>
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 <ssd1306_i2c_send.constprop.0+0xa0>
b8a: 16fd addi a3,a3,-1
b8c: fe6695e3 bne a3,t1,b76 <ssd1306_i2c_send.constprop.0+0xfe>
b90: b719 j a96 <ssd1306_i2c_send.constprop.0+0x1e>
00000b92 <ssd1306_cmd>:
{
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 <ssd1306_i2c_send.constprop.0>
}
ba6: 5092 lw ra,36(sp)
ba8: 02810113 addi sp,sp,40
bac: 8082 ret
00000bae <apply_brightness>:
{
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>
ssd1306_cmd(brightness_opts[bright_idx]);
bb8: c061c783 lbu a5,-1018(gp) # 20000002 <bright_idx>
bbc: c2818713 addi a4,gp,-984 # 20000024 <brightness_opts>
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 <ssd1306_cmd>
00000bcc <handle_reset>:
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 <main+0xb58>
bde: 30051073 csrw mstatus,a0
be2: fffff697 auipc a3,0xfffff
be6: 41e68693 addi a3,a3,1054 # 0 <InterruptVector>
bea: 0036e693 ori a3,a3,3
bee: 30569073 csrw mtvec,a3
asm volatile(
bf2: c2c18513 addi a0,gp,-980 # 20000028 <anim_exp>
bf6: 06418593 addi a1,gp,100 # 20000460 <_ebss>
bfa: 4601 li a2,0
bfc: 00b55663 bge a0,a1,c08 <handle_reset+0x3c>
c00: c110 sw a2,0(a0)
c02: 0511 addi a0,a0,4
c04: feb54ee3 blt a0,a1,c00 <handle_reset+0x34>
c08: 00002517 auipc a0,0x2
c0c: 58450513 addi a0,a0,1412 # 318c <_data_lma>
c10: c0418593 addi a1,gp,-1020 # 20000000 <timeout_idx>
c14: c2c18613 addi a2,gp,-980 # 20000028 <anim_exp>
c18: 00c58863 beq a1,a2,c28 <handle_reset+0x5c>
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 <handle_reset+0x4c>
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 <main>
c36: 34179073 csrw mepc,a5
c3a: 30200073 mret
00000c3e <ADC1_2_IRQHandler>:
asm volatile( "1: j 1b" );
c3e: a001 j c3e <ADC1_2_IRQHandler>
00000c40 <NMI_Handler>:
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 <memset>:
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 <memset+0xa>
c56: 8082 ret
c58: 00b78023 sb a1,0(a5)
c5c: 0785 addi a5,a5,1
c5e: bfd5 j c52 <memset+0x4>
00000c60 <ssd1306_setbuf.constprop.0>:
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 <ssd1306_buffer>
c6a: b7d5 j c4e <memset>
00000c6c <memcpy>:
for (; n; n--) *d++ = *s++;
c6c: 4781 li a5,0
c6e: 00f61363 bne a2,a5,c74 <memcpy+0x8>
}
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 <memcpy+0x2>
00000c88 <ssd1306_refresh>:
{
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_cmd(SSD1306_OFFSET); // Column start address (0 = reset)
c96: 4501 li a0,0
c98: 3ded jal b92 <ssd1306_cmd>
ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset)
c9a: 07f00513 li a0,127
c9e: 3dd5 jal b92 <ssd1306_cmd>
ssd1306_cmd(SSD1306_PAGEADDR);
ca0: 02200513 li a0,34
ca4: 35fd jal b92 <ssd1306_cmd>
ssd1306_cmd(0); // Page start address (0 = reset)
ca6: 4501 li a0,0
ca8: 35ed jal b92 <ssd1306_cmd>
ssd1306_cmd(7); // Page end address
caa: 451d li a0,7
cac: c6418413 addi s0,gp,-924 # 20000060 <ssd1306_buffer>
cb0: 35cd jal b92 <ssd1306_cmd>
for(i=0;i<sizeof(ssd1306_buffer);i+=SSD1306_PSZ)
cb2: 40040493 addi s1,s0,1024
pkt[0] = 0x40;
cb6: 04000793 li a5,64
memcpy(&pkt[1], data, sz);
cba: 85a2 mv a1,s0
cbc: 02000613 li a2,32
cc0: 00110513 addi a0,sp,1
pkt[0] = 0x40;
cc4: 00f10023 sb a5,0(sp)
memcpy(&pkt[1], data, sz);
cc8: 3755 jal c6c <memcpy>
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 <ssd1306_i2c_send.constprop.0>
cd6: fe9410e3 bne s0,s1,cb6 <ssd1306_refresh+0x2e>
}
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 <SystemInit>:
//#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 <tama.c.fb7bdcf7+0x107beb0>
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 <SystemInit+0x20>
#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 <SystemInit+0x3a>
SetupDebugPrintf();
#endif
#if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS
CallConstructors();
#endif
}
d26: 8082 ret
00000d28 <main>:
}
}
// ----------------------------------------------------------------- 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 <SystemInit>
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 <reset_cause>
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 <ch32fun.c.c0bc4b2f+0x91f>
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 <tama.c.fb7bdcf7+0x1bee>
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 <ch32fun.c.c0bc4b2f+0x7b4>
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 <tama.c.fb7bdcf7+0xabaaf>
e38: ae6ff0ef jal 11e <DelaySysTick>
* 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 <SystemInit+0x1c>
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 <ssd1306_i2c_setup>
e80: 6fc48493 addi s1,s1,1788 # 26fc <ssd1306_init_array>
ssd1306_setbuf(0);
e84: 3bf1 jal c60 <ssd1306_setbuf.constprop.0>
while(*cmd_list != SSD1306_TERMINATE_CMDS)
e86: 0004c503 lbu a0,0(s1)
e8a: 0ff00793 li a5,255
e8e: 00f51463 bne a0,a5,e96 <main+0x16e>
{
if(ssd1306_cmd(*cmd_list++))
return 1;
}
ssd1306_refresh();
e92: 3bdd jal c88 <ssd1306_refresh>
#endif
return 0;
e94: a021 j e9c <main+0x174>
if(ssd1306_cmd(*cmd_list++))
e96: 0485 addi s1,s1,1
e98: 39ed jal b92 <ssd1306_cmd>
e9a: d575 beqz a0,e86 <main+0x15e>
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 <apply_brightness>
ssd1306_setbuf(0);
e9e: 33c9 jal c60 <ssd1306_setbuf.constprop.0>
for (uint8_t i = 0; i < 5; i++) {
ea0: 6789 lui a5,0x2
ea2: 71878793 addi a5,a5,1816 # 2718 <boot.0>
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_drawstr>
ssd1306_refresh();
eb6: 3bc9 jal c88 <ssd1306_refresh>
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 <beep>
Delay_Ms(220);
ece: 00142537 lui a0,0x142
ed2: 44050513 addi a0,a0,1088 # 142440 <tama.c.fb7bdcf7+0x13e26f>
ed6: a48ff0ef jal 11e <DelaySysTick>
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 <main+0x180>
rp = s_cat(rp, "rst:");
ee8: 6589 lui a1,0x2
eea: c3858593 addi a1,a1,-968 # 1c38 <TIM2_IRQHandler+0x4c>
eee: 0088 addi a0,sp,64
ef0: bb4ff0ef jal 2a4 <s_cat>
if (reset_cause & RCC_LPWRRSTF) rp = s_cat(rp, "LPW ");
ef4: c381a403 lw s0,-968(gp) # 20000034 <reset_cause>
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 <main+0x1e2>
efe: 6589 lui a1,0x2
f00: c4058593 addi a1,a1,-960 # 1c40 <TIM2_IRQHandler+0x54>
f04: ba0ff0ef jal 2a4 <s_cat>
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 <main+0x1f8>
f12: 6589 lui a1,0x2
f14: 853e mv a0,a5
f16: c4858593 addi a1,a1,-952 # 1c48 <TIM2_IRQHandler+0x5c>
f1a: b8aff0ef jal 2a4 <s_cat>
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 <main+0x20e>
f28: 6589 lui a1,0x2
f2a: 853e mv a0,a5
f2c: c5058593 addi a1,a1,-944 # 1c50 <TIM2_IRQHandler+0x64>
f30: b74ff0ef jal 2a4 <s_cat>
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 <main+0x224>
f3e: 6589 lui a1,0x2
f40: 853e mv a0,a5
f42: c5858593 addi a1,a1,-936 # 1c58 <TIM2_IRQHandler+0x6c>
f46: b5eff0ef jal 2a4 <s_cat>
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 <main+0x23a>
f54: 6589 lui a1,0x2
f56: 853e mv a0,a5
f58: c6058593 addi a1,a1,-928 # 1c60 <TIM2_IRQHandler+0x74>
f5c: b48ff0ef jal 2a4 <s_cat>
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 <main+0x250>
f6a: 6589 lui a1,0x2
f6c: 853e mv a0,a5
f6e: c6858593 addi a1,a1,-920 # 1c68 <TIM2_IRQHandler+0x7c>
f72: b32ff0ef jal 2a4 <s_cat>
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 <main+0x264>
f7e: 6589 lui a1,0x2
f80: 853e mv a0,a5
f82: c7058593 addi a1,a1,-912 # 1c70 <TIM2_IRQHandler+0x84>
f86: b1eff0ef jal 2a4 <s_cat>
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 <ssd1306_drawstr>
draw_center_str(54, "press any key");
f9e: 6589 lui a1,0x2
fa0: c7858593 addi a1,a1,-904 # 1c78 <TIM2_IRQHandler+0x8c>
fa4: 03600513 li a0,54
fa8: f9eff0ef jal 746 <draw_center_str>
ssd1306_refresh();
fac: 39f1 jal c88 <ssd1306_refresh>
beep(988, 120);
fae: 07800593 li a1,120
fb2: 3dc00513 li a0,988
fb6: b60ff0ef jal 316 <beep>
fba: 0c800413 li s0,200
Buttons b = read_buttons();
fbe: fb0ff0ef jal 76e <read_buttons>
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 <main+0x2c6>
Delay_Ms(20);
fe0: 6575 lui a0,0x1d
fe2: 4c050513 addi a0,a0,1216 # 1d4c0 <tama.c.fb7bdcf7+0x192ef>
for (int i = 0; i < 200; i++) {
fe6: 147d addi s0,s0,-1
Delay_Ms(20);
fe8: 936ff0ef jal 11e <DelaySysTick>
for (int i = 0; i < 200; i++) {
fec: f869 bnez s0,fbe <main+0x296>
splash();
screen = SCR_SELECT; // pick a species before a pet is born
fee: c2018f23 sb zero,-962(gp) # 2000003a <screen>
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 <disp_on>
ffc: eadd bnez a3,10b2 <main+0x38a>
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 <exti_wake>
tick_wake = 0;
100c: c2018e23 sb zero,-964(gp) # 20000038 <tick_wake>
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 <tama.c.fb7bdcf7+0xbe2d>
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 <exti_wake>
1044: c721 beqz a4,108c <main+0x364>
ssd1306_cmd(SSD1306_DISPLAYON);
1046: 0af00513 li a0,175
104a: 36a1 jal b92 <ssd1306_cmd>
disp_on = 1;
104c: 4785 li a5,1
104e: c0f182a3 sb a5,-1019(gp) # 20000001 <disp_on>
idle_frames = 0;
1052: c201aa23 sw zero,-972(gp) # 20000030 <idle_frames>
tick_acc = 0;
1056: c2019723 sh zero,-978(gp) # 2000002a <tick_acc>
// 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 <read_buttons>
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 <main+0x2d0>
if (pet.alive) {
108c: c5018493 addi s1,gp,-944 # 2000004c <pet>
1090: 0104c703 lbu a4,16(s1)
1094: db35 beqz a4,1008 <main+0x2e0>
game_tick();
1096: c76ff0ef jal 50c <game_tick>
if (!pet.alive) { // it died in its sleep: show the grave
109a: 0104c783 lbu a5,16(s1)
109e: f3a5 bnez a5,ffe <main+0x2d6>
ssd1306_cmd(SSD1306_DISPLAYON);
10a0: 0af00513 li a0,175
10a4: 34fd jal b92 <ssd1306_cmd>
disp_on = 1;
10a6: 4785 li a5,1
10a8: c0f182a3 sb a5,-1019(gp) # 20000001 <disp_on>
idle_frames = 0;
10ac: c201aa23 sw zero,-972(gp) # 20000030 <idle_frames>
return;
10b0: b76d j 105a <main+0x332>
10b2: c43e sw a5,8(sp)
10b4: c23a sw a4,4(sp)
continue;
}
Buttons b = read_buttons();
10b6: eb8ff0ef jal 76e <read_buttons>
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 <main+0x3c8>
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 <main+0x3d6>
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 <main+0x3e4>
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 <main+0x3ee>
1112: c201aa23 sw zero,-972(gp) # 20000030 <idle_frames>
{
switch (screen) {
1116: c3e1c703 lbu a4,-962(gp) # 2000003a <screen>
111a: 4611 li a2,4
111c: 7ee66963 bltu a2,a4,190e <main+0xbe6>
1120: 6609 lui a2,0x2
1122: 070a slli a4,a4,0x2
1124: e6c60613 addi a2,a2,-404 # 1e6c <TIM2_IRQHandler+0x280>
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 <main+0x426>
sel_species = (sel_species + SPECIES_COUNT - 1) % SPECIES_COUNT;
1130: c331c503 lbu a0,-973(gp) # 2000002f <sel_species>
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 <sel_species>
beep(1047, 25);
1142: 45e5 li a1,25
1144: 41700513 li a0,1047
1148: 9ceff0ef jal 316 <beep>
114c: 4692 lw a3,4(sp)
}
if (right_edge) {
114e: ce91 beqz a3,116a <main+0x442>
sel_species = (sel_species + 1) % SPECIES_COUNT;
1150: c331c503 lbu a0,-973(gp) # 2000002f <sel_species>
1154: 458d li a1,3
1156: 0505 addi a0,a0,1
1158: fa1fe0ef jal f8 <__modsi3>
115c: c2a189a3 sb a0,-973(gp) # 2000002f <sel_species>
beep(1047, 25);
1160: 45e5 li a1,25
1162: 41700513 li a0,1047
1166: 9b0ff0ef jal 316 <beep>
}
if (ok_edge) { // born! boot the chosen species
116a: 4782 lw a5,0(sp)
116c: c3b5 beqz a5,11d0 <main+0x4a8>
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>
pet.health = 100;
117a: c5018793 addi a5,gp,-944 # 2000004c <pet>
117e: 06400713 li a4,100
1182: 00e78223 sb a4,4(a5)
pet.species = sel_species;
1186: c331c703 lbu a4,-973(gp) # 2000002f <sel_species>
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 <cursor>
evo_anim = 0;
11a8: c4018623 sb zero,-948(gp) # 20000048 <evo_anim>
for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; }
11ac: c401a223 sw zero,-956(gp) # 20000040 <warn_flag>
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 <screen>
for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; }
11bc: c401a423 sw zero,-952(gp) # 20000044 <crit_flag>
beep(659, 80); beep(988, 120);
11c0: 956ff0ef jal 316 <beep>
11c4: 07800593 li a1,120
11c8: 3dc00513 li a0,988
11cc: 94aff0ef jal 316 <beep>
ssd1306_setbuf(0);
11d0: 3c41 jal c60 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "~ $ adopt --pet");
11d2: 6589 lui a1,0x2
11d4: c8858593 addi a1,a1,-888 # 1c88 <TIM2_IRQHandler+0x9c>
11d8: 4501 li a0,0
11da: d6cff0ef jal 746 <draw_center_str>
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_drawFastHLine.part.0>
ssd1306_drawImage(48, 13, species_frames[sel_species][EXP_IDLE],
11ec: c331c403 lbu s0,-973(gp) # 2000002f <sel_species>
11f0: 678d lui a5,0x3
11f2: 83878793 addi a5,a5,-1992 # 2838 <species_frames>
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 <ssd1306_drawImage.constprop.0>
p = s_cat(p, "< ");
1212: 6589 lui a1,0x2
1214: c9858593 addi a1,a1,-872 # 1c98 <TIM2_IRQHandler+0xac>
1218: 0088 addi a0,sp,64
121a: 88aff0ef jal 2a4 <s_cat>
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 <species_names>
1226: 97a2 add a5,a5,s0
1228: 438c lw a1,0(a5)
122a: 87aff0ef jal 2a4 <s_cat>
p = s_cat(p, " >");
122e: 6589 lui a1,0x2
1230: c9c58593 addi a1,a1,-868 # 1c9c <TIM2_IRQHandler+0xb0>
1234: 870ff0ef jal 2a4 <s_cat>
*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>
draw_center_str(56, "L/R pick OK go");
1246: 6589 lui a1,0x2
1248: ca058593 addi a1,a1,-864 # 1ca0 <TIM2_IRQHandler+0xb4>
draw_center_str(56, "OK: respawn");
124c: 03800513 li a0,56
1250: a98d j 16c2 <main+0x99a>
}
draw_select();
break;
case SCR_MAIN:
if (left_edge) {
1252: c185 beqz a1,1272 <main+0x54a>
cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT;
1254: c321c503 lbu a0,-974(gp) # 2000002e <cursor>
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 <cursor>
beep(1047, 25);
1266: 45e5 li a1,25
1268: 41700513 li a0,1047
126c: 8aaff0ef jal 316 <beep>
1270: 4692 lw a3,4(sp)
}
if (right_edge) {
1272: ce91 beqz a3,128e <main+0x566>
cursor = (cursor + 1) % ICON_COUNT;
1274: c321c503 lbu a0,-974(gp) # 2000002e <cursor>
1278: 459d li a1,7
127a: 0505 addi a0,a0,1
127c: e7dfe0ef jal f8 <__modsi3>
1280: c2a18923 sb a0,-974(gp) # 2000002e <cursor>
beep(1047, 25);
1284: 45e5 li a1,25
1286: 41700513 li a0,1047
128a: 88cff0ef jal 316 <beep>
}
if (ok_edge) do_action(cursor);
128e: 4782 lw a5,0(sp)
1290: c5018493 addi s1,gp,-944 # 2000004c <pet>
1294: 0e078e63 beqz a5,1390 <main+0x668>
switch (act) {
1298: c321c783 lbu a5,-974(gp) # 2000002e <cursor>
129c: 4699 li a3,6
129e: 0ef6e963 bltu a3,a5,1390 <main+0x668>
12a2: 6689 lui a3,0x2
12a4: 078a slli a5,a5,0x2
12a6: e8068693 addi a3,a3,-384 # 1e80 <TIM2_IRQHandler+0x294>
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 <main+0x5dc>
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 <main+0x5e6>
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 <anim_exp>
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 <anim_timer>
beep(880, 60); beep(1175, 80);
12ec: 82aff0ef jal 316 <beep>
12f0: 05000593 li a1,80
12f4: 49700513 li a0,1175
beep(784, 60); beep(1047, 60); beep(1319, 90);
12f8: 81eff0ef jal 316 <beep>
led_blink();
12fc: 88aff0ef jal 386 <led_blink>
add_xp(4);
1300: 4511 li a0,4
1302: a069 j 138c <main+0x664>
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 <main+0x598>
130e: fff7c713 not a4,a5
1312: 877d srai a4,a4,0x1f
1314: 8ff9 and a5,a5,a4
1316: bf7d j 12d4 <main+0x5ac>
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 <main+0x608>
1322: 07800593 li a1,120
1326: 0dc00513 li a0,220
beep(659, 40);
132a: fedfe0ef jal 316 <beep>
break;
132e: a08d j 1390 <main+0x668>
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 <main+0x9a0>
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 <main+0x62a>
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 <anim_exp>
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 <anim_timer>
beep(988, 60); beep(1319, 60); beep(1568, 90);
136a: fadfe0ef jal 316 <beep>
136e: 03c00593 li a1,60
1372: 52700513 li a0,1319
1376: fa1fe0ef jal 316 <beep>
137a: 62000513 li a0,1568
137e: 05a00593 li a1,90
1382: f95fe0ef jal 316 <beep>
led_blink();
1386: 800ff0ef jal 386 <led_blink>
add_xp(6);
138a: 4519 li a0,6
add_xp(4);
138c: 824ff0ef jal 3b0 <add_xp>
ssd1306_setbuf(0);
1390: 8d1ff0ef jal c60 <ssd1306_setbuf.constprop.0>
draw_center_str(0, menu_labels[cursor]);
1394: c321c783 lbu a5,-974(gp) # 2000002e <cursor>
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 <menu_labels>
13a4: 070a slli a4,a4,0x2
13a6: 97ba add a5,a5,a4
13a8: 438c lw a1,0(a5)
13aa: b9cff0ef jal 746 <draw_center_str>
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 <main+0x6b0>
13b6: 00448703 lb a4,4(s1)
13ba: 47f5 li a5,29
13bc: 00e7ce63 blt a5,a4,13d8 <main+0x6b0>
13c0: c401a783 lw a5,-960(gp) # 2000003c <frame>
13c4: 8ba1 andi a5,a5,8
13c6: cb89 beqz a5,13d8 <main+0x6b0>
ssd1306_drawstr(0, 0, "!", 1);
13c8: 6609 lui a2,0x2
13ca: 4685 li a3,1
13cc: cb060613 addi a2,a2,-848 # 1cb0 <TIM2_IRQHandler+0xc4>
13d0: 4581 li a1,0
13d2: 4501 li a0,0
13d4: e45fe0ef jal 218 <ssd1306_drawstr>
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 <u_cat>
*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 <ssd1306_drawstr>
13fe: 4685 li a3,1
1400: 08000613 li a2,128
1404: 45a9 li a1,10
1406: 4501 li a0,0
1408: b98ff0ef jal 7a0 <ssd1306_drawFastHLine.part.0>
if (pet.sleeping) {
140c: 00f4c403 lbu s0,15(s1)
1410: 38040463 beqz s0,1798 <main+0xa70>
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 <TIM2_IRQHandler+0xc8>
141c: 45b9 li a1,14
141e: 04e00513 li a0,78
1422: df7fe0ef jal 218 <ssd1306_drawstr>
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 <TIM2_IRQHandler+0xcc>
142e: 45b1 li a1,12
1430: 05400513 li a0,84
1434: de5fe0ef jal 218 <ssd1306_drawstr>
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 <spr_claude>
1452: c63e sw a5,12(sp)
1454: 4732 lw a4,12(sp)
1456: 478d li a5,3
1458: 02f70b63 beq a4,a5,148e <main+0x766>
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 <main+0xae4>
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 <main+0x752>
if (anim_timer) return anim_exp;
146e: c301c703 lbu a4,-976(gp) # 2000002c <anim_timer>
1472: 34070f63 beqz a4,17d0 <main+0xaa8>
1476: c2c1c503 lbu a0,-980(gp) # 20000028 <anim_exp>
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 <species_frames>
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 <ssd1306_drawImage.constprop.0>
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 <spr_claude>
14a6: 10f60f63 beq a2,a5,15c4 <main+0x89c>
14aa: 6789 lui a5,0x2
14ac: 73878793 addi a5,a5,1848 # 2738 <spr_glitch>
14b0: 10f60a63 beq a2,a5,15c4 <main+0x89c>
14b4: 10041863 bnez s0,15c4 <main+0x89c>
if (pet.form >= FORM_USER) { // shades
14b8: 47b2 lw a5,12(sp)
14ba: 14078263 beqz a5,15fe <main+0x8d6>
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 <eye_rx>
14c6: 97ba add a5,a5,a4
14c8: 0007c403 lbu s0,0(a5)
14cc: c1418693 addi a3,gp,-1004 # 20000010 <eye_cy>
14d0: c1018793 addi a5,gp,-1008 # 2000000c <eye_lx>
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>
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 <ssd1306_fillRect>
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 <main+0x820>
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 <main+0x820>
1534: fff28593 addi a1,t0,-1
1538: 03f00793 li a5,63
153c: 00b7c663 blt a5,a1,1548 <main+0x820>
1540: 4681 li a3,0
1542: 1665 addi a2,a2,-7
1544: a5cff0ef jal 7a0 <ssd1306_drawFastHLine.part.0>
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 <main+0x8d6>
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.constprop.0>
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.constprop.0>
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_drawLine.constprop.0>
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_fillRect>
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 <ssd1306_drawLine.constprop.0>
if (pet.form == FORM_CLAUDE) {
15c4: 4732 lw a4,12(sp)
15c6: 478d li a5,3
15c8: 02f71b63 bne a4,a5,15fe <main+0x8d6>
ssd1306_drawPixel(x - 2 + (frame & 3), y + 4, 1);
15cc: c401a403 lw s0,-960(gp) # 2000003c <frame>
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>
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 <ssd1306_drawPixel>
15fe: 4685 li a3,1
1600: 08000613 li a2,128
1604: 02e00593 li a1,46
1608: 4501 li a0,0
160a: 996ff0ef jal 7a0 <ssd1306_drawFastHLine.part.0>
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 <main+0xaec>
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 <menu_icons>
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 <ssd1306_drawImage.constprop.0>
if (i == cursor)
1640: 5702 lw a4,32(sp)
1642: 0ff47793 zext.b a5,s0
1646: 00f71963 bne a4,a5,1658 <main+0x930>
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 <ssd1306_drawRect.constprop.0>
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 <main+0x8f2>
if (evo_anim) draw_evo_banner(); // celebratory overlay on top
1660: c4c1c783 lbu a5,-948(gp) # 20000048 <evo_anim>
1664: 2a078363 beqz a5,190a <main+0xbe2>
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_fillRect>
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 <ssd1306_drawRect.constprop.0>
draw_center_str(21, ">> evolving");
1686: 6589 lui a1,0x2
1688: cbc58593 addi a1,a1,-836 # 1cbc <TIM2_IRQHandler+0xd0>
168c: 4555 li a0,21
168e: 8b8ff0ef jal 746 <draw_center_str>
p = s_cat(p, "[ ");
1692: 6589 lui a1,0x2
1694: cc858593 addi a1,a1,-824 # 1cc8 <TIM2_IRQHandler+0xdc>
1698: 0088 addi a0,sp,64
169a: c0bfe0ef jal 2a4 <s_cat>
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 <form_names>
16a6: 078a slli a5,a5,0x2
16a8: 97ba add a5,a5,a4
16aa: 438c lw a1,0(a5)
16ac: bf9fe0ef jal 2a4 <s_cat>
p = s_cat(p, " ]");
16b0: 6589 lui a1,0x2
16b2: ccc58593 addi a1,a1,-820 # 1ccc <TIM2_IRQHandler+0xe0>
16b6: beffe0ef jal 2a4 <s_cat>
*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 <draw_center_str>
16c6: a491 j 190a <main+0xbe2>
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 <main+0x618>
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 <main+0x602>
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 <pet>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
170a: 02f6d363 bge a3,a5,1730 <main+0xa08>
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 <beep>
1720: 41700513 li a0,1047
1724: 03200593 li a1,50
1728: beffe0ef jal 316 <beep>
add_xp(3);
172c: 450d li a0,3
172e: b9b9 j 138c <main+0x664>
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 <main+0x9e8>
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 <main+0xa4a>
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 <beep>
175c: 03c00593 li a1,60
1760: 41700513 li a0,1047
1764: bb3fe0ef jal 316 <beep>
1768: 05a00593 li a1,90
176c: 52700513 li a0,1319
1770: b661 j 12f8 <main+0x5d0>
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 <main+0xa24>
screen = SCR_STATS;
177c: 4789 li a5,2
177e: c2f18f23 sb a5,-962(gp) # 2000003a <screen>
beep(659, 40);
1782: 02800593 li a1,40
1786: 29300513 li a0,659
178a: b645 j 132a <main+0x602>
screen = SCR_SETTINGS;
178c: 4791 li a5,4
178e: c2f18f23 sb a5,-962(gp) # 2000003a <screen>
set_sel = 0;
1792: c20188a3 sb zero,-975(gp) # 2000002d <set_sel>
1796: b7f5 j 1782 <main+0xa5a>
uint32_t t = frame % 80;
1798: c401a783 lw a5,-960(gp) # 2000003c <frame>
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 <main+0xaa0>
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 <main+0x720>
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 <main+0xa8e>
if (pet.sleeping) return EXP_SLEEP;
17d0: 4515 li a0,5
17d2: ca0414e3 bnez s0,147a <main+0x752>
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 <main+0x752>
17e2: 00148603 lb a2,1(s1)
17e6: 4761 li a4,24
17e8: c8c759e3 bge a4,a2,147a <main+0x752>
17ec: 00048603 lb a2,0(s1)
17f0: 474d li a4,19
17f2: c8c754e3 bge a4,a2,147a <main+0x752>
if ((frame % 50) < 4) return EXP_BLINK;
17f6: c401a503 lw a0,-960(gp) # 2000003c <frame>
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 <main+0x752>
else if (pet.form == FORM_GLITCH) spr = spr_glitch;
180c: 6609 lui a2,0x2
180e: 73860613 addi a2,a2,1848 # 2738 <spr_glitch>
1812: b9b5 j 148e <main+0x766>
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 <spr_poop>
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 <ssd1306_drawImage.constprop.0>
for (uint8_t i = 0; i < pet.poop; i++)
1830: 0ff47413 zext.b s0,s0
1834: bbf1 j 1610 <main+0x8e8>
draw_main();
break;
case SCR_STATS:
if (any_edge) { screen = SCR_MAIN; beep(880, 30); }
1836: cb89 beqz a5,1848 <main+0xb20>
1838: 4785 li a5,1
183a: 45f9 li a1,30
183c: 37000513 li a0,880
1840: c2f18f23 sb a5,-962(gp) # 2000003a <screen>
1844: ad3fe0ef jal 316 <beep>
ssd1306_setbuf(0);
1848: c18ff0ef jal c60 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "~/pet $ stat");
184c: 6589 lui a1,0x2
184e: cd058593 addi a1,a1,-816 # 1cd0 <TIM2_IRQHandler+0xe4>
1852: 4501 li a0,0
draw_bar(10, "FOOD", pet.satiety);
1854: c5018413 addi s0,gp,-944 # 2000004c <pet>
draw_center_str(0, "~/pet $ stat");
1858: eeffe0ef jal 746 <draw_center_str>
draw_bar(10, "FOOD", pet.satiety);
185c: 00040603 lb a2,0(s0)
1860: 6589 lui a1,0x2
1862: ce058593 addi a1,a1,-800 # 1ce0 <TIM2_IRQHandler+0xf4>
1866: 4529 li a0,10
1868: 8e8ff0ef jal 950 <draw_bar>
draw_bar(19, "HAPPY", pet.happy);
186c: 00140603 lb a2,1(s0)
1870: 6589 lui a1,0x2
1872: ce858593 addi a1,a1,-792 # 1ce8 <TIM2_IRQHandler+0xfc>
1876: 454d li a0,19
1878: 8d8ff0ef jal 950 <draw_bar>
draw_bar(28, "ENERGY", pet.energy);
187c: 00240603 lb a2,2(s0)
1880: 6589 lui a1,0x2
1882: cf058593 addi a1,a1,-784 # 1cf0 <TIM2_IRQHandler+0x104>
1886: 4571 li a0,28
1888: 8c8ff0ef jal 950 <draw_bar>
draw_bar(37, "CLEAN", pet.hygiene);
188c: 00340603 lb a2,3(s0)
1890: 6589 lui a1,0x2
1892: cf858593 addi a1,a1,-776 # 1cf8 <TIM2_IRQHandler+0x10c>
1896: 02500513 li a0,37
189a: 8b6ff0ef jal 950 <draw_bar>
draw_bar(46, "HEALTH", pet.health);
189e: 00440603 lb a2,4(s0)
18a2: 6589 lui a1,0x2
18a4: d0058593 addi a1,a1,-768 # 1d00 <TIM2_IRQHandler+0x114>
18a8: 02e00513 li a0,46
18ac: 8a4ff0ef jal 950 <draw_bar>
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 <u_cat>
p = s_cat(p, " xp ");
18c6: 6589 lui a1,0x2
18c8: d0858593 addi a1,a1,-760 # 1d08 <TIM2_IRQHandler+0x11c>
18cc: 9d9fe0ef jal 2a4 <s_cat>
if (pet.level < MAX_LEVEL) {
18d0: 478d li a5,3
18d2: 0a97ec63 bltu a5,s1,198a <main+0xc62>
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 <u_cat>
*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 <level_xp>
18ec: 94be add s1,s1,a5
18ee: 0004d583 lhu a1,0(s1)
18f2: 0505 addi a0,a0,1
18f4: 9c3fe0ef jal 2b6 <u_cat>
*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_drawstr>
ssd1306_refresh();
190a: b7eff0ef jal c88 <ssd1306_refresh>
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 <timeout_idx>
1912: 678d lui a5,0x3
1914: 98078793 addi a5,a5,-1664 # 2980 <screen_timeout_opts>
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 <idle_frames>
1924: cb89 beqz a5,1936 <main+0xc0e>
1926: 00f46863 bltu s0,a5,1936 <main+0xc0e>
ssd1306_cmd(SSD1306_DISPLAYOFF);
192a: 0ae00513 li a0,174
192e: a64ff0ef jal b92 <ssd1306_cmd>
disp_on = 0;
1932: c00182a3 sb zero,-1019(gp) # 20000001 <disp_on>
}
}
if (anim_timer) anim_timer--;
1936: c301c783 lbu a5,-976(gp) # 2000002c <anim_timer>
193a: c781 beqz a5,1942 <main+0xc1a>
193c: 17fd addi a5,a5,-1
193e: c2f18823 sb a5,-976(gp) # 2000002c <anim_timer>
if (evo_anim) evo_anim--;
1942: c4c1c783 lbu a5,-948(gp) # 20000048 <evo_anim>
1946: c781 beqz a5,194e <main+0xc26>
1948: 17fd addi a5,a5,-1
194a: c4f18623 sb a5,-948(gp) # 20000048 <evo_anim>
// advance game time independent of screen / display state
if (pet.alive && ++tick_acc >= TICK_FRAMES) {
194e: c601c783 lbu a5,-928(gp) # 2000005c <pet+0x10>
1952: cf81 beqz a5,196a <main+0xc42>
1954: c2e1d783 lhu a5,-978(gp) # 2000002a <tick_acc>
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 <main+0xe96>
1966: c2f19723 sh a5,-978(gp) # 2000002a <tick_acc>
tick_acc = 0;
game_tick();
}
frame++;
196a: c401a783 lw a5,-960(gp) # 2000003c <frame>
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 <tama.c.fb7bdcf7+0x53c6f>
frame++;
197a: c4f1a023 sw a5,-960(gp) # 2000003c <frame>
idle_frames++;
197e: c281aa23 sw s0,-972(gp) # 20000030 <idle_frames>
Delay_Ms(FRAME_MS);
1982: f9cfe0ef jal 11e <DelaySysTick>
1986: efeff06f j 1084 <main+0x35c>
p = s_cat(p, "MAX");
198a: 6589 lui a1,0x2
198c: d1058593 addi a1,a1,-752 # 1d10 <TIM2_IRQHandler+0x124>
1990: 915fe0ef jal 2a4 <s_cat>
1994: b795 j 18f8 <main+0xbd0>
if (left_edge) {
1996: cd91 beqz a1,19b2 <main+0xc8a>
set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS;
1998: c311c783 lbu a5,-975(gp) # 2000002d <set_sel>
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 <set_sel>
beep(1047, 25);
19ac: 96bfe0ef jal 316 <beep>
19b0: 4692 lw a3,4(sp)
if (right_edge) {
19b2: ce81 beqz a3,19ca <main+0xca2>
set_sel = (set_sel + 1) % SETTINGS_ROWS;
19b4: c311c783 lbu a5,-975(gp) # 2000002d <set_sel>
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 <set_sel>
beep(1047, 25);
19c6: 951fe0ef jal 316 <beep>
if (ok_edge) {
19ca: 4782 lw a5,0(sp)
19cc: cfa1 beqz a5,1a24 <main+0xcfc>
if (set_sel == 0) { // cycle screen-off timeout
19ce: c311c783 lbu a5,-975(gp) # 2000002d <set_sel>
19d2: ef91 bnez a5,19ee <main+0xcc6>
timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT;
19d4: c041c503 lbu a0,-1020(gp) # 20000000 <timeout_idx>
19d8: 4599 li a1,6
19da: 0505 addi a0,a0,1
19dc: f1cfe0ef jal f8 <__modsi3>
19e0: c0a18223 sb a0,-1020(gp) # 20000000 <timeout_idx>
beep(880, 40);
19e4: 02800593 li a1,40
beep(880, 30);
19e8: 37000513 li a0,880
19ec: a815 j 1a20 <main+0xcf8>
} else if (set_sel == 1) { // cycle brightness
19ee: 4705 li a4,1
19f0: 00e79b63 bne a5,a4,1a06 <main+0xcde>
bright_idx = (bright_idx + 1) % BRIGHT_OPT_COUNT;
19f4: c061c783 lbu a5,-1018(gp) # 20000002 <bright_idx>
19f8: 0785 addi a5,a5,1
19fa: 8b8d andi a5,a5,3
19fc: c0f18323 sb a5,-1018(gp) # 20000002 <bright_idx>
apply_brightness(); // takes effect immediately
1a00: 9aeff0ef jal bae <apply_brightness>
1a04: b7c5 j 19e4 <main+0xcbc>
} else if (set_sel == 2) { // toggle sound
1a06: 4689 li a3,2
1a08: 10d79c63 bne a5,a3,1b20 <main+0xdf8>
sound_on = !sound_on;
1a0c: c071c783 lbu a5,-1017(gp) # 20000003 <sound_on>
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 <sound_on>
beep(880, 30);
1a20: 8f7fe0ef jal 316 <beep>
ssd1306_setbuf(0);
1a24: a3cff0ef jal c60 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "- SETTINGS -");
1a28: 6589 lui a1,0x2
1a2a: d1458593 addi a1,a1,-748 # 1d14 <TIM2_IRQHandler+0x128>
1a2e: 4501 li a0,0
1a30: d17fe0ef jal 746 <draw_center_str>
1a34: 4685 li a3,1
1a36: 08000613 li a2,128
1a3a: 45a9 li a1,10
1a3c: 4501 li a0,0
1a3e: d63fe0ef jal 7a0 <ssd1306_drawFastHLine.part.0>
*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 <TIM2_IRQHandler+0x138>
1a48: 0088 addi a0,sp,64
1a4a: 85bfe0ef jal 2a4 <s_cat>
1a4e: c041c703 lbu a4,-1020(gp) # 20000000 <timeout_idx>
1a52: 678d lui a5,0x3
1a54: 8e878793 addi a5,a5,-1816 # 28e8 <screen_timeout_names>
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(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 <TIM2_IRQHandler+0x144>
1a6c: 05110513 addi a0,sp,81
1a70: 835fe0ef jal 2a4 <s_cat>
1a74: c061c703 lbu a4,-1018(gp) # 20000002 <bright_idx>
1a78: 678d lui a5,0x3
1a7a: 8d878793 addi a5,a5,-1832 # 28d8 <brightness_names>
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(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 <TIM2_IRQHandler+0x150>
1a92: 06210513 addi a0,sp,98
1a96: 80ffe0ef jal 2a4 <s_cat>
1a9a: c071c783 lbu a5,-1017(gp) # 20000003 <sound_on>
1a9e: c7c9 beqz a5,1b28 <main+0xe00>
1aa0: 6589 lui a1,0x2
1aa2: c0c58593 addi a1,a1,-1012 # 1c0c <TIM2_IRQHandler+0x20>
1aa6: ffefe0ef jal 2a4 <s_cat>
*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 <TIM2_IRQHandler+0x158>
1ab4: 07310513 addi a0,sp,115
1ab8: fecfe0ef jal 2a4 <s_cat>
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 <set_sel>
1ace: 0ff47313 zext.b t1,s0
1ad2: 00531e63 bne t1,t0,1aee <main+0xdc6>
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 <ssd1306_fillRect>
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 <ssd1306_drawstr>
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 <main+0xd9c>
draw_center_str(56, "L/R move OK use");
1b16: 6589 lui a1,0x2
1b18: d4c58593 addi a1,a1,-692 # 1d4c <TIM2_IRQHandler+0x160>
1b1c: f30ff06f j 124c <main+0x524>
screen = SCR_MAIN;
1b20: c2e18f23 sb a4,-962(gp) # 2000003a <screen>
beep(880, 30);
1b24: 45f9 li a1,30
1b26: b5c9 j 19e8 <main+0xcc0>
*s_cat(s_cat(rows[2], "Sound: "), sound_on ? "On" : "Off") = 0;
1b28: 6589 lui a1,0x2
1b2a: c1458593 addi a1,a1,-1004 # 1c14 <TIM2_IRQHandler+0x28>
1b2e: bfa5 j 1aa6 <main+0xd7e>
if (ok_edge) { // back to the welcome screen to re-pick
1b30: 4782 lw a5,0(sp)
1b32: cf99 beqz a5,1b50 <main+0xe28>
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 <screen>
beep(659, 80); beep(988, 120);
1b40: fd6fe0ef jal 316 <beep>
1b44: 07800593 li a1,120
1b48: 3dc00513 li a0,988
1b4c: fcafe0ef jal 316 <beep>
ssd1306_setbuf(0);
1b50: 910ff0ef jal c60 <ssd1306_setbuf.constprop.0>
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 <spr_grave>
1b60: 4589 li a1,2
1b62: 03000513 li a0,48
1b66: e53fe0ef jal 9b8 <ssd1306_drawImage.constprop.0>
draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)");
1b6a: c5018713 addi a4,gp,-944 # 2000004c <pet>
1b6e: 00d74683 lbu a3,13(a4)
1b72: 4709 li a4,2
1b74: c5018413 addi s0,gp,-944 # 2000004c <pet>
1b78: 02e69f63 bne a3,a4,1bb6 <main+0xe8e>
1b7c: 6589 lui a1,0x2
1b7e: c1858593 addi a1,a1,-1000 # 1c18 <TIM2_IRQHandler+0x2c>
1b82: 02400513 li a0,36
1b86: bc1fe0ef jal 746 <draw_center_str>
p = s_cat(p, "core dumped L");
1b8a: 6589 lui a1,0x2
1b8c: d6058593 addi a1,a1,-672 # 1d60 <TIM2_IRQHandler+0x174>
1b90: 0088 addi a0,sp,64
1b92: f12fe0ef jal 2a4 <s_cat>
p = u_cat(p, pet.level);
1b96: 00b44583 lbu a1,11(s0)
1b9a: f1cfe0ef jal 2b6 <u_cat>
*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>
draw_center_str(56, "OK: respawn");
1bac: 6589 lui a1,0x2
1bae: d7058593 addi a1,a1,-656 # 1d70 <TIM2_IRQHandler+0x184>
1bb2: e9aff06f j 124c <main+0x524>
draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)");
1bb6: 6589 lui a1,0x2
1bb8: c2858593 addi a1,a1,-984 # 1c28 <TIM2_IRQHandler+0x3c>
1bbc: b7d9 j 1b82 <main+0xe5a>
tick_acc = 0;
1bbe: c2019723 sh zero,-978(gp) # 2000002a <tick_acc>
game_tick();
1bc2: 94bfe0ef jal 50c <game_tick>
1bc6: b355 j 196a <main+0xc42>
00001bc8 <EXTI7_0_IRQHandler>:
{
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 <exti_wake>
}
1be2: 4712 lw a4,4(sp)
1be4: 4782 lw a5,0(sp)
1be6: 0121 addi sp,sp,8
1be8: 30200073 mret
00001bec <TIM2_IRQHandler>:
{
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 <tick_wake>
}
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 <main+0xb16>
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 <TIM2_IRQHandler+0x122>
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 <tama.c.fb7bdcf7+0x454c3>
1c92: 2d2d jal 22cc <pana_happy+0x30>
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 <tmux_sleep+0x20>
1caa: 67204b4f .insn 4, 0x67204b4f
1cae: 0021006f j 11cb0 <tama.c.fb7bdcf7+0xdadf>
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 <TIM2_IRQHandler+0x152>
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 <TIM2_IRQHandler+0x170>
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 <pana_idle+0x22>
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 <tama.c.fb7bdcf7+0x952a3>
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 <tama.c.fb7bdcf7+0x3bdb>
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 <TIM2_IRQHandler+0x1f0>
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 <tama.c.fb7bdcf7+0x3c19>
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 <tama.c.fb7bdcf7+0x4c29>
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 <TIM2_IRQHandler+0x230>
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 <main+0x940>
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 <tmux_sleep>:
...
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 <tmux_sad>:
...
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<?.||
1f58: bf3f fc7e ff3f fc7f ff3f fc7f ff3f fc7f ?.~.?...?...?...
1f68: bf3f fc7e 073c 1c70 ff3f fc7f ff3f fc7f ?.~.<.p.?...?...
1f78: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'...
1f88: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ...............
1f98: 0000 0000 ....
00001f9c <tmux_happy>:
...
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 <tmux_idle>:
...
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<?.||?.~.
2058: ff3f fc7f ff3f fc7f ff3f fc7f 073c 1c70 ?...?...?...<.p.
2068: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?...
2078: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'...
2088: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ...............
2098: 0000 0000 ....
0000209c <pana_dead>:
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 <pana_sleep>:
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 <pana_eat>:
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 <pana_sad>:
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 <pana_happy>:
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 <pana_blink>:
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 <pana_idle>:
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 <shell_sleep>:
...
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 <shell_sad>:
...
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 <shell_happy>:
...
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 <shell_idle>:
...
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 <icon_settings>:
261c: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............?
262c: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|..........
0000263c <icon_stats>:
263c: 0000 0000 0000 c000 c000 c000 c006 c006 ................
264c: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6.....
0000265c <icon_heal>:
265c: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0.
266c: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........
0000267c <icon_clean>:
267c: 0000 0000 8000 8000 c001 c001 f007 f80d ................
268c: f80d f808 fc1d f80d f80f f80f f007 8000 ................
0000269c <icon_sleep>:
269c: 0000 0000 0000 0004 000c 001c 0018 001c ................
26ac: 003c 001c 001e 001f e80f f007 8000 0000 <...............
000026bc <icon_play>:
26bc: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~
26cc: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p..
000026dc <icon_feed>:
26dc: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1.
26ec: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?.......
000026fc <ssd1306_init_array>:
26fc: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. .....
270c: 8f81 f1d9 40db a6a4 ffaf 0000 .....@......
00002718 <boot.0>:
2718: 1d7c 0000 1d8c 0000 1da0 0000 1db0 0000 |...............
2728: 1dc0 0000 ....
0000272c <species_names>:
272c: 1dd0 0000 1dd8 0000 1de0 0000 ............
00002738 <spr_glitch>:
...
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 <spr_claude>:
...
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 <species_frames>:
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 <menu_icons>:
288c: 26dc 0000 26bc 0000 269c 0000 267c 0000 .&...&...&..|&..
289c: 265c 0000 263c 0000 261c 0000 \&..<&...&..
000028a8 <form_names>:
28a8: 1de8 0000 1df0 0000 1df8 0000 1e00 0000 ................
28b8: 1e08 0000 ....
000028bc <menu_labels>:
28bc: 1e10 0000 1e18 0000 1e20 0000 1cf8 0000 ........ .......
28cc: 1e28 0000 1e30 0000 1e38 0000 (...0...8...
000028d8 <brightness_names>:
28d8: 1e44 0000 1e48 0000 1e4c 0000 1e54 0000 D...H...L...T...
000028e8 <screen_timeout_names>:
28e8: 1e58 0000 1e5c 0000 1e60 0000 1e64 0000 X...\...`...d...
28f8: 1e68 0000 1c14 0000 h.......
00002900 <spr_grave>:
...
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 <screen_timeout_opts>:
2980: 0053 00a7 00fa 01f4 03e8 0000 S...........
0000298c <fontdata>:
...
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 .<fBBf<.........
29e4: 070f 7d0f cccc 78cc 663c 6666 183c 187e ...}...x<fff<.~.
29f4: 333f 303f 7030 e0f0 637f 637f 6763 c0e6 ?3?00p...c.ccg..
2a04: db18 e73c 3ce7 18db e080 fef8 e0f8 0080 ..<..<..........
2a14: 0e02 fe3e 0e3e 0002 3c18 187e 7e18 183c ..>.>....<~..~<.
2a24: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{....
2a34: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a<ff<.|....~~~.
2a44: 3c18 187e 3c7e ff18 3c18 187e 1818 0018 .<~.~<...<~.....
2a54: 1818 1818 3c7e 0018 1800 fe0c 180c 0000 ....~<..........
2a64: 3000 fe60 3060 0000 0000 c0c0 fec0 0000 .0`.`0..........
2a74: 2400 ff66 2466 0000 1800 7e3c ffff 0000 .$f.f$....<~....
2a84: ff00 7eff 183c 0000 0000 0000 0000 0000 ...~<...........
2a94: 3c18 183c 0018 0018 6666 0024 0000 0000 .<<.....ff$.....
2aa4: 6c6c 6cfe 6cfe 006c 3e18 3c60 7c06 0018 ll.l.ll..>`<.|..
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<.<f..
2ae4: 1800 7e18 1818 0000 0000 0000 1800 3018 ...~...........0
2af4: 0000 7e00 0000 0000 0000 0000 1800 0018 ...~............
2b04: 0c06 3018 c060 0080 6c38 d6c6 6cc6 0038 ...0`...8l...l8.
2b14: 3818 1818 1818 007e c67c 1c06 6630 00fe .8....~.|...0f..
2b24: c67c 3c06 c606 007c 3c1c cc6c 0cfe 001e |..<..|..<l.....
2b34: c0fe fcc0 c606 007c 6038 fcc0 c6c6 007c ......|.8`....|.
2b44: c6fe 180c 3030 0030 c67c 7cc6 c6c6 007c ....000.|..|..|.
2b54: c67c 7ec6 0c06 0078 1800 0018 1800 0018 |..~..x.........
2b64: 1800 0018 1800 3018 0c06 3018 0c18 0006 .......0...0....
2b74: 0000 007e 7e00 0000 3060 0c18 3018 0060 ..~..~..`0...0`.
2b84: c67c 180c 0018 0018 c67c dede c0de 0078 |.......|.....x.
2b94: 6c38 fec6 c6c6 00c6 66fc 7c66 6666 00fc 8l.......ff|ff..
2ba4: 663c c0c0 66c0 003c 6cf8 6666 6c66 00f8 <f...f<..lfffl..
2bb4: 62fe 7868 6268 00fe 62fe 7868 6068 00f0 .bhxhb...bhxh`..
2bc4: 663c c0c0 66ce 003a c6c6 fec6 c6c6 00c6 <f...f:.........
2bd4: 183c 1818 1818 003c 0c1e 0c0c cccc 0078 <.....<.......x.
2be4: 66e6 786c 666c 00e6 60f0 6060 6662 00fe .flxlf...```bf..
2bf4: eec6 fefe c6d6 00c6 e6c6 def6 c6ce 00c6 ................
2c04: c67c c6c6 c6c6 007c 66fc 7c66 6060 00f0 |.....|..ff|``..
2c14: c67c c6c6 cec6 0e7c 66fc 7c66 666c 00e6 |.....|..ff|lf..
2c24: 663c 1830 660c 003c 7e7e 185a 1818 003c <f0..f<.~~Z...<.
2c34: c6c6 c6c6 c6c6 007c c6c6 c6c6 6cc6 0038 ......|......l8.
2c44: c6c6 d6c6 fed6 006c c6c6 386c c66c 00c6 ......l...l8l...
2c54: 6666 3c66 1818 003c c6fe 188c 6632 00fe fff<..<.....2f..
2c64: 303c 3030 3030 003c 60c0 1830 060c 0002 <00000<..`0.....
2c74: 0c3c 0c0c 0c0c 003c 3810 c66c 0000 0000 <.....<..8l.....
2c84: 0000 0000 0000 ff00 1830 000c 0000 0000 ........0.......
2c94: 0000 0c78 cc7c 0076 60e0 667c 6666 00dc ..x.|.v..`|fff..
2ca4: 0000 c67c c6c0 007c 0c1c cc7c cccc 0076 ..|...|...|...v.
2cb4: 0000 c67c c0fe 007c 663c f860 6060 00f0 ..|...|.<f`.``..
2cc4: 0000 cc76 7ccc f80c 60e0 766c 6666 00e6 ..v..|...`lvff..
2cd4: 0018 1838 1818 003c 0006 0606 6606 3c66 ..8...<......ff<
2ce4: 60e0 6c66 6c78 00e6 1838 1818 1818 003c .`flxl..8.....<.
2cf4: 0000 feec d6d6 00d6 0000 66dc 6666 0066 ...........ffff.
2d04: 0000 c67c c6c6 007c 0000 66dc 7c66 f060 ..|...|....ff|`.
2d14: 0000 cc76 7ccc 1e0c 0000 76dc 6060 00f0 ..v..|.....v``..
2d24: 0000 c07e 067c 00fc 3030 30fc 3630 001c ..~.|...00.006..
2d34: 0000 cccc cccc 0076 0000 c6c6 6cc6 0038 ......v......l8.
2d44: 0000 d6c6 fed6 006c 0000 6cc6 6c38 00c6 ......l....l8l..
2d54: 0000 c6c6 7ec6 fc06 0000 4c7e 3218 007e .....~....~L.2~.
2d64: 180e 7018 1818 000e 1818 1818 1818 0018 ...p............
2d74: 1870 0e18 1818 0070 dc76 0000 0000 0000 p.....p.v.......
2d84: 1000 6c38 c6c6 00fe c67c c0c0 7cc6 780c ..8l....|....|.x
2d94: 00cc cccc cccc 0076 180c c67c c0fe 007c ......v...|...|.
2da4: 827c 0c78 cc7c 0076 00c6 0c78 cc7c 0076 |.x.|.v...x.|.v.
2db4: 1830 0c78 cc7c 0076 3030 0c78 cc7c 0076 0.x.|.v.00x.|.v.
2dc4: 0000 c07e 7ec0 380c 827c c67c c0fe 007c ..~..~.8|.|...|.
2dd4: 00c6 c67c c0fe 007c 1830 c67c c0fe 007c ..|...|.0.|...|.
2de4: 0066 1838 1818 003c 827c 1838 1818 003c f.8...<.|.8...<.
2df4: 1830 3800 1818 003c 38c6 c66c c6fe 00c6 0..8..<..8l.....
2e04: 6c38 c67c c6fe 00c6 3018 c0fe c0f8 00fe 8l|......0......
2e14: 0000 187e d87e 007e 6c3e fecc cccc 00ce ..~.~.~.>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.......<ll>.~..
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<.~
30d4: 6c38 fec6 6cc6 0038 6c38 c6c6 6c6c 00ee 8l...l8.8l..ll..
30e4: 180e 3e0c 6666 003c 0000 db7e 7edb 0000 ...>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|.....<<<<..
...