PanBadge/tama.lst

3811 lines
161 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: 0eb0006f j 8ea <handle_reset>
4: 00000000 .word 0x00000000
8: 000009b0 .word 0x000009b0
c: 0000095c .word 0x0000095c
...
30: 0000095c .word 0x0000095c
34: 00000000 .word 0x00000000
38: 0000095c .word 0x0000095c
3c: 00000000 .word 0x00000000
40: 0000095c .word 0x0000095c
44: 0000095c .word 0x0000095c
48: 0000095c .word 0x0000095c
4c: 0000095c .word 0x0000095c
50: 0000095c .word 0x0000095c
54: 0000095c .word 0x0000095c
58: 0000095c .word 0x0000095c
5c: 0000095c .word 0x0000095c
60: 0000095c .word 0x0000095c
64: 0000095c .word 0x0000095c
68: 0000095c .word 0x0000095c
6c: 0000095c .word 0x0000095c
70: 0000095c .word 0x0000095c
74: 0000095c .word 0x0000095c
78: 0000095c .word 0x0000095c
7c: 0000095c .word 0x0000095c
80: 0000095c .word 0x0000095c
84: 0000095c .word 0x0000095c
88: 0000095c .word 0x0000095c
8c: 0000095c .word 0x0000095c
90: 0000095c .word 0x0000095c
94: 0000095c .word 0x0000095c
98: 0000095c .word 0x0000095c
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 <mini_pad>:
if(pad_to == 0) pad_to = len;
11e: c699 beqz a3,12c <mini_pad+0xe>
int overflow = 0;
120: 4301 li t1,0
if(len > pad_to) {
122: 00b6d763 bge a3,a1,130 <mini_pad+0x12>
len = pad_to;
126: 85b6 mv a1,a3
overflow = 1;
128: 4305 li t1,1
12a: a019 j 130 <mini_pad+0x12>
int overflow = 0;
12c: 4301 li t1,0
if(pad_to == 0) pad_to = len;
12e: 86ae mv a3,a1
for(i = pad_to - len; i > 0; i --) {
130: 8e8d sub a3,a3,a1
char * pbuffer = buffer;
132: 87ba mv a5,a4
134: 00e683b3 add t2,a3,a4
for(i = pad_to - len; i > 0; i --) {
138: 40f382b3 sub t0,t2,a5
13c: 04504a63 bgtz t0,190 <mini_pad+0x72>
140: fff6c793 not a5,a3
144: 87fd srai a5,a5,0x1f
146: 8efd and a3,a3,a5
148: 96ba add a3,a3,a4
14a: 4781 li a5,0
for(i = len; i > 0; i --) {
14c: 40f58633 sub a2,a1,a5
150: 00f682b3 add t0,a3,a5
154: 04c04263 bgtz a2,198 <mini_pad+0x7a>
158: fff5c793 not a5,a1
15c: 87fd srai a5,a5,0x1f
15e: 8dfd and a1,a1,a5
160: 95b6 add a1,a1,a3
len = pbuffer - buffer;
162: 40e58533 sub a0,a1,a4
if(overflow) {
166: 02030463 beqz t1,18e <mini_pad+0x70>
for (i = 0; i < 3 && pbuffer > buffer; i ++) {
16a: 02b77263 bgeu a4,a1,18e <mini_pad+0x70>
*(pbuffer-- - 1) = '*';
16e: 02a00793 li a5,42
172: fef58fa3 sb a5,-1(a1)
176: fff58693 addi a3,a1,-1
for (i = 0; i < 3 && pbuffer > buffer; i ++) {
17a: 00d77a63 bgeu a4,a3,18e <mini_pad+0x70>
*(pbuffer-- - 1) = '*';
17e: fef58f23 sb a5,-2(a1)
182: ffe58693 addi a3,a1,-2
for (i = 0; i < 3 && pbuffer > buffer; i ++) {
186: 00d77463 bgeu a4,a3,18e <mini_pad+0x70>
*(pbuffer-- - 1) = '*';
18a: fef58ea3 sb a5,-3(a1)
}
18e: 8082 ret
*(pbuffer++) = pad_char;
190: 0785 addi a5,a5,1
192: fec78fa3 sb a2,-1(a5)
for(i = pad_to - len; i > 0; i --) {
196: b74d j 138 <mini_pad+0x1a>
*(pbuffer++) = *(ptr++);
198: 00f50633 add a2,a0,a5
19c: 00064603 lbu a2,0(a2)
1a0: 0785 addi a5,a5,1
1a2: 00c28023 sb a2,0(t0)
for(i = len; i > 0; i --) {
1a6: b75d j 14c <mini_pad+0x2e>
000001a8 <_puts>:
{
1a8: 832a mv t1,a0
1aa: 852e mv a0,a1
if(!buf) return len;
1ac: ce01 beqz a2,1c4 <_puts+0x1c>
char * p0 = b->buffer;
1ae: 00062283 lw t0,0(a2)
for (i = 0; i < len; i++) {
1b2: 4701 li a4,0
if(b->pbuffer == b->buffer + b->buffer_len - 1) {
1b4: 425c lw a5,4(a2)
for (i = 0; i < len; i++) {
1b6: 00a74863 blt a4,a0,1c6 <_puts+0x1e>
*(b->pbuffer) = 0;
1ba: 00078023 sb zero,0(a5)
return b->pbuffer - p0;
1be: 4248 lw a0,4(a2)
1c0: 40550533 sub a0,a0,t0
}
1c4: 8082 ret
if(b->pbuffer == b->buffer + b->buffer_len - 1) {
1c6: 460c lw a1,8(a2)
1c8: 4214 lw a3,0(a2)
1ca: 15fd addi a1,a1,-1
1cc: 96ae add a3,a3,a1
1ce: fed786e3 beq a5,a3,1ba <_puts+0x12>
*(b->pbuffer ++) = s[i];
1d2: 00178693 addi a3,a5,1
1d6: c254 sw a3,4(a2)
1d8: 00e306b3 add a3,t1,a4
1dc: 0006c683 lbu a3,0(a3)
for (i = 0; i < len; i++) {
1e0: 0705 addi a4,a4,1
*(b->pbuffer ++) = s[i];
1e2: 00d78023 sb a3,0(a5)
for (i = 0; i < len; i++) {
1e6: b7f9 j 1b4 <_puts+0xc>
000001e8 <PrintHex>:
while( (*DMDATA0) & 0x80 );
1e8: e00007b7 lui a5,0xe0000
1ec: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4>
1f0: 4398 lw a4,0(a5)
1f2: 08077713 andi a4,a4,128
1f6: ff6d bnez a4,1f0 <PrintHex+0x8>
*DMDATA0 = 0x78302088; //" 0x"
1f8: 78302737 lui a4,0x78302
1fc: 08870713 addi a4,a4,136 # 78302088 <_eusrstack+0x58301888>
while( (*DMDATA0) & 0x80 );
200: e00006b7 lui a3,0xe0000
*DMDATA0 = 0x78302088; //" 0x"
204: c398 sw a4,0(a5)
while( (*DMDATA0) & 0x80 );
206: 0f468693 addi a3,a3,244 # e00000f4 <_eusrstack+0xbffff8f4>
for( shift = 28; shift >= 0; shift -= 4 )
20a: 4771 li a4,28
s += ( s < 10 ) ? '0' : ('a' - 10);
20c: 45a5 li a1,9
for( shift = 28; shift >= 0; shift -= 4 )
20e: 5671 li a2,-4
while( (*DMDATA0) & 0x80 );
210: 429c lw a5,0(a3)
212: 0807f793 andi a5,a5,128
216: ffed bnez a5,210 <PrintHex+0x28>
int s = (n>>shift) & 0xf;
218: 00e55333 srl t1,a0,a4
21c: 00f37313 andi t1,t1,15
s += ( s < 10 ) ? '0' : ('a' - 10);
220: 0065b7b3 sltu a5,a1,t1
224: 40f007b3 neg a5,a5
228: 0277f793 andi a5,a5,39
22c: 03078793 addi a5,a5,48
230: 979a add a5,a5,t1
*DMDATA0 = 0x85 | (s<<8); //" 0x"
232: 07a2 slli a5,a5,0x8
234: 0857e793 ori a5,a5,133
238: c29c sw a5,0(a3)
for( shift = 28; shift >= 0; shift -= 4 )
23a: 1771 addi a4,a4,-4
23c: fcc71ae3 bne a4,a2,210 <PrintHex+0x28>
}
240: 8082 ret
00000242 <DelaySysTick>:
#endif
void DelaySysTick( uint32_t n )
{
#if defined(CH32V003) || defined(CH32V00x)
uint32_t targend = SysTick->CNT + n;
242: e000f737 lui a4,0xe000f
246: 471c lw a5,8(a4)
248: 953e add a0,a0,a5
while( ((int32_t)( SysTick->CNT - targend )) < 0 );
24a: 471c lw a5,8(a4)
24c: 8f89 sub a5,a5,a0
24e: fe07cee3 bltz a5,24a <DelaySysTick+0x8>
uint64_t targend = SysTick->CNT - n;
while( ((int64_t)( SysTick->CNT - targend )) > 0 );
#else
#error DelaySysTick not defined.
#endif
}
252: 8082 ret
00000254 <mini_itoa.part.0>:
int mini_itoa(long value, unsigned int radix, int uppercase, int unsig, char *buffer)
254: 1101 addi sp,sp,-32
256: ce06 sw ra,28(sp)
258: cc22 sw s0,24(sp)
25a: ca26 sw s1,20(sp)
int negative = 0;
25c: c002 sw zero,0(sp)
int mini_itoa(long value, unsigned int radix, int uppercase, int unsig, char *buffer)
25e: 832a mv t1,a0
if (value < 0 && !unsig) {
260: 00055763 bgez a0,26e <mini_itoa.part.0+0x1a>
264: e689 bnez a3,26e <mini_itoa.part.0+0x1a>
negative = 1;
266: 4785 li a5,1
value = -value;
268: 40a00333 neg t1,a0
negative = 1;
26c: c03e sw a5,0(sp)
26e: 8a05 andi a2,a2,1
270: 06100413 li s0,97
274: c219 beqz a2,27a <mini_itoa.part.0+0x26>
276: 04100413 li s0,65
int negative = 0;
27a: 84ba mv s1,a4
*(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10);
27c: 1459 addi s0,s0,-10
int digit = value % radix;
27e: 851a mv a0,t1
280: c83a sw a4,16(sp)
282: c21a sw t1,4(sp)
284: c62e sw a1,12(sp)
286: c41a sw t1,8(sp)
288: 35b1 jal d4 <__umodsi3>
*(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10);
28a: 47a5 li a5,9
28c: 4322 lw t1,8(sp)
28e: 45b2 lw a1,12(sp)
290: 4742 lw a4,16(sp)
292: 0ff57693 zext.b a3,a0
296: 06a7e163 bltu a5,a0,2f8 <mini_itoa.part.0+0xa4>
29a: 03068693 addi a3,a3,48
29e: 0ff6f693 zext.b a3,a3
2a2: 00148793 addi a5,s1,1
2a6: 00d48023 sb a3,0(s1)
value /= radix;
2aa: 851a mv a0,t1
2ac: c83a sw a4,16(sp)
*(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10);
2ae: c63e sw a5,12(sp)
value /= radix;
2b0: c42e sw a1,8(sp)
2b2: 3bdd jal a8 <__hidden___udivsi3>
} while (value > 0);
2b4: 4692 lw a3,4(sp)
2b6: 45a2 lw a1,8(sp)
2b8: 47b2 lw a5,12(sp)
2ba: 4742 lw a4,16(sp)
value /= radix;
2bc: 832a mv t1,a0
} while (value > 0);
2be: 02b6fb63 bgeu a3,a1,2f4 <mini_itoa.part.0+0xa0>
if (negative)
2c2: 4682 lw a3,0(sp)
2c4: c699 beqz a3,2d2 <mini_itoa.part.0+0x7e>
*(pbuffer++) = '-';
2c6: 02d00693 li a3,45
2ca: 00d78023 sb a3,0(a5)
2ce: 00248793 addi a5,s1,2
len = (pbuffer - buffer);
2d2: 40e78533 sub a0,a5,a4
for (i = 0; i < len / 2; i++) {
2d6: 01f55693 srli a3,a0,0x1f
2da: 96aa add a3,a3,a0
*(pbuffer) = '\0';
2dc: 00078023 sb zero,0(a5)
for (i = 0; i < len / 2; i++) {
2e0: 8685 srai a3,a3,0x1
2e2: 4601 li a2,0
2e4: 17fd addi a5,a5,-1
2e6: 00d64b63 blt a2,a3,2fc <mini_itoa.part.0+0xa8>
}
2ea: 40f2 lw ra,28(sp)
2ec: 4462 lw s0,24(sp)
2ee: 44d2 lw s1,20(sp)
2f0: 6105 addi sp,sp,32
2f2: 8082 ret
*(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10);
2f4: 84be mv s1,a5
2f6: b761 j 27e <mini_itoa.part.0+0x2a>
2f8: 96a2 add a3,a3,s0
2fa: b755 j 29e <mini_itoa.part.0+0x4a>
char j = buffer[i];
2fc: 00c705b3 add a1,a4,a2
buffer[i] = buffer[len-i-1];
300: 0007c283 lbu t0,0(a5)
char j = buffer[i];
304: 0005c303 lbu t1,0(a1)
for (i = 0; i < len / 2; i++) {
308: 0605 addi a2,a2,1
buffer[i] = buffer[len-i-1];
30a: 00558023 sb t0,0(a1)
buffer[len-i-1] = j;
30e: 00678023 sb t1,0(a5)
for (i = 0; i < len / 2; i++) {
312: bfc9 j 2e4 <mini_itoa.part.0+0x90>
00000314 <ssd1306_i2c_setup>:
void ssd1306_i2c_setup(void)
{
uint16_t tempreg;
// Reset I2C1 to init all regs
RCC->APB1PRSTR |= RCC_APB1Periph_I2C1;
314: 400217b7 lui a5,0x40021
318: 4b98 lw a4,16(a5)
31a: 002006b7 lui a3,0x200
31e: 8f55 or a4,a4,a3
320: cb98 sw a4,16(a5)
RCC->APB1PRSTR &= ~RCC_APB1Periph_I2C1;
322: 4b98 lw a4,16(a5)
324: ffe006b7 lui a3,0xffe00
328: 16fd addi a3,a3,-1 # ffdfffff <_eusrstack+0xdfdff7ff>
32a: 8f75 and a4,a4,a3
32c: cb98 sw a4,16(a5)
// set freq
tempreg = I2C1->CTLR2;
32e: 400057b7 lui a5,0x40005
332: 4047d703 lhu a4,1028(a5) # 40005404 <_eusrstack+0x20004c04>
tempreg &= ~I2C_CTLR2_FREQ;
336: 66c1 lui a3,0x10
338: fc068693 addi a3,a3,-64 # ffc0 <tama.c.67bb5960+0xc52f>
33c: 8f75 and a4,a4,a3
tempreg |= (FUNCONF_SYSTEM_CORE_CLOCK/SSD1306_I2C_PRERATE)&I2C_CTLR2_FREQ;
33e: 01876713 ori a4,a4,24
I2C1->CTLR2 = tempreg;
342: 40e79223 sh a4,1028(a5)
tempreg = (FUNCONF_SYSTEM_CORE_CLOCK/(25*SSD1306_I2C_CLKRATE))&I2C_CKCFGR_CCR;
tempreg |= I2C_CKCFGR_DUTY;
#endif
tempreg |= I2C_CKCFGR_FS;
#endif
I2C1->CKCFGR = tempreg;
346: 7771 lui a4,0xffffc
348: 0705 addi a4,a4,1 # ffffc001 <_eusrstack+0xdfffb801>
34a: 40e79e23 sh a4,1052(a5)
// initialize the state
ssd1306_i2c_irq_state = 0;
#endif
// Enable I2C
I2C1->CTLR1 |= I2C_CTLR1_PE;
34e: 4007d703 lhu a4,1024(a5)
352: 00176713 ori a4,a4,1
356: 40e79023 sh a4,1024(a5)
// set ACK mode
I2C1->CTLR1 |= I2C_CTLR1_ACK;
35a: 4007d703 lhu a4,1024(a5)
35e: 40076713 ori a4,a4,1024
362: 40e79023 sh a4,1024(a5)
}
366: 8082 ret
00000368 <ssd1306_drawPixel>:
void ssd1306_drawPixel(uint32_t x, uint32_t y, int color)
{
uint32_t addr;
/* clip */
if(x >= SSD1306_W)
368: 07f00793 li a5,127
36c: 02a7e763 bltu a5,a0,39a <ssd1306_drawPixel+0x32>
return;
if(y >= SSD1306_H)
370: 03f00793 li a5,63
374: 02b7e363 bltu a5,a1,39a <ssd1306_drawPixel+0x32>
return;
/* compute buffer address */
addr = x + SSD1306_W*(y/8);
378: 0035d793 srli a5,a1,0x3
37c: 079e slli a5,a5,0x7
37e: 97aa add a5,a5,a0
/* set/clear bit in buffer */
if(color)
ssd1306_buffer[addr] |= (1<<(y&7));
380: c4418513 addi a0,gp,-956 # 20000040 <ssd1306_buffer>
384: 953e add a0,a0,a5
386: 899d andi a1,a1,7
388: 4705 li a4,1
38a: 00054783 lbu a5,0(a0)
38e: 00b715b3 sll a1,a4,a1
if(color)
392: c609 beqz a2,39c <ssd1306_drawPixel+0x34>
ssd1306_buffer[addr] |= (1<<(y&7));
394: 8fcd or a5,a5,a1
else
ssd1306_buffer[addr] &= ~(1<<(y&7));
396: 00f50023 sb a5,0(a0)
}
39a: 8082 ret
ssd1306_buffer[addr] &= ~(1<<(y&7));
39c: fff5c593 not a1,a1
3a0: 8fed and a5,a5,a1
3a2: bfd5 j 396 <ssd1306_drawPixel+0x2e>
000003a4 <ssd1306_drawstr>:
/*
* draw a string to the display
*/
void ssd1306_drawstr(int x, int y, const char *str, uint8_t color)
{
3a4: fdc10113 addi sp,sp,-36
3a8: ce22 sw s0,28(sp)
3aa: cc26 sw s1,24(sp)
3ac: d006 sw ra,32(sp)
3ae: 842a mv s0,a0
3b0: 82ae mv t0,a1
3b2: 84b2 mv s1,a2
uint8_t c;
while((c=*str++))
3b4: 0004c383 lbu t2,0(s1)
3b8: 0485 addi s1,s1,1
3ba: 06038563 beqz t2,424 <ssd1306_drawstr+0x80>
3be: 4701 li a4,0
d = fontdata[(chr<<3)+i];
3c0: 00339793 slli a5,t2,0x3
3c4: 6609 lui a2,0x2
3c6: 97ba add a5,a5,a4
3c8: 03460613 addi a2,a2,52 # 2034 <fontdata>
3cc: 97b2 add a5,a5,a2
3ce: 0007c303 lbu t1,0(a5)
3d2: 4781 li a5,0
if(d&0x80)
3d4: 01831593 slli a1,t1,0x18
3d8: 85e1 srai a1,a1,0x18
3da: 8636 mv a2,a3
3dc: 0005c463 bltz a1,3e4 <ssd1306_drawstr+0x40>
col = (~color)&1;
3e0: 0016c613 xori a2,a3,1
ssd1306_drawPixel(x+j, y+i, col);
3e4: 00e285b3 add a1,t0,a4
3e8: 00f40533 add a0,s0,a5
3ec: ca36 sw a3,20(sp)
3ee: c81a sw t1,16(sp)
3f0: c61e sw t2,12(sp)
3f2: c43a sw a4,8(sp)
3f4: c216 sw t0,4(sp)
3f6: c03e sw a5,0(sp)
3f8: 3f85 jal 368 <ssd1306_drawPixel>
d <<= 1;
3fa: 4342 lw t1,16(sp)
for(j=0;j<8;j++)
3fc: 4782 lw a5,0(sp)
3fe: 4621 li a2,8
d <<= 1;
400: 0306 slli t1,t1,0x1
for(j=0;j<8;j++)
402: 0785 addi a5,a5,1
404: 4292 lw t0,4(sp)
406: 4722 lw a4,8(sp)
408: 43b2 lw t2,12(sp)
40a: 46d2 lw a3,20(sp)
d <<= 1;
40c: 0ff37313 zext.b t1,t1
for(j=0;j<8;j++)
410: fcc792e3 bne a5,a2,3d4 <ssd1306_drawstr+0x30>
for(i=0;i<8;i++)
414: 0705 addi a4,a4,1
416: faf715e3 bne a4,a5,3c0 <ssd1306_drawstr+0x1c>
{
ssd1306_drawchar(x, y, c, color);
x += 8;
41a: 9432 add s0,s0,a2
if(x>120)
41c: 07800793 li a5,120
420: f887dae3 bge a5,s0,3b4 <ssd1306_drawstr+0x10>
break;
}
}
424: 5082 lw ra,32(sp)
426: 4472 lw s0,28(sp)
428: 44e2 lw s1,24(sp)
42a: 02410113 addi sp,sp,36
42e: 8082 ret
00000430 <beep>:
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
// short square-wave beep on the passive piezo (blocking, ms-scale only)
static void beep(uint16_t freq, uint16_t ms)
{
if (!sound_on) return;
430: c061c783 lbu a5,-1018(gp) # 20000002 <sound_on>
434: c7ad beqz a5,49e <beep+0x6e>
{
436: 1131 addi sp,sp,-20
438: c622 sw s0,12(sp)
43a: 842e mv s0,a1
if (freq == 0) { Delay_Ms(ms); return; }
uint32_t half = 500000u / freq; // half-period in us
43c: 85aa mv a1,a0
43e: 0007a537 lui a0,0x7a
442: 12050513 addi a0,a0,288 # 7a120 <tama.c.67bb5960+0x7668f>
{
446: c806 sw ra,16(sp)
448: c426 sw s1,8(sp)
uint32_t half = 500000u / freq; // half-period in us
44a: 39b9 jal a8 <__hidden___udivsi3>
uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u);
44c: 00541793 slli a5,s0,0x5
450: 8f81 sub a5,a5,s0
452: 078a slli a5,a5,0x2
454: 97a2 add a5,a5,s0
456: 00151413 slli s0,a0,0x1
uint32_t half = 500000u / freq; // half-period in us
45a: 84aa mv s1,a0
uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u);
45c: 85a2 mv a1,s0
45e: 00379513 slli a0,a5,0x3
462: 3199 jal a8 <__hidden___udivsi3>
for (uint32_t i = 0; i < cycles; i++) {
funDigitalWrite(BUZZER, FUN_HIGH);
Delay_Us(half);
464: 9426 add s0,s0,s1
466: 00141793 slli a5,s0,0x1
uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u);
46a: 872a mv a4,a0
Delay_Us(half);
46c: c03e sw a5,0(sp)
for (uint32_t i = 0; i < cycles; i++) {
46e: 4401 li s0,0
Delay_Us(half);
470: 4502 lw a0,0(sp)
funDigitalWrite(BUZZER, FUN_HIGH);
472: 400114b7 lui s1,0x40011
476: c23a sw a4,4(sp)
478: 4691 li a3,4
47a: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00>
47e: c894 sw a3,16(s1)
Delay_Us(half);
480: 33c9 jal 242 <DelaySysTick>
funDigitalWrite(BUZZER, FUN_LOW);
Delay_Us(half);
482: 4502 lw a0,0(sp)
funDigitalWrite(BUZZER, FUN_LOW);
484: 000406b7 lui a3,0x40
488: c894 sw a3,16(s1)
Delay_Us(half);
48a: 3b65 jal 242 <DelaySysTick>
for (uint32_t i = 0; i < cycles; i++) {
48c: 4712 lw a4,4(sp)
48e: 0405 addi s0,s0,1
490: fe8710e3 bne a4,s0,470 <beep+0x40>
}
}
494: 40c2 lw ra,16(sp)
496: 4432 lw s0,12(sp)
498: 44a2 lw s1,8(sp)
49a: 0151 addi sp,sp,20
49c: 8082 ret
49e: 8082 ret
000004a0 <led_blink>:
static void led_blink(void)
{
4a0: 1161 addi sp,sp,-8
4a2: c022 sw s0,0(sp)
funDigitalWrite(LED_PIN, FUN_HIGH);
4a4: 40011437 lui s0,0x40011
{
4a8: c206 sw ra,4(sp)
funDigitalWrite(LED_PIN, FUN_HIGH);
4aa: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000>
4ae: 4789 li a5,2
Delay_Ms(30);
4b0: 0002c537 lui a0,0x2c
funDigitalWrite(LED_PIN, FUN_HIGH);
4b4: c81c sw a5,16(s0)
Delay_Ms(30);
4b6: f2050513 addi a0,a0,-224 # 2bf20 <tama.c.67bb5960+0x2848f>
4ba: 3361 jal 242 <DelaySysTick>
funDigitalWrite(LED_PIN, FUN_LOW);
4bc: 000207b7 lui a5,0x20
}
4c0: 4092 lw ra,4(sp)
funDigitalWrite(LED_PIN, FUN_LOW);
4c2: c81c sw a5,16(s0)
}
4c4: 4402 lw s0,0(sp)
4c6: 0121 addi sp,sp,8
4c8: 8082 ret
000004ca <pet_reset>:
static void pet_reset(void)
{
pet.satiety = 80;
4ca: 645a5737 lui a4,0x645a5
4ce: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850>
4d2: c2e1ac23 sw a4,-968(gp) # 20000034 <pet>
pet.happy = 80;
pet.energy = 90;
pet.hygiene = 100;
pet.health = 100;
4d6: c3818793 addi a5,gp,-968 # 20000034 <pet>
4da: 06400713 li a4,100
4de: 00e78223 sb a4,4(a5) # 20004 <tama.c.67bb5960+0x1c573>
pet.age_min = 0;
pet.poop = 0;
pet.sleeping = 0;
pet.alive = 1;
4e2: 4705 li a4,1
pet.age_min = 0;
4e4: 00079323 sh zero,6(a5)
pet.poop = 0;
4e8: 00079423 sh zero,8(a5)
pet.alive = 1;
4ec: 00e78523 sb a4,10(a5)
screen = SCR_MAIN;
4f0: c2018aa3 sb zero,-971(gp) # 20000031 <screen>
cursor = 0;
4f4: c2018a23 sb zero,-972(gp) # 20000030 <cursor>
for (int i = 0; i < N_COUNT; i++) { warn_flag[i] = 0; crit_flag[i] = 0; }
4f8: c201a823 sw zero,-976(gp) # 2000002c <warn_flag>
4fc: c201a623 sw zero,-980(gp) # 20000028 <crit_flag>
}
500: 8082 ret
00000502 <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)
{
502: 1141 addi sp,sp,-16
504: c422 sw s0,8(sp)
506: c606 sw ra,12(sp)
508: c226 sw s1,4(sp)
if (val < 20) {
50a: 474d li a4,19
{
50c: 87aa mv a5,a0
if (val < 20) {
50e: c2c18413 addi s0,gp,-980 # 20000028 <crit_flag>
512: 04b74463 blt a4,a1,55a <notify+0x58>
if (!crit_flag[idx]) { // urgent: descending triple
516: 942a add s0,s0,a0
518: 00044703 lbu a4,0(s0)
51c: eb15 bnez a4,550 <notify+0x4e>
51e: c02a sw a0,0(sp)
beep(1568, 60); beep(1175, 60); beep(880, 90);
520: 03c00593 li a1,60
524: 62000513 li a0,1568
528: 3721 jal 430 <beep>
52a: 03c00593 li a1,60
52e: 49700513 li a0,1175
532: 3dfd jal 430 <beep>
534: 05a00593 li a1,90
538: 37000513 li a0,880
53c: 3dd5 jal 430 <beep>
crit_flag[idx] = 1; warn_flag[idx] = 1;
53e: 4782 lw a5,0(sp)
540: c3018713 addi a4,gp,-976 # 2000002c <warn_flag>
544: 4685 li a3,1
546: 97ba add a5,a5,a4
548: 00d40023 sb a3,0(s0)
54c: 00d78023 sb a3,0(a5)
}
crit_flag[idx] = 0;
} else {
warn_flag[idx] = 0; crit_flag[idx] = 0;
}
}
550: 40b2 lw ra,12(sp)
552: 4422 lw s0,8(sp)
554: 4492 lw s1,4(sp)
556: 0141 addi sp,sp,16
558: 8082 ret
} else if (val < 50) {
55a: c3018493 addi s1,gp,-976 # 2000002c <warn_flag>
55e: 03100713 li a4,49
if (!warn_flag[idx]) { // gentle: single chirp
562: 94aa add s1,s1,a0
} else if (val < 50) {
564: 02b74363 blt a4,a1,58a <notify+0x88>
if (!warn_flag[idx]) { // gentle: single chirp
568: 0004c703 lbu a4,0(s1)
56c: eb19 bnez a4,582 <notify+0x80>
56e: c02a sw a0,0(sp)
beep(1568, 50);
570: 03200593 li a1,50
574: 62000513 li a0,1568
578: 3d65 jal 430 <beep>
warn_flag[idx] = 1;
57a: 4782 lw a5,0(sp)
57c: 4705 li a4,1
57e: 00e48023 sb a4,0(s1)
warn_flag[idx] = 0; crit_flag[idx] = 0;
582: 943e add s0,s0,a5
584: 00040023 sb zero,0(s0)
}
588: b7e1 j 550 <notify+0x4e>
warn_flag[idx] = 0; crit_flag[idx] = 0;
58a: 00048023 sb zero,0(s1)
58e: bfd5 j 582 <notify+0x80>
00000590 <draw_center_str>:
}
}
// ----------------------------------------------------------------- drawing
static void draw_center_str(int y, const char *s)
{
590: 862e mv a2,a1
int len = 0;
592: 4701 li a4,0
while (s[len]) len++;
594: 00e607b3 add a5,a2,a4
598: 0007c783 lbu a5,0(a5)
59c: ef81 bnez a5,5b4 <draw_center_str+0x24>
int x = (SSD1306_W - len * 8) / 2;
59e: 47c1 li a5,16
5a0: 8f99 sub a5,a5,a4
5a2: 078a slli a5,a5,0x2
if (x < 0) x = 0;
5a4: fff7c713 not a4,a5
5a8: 877d srai a4,a4,0x1f
ssd1306_drawstr(x, y, s, 1);
5aa: 85aa mv a1,a0
5ac: 4685 li a3,1
5ae: 00e7f533 and a0,a5,a4
5b2: bbcd j 3a4 <ssd1306_drawstr>
while (s[len]) len++;
5b4: 0705 addi a4,a4,1
5b6: bff9 j 594 <draw_center_str+0x4>
000005b8 <read_buttons>:
static Buttons read_buttons(void)
{
// active-low: pressed reads 0
Buttons b;
b.ok = !funDigitalRead(BTN_OK);
5b8: 400117b7 lui a5,0x40011
5bc: 4788 lw a0,8(a5)
b.left = !funDigitalRead(BTN_LEFT);
5be: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00>
5c2: 4798 lw a4,8(a5)
b.right = !funDigitalRead(BTN_RIGHT);
5c4: 479c lw a5,8(a5)
b.ok = !funDigitalRead(BTN_OK);
5c6: fff54513 not a0,a0
b.left = !funDigitalRead(BTN_LEFT);
5ca: 8319 srli a4,a4,0x6
5cc: fff74713 not a4,a4
b.right = !funDigitalRead(BTN_RIGHT);
5d0: 8395 srli a5,a5,0x5
5d2: fff7c793 not a5,a5
return b;
5d6: 8b05 andi a4,a4,1
5d8: 8905 andi a0,a0,1
5da: 0722 slli a4,a4,0x8
5dc: 8b85 andi a5,a5,1
{
5de: 1171 addi sp,sp,-4
return b;
5e0: 07c2 slli a5,a5,0x10
5e2: 8d59 or a0,a0,a4
}
5e4: 8d5d or a0,a0,a5
5e6: 0111 addi sp,sp,4
5e8: 8082 ret
000005ea <ssd1306_drawFastVLine.constprop.0>:
if((x >= SSD1306_W) || (y >= SSD1306_H)) return;
5ea: 07f00793 li a5,127
5ee: 02a7cf63 blt a5,a0,62c <ssd1306_drawFastVLine.constprop.0+0x42>
void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color)
5f2: 1141 addi sp,sp,-16
5f4: c422 sw s0,8(sp)
5f6: c606 sw ra,12(sp)
5f8: c226 sw s1,4(sp)
if((y+h-1) >= SSD1306_H) h = SSD1306_H-y;
5fa: 00c587b3 add a5,a1,a2
5fe: 04000713 li a4,64
602: 842e mv s0,a1
604: 00f75463 bge a4,a5,60c <ssd1306_drawFastVLine.constprop.0+0x22>
608: 40b70633 sub a2,a4,a1
60c: 008604b3 add s1,a2,s0
while(h--)
610: 00941763 bne s0,s1,61e <ssd1306_drawFastVLine.constprop.0+0x34>
}
614: 40b2 lw ra,12(sp)
616: 4422 lw s0,8(sp)
618: 4492 lw s1,4(sp)
61a: 0141 addi sp,sp,16
61c: 8082 ret
ssd1306_drawPixel(x, y++, color);
61e: 85a2 mv a1,s0
620: 4605 li a2,1
622: c02a sw a0,0(sp)
624: 3391 jal 368 <ssd1306_drawPixel>
626: 4502 lw a0,0(sp)
628: 0405 addi s0,s0,1
62a: b7dd j 610 <ssd1306_drawFastVLine.constprop.0+0x26>
62c: 8082 ret
0000062e <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) {
62e: fd810113 addi sp,sp,-40
632: 00e587b3 add a5,a1,a4
636: d222 sw s0,36(sp)
638: d026 sw s1,32(sp)
63a: c82a sw a0,16(sp)
63c: ca32 sw a2,20(sp)
uint32_t bytes_to_draw = width / 8;
63e: 0036d413 srli s0,a3,0x3
642: c63e sw a5,12(sp)
644: 4381 li t2,0
uint32_t v_mask = 1 << (y_absolute & 7);
646: 0075f793 andi a5,a1,7
64a: 4705 li a4,1
64c: 00f717b3 sll a5,a4,a5
650: c03e sw a5,0(sp)
uint32_t input_byte = input[byte + line * bytes_to_draw];
652: 47d2 lw a5,20(sp)
for (uint32_t byte = 0; byte < bytes_to_draw; byte++) {
654: 4681 li a3,0
uint32_t input_byte = input[byte + line * bytes_to_draw];
656: 979e add a5,a5,t2
658: cc3e sw a5,24(sp)
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
65a: 0035d793 srli a5,a1,0x3
65e: 079e slli a5,a5,0x7
660: ce3e sw a5,28(sp)
uint32_t input_byte = input[byte + line * bytes_to_draw];
662: 47e2 lw a5,24(sp)
x_absolute = x + 8 * byte + pixel;
664: 00369293 slli t0,a3,0x3
for (pixel = 0; pixel < 8; pixel++) {
668: 4701 li a4,0
uint32_t input_byte = input[byte + line * bytes_to_draw];
66a: 97b6 add a5,a5,a3
66c: 0007c783 lbu a5,0(a5)
670: c23e sw a5,4(sp)
x_absolute = x + 8 * byte + pixel;
672: 47c2 lw a5,16(sp)
674: 92be add t0,t0,a5
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
676: 47f2 lw a5,28(sp)
678: 005784b3 add s1,a5,t0
if (x_absolute >= SSD1306_W) {
67c: 00e287b3 add a5,t0,a4
680: 07f00613 li a2,127
684: 04f66463 bltu a2,a5,6cc <ssd1306_drawImage.constprop.0+0x9e>
uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default)
688: 4512 lw a0,4(sp)
68a: 08000793 li a5,128
68e: 40e7d7b3 sra a5,a5,a4
692: 8fe9 and a5,a5,a0
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
694: 00e48633 add a2,s1,a4
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
698: c4418513 addi a0,gp,-956 # 20000040 <ssd1306_buffer>
69c: 9532 add a0,a0,a2
69e: 00014303 lbu t1,0(sp)
uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default)
6a2: c43e sw a5,8(sp)
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
6a4: 00054783 lbu a5,0(a0)
6a8: fff34613 not a2,t1
for (pixel = 0; pixel < 8; pixel++) {
6ac: 0705 addi a4,a4,1
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
6ae: 8e7d and a2,a2,a5
6b0: 47a2 lw a5,8(sp)
6b2: 00f037b3 snez a5,a5
6b6: 40f007b3 neg a5,a5
6ba: 00f37333 and t1,t1,a5
6be: 00666633 or a2,a2,t1
6c2: 00c50023 sb a2,0(a0)
for (pixel = 0; pixel < 8; pixel++) {
6c6: 47a1 li a5,8
6c8: faf71ae3 bne a4,a5,67c <ssd1306_drawImage.constprop.0+0x4e>
for (uint32_t byte = 0; byte < bytes_to_draw; byte++) {
6cc: 0685 addi a3,a3,1 # 40001 <tama.c.67bb5960+0x3c570>
6ce: f8d41ae3 bne s0,a3,662 <ssd1306_drawImage.constprop.0+0x34>
for (uint32_t line = 0; line < height; line++) {
6d2: 47b2 lw a5,12(sp)
6d4: 0585 addi a1,a1,1
6d6: 93a2 add t2,t2,s0
6d8: 00b78663 beq a5,a1,6e4 <ssd1306_drawImage.constprop.0+0xb6>
if (y_absolute >= SSD1306_H) {
6dc: 04000793 li a5,64
6e0: f6f593e3 bne a1,a5,646 <ssd1306_drawImage.constprop.0+0x18>
}
6e4: 5412 lw s0,36(sp)
6e6: 5482 lw s1,32(sp)
6e8: 02810113 addi sp,sp,40
6ec: 8082 ret
000006ee <ssd1306_drawFastHLine.part.0.constprop.0>:
void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color)
6ee: 1141 addi sp,sp,-16
if((x+w-1) >= SSD1306_W) w = SSD1306_W-x;
6f0: fff60793 addi a5,a2,-1
void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color)
6f4: c606 sw ra,12(sp)
6f6: c422 sw s0,8(sp)
6f8: c226 sw s1,4(sp)
if((x+w-1) >= SSD1306_W) w = SSD1306_W-x;
6fa: 97aa add a5,a5,a0
6fc: 07f00713 li a4,127
700: 00f77563 bgeu a4,a5,70a <ssd1306_drawFastHLine.part.0.constprop.0+0x1c>
704: 08000613 li a2,128
708: 8e09 sub a2,a2,a0
70a: 00c50433 add s0,a0,a2
while (w--)
70e: 00851763 bne a0,s0,71c <ssd1306_drawFastHLine.part.0.constprop.0+0x2e>
}
712: 40b2 lw ra,12(sp)
714: 4422 lw s0,8(sp)
716: 4492 lw s1,4(sp)
718: 0141 addi sp,sp,16
71a: 8082 ret
ssd1306_drawPixel(x++, y, color);
71c: 4605 li a2,1
71e: 00150493 addi s1,a0,1
722: c02e sw a1,0(sp)
724: 3191 jal 368 <ssd1306_drawPixel>
726: 4582 lw a1,0(sp)
728: 8526 mv a0,s1
72a: b7d5 j 70e <ssd1306_drawFastHLine.part.0.constprop.0+0x20>
0000072c <ssd1306_drawRect.constprop.0>:
void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color)
72c: 1131 addi sp,sp,-20
72e: c426 sw s1,8(sp)
730: 84b2 mv s1,a2
ssd1306_drawFastVLine(x, y, h, color);
732: 8636 mv a2,a3
void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color)
734: c806 sw ra,16(sp)
736: c622 sw s0,12(sp)
738: c236 sw a3,4(sp)
73a: 842a mv s0,a0
73c: c02e sw a1,0(sp)
ssd1306_drawFastVLine(x, y, h, color);
73e: 3575 jal 5ea <ssd1306_drawFastVLine.constprop.0>
ssd1306_drawFastVLine(x+w-1, y, h, color);
740: 4612 lw a2,4(sp)
742: 4582 lw a1,0(sp)
744: fff48513 addi a0,s1,-1
748: 9522 add a0,a0,s0
74a: 3545 jal 5ea <ssd1306_drawFastVLine.constprop.0>
74c: 4582 lw a1,0(sp)
74e: 8626 mv a2,s1
750: 8522 mv a0,s0
752: 3f71 jal 6ee <ssd1306_drawFastHLine.part.0.constprop.0>
ssd1306_drawFastHLine(x, y+h-1, w, color);
754: 4782 lw a5,0(sp)
756: 8522 mv a0,s0
}
758: 4432 lw s0,12(sp)
ssd1306_drawFastHLine(x, y+h-1, w, color);
75a: fff78593 addi a1,a5,-1
75e: 4792 lw a5,4(sp)
}
760: 40c2 lw ra,16(sp)
762: 8626 mv a2,s1
764: 44a2 lw s1,8(sp)
766: 95be add a1,a1,a5
768: 0151 addi sp,sp,20
76a: b751 j 6ee <ssd1306_drawFastHLine.part.0.constprop.0>
0000076c <draw_bar>:
{
76c: 1121 addi sp,sp,-24
76e: c822 sw s0,16(sp)
770: c626 sw s1,12(sp)
772: 842a mv s0,a0
774: 84b2 mv s1,a2
ssd1306_drawstr(0, y, label, 1);
776: 4685 li a3,1
778: 862e mv a2,a1
77a: 85aa mv a1,a0
77c: 4501 li a0,0
{
77e: ca06 sw ra,20(sp)
ssd1306_drawstr(0, y, label, 1);
780: 3115 jal 3a4 <ssd1306_drawstr>
ssd1306_drawRect(bx, y, bw, 7, 1);
782: 03000513 li a0,48
786: 469d li a3,7
788: 04c00613 li a2,76
78c: 85a2 mv a1,s0
78e: 3f79 jal 72c <ssd1306_drawRect.constprop.0>
int fill = (val * (bw - 2)) / 100;
790: 00349513 slli a0,s1,0x3
794: 9526 add a0,a0,s1
796: 050a slli a0,a0,0x2
798: 9526 add a0,a0,s1
79a: 0506 slli a0,a0,0x1
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
79c: 06300793 li a5,99
7a0: 02a7df63 bge a5,a0,7de <draw_bar+0x72>
7a4: 00140793 addi a5,s0,1
int fill = (val * (bw - 2)) / 100;
7a8: 06400593 li a1,100
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
7ac: c03e sw a5,0(sp)
int fill = (val * (bw - 2)) / 100;
7ae: 38cd jal a0 <__divsi3>
7b0: 4782 lw a5,0(sp)
7b2: 872a mv a4,a0
7b4: 0419 addi s0,s0,6
7b6: 03170693 addi a3,a4,49
m=x;
7ba: 03100493 li s1,49
7be: 8526 mv a0,s1
ssd1306_drawPixel(m++, n, color);
7c0: 85be mv a1,a5
7c2: 4605 li a2,1
7c4: c436 sw a3,8(sp)
7c6: c23a sw a4,4(sp)
7c8: c03e sw a5,0(sp)
7ca: 3e79 jal 368 <ssd1306_drawPixel>
while(w--)
7cc: 46a2 lw a3,8(sp)
ssd1306_drawPixel(m++, n, color);
7ce: 0485 addi s1,s1,1
while(w--)
7d0: 4782 lw a5,0(sp)
7d2: 4712 lw a4,4(sp)
7d4: fed495e3 bne s1,a3,7be <draw_bar+0x52>
n++;
7d8: 0785 addi a5,a5,1
while(h--)
7da: fc879ee3 bne a5,s0,7b6 <draw_bar+0x4a>
}
7de: 40d2 lw ra,20(sp)
7e0: 4442 lw s0,16(sp)
7e2: 44b2 lw s1,12(sp)
7e4: 0161 addi sp,sp,24
7e6: 8082 ret
000007e8 <internal_handle_input.constprop.0>:
uint32_t dmd0 = *dmdata0;
7e8: e00007b7 lui a5,0xe0000
7ec: 0f47a783 lw a5,244(a5) # e00000f4 <_eusrstack+0xbffff8f4>
}
7f0: 8082 ret
000007f2 <_write.constprop.0>:
if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0;
7f2: e00007b7 lui a5,0xe0000
7f6: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4>
7fa: 4398 lw a4,0(a5)
WEAK int _write(int fd, const char *buf, int size)
7fc: 1121 addi sp,sp,-24
7fe: ca06 sw ra,20(sp)
800: c822 sw s0,16(sp)
802: c626 sw s1,12(sp)
if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0;
804: 0c077713 andi a4,a4,192
808: 0c000693 li a3,192
80c: 00d70b63 beq a4,a3,822 <_write.constprop.0+0x30>
char buffer[4] = { 0 };
810: c402 sw zero,8(sp)
812: 842e mv s0,a1
if( size == 0 )
814: eddd bnez a1,8d2 <_write.constprop.0+0xe0>
lastdmd = (*DMDATA0);
816: 439c lw a5,0(a5)
if( lastdmd && !(lastdmd&0x80) ) internal_handle_input( (uint32_t*)DMDATA0 );
818: c789 beqz a5,822 <_write.constprop.0+0x30>
81a: 0807f793 andi a5,a5,128
81e: e391 bnez a5,822 <_write.constprop.0+0x30>
820: 37e1 jal 7e8 <internal_handle_input.constprop.0>
if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0;
822: 4401 li s0,0
}
824: 40d2 lw ra,20(sp)
826: 8522 mv a0,s0
828: 4442 lw s0,16(sp)
82a: 44b2 lw s1,12(sp)
82c: 0161 addi sp,sp,24
82e: 8082 ret
int tosend = size - place;
830: 409407b3 sub a5,s0,s1
if( tosend > 7 ) tosend = 7;
834: 471d li a4,7
836: 00f75363 bge a4,a5,83c <_write.constprop.0+0x4a>
83a: 87ba mv a5,a4
83c: 001006b7 lui a3,0x100
while( ( lastdmd = (*DMDATA0) ) & 0x80 )
840: e0000737 lui a4,0xe0000
if( tosend > 7 ) tosend = 7;
844: 0685 addi a3,a3,1 # 100001 <tama.c.67bb5960+0xfc570>
while( ( lastdmd = (*DMDATA0) ) & 0x80 )
846: 0f470713 addi a4,a4,244 # e00000f4 <_eusrstack+0xbffff8f4>
84a: 4310 lw a2,0(a4)
84c: 08067593 andi a1,a2,128
850: e1a5 bnez a1,8b0 <_write.constprop.0+0xbe>
if( lastdmd ) internal_handle_input( (uint32_t*)DMDATA0 );
852: c611 beqz a2,85e <_write.constprop.0+0x6c>
854: c22a sw a0,4(sp)
856: c03e sw a5,0(sp)
858: 3f41 jal 7e8 <internal_handle_input.constprop.0>
85a: 4512 lw a0,4(sp)
85c: 4782 lw a5,0(sp)
85e: 0034 addi a3,sp,8
if( tosend > 7 ) tosend = 7;
860: 470d li a4,3
862: 85b6 mv a1,a3
while( t < tosend )
864: 04f74d63 blt a4,a5,8be <_write.constprop.0+0xcc>
*DMDATA1 = *(uint32_t*)&(buffer[0]);
868: 46a2 lw a3,8(sp)
86a: e0000737 lui a4,0xe0000
while( t < tosend && t < 3 )
86e: 460d li a2,3
*DMDATA1 = *(uint32_t*)&(buffer[0]);
870: 0ed72c23 sw a3,248(a4) # e00000f8 <_eusrstack+0xbffff8f8>
874: 009506b3 add a3,a0,s1
t = 0;
878: 4701 li a4,0
buffer[t+1] = buf[t+place];
87a: 0006c283 lbu t0,0(a3)
87e: 0705 addi a4,a4,1
880: 00e58333 add t1,a1,a4
884: 00530023 sb t0,0(t1)
while( t < tosend && t < 3 )
888: 00e78563 beq a5,a4,892 <_write.constprop.0+0xa0>
88c: 0685 addi a3,a3,1
88e: fec716e3 bne a4,a2,87a <_write.constprop.0+0x88>
buffer[0] = 0x80 | (tosend + 4);
892: 00478713 addi a4,a5,4
896: f8076713 ori a4,a4,-128
89a: 00e10423 sb a4,8(sp)
*DMDATA0 = *(uint32_t*)&(buffer[0]);
89e: 46a2 lw a3,8(sp)
8a0: e0000737 lui a4,0xe0000
place += tosend;
8a4: 94be add s1,s1,a5
*DMDATA0 = *(uint32_t*)&(buffer[0]);
8a6: 0ed72a23 sw a3,244(a4) # e00000f4 <_eusrstack+0xbffff8f4>
while( place < size )
8aa: f884c3e3 blt s1,s0,830 <_write.constprop.0+0x3e>
8ae: bf9d j 824 <_write.constprop.0+0x32>
if( timeout-- == 0 )
8b0: 16fd addi a3,a3,-1
8b2: fec1 bnez a3,84a <_write.constprop.0+0x58>
*DMDATA0 |= 0xc0;
8b4: 431c lw a5,0(a4)
8b6: 0c07e793 ori a5,a5,192
8ba: c31c sw a5,0(a4)
return 0;
8bc: b79d j 822 <_write.constprop.0+0x30>
buffer[t-3] = buf[t+place];
8be: 00e48633 add a2,s1,a4
8c2: 962a add a2,a2,a0
8c4: 00064603 lbu a2,0(a2)
t++;
8c8: 0705 addi a4,a4,1
8ca: 0685 addi a3,a3,1
buffer[t-3] = buf[t+place];
8cc: fec68fa3 sb a2,-1(a3)
8d0: bf51 j 864 <_write.constprop.0+0x72>
8d2: 4481 li s1,0
8d4: bfd9 j 8aa <_write.constprop.0+0xb8>
000008d6 <__puts_uart>:
{
8d6: 1161 addi sp,sp,-8
8d8: c022 sw s0,0(sp)
8da: c206 sw ra,4(sp)
8dc: 842e mv s0,a1
_write( 0, s, len );
8de: 3f11 jal 7f2 <_write.constprop.0>
}
8e0: 4092 lw ra,4(sp)
8e2: 8522 mv a0,s0
8e4: 4402 lw s0,0(sp)
8e6: 0121 addi sp,sp,8
8e8: 8082 ret
000008ea <handle_reset>:
asm volatile( "\n\
8ea: 20000197 auipc gp,0x20000
8ee: b1218193 addi gp,gp,-1262 # 200003fc <__global_pointer$>
8f2: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack>
8f6: 6509 lui a0,0x2
8f8: 88050513 addi a0,a0,-1920 # 1880 <main+0xa20>
8fc: 30051073 csrw mstatus,a0
900: fffff697 auipc a3,0xfffff
904: 70068693 addi a3,a3,1792 # 0 <InterruptVector>
908: 0036e693 ori a3,a3,3
90c: 30569073 csrw mtvec,a3
asm volatile(
910: c1c18513 addi a0,gp,-996 # 20000018 <anim_exp>
914: 04418593 addi a1,gp,68 # 20000440 <_ebss>
918: 4601 li a2,0
91a: 00b55663 bge a0,a1,926 <handle_reset+0x3c>
91e: c110 sw a2,0(a0)
920: 0511 addi a0,a0,4
922: feb54ee3 blt a0,a1,91e <handle_reset+0x34>
926: 00002517 auipc a0,0x2
92a: f0e50513 addi a0,a0,-242 # 2834 <_data_lma>
92e: c0418593 addi a1,gp,-1020 # 20000000 <timeout_idx>
932: c1c18613 addi a2,gp,-996 # 20000018 <anim_exp>
936: 00c58863 beq a1,a2,946 <handle_reset+0x5c>
93a: 4114 lw a3,0(a0)
93c: c194 sw a3,0(a1)
93e: 0511 addi a0,a0,4
940: 0591 addi a1,a1,4
942: fec59ae3 bne a1,a2,936 <handle_reset+0x4c>
SysTick->CTLR = 1;
946: e000f7b7 lui a5,0xe000f
94a: 4705 li a4,1
94c: c398 sw a4,0(a5)
asm volatile(
94e: 6785 lui a5,0x1
950: e6078793 addi a5,a5,-416 # e60 <main>
954: 34179073 csrw mepc,a5
958: 30200073 mret
0000095c <ADC1_2_IRQHandler>:
// Return the Machine Exception Program Register (MEPC)
static inline uint32_t __get_MEPC(void)
{
uint32_t result;
__ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mepc" : "=r"(result));
95c: 34102573 csrr a0,mepc
PrintHex( __get_MEPC() ); // "addr2line -e debugprintfdemo.elf 0x000007e6" ---> debugprintfdemo.c:45
960: 889ff0ef jal 1e8 <PrintHex>
__ASM volatile( ADD_ARCH_ZICSR "csrr %0, mstatus": "=r"(result) );
964: 30002573 csrr a0,mstatus
PrintHex( __get_MSTATUS() );
968: 881ff0ef jal 1e8 <PrintHex>
// Return the Machine Trap Value Register (MTVAL)
static inline uint32_t __get_MTVAL(void)
{
uint32_t result;
__ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mtval" : "=r" (result) );
96c: 34302573 csrr a0,mtval
PrintHex( __get_MTVAL() );
970: 879ff0ef jal 1e8 <PrintHex>
__ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mcause": "=r"(result));
974: 34202573 csrr a0,mcause
PrintHex( __get_MCAUSE() );
978: 871ff0ef jal 1e8 <PrintHex>
while( (*DMDATA0) & 0x80 );
97c: e00007b7 lui a5,0xe0000
980: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4>
984: 4398 lw a4,0(a5)
986: 08077713 andi a4,a4,128
98a: ff6d bnez a4,984 <ADC1_2_IRQHandler+0x28>
*DMDATA0 = 0x0a85;
98c: 6705 lui a4,0x1
98e: a8570713 addi a4,a4,-1403 # a85 <mini_vpprintf+0xb5>
992: c398 sw a4,0(a5)
while( (*DMDATA0) & 0x80 );
994: e00007b7 lui a5,0xe0000
998: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4>
99c: 4398 lw a4,0(a5)
99e: 08077713 andi a4,a4,128
9a2: ff6d bnez a4,99c <ADC1_2_IRQHandler+0x40>
*DMDATA0 = 0xaaaaaa83;
9a4: aaaab737 lui a4,0xaaaab
9a8: a8370713 addi a4,a4,-1405 # aaaaaa83 <_eusrstack+0x8aaaa283>
9ac: c398 sw a4,0(a5)
asm volatile( "1: j 1b" );
9ae: a001 j 9ae <ADC1_2_IRQHandler+0x52>
000009b0 <NMI_Handler>:
RCC->INTR |= RCC_CSSC; // clear the clock security int flag
9b0: 40021737 lui a4,0x40021
9b4: 471c lw a5,8(a4)
9b6: 008006b7 lui a3,0x800
9ba: 8fd5 or a5,a5,a3
9bc: c71c sw a5,8(a4)
000009be <strlen>:
for (; *s; s++);
9be: 87aa mv a5,a0
9c0: 0007c703 lbu a4,0(a5)
9c4: e701 bnez a4,9cc <strlen+0xe>
}
9c6: 40a78533 sub a0,a5,a0
9ca: 8082 ret
for (; *s; s++);
9cc: 0785 addi a5,a5,1
9ce: bfcd j 9c0 <strlen+0x2>
000009d0 <mini_vpprintf>:
{
9d0: fa410113 addi sp,sp,-92
9d4: caa2 sw s0,84(sp)
9d6: c8a6 sw s1,80(sp)
9d8: cc86 sw ra,88(sp)
9da: c02a sw a0,0(sp)
9dc: c22e sw a1,4(sp)
9de: 8432 mv s0,a2
9e0: 84b6 mv s1,a3
if(puts == (void*)0) {
9e2: e509 bnez a0,9ec <mini_vpprintf+0x1c>
puts = _puts; buf = (void*)0;
9e4: 1a800793 li a5,424
9e8: c202 sw zero,4(sp)
9ea: c03e sw a5,0(sp)
int n = 0;
9ec: ca02 sw zero,20(sp)
while ((ch=*(fmt++))) {
9ee: 00044783 lbu a5,0(s0)
9f2: 00140713 addi a4,s0,1
9f6: 00f10fa3 sb a5,31(sp)
9fa: eb81 bnez a5,a0a <mini_vpprintf+0x3a>
}
9fc: 40e6 lw ra,88(sp)
9fe: 4456 lw s0,84(sp)
a00: 4552 lw a0,20(sp)
a02: 44c6 lw s1,80(sp)
a04: 05c10113 addi sp,sp,92
a08: 8082 ret
a0a: c63a sw a4,12(sp)
if (ch!='%') {
a0c: 02500693 li a3,37
a10: 02d78063 beq a5,a3,a30 <mini_vpprintf+0x60>
len = puts(&ch, len, buf);
a14: 4612 lw a2,4(sp)
a16: 4782 lw a5,0(sp)
a18: 4585 li a1,1
a1a: 01f10513 addi a0,sp,31
a1e: 9782 jalr a5
while ((ch=*(fmt++))) {
a20: 4732 lw a4,12(sp)
a22: c426 sw s1,8(sp)
a24: 843a mv s0,a4
n = n + len;
a26: 47d2 lw a5,20(sp)
a28: 44a2 lw s1,8(sp)
a2a: 97aa add a5,a5,a0
a2c: ca3e sw a5,20(sp)
a2e: b7c1 j 9ee <mini_vpprintf+0x1e>
ch=*(fmt++);
a30: 00144783 lbu a5,1(s0)
if (ch == '0') pad_char = '0';
a34: 03000693 li a3,48
ch=*(fmt++);
a38: 00240713 addi a4,s0,2
a3c: 00f10fa3 sb a5,31(sp)
if (ch == '0') pad_char = '0';
a40: c63e sw a5,12(sp)
a42: 08d79363 bne a5,a3,ac8 <mini_vpprintf+0xf8>
ch=*(fmt++);
a46: 843a mv s0,a4
a48: 4681 li a3,0
a4a: 4701 li a4,0
while (ch >= '0' && ch <= '9') {
a4c: 45a5 li a1,9
a4e: a819 j a64 <mini_vpprintf+0x94>
pad_to = pad_to * 10 + (ch - '0');
a50: 00271793 slli a5,a4,0x2
a54: 97ba add a5,a5,a4
a56: 0786 slli a5,a5,0x1
ch=*(fmt++);
a58: 0405 addi s0,s0,1
pad_to = pad_to * 10 + (ch - '0');
a5a: 00f60733 add a4,a2,a5
ch=*(fmt++);
a5e: fff44783 lbu a5,-1(s0)
a62: 4685 li a3,1
while (ch >= '0' && ch <= '9') {
a64: fd078613 addi a2,a5,-48
a68: 0ff67513 zext.b a0,a2
a6c: fea5f2e3 bgeu a1,a0,a50 <mini_vpprintf+0x80>
a70: c299 beqz a3,a76 <mini_vpprintf+0xa6>
a72: 00f10fa3 sb a5,31(sp)
if(pad_to > (signed int) sizeof(bf)) {
a76: c83a sw a4,16(sp)
a78: 46e1 li a3,24
a7a: 00e6d363 bge a3,a4,a80 <mini_vpprintf+0xb0>
a7e: c836 sw a3,16(sp)
if (ch == 'l') {
a80: 06c00613 li a2,108
char l = 0;
a84: 4681 li a3,0
if (ch == 'l') {
a86: 00c79863 bne a5,a2,a96 <mini_vpprintf+0xc6>
ch=*(fmt++);
a8a: 00044783 lbu a5,0(s0)
l = 1;
a8e: 4685 li a3,1
ch=*(fmt++);
a90: 0405 addi s0,s0,1
a92: 00f10fa3 sb a5,31(sp)
switch (ch) {
a96: 01f14603 lbu a2,31(sp)
a9a: 06400793 li a5,100
a9e: 06f60563 beq a2,a5,b08 <mini_vpprintf+0x138>
aa2: 02c7e763 bltu a5,a2,ad0 <mini_vpprintf+0x100>
aa6: 05800793 li a5,88
aaa: 0af60263 beq a2,a5,b4e <mini_vpprintf+0x17e>
aae: 06300793 li a5,99
ab2: 0cf60063 beq a2,a5,b72 <mini_vpprintf+0x1a2>
ab6: d239 beqz a2,9fc <mini_vpprintf+0x2c>
len = puts(&ch, len, buf);
ab8: 4612 lw a2,4(sp)
aba: 4782 lw a5,0(sp)
abc: 4585 li a1,1
abe: 01f10513 addi a0,sp,31
ac2: 9782 jalr a5
break;
ac4: c426 sw s1,8(sp)
ac6: b785 j a26 <mini_vpprintf+0x56>
char pad_char = ' ';
ac8: 02000693 li a3,32
acc: c636 sw a3,12(sp)
ace: bfa5 j a46 <mini_vpprintf+0x76>
switch (ch) {
ad0: 07500793 li a5,117
ad4: 02f60a63 beq a2,a5,b08 <mini_vpprintf+0x138>
ad8: 07800793 li a5,120
adc: 06f60963 beq a2,a5,b4e <mini_vpprintf+0x17e>
ae0: 07300793 li a5,115
ae4: fcf61ae3 bne a2,a5,ab8 <mini_vpprintf+0xe8>
ptr = va_arg(va, char*);
ae8: 00448793 addi a5,s1,4
aec: 4084 lw s1,0(s1)
aee: cc3a sw a4,24(sp)
af0: c43e sw a5,8(sp)
len = mini_strlen(ptr);
af2: 8526 mv a0,s1
af4: 35e9 jal 9be <strlen>
if (pad_to > 0) {
af6: 4762 lw a4,24(sp)
len = mini_strlen(ptr);
af8: 85aa mv a1,a0
if (pad_to > 0) {
afa: 08e05963 blez a4,b8c <mini_vpprintf+0x1bc>
len = mini_pad(ptr, len, pad_char, pad_to, bf);
afe: 46c2 lw a3,16(sp)
b00: 4632 lw a2,12(sp)
b02: 1838 addi a4,sp,56
b04: 8526 mv a0,s1
b06: a025 j b2e <mini_vpprintf+0x15e>
len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2);
b08: 00448793 addi a5,s1,4
b0c: c43e sw a5,8(sp)
if(l) {
b0e: ca85 beqz a3,b3e <mini_vpprintf+0x16e>
len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2);
b10: f8b60613 addi a2,a2,-117
b14: 1018 addi a4,sp,32
b16: 00163693 seqz a3,a2
b1a: 4088 lw a0,0(s1)
b1c: 4601 li a2,0
b1e: 45a9 li a1,10
b20: f34ff0ef jal 254 <mini_itoa.part.0>
len = mini_pad(bf2, len, pad_char, pad_to, bf);
b24: 46c2 lw a3,16(sp)
b26: 4632 lw a2,12(sp)
b28: 1838 addi a4,sp,56
b2a: 85aa mv a1,a0
len = mini_pad(bf2, len, pad_char, pad_to, bf);
b2c: 1008 addi a0,sp,32
b2e: df0ff0ef jal 11e <mini_pad>
len = puts(bf, len, buf);
b32: 4612 lw a2,4(sp)
len = mini_pad(bf2, len, pad_char, pad_to, bf);
b34: 85aa mv a1,a0
len = puts(bf, len, buf);
b36: 1828 addi a0,sp,56
b38: 4782 lw a5,0(sp)
b3a: 9782 jalr a5
break;
b3c: b5ed j a26 <mini_vpprintf+0x56>
if(ch == 'u') {
b3e: 07500793 li a5,117
b42: 1018 addi a4,sp,32
b44: 4685 li a3,1
b46: fcf60ae3 beq a2,a5,b1a <mini_vpprintf+0x14a>
if (radix > 16)
b4a: 4681 li a3,0
b4c: b7f9 j b1a <mini_vpprintf+0x14a>
if(l) {
b4e: 4088 lw a0,0(s1)
len = mini_itoa(va_arg(va, unsigned long), 16, (ch=='X'), 1, bf2);
b50: fa860613 addi a2,a2,-88
len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2);
b54: 00448793 addi a5,s1,4
b58: 1018 addi a4,sp,32
b5a: 4685 li a3,1
b5c: 00163613 seqz a2,a2
b60: 45c1 li a1,16
b62: c43e sw a5,8(sp)
if (radix > 16)
b64: ef0ff0ef jal 254 <mini_itoa.part.0>
len = mini_pad(bf2, len, pad_char, pad_to, bf);
b68: 46c2 lw a3,16(sp)
b6a: 4632 lw a2,12(sp)
b6c: 85aa mv a1,a0
b6e: 1838 addi a4,sp,56
b70: bf75 j b2c <mini_vpprintf+0x15c>
ch = (char)(va_arg(va, int));
b72: 00448793 addi a5,s1,4
b76: c43e sw a5,8(sp)
b78: 409c lw a5,0(s1)
len = mini_pad(&ch, 1, pad_char, pad_to, bf);
b7a: 46c2 lw a3,16(sp)
b7c: 4632 lw a2,12(sp)
ch = (char)(va_arg(va, int));
b7e: 00f10fa3 sb a5,31(sp)
len = mini_pad(&ch, 1, pad_char, pad_to, bf);
b82: 1838 addi a4,sp,56
b84: 4585 li a1,1
b86: 01f10513 addi a0,sp,31
b8a: b755 j b2e <mini_vpprintf+0x15e>
len = puts(ptr, len, buf);
b8c: 4612 lw a2,4(sp)
b8e: 8526 mv a0,s1
b90: b765 j b38 <mini_vpprintf+0x168>
00000b92 <printf>:
{
b92: 1111 addi sp,sp,-28
b94: c632 sw a2,12(sp)
int ret_status = mini_vpprintf(__puts_uart, 0, format, args);
b96: 862a mv a2,a0
b98: 6505 lui a0,0x1
{
b9a: c42e sw a1,8(sp)
b9c: c836 sw a3,16(sp)
int ret_status = mini_vpprintf(__puts_uart, 0, format, args);
b9e: 4581 li a1,0
va_start( args, format );
ba0: 0034 addi a3,sp,8
int ret_status = mini_vpprintf(__puts_uart, 0, format, args);
ba2: 8d650513 addi a0,a0,-1834 # 8d6 <__puts_uart>
{
ba6: c206 sw ra,4(sp)
ba8: ca3a sw a4,20(sp)
baa: cc3e sw a5,24(sp)
va_start( args, format );
bac: c036 sw a3,0(sp)
int ret_status = mini_vpprintf(__puts_uart, 0, format, args);
bae: 350d jal 9d0 <mini_vpprintf>
}
bb0: 4092 lw ra,4(sp)
bb2: 0171 addi sp,sp,28
bb4: 8082 ret
00000bb6 <ssd1306_i2c_error.isra.0>:
* error handler
*/
uint8_t ssd1306_i2c_error(uint8_t err)
{
// report error
printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]);
bb6: 6789 lui a5,0x2
bb8: 050a slli a0,a0,0x2
bba: ea078793 addi a5,a5,-352 # 1ea0 <errstr>
bbe: 97aa add a5,a5,a0
bc0: 438c lw a1,0(a5)
bc2: 6509 lui a0,0x2
uint8_t ssd1306_i2c_error(uint8_t err)
bc4: 1171 addi sp,sp,-4
printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]);
bc6: 90c50513 addi a0,a0,-1780 # 190c <main+0xaac>
uint8_t ssd1306_i2c_error(uint8_t err)
bca: c006 sw ra,0(sp)
printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]);
bcc: 37d9 jal b92 <printf>
// reset & initialize I2C
ssd1306_i2c_setup();
return 1;
}
bce: 4082 lw ra,0(sp)
bd0: 0111 addi sp,sp,4
ssd1306_i2c_setup();
bd2: f42ff06f j 314 <ssd1306_i2c_setup>
00000bd6 <ssd1306_i2c_send.constprop.0>:
}
#else
/*
* low-level packet send for blocking polled operation via i2c
*/
uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz)
bd6: 1171 addi sp,sp,-4
{
int32_t timeout;
// wait for not busy
timeout = TIMEOUT_MAX;
bd8: 6761 lui a4,0x18
while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--));
bda: 400057b7 lui a5,0x40005
uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz)
bde: c006 sw ra,0(sp)
timeout = TIMEOUT_MAX;
be0: 6a070713 addi a4,a4,1696 # 186a0 <tama.c.67bb5960+0x14c0f>
while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--));
be4: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00>
be8: 567d li a2,-1
bea: 0187d683 lhu a3,24(a5)
bee: 8a89 andi a3,a3,2
bf0: c6e1 beqz a3,cb8 <ssd1306_i2c_send.constprop.0+0xe2>
bf2: 177d addi a4,a4,-1
bf4: fec71be3 bne a4,a2,bea <ssd1306_i2c_send.constprop.0+0x14>
if(timeout==-1)
return ssd1306_i2c_error(0);
bf8: 4501 li a0,0
bfa: a821 j c12 <ssd1306_i2c_send.constprop.0+0x3c>
bfc: 67e1 lui a5,0x18
bfe: 6a178793 addi a5,a5,1697 # 186a1 <tama.c.67bb5960+0x14c10>
// send data one byte at a time
while(sz--)
{
// wait for TX Empty
timeout = TIMEOUT_MAX;
while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--));
c02: 01475683 lhu a3,20(a4)
c06: 0806f693 andi a3,a3,128
c0a: e699 bnez a3,c18 <ssd1306_i2c_send.constprop.0+0x42>
c0c: 17fd addi a5,a5,-1
c0e: fbf5 bnez a5,c02 <ssd1306_i2c_send.constprop.0+0x2c>
if(timeout==-1)
return ssd1306_i2c_error(3);
c10: 450d li a0,3
return ssd1306_i2c_error(1);
c12: 3755 jal bb6 <ssd1306_i2c_error.isra.0>
return ssd1306_i2c_error(0);
c14: 4505 li a0,1
c16: a889 j c68 <ssd1306_i2c_send.constprop.0+0x92>
// send command
I2C1->DATAR = *data++;
c18: 00054783 lbu a5,0(a0)
c1c: 0505 addi a0,a0,1
c1e: 00f71823 sh a5,16(a4)
while(sz--)
c22: fca59de3 bne a1,a0,bfc <ssd1306_i2c_send.constprop.0+0x26>
}
// wait for tx complete
timeout = TIMEOUT_MAX;
c26: 66e1 lui a3,0x18
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c28: 40005737 lui a4,0x40005
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
c2c: 00070637 lui a2,0x70
timeout = TIMEOUT_MAX;
c30: 6a068693 addi a3,a3,1696 # 186a0 <tama.c.67bb5960+0x14c0f>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c34: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
c38: 08460613 addi a2,a2,132 # 70084 <tama.c.67bb5960+0x6c5f3>
c3c: 55fd li a1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c3e: 01475503 lhu a0,20(a4)
c42: 01875783 lhu a5,24(a4)
c46: 07c2 slli a5,a5,0x10
c48: 8fc9 or a5,a5,a0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
c4a: 8ff1 and a5,a5,a2
c4c: 00c78763 beq a5,a2,c5a <ssd1306_i2c_send.constprop.0+0x84>
c50: 16fd addi a3,a3,-1
c52: feb696e3 bne a3,a1,c3e <ssd1306_i2c_send.constprop.0+0x68>
if(timeout==-1)
return ssd1306_i2c_error(4);
c56: 4511 li a0,4
c58: bf6d j c12 <ssd1306_i2c_send.constprop.0+0x3c>
// set STOP condition
I2C1->CTLR1 |= I2C_CTLR1_STOP;
c5a: 00075783 lhu a5,0(a4)
// we're happy
return 0;
c5e: 4501 li a0,0
I2C1->CTLR1 |= I2C_CTLR1_STOP;
c60: 2007e793 ori a5,a5,512
c64: 00f71023 sh a5,0(a4)
}
c68: 4082 lw ra,0(sp)
c6a: 0111 addi sp,sp,4
c6c: 8082 ret
while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--));
c6e: 40005737 lui a4,0x40005
c72: 95aa add a1,a1,a0
c74: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
c78: b76d j c22 <ssd1306_i2c_send.constprop.0+0x4c>
I2C1->DATAR = addr<<1;
c7a: 07800793 li a5,120
c7e: 00f71823 sh a5,16(a4)
timeout = TIMEOUT_MAX;
c82: 6661 lui a2,0x18
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c84: 400056b7 lui a3,0x40005
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
c88: 00070737 lui a4,0x70
timeout = TIMEOUT_MAX;
c8c: 6a060613 addi a2,a2,1696 # 186a0 <tama.c.67bb5960+0x14c0f>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c90: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
c94: 08270713 addi a4,a4,130 # 70082 <tama.c.67bb5960+0x6c5f1>
c98: 537d li t1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c9a: 0146d283 lhu t0,20(a3)
c9e: 0186d783 lhu a5,24(a3)
ca2: 07c2 slli a5,a5,0x10
ca4: 0057e7b3 or a5,a5,t0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
ca8: 8ff9 and a5,a5,a4
caa: fce782e3 beq a5,a4,c6e <ssd1306_i2c_send.constprop.0+0x98>
cae: 167d addi a2,a2,-1
cb0: fe6615e3 bne a2,t1,c9a <ssd1306_i2c_send.constprop.0+0xc4>
return ssd1306_i2c_error(2);
cb4: 4509 li a0,2
cb6: bfb1 j c12 <ssd1306_i2c_send.constprop.0+0x3c>
I2C1->CTLR1 |= I2C_CTLR1_START;
cb8: 0007d703 lhu a4,0(a5)
timeout = TIMEOUT_MAX;
cbc: 66e1 lui a3,0x18
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
cbe: 00030637 lui a2,0x30
I2C1->CTLR1 |= I2C_CTLR1_START;
cc2: 10076713 ori a4,a4,256
cc6: 00e79023 sh a4,0(a5)
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
cca: 40005737 lui a4,0x40005
timeout = TIMEOUT_MAX;
cce: 6a068693 addi a3,a3,1696 # 186a0 <tama.c.67bb5960+0x14c0f>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
cd2: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
cd6: 0605 addi a2,a2,1 # 30001 <tama.c.67bb5960+0x2c570>
cd8: 537d li t1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
cda: 01475283 lhu t0,20(a4)
cde: 01875783 lhu a5,24(a4)
ce2: 07c2 slli a5,a5,0x10
ce4: 0057e7b3 or a5,a5,t0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
ce8: 8ff1 and a5,a5,a2
cea: f8c788e3 beq a5,a2,c7a <ssd1306_i2c_send.constprop.0+0xa4>
cee: 16fd addi a3,a3,-1
cf0: fe6695e3 bne a3,t1,cda <ssd1306_i2c_send.constprop.0+0x104>
return ssd1306_i2c_error(1);
cf4: 4505 li a0,1
cf6: bf31 j c12 <ssd1306_i2c_send.constprop.0+0x3c>
00000cf8 <ssd1306_cmd>:
{
cf8: fd810113 addi sp,sp,-40
/* build command or data packets */
if(cmd)
{
pkt[0] = 0;
pkt[1] = *data;
cfc: 00a100a3 sb a0,1(sp)
else
{
pkt[0] = 0x40;
memcpy(&pkt[1], data, sz);
}
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
d00: 4589 li a1,2
d02: 850a mv a0,sp
d04: d206 sw ra,36(sp)
pkt[0] = 0;
d06: 00010023 sb zero,0(sp)
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
d0a: 35f1 jal bd6 <ssd1306_i2c_send.constprop.0>
}
d0c: 5092 lw ra,36(sp)
d0e: 02810113 addi sp,sp,40
d12: 8082 ret
00000d14 <mini_vsnprintf>:
{
d14: 1131 addi sp,sp,-20
d16: c806 sw ra,16(sp)
d18: c622 sw s0,12(sp)
b.buffer = buffer;
d1a: c02a sw a0,0(sp)
b.pbuffer = buffer;
d1c: c22a sw a0,4(sp)
b.buffer_len = buffer_len;
d1e: c42e sw a1,8(sp)
if(buffer_len == 0) buffer = (void*) 0;
d20: c19d beqz a1,d46 <mini_vsnprintf+0x32>
int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va);
d22: 00a037b3 snez a5,a0
d26: 40f007b3 neg a5,a5
d2a: 842a mv s0,a0
d2c: 00f175b3 and a1,sp,a5
d30: 1a800513 li a0,424
d34: 3971 jal 9d0 <mini_vpprintf>
if(buffer == (void*) 0) {
d36: c401 beqz s0,d3e <mini_vsnprintf+0x2a>
return b.pbuffer - b.buffer;
d38: 4512 lw a0,4(sp)
d3a: 4782 lw a5,0(sp)
d3c: 8d1d sub a0,a0,a5
}
d3e: 40c2 lw ra,16(sp)
d40: 4432 lw s0,12(sp)
d42: 0151 addi sp,sp,20
d44: 8082 ret
d46: 4401 li s0,0
int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va);
d48: 4581 li a1,0
d4a: b7dd j d30 <mini_vsnprintf+0x1c>
00000d4c <snprintf>:
{
d4c: 1131 addi sp,sp,-20
d4e: c436 sw a3,8(sp)
va_start( args, format );
d50: 0034 addi a3,sp,8
{
d52: c206 sw ra,4(sp)
d54: c63a sw a4,12(sp)
d56: c83e sw a5,16(sp)
va_start( args, format );
d58: c036 sw a3,0(sp)
int ret = mini_vsnprintf( buffer, buffer_len, format, args );
d5a: 3f6d jal d14 <mini_vsnprintf>
}
d5c: 4092 lw ra,4(sp)
d5e: 0151 addi sp,sp,20
d60: 8082 ret
00000d62 <memset>:
WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; }
d62: 962a add a2,a2,a0
d64: 87aa mv a5,a0
d66: 00c79363 bne a5,a2,d6c <memset+0xa>
d6a: 8082 ret
d6c: 00b78023 sb a1,0(a5)
d70: 0785 addi a5,a5,1
d72: bfd5 j d66 <memset+0x4>
00000d74 <ssd1306_setbuf.constprop.0>:
memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer));
d74: 40000613 li a2,1024
d78: 4581 li a1,0
d7a: c4418513 addi a0,gp,-956 # 20000040 <ssd1306_buffer>
d7e: b7d5 j d62 <memset>
00000d80 <strcpy>:
for (; (*d=*s); s++, d++);
d80: 87aa mv a5,a0
d82: 0005c703 lbu a4,0(a1)
d86: 00e78023 sb a4,0(a5)
d8a: e311 bnez a4,d8e <strcpy+0xe>
}
d8c: 8082 ret
for (; (*d=*s); s++, d++);
d8e: 0585 addi a1,a1,1
d90: 0785 addi a5,a5,1
d92: bfc5 j d82 <strcpy+0x2>
00000d94 <memcpy>:
for (; n; n--) *d++ = *s++;
d94: 4781 li a5,0
d96: 00f61363 bne a2,a5,d9c <memcpy+0x8>
}
d9a: 8082 ret
for (; n; n--) *d++ = *s++;
d9c: 00f58733 add a4,a1,a5
da0: 00074683 lbu a3,0(a4)
da4: 00f50733 add a4,a0,a5
da8: 0785 addi a5,a5,1
daa: 00d70023 sb a3,0(a4)
dae: b7e5 j d96 <memcpy+0x2>
00000db0 <ssd1306_refresh>:
{
db0: 7179 addi sp,sp,-48
ssd1306_cmd(SSD1306_COLUMNADDR);
db2: 02100513 li a0,33
{
db6: d606 sw ra,44(sp)
db8: d422 sw s0,40(sp)
dba: d226 sw s1,36(sp)
ssd1306_cmd(SSD1306_COLUMNADDR);
dbc: 3f35 jal cf8 <ssd1306_cmd>
ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset)
dbe: 4501 li a0,0
dc0: 3f25 jal cf8 <ssd1306_cmd>
ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset)
dc2: 07f00513 li a0,127
dc6: 3f0d jal cf8 <ssd1306_cmd>
ssd1306_cmd(SSD1306_PAGEADDR);
dc8: 02200513 li a0,34
dcc: 3735 jal cf8 <ssd1306_cmd>
ssd1306_cmd(0); // Page start address (0 = reset)
dce: 4501 li a0,0
dd0: 3725 jal cf8 <ssd1306_cmd>
ssd1306_cmd(7); // Page end address
dd2: 451d li a0,7
dd4: c4418413 addi s0,gp,-956 # 20000040 <ssd1306_buffer>
dd8: 3705 jal cf8 <ssd1306_cmd>
for(i=0;i<sizeof(ssd1306_buffer);i+=SSD1306_PSZ)
dda: 40040493 addi s1,s0,1024
pkt[0] = 0x40;
dde: 04000793 li a5,64
memcpy(&pkt[1], data, sz);
de2: 85a2 mv a1,s0
de4: 02000613 li a2,32
de8: 00110513 addi a0,sp,1
pkt[0] = 0x40;
dec: 00f10023 sb a5,0(sp)
memcpy(&pkt[1], data, sz);
df0: 3755 jal d94 <memcpy>
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
df2: 02100593 li a1,33
df6: 850a mv a0,sp
df8: 02040413 addi s0,s0,32
dfc: 3be9 jal bd6 <ssd1306_i2c_send.constprop.0>
dfe: fe9410e3 bne s0,s1,dde <ssd1306_refresh+0x2e>
}
e02: 50b2 lw ra,44(sp)
e04: 5422 lw s0,40(sp)
e06: 5492 lw s1,36(sp)
e08: 6145 addi sp,sp,48
e0a: 8082 ret
00000e0c <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
e0c: 400227b7 lui a5,0x40022
e10: 4705 li a4,1
e12: 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;
e14: 400217b7 lui a5,0x40021
RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL.
e18: 01080737 lui a4,0x1080
RCC->CFGR0 = BASE_CFGR0;
e1c: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804>
RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL.
e20: 08170713 addi a4,a4,129 # 1080081 <tama.c.67bb5960+0x107c5f0>
e24: 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.
e26: 009f0737 lui a4,0x9f0
e2a: 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
e2c: 4398 lw a4,0(a5)
e2e: 00671693 slli a3,a4,0x6
e32: fe06dde3 bgez a3,e2c <SystemInit+0x20>
#if defined(CH32H41x)
RCC->PLLCFGR |= RCC_SYSPLL_GATE;
#endif
uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW
e36: 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
e38: 400216b7 lui a3,0x40021
uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW
e3c: 9b71 andi a4,a4,-4
RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source
e3e: 00276713 ori a4,a4,2
e42: c3d8 sw a4,4(a5)
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source
e44: 4721 li a4,8
e46: 42dc lw a5,4(a3)
e48: 8bb1 andi a5,a5,12
e4a: fee79ee3 bne a5,a4,e46 <SystemInit+0x3a>
*DMDATA1 = 0x00;
e4e: e00007b7 lui a5,0xe0000
e52: 0e07ac23 sw zero,248(a5) # e00000f8 <_eusrstack+0xbffff8f8>
*DMDATA0 = 0x80;
e56: 08000713 li a4,128
e5a: 0ee7aa23 sw a4,244(a5)
SetupDebugPrintf();
#endif
#if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS
CallConstructors();
#endif
}
e5e: 8082 ret
00000e60 <main>:
}
}
// ----------------------------------------------------------------- main
int main(void)
{
e60: f9810113 addi sp,sp,-104
e64: d286 sw ra,100(sp)
e66: d0a2 sw s0,96(sp)
e68: cea6 sw s1,92(sp)
SystemInit();
e6a: 374d jal e0c <SystemInit>
funGpioInitAll();
e6c: 400214b7 lui s1,0x40021
e70: 4c9c lw a5,24(s1)
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
e72: 40011437 lui s0,0x40011
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
e76: 76fd lui a3,0xfffff
funGpioInitAll();
e78: 0357e793 ori a5,a5,53
e7c: cc9c sw a5,24(s1)
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
e7e: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000>
e82: 4398 lw a4,0(a5)
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
e84: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff>
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
e88: f1000637 lui a2,0xf1000
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
e8c: f0f77713 andi a4,a4,-241
e90: 01076713 ori a4,a4,16
e94: c398 sw a4,0(a5)
funDigitalWrite(LED_PIN, FUN_LOW);
e96: 00020737 lui a4,0x20
e9a: cb98 sw a4,16(a5)
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
e9c: 40040793 addi a5,s0,1024
ea0: 4398 lw a4,0(a5)
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
ea2: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff>
gpio_setup();
Delay_Ms(120); // let the OLED rail settle
ea4: 000b0537 lui a0,0xb0
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
ea8: 8f75 and a4,a4,a3
eaa: 10076713 ori a4,a4,256
eae: c398 sw a4,0(a5)
funDigitalWrite(BUZZER, FUN_LOW);
eb0: 00040737 lui a4,0x40
eb4: cb98 sw a4,16(a5)
funPinMode(BTN_OK, GPIO_CNF_IN_PUPD);
eb6: 4018 lw a4,0(s0)
Delay_Ms(120); // let the OLED rail settle
eb8: c8050513 addi a0,a0,-896 # afc80 <tama.c.67bb5960+0xac1ef>
funPinMode(BTN_OK, GPIO_CNF_IN_PUPD);
ebc: 9b41 andi a4,a4,-16
ebe: 00876713 ori a4,a4,8
ec2: c018 sw a4,0(s0)
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
ec4: 4398 lw a4,0(a5)
ec6: 8f71 and a4,a4,a2
ec8: 08000637 lui a2,0x8000
ecc: 8f51 or a4,a4,a2
ece: c398 sw a4,0(a5)
funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD);
ed0: 4398 lw a4,0(a5)
ed2: ff100637 lui a2,0xff100
ed6: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff>
ed8: 8f71 and a4,a4,a2
eda: 00800637 lui a2,0x800
ede: 8f51 or a4,a4,a2
ee0: c398 sw a4,0(a5)
funDigitalWrite(BTN_OK, FUN_HIGH);
ee2: 4705 li a4,1
ee4: c818 sw a4,16(s0)
funDigitalWrite(BTN_LEFT, FUN_HIGH);
ee6: 04000713 li a4,64
eea: cb98 sw a4,16(a5)
funDigitalWrite(BTN_RIGHT, FUN_HIGH);
eec: 02000713 li a4,32
ef0: cb98 sw a4,16(a5)
Delay_Ms(120); // let the OLED rail settle
ef2: b50ff0ef jal 242 <DelaySysTick>
* init I2C and GPIO
*/
uint8_t ssd1306_i2c_init(void)
{
// Enable GPIOC and I2C
RCC->APB1PCENR |= RCC_APB1Periph_I2C1;
ef6: 4cdc lw a5,28(s1)
ef8: 00200737 lui a4,0x200
efc: 8fd9 or a5,a5,a4
efe: 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;
f00: 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));
f02: 777d lui a4,0xfffff
f04: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff>
RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO;
f08: 0117e793 ori a5,a5,17
f0c: cc9c sw a5,24(s1)
GPIOC->CFGLR &= ~(0xf<<(4*1));
f0e: 401c lw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2);
f10: 6705 lui a4,0x1
f12: d0070713 addi a4,a4,-768 # d00 <ssd1306_cmd+0x8>
GPIOC->CFGLR &= ~(0xf<<(4*1));
f16: f0f7f793 andi a5,a5,-241
f1a: c01c sw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1);
f1c: 401c lw a5,0(s0)
f1e: 0d07e793 ori a5,a5,208
f22: c01c sw a5,0(s0)
GPIOC->CFGLR &= ~(0xf<<(4*2));
f24: 401c lw a5,0(s0)
f26: 8ff5 and a5,a5,a3
f28: c01c sw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2);
f2a: 401c lw a5,0(s0)
f2c: 8fd9 or a5,a5,a4
f2e: 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;
f30: 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();
f32: be2ff0ef jal 314 <ssd1306_i2c_setup>
f36: eb440413 addi s0,s0,-332 # 1eb4 <ssd1306_init_array>
ssd1306_setbuf(0);
f3a: 3d2d jal d74 <ssd1306_setbuf.constprop.0>
while(*cmd_list != SSD1306_TERMINATE_CMDS)
f3c: 00044503 lbu a0,0(s0)
f40: 0ff00793 li a5,255
f44: 00f51463 bne a0,a5,f4c <main+0xec>
{
if(ssd1306_cmd(*cmd_list++))
return 1;
}
ssd1306_refresh();
f48: 35a5 jal db0 <ssd1306_refresh>
#endif
return 0;
f4a: a021 j f52 <main+0xf2>
if(ssd1306_cmd(*cmd_list++))
f4c: 0405 addi s0,s0,1
f4e: 336d jal cf8 <ssd1306_cmd>
f50: d575 beqz a0,f3c <main+0xdc>
// no display: fall back to a heartbeat blink so the board still shows life
while (1) { led_blink(); Delay_Ms(700); }
}
ssd1306_init();
pet_reset();
f52: d78ff0ef jal 4ca <pet_reset>
ssd1306_setbuf(0);
f56: 3d39 jal d74 <ssd1306_setbuf.constprop.0>
draw_center_str(4, "PANAGOTCHI");
f58: 6589 lui a1,0x2
f5a: 94858593 addi a1,a1,-1720 # 1948 <main+0xae8>
f5e: 4511 li a0,4
f60: e30ff0ef jal 590 <draw_center_str>
ssd1306_drawImage(48, 16, pana_idle, PANA_W, PANA_H, 0);
f64: 02000713 li a4,32
f68: 6609 lui a2,0x2
f6a: 86ba mv a3,a4
f6c: ed060613 addi a2,a2,-304 # 1ed0 <pana_idle>
f70: 45c1 li a1,16
f72: 03000513 li a0,48
f76: eb8ff0ef jal 62e <ssd1306_drawImage.constprop.0>
draw_center_str(52, "press any key");
f7a: 6589 lui a1,0x2
f7c: 95458593 addi a1,a1,-1708 # 1954 <main+0xaf4>
f80: 03400513 li a0,52
f84: e0cff0ef jal 590 <draw_center_str>
ssd1306_refresh();
f88: 3525 jal db0 <ssd1306_refresh>
beep(659, 80); beep(784, 80); beep(988, 120);
f8a: 05000593 li a1,80
f8e: 29300513 li a0,659
f92: c9eff0ef jal 430 <beep>
f96: 05000593 li a1,80
f9a: 31000513 li a0,784
f9e: c92ff0ef jal 430 <beep>
fa2: 07800593 li a1,120
fa6: 3dc00513 li a0,988
faa: c86ff0ef jal 430 <beep>
fae: 0c800413 li s0,200
Buttons b = read_buttons();
fb2: e06ff0ef jal 5b8 <read_buttons>
fb6: 00855713 srli a4,a0,0x8
fba: 01055793 srli a5,a0,0x10
fbe: 02e104a3 sb a4,41(sp)
if (b.ok || b.left || b.right) break;
fc2: 8f49 or a4,a4,a0
Buttons b = read_buttons();
fc4: 02f10523 sb a5,42(sp)
if (b.ok || b.left || b.right) break;
fc8: 8fd9 or a5,a5,a4
Buttons b = read_buttons();
fca: 02a10423 sb a0,40(sp)
if (b.ok || b.left || b.right) break;
fce: 0ff7f793 zext.b a5,a5
fd2: eb81 bnez a5,fe2 <main+0x182>
Delay_Ms(20);
fd4: 6575 lui a0,0x1d
fd6: 4c050513 addi a0,a0,1216 # 1d4c0 <tama.c.67bb5960+0x19a2f>
for (int i = 0; i < 200; i++) {
fda: 147d addi s0,s0,-1
Delay_Ms(20);
fdc: a66ff0ef jal 242 <DelaySysTick>
for (int i = 0; i < 200; i++) {
fe0: f869 bnez s0,fb2 <main+0x152>
beep(659, 80); beep(784, 80); beep(988, 120);
fe2: 4601 li a2,0
fe4: 4481 li s1,0
fe6: 4401 li s0,0
fe8: c832 sw a2,16(sp)
splash();
Buttons prev = {0, 0, 0};
while (1) {
Buttons b = read_buttons();
fea: dceff0ef jal 5b8 <read_buttons>
fee: 00855713 srli a4,a0,0x8
ff2: 01055793 srli a5,a0,0x10
ff6: 02e102a3 sb a4,37(sp)
ffa: 02f10323 sb a5,38(sp)
ffe: 0ff57693 zext.b a3,a0
1002: 0ff77713 zext.b a4,a4
1006: 0ff7f793 zext.b a5,a5
100a: 02a10223 sb a0,36(sp)
100e: c236 sw a3,4(sp)
1010: c43a sw a4,8(sp)
1012: c63e sw a5,12(sp)
uint8_t ok_edge = b.ok && !prev.ok;
1014: c002 sw zero,0(sp)
1016: 4642 lw a2,16(sp)
1018: c681 beqz a3,1020 <main+0x1c0>
101a: 00143793 seqz a5,s0
101e: c03e sw a5,0(sp)
uint8_t left_edge = b.left && !prev.left;
1020: 4722 lw a4,8(sp)
uint8_t ok_edge = b.ok && !prev.ok;
1022: 00014783 lbu a5,0(sp)
uint8_t left_edge = b.left && !prev.left;
1026: 4681 li a3,0
1028: c319 beqz a4,102e <main+0x1ce>
102a: 0014b693 seqz a3,s1
uint8_t right_edge = b.right && !prev.right;
102e: 4532 lw a0,12(sp)
uint8_t left_edge = b.left && !prev.left;
1030: 0ff6f593 zext.b a1,a3
uint8_t right_edge = b.right && !prev.right;
1034: 4701 li a4,0
1036: c119 beqz a0,103c <main+0x1dc>
1038: 00163713 seqz a4,a2
uint8_t any_edge = ok_edge | left_edge | right_edge;
103c: 8fcd or a5,a5,a1
103e: 8fd9 or a5,a5,a4
prev = b;
if (any_edge) idle_frames = 0;
1040: c399 beqz a5,1046 <main+0x1e6>
1042: c201a423 sw zero,-984(gp) # 20000024 <idle_frames>
if (!disp_on) {
1046: c051c603 lbu a2,-1019(gp) # 20000001 <disp_on>
104a: e625 bnez a2,10b2 <main+0x252>
// screen is asleep: the first press only wakes it (not an action)
if (any_edge) {
104c: c799 beqz a5,105a <main+0x1fa>
ssd1306_cmd(SSD1306_DISPLAYON);
104e: 0af00513 li a0,175
1052: 315d jal cf8 <ssd1306_cmd>
disp_on = 1;
1054: 4785 li a5,1
1056: c0f182a3 sb a5,-1019(gp) # 20000001 <disp_on>
ssd1306_cmd(SSD1306_DISPLAYOFF);
disp_on = 0;
}
}
if (anim_timer) anim_timer--;
105a: c261c783 lbu a5,-986(gp) # 20000022 <anim_timer>
105e: c781 beqz a5,1066 <main+0x206>
1060: 17fd addi a5,a5,-1
1062: c2f18323 sb a5,-986(gp) # 20000022 <anim_timer>
// advance game time independent of screen / display state
if (pet.alive && ++tick_acc >= TICK_FRAMES) {
1066: c3818793 addi a5,gp,-968 # 20000034 <pet>
106a: 00a7c783 lbu a5,10(a5)
106e: c3818413 addi s0,gp,-968 # 20000034 <pet>
1072: cf81 beqz a5,108a <main+0x22a>
1074: c241d783 lhu a5,-988(gp) # 20000020 <tick_acc>
1078: 0f900693 li a3,249
107c: 0785 addi a5,a5,1
107e: 07c2 slli a5,a5,0x10
1080: 83c1 srli a5,a5,0x10
1082: 68f6e763 bltu a3,a5,1710 <main+0x8b0>
1086: c2f19223 sh a5,-988(gp) # 20000020 <tick_acc>
tick_acc = 0;
game_tick();
}
frame++;
108a: c201a783 lw a5,-992(gp) # 2000001c <frame>
idle_frames++;
Delay_Ms(FRAME_MS);
108e: 00058537 lui a0,0x58
1092: e4050513 addi a0,a0,-448 # 57e40 <tama.c.67bb5960+0x543af>
frame++;
1096: 0785 addi a5,a5,1
1098: c2f1a023 sw a5,-992(gp) # 2000001c <frame>
idle_frames++;
109c: c281a783 lw a5,-984(gp) # 20000024 <idle_frames>
10a0: 0785 addi a5,a5,1
10a2: c2f1a423 sw a5,-984(gp) # 20000024 <idle_frames>
Delay_Ms(FRAME_MS);
10a6: 99cff0ef jal 242 <DelaySysTick>
prev = b;
10aa: 4632 lw a2,12(sp)
10ac: 44a2 lw s1,8(sp)
10ae: 4412 lw s0,4(sp)
while (1) {
10b0: bf25 j fe8 <main+0x188>
switch (screen) {
10b2: c351c483 lbu s1,-971(gp) # 20000031 <screen>
10b6: 4609 li a2,2
10b8: 5ec48b63 beq s1,a2,16ae <main+0x84e>
10bc: 06966263 bltu a2,s1,1120 <main+0x2c0>
10c0: c3818413 addi s0,gp,-968 # 20000034 <pet>
10c4: 3c049763 bnez s1,1492 <main+0x632>
if (left_edge) {
10c8: c285 beqz a3,10e8 <main+0x288>
cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT;
10ca: c341c503 lbu a0,-972(gp) # 20000030 <cursor>
10ce: 459d li a1,7
10d0: c83a sw a4,16(sp)
10d2: 0519 addi a0,a0,6
10d4: 824ff0ef jal f8 <__modsi3>
10d8: c2a18a23 sb a0,-972(gp) # 20000030 <cursor>
beep(1047, 25);
10dc: 45e5 li a1,25
10de: 41700513 li a0,1047
10e2: b4eff0ef jal 430 <beep>
10e6: 4742 lw a4,16(sp)
if (right_edge) {
10e8: cf11 beqz a4,1104 <main+0x2a4>
cursor = (cursor + 1) % ICON_COUNT;
10ea: c341c503 lbu a0,-972(gp) # 20000030 <cursor>
10ee: 459d li a1,7
10f0: 0505 addi a0,a0,1
10f2: 806ff0ef jal f8 <__modsi3>
10f6: c2a18a23 sb a0,-972(gp) # 20000030 <cursor>
beep(1047, 25);
10fa: 45e5 li a1,25
10fc: 41700513 li a0,1047
1100: b30ff0ef jal 430 <beep>
if (ok_edge) do_action(cursor);
1104: 4782 lw a5,0(sp)
1106: cfc1 beqz a5,119e <main+0x33e>
switch (act) {
1108: c341c783 lbu a5,-972(gp) # 20000030 <cursor>
110c: 4719 li a4,6
110e: 08f76863 bltu a4,a5,119e <main+0x33e>
1112: 6709 lui a4,0x2
1114: 078a slli a5,a5,0x2
1116: aa470713 addi a4,a4,-1372 # 1aa4 <main+0xc44>
111a: 97ba add a5,a5,a4
111c: 439c lw a5,0(a5)
111e: 8782 jr a5
switch (screen) {
1120: 478d li a5,3
1122: 40f48d63 beq s1,a5,153c <main+0x6dc>
uint16_t timeout = screen_timeout_opts[timeout_idx];
1126: c041c703 lbu a4,-1020(gp) # 20000000 <timeout_idx>
112a: c1418793 addi a5,gp,-1004 # 20000010 <screen_timeout_opts>
112e: 0706 slli a4,a4,0x1
1130: 97ba add a5,a5,a4
1132: 0007d783 lhu a5,0(a5)
if (timeout && idle_frames >= timeout) {
1136: f20782e3 beqz a5,105a <main+0x1fa>
113a: c281a703 lw a4,-984(gp) # 20000024 <idle_frames>
113e: f0f76ee3 bltu a4,a5,105a <main+0x1fa>
ssd1306_cmd(SSD1306_DISPLAYOFF);
1142: 0ae00513 li a0,174
1146: 3e4d jal cf8 <ssd1306_cmd>
disp_on = 0;
1148: c00182a3 sb zero,-1019(gp) # 20000001 <disp_on>
114c: b739 j 105a <main+0x1fa>
pet.satiety = clamp100(pet.satiety + 30);
114e: 00040783 lb a5,0(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1152: 06400713 li a4,100
pet.satiety = clamp100(pet.satiety + 30);
1156: 07f9 addi a5,a5,30
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1158: 14f75d63 bge a4,a5,12b2 <main+0x452>
115c: 87ba mv a5,a4
115e: 00f40023 sb a5,0(s0)
pet.hygiene = clamp100(pet.hygiene - 5);
1162: 00340783 lb a5,3(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1166: 06400713 li a4,100
pet.hygiene = clamp100(pet.hygiene - 5);
116a: 17ed addi a5,a5,-5
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
116c: 14f75863 bge a4,a5,12bc <main+0x45c>
1170: 87ba mv a5,a4
1172: 00f401a3 sb a5,3(s0)
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
1176: 4711 li a4,4
1178: c0e18e23 sb a4,-996(gp) # 20000018 <anim_exp>
beep(880, 60); beep(1175, 80);
117c: 03c00593 li a1,60
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
1180: 4731 li a4,12
beep(880, 60); beep(1175, 80);
1182: 37000513 li a0,880
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
1186: c2e18323 sb a4,-986(gp) # 20000022 <anim_timer>
beep(880, 60); beep(1175, 80);
118a: aa6ff0ef jal 430 <beep>
118e: 05000593 li a1,80
1192: 49700513 li a0,1175
beep(784, 60); beep(1047, 60); beep(1319, 90);
1196: a9aff0ef jal 430 <beep>
led_blink();
119a: b06ff0ef jal 4a0 <led_blink>
ssd1306_setbuf(0);
119e: 3ed9 jal d74 <ssd1306_setbuf.constprop.0>
draw_center_str(0, menu_labels[cursor]);
11a0: c341c783 lbu a5,-972(gp) # 20000030 <cursor>
11a4: 4501 li a0,0
11a6: c03e sw a5,0(sp)
11a8: 4702 lw a4,0(sp)
11aa: 6789 lui a5,0x2
11ac: f8878793 addi a5,a5,-120 # 1f88 <menu_labels>
11b0: 070a slli a4,a4,0x2
11b2: 97ba add a5,a5,a4
11b4: 438c lw a1,0(a5)
11b6: bdaff0ef jal 590 <draw_center_str>
if (pet.alive && pet.health < 30 && (frame & 8))
11ba: 00a44783 lbu a5,10(s0)
11be: c83e sw a5,16(sp)
11c0: c395 beqz a5,11e4 <main+0x384>
11c2: 00440703 lb a4,4(s0)
11c6: 47f5 li a5,29
11c8: 00e7ce63 blt a5,a4,11e4 <main+0x384>
11cc: c201a783 lw a5,-992(gp) # 2000001c <frame>
11d0: 8ba1 andi a5,a5,8
11d2: cb89 beqz a5,11e4 <main+0x384>
ssd1306_drawstr(0, 0, "!", 1);
11d4: 6609 lui a2,0x2
11d6: 4685 li a3,1
11d8: 96460613 addi a2,a2,-1692 # 1964 <main+0xb04>
11dc: 4581 li a1,0
11de: 4501 li a0,0
11e0: 9c4ff0ef jal 3a4 <ssd1306_drawstr>
if((x >= SSD1306_W) || (y >= SSD1306_H)) return;
11e4: 08000613 li a2,128
11e8: 45a9 li a1,10
11ea: 4501 li a0,0
11ec: d02ff0ef jal 6ee <ssd1306_drawFastHLine.part.0.constprop.0>
if (pet.sleeping) {
11f0: 00944783 lbu a5,9(s0)
11f4: ca3e sw a5,20(sp)
11f6: 20078363 beqz a5,13fc <main+0x59c>
ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1);
11fa: 6609 lui a2,0x2
11fc: 4685 li a3,1
11fe: 96860613 addi a2,a2,-1688 # 1968 <main+0xb08>
1202: 45b9 li a1,14
1204: 04e00513 li a0,78
1208: 99cff0ef jal 3a4 <ssd1306_drawstr>
ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1);
120c: 6609 lui a2,0x2
120e: 4685 li a3,1
1210: 96c60613 addi a2,a2,-1684 # 196c <main+0xb0c>
1214: 45b1 li a1,12
1216: 05400513 li a0,84
121a: 98aff0ef jal 3a4 <ssd1306_drawstr>
121e: 03000313 li t1,48
px = 48; py = 16;
1222: 42c1 li t0,16
if (!pet.alive) return EXP_DEAD;
1224: 4742 lw a4,16(sp)
1226: 4799 li a5,6
1228: c719 beqz a4,1236 <main+0x3d6>
if (anim_timer) return anim_exp;
122a: c261c783 lbu a5,-986(gp) # 20000022 <anim_timer>
122e: 20078063 beqz a5,142e <main+0x5ce>
1232: c1c1c783 lbu a5,-996(gp) # 20000018 <anim_exp>
ssd1306_drawImage(px, py, pana_frames[current_expression()],
1236: 6709 lui a4,0x2
1238: f6c70713 addi a4,a4,-148 # 1f6c <pana_frames>
123c: 078a slli a5,a5,0x2
123e: 97ba add a5,a5,a4
1240: 4390 lw a2,0(a5)
1242: 02000713 li a4,32
1246: 8596 mv a1,t0
1248: 851a mv a0,t1
124a: 86ba mv a3,a4
124c: be2ff0ef jal 62e <ssd1306_drawImage.constprop.0>
1250: 08000613 li a2,128
1254: 02e00593 li a1,46
1258: 4501 li a0,0
125a: c94ff0ef jal 6ee <ssd1306_drawFastHLine.part.0.constprop.0>
for (uint8_t i = 0; i < pet.poop; i++)
125e: 00844783 lbu a5,8(s0)
1262: 20f4e763 bltu s1,a5,1470 <main+0x610>
1266: 4401 li s0,0
ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0);
1268: 6709 lui a4,0x2
126a: f5070713 addi a4,a4,-176 # 1f50 <menu_icons>
126e: 00241793 slli a5,s0,0x2
1272: 97ba add a5,a5,a4
1274: 00341493 slli s1,s0,0x3
1278: 4390 lw a2,0(a5)
127a: 94a2 add s1,s1,s0
127c: 4741 li a4,16
127e: 0486 slli s1,s1,0x1
1280: 86ba mv a3,a4
1282: 03000593 li a1,48
1286: 00148513 addi a0,s1,1 # 40021001 <_eusrstack+0x20020801>
128a: ba4ff0ef jal 62e <ssd1306_drawImage.constprop.0>
if (i == cursor)
128e: 4702 lw a4,0(sp)
1290: 0ff47793 zext.b a5,s0
1294: 00f71963 bne a4,a5,12a6 <main+0x446>
ssd1306_drawRect(x - 1, 47, ICON_W + 1, ICON_H + 1, 1);
1298: 46c5 li a3,17
129a: 8636 mv a2,a3
129c: 02f00593 li a1,47
12a0: 8526 mv a0,s1
12a2: c8aff0ef jal 72c <ssd1306_drawRect.constprop.0>
for (uint8_t i = 0; i < ICON_COUNT; i++) {
12a6: 0405 addi s0,s0,1
12a8: 479d li a5,7
12aa: faf41fe3 bne s0,a5,1268 <main+0x408>
ssd1306_refresh();
12ae: 3609 jal db0 <ssd1306_refresh>
}
12b0: bd9d j 1126 <main+0x2c6>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
12b2: fff7c713 not a4,a5
12b6: 877d srai a4,a4,0x1f
12b8: 8ff9 and a5,a5,a4
12ba: b555 j 115e <main+0x2fe>
12bc: fff7c713 not a4,a5
12c0: 877d srai a4,a4,0x1f
12c2: 8ff9 and a5,a5,a4
12c4: b57d j 1172 <main+0x312>
if (pet.energy < 15) { beep(220, 120); break; } // too tired
12c6: 00240703 lb a4,2(s0)
12ca: 47b9 li a5,14
12cc: 00e7c963 blt a5,a4,12de <main+0x47e>
12d0: 07800593 li a1,120
12d4: 0dc00513 li a0,220
beep(659, 40);
12d8: 958ff0ef jal 430 <beep>
break;
12dc: b5c9 j 119e <main+0x33e>
pet.happy = clamp100(pet.happy + 25);
12de: 00140783 lb a5,1(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
12e2: 06400693 li a3,100
pet.happy = clamp100(pet.happy + 25);
12e6: 07e5 addi a5,a5,25
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
12e8: 04f6d563 bge a3,a5,1332 <main+0x4d2>
12ec: 87b6 mv a5,a3
12ee: 00f400a3 sb a5,1(s0)
pet.energy = clamp100(pet.energy - 12);
12f2: ff470793 addi a5,a4,-12
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
12f6: 06400713 li a4,100
12fa: 00f75363 bge a4,a5,1300 <main+0x4a0>
12fe: 87ba mv a5,a4
1300: 00f40123 sb a5,2(s0)
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
1304: 4709 li a4,2
1306: c0e18e23 sb a4,-996(gp) # 20000018 <anim_exp>
beep(988, 60); beep(1319, 60); beep(1568, 90);
130a: 03c00593 li a1,60
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
130e: 4731 li a4,12
beep(988, 60); beep(1319, 60); beep(1568, 90);
1310: 3dc00513 li a0,988
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
1314: c2e18323 sb a4,-986(gp) # 20000022 <anim_timer>
beep(988, 60); beep(1319, 60); beep(1568, 90);
1318: 918ff0ef jal 430 <beep>
131c: 03c00593 li a1,60
1320: 52700513 li a0,1319
1324: 90cff0ef jal 430 <beep>
1328: 05a00593 li a1,90
132c: 62000513 li a0,1568
1330: b59d j 1196 <main+0x336>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1332: fff7c693 not a3,a5
1336: 86fd srai a3,a3,0x1f
1338: 8ff5 and a5,a5,a3
133a: bf55 j 12ee <main+0x48e>
pet.sleeping = !pet.sleeping;
133c: 00944503 lbu a0,9(s0)
beep(pet.sleeping ? 440 : 660, 120);
1340: 07800593 li a1,120
pet.sleeping = !pet.sleeping;
1344: 00153793 seqz a5,a0
beep(pet.sleeping ? 440 : 660, 120);
1348: 00a03533 snez a0,a0
134c: 40a00533 neg a0,a0
1350: 0dc57513 andi a0,a0,220
pet.sleeping = !pet.sleeping;
1354: 00f404a3 sb a5,9(s0)
beep(pet.sleeping ? 440 : 660, 120);
1358: 1b850513 addi a0,a0,440
135c: bfb5 j 12d8 <main+0x478>
pet.happy = clamp100(pet.happy + 5);
135e: c3818713 addi a4,gp,-968 # 20000034 <pet>
1362: 00140783 lb a5,1(s0)
pet.hygiene = 100;
1366: 06400693 li a3,100
pet.poop = 0;
136a: 00040423 sb zero,8(s0)
pet.hygiene = 100;
136e: 00d401a3 sb a3,3(s0)
pet.happy = clamp100(pet.happy + 5);
1372: 0795 addi a5,a5,5
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1374: 02f6d063 bge a3,a5,1394 <main+0x534>
1378: 87b6 mv a5,a3
beep(1319, 50); beep(1047, 50);
137a: 03200593 li a1,50
137e: 52700513 li a0,1319
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1382: 00f700a3 sb a5,1(a4)
beep(1319, 50); beep(1047, 50);
1386: 8aaff0ef jal 430 <beep>
138a: 03200593 li a1,50
138e: 41700513 li a0,1047
1392: b799 j 12d8 <main+0x478>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1394: fff7c693 not a3,a5
1398: 86fd srai a3,a3,0x1f
139a: 8ff5 and a5,a5,a3
139c: bff9 j 137a <main+0x51a>
pet.health = clamp100(pet.health + 35);
139e: 00440783 lb a5,4(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
13a2: 06400713 li a4,100
pet.health = clamp100(pet.health + 35);
13a6: 02378793 addi a5,a5,35
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
13aa: 02f75663 bge a4,a5,13d6 <main+0x576>
13ae: 87ba mv a5,a4
beep(784, 60); beep(1047, 60); beep(1319, 90);
13b0: 03c00593 li a1,60
13b4: 31000513 li a0,784
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
13b8: 00f40223 sb a5,4(s0)
beep(784, 60); beep(1047, 60); beep(1319, 90);
13bc: 874ff0ef jal 430 <beep>
13c0: 03c00593 li a1,60
13c4: 41700513 li a0,1047
13c8: 868ff0ef jal 430 <beep>
13cc: 05a00593 li a1,90
13d0: 52700513 li a0,1319
13d4: b3c9 j 1196 <main+0x336>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
13d6: fff7c713 not a4,a5
13da: 877d srai a4,a4,0x1f
13dc: 8ff9 and a5,a5,a4
13de: bfc9 j 13b0 <main+0x550>
screen = SCR_STATS;
13e0: 4785 li a5,1
13e2: c2f18aa3 sb a5,-971(gp) # 20000031 <screen>
beep(659, 40);
13e6: 02800593 li a1,40
13ea: 29300513 li a0,659
13ee: b5ed j 12d8 <main+0x478>
screen = SCR_SETTINGS;
13f0: 478d li a5,3
13f2: c2f18aa3 sb a5,-971(gp) # 20000031 <screen>
set_sel = 0;
13f6: c20183a3 sb zero,-985(gp) # 20000023 <set_sel>
13fa: b7f5 j 13e6 <main+0x586>
uint32_t t = frame % 80;
13fc: c201a283 lw t0,-992(gp) # 2000001c <frame>
1400: 05000593 li a1,80
1404: 8516 mv a0,t0
1406: cc16 sw t0,24(sp)
1408: ccdfe0ef jal d4 <__umodsi3>
px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30
140c: 02700793 li a5,39
1410: 42e2 lw t0,24(sp)
1412: 01e50313 addi t1,a0,30
1416: 00a7f663 bgeu a5,a0,1422 <main+0x5c2>
141a: 06e00793 li a5,110
141e: 40a78333 sub t1,a5,a0
py = 14 + ((frame % 16) < 8 ? 0 : 1);
1422: 0082f293 andi t0,t0,8
1426: 005032b3 snez t0,t0
142a: 02b9 addi t0,t0,14
142c: bbe5 j 1224 <main+0x3c4>
if (pet.sleeping) return EXP_SLEEP;
142e: 4752 lw a4,20(sp)
1430: 4795 li a5,5
1432: e00712e3 bnez a4,1236 <main+0x3d6>
if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20)
1436: 00440683 lb a3,4(s0)
143a: 4775 li a4,29
return EXP_SAD;
143c: 478d li a5,3
if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20)
143e: ded75ce3 bge a4,a3,1236 <main+0x3d6>
1442: 00140683 lb a3,1(s0)
1446: 4761 li a4,24
1448: ded757e3 bge a4,a3,1236 <main+0x3d6>
144c: 00040683 lb a3,0(s0)
1450: 474d li a4,19
1452: ded752e3 bge a4,a3,1236 <main+0x3d6>
if ((frame % 50) < 4) return EXP_BLINK;
1456: c201a503 lw a0,-992(gp) # 2000001c <frame>
145a: 03200593 li a1,50
145e: ca16 sw t0,20(sp)
1460: c81a sw t1,16(sp)
1462: c73fe0ef jal d4 <__umodsi3>
1466: 42d2 lw t0,20(sp)
1468: 4342 lw t1,16(sp)
146a: 00453793 sltiu a5,a0,4
146e: b3e1 j 1236 <main+0x3d6>
ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0);
1470: 00149513 slli a0,s1,0x1
1474: 9526 add a0,a0,s1
1476: 4721 li a4,8
1478: 050a slli a0,a0,0x2
147a: 86ba mv a3,a4
147c: c0c18613 addi a2,gp,-1012 # 20000008 <spr_poop>
1480: 02600593 li a1,38
1484: 953a add a0,a0,a4
for (uint8_t i = 0; i < pet.poop; i++)
1486: 0485 addi s1,s1,1
ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0);
1488: 9a6ff0ef jal 62e <ssd1306_drawImage.constprop.0>
for (uint8_t i = 0; i < pet.poop; i++)
148c: 0ff4f493 zext.b s1,s1
1490: b3f9 j 125e <main+0x3fe>
if (any_edge) { screen = SCR_MAIN; beep(880, 30); }
1492: cb81 beqz a5,14a2 <main+0x642>
1494: 45f9 li a1,30
1496: 37000513 li a0,880
149a: c2018aa3 sb zero,-971(gp) # 20000031 <screen>
149e: f93fe0ef jal 430 <beep>
ssd1306_setbuf(0);
14a2: 8d3ff0ef jal d74 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "-- STATUS --");
14a6: 6589 lui a1,0x2
14a8: 97058593 addi a1,a1,-1680 # 1970 <main+0xb10>
14ac: 4501 li a0,0
14ae: 8e2ff0ef jal 590 <draw_center_str>
draw_bar(10, "FOOD", pet.satiety);
14b2: 00040603 lb a2,0(s0)
14b6: 6589 lui a1,0x2
14b8: 98058593 addi a1,a1,-1664 # 1980 <main+0xb20>
14bc: 4529 li a0,10
14be: aaeff0ef jal 76c <draw_bar>
draw_bar(19, "FUN ", pet.happy);
14c2: 00140603 lb a2,1(s0)
14c6: 6589 lui a1,0x2
14c8: 98858593 addi a1,a1,-1656 # 1988 <main+0xb28>
14cc: 454d li a0,19
14ce: a9eff0ef jal 76c <draw_bar>
draw_bar(28, "ENGY", pet.energy);
14d2: 00240603 lb a2,2(s0)
14d6: 6589 lui a1,0x2
14d8: 99058593 addi a1,a1,-1648 # 1990 <main+0xb30>
14dc: 4571 li a0,28
14de: a8eff0ef jal 76c <draw_bar>
draw_bar(37, "WASH", pet.hygiene);
14e2: 00340603 lb a2,3(s0)
14e6: 6589 lui a1,0x2
14e8: 99858593 addi a1,a1,-1640 # 1998 <main+0xb38>
14ec: 02500513 li a0,37
14f0: a7cff0ef jal 76c <draw_bar>
draw_bar(46, "HLTH", pet.health);
14f4: 00440603 lb a2,4(s0)
14f8: 6589 lui a1,0x2
14fa: 9a058593 addi a1,a1,-1632 # 19a0 <main+0xb40>
14fe: 02e00513 li a0,46
1502: a6aff0ef jal 76c <draw_bar>
snprintf(line, sizeof(line), "Age %u %s", pet.age_min,
1506: 00944783 lbu a5,9(s0)
150a: 00645683 lhu a3,6(s0)
150e: c39d beqz a5,1534 <main+0x6d4>
1510: 6709 lui a4,0x2
1512: 93c70713 addi a4,a4,-1732 # 193c <main+0xadc>
1516: 6609 lui a2,0x2
1518: 9a860613 addi a2,a2,-1624 # 19a8 <main+0xb48>
151c: 45c5 li a1,17
151e: 1028 addi a0,sp,40
1520: 82dff0ef jal d4c <snprintf>
ssd1306_drawstr(0, 56, line, 1);
1524: 4685 li a3,1
1526: 1030 addi a2,sp,40
1528: 03800593 li a1,56
152c: 4501 li a0,0
152e: e77fe0ef jal 3a4 <ssd1306_drawstr>
ssd1306_refresh();
1532: bbb5 j 12ae <main+0x44e>
snprintf(line, sizeof(line), "Age %u %s", pet.age_min,
1534: 6709 lui a4,0x2
1536: 93870713 addi a4,a4,-1736 # 1938 <main+0xad8>
153a: bff1 j 1516 <main+0x6b6>
if (left_edge) {
153c: c285 beqz a3,155c <main+0x6fc>
set_sel = (set_sel + SETTINGS_ROWS - 1) % SETTINGS_ROWS;
153e: c271c503 lbu a0,-985(gp) # 20000023 <set_sel>
1542: 85a6 mv a1,s1
1544: c83a sw a4,16(sp)
1546: 0509 addi a0,a0,2
1548: bb1fe0ef jal f8 <__modsi3>
154c: c2a183a3 sb a0,-985(gp) # 20000023 <set_sel>
beep(1047, 25);
1550: 45e5 li a1,25
1552: 41700513 li a0,1047
1556: edbfe0ef jal 430 <beep>
155a: 4742 lw a4,16(sp)
if (right_edge) {
155c: cf11 beqz a4,1578 <main+0x718>
set_sel = (set_sel + 1) % SETTINGS_ROWS;
155e: c271c503 lbu a0,-985(gp) # 20000023 <set_sel>
1562: 458d li a1,3
1564: 0505 addi a0,a0,1
1566: b93fe0ef jal f8 <__modsi3>
156a: c2a183a3 sb a0,-985(gp) # 20000023 <set_sel>
beep(1047, 25);
156e: 45e5 li a1,25
1570: 41700513 li a0,1047
1574: ebdfe0ef jal 430 <beep>
if (ok_edge) {
1578: 4782 lw a5,0(sp)
157a: cf95 beqz a5,15b6 <main+0x756>
if (set_sel == 0) { // cycle screen-off timeout
157c: c271c783 lbu a5,-985(gp) # 20000023 <set_sel>
1580: ef81 bnez a5,1598 <main+0x738>
timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT;
1582: c041c783 lbu a5,-1020(gp) # 20000000 <timeout_idx>
beep(880, 40);
1586: 02800593 li a1,40
timeout_idx = (timeout_idx + 1) % TIMEOUT_OPT_COUNT;
158a: 0785 addi a5,a5,1
158c: 8b8d andi a5,a5,3
158e: c0f18223 sb a5,-1020(gp) # 20000000 <timeout_idx>
beep(880, 30);
1592: 37000513 li a0,880
1596: a831 j 15b2 <main+0x752>
} else if (set_sel == 1) { // toggle sound
1598: 4705 li a4,1
159a: 10e79263 bne a5,a4,169e <main+0x83e>
sound_on = !sound_on;
159e: c061c783 lbu a5,-1018(gp) # 20000002 <sound_on>
beep(988, 60); // only audible if just enabled
15a2: 03c00593 li a1,60
15a6: 3dc00513 li a0,988
sound_on = !sound_on;
15aa: 0017b793 seqz a5,a5
15ae: c0f18323 sb a5,-1018(gp) # 20000002 <sound_on>
beep(880, 30);
15b2: e7ffe0ef jal 430 <beep>
ssd1306_setbuf(0);
15b6: fbeff0ef jal d74 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "- SETTINGS -");
15ba: 6589 lui a1,0x2
15bc: 9b458593 addi a1,a1,-1612 # 19b4 <main+0xb54>
15c0: 4501 li a0,0
15c2: fcffe0ef jal 590 <draw_center_str>
15c6: 08000613 li a2,128
15ca: 45a9 li a1,10
15cc: 4501 li a0,0
15ce: 920ff0ef jal 6ee <ssd1306_drawFastHLine.part.0.constprop.0>
snprintf(rows[0], 17, "Screen off:%s", screen_timeout_names[timeout_idx]);
15d2: c041c703 lbu a4,-1020(gp) # 20000000 <timeout_idx>
15d6: 6789 lui a5,0x2
15d8: fa478793 addi a5,a5,-92 # 1fa4 <screen_timeout_names>
15dc: 070a slli a4,a4,0x2
15de: 97ba add a5,a5,a4
15e0: 4394 lw a3,0(a5)
15e2: 6609 lui a2,0x2
15e4: 9c460613 addi a2,a2,-1596 # 19c4 <main+0xb64>
15e8: 45c5 li a1,17
15ea: 1028 addi a0,sp,40
15ec: f60ff0ef jal d4c <snprintf>
snprintf(rows[1], 17, "Sound: %s", sound_on ? "On" : "Off");
15f0: c061c783 lbu a5,-1018(gp) # 20000002 <sound_on>
15f4: cbcd beqz a5,16a6 <main+0x846>
15f6: 6689 lui a3,0x2
15f8: 94068693 addi a3,a3,-1728 # 1940 <main+0xae0>
15fc: 6609 lui a2,0x2
15fe: 9d460613 addi a2,a2,-1580 # 19d4 <main+0xb74>
1602: 45c5 li a1,17
1604: 03910513 addi a0,sp,57
1608: f44ff0ef jal d4c <snprintf>
snprintf(rows[2], 17, "Back");
160c: 6589 lui a1,0x2
160e: 9e058593 addi a1,a1,-1568 # 19e0 <main+0xb80>
1612: 04a10513 addi a0,sp,74
1616: f6aff0ef jal d80 <strcpy>
161a: 4401 li s0,0
161c: 4481 li s1,0
int y = 18 + r * 12;
161e: 01240793 addi a5,s0,18
1622: c03e sw a5,0(sp)
if (r == set_sel) ssd1306_fillRect(0, y - 1, SSD1306_W, 10, 1);
1624: c271c683 lbu a3,-985(gp) # 20000023 <set_sel>
1628: 0ff4f393 zext.b t2,s1
162c: 02769e63 bne a3,t2,1668 <main+0x808>
1630: 42a9 li t0,10
1632: 01b40593 addi a1,s0,27
1636: 405585b3 sub a1,a1,t0
m=x;
163a: 4301 li t1,0
163c: 851a mv a0,t1
ssd1306_drawPixel(m++, n, color);
163e: 4605 li a2,1
1640: 0305 addi t1,t1,1
1642: d016 sw t0,32(sp)
1644: ce1e sw t2,28(sp)
1646: cc36 sw a3,24(sp)
1648: ca1a sw t1,20(sp)
164a: c82e sw a1,16(sp)
164c: d1dfe0ef jal 368 <ssd1306_drawPixel>
while(w--)
1650: 4352 lw t1,20(sp)
1652: 08000613 li a2,128
1656: 45c2 lw a1,16(sp)
1658: 46e2 lw a3,24(sp)
165a: 43f2 lw t2,28(sp)
165c: 5282 lw t0,32(sp)
165e: fcc31fe3 bne t1,a2,163c <main+0x7dc>
while(h--)
1662: 12fd addi t0,t0,-1
1664: fc0297e3 bnez t0,1632 <main+0x7d2>
ssd1306_drawstr(4, y, rows[r], r == set_sel ? 0 : 1);
1668: 00449613 slli a2,s1,0x4
166c: 4582 lw a1,0(sp)
166e: 407686b3 sub a3,a3,t2
1672: 9626 add a2,a2,s1
1674: 103c addi a5,sp,40
1676: 00d036b3 snez a3,a3
167a: 963e add a2,a2,a5
167c: 4511 li a0,4
167e: d27fe0ef jal 3a4 <ssd1306_drawstr>
for (uint8_t r = 0; r < SETTINGS_ROWS; r++) {
1682: 0431 addi s0,s0,12
1684: 02400693 li a3,36
1688: 0485 addi s1,s1,1
168a: f8d41ae3 bne s0,a3,161e <main+0x7be>
draw_center_str(56, "L/R move OK use");
168e: 6589 lui a1,0x2
1690: 9e858593 addi a1,a1,-1560 # 19e8 <main+0xb88>
1694: 03800513 li a0,56
draw_center_str(52, line);
1698: ef9fe0ef jal 590 <draw_center_str>
169c: b909 j 12ae <main+0x44e>
screen = SCR_MAIN;
169e: c2018aa3 sb zero,-971(gp) # 20000031 <screen>
beep(880, 30);
16a2: 45f9 li a1,30
16a4: b5fd j 1592 <main+0x732>
snprintf(rows[1], 17, "Sound: %s", sound_on ? "On" : "Off");
16a6: 6689 lui a3,0x2
16a8: 94468693 addi a3,a3,-1724 # 1944 <main+0xae4>
16ac: bf81 j 15fc <main+0x79c>
if (ok_edge) { // start a new pet
16ae: 4782 lw a5,0(sp)
16b0: cf99 beqz a5,16ce <main+0x86e>
pet_reset();
16b2: e19fe0ef jal 4ca <pet_reset>
beep(659, 80); beep(988, 120);
16b6: 05000593 li a1,80
16ba: 29300513 li a0,659
16be: d73fe0ef jal 430 <beep>
16c2: 07800593 li a1,120
16c6: 3dc00513 li a0,988
16ca: d67fe0ef jal 430 <beep>
ssd1306_setbuf(0);
16ce: ea6ff0ef jal d74 <ssd1306_setbuf.constprop.0>
ssd1306_drawImage(48, 8, spr_grave, 32, 32, 0);
16d2: 02000713 li a4,32
16d6: 6609 lui a2,0x2
16d8: 86ba mv a3,a4
16da: fb460613 addi a2,a2,-76 # 1fb4 <spr_grave>
16de: 45a1 li a1,8
16e0: 03000513 li a0,48
16e4: f4bfe0ef jal 62e <ssd1306_drawImage.constprop.0>
draw_center_str(44, "R.I.P.");
16e8: 6589 lui a1,0x2
16ea: 9fc58593 addi a1,a1,-1540 # 19fc <main+0xb9c>
16ee: 02c00513 li a0,44
16f2: e9ffe0ef jal 590 <draw_center_str>
snprintf(line, sizeof(line), "lived %u min", pet.age_min);
16f6: c3e1d683 lhu a3,-962(gp) # 2000003a <pet+0x6>
16fa: 6609 lui a2,0x2
16fc: 45c5 li a1,17
16fe: a0460613 addi a2,a2,-1532 # 1a04 <main+0xba4>
1702: 1028 addi a0,sp,40
1704: e48ff0ef jal d4c <snprintf>
draw_center_str(52, line);
1708: 102c addi a1,sp,40
170a: 03400513 li a0,52
170e: b769 j 1698 <main+0x838>
pet.age_min++;
1710: 00645683 lhu a3,6(s0)
pet.satiety = clamp100(pet.satiety - 1);
1714: 00040783 lb a5,0(s0)
tick_acc = 0;
1718: c2019223 sh zero,-988(gp) # 20000020 <tick_acc>
pet.age_min++;
171c: 0685 addi a3,a3,1
171e: 06c2 slli a3,a3,0x10
1720: 82c1 srli a3,a3,0x10
1722: 00d41323 sh a3,6(s0)
pet.satiety = clamp100(pet.satiety - 1);
1726: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1728: 06400713 li a4,100
if (pet.sleeping) {
172c: 00944603 lbu a2,9(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1730: 08f75463 bge a4,a5,17b8 <main+0x958>
1734: 87ba mv a5,a4
1736: 07e2 slli a5,a5,0x18
pet.energy = clamp100(pet.energy + 6);
1738: 00240703 lb a4,2(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
173c: 87e1 srai a5,a5,0x18
173e: 06400513 li a0,100
if (pet.sleeping) {
1742: c649 beqz a2,17cc <main+0x96c>
pet.energy = clamp100(pet.energy + 6);
1744: 00670593 addi a1,a4,6
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1748: 06b55d63 bge a0,a1,17c2 <main+0x962>
174c: 85aa mv a1,a0
pet.satiety = clamp100(pet.satiety - 1);
174e: 00f40023 sb a5,0(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1752: 00b40123 sb a1,2(s0)
if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested
1756: 05d00793 li a5,93
175a: 00e7d563 bge a5,a4,1764 <main+0x904>
175e: 000404a3 sb zero,9(s0)
1762: 4601 li a2,0
if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1);
1764: 0016f713 andi a4,a3,1
1768: cb19 beqz a4,177e <main+0x91e>
176a: 00340783 lb a5,3(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
176e: 06400593 li a1,100
if (pet.age_min & 1) pet.hygiene = clamp100(pet.hygiene - 1);
1772: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1774: 08f5da63 bge a1,a5,1808 <main+0x9a8>
1778: 87ae mv a5,a1
177a: 00f401a3 sb a5,3(s0)
if (!pet.sleeping && pet.poop < 3 &&
177e: 00844583 lbu a1,8(s0)
1782: ea41 bnez a2,1812 <main+0x9b2>
1784: 4789 li a5,2
1786: 00b7ed63 bltu a5,a1,17a0 <main+0x940>
((pet.age_min * 7u + frame) & 0x1F) == 0)
178a: 00369793 slli a5,a3,0x3
178e: 8f95 sub a5,a5,a3
1790: c201a683 lw a3,-992(gp) # 2000001c <frame>
1794: 97b6 add a5,a5,a3
1796: 8bfd andi a5,a5,31
if (!pet.sleeping && pet.poop < 3 &&
1798: efad bnez a5,1812 <main+0x9b2>
pet.poop++;
179a: 0585 addi a1,a1,1
179c: 00b40423 sb a1,8(s0)
if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
17a0: cb35 beqz a4,1814 <main+0x9b4>
17a2: 00140783 lb a5,1(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17a6: 06400693 li a3,100
if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
17aa: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17ac: 12f6da63 bge a3,a5,18e0 <main+0xa80>
17b0: 87b6 mv a5,a3
17b2: 00f400a3 sb a5,1(s0)
17b6: a8b9 j 1814 <main+0x9b4>
17b8: fff7c713 not a4,a5
17bc: 877d srai a4,a4,0x1f
17be: 8ff9 and a5,a5,a4
17c0: bf9d j 1736 <main+0x8d6>
17c2: fff5c513 not a0,a1
17c6: 857d srai a0,a0,0x1f
17c8: 8de9 and a1,a1,a0
17ca: b751 j 174e <main+0x8ee>
pet.satiety = clamp100(pet.satiety - 1);
17cc: 00f40023 sb a5,0(s0)
pet.energy = clamp100(pet.energy - 1);
17d0: fff70793 addi a5,a4,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17d4: 02f55063 bge a0,a5,17f4 <main+0x994>
17d8: 87aa mv a5,a0
17da: 00f40123 sb a5,2(s0)
pet.happy = clamp100(pet.happy - 1);
17de: 00140783 lb a5,1(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17e2: 06400713 li a4,100
pet.happy = clamp100(pet.happy - 1);
17e6: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
17e8: 00f75b63 bge a4,a5,17fe <main+0x99e>
17ec: 87ba mv a5,a4
17ee: 00f400a3 sb a5,1(s0)
17f2: bf8d j 1764 <main+0x904>
17f4: fff7c713 not a4,a5
17f8: 877d srai a4,a4,0x1f
17fa: 8ff9 and a5,a5,a4
17fc: bff9 j 17da <main+0x97a>
17fe: fff7c713 not a4,a5
1802: 877d srai a4,a4,0x1f
1804: 8ff9 and a5,a5,a4
1806: b7e5 j 17ee <main+0x98e>
1808: fff7c593 not a1,a5
180c: 85fd srai a1,a1,0x1f
180e: 8fed and a5,a5,a1
1810: b7ad j 177a <main+0x91a>
if (pet.poop && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
1812: f5d9 bnez a1,17a0 <main+0x940>
if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
1814: 00340483 lb s1,3(s0)
1818: 47cd li a5,19
181a: 0097cd63 blt a5,s1,1834 <main+0x9d4>
181e: cb19 beqz a4,1834 <main+0x9d4>
1820: 00140783 lb a5,1(s0)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1824: 06400713 li a4,100
if (pet.hygiene < 20 && (pet.age_min & 1)) pet.happy = clamp100(pet.happy - 1);
1828: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
182a: 0cf75063 bge a4,a5,18ea <main+0xa8a>
182e: 87ba mv a5,a4
1830: 00f400a3 sb a5,1(s0)
int8_t lo = pet.satiety;
1834: 00040583 lb a1,0(s0)
if (pet.happy < lo) lo = pet.happy;
1838: 00140683 lb a3,1(s0)
if (pet.energy < lo) lo = pet.energy;
183c: 00240703 lb a4,2(s0)
if (pet.hygiene < lo) lo = pet.hygiene;
1840: 87a6 mv a5,s1
1842: 0095d363 bge a1,s1,1848 <main+0x9e8>
1846: 87ae mv a5,a1
1848: 01879613 slli a2,a5,0x18
184c: 8661 srai a2,a2,0x18
184e: 00c6d363 bge a3,a2,1854 <main+0x9f4>
1852: 87b6 mv a5,a3
1854: 01879613 slli a2,a5,0x18
1858: 8661 srai a2,a2,0x18
185a: 00c75363 bge a4,a2,1860 <main+0xa00>
185e: 87ba mv a5,a4
1860: 01879613 slli a2,a5,0x18
1864: 8661 srai a2,a2,0x18
if (lo < 15) pet.health = clamp100(pet.health - 3);
1866: 4539 li a0,14
1868: 00440783 lb a5,4(s0)
186c: 08c54463 blt a0,a2,18f4 <main+0xa94>
1870: 17f5 addi a5,a5,-3
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1872: 06400613 li a2,100
1876: 08f65563 bge a2,a5,1900 <main+0xaa0>
187a: 87b2 mv a5,a2
187c: 00f40223 sb a5,4(s0)
notify(N_FOOD, pet.satiety);
1880: 4501 li a0,0
1882: c83a sw a4,16(sp)
1884: c036 sw a3,0(sp)
1886: c7dfe0ef jal 502 <notify>
notify(N_FUN, pet.happy);
188a: 4682 lw a3,0(sp)
188c: 4505 li a0,1
188e: 85b6 mv a1,a3
1890: c73fe0ef jal 502 <notify>
notify(N_ENGY, pet.energy);
1894: 4742 lw a4,16(sp)
1896: 4509 li a0,2
1898: 85ba mv a1,a4
189a: c69fe0ef jal 502 <notify>
notify(N_WASH, pet.hygiene);
189e: 85a6 mv a1,s1
18a0: 450d li a0,3
18a2: c61fe0ef jal 502 <notify>
if (pet.health <= 0) {
18a6: 00440783 lb a5,4(s0)
18aa: fef04063 bgtz a5,108a <main+0x22a>
screen = SCR_DEAD;
18ae: 4709 li a4,2
beep(330, 200); beep(247, 200); beep(165, 400);
18b0: 0c800593 li a1,200
18b4: 14a00513 li a0,330
screen = SCR_DEAD;
18b8: c2e18aa3 sb a4,-971(gp) # 20000031 <screen>
pet.alive = 0;
18bc: 00040523 sb zero,10(s0)
beep(330, 200); beep(247, 200); beep(165, 400);
18c0: b71fe0ef jal 430 <beep>
18c4: 0c800593 li a1,200
18c8: 0f700513 li a0,247
18cc: b65fe0ef jal 430 <beep>
18d0: 19000593 li a1,400
18d4: 0a500513 li a0,165
18d8: b59fe0ef jal 430 <beep>
18dc: faeff06f j 108a <main+0x22a>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
18e0: fff7c693 not a3,a5
18e4: 86fd srai a3,a3,0x1f
18e6: 8ff5 and a5,a5,a3
18e8: b5e9 j 17b2 <main+0x952>
18ea: fff7c713 not a4,a5
18ee: 877d srai a4,a4,0x1f
18f0: 8ff9 and a5,a5,a4
18f2: bf3d j 1830 <main+0x9d0>
else if (lo > 50) pet.health = clamp100(pet.health + 2);
18f4: 03200513 li a0,50
18f8: f8c554e3 bge a0,a2,1880 <main+0xa20>
18fc: 0789 addi a5,a5,2
18fe: bf95 j 1872 <main+0xa12>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1900: fff7c613 not a2,a5
1904: 867d srai a2,a2,0x1f
1906: 8ff1 and a5,a5,a2
1908: bf95 j 187c <main+0xa1c>
190a: 0000 unimp
190c: 31647373 .insn 4, 0x31647373
1910: 5f363033 .insn 4, 0x5f363033
1914: 3269 jal 129e <main+0x43e>
1916: 72655f63 bge a0,t1,2054 <fontdata+0x20>
191a: 6f72 .insn 2, 0x6f72
191c: 2072 .insn 2, 0x2072
191e: 202d jal 1948 <main+0xae8>
1920: 6974 .insn 2, 0x6974
1922: 656d lui a0,0x1b
1924: 2074756f jal a0,4932a <tama.c.67bb5960+0x45899>
1928: 74696177 .insn 4, 0x74696177
192c: 6e69 lui t3,0x1a
192e: 6f662067 .insn 4, 0x6f662067
1932: 2072 .insn 2, 0x2072
1934: 7325 lui t1,0xfffe9
1936: 0d0a slli s10,s10,0x2
1938: 0000 unimp
193a: 0000 unimp
193c: 7a5a .insn 2, 0x7a5a
193e: 007a c.slli zero,0x1e
1940: 00006e4f .insn 4, 0x6e4f
1944: 0066664f .insn 4, 0x0066664f
1948: 4150 lw a2,4(a0)
194a: 414e lw sp,208(sp)
194c: 43544f47 .insn 4, 0x43544f47
1950: 4948 lw a0,20(a0)
1952: 0000 unimp
1954: 7270 .insn 2, 0x7270
1956: 7365 lui t1,0xffff9
1958: 6e612073 .insn 4, 0x6e612073
195c: 2079 jal 19ea <main+0xb8a>
195e: 0079656b .insn 4, 0x0079656b
1962: 0000 unimp
1964: 0021 c.nop 8
1966: 0000 unimp
1968: 007a c.slli zero,0x1e
196a: 0000 unimp
196c: 005a c.slli zero,0x16
196e: 0000 unimp
1970: 2d2d jal 1faa <screen_timeout_names+0x6>
1972: 5320 lw s0,96(a4)
1974: 4154 lw a3,4(a0)
1976: 5554 lw a3,44(a0)
1978: 2d2d2053 .insn 4, 0x2d2d2053
197c: 0000 unimp
197e: 0000 unimp
1980: 4f46 lw t5,80(sp)
1982: 0000444f .insn 4, 0x444f
1986: 0000 unimp
1988: 5546 lw a0,112(sp)
198a: 204e .insn 2, 0x204e
198c: 0000 unimp
198e: 0000 unimp
1990: 4e45 li t3,17
1992: 00005947 .insn 4, 0x5947
1996: 0000 unimp
1998: 48534157 .insn 4, 0x48534157
199c: 0000 unimp
199e: 0000 unimp
19a0: 4c48 lw a0,28(s0)
19a2: 4854 lw a3,20(s0)
19a4: 0000 unimp
19a6: 0000 unimp
19a8: 6741 lui a4,0x10
19aa: 2065 jal 1a52 <main+0xbf2>
19ac: 7525 lui a0,0xfffe9
19ae: 2020 .insn 2, 0x2020
19b0: 7325 lui t1,0xfffe9
19b2: 0000 unimp
19b4: 202d jal 19de <main+0xb7e>
19b6: 54544553 .insn 4, 0x54544553
19ba: 4e49 li t3,18
19bc: 2d205347 .insn 4, 0x2d205347
19c0: 0000 unimp
19c2: 0000 unimp
19c4: 65726353 .insn 4, 0x65726353
19c8: 6e65 lui t3,0x19
19ca: 6f20 .insn 2, 0x6f20
19cc: 6666 .insn 2, 0x6666
19ce: 253a .insn 2, 0x253a
19d0: 00000073 ecall
19d4: 6e756f53 .insn 4, 0x6e756f53
19d8: 3a64 .insn 2, 0x3a64
19da: 2520 .insn 2, 0x2520
19dc: 00000073 ecall
19e0: 6142 .insn 2, 0x6142
19e2: 00006b63 bltu zero,zero,19f8 <main+0xb98>
19e6: 0000 unimp
19e8: 2f4c .insn 2, 0x2f4c
19ea: 2052 .insn 2, 0x2052
19ec: 6f6d lui t5,0x1b
19ee: 6576 .insn 2, 0x6576
19f0: 2020 .insn 2, 0x2020
19f2: 75204b4f .insn 4, 0x75204b4f
19f6: 00006573 .insn 4, 0x6573
19fa: 0000 unimp
19fc: 2e52 .insn 2, 0x2e52
19fe: 2e49 jal 1d90 <pana_sad+0x70>
1a00: 2e50 .insn 2, 0x2e50
1a02: 0000 unimp
1a04: 696c .insn 2, 0x696c
1a06: 6576 .insn 2, 0x6576
1a08: 2064 .insn 2, 0x2064
1a0a: 7525 lui a0,0xfffe9
1a0c: 6d20 .insn 2, 0x6d20
1a0e: 6e69 lui t3,0x1a
1a10: 0000 unimp
1a12: 0000 unimp
1a14: 6f6e .insn 2, 0x6f6e
1a16: 2074 .insn 2, 0x2074
1a18: 7562 .insn 2, 0x7562
1a1a: 00007973 .insn 4, 0x7973
1a1e: 0000 unimp
1a20: 616d addi sp,sp,240
1a22: 72657473 .insn 4, 0x72657473
1a26: 6d20 .insn 2, 0x6d20
1a28: 0065646f jal s0,57a2e <tama.c.67bb5960+0x53f9d>
1a2c: 7274 .insn 2, 0x7274
1a2e: 6e61 lui t3,0x18
1a30: 74696d73 .insn 4, 0x74696d73
1a34: 6d20 .insn 2, 0x6d20
1a36: 0065646f jal s0,57a3c <tama.c.67bb5960+0x53fab>
1a3a: 0000 unimp
1a3c: 7874 .insn 2, 0x7874
1a3e: 6520 .insn 2, 0x6520
1a40: 706d c.lui zero,0xffffb
1a42: 7974 .insn 2, 0x7974
1a44: 0000 unimp
1a46: 0000 unimp
1a48: 7274 .insn 2, 0x7274
1a4a: 6e61 lui t3,0x18
1a4c: 74696d73 .insn 4, 0x74696d73
1a50: 6320 .insn 2, 0x6320
1a52: 6c706d6f jal s10,8918 <tama.c.67bb5960+0x4e87>
1a56: 7465 lui s0,0xffff9
1a58: 0065 c.nop 25
1a5a: 0000 unimp
1a5c: 4546 lw a0,80(sp)
1a5e: 4445 li s0,17
1a60: 0000 unimp
1a62: 0000 unimp
1a64: 4c50 lw a2,28(s0)
1a66: 5941 li s2,-16
1a68: 0000 unimp
1a6a: 0000 unimp
1a6c: 45454c53 .insn 4, 0x45454c53
1a70: 0050 addi a2,sp,4
1a72: 0000 unimp
1a74: 41454c43 .insn 4, 0x41454c43
1a78: 004e c.slli zero,0x13
1a7a: 0000 unimp
1a7c: 4548 lw a0,12(a0)
1a7e: 4c41 li s8,16
1a80: 0000 unimp
1a82: 0000 unimp
1a84: 54415453 .insn 4, 0x54415453
1a88: 00000053 .insn 4, 0x0053
1a8c: 54544553 .insn 4, 0x54544553
1a90: 4e49 li t3,18
1a92: 00005347 .insn 4, 0x5347
1a96: 0000 unimp
1a98: 3531 jal 18a4 <main+0xa44>
1a9a: 30330073 .insn 4, 0x30330073
1a9e: 30360073 .insn 4, 0x30360073
1aa2: 114e0073 .insn 4, 0x114e0073
1aa6: 0000 unimp
1aa8: 12c6 slli t0,t0,0x31
1aaa: 0000 unimp
1aac: 133c addi a5,sp,424
1aae: 0000 unimp
1ab0: 135e slli t1,t1,0x37
1ab2: 0000 unimp
1ab4: 139e slli t2,t2,0x27
1ab6: 0000 unimp
1ab8: 13e0 addi s0,sp,492
1aba: 0000 unimp
1abc: 13f0 addi a2,sp,492
...
00001ac0 <icon_settings>:
1ac0: c003 c003 c003 f007 f80f fc1f 7fff 3ffe ...............?
1ad0: 1ffc 3ffe 7c1f fc1f f80f f007 c003 c003 ...?.|..........
00001ae0 <icon_stats>:
1ae0: 0000 0000 0000 c000 c000 c000 c006 c006 ................
1af0: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6.....
00001b00 <icon_heal>:
1b00: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0.
1b10: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........
00001b20 <icon_clean>:
1b20: 0000 0000 8000 8000 c001 c001 f007 f80d ................
1b30: f80d f808 fc1d f80d f80f f80f f007 8000 ................
00001b40 <icon_sleep>:
1b40: 0000 0000 0000 0004 000c 001c 0018 001c ................
1b50: 003c 001c 001e 001f e80f f007 8000 0000 <...............
00001b60 <icon_play>:
1b60: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~
1b70: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p..
00001b80 <icon_feed>:
1b80: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1.
1b90: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?.......
00001ba0 <pana_dead>:
...
1ba8: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1bb8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1bc8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1bd8: ff07 f0ff bb0f f8ee d70f f8f5 ef0f f8fb ................
1be8: d70f f8f5 bb1f fcee ff0f f8ff ff0f f8ff ................
1bf8: ff0f f8ff f00f f807 ff07 f0ff ff07 f0ff ................
1c08: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1c18: 1f00 00fc 0000 0080 ........
00001c20 <pana_sleep>:
...
1c28: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1c38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1c48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1c58: ff07 f0ff ff0f f8ff ff0f f8ff ff0f f8ff ................
1c68: 010f 78c0 ff1f fcff ff0f f8ff ff0f f87f ...x............
1c78: fc0f f81f ff0f f87f ff07 f0ff ff07 f0ff ................
1c88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1c98: 1f00 00fc 0000 0080 ........
00001ca0 <pana_eat>:
...
1ca8: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1cb8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1cc8: ff1f f8ff ff0f f0ff ff03 e0ff ef07 f0fb ................
1cd8: 8307 f0e0 930f f8e4 110f 78c4 830f f8e0 ...........x....
1ce8: 830f f8e0 ef1f fcfb ff0f f87f fc0f f81f ................
1cf8: fc0f f81f f80f f80f fc07 f01f fc07 f01f ................
1d08: ff03 e07f ff01 c0ff ff00 80ff 7f00 00ff ................
1d18: 1f00 00fc 0000 0080 ........
00001d20 <pana_sad>:
...
1d28: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1d38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1d48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1d58: ff07 f0ff ef0f f8fb 830f f8e0 930f f8e4 ................
1d68: 110f 78c4 831f fce0 830f f860 ec0f f81b ...x......`.....
1d78: ff0f f87f fc0f f81f f707 f0f7 fb07 f0ef ................
1d88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1d98: 1f00 00fc 0000 0080 ........
00001da0 <pana_happy>:
...
1da8: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1db8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1dc8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1dd8: ff07 f0ff ff0f f8ff ef0f f8fb d70f f8f5 ................
1de8: ff0f f8ff ff1f fcff ff0f f8ff f80f f80f ................
1df8: fb0f f8ef f70f f8f7 fc07 f01f ff07 f0ff ................
1e08: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1e18: 1f00 00fc 0000 0080 ........
00001e20 <pana_blink>:
...
1e28: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1e38: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1e48: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1e58: ff07 f0ff ff0f f8ff ff0f f8ff 010f 78c0 ...............x
1e68: ff0f f8ff ff1f fcff ff0f f87f fc0f f81f ................
1e78: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................
1e88: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1e98: 1f00 00fc 0000 0080 ........
00001ea0 <errstr>:
1ea0: 1a14 0000 1a20 0000 1a2c 0000 1a3c 0000 .... ...,...<...
1eb0: 1a48 0000 H...
00001eb4 <ssd1306_init_array>:
1eb4: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. .....
1ec4: 8f81 f1d9 40db a6a4 ffaf 0000 .....@......
00001ed0 <pana_idle>:
...
1ed8: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1ee8: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1ef8: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1f08: ef07 f0fb 830f f8e0 930f f8e4 110f 78c4 ...............x
1f18: 830f f8e0 831f fce0 ef0f f87b fc0f f81f ..........{.....
1f28: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................
1f38: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1f48: 1f00 00fc 0000 0080 ........
00001f50 <menu_icons>:
1f50: 1b80 0000 1b60 0000 1b40 0000 1b20 0000 ....`...@... ...
1f60: 1b00 0000 1ae0 0000 1ac0 0000 ............
00001f6c <pana_frames>:
1f6c: 1ed0 0000 1e20 0000 1da0 0000 1d20 0000 .... ....... ...
1f7c: 1ca0 0000 1c20 0000 1ba0 0000 .... .......
00001f88 <menu_labels>:
1f88: 1a5c 0000 1a64 0000 1a6c 0000 1a74 0000 \...d...l...t...
1f98: 1a7c 0000 1a84 0000 1a8c 0000 |...........
00001fa4 <screen_timeout_names>:
1fa4: 1a98 0000 1a9c 0000 1aa0 0000 1944 0000 ............D...
00001fb4 <spr_grave>:
...
1fbc: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................
1fcc: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3..
1fdc: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0..........
1fec: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?...
1ffc: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................
200c: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................
...
00002034 <fontdata>:
...
203c: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~
204c: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8..
205c: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8
206c: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<...........
207c: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 .<fBBf<.........
208c: 070f 7d0f cccc 78cc 663c 6666 183c 187e ...}...x<fff<.~.
209c: 333f 303f 7030 e0f0 637f 637f 6763 c0e6 ?3?00p...c.ccg..
20ac: db18 e73c 3ce7 18db e080 fef8 e0f8 0080 ..<..<..........
20bc: 0e02 fe3e 0e3e 0002 3c18 187e 7e18 183c ..>.>....<~..~<.
20cc: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{....
20dc: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a<ff<.|....~~~.
20ec: 3c18 187e 3c7e ff18 3c18 187e 1818 0018 .<~.~<...<~.....
20fc: 1818 1818 3c7e 0018 1800 fe0c 180c 0000 ....~<..........
210c: 3000 fe60 3060 0000 0000 c0c0 fec0 0000 .0`.`0..........
211c: 2400 ff66 2466 0000 1800 7e3c ffff 0000 .$f.f$....<~....
212c: ff00 7eff 183c 0000 0000 0000 0000 0000 ...~<...........
213c: 3c18 183c 0018 0018 6666 0024 0000 0000 .<<.....ff$.....
214c: 6c6c 6cfe 6cfe 006c 3e18 3c60 7c06 0018 ll.l.ll..>`<.|..
215c: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v.
216c: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000...
217c: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.<f..
218c: 1800 7e18 1818 0000 0000 0000 1800 3018 ...~...........0
219c: 0000 7e00 0000 0000 0000 0000 1800 0018 ...~............
21ac: 0c06 3018 c060 0080 6c38 d6c6 6cc6 0038 ...0`...8l...l8.
21bc: 3818 1818 1818 007e c67c 1c06 6630 00fe .8....~.|...0f..
21cc: c67c 3c06 c606 007c 3c1c cc6c 0cfe 001e |..<..|..<l.....
21dc: c0fe fcc0 c606 007c 6038 fcc0 c6c6 007c ......|.8`....|.
21ec: c6fe 180c 3030 0030 c67c 7cc6 c6c6 007c ....000.|..|..|.
21fc: c67c 7ec6 0c06 0078 1800 0018 1800 0018 |..~..x.........
220c: 1800 0018 1800 3018 0c06 3018 0c18 0006 .......0...0....
221c: 0000 007e 7e00 0000 3060 0c18 3018 0060 ..~..~..`0...0`.
222c: c67c 180c 0018 0018 c67c dede c0de 0078 |.......|.....x.
223c: 6c38 fec6 c6c6 00c6 66fc 7c66 6666 00fc 8l.......ff|ff..
224c: 663c c0c0 66c0 003c 6cf8 6666 6c66 00f8 <f...f<..lfffl..
225c: 62fe 7868 6268 00fe 62fe 7868 6068 00f0 .bhxhb...bhxh`..
226c: 663c c0c0 66ce 003a c6c6 fec6 c6c6 00c6 <f...f:.........
227c: 183c 1818 1818 003c 0c1e 0c0c cccc 0078 <.....<.......x.
228c: 66e6 786c 666c 00e6 60f0 6060 6662 00fe .flxlf...```bf..
229c: eec6 fefe c6d6 00c6 e6c6 def6 c6ce 00c6 ................
22ac: c67c c6c6 c6c6 007c 66fc 7c66 6060 00f0 |.....|..ff|``..
22bc: c67c c6c6 cec6 0e7c 66fc 7c66 666c 00e6 |.....|..ff|lf..
22cc: 663c 1830 660c 003c 7e7e 185a 1818 003c <f0..f<.~~Z...<.
22dc: c6c6 c6c6 c6c6 007c c6c6 c6c6 6cc6 0038 ......|......l8.
22ec: c6c6 d6c6 fed6 006c c6c6 386c c66c 00c6 ......l...l8l...
22fc: 6666 3c66 1818 003c c6fe 188c 6632 00fe fff<..<.....2f..
230c: 303c 3030 3030 003c 60c0 1830 060c 0002 <00000<..`0.....
231c: 0c3c 0c0c 0c0c 003c 3810 c66c 0000 0000 <.....<..8l.....
232c: 0000 0000 0000 ff00 1830 000c 0000 0000 ........0.......
233c: 0000 0c78 cc7c 0076 60e0 667c 6666 00dc ..x.|.v..`|fff..
234c: 0000 c67c c6c0 007c 0c1c cc7c cccc 0076 ..|...|...|...v.
235c: 0000 c67c c0fe 007c 663c f860 6060 00f0 ..|...|.<f`.``..
236c: 0000 cc76 7ccc f80c 60e0 766c 6666 00e6 ..v..|...`lvff..
237c: 0018 1838 1818 003c 0006 0606 6606 3c66 ..8...<......ff<
238c: 60e0 6c66 6c78 00e6 1838 1818 1818 003c .`flxl..8.....<.
239c: 0000 feec d6d6 00d6 0000 66dc 6666 0066 ...........ffff.
23ac: 0000 c67c c6c6 007c 0000 66dc 7c66 f060 ..|...|....ff|`.
23bc: 0000 cc76 7ccc 1e0c 0000 76dc 6060 00f0 ..v..|.....v``..
23cc: 0000 c07e 067c 00fc 3030 30fc 3630 001c ..~.|...00.006..
23dc: 0000 cccc cccc 0076 0000 c6c6 6cc6 0038 ......v......l8.
23ec: 0000 d6c6 fed6 006c 0000 6cc6 6c38 00c6 ......l....l8l..
23fc: 0000 c6c6 7ec6 fc06 0000 4c7e 3218 007e .....~....~L.2~.
240c: 180e 7018 1818 000e 1818 1818 1818 0018 ...p............
241c: 1870 0e18 1818 0070 dc76 0000 0000 0000 p.....p.v.......
242c: 1000 6c38 c6c6 00fe c67c c0c0 7cc6 780c ..8l....|....|.x
243c: 00cc cccc cccc 0076 180c c67c c0fe 007c ......v...|...|.
244c: 827c 0c78 cc7c 0076 00c6 0c78 cc7c 0076 |.x.|.v...x.|.v.
245c: 1830 0c78 cc7c 0076 3030 0c78 cc7c 0076 0.x.|.v.00x.|.v.
246c: 0000 c07e 7ec0 380c 827c c67c c0fe 007c ..~..~.8|.|...|.
247c: 00c6 c67c c0fe 007c 1830 c67c c0fe 007c ..|...|.0.|...|.
248c: 0066 1838 1818 003c 827c 1838 1818 003c f.8...<.|.8...<.
249c: 1830 3800 1818 003c 38c6 c66c c6fe 00c6 0..8..<..8l.....
24ac: 6c38 c67c c6fe 00c6 3018 c0fe c0f8 00fe 8l|......0......
24bc: 0000 187e d87e 007e 6c3e fecc cccc 00ce ..~.~.~.>l......
24cc: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|.
24dc: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v.
24ec: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~..
24fc: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|.
250c: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f..
251c: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~..........
252c: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v.
253c: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|.
254c: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff.
255c: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v.......<ll>.~..
256c: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>.
257c: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................
258c: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j..
259c: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3..
25ac: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".".
25bc: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w.
25cc: 1818 1818 1818 1818 1818 1818 18f8 1818 ................
25dc: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666
25ec: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........
25fc: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666
260c: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666......
261c: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............
262c: 0000 0000 18f8 1818 1818 1818 001f 0000 ................
263c: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................
264c: 1818 1818 181f 1818 0000 0000 00ff 0000 ................
265c: 1818 1818 18ff 1818 1818 181f 181f 1818 ................
266c: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?...
267c: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666......
268c: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666
269c: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666
26ac: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666....
26bc: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666
26cc: 3636 3636 003f 0000 1818 181f 001f 0000 6666?...........
26dc: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666
26ec: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........
26fc: 1818 1818 00f8 0000 0000 0000 181f 1818 ................
270c: ffff ffff ffff ffff 0000 0000 ffff ffff ................
271c: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................
272c: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v.
273c: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x...............
274c: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`...
275c: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|.
276c: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.<ff<.~
277c: 6c38 fec6 6cc6 0038 6c38 c6c6 6c6c 00ee 8l...l8.8l..ll..
278c: 180e 3e0c 6666 003c 0000 db7e 7edb 0000 ...>ff<...~..~..
279c: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0..
27ac: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|..............
27bc: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~.
27cc: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~.........
27dc: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~....
27ec: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8....
27fc: 0000 1800 0018 0000 0000 1800 0000 0000 ................
280c: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666...
281c: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<..
...