PanBadge/tama.lst

3864 lines
167 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: 16d0006f j 96c <handle_reset>
4: 00000000 .word 0x00000000
8: 000009e0 .word 0x000009e0
c: 000009de .word 0x000009de
...
30: 000009de .word 0x000009de
34: 00000000 .word 0x00000000
38: 000009de .word 0x000009de
3c: 00000000 .word 0x00000000
40: 000009de .word 0x000009de
44: 000009de .word 0x000009de
48: 000009de .word 0x000009de
4c: 000009de .word 0x000009de
50: 000009de .word 0x000009de
54: 000009de .word 0x000009de
58: 000009de .word 0x000009de
5c: 000009de .word 0x000009de
60: 000009de .word 0x000009de
64: 000009de .word 0x000009de
68: 000009de .word 0x000009de
6c: 000009de .word 0x000009de
70: 000009de .word 0x000009de
74: 000009de .word 0x000009de
78: 000009de .word 0x000009de
7c: 000009de .word 0x000009de
80: 000009de .word 0x000009de
84: 000009de .word 0x000009de
88: 000009de .word 0x000009de
8c: 000009de .word 0x000009de
90: 000009de .word 0x000009de
94: 000009de .word 0x000009de
98: 000009de .word 0x000009de
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.96f78ea9+0xc05c>
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: c6818513 addi a0,gp,-920 # 20000064 <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: 6609 lui a2,0x2
23a: 97ba add a5,a5,a4
23c: 67060613 addi a2,a2,1648 # 2670 <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: c061c783 lbu a5,-1018(gp) # 20000002 <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.96f78ea9+0x761bc>
{
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.96f78ea9+0x27fbc>
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: c5418713 addi a4,gp,-940 # 20000050 <pet>
3b4: 01074703 lbu a4,16(a4)
3b8: c371 beqz a4,47c <add_xp+0xcc>
3ba: c5418793 addi a5,gp,-940 # 20000050 <pet>
if (pet.xp < 60000) pet.xp += n;
3be: 0087d683 lhu a3,8(a5) # 20008 <tama.c.96f78ea9+0x1c0a4>
3c2: 673d lui a4,0xf
3c4: a5f70713 addi a4,a4,-1441 # ea5f <tama.c.96f78ea9+0xaafb>
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: c4e18823 sb a4,-944(gp) # 2000004c <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: c4c18413 addi s0,gp,-948 # 20000048 <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: c4818713 addi a4,gp,-952 # 20000044 <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: c4818493 addi s1,gp,-952 # 20000044 <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 <draw_center_str>:
}
}
// ----------------------------------------------------------------- drawing
static void draw_center_str(int y, const char *s)
{
50c: 862e mv a2,a1
int len = 0;
50e: 4701 li a4,0
while (s[len]) len++;
510: 00e607b3 add a5,a2,a4
514: 0007c783 lbu a5,0(a5)
518: ef81 bnez a5,530 <draw_center_str+0x24>
int x = (SSD1306_W - len * 8) / 2;
51a: 47c1 li a5,16
51c: 8f99 sub a5,a5,a4
51e: 078a slli a5,a5,0x2
if (x < 0) x = 0;
520: fff7c713 not a4,a5
524: 877d srai a4,a4,0x1f
ssd1306_drawstr(x, y, s, 1);
526: 85aa mv a1,a0
528: 4685 li a3,1
52a: 00e7f533 and a0,a5,a4
52e: b1ed j 218 <ssd1306_drawstr>
while (s[len]) len++;
530: 0705 addi a4,a4,1
532: bff9 j 510 <draw_center_str+0x4>
00000534 <read_buttons>:
static Buttons read_buttons(void)
{
// active-low: pressed reads 0
Buttons b;
b.ok = !funDigitalRead(BTN_OK);
534: 400117b7 lui a5,0x40011
538: 4788 lw a0,8(a5)
b.left = !funDigitalRead(BTN_LEFT);
53a: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00>
53e: 4798 lw a4,8(a5)
b.right = !funDigitalRead(BTN_RIGHT);
540: 479c lw a5,8(a5)
b.ok = !funDigitalRead(BTN_OK);
542: fff54513 not a0,a0
b.left = !funDigitalRead(BTN_LEFT);
546: 8319 srli a4,a4,0x6
548: fff74713 not a4,a4
b.right = !funDigitalRead(BTN_RIGHT);
54c: 8395 srli a5,a5,0x5
54e: fff7c793 not a5,a5
return b;
552: 8b05 andi a4,a4,1
554: 8905 andi a0,a0,1
556: 0722 slli a4,a4,0x8
558: 8b85 andi a5,a5,1
{
55a: 1171 addi sp,sp,-4
return b;
55c: 07c2 slli a5,a5,0x10
55e: 8d59 or a0,a0,a4
}
560: 8d5d or a0,a0,a5
562: 0111 addi sp,sp,4
564: 8082 ret
00000566 <ssd1306_drawFastHLine.part.0>:
void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color)
566: 87b2 mv a5,a2
568: 1131 addi sp,sp,-20
if((x+w-1) >= SSD1306_W) w = SSD1306_W-x;
56a: fff78713 addi a4,a5,-1
void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color)
56e: 8636 mv a2,a3
570: c806 sw ra,16(sp)
572: c622 sw s0,12(sp)
574: c426 sw s1,8(sp)
if((x+w-1) >= SSD1306_W) w = SSD1306_W-x;
576: 972a add a4,a4,a0
578: 07f00693 li a3,127
57c: 00e6f563 bgeu a3,a4,586 <ssd1306_drawFastHLine.part.0+0x20>
580: 08000793 li a5,128
584: 8f89 sub a5,a5,a0
586: 00f50433 add s0,a0,a5
while (w--)
58a: 00851763 bne a0,s0,598 <ssd1306_drawFastHLine.part.0+0x32>
}
58e: 40c2 lw ra,16(sp)
590: 4432 lw s0,12(sp)
592: 44a2 lw s1,8(sp)
594: 0151 addi sp,sp,20
596: 8082 ret
ssd1306_drawPixel(x++, y, color);
598: 00150493 addi s1,a0,1
59c: c232 sw a2,4(sp)
59e: c02e sw a1,0(sp)
5a0: 36d5 jal 184 <ssd1306_drawPixel>
5a2: 4612 lw a2,4(sp)
5a4: 4582 lw a1,0(sp)
5a6: 8526 mv a0,s1
5a8: b7cd j 58a <ssd1306_drawFastHLine.part.0+0x24>
000005aa <ssd1306_drawLine.constprop.0>:
void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color)
5aa: fd810113 addi sp,sp,-40
steep = (gfx_abs(y1 - y0) > gfx_abs(x1 - x0));
5ae: 40b68333 sub t1,a3,a1
void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color)
5b2: d022 sw s0,32(sp)
5b4: 8436 mv s0,a3
return (x<0) ? -x : x;
5b6: 41f35693 srai a3,t1,0x1f
5ba: 0066c333 xor t1,a3,t1
steep = (gfx_abs(y1 - y0) > gfx_abs(x1 - x0));
5be: 40a602b3 sub t0,a2,a0
return (x<0) ? -x : x;
5c2: 40d30333 sub t1,t1,a3
5c6: 41f2d693 srai a3,t0,0x1f
5ca: 0056c2b3 xor t0,a3,t0
void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color)
5ce: ce26 sw s1,28(sp)
5d0: d206 sw ra,36(sp)
return (x<0) ? -x : x;
5d2: 40d282b3 sub t0,t0,a3
void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color)
5d6: 84ae mv s1,a1
5d8: 87b2 mv a5,a2
if(steep)
5da: 0062c763 blt t0,t1,5e8 <ssd1306_drawLine.constprop.0+0x3e>
5de: 86a2 mv a3,s0
5e0: 84aa mv s1,a0
5e2: 8432 mv s0,a2
5e4: 87b6 mv a5,a3
5e6: 852e mv a0,a1
if(x0 > x1)
5e8: 00944863 blt s0,s1,5f8 <ssd1306_drawLine.constprop.0+0x4e>
5ec: 86be mv a3,a5
5ee: 87aa mv a5,a0
5f0: 8536 mv a0,a3
5f2: 86a2 mv a3,s0
5f4: 8426 mv s0,s1
5f6: 84b6 mv s1,a3
deltay = gfx_abs(y1 - y0);
5f8: 40f503b3 sub t2,a0,a5
return (x<0) ? -x : x;
5fc: 41f3d693 srai a3,t2,0x1f
deltax = x1 - x0;
600: 40848733 sub a4,s1,s0
return (x<0) ? -x : x;
604: 0076c3b3 xor t2,a3,t2
608: 40d383b3 sub t2,t2,a3
error = deltax/2;
60c: 01f75693 srli a3,a4,0x1f
610: 96ba add a3,a3,a4
deltax = x1 - x0;
612: c23a sw a4,4(sp)
ystep = -1;
614: 577d li a4,-1
616: c03a sw a4,0(sp)
error = deltax/2;
618: 8685 srai a3,a3,0x1
if(y0 < y1)
61a: 00a7d463 bge a5,a0,622 <ssd1306_drawLine.constprop.0+0x78>
ystep = 1;
61e: 4705 li a4,1
620: c03a sw a4,0(sp)
for(x=x0;x<=x1;x++)
622: 0084d863 bge s1,s0,632 <ssd1306_drawLine.constprop.0+0x88>
}
626: 5092 lw ra,36(sp)
628: 5402 lw s0,32(sp)
62a: 44f2 lw s1,28(sp)
62c: 02810113 addi sp,sp,40
630: 8082 ret
632: cc36 sw a3,24(sp)
634: ca1e sw t2,20(sp)
636: c816 sw t0,16(sp)
638: c61a sw t1,12(sp)
ssd1306_drawPixel(y, x, color);
63a: 4601 li a2,0
if(steep)
63c: 0262d563 bge t0,t1,666 <ssd1306_drawLine.constprop.0+0xbc>
ssd1306_drawPixel(y, x, color);
640: 853e mv a0,a5
642: 85a2 mv a1,s0
644: c43e sw a5,8(sp)
646: 3e3d jal 184 <ssd1306_drawPixel>
648: 47a2 lw a5,8(sp)
64a: 4332 lw t1,12(sp)
64c: 42c2 lw t0,16(sp)
64e: 43d2 lw t2,20(sp)
650: 46e2 lw a3,24(sp)
error = error - deltay;
652: 407686b3 sub a3,a3,t2
if(error < 0)
656: 0006d663 bgez a3,662 <ssd1306_drawLine.constprop.0+0xb8>
y = y + ystep;
65a: 4702 lw a4,0(sp)
65c: 97ba add a5,a5,a4
error = error + deltax;
65e: 4712 lw a4,4(sp)
660: 96ba add a3,a3,a4
for(x=x0;x<=x1;x++)
662: 0405 addi s0,s0,1
664: bf7d j 622 <ssd1306_drawLine.constprop.0+0x78>
ssd1306_drawPixel(x, y, color);
666: 85be mv a1,a5
668: 8522 mv a0,s0
66a: c43e sw a5,8(sp)
66c: 3e21 jal 184 <ssd1306_drawPixel>
66e: 46e2 lw a3,24(sp)
670: 43d2 lw t2,20(sp)
672: 42c2 lw t0,16(sp)
674: 4332 lw t1,12(sp)
676: 47a2 lw a5,8(sp)
678: bfe9 j 652 <ssd1306_drawLine.constprop.0+0xa8>
0000067a <ssd1306_drawFastVLine.constprop.0>:
if((x >= SSD1306_W) || (y >= SSD1306_H)) return;
67a: 07f00793 li a5,127
67e: 02a7cf63 blt a5,a0,6bc <ssd1306_drawFastVLine.constprop.0+0x42>
void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color)
682: 1141 addi sp,sp,-16
684: c422 sw s0,8(sp)
686: c606 sw ra,12(sp)
688: c226 sw s1,4(sp)
if((y+h-1) >= SSD1306_H) h = SSD1306_H-y;
68a: 00c587b3 add a5,a1,a2
68e: 04000713 li a4,64
692: 842e mv s0,a1
694: 00f75463 bge a4,a5,69c <ssd1306_drawFastVLine.constprop.0+0x22>
698: 40b70633 sub a2,a4,a1
69c: 008604b3 add s1,a2,s0
while(h--)
6a0: 00941763 bne s0,s1,6ae <ssd1306_drawFastVLine.constprop.0+0x34>
}
6a4: 40b2 lw ra,12(sp)
6a6: 4422 lw s0,8(sp)
6a8: 4492 lw s1,4(sp)
6aa: 0141 addi sp,sp,16
6ac: 8082 ret
ssd1306_drawPixel(x, y++, color);
6ae: 85a2 mv a1,s0
6b0: 4605 li a2,1
6b2: c02a sw a0,0(sp)
6b4: 3cc1 jal 184 <ssd1306_drawPixel>
6b6: 4502 lw a0,0(sp)
6b8: 0405 addi s0,s0,1
6ba: b7dd j 6a0 <ssd1306_drawFastVLine.constprop.0+0x26>
6bc: 8082 ret
000006be <ssd1306_drawRect.constprop.0>:
void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color)
6be: 1131 addi sp,sp,-20
6c0: c426 sw s1,8(sp)
6c2: 84b2 mv s1,a2
ssd1306_drawFastVLine(x, y, h, color);
6c4: 8636 mv a2,a3
void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color)
6c6: c806 sw ra,16(sp)
6c8: c236 sw a3,4(sp)
6ca: c622 sw s0,12(sp)
6cc: c02e sw a1,0(sp)
6ce: 842a mv s0,a0
ssd1306_drawFastVLine(x, y, h, color);
6d0: 376d jal 67a <ssd1306_drawFastVLine.constprop.0>
ssd1306_drawFastVLine(x+w-1, y, h, color);
6d2: 4612 lw a2,4(sp)
6d4: 4582 lw a1,0(sp)
6d6: fff48513 addi a0,s1,-1
6da: 9522 add a0,a0,s0
6dc: 3f79 jal 67a <ssd1306_drawFastVLine.constprop.0>
6de: 4582 lw a1,0(sp)
6e0: 4685 li a3,1
6e2: 8626 mv a2,s1
6e4: 8522 mv a0,s0
6e6: 3541 jal 566 <ssd1306_drawFastHLine.part.0>
ssd1306_drawFastHLine(x, y+h-1, w, color);
6e8: 4782 lw a5,0(sp)
6ea: fff78593 addi a1,a5,-1
6ee: 4792 lw a5,4(sp)
6f0: 95be add a1,a1,a5
if((x >= SSD1306_W) || (y >= SSD1306_H)) return;
6f2: 03f00793 li a5,63
6f6: 00b7ea63 bltu a5,a1,70a <ssd1306_drawRect.constprop.0+0x4c>
6fa: 8522 mv a0,s0
}
6fc: 4432 lw s0,12(sp)
6fe: 40c2 lw ra,16(sp)
700: 8626 mv a2,s1
702: 44a2 lw s1,8(sp)
704: 4685 li a3,1
706: 0151 addi sp,sp,20
708: bdb9 j 566 <ssd1306_drawFastHLine.part.0>
70a: 40c2 lw ra,16(sp)
70c: 4432 lw s0,12(sp)
70e: 44a2 lw s1,8(sp)
710: 0151 addi sp,sp,20
712: 8082 ret
00000714 <draw_bar>:
{
714: 1151 addi sp,sp,-12
716: c222 sw s0,4(sp)
718: c026 sw s1,0(sp)
71a: 842a mv s0,a0
71c: 84b2 mv s1,a2
ssd1306_drawstr(0, y, label, 1);
71e: 4685 li a3,1
720: 862e mv a2,a1
722: 85aa mv a1,a0
724: 4501 li a0,0
{
726: c406 sw ra,8(sp)
ssd1306_drawstr(0, y, label, 1);
728: 3cc5 jal 218 <ssd1306_drawstr>
ssd1306_drawRect(bx, y, bw, 7, 1);
72a: 03000513 li a0,48
72e: 469d li a3,7
730: 04c00613 li a2,76
734: 85a2 mv a1,s0
736: 3761 jal 6be <ssd1306_drawRect.constprop.0>
int fill = (val * (bw - 2)) / 100;
738: 00349513 slli a0,s1,0x3
73c: 9526 add a0,a0,s1
73e: 050a slli a0,a0,0x2
740: 9526 add a0,a0,s1
742: 0506 slli a0,a0,0x1
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
744: 06300793 li a5,99
748: 02a7d263 bge a5,a0,76c <draw_bar+0x58>
int fill = (val * (bw - 2)) / 100;
74c: 06400593 li a1,100
750: 3a81 jal a0 <__divsi3>
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
752: 4705 li a4,1
754: 00e405b3 add a1,s0,a4
}
758: 4412 lw s0,4(sp)
75a: 40a2 lw ra,8(sp)
75c: 4482 lw s1,0(sp)
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
75e: 0ff57613 zext.b a2,a0
762: 4695 li a3,5
764: 03100513 li a0,49
}
768: 0131 addi sp,sp,12
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
76a: bc99 j 1c0 <ssd1306_fillRect>
}
76c: 40a2 lw ra,8(sp)
76e: 4412 lw s0,4(sp)
770: 4482 lw s1,0(sp)
772: 0131 addi sp,sp,12
774: 8082 ret
00000776 <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) {
776: fd810113 addi sp,sp,-40
77a: 00e587b3 add a5,a1,a4
77e: d222 sw s0,36(sp)
780: d026 sw s1,32(sp)
782: c82a sw a0,16(sp)
784: ca32 sw a2,20(sp)
uint32_t bytes_to_draw = width / 8;
786: 0036d413 srli s0,a3,0x3
78a: c63e sw a5,12(sp)
78c: 4381 li t2,0
if (y_absolute >= SSD1306_H) {
78e: 03f00793 li a5,63
792: 08b7ed63 bltu a5,a1,82c <ssd1306_drawImage.constprop.0+0xb6>
uint32_t v_mask = 1 << (y_absolute & 7);
796: 0075f793 andi a5,a1,7
79a: 4705 li a4,1
79c: 00f717b3 sll a5,a4,a5
7a0: c03e sw a5,0(sp)
uint32_t input_byte = input[byte + line * bytes_to_draw];
7a2: 47d2 lw a5,20(sp)
for (uint32_t byte = 0; byte < bytes_to_draw; byte++) {
7a4: 4681 li a3,0
uint32_t input_byte = input[byte + line * bytes_to_draw];
7a6: 979e add a5,a5,t2
7a8: cc3e sw a5,24(sp)
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
7aa: 0035d793 srli a5,a1,0x3
7ae: 079e slli a5,a5,0x7
7b0: ce3e sw a5,28(sp)
uint32_t input_byte = input[byte + line * bytes_to_draw];
7b2: 47e2 lw a5,24(sp)
x_absolute = x + 8 * byte + pixel;
7b4: 00369293 slli t0,a3,0x3
for (pixel = 0; pixel < 8; pixel++) {
7b8: 4701 li a4,0
uint32_t input_byte = input[byte + line * bytes_to_draw];
7ba: 97b6 add a5,a5,a3
7bc: 0007c783 lbu a5,0(a5)
7c0: c23e sw a5,4(sp)
x_absolute = x + 8 * byte + pixel;
7c2: 47c2 lw a5,16(sp)
7c4: 92be add t0,t0,a5
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
7c6: 47f2 lw a5,28(sp)
7c8: 005784b3 add s1,a5,t0
if (x_absolute >= SSD1306_W) {
7cc: 00e287b3 add a5,t0,a4
7d0: 07f00613 li a2,127
7d4: 04f66463 bltu a2,a5,81c <ssd1306_drawImage.constprop.0+0xa6>
uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default)
7d8: 4512 lw a0,4(sp)
7da: 08000793 li a5,128
7de: 40e7d7b3 sra a5,a5,a4
7e2: 8fe9 and a5,a5,a0
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
7e4: 00e48633 add a2,s1,a4
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
7e8: c6818513 addi a0,gp,-920 # 20000064 <ssd1306_buffer>
7ec: 9532 add a0,a0,a2
7ee: 00014303 lbu t1,0(sp)
uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default)
7f2: c43e sw a5,8(sp)
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
7f4: 00054783 lbu a5,0(a0)
7f8: fff34613 not a2,t1
for (pixel = 0; pixel < 8; pixel++) {
7fc: 0705 addi a4,a4,1
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
7fe: 8e7d and a2,a2,a5
800: 47a2 lw a5,8(sp)
802: 00f037b3 snez a5,a5
806: 40f007b3 neg a5,a5
80a: 00f37333 and t1,t1,a5
80e: 00666633 or a2,a2,t1
812: 00c50023 sb a2,0(a0)
for (pixel = 0; pixel < 8; pixel++) {
816: 47a1 li a5,8
818: faf71ae3 bne a4,a5,7cc <ssd1306_drawImage.constprop.0+0x56>
for (uint32_t byte = 0; byte < bytes_to_draw; byte++) {
81c: 0685 addi a3,a3,1 # 40001 <tama.c.96f78ea9+0x3c09d>
81e: f8d41ae3 bne s0,a3,7b2 <ssd1306_drawImage.constprop.0+0x3c>
for (uint32_t line = 0; line < height; line++) {
822: 47b2 lw a5,12(sp)
824: 0585 addi a1,a1,1
826: 93a2 add t2,t2,s0
828: f6b793e3 bne a5,a1,78e <ssd1306_drawImage.constprop.0+0x18>
}
82c: 5412 lw s0,36(sp)
82e: 5482 lw s1,32(sp)
830: 02810113 addi sp,sp,40
834: 8082 ret
00000836 <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;
836: 6761 lui a4,0x18
while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--));
838: 400057b7 lui a5,0x40005
timeout = TIMEOUT_MAX;
83c: 6a070713 addi a4,a4,1696 # 186a0 <tama.c.96f78ea9+0x1473c>
while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--));
840: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00>
844: 567d li a2,-1
846: 0187d683 lhu a3,24(a5)
84a: 8a89 andi a3,a3,2
84c: c2f9 beqz a3,912 <ssd1306_i2c_send.constprop.0+0xdc>
84e: 177d addi a4,a4,-1
850: fec71be3 bne a4,a2,846 <ssd1306_i2c_send.constprop.0+0x10>
uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz)
854: 1171 addi sp,sp,-4
856: c006 sw ra,0(sp)
ssd1306_i2c_setup();
858: 8d9ff0ef jal 130 <ssd1306_i2c_setup>
// set STOP condition
I2C1->CTLR1 |= I2C_CTLR1_STOP;
// we're happy
return 0;
}
85c: 4082 lw ra,0(sp)
return ssd1306_i2c_error(0);
85e: 4505 li a0,1
}
860: 0111 addi sp,sp,4
862: 8082 ret
864: 67e1 lui a5,0x18
866: 6a178793 addi a5,a5,1697 # 186a1 <tama.c.96f78ea9+0x1473d>
while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--));
86a: 01475683 lhu a3,20(a4)
86e: 0806f693 andi a3,a3,128
872: e681 bnez a3,87a <ssd1306_i2c_send.constprop.0+0x44>
874: 17fd addi a5,a5,-1
876: fbf5 bnez a5,86a <ssd1306_i2c_send.constprop.0+0x34>
878: bff1 j 854 <ssd1306_i2c_send.constprop.0+0x1e>
I2C1->DATAR = *data++;
87a: 00054783 lbu a5,0(a0)
87e: 0505 addi a0,a0,1
880: 00f71823 sh a5,16(a4)
while(sz--)
884: feb510e3 bne a0,a1,864 <ssd1306_i2c_send.constprop.0+0x2e>
timeout = TIMEOUT_MAX;
888: 66e1 lui a3,0x18
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
88a: 40005737 lui a4,0x40005
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
88e: 00070637 lui a2,0x70
timeout = TIMEOUT_MAX;
892: 6a068693 addi a3,a3,1696 # 186a0 <tama.c.96f78ea9+0x1473c>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
896: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
89a: 08460613 addi a2,a2,132 # 70084 <tama.c.96f78ea9+0x6c120>
89e: 55fd li a1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
8a0: 01475503 lhu a0,20(a4)
8a4: 01875783 lhu a5,24(a4)
8a8: 07c2 slli a5,a5,0x10
8aa: 8fc9 or a5,a5,a0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
8ac: 8ff1 and a5,a5,a2
8ae: 00c78663 beq a5,a2,8ba <ssd1306_i2c_send.constprop.0+0x84>
8b2: 16fd addi a3,a3,-1
8b4: feb696e3 bne a3,a1,8a0 <ssd1306_i2c_send.constprop.0+0x6a>
8b8: bf71 j 854 <ssd1306_i2c_send.constprop.0+0x1e>
I2C1->CTLR1 |= I2C_CTLR1_STOP;
8ba: 00075783 lhu a5,0(a4)
return 0;
8be: 4501 li a0,0
I2C1->CTLR1 |= I2C_CTLR1_STOP;
8c0: 2007e793 ori a5,a5,512
8c4: 00f71023 sh a5,0(a4)
}
8c8: 8082 ret
while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--));
8ca: 40005737 lui a4,0x40005
8ce: 95aa add a1,a1,a0
8d0: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
8d4: bf45 j 884 <ssd1306_i2c_send.constprop.0+0x4e>
I2C1->DATAR = addr<<1;
8d6: 07800793 li a5,120
8da: 00f71823 sh a5,16(a4)
timeout = TIMEOUT_MAX;
8de: 6661 lui a2,0x18
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
8e0: 400056b7 lui a3,0x40005
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
8e4: 00070737 lui a4,0x70
timeout = TIMEOUT_MAX;
8e8: 6a060613 addi a2,a2,1696 # 186a0 <tama.c.96f78ea9+0x1473c>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
8ec: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
8f0: 08270713 addi a4,a4,130 # 70082 <tama.c.96f78ea9+0x6c11e>
8f4: 537d li t1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
8f6: 0146d283 lhu t0,20(a3)
8fa: 0186d783 lhu a5,24(a3)
8fe: 07c2 slli a5,a5,0x10
900: 0057e7b3 or a5,a5,t0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
904: 8ff9 and a5,a5,a4
906: fce782e3 beq a5,a4,8ca <ssd1306_i2c_send.constprop.0+0x94>
90a: 167d addi a2,a2,-1
90c: fe6615e3 bne a2,t1,8f6 <ssd1306_i2c_send.constprop.0+0xc0>
910: b791 j 854 <ssd1306_i2c_send.constprop.0+0x1e>
I2C1->CTLR1 |= I2C_CTLR1_START;
912: 0007d703 lhu a4,0(a5)
timeout = TIMEOUT_MAX;
916: 66e1 lui a3,0x18
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
918: 00030637 lui a2,0x30
I2C1->CTLR1 |= I2C_CTLR1_START;
91c: 10076713 ori a4,a4,256
920: 00e79023 sh a4,0(a5)
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
924: 40005737 lui a4,0x40005
timeout = TIMEOUT_MAX;
928: 6a068693 addi a3,a3,1696 # 186a0 <tama.c.96f78ea9+0x1473c>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
92c: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
930: 0605 addi a2,a2,1 # 30001 <tama.c.96f78ea9+0x2c09d>
932: 537d li t1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
934: 01475283 lhu t0,20(a4)
938: 01875783 lhu a5,24(a4)
93c: 07c2 slli a5,a5,0x10
93e: 0057e7b3 or a5,a5,t0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
942: 8ff1 and a5,a5,a2
944: f8c789e3 beq a5,a2,8d6 <ssd1306_i2c_send.constprop.0+0xa0>
948: 16fd addi a3,a3,-1
94a: fe6695e3 bne a3,t1,934 <ssd1306_i2c_send.constprop.0+0xfe>
94e: b719 j 854 <ssd1306_i2c_send.constprop.0+0x1e>
00000950 <ssd1306_cmd>:
{
950: fd810113 addi sp,sp,-40
/* build command or data packets */
if(cmd)
{
pkt[0] = 0;
pkt[1] = *data;
954: 00a100a3 sb a0,1(sp)
else
{
pkt[0] = 0x40;
memcpy(&pkt[1], data, sz);
}
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
958: 4589 li a1,2
95a: 850a mv a0,sp
95c: d206 sw ra,36(sp)
pkt[0] = 0;
95e: 00010023 sb zero,0(sp)
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
962: 3dd1 jal 836 <ssd1306_i2c_send.constprop.0>
}
964: 5092 lw ra,36(sp)
966: 02810113 addi sp,sp,40
96a: 8082 ret
0000096c <handle_reset>:
asm volatile( "\n\
96c: 20000197 auipc gp,0x20000
970: a9018193 addi gp,gp,-1392 # 200003fc <__global_pointer$>
974: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack>
978: 6509 lui a0,0x2
97a: 88050513 addi a0,a0,-1920 # 1880 <main+0xdb8>
97e: 30051073 csrw mstatus,a0
982: fffff697 auipc a3,0xfffff
986: 67e68693 addi a3,a3,1662 # 0 <InterruptVector>
98a: 0036e693 ori a3,a3,3
98e: 30569073 csrw mtvec,a3
asm volatile(
992: c3018513 addi a0,gp,-976 # 2000002c <anim_exp>
996: 06818593 addi a1,gp,104 # 20000464 <_ebss>
99a: 4601 li a2,0
99c: 00b55663 bge a0,a1,9a8 <handle_reset+0x3c>
9a0: c110 sw a2,0(a0)
9a2: 0511 addi a0,a0,4
9a4: feb54ee3 blt a0,a1,9a0 <handle_reset+0x34>
9a8: 00002517 auipc a0,0x2
9ac: 4c850513 addi a0,a0,1224 # 2e70 <_data_lma>
9b0: c0418593 addi a1,gp,-1020 # 20000000 <timeout_idx>
9b4: c3018613 addi a2,gp,-976 # 2000002c <anim_exp>
9b8: 00c58863 beq a1,a2,9c8 <handle_reset+0x5c>
9bc: 4114 lw a3,0(a0)
9be: c194 sw a3,0(a1)
9c0: 0511 addi a0,a0,4
9c2: 0591 addi a1,a1,4
9c4: fec59ae3 bne a1,a2,9b8 <handle_reset+0x4c>
SysTick->CTLR = 1;
9c8: e000f7b7 lui a5,0xe000f
9cc: 4705 li a4,1
9ce: c398 sw a4,0(a5)
asm volatile(
9d0: 6785 lui a5,0x1
9d2: ac878793 addi a5,a5,-1336 # ac8 <main>
9d6: 34179073 csrw mepc,a5
9da: 30200073 mret
000009de <ADC1_2_IRQHandler>:
asm volatile( "1: j 1b" );
9de: a001 j 9de <ADC1_2_IRQHandler>
000009e0 <NMI_Handler>:
RCC->INTR |= RCC_CSSC; // clear the clock security int flag
9e0: 40021737 lui a4,0x40021
9e4: 471c lw a5,8(a4)
9e6: 008006b7 lui a3,0x800
9ea: 8fd5 or a5,a5,a3
9ec: c71c sw a5,8(a4)
000009ee <memset>:
WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; }
9ee: 962a add a2,a2,a0
9f0: 87aa mv a5,a0
9f2: 00c79363 bne a5,a2,9f8 <memset+0xa>
9f6: 8082 ret
9f8: 00b78023 sb a1,0(a5)
9fc: 0785 addi a5,a5,1
9fe: bfd5 j 9f2 <memset+0x4>
00000a00 <ssd1306_setbuf.constprop.0>:
memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer));
a00: 40000613 li a2,1024
a04: 4581 li a1,0
a06: c6818513 addi a0,gp,-920 # 20000064 <ssd1306_buffer>
a0a: b7d5 j 9ee <memset>
00000a0c <memcpy>:
for (; n; n--) *d++ = *s++;
a0c: 4781 li a5,0
a0e: 00f61363 bne a2,a5,a14 <memcpy+0x8>
}
a12: 8082 ret
for (; n; n--) *d++ = *s++;
a14: 00f58733 add a4,a1,a5
a18: 00074683 lbu a3,0(a4) # 40021000 <_eusrstack+0x20020800>
a1c: 00f50733 add a4,a0,a5
a20: 0785 addi a5,a5,1
a22: 00d70023 sb a3,0(a4)
a26: b7e5 j a0e <memcpy+0x2>
00000a28 <ssd1306_refresh>:
{
a28: 7179 addi sp,sp,-48
ssd1306_cmd(SSD1306_COLUMNADDR);
a2a: 02100513 li a0,33
{
a2e: d606 sw ra,44(sp)
a30: d422 sw s0,40(sp)
a32: d226 sw s1,36(sp)
ssd1306_cmd(SSD1306_COLUMNADDR);
a34: 3f31 jal 950 <ssd1306_cmd>
ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset)
a36: 4501 li a0,0
a38: 3f21 jal 950 <ssd1306_cmd>
ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset)
a3a: 07f00513 li a0,127
a3e: 3f09 jal 950 <ssd1306_cmd>
ssd1306_cmd(SSD1306_PAGEADDR);
a40: 02200513 li a0,34
a44: 3731 jal 950 <ssd1306_cmd>
ssd1306_cmd(0); // Page start address (0 = reset)
a46: 4501 li a0,0
a48: 3721 jal 950 <ssd1306_cmd>
ssd1306_cmd(7); // Page end address
a4a: 451d li a0,7
a4c: c6818413 addi s0,gp,-920 # 20000064 <ssd1306_buffer>
a50: 3701 jal 950 <ssd1306_cmd>
for(i=0;i<sizeof(ssd1306_buffer);i+=SSD1306_PSZ)
a52: 40040493 addi s1,s0,1024
pkt[0] = 0x40;
a56: 04000793 li a5,64
memcpy(&pkt[1], data, sz);
a5a: 85a2 mv a1,s0
a5c: 02000613 li a2,32
a60: 00110513 addi a0,sp,1
pkt[0] = 0x40;
a64: 00f10023 sb a5,0(sp)
memcpy(&pkt[1], data, sz);
a68: 3755 jal a0c <memcpy>
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
a6a: 02100593 li a1,33
a6e: 850a mv a0,sp
a70: 02040413 addi s0,s0,32
a74: 33c9 jal 836 <ssd1306_i2c_send.constprop.0>
a76: fe9410e3 bne s0,s1,a56 <ssd1306_refresh+0x2e>
}
a7a: 50b2 lw ra,44(sp)
a7c: 5422 lw s0,40(sp)
a7e: 5492 lw s1,36(sp)
a80: 6145 addi sp,sp,48
a82: 8082 ret
00000a84 <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
a84: 400227b7 lui a5,0x40022
a88: 4705 li a4,1
a8a: 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;
a8c: 400217b7 lui a5,0x40021
RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL.
a90: 01080737 lui a4,0x1080
RCC->CFGR0 = BASE_CFGR0;
a94: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804>
RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL.
a98: 08170713 addi a4,a4,129 # 1080081 <tama.c.96f78ea9+0x107c11d>
a9c: 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.
a9e: 009f0737 lui a4,0x9f0
aa2: 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
aa4: 4398 lw a4,0(a5)
aa6: 00671693 slli a3,a4,0x6
aaa: fe06dde3 bgez a3,aa4 <SystemInit+0x20>
#if defined(CH32H41x)
RCC->PLLCFGR |= RCC_SYSPLL_GATE;
#endif
uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW
aae: 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
ab0: 400216b7 lui a3,0x40021
uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW
ab4: 9b71 andi a4,a4,-4
RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source
ab6: 00276713 ori a4,a4,2
aba: c3d8 sw a4,4(a5)
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source
abc: 4721 li a4,8
abe: 42dc lw a5,4(a3)
ac0: 8bb1 andi a5,a5,12
ac2: fee79ee3 bne a5,a4,abe <SystemInit+0x3a>
SetupDebugPrintf();
#endif
#if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS
CallConstructors();
#endif
}
ac6: 8082 ret
00000ac8 <main>:
}
}
// ----------------------------------------------------------------- main
int main(void)
{
ac8: f8410113 addi sp,sp,-124
acc: dc86 sw ra,120(sp)
ace: daa2 sw s0,116(sp)
ad0: d8a6 sw s1,112(sp)
SystemInit();
ad2: 3f4d jal a84 <SystemInit>
funGpioInitAll();
ad4: 400214b7 lui s1,0x40021
ad8: 4c9c lw a5,24(s1)
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
ada: 40011437 lui s0,0x40011
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
ade: 76fd lui a3,0xfffff
funGpioInitAll();
ae0: 0357e793 ori a5,a5,53
ae4: cc9c sw a5,24(s1)
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
ae6: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000>
aea: 4398 lw a4,0(a5)
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
aec: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff>
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
af0: f1000637 lui a2,0xf1000
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
af4: f0f77713 andi a4,a4,-241
af8: 01076713 ori a4,a4,16
afc: c398 sw a4,0(a5)
funDigitalWrite(LED_PIN, FUN_LOW);
afe: 00020737 lui a4,0x20
b02: cb98 sw a4,16(a5)
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
b04: 40040793 addi a5,s0,1024
b08: 4398 lw a4,0(a5)
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
b0a: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff>
gpio_setup();
Delay_Ms(120); // let the OLED rail settle
b0c: 000b0537 lui a0,0xb0
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
b10: 8f75 and a4,a4,a3
b12: 10076713 ori a4,a4,256
b16: c398 sw a4,0(a5)
funDigitalWrite(BUZZER, FUN_LOW);
b18: 00040737 lui a4,0x40
b1c: cb98 sw a4,16(a5)
funPinMode(BTN_OK, GPIO_CNF_IN_PUPD);
b1e: 4018 lw a4,0(s0)
Delay_Ms(120); // let the OLED rail settle
b20: c8050513 addi a0,a0,-896 # afc80 <tama.c.96f78ea9+0xabd1c>
funPinMode(BTN_OK, GPIO_CNF_IN_PUPD);
b24: 9b41 andi a4,a4,-16
b26: 00876713 ori a4,a4,8
b2a: c018 sw a4,0(s0)
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
b2c: 4398 lw a4,0(a5)
b2e: 8f71 and a4,a4,a2
b30: 08000637 lui a2,0x8000
b34: 8f51 or a4,a4,a2
b36: c398 sw a4,0(a5)
funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD);
b38: 4398 lw a4,0(a5)
b3a: ff100637 lui a2,0xff100
b3e: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff>
b40: 8f71 and a4,a4,a2
b42: 00800637 lui a2,0x800
b46: 8f51 or a4,a4,a2
b48: c398 sw a4,0(a5)
funDigitalWrite(BTN_OK, FUN_HIGH);
b4a: 4705 li a4,1
b4c: c818 sw a4,16(s0)
funDigitalWrite(BTN_LEFT, FUN_HIGH);
b4e: 04000713 li a4,64
b52: cb98 sw a4,16(a5)
funDigitalWrite(BTN_RIGHT, FUN_HIGH);
b54: 02000713 li a4,32
b58: cb98 sw a4,16(a5)
Delay_Ms(120); // let the OLED rail settle
b5a: dc4ff0ef jal 11e <DelaySysTick>
* init I2C and GPIO
*/
uint8_t ssd1306_i2c_init(void)
{
// Enable GPIOC and I2C
RCC->APB1PCENR |= RCC_APB1Periph_I2C1;
b5e: 4cdc lw a5,28(s1)
b60: 00200737 lui a4,0x200
b64: 8fd9 or a5,a5,a4
b66: ccdc sw a5,28(s1)
funPinMode( PB6, GPIO_CFGLR_OUT_10Mhz_AF_OD );
funPinMode( PB7, GPIO_CFGLR_OUT_10Mhz_AF_OD );
#endif
#else
RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO;
b68: 4c9c lw a5,24(s1)
// PC1 is SDA, 10MHz Output, alt func, open-drain
GPIOC->CFGLR &= ~(0xf<<(4*1));
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1);
// PC2 is SCL, 10MHz Output, alt func, open-drain
GPIOC->CFGLR &= ~(0xf<<(4*2));
b6a: 777d lui a4,0xfffff
b6c: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff>
RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO;
b70: 0117e793 ori a5,a5,17
b74: cc9c sw a5,24(s1)
GPIOC->CFGLR &= ~(0xf<<(4*1));
b76: 401c lw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2);
b78: 6705 lui a4,0x1
b7a: d0070713 addi a4,a4,-768 # d00 <main+0x238>
GPIOC->CFGLR &= ~(0xf<<(4*1));
b7e: f0f7f793 andi a5,a5,-241
b82: c01c sw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1);
b84: 401c lw a5,0(s0)
b86: 0d07e793 ori a5,a5,208
b8a: c01c sw a5,0(s0)
GPIOC->CFGLR &= ~(0xf<<(4*2));
b8c: 401c lw a5,0(s0)
b8e: 8ff5 and a5,a5,a3
b90: c01c sw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2);
b92: 401c lw a5,0(s0)
b94: 8fd9 or a5,a5,a4
b96: c01c sw a5,0(s0)
ssd1306_setbuf(0);
// initialize OLED
#if !defined(SSD1306_CUSTOM_INIT_ARRAY) || !SSD1306_CUSTOM_INIT_ARRAY
uint8_t *cmd_list = (uint8_t *)ssd1306_init_array;
b98: 6409 lui s0,0x2
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4);
GPIOC->BSHR = (1<<(16+4));
#endif
// load I2C regs
ssd1306_i2c_setup();
b9a: d96ff0ef jal 130 <ssd1306_i2c_setup>
b9e: 40440413 addi s0,s0,1028 # 2404 <ssd1306_init_array>
ssd1306_setbuf(0);
ba2: 3db9 jal a00 <ssd1306_setbuf.constprop.0>
while(*cmd_list != SSD1306_TERMINATE_CMDS)
ba4: 00044503 lbu a0,0(s0)
ba8: 0ff00793 li a5,255
bac: 00f51463 bne a0,a5,bb4 <main+0xec>
{
if(ssd1306_cmd(*cmd_list++))
return 1;
}
ssd1306_refresh();
bb0: 3da5 jal a28 <ssd1306_refresh>
#endif
return 0;
bb2: a021 j bba <main+0xf2>
if(ssd1306_cmd(*cmd_list++))
bb4: 0405 addi s0,s0,1
bb6: 3b69 jal 950 <ssd1306_cmd>
bb8: d575 beqz a0,ba4 <main+0xdc>
ssd1306_setbuf(0);
bba: 6489 lui s1,0x2
bbc: 3591 jal a00 <ssd1306_setbuf.constprop.0>
for (uint8_t i = 0; i < 5; i++) {
bbe: 42048493 addi s1,s1,1056 # 2420 <boot.0>
ssd1306_setbuf(0);
bc2: 4401 li s0,0
ssd1306_drawstr(0, i * 10, boot[i], 1);
bc4: 4090 lw a2,0(s1)
bc6: 4685 li a3,1
bc8: 85a2 mv a1,s0
bca: 4501 li a0,0
bcc: e4cff0ef jal 218 <ssd1306_drawstr>
ssd1306_refresh();
bd0: 3da1 jal a28 <ssd1306_refresh>
beep(1200 + i * 120, 25);
bd2: 00141513 slli a0,s0,0x1
bd6: 9522 add a0,a0,s0
bd8: 050a slli a0,a0,0x2
bda: 4b050513 addi a0,a0,1200
bde: 0542 slli a0,a0,0x10
be0: 8141 srli a0,a0,0x10
be2: 45e5 li a1,25
be4: f32ff0ef jal 316 <beep>
Delay_Ms(220);
be8: 00142537 lui a0,0x142
bec: 44050513 addi a0,a0,1088 # 142440 <tama.c.96f78ea9+0x13e4dc>
bf0: d2eff0ef jal 11e <DelaySysTick>
for (uint8_t i = 0; i < 5; i++) {
bf4: 0429 addi s0,s0,10
bf6: 03200793 li a5,50
bfa: 0491 addi s1,s1,4
bfc: fcf414e3 bne s0,a5,bc4 <main+0xfc>
draw_center_str(54, "press any key");
c00: 6589 lui a1,0x2
c02: 9a858593 addi a1,a1,-1624 # 19a8 <main+0xee0>
c06: 03600513 li a0,54
c0a: 903ff0ef jal 50c <draw_center_str>
ssd1306_refresh();
c0e: 3d29 jal a28 <ssd1306_refresh>
beep(988, 120);
c10: 07800593 li a1,120
c14: 3dc00513 li a0,988
c18: efeff0ef jal 316 <beep>
c1c: 0c800413 li s0,200
Buttons b = read_buttons();
c20: 915ff0ef jal 534 <read_buttons>
c24: 00855713 srli a4,a0,0x8
c28: 01055793 srli a5,a0,0x10
c2c: 02e10ea3 sb a4,61(sp)
if (b.ok || b.left || b.right) break;
c30: 8f49 or a4,a4,a0
Buttons b = read_buttons();
c32: 02f10f23 sb a5,62(sp)
if (b.ok || b.left || b.right) break;
c36: 8fd9 or a5,a5,a4
Buttons b = read_buttons();
c38: 02a10e23 sb a0,60(sp)
if (b.ok || b.left || b.right) break;
c3c: 0ff7f793 zext.b a5,a5
c40: eb81 bnez a5,c50 <main+0x188>
Delay_Ms(20);
c42: 6575 lui a0,0x1d
c44: 4c050513 addi a0,a0,1216 # 1d4c0 <tama.c.96f78ea9+0x1955c>
for (int i = 0; i < 200; i++) {
c48: 147d addi s0,s0,-1
Delay_Ms(20);
c4a: cd4ff0ef jal 11e <DelaySysTick>
for (int i = 0; i < 200; i++) {
c4e: f869 bnez s0,c20 <main+0x158>
while (1) { led_blink(); Delay_Ms(700); }
}
ssd1306_init();
splash();
screen = SCR_SELECT; // pick a species before a pet is born
c50: c4018223 sb zero,-956(gp) # 20000040 <screen>
Buttons prev = {0, 0, 0};
c54: 4701 li a4,0
c56: 4481 li s1,0
c58: 4401 li s0,0
c5a: c23a sw a4,4(sp)
while (1) {
Buttons b = read_buttons();
c5c: 8d9ff0ef jal 534 <read_buttons>
c60: 01055793 srli a5,a0,0x10
c64: 0ff57713 zext.b a4,a0
c68: cc3a sw a4,24(sp)
c6a: 02f10923 sb a5,50(sp)
c6e: 0ff7f793 zext.b a5,a5
c72: 00855693 srli a3,a0,0x8
c76: ce3e sw a5,28(sp)
uint8_t ok_edge = b.ok && !prev.ok;
c78: 47e2 lw a5,24(sp)
Buttons b = read_buttons();
c7a: 0ff6f713 zext.b a4,a3
c7e: ca3a sw a4,20(sp)
c80: 02a10823 sb a0,48(sp)
c84: 02d108a3 sb a3,49(sp)
uint8_t ok_edge = b.ok && !prev.ok;
c88: c002 sw zero,0(sp)
c8a: 4712 lw a4,4(sp)
c8c: c781 beqz a5,c94 <main+0x1cc>
c8e: 00143793 seqz a5,s0
c92: c03e sw a5,0(sp)
uint8_t left_edge = b.left && !prev.left;
c94: 46d2 lw a3,20(sp)
uint8_t ok_edge = b.ok && !prev.ok;
c96: 00014783 lbu a5,0(sp)
uint8_t left_edge = b.left && !prev.left;
c9a: 4581 li a1,0
c9c: c299 beqz a3,ca2 <main+0x1da>
c9e: 0014b593 seqz a1,s1
uint8_t right_edge = b.right && !prev.right;
ca2: 4572 lw a0,28(sp)
uint8_t left_edge = b.left && !prev.left;
ca4: 0ff5f613 zext.b a2,a1
uint8_t right_edge = b.right && !prev.right;
ca8: 4681 li a3,0
caa: c119 beqz a0,cb0 <main+0x1e8>
cac: 00173693 seqz a3,a4
uint8_t any_edge = ok_edge | left_edge | right_edge;
cb0: 8fd1 or a5,a5,a2
cb2: 8fd5 or a5,a5,a3
prev = b;
if (any_edge) idle_frames = 0;
cb4: c399 beqz a5,cba <main+0x1f2>
cb6: c401a023 sw zero,-960(gp) # 2000003c <idle_frames>
if (!disp_on) {
cba: c051c703 lbu a4,-1019(gp) # 20000001 <disp_on>
cbe: eb35 bnez a4,d32 <main+0x26a>
// screen is asleep: the first press only wakes it (not an action)
if (any_edge) {
cc0: c799 beqz a5,cce <main+0x206>
ssd1306_cmd(SSD1306_DISPLAYON);
cc2: 0af00513 li a0,175
cc6: 3169 jal 950 <ssd1306_cmd>
disp_on = 1;
cc8: 4785 li a5,1
cca: c0f182a3 sb a5,-1019(gp) # 20000001 <disp_on>
ssd1306_cmd(SSD1306_DISPLAYOFF);
disp_on = 0;
}
}
if (anim_timer) anim_timer--;
cce: c3a1c783 lbu a5,-966(gp) # 20000036 <anim_timer>
cd2: c781 beqz a5,cda <main+0x212>
cd4: 17fd addi a5,a5,-1
cd6: c2f18d23 sb a5,-966(gp) # 20000036 <anim_timer>
if (evo_anim) evo_anim--;
cda: c501c783 lbu a5,-944(gp) # 2000004c <evo_anim>
cde: c781 beqz a5,ce6 <main+0x21e>
ce0: 17fd addi a5,a5,-1
ce2: c4f18823 sb a5,-944(gp) # 2000004c <evo_anim>
// advance game time independent of screen / display state
if (pet.alive && ++tick_acc >= TICK_FRAMES) {
ce6: c5418793 addi a5,gp,-940 # 20000050 <pet>
cea: 0107c783 lbu a5,16(a5)
cee: c5418413 addi s0,gp,-940 # 20000050 <pet>
cf2: cf81 beqz a5,d0a <main+0x242>
cf4: c381d783 lhu a5,-968(gp) # 20000034 <tick_acc>
cf8: 0f900693 li a3,249
cfc: 0785 addi a5,a5,1
cfe: 07c2 slli a5,a5,0x10
d00: 83c1 srli a5,a5,0x10
d02: 24f6e7e3 bltu a3,a5,1750 <main+0xc88>
d06: c2f19c23 sh a5,-968(gp) # 20000034 <tick_acc>
tick_acc = 0;
game_tick();
}
frame++;
d0a: c341a783 lw a5,-972(gp) # 20000030 <frame>
idle_frames++;
Delay_Ms(FRAME_MS);
d0e: 00058537 lui a0,0x58
d12: e4050513 addi a0,a0,-448 # 57e40 <tama.c.96f78ea9+0x53edc>
frame++;
d16: 0785 addi a5,a5,1
d18: c2f1aa23 sw a5,-972(gp) # 20000030 <frame>
idle_frames++;
d1c: c401a783 lw a5,-960(gp) # 2000003c <idle_frames>
d20: 0785 addi a5,a5,1
d22: c4f1a023 sw a5,-960(gp) # 2000003c <idle_frames>
Delay_Ms(FRAME_MS);
d26: bf8ff0ef jal 11e <DelaySysTick>
prev = b;
d2a: 4772 lw a4,28(sp)
d2c: 44d2 lw s1,20(sp)
d2e: 4462 lw s0,24(sp)
while (1) {
d30: b72d j c5a <main+0x192>
switch (screen) {
d32: c441c703 lbu a4,-956(gp) # 20000040 <screen>
d36: 4611 li a2,4
d38: 7ee66963 bltu a2,a4,152a <main+0xa62>
d3c: 6609 lui a2,0x2
d3e: 070a slli a4,a4,0x2
d40: b7460613 addi a2,a2,-1164 # 1b74 <main+0x10ac>
d44: 9732 add a4,a4,a2
d46: 4318 lw a4,0(a4)
d48: 8702 jr a4
if (left_edge) {
d4a: c185 beqz a1,d6a <main+0x2a2>
sel_species = (sel_species + SPECIES_COUNT - 1) % SPECIES_COUNT;
d4c: c3d1c503 lbu a0,-963(gp) # 20000039 <sel_species>
d50: 458d li a1,3
d52: c236 sw a3,4(sp)
d54: 0509 addi a0,a0,2
d56: ba2ff0ef jal f8 <__modsi3>
d5a: c2a18ea3 sb a0,-963(gp) # 20000039 <sel_species>
beep(1047, 25);
d5e: 45e5 li a1,25
d60: 41700513 li a0,1047
d64: db2ff0ef jal 316 <beep>
d68: 4692 lw a3,4(sp)
if (right_edge) {
d6a: ce91 beqz a3,d86 <main+0x2be>
sel_species = (sel_species + 1) % SPECIES_COUNT;
d6c: c3d1c503 lbu a0,-963(gp) # 20000039 <sel_species>
d70: 458d li a1,3
d72: 0505 addi a0,a0,1
d74: b84ff0ef jal f8 <__modsi3>
d78: c2a18ea3 sb a0,-963(gp) # 20000039 <sel_species>
beep(1047, 25);
d7c: 45e5 li a1,25
d7e: 41700513 li a0,1047
d82: d94ff0ef jal 316 <beep>
if (ok_edge) { // born! boot the chosen species
d86: 4782 lw a5,0(sp)
d88: c3b5 beqz a5,dec <main+0x324>
pet.satiety = 80;
d8a: 645a5737 lui a4,0x645a5
d8e: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850>
d92: c4e1aa23 sw a4,-940(gp) # 20000050 <pet>
pet.health = 100;
d96: c5418793 addi a5,gp,-940 # 20000050 <pet>
d9a: 06400713 li a4,100
d9e: 00e78223 sb a4,4(a5)
pet.species = sel_species;
da2: c3d1c703 lbu a4,-963(gp) # 20000039 <sel_species>
pet.age_min = 0;
da6: 00079323 sh zero,6(a5)
pet.xp = 0;
daa: 00079423 sh zero,8(a5)
pet.species = sel_species;
dae: 00e78523 sb a4,10(a5)
pet.level = 1;
db2: 4705 li a4,1
db4: 00e785a3 sb a4,11(a5)
pet.form = FORM_PROC;
db8: 0007a623 sw zero,12(a5)
pet.alive = 1;
dbc: 00e78823 sb a4,16(a5)
cursor = 0;
dc0: c2018e23 sb zero,-964(gp) # 20000038 <cursor>
evo_anim = 0;
dc4: c4018823 sb zero,-944(gp) # 2000004c <evo_anim>
for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; }
dc8: c401a423 sw zero,-952(gp) # 20000044 <warn_flag>
beep(659, 80); beep(988, 120);
dcc: 05000593 li a1,80
dd0: 29300513 li a0,659
screen = SCR_MAIN;
dd4: c4e18223 sb a4,-956(gp) # 20000040 <screen>
for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; }
dd8: c401a623 sw zero,-948(gp) # 20000048 <crit_flag>
beep(659, 80); beep(988, 120);
ddc: d3aff0ef jal 316 <beep>
de0: 07800593 li a1,120
de4: 3dc00513 li a0,988
de8: d2eff0ef jal 316 <beep>
ssd1306_setbuf(0);
dec: 3911 jal a00 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "~ $ adopt --pet");
dee: 6589 lui a1,0x2
df0: 9b858593 addi a1,a1,-1608 # 19b8 <main+0xef0>
df4: 4501 li a0,0
df6: f16ff0ef jal 50c <draw_center_str>
if((x >= SSD1306_W) || (y >= SSD1306_H)) return;
dfa: 4685 li a3,1
dfc: 08000613 li a2,128
e00: 45a9 li a1,10
e02: 4501 li a0,0
e04: f62ff0ef jal 566 <ssd1306_drawFastHLine.part.0>
ssd1306_drawImage(48, 13, species_frames[sel_species][EXP_IDLE],
e08: c3d1c403 lbu s0,-963(gp) # 20000039 <sel_species>
e0c: 6789 lui a5,0x2
e0e: 54078793 addi a5,a5,1344 # 2540 <species_frames>
e12: 00341713 slli a4,s0,0x3
e16: 8f01 sub a4,a4,s0
e18: 070a slli a4,a4,0x2
e1a: 97ba add a5,a5,a4
e1c: 4390 lw a2,0(a5)
e1e: 02000713 li a4,32
e22: 86ba mv a3,a4
e24: 45b5 li a1,13
e26: 03000513 li a0,48
e2a: 94dff0ef jal 776 <ssd1306_drawImage.constprop.0>
p = s_cat(p, "< ");
e2e: 6589 lui a1,0x2
e30: 9c858593 addi a1,a1,-1592 # 19c8 <main+0xf00>
e34: 1868 addi a0,sp,60
e36: c6eff0ef jal 2a4 <s_cat>
p = s_cat(p, species_names[sel_species]);
e3a: 6789 lui a5,0x2
e3c: 040a slli s0,s0,0x2
e3e: 43478793 addi a5,a5,1076 # 2434 <species_names>
e42: 97a2 add a5,a5,s0
e44: 438c lw a1,0(a5)
e46: c5eff0ef jal 2a4 <s_cat>
p = s_cat(p, " >");
e4a: 6589 lui a1,0x2
e4c: 9cc58593 addi a1,a1,-1588 # 19cc <main+0xf04>
e50: c54ff0ef jal 2a4 <s_cat>
*p = 0;
e54: 00050023 sb zero,0(a0)
draw_center_str(47, line);
e58: 186c addi a1,sp,60
e5a: 02f00513 li a0,47
e5e: eaeff0ef jal 50c <draw_center_str>
draw_center_str(56, "L/R pick OK go");
e62: 6589 lui a1,0x2
e64: 9d058593 addi a1,a1,-1584 # 19d0 <main+0xf08>
draw_center_str(56, "OK: respawn");
e68: 03800513 li a0,56
e6c: a98d j 12de <main+0x816>
if (left_edge) {
e6e: c185 beqz a1,e8e <main+0x3c6>
cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT;
e70: c3c1c503 lbu a0,-964(gp) # 20000038 <cursor>
e74: 459d li a1,7
e76: c236 sw a3,4(sp)
e78: 0519 addi a0,a0,6
e7a: a7eff0ef jal f8 <__modsi3>
e7e: c2a18e23 sb a0,-964(gp) # 20000038 <cursor>
beep(1047, 25);
e82: 45e5 li a1,25
e84: 41700513 li a0,1047
e88: c8eff0ef jal 316 <beep>
e8c: 4692 lw a3,4(sp)
if (right_edge) {
e8e: ce91 beqz a3,eaa <main+0x3e2>
cursor = (cursor + 1) % ICON_COUNT;
e90: c3c1c503 lbu a0,-964(gp) # 20000038 <cursor>
e94: 459d li a1,7
e96: 0505 addi a0,a0,1
e98: a60ff0ef jal f8 <__modsi3>
e9c: c2a18e23 sb a0,-964(gp) # 20000038 <cursor>
beep(1047, 25);
ea0: 45e5 li a1,25
ea2: 41700513 li a0,1047
ea6: c70ff0ef jal 316 <beep>
if (ok_edge) do_action(cursor);
eaa: 4782 lw a5,0(sp)
eac: c5418493 addi s1,gp,-940 # 20000050 <pet>
eb0: 0e078e63 beqz a5,fac <main+0x4e4>
switch (act) {
eb4: c3c1c783 lbu a5,-964(gp) # 20000038 <cursor>
eb8: 4699 li a3,6
eba: 0ef6e963 bltu a3,a5,fac <main+0x4e4>
ebe: 6689 lui a3,0x2
ec0: 078a slli a5,a5,0x2
ec2: b8868693 addi a3,a3,-1144 # 1b88 <main+0x10c0>
ec6: 97b6 add a5,a5,a3
ec8: 439c lw a5,0(a5)
eca: 8782 jr a5
pet.satiety = clamp100(pet.satiety + 30);
ecc: 00048783 lb a5,0(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
ed0: 06400713 li a4,100
pet.satiety = clamp100(pet.satiety + 30);
ed4: 07f9 addi a5,a5,30
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
ed6: 04f75563 bge a4,a5,f20 <main+0x458>
eda: 87ba mv a5,a4
edc: 00f48023 sb a5,0(s1)
pet.hygiene = clamp100(pet.hygiene - 5);
ee0: 00348783 lb a5,3(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
ee4: 06400713 li a4,100
pet.hygiene = clamp100(pet.hygiene - 5);
ee8: 17ed addi a5,a5,-5
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
eea: 04f75063 bge a4,a5,f2a <main+0x462>
eee: 87ba mv a5,a4
ef0: 00f481a3 sb a5,3(s1)
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
ef4: 4411 li s0,4
ef6: c2818823 sb s0,-976(gp) # 2000002c <anim_exp>
efa: 4731 li a4,12
beep(880, 60); beep(1175, 80);
efc: 03c00593 li a1,60
f00: 37000513 li a0,880
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
f04: c2e18d23 sb a4,-966(gp) # 20000036 <anim_timer>
beep(880, 60); beep(1175, 80);
f08: c0eff0ef jal 316 <beep>
f0c: 05000593 li a1,80
f10: 49700513 li a0,1175
beep(784, 60); beep(1047, 60); beep(1319, 90);
f14: c02ff0ef jal 316 <beep>
led_blink();
f18: c6eff0ef jal 386 <led_blink>
add_xp(4);
f1c: 4511 li a0,4
f1e: a069 j fa8 <main+0x4e0>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
f20: fff7c713 not a4,a5
f24: 877d srai a4,a4,0x1f
f26: 8ff9 and a5,a5,a4
f28: bf55 j edc <main+0x414>
f2a: fff7c713 not a4,a5
f2e: 877d srai a4,a4,0x1f
f30: 8ff9 and a5,a5,a4
f32: bf7d j ef0 <main+0x428>
if (pet.energy < 15) { beep(220, 120); break; } // too tired
f34: 00248703 lb a4,2(s1)
f38: 47b9 li a5,14
f3a: 00e7c963 blt a5,a4,f4c <main+0x484>
f3e: 07800593 li a1,120
f42: 0dc00513 li a0,220
beep(659, 40);
f46: bd0ff0ef jal 316 <beep>
break;
f4a: a08d j fac <main+0x4e4>
pet.happy = clamp100(pet.happy + 25);
f4c: 00148783 lb a5,1(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
f50: 06400693 li a3,100
pet.happy = clamp100(pet.happy + 25);
f54: 07e5 addi a5,a5,25
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
f56: 38f6d763 bge a3,a5,12e4 <main+0x81c>
f5a: 87b6 mv a5,a3
f5c: 00f480a3 sb a5,1(s1)
pet.energy = clamp100(pet.energy - 12);
f60: ff470793 addi a5,a4,-12
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
f64: 06400713 li a4,100
f68: 00f75363 bge a4,a5,f6e <main+0x4a6>
f6c: 87ba mv a5,a4
f6e: 00f48123 sb a5,2(s1)
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
f72: 4709 li a4,2
f74: c2e18823 sb a4,-976(gp) # 2000002c <anim_exp>
beep(988, 60); beep(1319, 60); beep(1568, 90);
f78: 03c00593 li a1,60
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
f7c: 4731 li a4,12
beep(988, 60); beep(1319, 60); beep(1568, 90);
f7e: 3dc00513 li a0,988
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
f82: c2e18d23 sb a4,-966(gp) # 20000036 <anim_timer>
beep(988, 60); beep(1319, 60); beep(1568, 90);
f86: b90ff0ef jal 316 <beep>
f8a: 03c00593 li a1,60
f8e: 52700513 li a0,1319
f92: b84ff0ef jal 316 <beep>
f96: 62000513 li a0,1568
f9a: 05a00593 li a1,90
f9e: b78ff0ef jal 316 <beep>
led_blink();
fa2: be4ff0ef jal 386 <led_blink>
add_xp(6);
fa6: 4519 li a0,6
add_xp(4);
fa8: c08ff0ef jal 3b0 <add_xp>
ssd1306_setbuf(0);
fac: a55ff0ef jal a00 <ssd1306_setbuf.constprop.0>
draw_center_str(0, menu_labels[cursor]);
fb0: c3c1c783 lbu a5,-964(gp) # 20000038 <cursor>
fb4: 4501 li a0,0
fb6: d03e sw a5,32(sp)
fb8: 5702 lw a4,32(sp)
fba: 6789 lui a5,0x2
fbc: 5c478793 addi a5,a5,1476 # 25c4 <menu_labels>
fc0: 070a slli a4,a4,0x2
fc2: 97ba add a5,a5,a4
fc4: 438c lw a1,0(a5)
fc6: d46ff0ef jal 50c <draw_center_str>
if (pet.alive && pet.health < 30 && (frame & 8))
fca: 0104c783 lbu a5,16(s1)
fce: c83e sw a5,16(sp)
fd0: c395 beqz a5,ff4 <main+0x52c>
fd2: 00448703 lb a4,4(s1)
fd6: 47f5 li a5,29
fd8: 00e7ce63 blt a5,a4,ff4 <main+0x52c>
fdc: c341a783 lw a5,-972(gp) # 20000030 <frame>
fe0: 8ba1 andi a5,a5,8
fe2: cb89 beqz a5,ff4 <main+0x52c>
ssd1306_drawstr(0, 0, "!", 1);
fe4: 6609 lui a2,0x2
fe6: 4685 li a3,1
fe8: 9e060613 addi a2,a2,-1568 # 19e0 <main+0xf18>
fec: 4581 li a1,0
fee: 4501 li a0,0
ff0: a28ff0ef jal 218 <ssd1306_drawstr>
bp = u_cat(bp, pet.level);
ff4: 00b4c583 lbu a1,11(s1)
*bp++ = 'L';
ff8: 04c00793 li a5,76
bp = u_cat(bp, pet.level);
ffc: 03510513 addi a0,sp,53
*bp++ = 'L';
1000: 02f10a23 sb a5,52(sp)
bp = u_cat(bp, pet.level);
1004: ab2ff0ef jal 2b6 <u_cat>
*bp = 0;
1008: 00050023 sb zero,0(a0)
ssd1306_drawstr(SSD1306_W - 2 * 8, 0, badge, 1);
100c: 4685 li a3,1
100e: 1850 addi a2,sp,52
1010: 4581 li a1,0
1012: 07000513 li a0,112
1016: a02ff0ef jal 218 <ssd1306_drawstr>
101a: 4685 li a3,1
101c: 08000613 li a2,128
1020: 45a9 li a1,10
1022: 4501 li a0,0
1024: d42ff0ef jal 566 <ssd1306_drawFastHLine.part.0>
if (pet.sleeping) {
1028: 00f4c403 lbu s0,15(s1)
102c: 38040463 beqz s0,13b4 <main+0x8ec>
ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1);
1030: 6609 lui a2,0x2
1032: 4685 li a3,1
1034: 9e460613 addi a2,a2,-1564 # 19e4 <main+0xf1c>
1038: 45b9 li a1,14
103a: 04e00513 li a0,78
103e: 9daff0ef jal 218 <ssd1306_drawstr>
ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1);
1042: 6609 lui a2,0x2
1044: 4685 li a3,1
1046: 9e860613 addi a2,a2,-1560 # 19e8 <main+0xf20>
104a: 45b1 li a1,12
104c: 05400513 li a0,84
1050: 9c8ff0ef jal 218 <ssd1306_drawstr>
1054: 03000793 li a5,48
1058: c43e sw a5,8(sp)
px = 48; py = 16;
105a: 47c1 li a5,16
105c: c03e sw a5,0(sp)
105e: 03000793 li a5,48
1062: c23e sw a5,4(sp)
if (pet.form == FORM_CLAUDE) spr = spr_claude;
1064: 00c4c783 lbu a5,12(s1)
1068: 6609 lui a2,0x2
106a: 4c060613 addi a2,a2,1216 # 24c0 <spr_claude>
106e: c63e sw a5,12(sp)
1070: 4732 lw a4,12(sp)
1072: 478d li a5,3
1074: 02f70b63 beq a4,a5,10aa <main+0x5e2>
else if (pet.form == FORM_GLITCH) spr = spr_glitch;
1078: 46b2 lw a3,12(sp)
107a: 4711 li a4,4
107c: 3ae68663 beq a3,a4,1428 <main+0x960>
if (!pet.alive) return EXP_DEAD;
1080: 4742 lw a4,16(sp)
else spr = species_frames[pet.species][current_expression()];
1082: 00a4c683 lbu a3,10(s1)
if (!pet.alive) return EXP_DEAD;
1086: 4519 li a0,6
1088: c719 beqz a4,1096 <main+0x5ce>
if (anim_timer) return anim_exp;
108a: c3a1c703 lbu a4,-966(gp) # 20000036 <anim_timer>
108e: 34070f63 beqz a4,13ec <main+0x924>
1092: c301c503 lbu a0,-976(gp) # 2000002c <anim_exp>
else spr = species_frames[pet.species][current_expression()];
1096: 00369793 slli a5,a3,0x3
109a: 8f95 sub a5,a5,a3
109c: 6709 lui a4,0x2
109e: 97aa add a5,a5,a0
10a0: 078a slli a5,a5,0x2
10a2: 54070713 addi a4,a4,1344 # 2540 <species_frames>
10a6: 97ba add a5,a5,a4
10a8: 4390 lw a2,0(a5)
ssd1306_drawImage(x, y, spr, PANA_W, PANA_H, 0);
10aa: 4582 lw a1,0(sp)
10ac: 4522 lw a0,8(sp)
10ae: 02000713 li a4,32
10b2: 86ba mv a3,a4
10b4: c832 sw a2,16(sp)
10b6: ec0ff0ef jal 776 <ssd1306_drawImage.constprop.0>
if (spr != spr_claude && spr != spr_glitch && !pet.sleeping)
10ba: 4642 lw a2,16(sp)
10bc: 6789 lui a5,0x2
10be: 4c078793 addi a5,a5,1216 # 24c0 <spr_claude>
10c2: 10f60f63 beq a2,a5,11e0 <main+0x718>
10c6: 6789 lui a5,0x2
10c8: 44078793 addi a5,a5,1088 # 2440 <spr_glitch>
10cc: 10f60a63 beq a2,a5,11e0 <main+0x718>
10d0: 10041863 bnez s0,11e0 <main+0x718>
if (pet.form >= FORM_USER) { // shades
10d4: 47b2 lw a5,12(sp)
10d6: 14078263 beqz a5,121a <main+0x752>
uint8_t cy = eye_cy[sp], lx = eye_lx[sp], rx = eye_rx[sp];
10da: 00a4c703 lbu a4,10(s1)
10de: c0c18793 addi a5,gp,-1012 # 20000008 <eye_rx>
10e2: 97ba add a5,a5,a4
10e4: 0007c403 lbu s0,0(a5)
10e8: c1418693 addi a3,gp,-1004 # 20000010 <eye_cy>
10ec: c1018793 addi a5,gp,-1008 # 2000000c <eye_lx>
10f0: 97ba add a5,a5,a4
10f2: 9736 add a4,a4,a3
ssd1306_fillRect(x + lx - 3, y + cy - 2, 7, 4, 0);
10f4: 0007c303 lbu t1,0(a5)
10f8: 00074703 lbu a4,0(a4)
10fc: 4682 lw a3,0(sp)
10fe: 4792 lw a5,4(sp)
1100: 461d li a2,7
1102: 00d702b3 add t0,a4,a3
1106: 979a add a5,a5,t1
1108: ffe28593 addi a1,t0,-2
110c: ffd78513 addi a0,a5,-3
1110: 4701 li a4,0
1112: 4691 li a3,4
1114: d61a sw t1,44(sp)
1116: d416 sw t0,40(sp)
1118: d22e sw a1,36(sp)
111a: c83e sw a5,16(sp)
111c: 8a4ff0ef jal 1c0 <ssd1306_fillRect>
ssd1306_fillRect(x + rx - 3, y + cy - 2, 7, 4, 0);
1120: 4792 lw a5,4(sp)
1122: 5592 lw a1,36(sp)
1124: 4701 li a4,0
1126: 00878533 add a0,a5,s0
112a: 461d li a2,7
112c: 4691 li a3,4
112e: 1575 addi a0,a0,-3
1130: 890ff0ef jal 1c0 <ssd1306_fillRect>
if (rx - lx > 7)
1134: 5332 lw t1,44(sp)
1136: 471d li a4,7
1138: 47c2 lw a5,16(sp)
113a: 40640633 sub a2,s0,t1
113e: 52a2 lw t0,40(sp)
1140: 02c75263 bge a4,a2,1164 <main+0x69c>
ssd1306_drawFastHLine(x + lx + 4, y + cy - 1, rx - lx - 7, 0);
1144: 00478513 addi a0,a5,4
1148: 07f00793 li a5,127
114c: 00a7cc63 blt a5,a0,1164 <main+0x69c>
1150: fff28593 addi a1,t0,-1
1154: 03f00793 li a5,63
1158: 00b7c663 blt a5,a1,1164 <main+0x69c>
115c: 4681 li a3,0
115e: 1665 addi a2,a2,-7
1160: c06ff0ef jal 566 <ssd1306_drawFastHLine.part.0>
if (pet.form >= FORM_ROOT) { // gaming headset + mic boom
1164: 4732 lw a4,12(sp)
1166: 4785 li a5,1
1168: 0af70963 beq a4,a5,121a <main+0x752>
ssd1306_drawLine(x + 3, y + 10, x + 9, y + 2, 0);
116c: 4792 lw a5,4(sp)
116e: 078d addi a5,a5,3
1170: d23e sw a5,36(sp)
1172: 4782 lw a5,0(sp)
1174: 5512 lw a0,36(sp)
1176: 00a78413 addi s0,a5,10
117a: 4792 lw a5,4(sp)
117c: 85a2 mv a1,s0
117e: 07a5 addi a5,a5,9
1180: d43e sw a5,40(sp)
1182: 4782 lw a5,0(sp)
1184: 5622 lw a2,40(sp)
1186: 0789 addi a5,a5,2
1188: 86be mv a3,a5
118a: c83e sw a5,16(sp)
118c: c1eff0ef jal 5aa <ssd1306_drawLine.constprop.0>
ssd1306_drawLine(x + 9, y + 2, x + 23, y + 2, 0);
1190: 4792 lw a5,4(sp)
1192: 46c2 lw a3,16(sp)
1194: 5522 lw a0,40(sp)
1196: 07dd addi a5,a5,23
1198: 863e mv a2,a5
119a: 85b6 mv a1,a3
119c: d63e sw a5,44(sp)
119e: c0cff0ef jal 5aa <ssd1306_drawLine.constprop.0>
ssd1306_drawLine(x + 23, y + 2, x + 29, y + 10, 0);
11a2: 4792 lw a5,4(sp)
11a4: 45c2 lw a1,16(sp)
11a6: 5532 lw a0,44(sp)
11a8: 01d78613 addi a2,a5,29
11ac: 86a2 mv a3,s0
11ae: bfcff0ef jal 5aa <ssd1306_drawLine.constprop.0>
ssd1306_fillRect(x + 1, y + 12, 4, 7, 0);
11b2: 4782 lw a5,0(sp)
11b4: 469d li a3,7
11b6: 4611 li a2,4
11b8: 00c78593 addi a1,a5,12
11bc: 4792 lw a5,4(sp)
11be: 4701 li a4,0
11c0: 00178513 addi a0,a5,1
11c4: ffdfe0ef jal 1c0 <ssd1306_fillRect>
ssd1306_drawLine(x + 3, y + 18, x + 10, y + 24, 0);
11c8: 4782 lw a5,0(sp)
11ca: 5512 lw a0,36(sp)
11cc: 01878693 addi a3,a5,24
11d0: 4792 lw a5,4(sp)
11d2: 00a78613 addi a2,a5,10
11d6: 4782 lw a5,0(sp)
11d8: 01278593 addi a1,a5,18
11dc: bceff0ef jal 5aa <ssd1306_drawLine.constprop.0>
if (pet.form == FORM_CLAUDE) {
11e0: 4732 lw a4,12(sp)
11e2: 478d li a5,3
11e4: 02f71b63 bne a4,a5,121a <main+0x752>
ssd1306_drawPixel(x - 2 + (frame & 3), y + 4, 1);
11e8: c341a403 lw s0,-972(gp) # 20000030 <frame>
11ec: 4782 lw a5,0(sp)
11ee: 4605 li a2,1
11f0: 00347513 andi a0,s0,3
11f4: 00478593 addi a1,a5,4
11f8: 47a2 lw a5,8(sp)
11fa: 1579 addi a0,a0,-2
11fc: 953e add a0,a0,a5
11fe: f87fe0ef jal 184 <ssd1306_drawPixel>
ssd1306_drawPixel(x + PANA_W + (frame & 1), y + 10, 1);
1202: 4782 lw a5,0(sp)
1204: 00147513 andi a0,s0,1
1208: 02050513 addi a0,a0,32
120c: 00a78593 addi a1,a5,10
1210: 47a2 lw a5,8(sp)
1212: 4605 li a2,1
1214: 953e add a0,a0,a5
1216: f6ffe0ef jal 184 <ssd1306_drawPixel>
121a: 4685 li a3,1
121c: 08000613 li a2,128
1220: 02e00593 li a1,46
1224: 4501 li a0,0
1226: b40ff0ef jal 566 <ssd1306_drawFastHLine.part.0>
for (uint8_t i = 0; i < pet.poop; i++)
122a: 4401 li s0,0
122c: 00e4c783 lbu a5,14(s1)
1230: 20f46063 bltu s0,a5,1430 <main+0x968>
1234: 4401 li s0,0
ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0);
1236: 6709 lui a4,0x2
1238: 59470713 addi a4,a4,1428 # 2594 <menu_icons>
123c: 00241793 slli a5,s0,0x2
1240: 97ba add a5,a5,a4
1242: 00341493 slli s1,s0,0x3
1246: 4390 lw a2,0(a5)
1248: 94a2 add s1,s1,s0
124a: 4741 li a4,16
124c: 0486 slli s1,s1,0x1
124e: 86ba mv a3,a4
1250: 03000593 li a1,48
1254: 00148513 addi a0,s1,1
1258: d1eff0ef jal 776 <ssd1306_drawImage.constprop.0>
if (i == cursor)
125c: 5702 lw a4,32(sp)
125e: 0ff47793 zext.b a5,s0
1262: 00f71963 bne a4,a5,1274 <main+0x7ac>
ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1);
1266: 46c5 li a3,17
1268: 8636 mv a2,a3
126a: 02f00593 li a1,47
126e: 8526 mv a0,s1
1270: c4eff0ef jal 6be <ssd1306_drawRect.constprop.0>
for (uint8_t i = 0; i < ICON_COUNT; i++) {
1274: 0405 addi s0,s0,1
1276: 479d li a5,7
1278: faf41fe3 bne s0,a5,1236 <main+0x76e>
if (evo_anim) draw_evo_banner(); // celebratory overlay on top
127c: c501c783 lbu a5,-944(gp) # 2000004c <evo_anim>
1280: 2a078363 beqz a5,1526 <main+0xa5e>
ssd1306_fillRect(6, 18, SSD1306_W - 12, 24, 0);
1284: 4701 li a4,0
1286: 46e1 li a3,24
1288: 07400613 li a2,116
128c: 45c9 li a1,18
128e: 4519 li a0,6
1290: f31fe0ef jal 1c0 <ssd1306_fillRect>
ssd1306_drawRect(6, 18, SSD1306_W - 12, 24, 1);
1294: 46e1 li a3,24
1296: 07400613 li a2,116
129a: 45c9 li a1,18
129c: 4519 li a0,6
129e: c20ff0ef jal 6be <ssd1306_drawRect.constprop.0>
draw_center_str(21, ">> evolving");
12a2: 6589 lui a1,0x2
12a4: 9ec58593 addi a1,a1,-1556 # 19ec <main+0xf24>
12a8: 4555 li a0,21
12aa: a62ff0ef jal 50c <draw_center_str>
p = s_cat(p, "[ ");
12ae: 6589 lui a1,0x2
12b0: 9f858593 addi a1,a1,-1544 # 19f8 <main+0xf30>
12b4: 1868 addi a0,sp,60
12b6: feffe0ef jal 2a4 <s_cat>
p = s_cat(p, form_names[pet.form]);
12ba: 47b2 lw a5,12(sp)
12bc: 6709 lui a4,0x2
12be: 5b070713 addi a4,a4,1456 # 25b0 <form_names>
12c2: 078a slli a5,a5,0x2
12c4: 97ba add a5,a5,a4
12c6: 438c lw a1,0(a5)
12c8: fddfe0ef jal 2a4 <s_cat>
p = s_cat(p, " ]");
12cc: 6589 lui a1,0x2
12ce: 9fc58593 addi a1,a1,-1540 # 19fc <main+0xf34>
12d2: fd3fe0ef jal 2a4 <s_cat>
*p = 0;
12d6: 00050023 sb zero,0(a0)
draw_center_str(31, b);
12da: 186c addi a1,sp,60
12dc: 457d li a0,31
draw_center_str(56, "OK: respawn");
12de: a2eff0ef jal 50c <draw_center_str>
12e2: a491 j 1526 <main+0xa5e>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
12e4: fff7c693 not a3,a5
12e8: 86fd srai a3,a3,0x1f
12ea: 8ff5 and a5,a5,a3
12ec: b985 j f5c <main+0x494>
pet.sleeping = !pet.sleeping;
12ee: 00f4c503 lbu a0,15(s1)
beep(pet.sleeping ? 440 : 660, 120);
12f2: 07800593 li a1,120
pet.sleeping = !pet.sleeping;
12f6: 00153793 seqz a5,a0
beep(pet.sleeping ? 440 : 660, 120);
12fa: 00a03533 snez a0,a0
12fe: 40a00533 neg a0,a0
1302: 0dc57513 andi a0,a0,220
pet.sleeping = !pet.sleeping;
1306: 00f487a3 sb a5,15(s1)
beep(pet.sleeping ? 440 : 660, 120);
130a: 1b850513 addi a0,a0,440
130e: b925 j f46 <main+0x47e>
pet.happy = clamp100(pet.happy + 5);
1310: 00148783 lb a5,1(s1)
pet.hygiene = 100;
1314: 06400693 li a3,100
pet.poop = 0;
1318: 00048723 sb zero,14(s1)
pet.hygiene = 100;
131c: 00d481a3 sb a3,3(s1)
pet.happy = clamp100(pet.happy + 5);
1320: 0795 addi a5,a5,5
1322: c5418713 addi a4,gp,-940 # 20000050 <pet>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1326: 02f6d363 bge a3,a5,134c <main+0x884>
132a: 87b6 mv a5,a3
beep(1319, 50); beep(1047, 50);
132c: 03200593 li a1,50
1330: 52700513 li a0,1319
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1334: 00f700a3 sb a5,1(a4)
beep(1319, 50); beep(1047, 50);
1338: fdffe0ef jal 316 <beep>
133c: 41700513 li a0,1047
1340: 03200593 li a1,50
1344: fd3fe0ef jal 316 <beep>
add_xp(3);
1348: 450d li a0,3
134a: b9b9 j fa8 <main+0x4e0>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
134c: fff7c693 not a3,a5
1350: 86fd srai a3,a3,0x1f
1352: 8ff5 and a5,a5,a3
1354: bfe1 j 132c <main+0x864>
pet.health = clamp100(pet.health + 35);
1356: 00448783 lb a5,4(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
135a: 06400713 li a4,100
pet.health = clamp100(pet.health + 35);
135e: 02378793 addi a5,a5,35
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1362: 02f75663 bge a4,a5,138e <main+0x8c6>
1366: 87ba mv a5,a4
beep(784, 60); beep(1047, 60); beep(1319, 90);
1368: 03c00593 li a1,60
136c: 31000513 li a0,784
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1370: 00f48223 sb a5,4(s1)
beep(784, 60); beep(1047, 60); beep(1319, 90);
1374: fa3fe0ef jal 316 <beep>
1378: 03c00593 li a1,60
137c: 41700513 li a0,1047
1380: f97fe0ef jal 316 <beep>
1384: 05a00593 li a1,90
1388: 52700513 li a0,1319
138c: b661 j f14 <main+0x44c>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
138e: fff7c713 not a4,a5
1392: 877d srai a4,a4,0x1f
1394: 8ff9 and a5,a5,a4
1396: bfc9 j 1368 <main+0x8a0>
screen = SCR_STATS;
1398: 4789 li a5,2
139a: c4f18223 sb a5,-956(gp) # 20000040 <screen>
beep(659, 40);
139e: 02800593 li a1,40
13a2: 29300513 li a0,659
13a6: b645 j f46 <main+0x47e>
screen = SCR_SETTINGS;
13a8: 4791 li a5,4
13aa: c4f18223 sb a5,-956(gp) # 20000040 <screen>
set_sel = 0;
13ae: c2018da3 sb zero,-965(gp) # 20000037 <set_sel>
13b2: b7f5 j 139e <main+0x8d6>
uint32_t t = frame % 80;
13b4: c341a783 lw a5,-972(gp) # 20000030 <frame>
13b8: 05000593 li a1,80
13bc: 853e mv a0,a5
13be: c03e sw a5,0(sp)
13c0: d15fe0ef jal d4 <__umodsi3>
px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30
13c4: 02700713 li a4,39
13c8: 4782 lw a5,0(sp)
13ca: 00a76d63 bltu a4,a0,13e4 <main+0x91c>
13ce: 01e50713 addi a4,a0,30
13d2: c43a sw a4,8(sp)
13d4: 4722 lw a4,8(sp)
py = 14 + ((frame % 16) < 8 ? 0 : 1);
13d6: 8ba1 andi a5,a5,8
13d8: 00f037b3 snez a5,a5
13dc: 07b9 addi a5,a5,14
13de: c23a sw a4,4(sp)
13e0: c03e sw a5,0(sp)
13e2: b149 j 1064 <main+0x59c>
px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30
13e4: 06e00713 li a4,110
13e8: 8f09 sub a4,a4,a0
13ea: b7e5 j 13d2 <main+0x90a>
if (pet.sleeping) return EXP_SLEEP;
13ec: 4515 li a0,5
13ee: ca0414e3 bnez s0,1096 <main+0x5ce>
if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20)
13f2: 00448603 lb a2,4(s1)
13f6: 4775 li a4,29
return EXP_SAD;
13f8: 853e mv a0,a5
if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20)
13fa: c8c75ee3 bge a4,a2,1096 <main+0x5ce>
13fe: 00148603 lb a2,1(s1)
1402: 4761 li a4,24
1404: c8c759e3 bge a4,a2,1096 <main+0x5ce>
1408: 00048603 lb a2,0(s1)
140c: 474d li a4,19
140e: c8c754e3 bge a4,a2,1096 <main+0x5ce>
if ((frame % 50) < 4) return EXP_BLINK;
1412: c341a503 lw a0,-972(gp) # 20000030 <frame>
1416: 03200593 li a1,50
141a: c836 sw a3,16(sp)
141c: cb9fe0ef jal d4 <__umodsi3>
1420: 46c2 lw a3,16(sp)
1422: 00453513 sltiu a0,a0,4
1426: b985 j 1096 <main+0x5ce>
else if (pet.form == FORM_GLITCH) spr = spr_glitch;
1428: 6609 lui a2,0x2
142a: 44060613 addi a2,a2,1088 # 2440 <spr_glitch>
142e: b9b5 j 10aa <main+0x5e2>
ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0);
1430: 00141513 slli a0,s0,0x1
1434: 9522 add a0,a0,s0
1436: 4721 li a4,8
1438: 050a slli a0,a0,0x2
143a: 86ba mv a3,a4
143c: c1818613 addi a2,gp,-1000 # 20000014 <spr_poop>
1440: 02600593 li a1,38
1444: 953a add a0,a0,a4
for (uint8_t i = 0; i < pet.poop; i++)
1446: 0405 addi s0,s0,1
ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0);
1448: b2eff0ef jal 776 <ssd1306_drawImage.constprop.0>
for (uint8_t i = 0; i < pet.poop; i++)
144c: 0ff47413 zext.b s0,s0
1450: bbf1 j 122c <main+0x764>
if (any_edge) { screen = SCR_MAIN; beep(880, 30); }
1452: cb89 beqz a5,1464 <main+0x99c>
1454: 4785 li a5,1
1456: 45f9 li a1,30
1458: 37000513 li a0,880
145c: c4f18223 sb a5,-956(gp) # 20000040 <screen>
1460: eb7fe0ef jal 316 <beep>
ssd1306_setbuf(0);
1464: d9cff0ef jal a00 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "~/pet $ stat");
1468: 6589 lui a1,0x2
146a: a0058593 addi a1,a1,-1536 # 1a00 <main+0xf38>
146e: 4501 li a0,0
draw_bar(10, "FOOD", pet.satiety);
1470: c5418413 addi s0,gp,-940 # 20000050 <pet>
draw_center_str(0, "~/pet $ stat");
1474: 898ff0ef jal 50c <draw_center_str>
draw_bar(10, "FOOD", pet.satiety);
1478: 00040603 lb a2,0(s0)
147c: 6589 lui a1,0x2
147e: a1058593 addi a1,a1,-1520 # 1a10 <main+0xf48>
1482: 4529 li a0,10
1484: a90ff0ef jal 714 <draw_bar>
draw_bar(19, "HAPPY", pet.happy);
1488: 00140603 lb a2,1(s0)
148c: 6589 lui a1,0x2
148e: a1858593 addi a1,a1,-1512 # 1a18 <main+0xf50>
1492: 454d li a0,19
1494: a80ff0ef jal 714 <draw_bar>
draw_bar(28, "ENERGY", pet.energy);
1498: 00240603 lb a2,2(s0)
149c: 6589 lui a1,0x2
149e: a2058593 addi a1,a1,-1504 # 1a20 <main+0xf58>
14a2: 4571 li a0,28
14a4: a70ff0ef jal 714 <draw_bar>
draw_bar(37, "CLEAN", pet.hygiene);
14a8: 00340603 lb a2,3(s0)
14ac: 6589 lui a1,0x2
14ae: a2858593 addi a1,a1,-1496 # 1a28 <main+0xf60>
14b2: 02500513 li a0,37
14b6: a5eff0ef jal 714 <draw_bar>
draw_bar(46, "HEALTH", pet.health);
14ba: 00440603 lb a2,4(s0)
14be: 6589 lui a1,0x2
14c0: a3058593 addi a1,a1,-1488 # 1a30 <main+0xf68>
14c4: 02e00513 li a0,46
14c8: a4cff0ef jal 714 <draw_bar>
p = u_cat(p, pet.level);
14cc: 00b44483 lbu s1,11(s0)
*p++ = 'L';
14d0: 04c00793 li a5,76
p = u_cat(p, pet.level);
14d4: 03d10513 addi a0,sp,61
14d8: 85a6 mv a1,s1
*p++ = 'L';
14da: 02f10e23 sb a5,60(sp)
p = u_cat(p, pet.level);
14de: dd9fe0ef jal 2b6 <u_cat>
p = s_cat(p, " xp ");
14e2: 6589 lui a1,0x2
14e4: a3858593 addi a1,a1,-1480 # 1a38 <main+0xf70>
14e8: dbdfe0ef jal 2a4 <s_cat>
if (pet.level < MAX_LEVEL) {
14ec: 478d li a5,3
14ee: 0697e463 bltu a5,s1,1556 <main+0xa8e>
p = u_cat(p, pet.xp);
14f2: 00845583 lhu a1,8(s0)
p = u_cat(p, level_xp[pet.level]);
14f6: 0486 slli s1,s1,0x1
p = u_cat(p, pet.xp);
14f8: dbffe0ef jal 2b6 <u_cat>
*p++ = '/';
14fc: 02f00793 li a5,47
1500: 00f50023 sb a5,0(a0)
p = u_cat(p, level_xp[pet.level]);
1504: c2818793 addi a5,gp,-984 # 20000024 <level_xp>
1508: 94be add s1,s1,a5
150a: 0004d583 lhu a1,0(s1)
150e: 0505 addi a0,a0,1
1510: da7fe0ef jal 2b6 <u_cat>
*p = 0;
1514: 00050023 sb zero,0(a0)
ssd1306_drawstr(0, 56, line, 1);
1518: 4685 li a3,1
151a: 1870 addi a2,sp,60
151c: 03800593 li a1,56
1520: 4501 li a0,0
1522: cf7fe0ef jal 218 <ssd1306_drawstr>
ssd1306_refresh();
1526: d02ff0ef jal a28 <ssd1306_refresh>
uint16_t timeout = screen_timeout_opts[timeout_idx];
152a: c041c703 lbu a4,-1020(gp) # 20000000 <timeout_idx>
152e: c2018793 addi a5,gp,-992 # 2000001c <screen_timeout_opts>
1532: 0706 slli a4,a4,0x1
1534: 97ba add a5,a5,a4
1536: 0007d783 lhu a5,0(a5)
if (timeout && idle_frames >= timeout) {
153a: f8078a63 beqz a5,cce <main+0x206>
153e: c401a703 lw a4,-960(gp) # 2000003c <idle_frames>
1542: f8f76663 bltu a4,a5,cce <main+0x206>
ssd1306_cmd(SSD1306_DISPLAYOFF);
1546: 0ae00513 li a0,174
154a: c06ff0ef jal 950 <ssd1306_cmd>
disp_on = 0;
154e: c00182a3 sb zero,-1019(gp) # 20000001 <disp_on>
1552: f7cff06f j cce <main+0x206>
p = s_cat(p, "MAX");
1556: 6589 lui a1,0x2
1558: a4058593 addi a1,a1,-1472 # 1a40 <main+0xf78>
155c: d49fe0ef jal 2a4 <s_cat>
1560: bf55 j 1514 <main+0xa4c>
if (left_edge) {
1562: c185 beqz a1,1582 <main+0xaba>
set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS;
1564: c3b1c503 lbu a0,-965(gp) # 20000037 <set_sel>
1568: 458d li a1,3
156a: c236 sw a3,4(sp)
156c: 0509 addi a0,a0,2
156e: b8bfe0ef jal f8 <__modsi3>
1572: c2a18da3 sb a0,-965(gp) # 20000037 <set_sel>
beep(1047, 25);
1576: 45e5 li a1,25
1578: 41700513 li a0,1047
157c: d9bfe0ef jal 316 <beep>
1580: 4692 lw a3,4(sp)
if (right_edge) {
1582: ce91 beqz a3,159e <main+0xad6>
set_sel = (set_sel + 1) % SETTINGS_ROWS;
1584: c3b1c503 lbu a0,-965(gp) # 20000037 <set_sel>
1588: 458d li a1,3
158a: 0505 addi a0,a0,1
158c: b6dfe0ef jal f8 <__modsi3>
1590: c2a18da3 sb a0,-965(gp) # 20000037 <set_sel>
beep(1047, 25);
1594: 45e5 li a1,25
1596: 41700513 li a0,1047
159a: d7dfe0ef jal 316 <beep>
if (ok_edge) {
159e: 4782 lw a5,0(sp)
15a0: cf95 beqz a5,15dc <main+0xb14>
if (set_sel == 0) { // cycle screen-off timeout
15a2: c3b1c703 lbu a4,-965(gp) # 20000037 <set_sel>
15a6: ef01 bnez a4,15be <main+0xaf6>
timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT;
15a8: c041c783 lbu a5,-1020(gp) # 20000000 <timeout_idx>
beep(880, 40);
15ac: 02800593 li a1,40
timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT;
15b0: 0785 addi a5,a5,1
15b2: 8b8d andi a5,a5,3
15b4: c0f18223 sb a5,-1020(gp) # 20000000 <timeout_idx>
beep(880, 30);
15b8: 37000513 li a0,880
15bc: a831 j 15d8 <main+0xb10>
} else if (set_sel == 1) { // toggle sound
15be: 4785 li a5,1
15c0: 0ef71963 bne a4,a5,16b2 <main+0xbea>
sound_on = !sound_on;
15c4: c061c783 lbu a5,-1018(gp) # 20000002 <sound_on>
beep(988, 60); // only audible if just enabled
15c8: 03c00593 li a1,60
15cc: 3dc00513 li a0,988
sound_on = !sound_on;
15d0: 0017b793 seqz a5,a5
15d4: c0f18323 sb a5,-1018(gp) # 20000002 <sound_on>
beep(880, 30);
15d8: d3ffe0ef jal 316 <beep>
ssd1306_setbuf(0);
15dc: c24ff0ef jal a00 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "- SETTINGS -");
15e0: 6589 lui a1,0x2
15e2: a4458593 addi a1,a1,-1468 # 1a44 <main+0xf7c>
15e6: 4501 li a0,0
15e8: f25fe0ef jal 50c <draw_center_str>
15ec: 4685 li a3,1
15ee: 08000613 li a2,128
15f2: 45a9 li a1,10
15f4: 4501 li a0,0
15f6: f71fe0ef jal 566 <ssd1306_drawFastHLine.part.0>
*s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0;
15fa: 6589 lui a1,0x2
15fc: a5458593 addi a1,a1,-1452 # 1a54 <main+0xf8c>
1600: 1868 addi a0,sp,60
1602: ca3fe0ef jal 2a4 <s_cat>
1606: c041c703 lbu a4,-1020(gp) # 20000000 <timeout_idx>
160a: 6789 lui a5,0x2
160c: 5e078793 addi a5,a5,1504 # 25e0 <screen_timeout_names>
1610: 070a slli a4,a4,0x2
1612: 97ba add a5,a5,a4
1614: 438c lw a1,0(a5)
1616: c8ffe0ef jal 2a4 <s_cat>
*s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0;
161a: 6589 lui a1,0x2
*s_cat(s_cat(rows[0], "Screen off:"), screen_timeout_names[timeout_idx]) = 0;
161c: 00050023 sb zero,0(a0)
*s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0;
1620: a6058593 addi a1,a1,-1440 # 1a60 <main+0xf98>
1624: 04d10513 addi a0,sp,77
1628: c7dfe0ef jal 2a4 <s_cat>
162c: c061c783 lbu a5,-1018(gp) # 20000002 <sound_on>
1630: c7c9 beqz a5,16ba <main+0xbf2>
1632: 6589 lui a1,0x2
1634: 97c58593 addi a1,a1,-1668 # 197c <main+0xeb4>
1638: c6dfe0ef jal 2a4 <s_cat>
*s_cat(rows[2], "Back") = 0;
163c: 6589 lui a1,0x2
*s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0;
163e: 00050023 sb zero,0(a0)
*s_cat(rows[2], "Back") = 0;
1642: a6858593 addi a1,a1,-1432 # 1a68 <main+0xfa0>
1646: 05e10513 addi a0,sp,94
164a: c5bfe0ef jal 2a4 <s_cat>
164e: 00050023 sb zero,0(a0)
1652: 44c5 li s1,17
1654: 4401 li s0,0
int y = 18 + r * 12;
1656: 00148793 addi a5,s1,1
165a: c03e sw a5,0(sp)
if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1);
165c: c3b1c303 lbu t1,-965(gp) # 20000037 <set_sel>
1660: 0ff47293 zext.b t0,s0
1664: 00531e63 bne t1,t0,1680 <main+0xbb8>
1668: 4705 li a4,1
166a: 46a9 li a3,10
166c: 08000613 li a2,128
1670: 85a6 mv a1,s1
1672: 4501 li a0,0
1674: c216 sw t0,4(sp)
1676: c01a sw t1,0(sp)
1678: b49fe0ef jal 1c0 <ssd1306_fillRect>
167c: 4292 lw t0,4(sp)
167e: 4302 lw t1,0(sp)
ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1);
1680: 00441613 slli a2,s0,0x4
1684: 405306b3 sub a3,t1,t0
1688: 9622 add a2,a2,s0
168a: 187c addi a5,sp,60
168c: 00148593 addi a1,s1,1
1690: 00d036b3 snez a3,a3
1694: 963e add a2,a2,a5
1696: 4511 li a0,4
1698: b81fe0ef jal 218 <ssd1306_drawstr>
for (uint8_t r = 0; r < SETTINGS_ROWS; r++) {
169c: 04b1 addi s1,s1,12
169e: 03500713 li a4,53
16a2: 0405 addi s0,s0,1
16a4: fae499e3 bne s1,a4,1656 <main+0xb8e>
draw_center_str(56, "L/R move OK use");
16a8: 6589 lui a1,0x2
16aa: a7058593 addi a1,a1,-1424 # 1a70 <main+0xfa8>
16ae: fbaff06f j e68 <main+0x3a0>
screen = SCR_MAIN;
16b2: c4f18223 sb a5,-956(gp) # 20000040 <screen>
beep(880, 30);
16b6: 45f9 li a1,30
16b8: b701 j 15b8 <main+0xaf0>
*s_cat(s_cat(rows[1], "Sound: "), sound_on ? "On" : "Off") = 0;
16ba: 6589 lui a1,0x2
16bc: 98458593 addi a1,a1,-1660 # 1984 <main+0xebc>
16c0: bfa5 j 1638 <main+0xb70>
if (ok_edge) { // back to the welcome screen to re-pick
16c2: 4782 lw a5,0(sp)
16c4: cf99 beqz a5,16e2 <main+0xc1a>
beep(659, 80); beep(988, 120);
16c6: 05000593 li a1,80
16ca: 29300513 li a0,659
screen = SCR_SELECT;
16ce: c4018223 sb zero,-956(gp) # 20000040 <screen>
beep(659, 80); beep(988, 120);
16d2: c45fe0ef jal 316 <beep>
16d6: 07800593 li a1,120
16da: 3dc00513 li a0,988
16de: c39fe0ef jal 316 <beep>
ssd1306_setbuf(0);
16e2: b1eff0ef jal a00 <ssd1306_setbuf.constprop.0>
ssd1306_drawImage(48, 2, spr_grave, 32, 32, 0);
16e6: 02000713 li a4,32
16ea: 6609 lui a2,0x2
16ec: 86ba mv a3,a4
16ee: 5f060613 addi a2,a2,1520 # 25f0 <spr_grave>
16f2: 4589 li a1,2
16f4: 03000513 li a0,48
16f8: 87eff0ef jal 776 <ssd1306_drawImage.constprop.0>
draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)");
16fc: c5418713 addi a4,gp,-940 # 20000050 <pet>
1700: 00d74683 lbu a3,13(a4)
1704: 4709 li a4,2
1706: c5418413 addi s0,gp,-940 # 20000050 <pet>
170a: 02e69f63 bne a3,a4,1748 <main+0xc80>
170e: 6589 lui a1,0x2
1710: 98858593 addi a1,a1,-1656 # 1988 <main+0xec0>
1714: 02400513 li a0,36
1718: df5fe0ef jal 50c <draw_center_str>
p = s_cat(p, "core dumped L");
171c: 6589 lui a1,0x2
171e: a8458593 addi a1,a1,-1404 # 1a84 <main+0xfbc>
1722: 1868 addi a0,sp,60
1724: b81fe0ef jal 2a4 <s_cat>
p = u_cat(p, pet.level);
1728: 00b44583 lbu a1,11(s0)
172c: b8bfe0ef jal 2b6 <u_cat>
*p = 0;
1730: 00050023 sb zero,0(a0)
draw_center_str(46, line);
1734: 186c addi a1,sp,60
1736: 02e00513 li a0,46
173a: dd3fe0ef jal 50c <draw_center_str>
draw_center_str(56, "OK: respawn");
173e: 6589 lui a1,0x2
1740: a9458593 addi a1,a1,-1388 # 1a94 <main+0xfcc>
1744: f24ff06f j e68 <main+0x3a0>
draw_center_str(36, pet.ascend == 2 ? "** CORRUPTED **" : "SEGFAULT (11)");
1748: 6589 lui a1,0x2
174a: 99858593 addi a1,a1,-1640 # 1998 <main+0xed0>
174e: b7d9 j 1714 <main+0xc4c>
pet.age_min++;
1750: 00645603 lhu a2,6(s0)
pet.satiety = clamp100(pet.satiety - 1);
1754: 00040783 lb a5,0(s0)
tick_acc = 0;
1758: c2019c23 sh zero,-968(gp) # 20000034 <tick_acc>
pet.age_min++;
175c: 0605 addi a2,a2,1
175e: 0642 slli a2,a2,0x10
1760: 8241 srli a2,a2,0x10
1762: 00c41323 sh a2,6(s0)
pet.satiety = clamp100(pet.satiety - 1);
1766: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1768: 06400713 li a4,100
if (pet.sleeping) {
176c: 00f44683 lbu a3,15(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1770: 08f75463 bge a4,a5,17f8 <main+0xd30>
1774: 87ba mv a5,a4
1776: 07e2 slli a5,a5,0x18
pet.energy = clamp100(pet.energy + 6);
1778: 00240703 lb a4,2(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
177c: 87e1 srai a5,a5,0x18
177e: 06400513 li a0,100
if (pet.sleeping) {
1782: c6c9 beqz a3,180c <main+0xd44>
pet.energy = clamp100(pet.energy + 6);
1784: 00670593 addi a1,a4,6
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1788: 06b55d63 bge a0,a1,1802 <main+0xd3a>
178c: 85aa mv a1,a0
pet.satiety = clamp100(pet.satiety - 1);
178e: 00f40023 sb a5,0(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1792: 00b40123 sb a1,2(s0)
if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested
1796: 05d00793 li a5,93
179a: 00e7d563 bge a5,a4,17a4 <main+0xcdc>
179e: 000407a3 sb zero,15(s0)
17a2: 4681 li a3,0
if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1);
17a4: 00167713 andi a4,a2,1
17a8: cb19 beqz a4,17be <main+0xcf6>
17aa: 00340783 lb a5,3(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17ae: 06400593 li a1,100
if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1);
17b2: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17b4: 08f5da63 bge a1,a5,1848 <main+0xd80>
17b8: 87ae mv a5,a1
17ba: 00f401a3 sb a5,3(s0)
if (!pet.sleeping && pet.poop < 3 &&
17be: 00e44583 lbu a1,14(s0)
17c2: eac1 bnez a3,1852 <main+0xd8a>
17c4: 4789 li a5,2
17c6: 00b7ed63 bltu a5,a1,17e0 <main+0xd18>
((pet.age_min * 7u + frame) & 0x1F) == 0)
17ca: 00361793 slli a5,a2,0x3
17ce: 8f91 sub a5,a5,a2
17d0: c341a603 lw a2,-972(gp) # 20000030 <frame>
17d4: 97b2 add a5,a5,a2
17d6: 8bfd andi a5,a5,31
if (!pet.sleeping && pet.poop < 3 &&
17d8: efad bnez a5,1852 <main+0xd8a>
pet.poop++;
17da: 0585 addi a1,a1,1
17dc: 00b40723 sb a1,14(s0)
if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
17e0: cb35 beqz a4,1854 <main+0xd8c>
17e2: 00140783 lb a5,1(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17e6: 06400613 li a2,100
if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
17ea: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17ec: 14f65363 bge a2,a5,1932 <main+0xe6a>
17f0: 87b2 mv a5,a2
17f2: 00f400a3 sb a5,1(s0)
17f6: a8b9 j 1854 <main+0xd8c>
17f8: fff7c713 not a4,a5
17fc: 877d srai a4,a4,0x1f
17fe: 8ff9 and a5,a5,a4
1800: bf9d j 1776 <main+0xcae>
1802: fff5c513 not a0,a1
1806: 857d srai a0,a0,0x1f
1808: 8de9 and a1,a1,a0
180a: b751 j 178e <main+0xcc6>
pet.satiety = clamp100(pet.satiety - 1);
180c: 00f40023 sb a5,0(s0)
pet.energy = clamp100(pet.energy - 1);
1810: fff70793 addi a5,a4,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1814: 02f55063 bge a0,a5,1834 <main+0xd6c>
1818: 87aa mv a5,a0
181a: 00f40123 sb a5,2(s0)
pet.happy = clamp100(pet.happy - 1);
181e: 00140783 lb a5,1(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1822: 06400713 li a4,100
pet.happy = clamp100(pet.happy - 1);
1826: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1828: 00f75b63 bge a4,a5,183e <main+0xd76>
182c: 87ba mv a5,a4
182e: 00f400a3 sb a5,1(s0)
1832: bf8d j 17a4 <main+0xcdc>
1834: fff7c713 not a4,a5
1838: 877d srai a4,a4,0x1f
183a: 8ff9 and a5,a5,a4
183c: bff9 j 181a <main+0xd52>
183e: fff7c713 not a4,a5
1842: 877d srai a4,a4,0x1f
1844: 8ff9 and a5,a5,a4
1846: b7e5 j 182e <main+0xd66>
1848: fff7c593 not a1,a5
184c: 85fd srai a1,a1,0x1f
184e: 8fed and a5,a5,a1
1850: b7ad j 17ba <main+0xcf2>
if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
1852: f5d9 bnez a1,17e0 <main+0xd18>
if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
1854: 00340603 lb a2,3(s0)
1858: 47cd li a5,19
185a: 00c7cd63 blt a5,a2,1874 <main+0xdac>
185e: cb19 beqz a4,1874 <main+0xdac>
1860: 00140783 lb a5,1(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1864: 06400713 li a4,100
if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
1868: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
186a: 0cf75963 bge a4,a5,193c <main+0xe74>
186e: 87ba mv a5,a4
1870: 00f400a3 sb a5,1(s0)
if (pet.hygiene < lo) lo = pet.hygiene;
1874: 00044703 lbu a4,0(s0)
1878: 87ba mv a5,a4
187a: 0762 slli a4,a4,0x18
187c: 8761 srai a4,a4,0x18
187e: 00e65363 bge a2,a4,1884 <main+0xdbc>
1882: 87b2 mv a5,a2
1884: 00144703 lbu a4,1(s0)
1888: 01879593 slli a1,a5,0x18
188c: 85e1 srai a1,a1,0x18
188e: 01871613 slli a2,a4,0x18
1892: 8661 srai a2,a2,0x18
1894: 00b65363 bge a2,a1,189a <main+0xdd2>
1898: 87ba mv a5,a4
189a: 00244703 lbu a4,2(s0)
189e: 01879593 slli a1,a5,0x18
18a2: 85e1 srai a1,a1,0x18
18a4: 01871613 slli a2,a4,0x18
18a8: 8661 srai a2,a2,0x18
18aa: 00b65363 bge a2,a1,18b0 <main+0xde8>
18ae: 87ba mv a5,a4
18b0: 01879713 slli a4,a5,0x18
18b4: 8761 srai a4,a4,0x18
if (lo < 15) pet.health = clamp100(pet.health - 3);
18b6: 4639 li a2,14
18b8: 00440783 lb a5,4(s0)
18bc: 08e64a63 blt a2,a4,1950 <main+0xe88>
18c0: 17f5 addi a5,a5,-3
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
18c2: 06400713 li a4,100
18c6: 08f75063 bge a4,a5,1946 <main+0xe7e>
18ca: 87ba mv a5,a4
18cc: 00f40223 sb a5,4(s0)
notify(N_FOOD, pet.satiety);
18d0: 00040583 lb a1,0(s0)
18d4: 4501 li a0,0
18d6: ba9fe0ef jal 47e <notify>
notify(N_FUN, pet.happy);
18da: 00140583 lb a1,1(s0)
18de: 4505 li a0,1
18e0: b9ffe0ef jal 47e <notify>
notify(N_ENGY, pet.energy);
18e4: 00240583 lb a1,2(s0)
18e8: 4509 li a0,2
18ea: b95fe0ef jal 47e <notify>
notify(N_WASH, pet.hygiene);
18ee: 00340583 lb a1,3(s0)
18f2: 450d li a0,3
18f4: b8bfe0ef jal 47e <notify>
if (pet.health <= 0) {
18f8: 00440783 lb a5,4(s0)
18fc: c0f04763 bgtz a5,d0a <main+0x242>
screen = SCR_DEAD;
1900: 470d li a4,3
beep(330, 200); beep(247, 200); beep(165, 400);
1902: 0c800593 li a1,200
1906: 14a00513 li a0,330
screen = SCR_DEAD;
190a: c4e18223 sb a4,-956(gp) # 20000040 <screen>
pet.alive = 0;
190e: 00040823 sb zero,16(s0)
beep(330, 200); beep(247, 200); beep(165, 400);
1912: a05fe0ef jal 316 <beep>
1916: 0c800593 li a1,200
191a: 0f700513 li a0,247
191e: 9f9fe0ef jal 316 <beep>
1922: 19000593 li a1,400
1926: 0a500513 li a0,165
192a: 9edfe0ef jal 316 <beep>
192e: bdcff06f j d0a <main+0x242>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1932: fff7c613 not a2,a5
1936: 867d srai a2,a2,0x1f
1938: 8ff1 and a5,a5,a2
193a: bd65 j 17f2 <main+0xd2a>
193c: fff7c713 not a4,a5
1940: 877d srai a4,a4,0x1f
1942: 8ff9 and a5,a5,a4
1944: b735 j 1870 <main+0xda8>
1946: fff7c713 not a4,a5
194a: 877d srai a4,a4,0x1f
194c: 8ff9 and a5,a5,a4
194e: bfbd j 18cc <main+0xe04>
else if (lo > 50) pet.health = clamp100(pet.health + 2);
1950: 03200613 li a2,50
1954: f6e65ee3 bge a2,a4,18d0 <main+0xe08>
1958: 0789 addi a5,a5,2
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
195a: 06400713 li a4,100
195e: 00f75a63 bge a4,a5,1972 <main+0xeaa>
1962: 87ba mv a5,a4
1964: 00f40223 sb a5,4(s0)
if (lo > 50 && !pet.sleeping) add_xp(3);
1968: f6a5 bnez a3,18d0 <main+0xe08>
196a: 450d li a0,3
196c: a45fe0ef jal 3b0 <add_xp>
1970: b785 j 18d0 <main+0xe08>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1972: fff7c713 not a4,a5
1976: 877d srai a4,a4,0x1f
1978: 8ff9 and a5,a5,a4
197a: b7ed j 1964 <main+0xe9c>
197c: 00006e4f .insn 4, 0x6e4f
1980: 0000 unimp
1982: 0000 unimp
1984: 0066664f .insn 4, 0x0066664f
1988: 2a2a .insn 2, 0x2a2a
198a: 4320 lw s0,64(a4)
198c: 5552524f .insn 4, 0x5552524f
1990: 5450 lw a2,44(s0)
1992: 4445 li s0,17
1994: 2a20 .insn 2, 0x2a20
1996: 002a c.slli zero,0xa
1998: 46474553 .insn 4, 0x46474553
199c: 5541 li a0,-16
199e: 544c lw a1,44(s0)
19a0: 2820 .insn 2, 0x2820
19a2: 3131 jal 15ae <main+0xae6>
19a4: 0029 c.nop 10
19a6: 0000 unimp
19a8: 7270 .insn 2, 0x7270
19aa: 7365 lui t1,0xffff9
19ac: 6e612073 .insn 4, 0x6e612073
19b0: 2079 jal 1a3e <main+0xf76>
19b2: 0079656b .insn 4, 0x0079656b
19b6: 0000 unimp
19b8: 207e .insn 2, 0x207e
19ba: 2024 .insn 2, 0x2024
19bc: 6461 lui s0,0x18
19be: 2074706f j 493c4 <tama.c.96f78ea9+0x45460>
19c2: 2d2d jal 1ffc <pana_happy+0x58>
19c4: 6570 .insn 2, 0x6570
19c6: 0074 addi a3,sp,12
19c8: 203c .insn 2, 0x203c
19ca: 0000 unimp
19cc: 3e20 .insn 2, 0x3e20
19ce: 0000 unimp
19d0: 2f4c .insn 2, 0x2f4c
19d2: 2052 .insn 2, 0x2052
19d4: 6970 .insn 2, 0x6970
19d6: 20206b63 bltu zero,sp,1bec <tmux_sleep+0x48>
19da: 67204b4f .insn 4, 0x67204b4f
19de: 0021006f j 119e0 <tama.c.96f78ea9+0xda7c>
19e2: 0000 unimp
19e4: 007a c.slli zero,0x1e
19e6: 0000 unimp
19e8: 005a c.slli zero,0x16
19ea: 0000 unimp
19ec: 3e3e .insn 2, 0x3e3e
19ee: 6520 .insn 2, 0x6520
19f0: 6f76 .insn 2, 0x6f76
19f2: 766c .insn 2, 0x766c
19f4: 6e69 lui t3,0x1a
19f6: 205b0067 jr 517(s6)
19fa: 0000 unimp
19fc: 5d20 lw s0,120(a0)
19fe: 0000 unimp
1a00: 2f7e .insn 2, 0x2f7e
1a02: 6570 .insn 2, 0x6570
1a04: 2074 .insn 2, 0x2074
1a06: 2024 .insn 2, 0x2024
1a08: 74617473 .insn 4, 0x74617473
1a0c: 0000 unimp
1a0e: 0000 unimp
1a10: 4f46 lw t5,80(sp)
1a12: 0000444f .insn 4, 0x444f
1a16: 0000 unimp
1a18: 4148 lw a0,4(a0)
1a1a: 5050 lw a2,36(s0)
1a1c: 0059 c.nop 22
1a1e: 0000 unimp
1a20: 4e45 li t3,17
1a22: 5245 li tp,-15
1a24: 00005947 .insn 4, 0x5947
1a28: 41454c43 .insn 4, 0x41454c43
1a2c: 004e c.slli zero,0x13
1a2e: 0000 unimp
1a30: 4548 lw a0,12(a0)
1a32: 4c41 li s8,16
1a34: 4854 lw a3,20(s0)
1a36: 0000 unimp
1a38: 2020 .insn 2, 0x2020
1a3a: 7078 .insn 2, 0x7078
1a3c: 0020 addi s0,sp,8
1a3e: 0000 unimp
1a40: 414d li sp,19
1a42: 0058 addi a4,sp,4
1a44: 202d jal 1a6e <main+0xfa6>
1a46: 54544553 .insn 4, 0x54544553
1a4a: 4e49 li t3,18
1a4c: 2d205347 .insn 4, 0x2d205347
1a50: 0000 unimp
1a52: 0000 unimp
1a54: 65726353 .insn 4, 0x65726353
1a58: 6e65 lui t3,0x19
1a5a: 6f20 .insn 2, 0x6f20
1a5c: 6666 .insn 2, 0x6666
1a5e: 003a c.slli zero,0xe
1a60: 6e756f53 .insn 4, 0x6e756f53
1a64: 3a64 .insn 2, 0x3a64
1a66: 0020 addi s0,sp,8
1a68: 6142 .insn 2, 0x6142
1a6a: 00006b63 bltu zero,zero,1a80 <main+0xfb8>
1a6e: 0000 unimp
1a70: 2f4c .insn 2, 0x2f4c
1a72: 2052 .insn 2, 0x2052
1a74: 6f6d lui t5,0x1b
1a76: 6576 .insn 2, 0x6576
1a78: 2020 .insn 2, 0x2020
1a7a: 75204b4f .insn 4, 0x75204b4f
1a7e: 00006573 .insn 4, 0x6573
1a82: 0000 unimp
1a84: 65726f63 bltu tp,s7,20e2 <pana_idle+0x3e>
1a88: 6420 .insn 2, 0x6420
1a8a: 6d75 lui s10,0x1d
1a8c: 6570 .insn 2, 0x6570
1a8e: 2064 .insn 2, 0x2064
1a90: 004c addi a1,sp,4
1a92: 0000 unimp
1a94: 203a4b4f .insn 4, 0x203a4b4f
1a98: 6572 .insn 2, 0x6572
1a9a: 77617073 .insn 4, 0x77617073
1a9e: 006e c.slli zero,0x1b
1aa0: 6170 .insn 2, 0x6170
1aa2: 616e .insn 2, 0x616e
1aa4: 63746f67 .insn 4, 0x63746f67
1aa8: 6968 .insn 2, 0x6968
1aaa: 7620 .insn 2, 0x7620
1aac: 0032 c.slli zero,0xc
1aae: 0000 unimp
1ab0: 6f62 .insn 2, 0x6f62
1ab2: 6e69746f jal s0,99198 <tama.c.96f78ea9+0x95234>
1ab6: 656b2067 .insn 4, 0x656b2067
1aba: 6e72 .insn 2, 0x6e72
1abc: 6c65 lui s8,0x19
1abe: 2e2e .insn 2, 0x2e2e
1ac0: 0000 unimp
1ac2: 0000 unimp
1ac4: 6f6d lui t5,0x1b
1ac6: 6e75 lui t3,0x1d
1ac8: 2074 .insn 2, 0x2074
1aca: 7465702f .insn 4, 0x7465702f
1ace: 2020 .insn 2, 0x2020
1ad0: 00006b6f jal s6,7ad0 <tama.c.96f78ea9+0x3b6c>
1ad4: 77617073 .insn 4, 0x77617073
1ad8: 206e .insn 2, 0x206e
1ada: 6c656873 .insn 4, 0x6c656873
1ade: 206c .insn 2, 0x206c
1ae0: 6f20 .insn 2, 0x6f20
1ae2: 203e006b .insn 4, 0x203e006b
1ae6: 2f2e .insn 2, 0x2f2e
1ae8: 6174 .insn 2, 0x6174
1aea: 616d addi sp,sp,240
1aec: 63746f67 .insn 4, 0x63746f67
1af0: 6968 .insn 2, 0x6968
1af2: 005f 6853 6c65 .insn 6, 0x6c656853005f
1af8: 006c addi a1,sp,12
1afa: 0000 unimp
1afc: 6150 .insn 2, 0x6150
1afe: 6b6e .insn 2, 0x6b6e
1b00: 0000006f j 1b00 <main+0x1038>
1b04: 6d54 .insn 2, 0x6d54
1b06: 7875 lui a6,0xffffd
1b08: 0000 unimp
1b0a: 0000 unimp
1b0c: 7270 .insn 2, 0x7270
1b0e: 0000636f jal t1,7b0e <tama.c.96f78ea9+0x3baa>
1b12: 0000 unimp
1b14: 7375 lui t1,0xffffd
1b16: 7265 lui tp,0xffff9
1b18: 0000 unimp
1b1a: 0000 unimp
1b1c: 6f72 .insn 2, 0x6f72
1b1e: 0000746f jal s0,8b1e <tama.c.96f78ea9+0x4bba>
1b22: 0000 unimp
1b24: 75616c43 .insn 4, 0x75616c43
1b28: 6564 .insn 2, 0x6564
1b2a: 0000 unimp
1b2c: 74696c67 .insn 4, 0x74696c67
1b30: 00006863 bltu zero,zero,1b40 <main+0x1078>
1b34: 4546 lw a0,80(sp)
1b36: 4445 li s0,17
1b38: 0000 unimp
1b3a: 0000 unimp
1b3c: 4c50 lw a2,28(s0)
1b3e: 5941 li s2,-16
1b40: 0000 unimp
1b42: 0000 unimp
1b44: 45454c53 .insn 4, 0x45454c53
1b48: 0050 addi a2,sp,4
1b4a: 0000 unimp
1b4c: 4548 lw a0,12(a0)
1b4e: 4c41 li s8,16
1b50: 0000 unimp
1b52: 0000 unimp
1b54: 54415453 .insn 4, 0x54415453
1b58: 00000053 .insn 4, 0x0053
1b5c: 54544553 .insn 4, 0x54544553
1b60: 4e49 li t3,18
1b62: 00005347 .insn 4, 0x5347
1b66: 0000 unimp
1b68: 3531 jal 1974 <main+0xeac>
1b6a: 30330073 .insn 4, 0x30330073
1b6e: 30360073 .insn 4, 0x30360073
1b72: 0d4a0073 .insn 4, 0x0d4a0073
1b76: 0000 unimp
1b78: 0e6e slli t3,t3,0x1b
1b7a: 0000 unimp
1b7c: 1452 slli s0,s0,0x34
1b7e: 0000 unimp
1b80: 16c2 slli a3,a3,0x30
1b82: 0000 unimp
1b84: 1562 slli a0,a0,0x38
1b86: 0000 unimp
1b88: 0ecc addi a1,sp,852
1b8a: 0000 unimp
1b8c: 0f34 addi a3,sp,920
1b8e: 0000 unimp
1b90: 12ee slli t0,t0,0x3b
1b92: 0000 unimp
1b94: 1310 addi a2,sp,416
1b96: 0000 unimp
1b98: 1356 slli t1,t1,0x35
1b9a: 0000 unimp
1b9c: 1398 addi a4,sp,480
1b9e: 0000 unimp
1ba0: 13a8 addi a0,sp,488
...
00001ba4 <tmux_sleep>:
...
1bb0: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?...
1bc0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?...
1bd0: ff3f fc7f ff3f fc7f 073c 1c70 ff3f fc7f ?...?...<.p.?...
1be0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?...
1bf0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?...
1c00: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'...
1c10: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ...............
1c20: 0000 0000 ....
00001c24 <tmux_sad>:
...
1c30: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?...
1c40: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?...
1c50: bf3f fc7e 1f3f 7c7c 0f3e 3c78 1f3f 7c7c ?.~.?.||>.x<?.||
1c60: bf3f fc7e ff3f fc7f ff3f fc7f ff3f fc7f ?.~.?...?...?...
1c70: bf3f fc7e 073c 1c70 ff3f fc7f ff3f fc7f ?.~.<.p.?...?...
1c80: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'...
1c90: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ...............
1ca0: 0000 0000 ....
00001ca4 <tmux_happy>:
...
1cb0: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?...
1cc0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?...
1cd0: 5f3f 7c7d af3e bc7a ff3f fc7f ff3f fc7f ?_}|>.z.?...?...
1ce0: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?...
1cf0: 033c 1c60 ff3f fc7f ff3f fc7f ff3f fc7f <.`.?...?...?...
1d00: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'...
1d10: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ...............
1d20: 0000 0000 ....
00001d24 <tmux_idle>:
...
1d30: ff1f f8ff ff3f fcff ff3f fc7f ff3f fc7f ....?...?...?...
1d40: ff3f fc7f ff3f fc7f ff3f fc7f bf3f fc7e ?...?...?...?.~.
1d50: 1f3f 7c7c 0f3e 3c78 1f3f 7c7c bf3f fc7e ?.||>.x<?.||?.~.
1d60: ff3f fc7f ff3f fc7f ff3f fc7f 073c 1c70 ?...?...?...<.p.
1d70: ff3f fc7f ff3f fc7f ff3f fc7f ff3f fc7f ?...?...?...?...
1d80: ff3f fcff 0020 0400 df27 0400 df27 0400 ?... ...'...'...
1d90: 0020 0400 ff1f f8ff 0000 0000 0000 0000 ...............
1da0: 0000 0000 ....
00001da4 <pana_dead>:
1da4: 0000 0080 1000 0088 1100 0088 3100 008c .............1..
1db4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;..........
1dc4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?.............
1dd4: ff01 80ff ff03 c0ff ff03 c0ff db03 c0db ................
1de4: e703 c0e7 e703 c0e7 db03 c0db fd01 80df ................
1df4: fa01 80bf f700 007f 7f00 00fe ff01 c0ff ................
1e04: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................
1e14: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................
00001e24 <pana_sleep>:
1e24: 0000 0080 1000 0088 1100 f088 3100 208c .............1.
1e34: 3900 40dc 3b00 f0dc 7f00 00fe 7f00 00fe .9.@.;..........
1e44: f800 003f e700 00c7 df00 00fb bf01 80fd ..?.............
1e54: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................
1e64: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................
1e74: fe01 807f ff00 00ff 7f00 00fe ff01 c0ff ................
1e84: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................
1e94: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................
00001ea4 <pana_eat>:
1ea4: 0000 0080 1000 0088 1100 0088 3100 008c .............1..
1eb4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;..........
1ec4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?.............
1ed4: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................
1ee4: e703 c0e7 ff03 c0ff ff03 c0ff fc01 803f ..............?.
1ef4: fd01 803f fc00 00bf 7c00 003e ff01 c0ff ..?......|>.....
1f04: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................
1f14: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................
00001f24 <pana_sad>:
1f24: 0000 0080 1000 0088 1100 0088 3100 008c .............1..
1f34: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;..........
1f44: f800 003f e700 00c7 df00 00fb bf01 80fd ..?.............
1f54: ff01 80ff 9f03 c0f9 e703 c0e7 ff03 c0ff ................
1f64: e703 c0e7 e703 c0e7 ff03 c0ff ff01 80ff ................
1f74: ff01 80ff fc00 003f 7b00 00de f701 c0ef ......?..{......
1f84: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................
1f94: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................
00001fa4 <pana_happy>:
1fa4: 0000 0080 1000 0088 1100 0088 3100 008c .............1..
1fb4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;..........
1fc4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?.............
1fd4: ff01 80ff ff03 c0ff ff03 c0ff ef03 c0f7 ................
1fe4: e703 c0eb db03 c0db ff03 c0ff ff01 80ff ................
1ff4: f701 80ef f700 00ef 7b00 00de fc01 c03f .........{....?.
2004: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................
2014: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................
00002024 <pana_blink>:
2024: 0000 0080 1000 0088 1100 0088 3100 008c .............1..
2034: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;..........
2044: f800 003f e700 00c7 df00 00fb bf01 80fd ..?.............
2054: ff01 80ff ff03 c0ff ff03 c0ff ff03 c0ff ................
2064: c303 c0c3 ff03 c0ff ff03 c0ff ff01 80ff ................
2074: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?.............
2084: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................
2094: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................
000020a4 <pana_idle>:
20a4: 0000 0080 1000 0088 1100 0088 3100 008c .............1..
20b4: 3900 00dc 3b00 00dc 7f00 00fe 7f00 00fe .9...;..........
20c4: f800 003f e700 00c7 df00 00fb bf01 80fd ..?.............
20d4: ff01 80ff ff03 c0ff ff03 c0ff e703 c0e7 ................
20e4: e703 c0e7 ff03 c0ff ff03 c0ff ff01 80ff ................
20f4: fc01 803f ff00 00ff 7f00 00fe ff01 c0ff ..?.............
2104: ff01 c0ff ff03 e0ff ff03 e0ff ff03 e0ff ................
2114: ff07 f0ff ff07 f0ff ff0f f8ff ff0f f8ff ................
00002124 <shell_sleep>:
...
2130: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................
2140: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................
2150: ff0f f0ff 010f f080 ff0f f0ff ff0f f0ff ................
2160: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................
2170: ff0f f0ff f80f f00f ff0f f0ff ff0f f0ff ................
2180: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................
2190: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................
21a0: 7f00 00fe ....
000021a4 <shell_sad>:
...
21b0: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................
21c0: ff0f f0ff ff0f f0ff ff0f f0ff ef0f f0f7 ................
21d0: c70f f0e3 830f f0c1 c70f f0e3 ef0f f0f7 ................
21e0: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................
21f0: ff0f f0ff ff0f f0ff ff0f f0ff f80f f01f ................
2200: c70f f0e3 ff0f f0ff ff07 e0ff 0700 00e0 ................
2210: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................
2220: 7f00 00fe ....
00002224 <shell_happy>:
...
2230: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................
2240: ff0f f0ff ff0f f0ff ff0f f0ff df0f f0ef ................
2250: af0f f0d7 ff0f f0ff ff0f f0ff ff0f f0ff ................
2260: ff0f f0ff ff0f f0ff ff0f f0ff ff0f f0ff ................
2270: c70f f0e3 f80f f01f ff0f f0ff ff0f f0ff ................
2280: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................
2290: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................
22a0: 7f00 00fe ....
000022a4 <shell_idle>:
...
22b0: ff07 e0ff ff0f f0ff ff0f f0ff ff0f f0ff ................
22c0: ff0f f0ff ff0f f0ff ef0f f0f7 c70f f0e3 ................
22d0: 830f f0c1 c70f f0e3 ef0f f0f7 ff0f f0ff ................
22e0: ff0f f0ff ff0f f0ff ff0f f0ff 7f0f f0ff ................
22f0: bf0f f0ff df0f f0ff bf0f f0ff 780f f00f .............x..
2300: ff0f f0ff ff0f f0ff ff07 e0ff 0700 00e0 ................
2310: 0700 00e0 0700 00e0 7f00 00fe 7f00 00fe ................
2320: 7f00 00fe ....
00002324 <icon_settings>:
2324: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............?
2334: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|..........
00002344 <icon_stats>:
2344: 0000 0000 0000 c000 c000 c000 c006 c006 ................
2354: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6.....
00002364 <icon_heal>:
2364: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0.
2374: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........
00002384 <icon_clean>:
2384: 0000 0000 8000 8000 c001 c001 f007 f80d ................
2394: f80d f808 fc1d f80d f80f f80f f007 8000 ................
000023a4 <icon_sleep>:
23a4: 0000 0000 0000 0004 000c 001c 0018 001c ................
23b4: 003c 001c 001e 001f e80f f007 8000 0000 <...............
000023c4 <icon_play>:
23c4: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~
23d4: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p..
000023e4 <icon_feed>:
23e4: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1.
23f4: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?.......
00002404 <ssd1306_init_array>:
2404: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. .....
2414: 8f81 f1d9 40db a6a4 ffaf 0000 .....@......
00002420 <boot.0>:
2420: 1aa0 0000 1ab0 0000 1ac4 0000 1ad4 0000 ................
2430: 1ae4 0000 ....
00002434 <species_names>:
2434: 1af4 0000 1afc 0000 1b04 0000 ............
00002440 <spr_glitch>:
...
2450: 0000 0200 0000 0000 0000 0000 0000 0000 ................
2460: 0080 0080 0f00 00f8 1500 0054 ff00 80ff ..........T.....
2470: ff01 c0ff ff03 e0ff 1101 4144 d707 f0f5 ..........DA....
2480: ef07 f0fb d707 f0f5 1105 5044 ff0f f8ff ..........DP....
2490: ff07 f0ff ff07 f0ff 5505 5055 ea07 f0ab .........UUP....
24a0: ff43 e0ff ff03 e0ff 5501 4055 ff00 80ff C........UU@....
24b0: 3f00 00fe 0f00 04f8 0020 0000 0000 0000 .?...... .......
000024c0 <spr_claude>:
...
24c8: 0000 2000 0000 2000 0004 a800 000e 2000 ... ... .......
24d8: 0004 fe03 0000 2000 0000 a880 0f00 20f8 ....... .......
24e8: 3f00 20fe 7f00 00ff ff00 80ff ff01 c0ff .?. ............
24f8: ff01 c0ff ff03 e0ff f703 e0f7 f703 e0f7 ................
2508: e303 e0e3 f707 f0f7 f703 e0f7 ff03 e0ff ................
2518: ff03 e0ff e703 e0f3 f801 c00f ff01 c0ff ................
2528: ff00 80ff 7f00 00ff 3f00 00fe 0f00 00f8 .........?......
2538: 0000 0080 0000 0000 ........
00002540 <species_frames>:
2540: 22a4 0000 22a4 0000 2224 0000 21a4 0000 ."..."..$"...!..
2550: 2224 0000 2124 0000 21a4 0000 20a4 0000 $"..$!...!... ..
2560: 2024 0000 1fa4 0000 1f24 0000 1ea4 0000 $ ......$.......
2570: 1e24 0000 1da4 0000 1d24 0000 1d24 0000 $.......$...$...
2580: 1ca4 0000 1c24 0000 1ca4 0000 1ba4 0000 ....$...........
2590: 1c24 0000 $...
00002594 <menu_icons>:
2594: 23e4 0000 23c4 0000 23a4 0000 2384 0000 .#...#...#...#..
25a4: 2364 0000 2344 0000 2324 0000 d#..D#..$#..
000025b0 <form_names>:
25b0: 1b0c 0000 1b14 0000 1b1c 0000 1b24 0000 ............$...
25c0: 1b2c 0000 ,...
000025c4 <menu_labels>:
25c4: 1b34 0000 1b3c 0000 1b44 0000 1a28 0000 4...<...D...(...
25d4: 1b4c 0000 1b54 0000 1b5c 0000 L...T...\...
000025e0 <screen_timeout_names>:
25e0: 1b68 0000 1b6c 0000 1b70 0000 1984 0000 h...l...p.......
000025f0 <spr_grave>:
...
25f8: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................
2608: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3..
2618: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0..........
2628: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?...
2638: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................
2648: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................
...
00002670 <fontdata>:
...
2678: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~
2688: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8..
2698: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8
26a8: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<...........
26b8: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 .<fBBf<.........
26c8: 070f 7d0f cccc 78cc 663c 6666 183c 187e ...}...x<fff<.~.
26d8: 333f 303f 7030 e0f0 637f 637f 6763 c0e6 ?3?00p...c.ccg..
26e8: db18 e73c 3ce7 18db e080 fef8 e0f8 0080 ..<..<..........
26f8: 0e02 fe3e 0e3e 0002 3c18 187e 7e18 183c ..>.>....<~..~<.
2708: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{....
2718: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a<ff<.|....~~~.
2728: 3c18 187e 3c7e ff18 3c18 187e 1818 0018 .<~.~<...<~.....
2738: 1818 1818 3c7e 0018 1800 fe0c 180c 0000 ....~<..........
2748: 3000 fe60 3060 0000 0000 c0c0 fec0 0000 .0`.`0..........
2758: 2400 ff66 2466 0000 1800 7e3c ffff 0000 .$f.f$....<~....
2768: ff00 7eff 183c 0000 0000 0000 0000 0000 ...~<...........
2778: 3c18 183c 0018 0018 6666 0024 0000 0000 .<<.....ff$.....
2788: 6c6c 6cfe 6cfe 006c 3e18 3c60 7c06 0018 ll.l.ll..>`<.|..
2798: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v.
27a8: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000...
27b8: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.<f..
27c8: 1800 7e18 1818 0000 0000 0000 1800 3018 ...~...........0
27d8: 0000 7e00 0000 0000 0000 0000 1800 0018 ...~............
27e8: 0c06 3018 c060 0080 6c38 d6c6 6cc6 0038 ...0`...8l...l8.
27f8: 3818 1818 1818 007e c67c 1c06 6630 00fe .8....~.|...0f..
2808: c67c 3c06 c606 007c 3c1c cc6c 0cfe 001e |..<..|..<l.....
2818: c0fe fcc0 c606 007c 6038 fcc0 c6c6 007c ......|.8`....|.
2828: c6fe 180c 3030 0030 c67c 7cc6 c6c6 007c ....000.|..|..|.
2838: c67c 7ec6 0c06 0078 1800 0018 1800 0018 |..~..x.........
2848: 1800 0018 1800 3018 0c06 3018 0c18 0006 .......0...0....
2858: 0000 007e 7e00 0000 3060 0c18 3018 0060 ..~..~..`0...0`.
2868: c67c 180c 0018 0018 c67c dede c0de 0078 |.......|.....x.
2878: 6c38 fec6 c6c6 00c6 66fc 7c66 6666 00fc 8l.......ff|ff..
2888: 663c c0c0 66c0 003c 6cf8 6666 6c66 00f8 <f...f<..lfffl..
2898: 62fe 7868 6268 00fe 62fe 7868 6068 00f0 .bhxhb...bhxh`..
28a8: 663c c0c0 66ce 003a c6c6 fec6 c6c6 00c6 <f...f:.........
28b8: 183c 1818 1818 003c 0c1e 0c0c cccc 0078 <.....<.......x.
28c8: 66e6 786c 666c 00e6 60f0 6060 6662 00fe .flxlf...```bf..
28d8: eec6 fefe c6d6 00c6 e6c6 def6 c6ce 00c6 ................
28e8: c67c c6c6 c6c6 007c 66fc 7c66 6060 00f0 |.....|..ff|``..
28f8: c67c c6c6 cec6 0e7c 66fc 7c66 666c 00e6 |.....|..ff|lf..
2908: 663c 1830 660c 003c 7e7e 185a 1818 003c <f0..f<.~~Z...<.
2918: c6c6 c6c6 c6c6 007c c6c6 c6c6 6cc6 0038 ......|......l8.
2928: c6c6 d6c6 fed6 006c c6c6 386c c66c 00c6 ......l...l8l...
2938: 6666 3c66 1818 003c c6fe 188c 6632 00fe fff<..<.....2f..
2948: 303c 3030 3030 003c 60c0 1830 060c 0002 <00000<..`0.....
2958: 0c3c 0c0c 0c0c 003c 3810 c66c 0000 0000 <.....<..8l.....
2968: 0000 0000 0000 ff00 1830 000c 0000 0000 ........0.......
2978: 0000 0c78 cc7c 0076 60e0 667c 6666 00dc ..x.|.v..`|fff..
2988: 0000 c67c c6c0 007c 0c1c cc7c cccc 0076 ..|...|...|...v.
2998: 0000 c67c c0fe 007c 663c f860 6060 00f0 ..|...|.<f`.``..
29a8: 0000 cc76 7ccc f80c 60e0 766c 6666 00e6 ..v..|...`lvff..
29b8: 0018 1838 1818 003c 0006 0606 6606 3c66 ..8...<......ff<
29c8: 60e0 6c66 6c78 00e6 1838 1818 1818 003c .`flxl..8.....<.
29d8: 0000 feec d6d6 00d6 0000 66dc 6666 0066 ...........ffff.
29e8: 0000 c67c c6c6 007c 0000 66dc 7c66 f060 ..|...|....ff|`.
29f8: 0000 cc76 7ccc 1e0c 0000 76dc 6060 00f0 ..v..|.....v``..
2a08: 0000 c07e 067c 00fc 3030 30fc 3630 001c ..~.|...00.006..
2a18: 0000 cccc cccc 0076 0000 c6c6 6cc6 0038 ......v......l8.
2a28: 0000 d6c6 fed6 006c 0000 6cc6 6c38 00c6 ......l....l8l..
2a38: 0000 c6c6 7ec6 fc06 0000 4c7e 3218 007e .....~....~L.2~.
2a48: 180e 7018 1818 000e 1818 1818 1818 0018 ...p............
2a58: 1870 0e18 1818 0070 dc76 0000 0000 0000 p.....p.v.......
2a68: 1000 6c38 c6c6 00fe c67c c0c0 7cc6 780c ..8l....|....|.x
2a78: 00cc cccc cccc 0076 180c c67c c0fe 007c ......v...|...|.
2a88: 827c 0c78 cc7c 0076 00c6 0c78 cc7c 0076 |.x.|.v...x.|.v.
2a98: 1830 0c78 cc7c 0076 3030 0c78 cc7c 0076 0.x.|.v.00x.|.v.
2aa8: 0000 c07e 7ec0 380c 827c c67c c0fe 007c ..~..~.8|.|...|.
2ab8: 00c6 c67c c0fe 007c 1830 c67c c0fe 007c ..|...|.0.|...|.
2ac8: 0066 1838 1818 003c 827c 1838 1818 003c f.8...<.|.8...<.
2ad8: 1830 3800 1818 003c 38c6 c66c c6fe 00c6 0..8..<..8l.....
2ae8: 6c38 c67c c6fe 00c6 3018 c0fe c0f8 00fe 8l|......0......
2af8: 0000 187e d87e 007e 6c3e fecc cccc 00ce ..~.~.~.>l......
2b08: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|.
2b18: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v.
2b28: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~..
2b38: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|.
2b48: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f..
2b58: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~..........
2b68: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v.
2b78: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|.
2b88: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff.
2b98: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v.......<ll>.~..
2ba8: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>.
2bb8: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................
2bc8: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j..
2bd8: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3..
2be8: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".".
2bf8: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w.
2c08: 1818 1818 1818 1818 1818 1818 18f8 1818 ................
2c18: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666
2c28: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........
2c38: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666
2c48: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666......
2c58: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............
2c68: 0000 0000 18f8 1818 1818 1818 001f 0000 ................
2c78: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................
2c88: 1818 1818 181f 1818 0000 0000 00ff 0000 ................
2c98: 1818 1818 18ff 1818 1818 181f 181f 1818 ................
2ca8: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?...
2cb8: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666......
2cc8: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666
2cd8: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666
2ce8: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666....
2cf8: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666
2d08: 3636 3636 003f 0000 1818 181f 001f 0000 6666?...........
2d18: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666
2d28: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........
2d38: 1818 1818 00f8 0000 0000 0000 181f 1818 ................
2d48: ffff ffff ffff ffff 0000 0000 ffff ffff ................
2d58: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................
2d68: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v.
2d78: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x...............
2d88: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`...
2d98: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|.
2da8: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.<ff<.~
2db8: 6c38 fec6 6cc6 0038 6c38 c6c6 6c6c 00ee 8l...l8.8l..ll..
2dc8: 180e 3e0c 6666 003c 0000 db7e 7edb 0000 ...>ff<...~..~..
2dd8: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0..
2de8: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|..............
2df8: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~.
2e08: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~.........
2e18: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~....
2e28: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8....
2e38: 0000 1800 0018 0000 0000 1800 0000 0000 ................
2e48: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666...
2e58: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<..
...